davmail-6.3.0/src/0040755 0000000 0000000 00000000000 14757042646 012475 5ustar000000000 0000000 davmail-6.3.0/src/appstream/0040755 0000000 0000000 00000000000 14757572750 014475 5ustar000000000 0000000 davmail-6.3.0/src/bin/0040755 0000000 0000000 00000000000 14754153477 013247 5ustar000000000 0000000 davmail-6.3.0/src/checkstyle/0040755 0000000 0000000 00000000000 14475352423 014625 5ustar000000000 0000000 davmail-6.3.0/src/data/0040755 0000000 0000000 00000000000 12564151557 013402 5ustar000000000 0000000 davmail-6.3.0/src/desktop/0040755 0000000 0000000 00000000000 14475352432 014140 5ustar000000000 0000000 davmail-6.3.0/src/etc/0040755 0000000 0000000 00000000000 14757572750 013254 5ustar000000000 0000000 davmail-6.3.0/src/icon/0040755 0000000 0000000 00000000000 14475352433 013420 5ustar000000000 0000000 davmail-6.3.0/src/init/0040755 0000000 0000000 00000000000 14475352434 013434 5ustar000000000 0000000 davmail-6.3.0/src/java/0040755 0000000 0000000 00000000000 14754153500 013403 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/0040755 0000000 0000000 00000000000 14754417473 015034 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/caldav/0040755 0000000 0000000 00000000000 14503245212 016244 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/exception/0040755 0000000 0000000 00000000000 14475352507 017026 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/exchange/0040755 0000000 0000000 00000000000 14754417473 016616 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/exchange/auth/0040755 0000000 0000000 00000000000 14754417473 017557 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/exchange/dav/0040755 0000000 0000000 00000000000 14503245212 017346 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/exchange/ews/0040755 0000000 0000000 00000000000 14757042647 017414 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/exchange/graph/0040755 0000000 0000000 00000000000 14754417473 017717 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/http/0040755 0000000 0000000 00000000000 14754153500 015777 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/http/request/0040755 0000000 0000000 00000000000 14503245213 017462 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/imap/0040755 0000000 0000000 00000000000 14754153500 015746 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/ldap/0040755 0000000 0000000 00000000000 14754417473 015754 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/pop/0040755 0000000 0000000 00000000000 14475352717 015631 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/service/0040755 0000000 0000000 00000000000 14503245214 016454 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/smtp/0040755 0000000 0000000 00000000000 14757042647 016017 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/ui/0040755 0000000 0000000 00000000000 14754417473 015451 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/ui/browser/0040755 0000000 0000000 00000000000 14575630005 017121 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/ui/tray/0040755 0000000 0000000 00000000000 14754417473 016430 5ustar000000000 0000000 davmail-6.3.0/src/java/davmail/util/0040755 0000000 0000000 00000000000 14754153500 015775 5ustar000000000 0000000 davmail-6.3.0/src/site/0040755 0000000 0000000 00000000000 14575630005 013427 5ustar000000000 0000000 davmail-6.3.0/src/site/resources/0040755 0000000 0000000 00000000000 14475352723 015450 5ustar000000000 0000000 davmail-6.3.0/src/site/resources/css/0040755 0000000 0000000 00000000000 14475352723 016240 5ustar000000000 0000000 davmail-6.3.0/src/site/resources/images/0040755 0000000 0000000 00000000000 14575630003 016704 5ustar000000000 0000000 davmail-6.3.0/src/site/resources/images/android/0040755 0000000 0000000 00000000000 14475352736 020341 5ustar000000000 0000000 davmail-6.3.0/src/site/resources/images/iphone/0040755 0000000 0000000 00000000000 14475352740 020176 5ustar000000000 0000000 davmail-6.3.0/src/site/resources/images/osx/0040755 0000000 0000000 00000000000 14475352741 017526 5ustar000000000 0000000 davmail-6.3.0/src/site/resources/images/thunderbird/0040755 0000000 0000000 00000000000 14577576165 021242 5ustar000000000 0000000 davmail-6.3.0/src/site/xdoc/0040755 0000000 0000000 00000000000 14757042647 014377 5ustar000000000 0000000 davmail-6.3.0/src/test/0040755 0000000 0000000 00000000000 14475352743 013453 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/0040755 0000000 0000000 00000000000 14475352747 015074 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/caldav/0040755 0000000 0000000 00000000000 14475352744 016323 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/exchange/0040755 0000000 0000000 00000000000 14754417473 016654 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/exchange/dav/0040755 0000000 0000000 00000000000 14475352746 017427 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/exchange/ews/0040755 0000000 0000000 00000000000 14503245213 017431 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/exchange/graph/0040755 0000000 0000000 00000000000 14754153477 017756 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/http/0040755 0000000 0000000 00000000000 14475352746 016052 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/imap/0040755 0000000 0000000 00000000000 14475352747 016022 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/ldap/0040755 0000000 0000000 00000000000 14475352747 016014 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/smtp/0040755 0000000 0000000 00000000000 14475352747 016057 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/ui/0040755 0000000 0000000 00000000000 14475352747 015511 5ustar000000000 0000000 davmail-6.3.0/src/test/davmail/util/0040755 0000000 0000000 00000000000 14754153500 016033 5ustar000000000 0000000 davmail-6.3.0/LICENSE0100644 0000000 0000000 00000043254 13310556771 012711 0ustar000000000 0000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 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 Lesser 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) 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. 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) year 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 Lesser General Public License instead of this License. davmail-6.3.0/README.md0100644 0000000 0000000 00000012175 14757572750 013174 0ustar000000000 0000000 # DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange and Office 365 Gateway [![Build status: Windows](https://ci.appveyor.com/api/projects/status/d7tx645gwqvprd4g?svg=true)](https://ci.appveyor.com/project/mguessan/davmail) [![Download DavMail POP/IMAP/SMTP/Caldav to Exchange](https://img.shields.io/sourceforge/dm/davmail.svg)](https://sourceforge.net/projects/davmail/files/latest/download) [![Download DavMail POP/IMAP/SMTP/Caldav to Exchange](https://img.shields.io/sourceforge/dt/davmail.svg)](https://sourceforge.net/projects/davmail/files/latest/download) [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=mguessan_davmail&metric=alert_status)](https://sonarcloud.io/project/overview?id=mguessan_davmail) [![SonarCloud Bugs](https://sonarcloud.io/api/project_badges/measure?project=mguessan_davmail&metric=bugs)](https://sonarcloud.io/project/overview?id=mguessan_davmail) [![SonarCloud Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=mguessan_davmail&metric=vulnerabilities)](https://sonarcloud.io/project/overview?id=mguessan_davmail) **_Security note:_** DavMail does not depend on Log4J2 and is thus not vulnerable to [CVE-2021-44228](https://github.com/advisories/GHSA-jfh8-c2jp-5v3q) Ever wanted to get rid of Outlook ? DavMail is a POP/IMAP/SMTP/Caldav/Carddav/LDAP gateway allowing users to use any mail client with Exchange, even from the internet through Outlook Web Access on any platform, tested on MacOSX, Linux and Windows ![DavMail Architecture](src/site/resources/images/davmailArchitecture.png) Main project site is still on Sourceforge at http://davmail.sourceforge.net/. This git repository is synchronized with subversion repository in order to make contributions easier for Github users. ## Donate Donations are welcome to help support DavMail development, in dollars [![Donate dollars](https://img.shields.io/badge/paypal-donate-green.svg)](https://www.paypal.com/cgi-bin/webscr?item_name=Donation+to+DavMail+POP%2FIMAP%2FSMTP%2FCaldav+to+Exchange&cmd=_donations&business=mguessan%40free.fr&lc=US) or Euros [![Donate euros](https://img.shields.io/badge/paypal-donate-green.svg)](https://www.paypal.com/cgi-bin/webscr?item_name=Donation+to+DavMail+POP%2FIMAP%2FSMTP%2FCaldav+to+Exchange&cmd=_donations&business=mguessan%40free.fr&lc=US&currency_code=EUR) ## Download Download latest DavMail release on Sourceforge [![Download DavMail POP/IMAP/SMTP/Caldav to Exchange](https://a.fsdn.com/con/app/sf-download-button)](https://sourceforge.net/projects/davmail/files/davmail/6.3.0/) RPM packages are available from OpenSuse build service: [![build result](https://build.opensuse.org/projects/home:mguessan:davmail/packages/davmail/badge.svg?type=default)](https://build.opensuse.org/package/show/home:mguessan:davmail/davmail) An alternative is COPR on Fedora: [![Copr build status](https://copr.fedorainfracloud.org/coprs/mguessan/davmail/package/davmail/status_image/last_build.png)](https://copr.fedorainfracloud.org/coprs/mguessan/davmail) ## Trunk builds Latest working builds are now available on Appveyor: * Windows setup [davmail-6.3.0-trunk-setup.exe](https://ci.appveyor.com/api/projects/mguessan/davmail/artifacts/dist%2Fdavmail-6.3.0-trunk-setup.exe?job=Environment%3A%20JAVA_HOME%3DC%3A%5CProgram%20Files%5CJava%5Cjdk1.8.0) * Windows 64 bits setup [davmail-6.3.0-trunk-setup64.exe](https://ci.appveyor.com/api/projects/mguessan/davmail/artifacts/dist%2Fdavmail-6.3.0-trunk-setup64.exe?job=Environment%3A%20JAVA_HOME%3DC%3A%5CProgram%20Files%5CJava%5Cjdk1.8.0) * Windows noinstall package [davmail-6.3.0-trunk-windows-noinstall.zip](https://ci.appveyor.com/api/projects/mguessan/davmail/artifacts/dist%2Fdavmail-6.3.0-trunk-windows-noinstall.zip?job=Environment%3A%20JAVA_HOME%3DC%3A%5CProgram%20Files%5CJava%5Cjdk1.8.0) * Windows standalone (with embedded Azul JRE-FX) package [davmail-6.3.0-trunk-windows-standalone.zip](https://ci.appveyor.com/api/projects/mguessan/davmail/artifacts/dist%2Fdavmail-6.3.0-trunk-windows-standalone.zip?job=Environment%3A%20JAVA_HOME%3DC%3A%5CProgram%20Files%5CJava%5Cjdk1.8.0) * Platform independent package [davmail-6.3.0-trunk.zip](https://ci.appveyor.com/api/projects/mguessan/davmail/artifacts/dist%2Fdavmail-6.3.0-trunk.zip?job=Environment%3A%20JAVA_HOME%3DC%3A%5CProgram%20Files%5CJava%5Cjdk1.8.0) * Debian package [davmail_6.3.0-trunk-1_all.deb](https://ci.appveyor.com/api/projects/mguessan/davmail/artifacts/dist%2Fdavmail_6.3.0-trunk-1_all.deb?job=Environment%3A%20JAVA_HOME%3DC%3A%5CProgram%20Files%5CJava%5Cjdk1.8.0) * OSX application [DavMail-MacOSX-6.3.0-trunk.app.zip](https://ci.appveyor.com/api/projects/mguessan/davmail/artifacts/dist%2FDavMail-MacOSX-6.3.0-trunk.app.zip?job=Environment%3A%20JAVA_HOME%3DC%3A%5CProgram%20Files%5CJava%5Cjdk1.8.0) ## Contribute Contributions are welcome, you can either [submit a patch](https://sourceforge.net/p/davmail/patches/) or create a [Github pull request](https://github.com/mguessan/davmail/pulls). In case you are looking for tasks to work on, please check current [Backlog](https://sourceforge.net/p/davmail/feature-requests/milestone/Backlog/). davmail-6.3.0/RELEASE-NOTES.md0100644 0000000 0000000 00000570040 14757572750 014205 0ustar000000000 0000000 ## DavMail 6.3.0 2025-02-26 Merged some contributions provided by users on github, updated embedded jre to 21 for improved TLS 1.3 support, applied documentation fixes, reviewed rpm build to provide el9 compatibility, implemented channel binding for NTLM authentication. Also added a more recent Docker file in contribs, worked on GCC high tenants compatibility. Microsoft Graph backend implementation is in progress but far from complete. ### Caldav - Caldav: handle multiple categories on TODO items, see https://github.com/mguessan/davmail/issues/372 - Caldav: Merge https://github.com/mguessan/davmail/pull/386 validate and repair Exchange calendar characters ### LDAP - LDAP: merge https://github.com/mguessan/davmail/pull/353, fix first certificate selection logic - LDAP: merge https://github.com/mguessan/davmail/pull/353 Add support for retrieving user certificates ### IMAP - IMAP: fix backslash in password quoted string by: Max-Julian Pogner , finalize merge, call new parsing method from nextToken and remove backslash handling in username - IMAP: fix backslash in password quoted string by: Max-Julian Pogner , review and switch to ParseException for error handling and chars instead of bytes - IMAP: merge unit test for patch fix backslash in password quoted string by: Max-Julian Pogner - IMAP: initial merge of patch fix backslash in password quoted string by: Max-Julian Pogner - IMAP: fix https://github.com/mguessan/davmail/issues/359, handle RFC822.TEXT ### O365 - O365: add GCC high example settings in default davmail.properties - O365: https://github.com/mguessan/davmail/pull/380 Remove trailing slash from O365_LOGIN_URL - O365: merge https://github.com/mguessan/davmail/pull/380 Missed one change - O365: merge https://github.com/mguessan/davmail/pull/380 Enhance support for the davmail.outlookUrl property setting and fully support GCC-High endpoints - O365: implement OneWaySMS MFA prompt, see https://github.com/mguessan/davmail/pull/134 - O365: get O365 Login Url from settings for non standard tenants and add additional error use case - O365: detect live.com token. Note: may not be enough to make DavMail work with live.com accounts - O365: dropping all workaroungs for OpenJFX bugs that should be fixed in recent versions ### EWS - EWS: experimental, try to implement recurrence count with NumberOfOccurrences, see https://github.com/mguessan/davmail/issues/373 - EWS: make settings timezoneid higher priority than mailbox configuration, make encode/decode foldername methods public for graph API ### Graph - Graph: introduce GRAPH_URL and davmail.loginUrl in Settings - Graph: initiate search filter implementation - Graph: implement folder recursive search - Introduce folderClass - Graph: Create folders unit tests - Graph: fix folder retrieval by id - Graph: initial folder retrieval implementation - Graph: compute graph API property id from name and tag - Graph: Empty Graph ExchangeSession implementation - Graph: prepare graph request builder for graph implementation - Graph: Experimental, introduce davmail.enableGraph property to obtain a token compatible with Microsoft Graph API ### Linux - Linux: fix ant dependency for fedora - Linux: davmail.spec to not try to link os provided swt.jar when using embedded one - Linux: work on el9 compatibility for RPM build - Linux: Embed davmail-user.conf in source package, see https://github.com/mguessan/davmail/issues/356 - Linux: Create davmail user/group per new conventions in RPM 4.19, merge changes from https://github.com/mguessan/davmail/issues/356 - Build: fix https://github.com/mguessan/davmail/issues/346 unable to run jlink on linux - Linux: force shutdown with -token option - Linux: Add OpenJFX case for Kubuntu ### Documentation - Doc: update windows build documentation, see https://github.com/mguessan/davmail/issues/384 - Doc: merge https://github.com/mguessan/davmail/pull/174 fix docs typo in property davmail.enableKeepAlive - Doc: improve documentation on how to run DavMail as a windows service - Doc: update documentation for non default tenants (US, China) - Doc: provide more information in initial consent for O365 authentication - Doc: update FAQ on application registration in Entra ID (Azure AD) - Doc: mention AppIndicator and KStatusNotifierItem Support in Fedora setup instructions ### Docker - Docker: merge https://github.com/mguessan/davmail/pull/381 by SethRobertson Bug 201: Docker support for building and running ### NTLM - NTLM: remove CIFS dependency - NTLM: cleanup code from audit - NTLM: use ThreadLocal to manage SecureRandom generators - NTLM: switch to DavMailNTLMSchemeFactory to enable channel binding, see https://github.com/mguessan/davmail/issues/352 - NTLM: retrieve certificate from http context - NTLM: Duplicate of NTLMScheme from HttpClient to implement channel binding - NTLM: adjust NTLMEngineImpl to handle channel binding - NTLM: Duplicate code from NTLMEngineImpl to implement channel binding ### Enhancements - Fix from audit - Drop web component - Drop servlet-api.jar, no longer required - Drop deprecated DavGatewayServletContextListener (we no longer provide an embedded war file) - Trying to fix custom jre for TLS 1.3, see https://stackoverflow.com/questions/63964939/tls-1-3-handshake-failure-when-using-openjdk-14-java-module-runtime and https://github.com/mguessan/davmail/pull/388 - fix download-jre for embedded JDK on windows, fetch version 21 - switch davmail linux launcher to zulu JDK 21 for better TLS 1.3 support - switch main package to zulu JDK 21 for better TLS 1.3 support - StringUtilTest CRLF => LF, see https://github.com/mguessan/davmail/pull/378 - StringUtil CRLF => LF, see https://github.com/mguessan/davmail/pull/378 - Security: Enable TLSv1.3 between DavMail and Exchange/O365 - PKCS11: review SunPKCS11ProviderHandler - HttpClient: cleanup from audit - svn ignore .idea - Downgrade jackrabbit to 2.20.15 for java 8 compatibility - Upgrade jackrabbit to 2.21.25 and httpclient to 4.5.14 ## DavMail 6.2.2 2024-03-30 Includes some build process fixes, use jlink to build a customized jre for standalone package, Thunderbird configuration documentation updated with new screenshots. Also implemented a new -token command line option to launch O365InteractiveAuthenticator and get an authentication token. ### OSX - OSX: document how to embed Zulu jre inside DavMail app ### Enhancements - Fix comment in DavMail shell - Detect missing network connectivity during token refresh to avoid invalidating token - Upgrade JCIFS to 1.3.19 for NTLM support - Cleanup from audit - Drop war package from release files, there are more modern ways to run DavMail in server mode without a webapp container - From audit: place LOCK.wait in a loop - Fix from audit, use try with resource - Cleanup from audit, remove deprecated getSubjectDN, getIssuerDN ### O365 - O365: Improve error message on missing add-exports, see https://github.com/mguessan/davmail/issues/344 - O365: Refactor manual authentication dialog to clearly separate steps - Remove explicit dependency on O365InteractiveAuthenticator for -token option - Implement a -token option to launch interactive authenticator and print obtained refresh token, see https://github.com/mguessan/davmail/issues/338 - O365: Try to adjust ItemId to 140 length, see https://github.com/mguessan/davmail/issues/328 - O365: prepare GCC-High/DoD endpoints support, fix regression - O365: prepare GCC-High/DoD endpoints support, move outlook login url references to Settings - O365: prepare GCC-High/DoD endpoints support, move outlook url references to Settings ### EWS - EWS: Properly set errorDetail on xml stream error to raise exception - EWS: disable IS_SUPPORTING_EXTERNAL_ENTITIES to fix xml parsing security warning ### Caldav - Fix https://github.com/mguessan/davmail/issues/342 map America/Winnipeg to Central Standard Time - Caldav: Fix https://github.com/mguessan/davmail/issues/337 take timezone into account when looking for excluded occurrence - Fix settings implementation, # are allowed in values, see https://github.com/mguessan/davmail/issues/326 ### IMAP - IMAP: fix https://github.com/mguessan/davmail/issues/339 classcast exception on malformed content ### Build - Maven: update compiler to 3.10.1 - Maven: optimize dependencies - Maven: exclure httpclient 3 transitive dependency - Appveyor: build only master branch - Build: use jlink to create a custom jre to reduce embedded jre size ### Security - Security: fix security alert on Runtime.getRuntime().exec - Security: fix security alert on Runtime.getRuntime().exec ### Linux - Linux: force GTK2 only with SWT - Linux: switch to Azul JRE 17 with "davmail azul" command - Linux: Enable OpenJFX on Fedora to make O365Interactive work with Java 17 and later ### Documentation - Doc: update roadmap - Doc: Add donation buttons to Github main readme page - Doc: update Thunderbird documentation messages - Update release guide, mvn install file no longer required - Doc: update Thunderbird documentation, as requested in https://github.com/mguessan/davmail/issues/294 - Doc: update documentation for Thunderbird configuration - Doc: use COPR badge - Doc: update release guide - Doc: reference OpenSuse build service and Fedora COPR for RPM based linux distributions - Update changes file for https://build.opensuse.org/package/show/home:mguessan:davmail/davmail ## DavMail 6.2.1 2024-01-04 Most changes are related to build process and rpm packaging for Fedora/RHEL, also includes a few bug fixes on IMAP ### Security - Security: Upgrade commons codec to 1.15 ### O365 - O365: cleanup from audit - O365: no longer apply the disable integrity check workaround by default, fixed in openjfx - O365: add a warning message on FIDO authentication triggered - O365: allow refresh token persistence without provided password - O365: Merge https://github.com/mguessan/davmail/pull/236 Changed authentication link log level ### Linux - Linux: refactor spec file for fedora, do not call old init service scripts and compile with openjfx - Linux: Fix systemd condition for fedora in spec file - Linux: Adjust JDK dependencies for RPM build ### Build - AppVeyor: Cleanup - AppVeyor: copy plugin to x86-unicode - AppVeyor: switch to server 2019 - Appveyor: investigate java versions - AppVeyor: set ANT_HOME value - AppVeyor: update ant path - AppVeyor: update ant download path - Run Sonar scan under JDK19 - Switch Appveyor build to JDK 19 - Maven: fix urls from https://github.com/mguessan/davmail/pull/225 by Stefan Weil ### IMAP - IMAP: merge patch from https://github.com/mguessan/davmail/pull/140, return folders including special use folders when query is % - IMAP: implement fetch macro flags, see https://github.com/mguessan/davmail/issues/314 - IMAP: fix APPENDUID value order ### Enhancements - Cleanup from audit - Fix typo - NTLM: improve logging of NTLM negotiation - Update Winrun4J wrappers with commons codec 1.15 ## DavMail 6.2.0 2023-05-11 Another bugfix release to merge user contributions from Github, refactor Linux build, upgrade dependencies and a few IMAP and Caldav fixes. ### Security - Update htmlcleaner to 2.29 cf CVE-2023-34624 ### Enhancements - Drop Travis-ci, no longer working for opensource projects - fix quotes from audit - Remove space at end of line +0630=Myanmar Standard Time, see https://github.com/mguessan/davmail/issues/309 - Fix https://github.com/mguessan/davmail/issues/271, keep line order and comments on settings save - Fix from audit - Maven: convert pom.xml to UTF-8 ### IMAP - IMAP: merge fix suggested on https://github.com/mguessan/davmail/issues/298 - IMAP: merge according to last comment on https://github.com/mguessan/davmail/pull/239 - IMAP: improve bodystructure handling, merge https://github.com/mguessan/davmail/pull/239 - IMAP: implement APPENDUID and advertise UIDPLUS - IMAP: implement APPENDUID and advertise UIDPLUS - IMAP: Prepare uidplus, fetch message after create ### Caldav - Caldav: Fix nullpointer as in https://github.com/mguessan/davmail/issues/303 - Caldav: Fix https://github.com/mguessan/davmail/issues/309 Thunderbird daily sends TZOFFSETTO with optional second value - Caldav: adjust isLightning test to include Thunderbird user agent, see https://github.com/mguessan/davmail/issues/287 ### Linux - Linux: based on https://github.com/mguessan/davmail/pull/290 by Björn Bidar , remove svn commit reference in davmail.spec - Remove svn tag from folder name inside source packages - Linux: remove chkconfig from Requires preun and post in davmail.spec as suggested on build.opensuse.org - Linux: dos2unix davmail.changes - Linux: update changelog with Björn Bidar contribution from https://github.com/mguessan/davmail/pull/289 - Linux: Add back changelog file and convert to OpenSUSE format from https://github.com/mguessan/davmail/pull/289 - Linux: Merge changes from https://github.com/mguessan/davmail/pull/290 except %version that may impact release cycle - Linux: convert davmail.spec changelog to OpenSUSE format, see https://github.com/mguessan/davmail/pull/290 - Linux: restore spec file with lf and changelog, see https://github.com/mguessan/davmail/pull/289 - Linux: remove downloaded azul jdk package ### ADFS - ADFS: merge https://github.com/mguessan/davmail/pull/270 by Felix Engelmann, enable ADFS authentication with SAML assertions ### EWS - EWS: Cleanup from audit - EWS: fix https://github.com/mguessan/davmail/issues/299 avoid logging large response message content - EWS: BackOffMilliseconds unit test - EWS: parse BackOffMilliseconds value on throttling ### O365 - O365: in O365 interactive, use invokeAndWait on failover to manual to avoid multiple instances of popup window - Upgrade jettison to 1.5.4 in pom.xml - Upgrade jettison to 1.5.4 ### Windows - Windows: drop explicit reference to sun.security.mscapi.SunMSCAPI, Windows-MY should be available on all windows JDK ### Documentation - Doc: Update server properties documentation with davmail.oauth.persistToken - Doc: fix link to SonarCloud ## DavMail 6.1.0 2023-03-19 First release in a long time to publish pending changes, including Kerberos support fix, experimental number matching support for upcoming Microsoft authenticator default configuration change, store new refresh token received at authentication. In addition, some Log4J specific patches to remove vulnerable classes from library (even if DavMail is not impacted with standard configuration) ### O365 - O365: implement number matching logic in O365Authenticator - O365: retrieve number matching value during phone app MFA - O365: adjust logging level on O365 refresh token error - O365: change persist token logic to store new refresh token after succesful refresh - Experimental: store refreshed token when davmail.storeRefreshedToken=true ### Windows - Windows: Add missing labelReplace active wait with wait/notifyAll in DavService - Update winrun4j wrappers after lib upgrades ### Linux - Linux: block davmail azul when davmail script is located under /usr/bin (package installed) - Linux: fix PosixFilePermissions for writeable only by user - Linux: try to make .davmail.properties file readable by user only on create - Linux: improve launch script to take into account script location ### Enhancements - Add missing label - Replace active wait with wait/notifyAll - Upgrade woodstox to 1.4.0 and jettison to 1.5.3 - Merge https://github.com/mguessan/davmail/pull/225 remove (most) http:// links in Maven POM - Make ScheduledThreadPool thread daemon - Switch to https for version check - DavMailIdleConnectionEvictor fix from audit - Refactor DavMailIdleConnectionEvictor to be less agressive on idle connection checks/purge and use scheduler instead of active polling - Override SPNegoScheme to take into account DavMail kerberos settings ### Documentation - Sample syslog configuration - Update current version in README.md - OSX: remove reference to Growl in documentation - Doc: security note on DavMail not vulnerable to CVE-2021-44228 - Doc: add a section on Fedora installation from copr ### Caldav - Caldav: Do not try to update modified occurrences on Mozilla thunderbird dismiss event ### Security - Security: Strip packaged log4j jar from JMSSink and JDBCAppender to ensure DavMail is not vulnerable to CVE-2022-23305 & CVE-2022-23302, see https://github.com/mguessan/davmail/issues/250 - Remove JMSAppender, SMTPAppender and SocketServer from Log4J binary as an additional security measure (CVE-2019-17571 CVE-2021-4104), even if DavMail is not vulnerable with standard configuration - Upgrade Log4J to latest version 1.2.17 in Winrun4J wrappers - Upgrade Log4J to latest version 1.2.17 ## DavMail 6.0.1 2021-12-03 Bugfix release with a few Office 365 enhancements ### O365 - O365: default to MSCAPI on windows for native client certificate access - O365: name button Send instead of OK in manual authenticator dialog - OS65: merge https://github.com/mguessan/davmail/pull/158 Added Copy to Clipboard button Manual auth dialog ### Linux - Linux: improve "davmail azul" error handling - Linux: Update changelog in RPM spec - Linux: Fix RPM spec, remote source does not work - Linux: Merge RPM spec contribution from michals on https://build.opensuse.org, check for systemd support and deploy the right service ### HC4 - HC4: make DavMail Kerberos configuration provider ### EWS - EWS: merge https://github.com/mguessan/davmail/pull/106 Support servers only offering EWS/Services.wsdl instead of EWS/Exchange.asmx ### Documentation - Doc: Remove HttpClient migration warning - Doc: instructions on standalone setup on Linux for best O365 support - Update readme for Github home page ## DavMail 6.0.0 2021-07-05 First major release in a long time, main change is switch from HttpClient 3 to 4, please report any regression related to this major rewrite. DavMail now supports more O365 configurations, including access to client certificate to validate device trust. O365 refresh tokens can now be stored securely in a separate (writable) file. On Linux, in order to ensure the right java version is used, a command line option to download latest Azul JRE with OpenJFX support was added, on windows a standalone package contains Azul JRE FX 15, on OSX updated universalJavaApplicationStub to latest version. ### OSX: - OSX: completely drop Growl support - OSX: prepare possible path for an embedded jre mode - OSX: update universalJavaApplicationStub to latest version from https://github.com/tofi86/universalJavaApplicationStub/blob/master/src/universalJavaApplicationStub ### Documentation: - Doc: merge Clarify the usage of imapIdleDelay https://github.com/mguessan/davmail/pull/116 - Doc: add comment on IDLE and timeout setting - Doc: link to standalone windows package - Doc: fix Zulu link - Doc: remove references to Java 6 in documentation ### Build: - Appveyor: update ant - Appveyor: build with jdk15 - Appveyor: purge artifacts for all builds except jdk 8 - Build: run Sonar with JDK 11 - Update junit to 4.13.1 in Maven - Update junit to 4.13.1 ### Linux: - Linux: Experimental: download Azul JRE FX with command 'davmail azul' - Linux: merge https://github.com/mguessan/davmail/pull/133 Linux Gnome Desktop: fix systray support - Linux: Update service file to allow 0-1023 ports binding (https://github.com/mguessan/davmail/pull/117) ### Windows: - Windows: switch standalone jre to Azul FX 15 - Windows: create a standalone package with Azul JRE FX in order to have a working O365InteractiveAuthenticator - Winrun4J: prefer embedded VM for standalone package and export sun.net.www.protocol.https - Winrun4J: update binaries - Winrun4J: prepare standalone configuration - Windows: update winrun4j config to require Java >= 8 ### IMAP: - IMAP: fix thread handling from audit - IMAP: Compute body part size with failover ### O365: - O365: log token file creation - O365: cleanup from audit - O365: Add davmail.oauth.tokenFilePath to sample properties file - O365: disable HTTP/2 loader on Java 14 and later to enable custom socket factory - O365: allow user agent override in O365InteractiveAuthenticator, switch default user agent to latest Edge - O365: with Java 15 url with code returns as CANCELLED - O365: MSCAPI and Java version 13 or higher required to access TPM protected client certificate on Windows - O365: merge first commit from https://github.com/mguessan/davmail/pull/134/ OAuth via ADFS with MFA support - O365: fix store refreshToken call - O365: introduce davmail.oauth.tokenFilePath setting to store Oauth tokens in a separate file - O365: switch to try with resource style - Drop explicit dependency to netscape.javascript package in O365InteractiveJSLogger - O365: follow redirects on ADFS authentication ### HC4: - Refactor ExchangeSessionFactory, create HttpClientAdapter in session - HC4: update winrun4j binaries - HC4: drop HttpClient 3 dependency in Maven, winrun4j binaries and nsi setup - HC4: drop remaining HttpClient 3 classes - HC4: drop DavMailCookieSpec and DavGatewaySSLProtocolSocketFactory (merge in SSLProtocolSocketFactory) - HC4: drop DavGatewayHttpClientFacade and RestMethod - HC4: default to Edge user agent - HC4: Do not enable NTLM in Kerberos mode - HC4: switch checkConfig to HttpClient 4 - HC4: merge HC4DavExchangeSession to DavExchangeSession - HC4: cleanup HC4ExchangeFormAuthenticator references - HC4: merge HC4ExchangeFormAuthenticator to ExchangeFormAuthenticator, extend authenticator interface to return HttpClientAdapter, switch to DavExchangeSession - HC4: switch O365 authenticators test code to HttpClient 4 - HC4: adjust CreateItemMethod chunked call - HC4: switch ExchangeSessionFactory to HttpClient 4 - HC4: add a warning about HttpClient 4 migration - HC4: Enable ssl logging in addition to wire with HttpClient 4 - HC4: switch EWS implementation to HttpClient 4 ### EWS: - EWS: improve isItemId detection to match base 64 encoded id - EWS: drop NTLM as a failover logic - EWS: cleanup unused code now that we have a reliable way to retrieve email address with ConvertId - EWS: drop property davmail.caldavRealUpdate, no longer used - EWS: Improved uid handling from audit - EWS: Enable Woodstox workaround for malformed xml with latest Woodstox version ### Enhancements: - Clear session pool on DavMail restart - Upgrade to Woodstox 6.2.0 as it's now available on debian, drop Woodstox patched StreamScanner ### Caldav: - Caldav: merge https://github.com/mguessan/davmail/pull/139 Fix missing XML encode - Caldav: use Exchange timezone to compute event time in test case - Caldav: create test cases for recurring events ## DavMail 5.5.1 2019-04-19 Fix regression on domain\username authentication over IMAP and some cleanup ### IMAP: - IMAP: fix https://github.com/mguessan/davmail/issues/100 regression with domain\username authentication ### O365: - O365: set jdk.http.ntlm.transparentAuth=allHosts to enable NTLM for ADFS support ### Build: - dist cleanup - Update release guide with Fedora copr instructions - Exclude .sonarwork from source package - Build: fix release file name ## DavMail 5.5.0 2019-04-15 This release contains a lot of bugfixes, enhancements and some user contributions from Github. Most activity is related to HttpClient 4 refactoring, this will probably be the latest version based in HttpClient 3. Minimum Java version is now 8, also dropped Growl support on MacOS. Notable changes for end users are Oauth token persistence to avoid frequent O365 authentications and OIDC support for personal outlook accounts. Known issues: some users reported regressions with form authentication, please report such regressions with log files. ### IMAP: - IMAP: catch non IOException errors in FolderLoadThread - IMAP: fix https://github.com/mguessan/davmail/pull/91 Allow user name to be specified as user@domain.com in addition to domain\user to access shared mailbox - IMAP: unquote CHARSET in IMAP search - IMAP: cleanup test cases ### Documentation: - Doc: describe new Office 365 authentication modes - Doc: remove deprecated enableEWS reference - Doc: Document new connection modes in template davmail.properties - Doc: Add all time downloads badge - Doc: push sonarcloud badges ### Enhancements: - Apply xml transformer settings recommended by Sonar - dos2unix template davmail.properties file - prepare migration to https://davmail.sourceforge.io - Settings: cleanup from audit - Latest edge user agent does not work, use Outlook 2013 instead - Convert HTTP code to Java 8 - Cleanup from audit - Fix sonar detected vulnerability - Update to Java 8 and code cleanup - Comment HttpURLConnectionWrapper - Fix regression in AbstractServer - Remove unused label - Cleanup from audit at Java 8 language level ### Security: - Enable TLSv1.1 and TLSv1.2 ### HttpClient 4: - HC4: httpClient is not shared between clients, do not track connection state to enable NTLM connection pooling - HC4: set default connection per route to 5 - HC4: refactor Exchange 2007 test cases - HC4: Prepare switch, create a temporary HC4WebDav mode - HC4: ExchangeSession cleanup - HC4: unit test cleanup - HC4: make ExchangeSession independent of HttpClient implementation - HC4: remove reference to old HttpStatus in HttpClientAdapter - HC4: more HC4ExchangeFormAuthenticator refactoring and fixes - HC4: test form authentication failure - HC4: more DavExchangeSession refactoring - HC4: more form authenticator fixes - HC4: create ResponseWrapper interface for PostRequest and GetRequest - HC4: new executeFollowRedirect implementation and get user agent from settings - HC4: cleanup from audit and fix regression, need to follow redirect after OWA authentication - HC4: more authentication test case - HC4: Implement single thread connection evictor - HC4: improve PostRequest and RestRequest - HC4: implement executePostRequest with test case - HC4: new GetRequest implementation with test case - HC4: more request refactoring - Refactor RestRequest to use ResponseHandler mode only - Refactor TestHttpClientAdapter - HC4: improve RestRequest - HC4: remove old HttpException and move to HttpResponseException - HC4: switch to HttpGet - HC4: add buildHttpException to HttpClientAdapter - HC4: cleanup from audit - HC4: keep statusLine in request - HC4: cleanup to finalize migration - HC4: convert encodeAndFixUrl - HC4: Remove old HttpStatus dependency - Remove HttpException dependency - HC4: convert Head and Post methods - HC4: convert GetMethod to HttpGet - HC4: convert remaining http client 3 methods - HC4: Implement create/delete folder - HC4: implement Exchange WebDav search request - HC4: Fix initial uri in HttpClientAdapter - HC4: convert internalGetFolder - HC4: refactor TestCaldavHttpClient4 - HC4: more test cases on session creation - HC4: convert getWellKnownFolders, first working version of session creation - HC4: convert checkPublicFolder - HC4: get httpClientAdapter from HC4ExchangeFormAuthenticator - HC4: Main test case for HC4DavExchangeSession - HC4: convert getEmailAndAliasFromOptions - HC4: convert getMailpathFromWelcomePage - HC4: baseline DavExchangeSession for HttpClient 4 migration - HTTP: Improve HttpClientAdapter, enable kerberos support according to setting - HttpClient4: improve HttpClientAdapter - HttpClient4: Test timeouts with proxy - Refactor TestHttpClient4 with try with resource ### Caldav: - Caldav: fix https://github.com/mguessan/davmail/pull/88 EXDATE timezone issue ### O365: - O365: fix https://github.com/mguessan/davmail/pull/92 failover for null query with non https URI - O365: refactor O365Authenticator and fix regressions - O365: switch to new executeFollowRedirect implementation - O365: refactor O365Authenticator - Refactor O365InteractiveJSLogger to work with more JDK versions ### Test: - Test: improve notification dialog test - Test: Improve client certificate test - Improve getReleasedVersion test case - Test: Improve base test cases - Add new harmcrest-core junit dependency ant enable IMAP test cases - Test: update junit to 4.12 - Run a SSL server socket - Test: cleanup code - Improve TestDavGateway - Make AbstractDavMailTestCase abstract - HttpClient: improve test cases ### Build: - Fix file name for Appveyor trunk builds - Fix git svn warning - try to get svn revision from git - Set jacoco path in sonar config - fix test-compile language level - Upload coverage report to sourceforge for AppVeyor - Prepare Jacoco coverage report - Cleanup unused ant check - Exclude Sonar working directory from package - Appveyor: try to run sonar from Appveyor build ### EWS: - EWS: make getPageSize static - EWS: merge PR Allow to configure EWS folder fetch page size https://github.com/mguessan/davmail/pull/79 - EWS: fix response handling - EWS: fix O365Authenticator - EWS: fix regression in O365Token - EWS: handle malformed id_token - EWS: refactor authenticators to use davmail.enableOidc - EWS: create a new davmail.enableOidc setting tp switch to new v2.0 OIDC compliant endpoint https://docs.microsoft.com/en-us/azure/active-directory/develop/azure-ad-endpoint-comparison - EWS: Prepare OIDC support, add v2.0 url in interactive authenticator - EWS: Prepare OIDC support, decode id_token - EWS: enable davmail.oauth.persistToken by default ### DAV: - DAV: MOVE returns SC_CONFLICT on missing target folder - Dav: Update to Java 8 ### SMTP: - SMTP: improve error message handling - SMTP: fix smtp test cases ### LDAP: - LDAP: clean test case - LDAP: fix dn authentication - LDAP: Ber code cleanup from audit - LDAP: update LdapConnection to Java 8 - LDAP: make parseIntWithTag protected to call it from LdapConnection - Use imported Ber implementation instead of com.sun.jndi.ldap - Import Ber implementation from OpenJDK to avoid compilation warnings ### OSX: - OSX: drop Growl support ## DavMail 5.4.0 2019-11-11 Main new feature is experimental support for stored Oauth tokens with davmail.oauth.persistToken=true, tokens are stored encrypted with client provided password. Also improved SPECIAL-USE IMAP support and fixed a few regressions related to ExchangeSessionFactory refactoring and a lot of bug fixed from user feedback. ### Enhancements: - Add sonar target to ant build - Sonar configuration - Add sonarqube-ant-task to lib - Throw NoSuchElementException in message iterator for iteration beyond the end of the collection - InterruptedException should not be ignored - currentVersion is never null - Make AbstractConnection abstract - Update default user agent to latest version of Edge on Windows - Add .gitignore file - Update StringEncryptor to Java 8 - Update Maven and Ant build to Java 1.8 - Drop Java 7 in travis config - Add {AES} prefix to encrypted strings - Improve StringEncryptor compatibility with older jdks - Ignore stream errors on disconnect, messages cleanup - Testcase for password based string encryptor - Implement password based string encryptor - Refactor settings save to preserve comments - Force Trusty in Travis config ### Appveyor: - Appveyor: Update to ant 1.10.7 - Appveyor: test JDK 12 and 13 build ### Security: - Security: secure XML transformer - Security: Untrusted XML should be parsed without resolving external data ### SWT: - SWT: Refactor the synchronisation mechanism to not use a Thread instance as a monitor ### LDAP: - LDAP: Add a note to Thunderbird directory config on uid=username syntax ### IMAP: - IMAP: implement RETURN (SPECIAL-USE) in IMAP list command, return special folders only, fix for https://sourceforge.net/p/davmail/bugs/721 - IMAP: allow recursive search on public folders ### Carddav: - Carddav: iOS does not support VCard 4, detect its old Carddav client and send VCard 3 content, exclude unsupported distribution list items ### Caldav: - Caldav: do not try to send cancel notifications on shared and public calendars ### EWS: - EWS: allow O365Manual in headless mode - EWS: implement command line mode for O365ManualAuthenticator, as suggested in https://github.com/mguessan/davmail/issues/48 - EWS: exchangecookie is not a good check of successful authentication - EWS: detect direct EWS even if mode is different - EWS: experimental, store Oauth refresh tokens in davmail.properties when davmail.oauth.persistToken=true - EWS: fix /public and /archive folders access over EWS - EWS: improve O365Authenticator error detection - EWS: fix access to /public folder - EWS: Try to improve O365 authentication with ADFS tenants ### Documentation: - Doc: fix trusterbird link on home page ### Linux: - Linux: switch spec file to java-1.8.0 - Linux: prepare rhel8 support ### SMTP: - SMTP: fix #720 Davmail returns 503 instead of 530 when trying to send mail before authentication ## DavMail 5.3.1 2019-08-12 Bugfix release to fix NTLM authentication for some Exchange on premise instances. Also includes a new OSX handlers implementation required to support recent OSX JDKs. ### Enhancements: - Reprocess credentials in addNTLM - Use github download link instead of direct sourceforge link in About dialog - Improve ExchangeFormAuthenticator logging ### EWS: - EWS: fix possible bug with username with authenticatorClass - EWS: add an Open button to O365ManualAuthenticatorDialog in case links are not working - EWS: fix regression in OWA authentication mode, enable NTLM if required by EWS endpoint ### OSX: - OSX: comment zulufx jre embed - OSX: prepare zulufx jre embed - OSX: drop old OSXAdapter - OSX: cleanup unused methods - OSX: no need to register QuitHandler, default is fine - OSX: implement new Desktop handlers on Java 9 and later, keep compatibility with com.apple.eawt.Application ## DavMail 5.3.0 2019-08-06 Major update with a focus on O365 and MFA support, this release includes a new davmail.userWhiteList setting to filter users by email or domain. We now have a more modern responsive site thanks to new Maven skin. Migration to HttpClient 4 is in progress but not finished yet. ### Enhancements: - Cleanup from audit - Update Maven POM - Implement a new davmail.userWhiteList setting to only allow limited users and/or domains, see https://github.com/mguessan/davmail/issues/47 value is a comma separated list of emails or domains (user@company.com or @company.com) - Cleanup: remove duplicate code ### IMAP: - IMAP: additional folder test case - IMAP: Fix #714 StringIndexOutOfBoundsException with NOT UID condition - IMAP: fix https://github.com/mguessan/davmail/issues/35, Result of of a mailbox search is different between search and uid_search - IMAP: try to encode invalid character ( and ) in keywords - IMAP: fix #708 issue, more generic patch when folder name starts with a special folder name - IMAP: fix #708 issue with folder name that starts with Inbox - IMAP: encode greater than character in folder name ### HTTP: - Fix logger and remove old httpClient dependency in HttpClientAdapter - HTTP: Full Http Client 4 form authentication module - HTTP: experimental Http Client 4 authenticator - HTTP: Implement execute with custom local context and manage cookies - HTTP: cleanup from audit - HTTP: remove form authentication code from ExchangeSession - HTTP: Switch to new ExchangeFormAuthenticator - HTTP: adjust RestRequest for HttpClient 4 Exchange DAV requests - HTTP: implement HttpClient 4 Exchange DAV requests - HTTP: prepare major refactoring, extract form authentication from ExchangeSession - HTTP: migrate O365Token to HttpClient4 - HTTP: remove last dependencies to HttpClient3 in URIUtil - HTTP: set logging levels for HttpClient 4 - HTTP: improve request implementation - HTTP: move requests to new package - HTTP: improve REST request - HTTP: Accept String urls in GetRequest and PostRequest - HTTP: switch to GetRequest in getReleasedVersion - HTTP: Http Client 4 GET and POST request wrappers - HTTP: a few more test cases - HTTP: improve HttpClientAdapter interface - HTTP: switch check released version to HttpClient 4 - HTTP: implement Get and Rest requests with HttpClient 4 - HTTP: reenable basic proxy authentication on Java >= 1.8.111 in HttpClientAdapter - HTTP: reimplement URIUtil to prepare HttpClient 4 migration - HTTP: Cleanup from audit - HTTP: reenable basic proxy authentication on Java >= 1.8.111: jdk.http.auth.tunneling.disabledSchemes="" - HTTP: Implement JCIFS NTLM authentication with HttpClient 4 ### GUI: - GUI: translate disableTrayActivitySwitch messages - GUI: merge Add davmail.disableTrayActivitySwitch to disable tray icon activity, see https://github.com/mguessan/davmail/pull/28 ### EWS: - EWS: O365Manual add mode in Settings - EWS: O365Manual enable in ExchangeSessionFactory - EWS: O365Manual missing label - EWS: add davmail.oauth.tenantId setting to GUI and documentation - EWS: create a new davmail.oauth.tenantId setting to set actual company tenant - EWS: additional cases for Microsoft account authentication - EWS: refactor O365 interactive to always use an HttpURLConnectionWrapper - EWS: Fix error handling in manual authentication failover - EWS: fix NPE in manual authenticator - EWS: do not force user agent in O365 interactive authenticator, breaks Microsoft login form browser detection - EWS: improve Okta support in O365 interactive authenticator - EWS: prepare tenant independent authenticator: do not hard code /common/ - EWS: always enable interactive authenticator in settings now that we have a failover without JavaFX - EWS: i18n manual authentication messages - EWS: Prepare a failover manual authenticator when OpenJFX is not available - EWS: merge https://github.com/mguessan/davmail/pull/26, Added input names for form authentication - EWS: do not call addNTLM in ExchangeSessionFactory to avoid kerberos configuration conflict - EWS: fix regression to correctly detect network down - EWS: fix regression, do not force user-agent in 0365 interactive authenticator - EWS: cleanup from audit - EWS: O36 authenticators cleanup from audit - EWS: use ConvertId to retrieve current mailbox primary SMTP address, more reliable than ResolveNames - EWS: migrate O365Authenticator to HttpClient 4 - EWS: remove duplicate code in O365 interactive authenticator - EWS: improve interactive authenticator, adjust integrity workaround for Okta - EWS: improve interactive authenticator, adjust integrity workaround and catch javascript errors - EWS: Apply integrity disable workaround to Okta form second step - EWS: use URIBuilder instead of URIUtil to build URI - EWS: fix support for new Okta authentication form, need to disable integrity check - EWS: drop old Autodiscover failover, need to implement before authentication instead - EWS: log connection errors in O365InteractiveAuthenticator - EWS: new AutoDiscoverMethod implementation - EWS: improve O365 token logging ### Linux: - Linux: adjust AWT tray icon for Linux Mint Cinnamon - Linux: Merge patch, add JFX_CLASSPATH when SWT3 is available - Linux: Fix spec file for copr ### Unix: - Unix: failover to xdg-open on both Linux and Freebsd ### Documentation: - Doc: fix title in page - Doc: improved site skin with collapsible sidebar - Doc: upgrade Maven Javadoc plugin - Doc: Switch to modern responsive Maven fluido skin - Doc: Switch to modern responsive Maven reflow skin ### DAV: - DAV: cleanup from audit - DAV: remove dependency to old URIException ### Caldav: - Caldav: cleanup from audit - Caldav: send 404 not found instead of 400 for unknown requests - Caldav: Do not try to update event is X-MOZ-FAKED-MASTER is set - Caldav: fix test case ### OSX: - OSX: merge patch #54 Set NSSupportsAutomaticGraphicsSwitching to Yes to prevent macOS GPU access ### SWT: - SWT: merge duplicate code ## DavMail 5.2.0 2019-02-10 Includes improved ADFS compatibility and support Okta authentication in interactive mode, a fix for Thunderbird dismiss issue, a few LDAP and IMAP enhancements (TRYCREATE support). Also upgraded libraries to prepare HttpClient 4 upgrade. ### EWS: - EWS: improve O365 mode handling, force url - EWS: detect Okta authentication and explicitly fail in this case with O365Authenticator - EWS: O365StoredTokenAuthenticator test case - EWS: allow cross domain requests for Okta form support in O365Interactive mode - EWS: try to fix #702, add login.srf to OpenJFX workaround - EWS: Remove Jetbrains only annotation - EWS: Fix O365 device login check - EWS: cleanup from audit - EWS: Another step in O365 device login - EWS: detect devicelogin after O365 ADFS authentication, try to follow redirect - EWS: adjust 0365Token log statement level ### Caldav: - Caldav: explicitly detect Thunderbird dismiss/snooze events to update only mozilla custom properties - Caldav: fix #705 daily recurrence issue - Caldav: experimental, return created item URL in Location header - Caldav: enable isorganizer field - Caldav: adjust isOrganizer check (again) to work on all Exchange server versions - Caldav: workaround for missing DTEND in event, avoid NullPointerException - Caldav: fix recurrence options and implement interval over EWS - Caldav: fix montly recurrence handling ### IMAP: - IMAP: fix #704 implement [TRYCREATE] on folder not found - IMAP: Fix FETCH RFC822 request for python imap client. - IMAP: Additional fix for slash in folder name ### Carddav: - Carddav: fix regression, override getAllContacts to list contacts and distribution lists ### LDAP: - LDAP: cleanup from audit and support simple rdn authentication, see https://github.com/mguessan/davmail/pull/18 - LDAP: implement hassubordinates attribute - LDAP: fix contact filter over EWS - LDAP: fix dn authentication, fix https://github.com/mguessan/davmail/pull/18 - LDAP: improve dn authentication, fix https://github.com/mguessan/davmail/pull/18 - LDAP: implement dn authentication, see https://github.com/mguessan/davmail/pull/18 - LDAP: test case for dn authentication, see https://github.com/mguessan/davmail/pull/18 - LDAP: encode uid value in dn, see https://github.com/mguessan/davmail/pull/18 - LDAP: add mappings for HomePhone and Pager attributes ### Documentation: - Doc: fix https://github.com/mguessan/davmail/pull/21 - Doc: Improve documentation of client connection timeout, merge https://github.com/mguessan/davmail/pull/20 - Doc: remove alt from OpenHub link - Doc: merge documentation provided by Geert Stappers - Doc: Update roadmap - Doc: update README.md - Doc: document Android configuration with a DavMail server - Doc: prepare android setup instructions - Doc: improve download link in README.md - Doc: update Debian package description - Doc: fix openhub link ### HTTP: - HTTP: switch from URIUtil to URIBuilder in Caldav test cases - HTTP: more Caldav test cases with HttpClientAdapter - HTTP: implement caldav report and search test case with HttpClientAdapter - HTTP: implement Dav request in HttpClient 4 adapter - HTTP: improve HttpClient 4 adapter, detect relative url - HTTP: implement HttpClientAdapter follow redirects and parse username - HTTP: first HttpClientAdapter draft - HTTP: include HttpClient 4 - Update commons-codec to 1.11 (prepare HttpClient 4 migration) - HTTP: test HttpClient 4 connection pool management and expiration - HTTP: More HttpClient 4 test cases for authentication, proxy, redirects and URI handling - HTTP: Basic HttpClient 4 test cases - Update jackrabbit to 2.14.6 (latest version to support httpclient 3.1 ### Linux: - Linux: adjust tray icon for XFCE and KDE - Linux: try to adjust tray icon for XFCE - Linux: fix swt jar exists test in launch script - Linux: fix SWT version in POM and update description - Linux: adjust systemd service to rhel/centos - Add DavMail systemd service in spec file - Linux: fix compatibility with older distributions - SWT: Improve code to make it compatible with older SWT libraries in Ubuntu 18. - Linux: fix spec file regression ### Maven: - Maven: reenable site plugins in pom ## DavMail 5.1.0 2018-12-18 Much improved interactive O365 authentication with OpenJFX bug workaround, experimental stored Oauth refresh token support. More Linux distributions were tested to make DavMail work with recent KDE and Gnome environments. ### EWS: - EWS: more progress on ADFS authentication - EWS: cleanup warning message - EWS: experimental, implement davmail.oauth.persistToken to store Oauth refresh token - EWS: make progress on O365 ADFS authentication, fix method - EWS: stored token authentication, load token by username - EWS: make progress on O365 ADFS authentication, enable NTLM and pass credentials - EWS: O365 authentication, set resource url on token refresh - EWS: set default access token expiration - EWS: implement stored access token in addition to refresh token (will only last one hour) - EWS: experimental, load Oauth refresh token from setting davmail.oauth.refreshToken - EWS: fix https://github.com/mguessan/davmail/issues/15 empty domain in NTLM authentication - EWS: revert to 4.9.0 behavior for EWS mode - EWS: fix regression in token handling - EWS: allow urn protocol in O365 authenticator - EWS: fix regression when main authentication relies on OWA and/or ADFS - EWS: check for errors in returned json token - EWS: Fix warning message - EWS: workaround for JavaFX bug, add one more URL - EWS: call setAlwaysOnTop(true); on page load success - EWS: in addition to requestFocus, call toFront - EWS: workaround for JavaFX bug, handle more methods in connection wrapper - EWS: workaround for JavaFX bug, handle post requests - EWS: workaround for JavaFX bug, add additional microsoft url - EWS: workaround for JavaFX bug, fix java 8 regression - EWS: Add export compiler arg java.base/sun.net.www.protocol.https for webview bug workaround - EWS: improve interactive authenticator focus handling and remove reflection calls - EWS: workaround for JavaFX bug, use reflection to avoid java 9 errors - EWS: workaround for JavaFX bug, drop reference to internal sun class HttpsURLConnectionImpl - EWS: workaround for JavaFX bug, disable integrity check on external resources in O365 authentication form - EWS: javafx test can also trigger NoClassDefFoundError - EWS: Rename JSLogger - EWS: improve O365 interactive error handling - EWS: override console.log to send error messages to Log4J - EWS: More EWS test cases - EWS: new authenticator test cases - EWS: detect when user settings validation is required by Office 365 - EWS: detect manual window close event - EWS: Make sure we close frame on timeout, improve error message - EWS: refactor O365 authenticator to do all gui calls in Swing thread - EWS: cleanup from audit - EWS: encode slash inside folder names - EWS: convert date without SimpleDateFormat during load messages to improve performance and reduce memory footprint - EWS: Send authentication failed instead of generic error in case of username mismatch in O365Authenticator ### Documentation: - Doc: update project description in README.md - Doc: update project description - Doc: adjust IntelliJ link according to JetBrains recommendation - Doc: revert openhub change, was a target side issue - Doc: add YourKit Java Profiler logo to home page - Doc: improve IntelliJ IDEA home page logo - Doc: fix swt gtk version in documentation - Doc: fix openhub link - Doc: add link to https://apps.dev.microsoft.com/ - Doc: direct link to latest release package download list in README.md - Doc: fix link in server setup documentation ### OSX: - OSX: upgrade universalJavaApplicationStub to 3.0.4 ### Linux: - Linux: prepare systemd service - Linux: missing openjfx dependency - Linux: set cross platform look and feel on Linux, except is swing.defaultlaf is set - Linux: enable anti aliasing in GUI - Linux: improve launch scripts to handle more cases (OpenJDK 11 with or without SWT) - Linux: remove swt4 suggests and revert gtk force, does not work under debian sid - Linux: Force gtk version no longer required with cross platform look and feel - Linux: use hi res icon images in frame mode - Linux: Add JavaFX classpath to launch script - Linux: add libopenjfx-java dependency to debian package - Linux: switch swt dependency to suggests ### Caldav: - Caldav: another NullPointerException fix - Caldav: fix #694 Null pointer exception writing days of week ### Enhancements: - Avoid nullpointerexception on missing credentials - Move isLinux method to Settings - Revert back to Java 6 build in all cases - Restore Java 6 compatibility - Add utility methods in Settings - Do not try SWT when O365 interactive mode is selected. ### Windows: - Windows: update winrun4j 64 wrapper to support java > 8, see https://github.com/poidasmith/winrun4j/pull/81 ### GUI: - GUI: dispose notification dialog on close - GUI: increase default frame size - GUI: add hi res icon images - GUI: use setLocationRelativeTo to set frame location ### SWT: - SWT: O365Interactive is not compatible with SWT, do not try to create SWT tray - SWT: call GDK.gdk_error_trap_push() to avoid crash - SWT: Enable debug mode - SWT: upgrade SWT to 4.9 - SWT: drop deprecated SWT 3 calls and adjust tray icon image to 22px ### Appveyor: - Appveyor: build with JDK11 - Merge patch #51 Check for javafx in compile classpath ## DavMail 5.0.0 2018-11-21 Major release with Office 365 modern authentication (Oauth2) and MFA support. DavMail now supports IMAP SPECIAL-USE RFC6154. On the packaging side, RPM files are now included in source package and more distributions are supported by the spec file. An appveyor configuration is in place to provide up to date trunk builds. Thanks to wberrier DavMail is now available as a flatpack package, see https://flathub.org/apps/details/org.davmail.DavMail This release also includes many bug fixes and enhancements, see below. Known issues/limitations: - Office 365 interactive authentication is based on OpenJFX (JavaFX), which is available in Oracle JDK but not in OpenJDK. On windows use latest Oracle JDK (>=9), on Linux OpenJDK 8 + JavaFX is the best option. This is obviously not available in server mode. - Office 365 modern authentication does not have those constraints, however it will only work with native Office 365 authentication, and not with ADFS. ### EWS - EWS: catch errors in setURLStreamHandlerFactory - EWS: custom proxy selector, do not return proxies for direct socket connections - EWS: create a custom proxy selector to manage O365 interactive authentication proxy - EWS: improve error handling in O365 interactive authenticator, do not implicitly close JavaFX thread - EWS: cleanup O365 interactive - EWS: Set http.nonProxyHosts from davmail.noProxyFor in O365 interactive authentication - EWS: improve error handling in O365 interactive authentication - EWS: implement proxy support in O365 interactive authentication - EWS: username with @ is email - Do not try form authentication with direct EWS - EWS: Force dispose of interactive frame - EWS: improve interactive authentication error handling - Fix main test case to support new authentication modes - EWS: Enable DavMail custom SSLSocketFactory in O365 interactive authentication - EWS: Add Oauth authentication section in DavMail settings interface - EWS: Experimental ADFS authentication, not yet functional - EWS: log page content on error in O365Authenticator - EWS: register a stream handler for msauth protocol - EWS: Allow clientId override in interactive authenticator - EWS: Send authentication failed on phone MFA denied/no response - EWS: enable progress bar on first page load only - EWS: Office 365 unit test with loop - EWS: make sure httpclient connections are closed, remove duplicated code - EWS: use renewable token in EwsExchangeSession - EWS: refactor O365 authentication to implement token refresh - EWS: improve headless Office 365 authenticator error handling - EWS: implement progress bar in interactive authentication frame - EWS: check username in Office365 interactive authenticator - EWS: Encode username in Office365 authenticator - EWS: exclude JavaFX authenticator from Maven pom - EWS: Remove reference to JavaFX authenticator in ExchangeSessionFactory - EWS: Reorganise authenticators - JavaFX dependencies are Java 11 only, revert and exclude JavaFX authenticator from Maven build - Add JavaFX scene web dependency - Add JavaFX swing dependency in POM - EWS: add jettison dependency in pom - Do not try interactive authentication in server mode - EWS: Merge non interactive Oauth2 authentication - EWS: Office365 modern authentication (Oauth2) with phone application MFA support - EWS: Implement REST/Json method for Oauth authentication - EWS: send username to interactive authentication frame - EWS: implement interactive OAuth2 authentication (still experimental) - EWS: Add jettison library for Oauth support - EWS: First working prototype of interactive Oauth2 authentication ### Enhancements - Improve SWT not available message - Detect headless to force server mode, do not allow O365 interactive authentication in this case - Javafx cleanup - Fix empty setting handling: return default setting on empty value - Implement headless choose client certificate and PKCS11 password prompt - Package hi res image - Merge #50 Assume notray in server mode - Display connection mode help as a tooltip - Merge DesktopBrowser: add support for xdg-open directly, see https://github.com/mguessan/davmail/pull/5 - Workaround for login.microsoftonline.com cookie domain - i18n new davmail.mode setting - Drop davmail.enableEws to create a new davmail.mode setting that can be EWS, WebDav, O365, O365Modern, O365Interactive or Auto - Another JavaFX message fix - Fix is.javafx default value - Default is.javafx value - Improve version check message - Add a JavaFX check message - Drop JavaFX runtime and use conditional build instead - Add JavaFX runtime as a compile time dependency - Remove last jsmooth dependency - Adjust default davmail.properties for server mode usage - Drop jarbundler - Add jettison dependency to windows wrappers and installers - Fix RFE #101: Add a new davmail.userAgent setting to let users force DavMail user agent - Add oraclejdk11 and openjdk11 to Travis CI targets - Try to add Javafx dependency for OpenJDK 11 - Make message info level in ant build ### Linux - Linux: Move spec file to root - Fix relative path in launch script - Copy davmail launch script to dist - Linux: Drop old davmail.sh script - Linux: merge external source files in main source tree - Linux: Move init files from contribs to src/init - Linux: compile with JavaFX on Fedora - Linux: force Java 7 on RHEL 6 and do not deploy appstream on openSUSE_Leap_42.3 - Linux: drop reference to old architecture specific package - Remove old hardcoded uids reference - Linux: drop dependency to LSB functions in init script - Linux: merge pull request https://github.com/mguessan/davmail/pull/4 include appdata file in rpm and deb packages - Linux: merge davmail.sh to use a single script in all cases - Linux: improve wrapper according to audit - Linux: adjust desktop categories according to OpenSuse constraints, see https://en.opensuse.org/openSUSE:Packaging_desktop_menu_categories - Linux: Simplify DavMail wrapper - Linux: make spec file compatible with more distributions - Linux: Additional notes on running DavMail with systray on Ubuntu 18 - Linux: merge RPM and Debian desktop files - Linux: use simple name instead of path in desktop file - Linux: drop desktopentry ant task - Linux: move old desktop file to src/desktop - Linux: Prepare desktop file merge - Linux: merge pull request https://github.com/mguessan/davmail/pull/2 remove deprecations and duplicate main categories in desktop file, missing lf - Linux: merge pull request https://github.com/mguessan/davmail/pull/2 remove deprecations and duplicate main categories in desktop file - Linux: Add changelog entry for release in spec file - Linux: fix spec file changelog date - RPM: update init and logrotate from build.opensuse.org ### Caldav - Caldav: another fix for #344 Problem with Calendar and tasks, fix properties list - Caldav: fix for #344 Problem with Calendar and tasks, calendar:MyResponseType is also calendar only on Exchange 2007 - Caldav: fix for #344 Problem with Calendar and tasks, Exchange 2007 does not accept ismeeting property request on non calendar items ### Documentation - Doc: Convert release notes to markdown format - Doc: add contribute section in README.md - Doc: fix appveyor link - Add download links to README.md - Doc: fix typo - Doc: update linux instructions, remove obsolete content - Doc: reference official debian package and build.opensuse RPM packages in server setup documentation - Doc: Drop piwik reference from site, no longer available on Sourceforge - Doc: Add appveyor badge in README.md - Doc: Add an FAQ entry on Office 365 modern authentication and MFA - Doc: adjust indentation to match pull request - Doc: appdata file from https://github.com/mguessan/davmail/pull/3 - Doc: make image link relative in README.md - Doc: update release notes - Add Sourceforge download badge to README.md ### IMAP - IMAP: implement #341 imap SPECIAL-USE ### Appveyor - appveyor: add Java 10 in matrix - Build: use -trunk suffix for all artifacts - appveyor: get artifacts - Back to ant dist - appveyor: fix for nsis 3 - appveyor: separate makensis from build file - appveyor: copy processwork nsis plugin - appveyor: switch from compile to dist target - appveyor: disable test - appveyor: fix ANT_HOME - appveyor: debug - appveyor: fix ant path - Try to create an appveyor build descriptor ### Carddav - Carddav: prefer urlcompname (client provided item name) for contacts over EWS ### OSX - OSX: restore OSX greyscale icons ## DavMail 4.9.0 2018-09-05 Includes a lot of enhancements, library upgrades, improved Linux desktop support, code cleanup and a brand new Carddav distribution list support. DavMail repository is now synced with Github, including Travis CI integration. ### Enhancements: - Update Jcharset to 2.0 - Upgrade JavaMail to 1.5.6 - Fix maven dependencies, reference local jars for libraries missing in main Maven repository - Sample config to log connections in a separate log - Provide command to launch DavMail without SWT - Cleanup from audit - Fix from audit: remove duplicate code - Remove old repositories from Maven pom and add stax2-api dependency - Remove dependency to xercesImpl-2.8.1.jar - Drop jsmoothgen-ant-0.9.9-7-mgu2.jar, replaced with WinRun4J - Upgrade to Woodstox 5.1.0, waiting for pull request to drop patch, see https://github.com/FasterXML/woodstox/pull/56 - Fix from code audit - Allow console logging in server mode - Implement -server command line option - Implement compile target for Java 9 and later ### Linux: - Linux: Allow JDK 11 with Debian package - Linux: disable system tray on Ubuntu 18 ### Carddav: - Carddav: Add unit test to check CRLF conversion in multiline properties - Carddav: by jbhensley, drop carriage returns from property value - Carddav: distribution list / contacts unit tests - Carddav: by jbhensley, fix vCard PHOTO property. Tested on iOS 11.2.6 and Outlook 2013 - Carddav: Detect empty picture data - Carddav: Use cn as default sn for distribution lists - Carddav: avoid NullPointerException with empty distribution lists and prefer user provided photo - Carddav: search for members on all email attributes - Carddav: Merge contact and distribution list search - Carddav: implement distribution list create and update - Carddav: Merge DistributionList with Contact - Carddav: First step at distribution list implementation, retrieve DL and members ### Github: - Add link to github repo - Add Travis build status - Fix old developerConnection and remove prerequisites according to Travis CI log - First try at travis CI config - Added : /trunk/README.md ### IMAP: - IMAP: fix from code audit - IMAP: fix #689 Double space in UID FETCH response - IMAP: include Conversation History in standard folder list - IMAP: fix patch #49 mixed case INBOX select by google ### EWS: - EWS: fix duplicate bcc definition - EWS: improve error handling, get field names on update item error ### Caldav: - Caldav: workaround for invalid RRULE with both COUNT and UNTIL values leading to ErrorMimeContentConversion failed error - Caldav: cleanup from audit - Caldav: fix timezone failover - Caldav: unit test for Korganizer duplicate timezone bug - Caldav: workaround for Korganizer duplicate timezone bug - Caldav: Fix recurrence enumeration values ### Documentation: - Doc: add FAQ entry for Office 365 ## DavMail 4.8.6 2018-06-14 Bugfix release with latest Caldav EWS enhancements, also includes fixes for old standing bugs in bug tracker. ### IMAP: - IMAP: Fix #631 IMAP SEARCH CHARSET US-ASCII fails ### Caldav: - Caldav: fix #687 can't move event to trash in a shared mailbox - Caldav: fix multivalued field update, send DeleteItemField instead of SetItemField with an empty value when field has no value, should fix bug #682 - Caldav: Detect X-MOZ-LASTACK and X-MOZ-SNOOZE-TIME updates to avoid sending notifications on dismiss with Thunderbird ### Documentation: - Doc: update roadmap ### Enhancements - Fix #476, try to avoid deadlock with a connection manager object lock - Fix #456 longstanding proxy handling issue - Update spec file - Add GPLv2 license at root ## DavMail 4.8.5 2018-04-10 More Caldav fixes, drop SWT on windows and try to improve tray support detection on various Linux distributions. ### Caldav: - Caldav: test notification dialog - Caldav: do not throw exception on invalid email in getFreeBusyData - Caldav: EWS isorganizer is Exchange 2013 and later only, switch to myresponsetype - Caldav: fix #306, do not try to retrieve textbody on Exchange < 2013 - Caldav: do not try to update etag if latest response item is empty - Caldav: fix #679, invalid date exception on recurring event with an end date update - Caldav: fix #346, map America/Chicago to Central Standard Time instead of Central America Standard Time ### Enhancements: - Drop redline library - Disable tray on Gnome - Drop platform specific Linux packages, drop SWT on windows, remove dist-rpm (user build.opensuse.org instead), upgrade SWT to 4.6 on Linux - Upgrade htmlcleaner to 2.21, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=891916 - Fix popMarkReadOnRetr setting save - Update winrun4j wrappers ### Linux: - Refactor icon handling, automatically adjust color/size to match common default themes on Linux and add a new davmail.trayBackgroundColor setting to let users set their own theme color - Make spec file compatible with RHEL 7 / Centos 7 ### Documentation: - Doc: cleanup supported versions ## DavMail 4.8.4 2018-04-03 The main change in this release is the new davmail.caldavAutoSchedule setting to let users choose between client or server side calendar notification management. Most other fixes are also related to Caldav refactoring. ### Caldav: - Caldav: Add davmail.caldavAutoSchedule to GUI - Caldav: introduce a new setting davmail.caldavAutoSchedule to enable or disable automatic scheduling in EWS mode - Caldav: try to fix #674, do not send notifications on event update - Caldav: EWS refactoring, avoid converting simple events to meetings - Caldav: Restore calendar-schedule behavior in Webdav mode - Caldav: in EWS mode, ignore urlcompname and always use itemid as item name, except if explicitly requested - Caldav: isMeeting EWS flag is not reliable, check for attendees with displayto and displaycc - Caldav: Fix isorganizer detection in deleteItem ### IMAP: - IMAP: fix regression on search NOT KEYWORD ### Documentation: - Documentation: fix typo in FAQ - Doc: Improve Thunderbird LDAP documentation ### Enhancements: - EWS : cleanup from audit - Exclude log files from build ## DavMail 4.8.3 2018-01-28 More EWS Caldav refactoring, fix regressions noticed in 4.8.2 and merge a lot of user provided patches. New calendar event handling is not yet enabled by default, please use davmail.caldavRealUpdate=true to check this new experimental implementation. ### Caldav: - Caldav: add cancelled translation - Caldav: EWS refactoring, map status field, except CANCELLED not supported by Exchange - Caldav: implement editable notifications on meeting cancel - Caldav: do not send notifications if user canceled in edit dialog - Caldav: Make sure we set all notification options on event update - Caldav: Revert status conversion that triggers regressions and enable notifications on create - Caldav: test multiline value handling in VCalendar - Caldav: test case for loadVtimezone and searchTasksOnly - Caldav: in loadVtimezone, delete existing temp folder first to avoid errors - Caldav: EWS refactoring, make sure we send meeting notifications - Caldav: fix #666 trailing "nn" added to tasks description synced from exchange - Caldav: EWS refactoring, only update reminder info on meetings when not organizer - Caldav: Fix meeting response body, send and save copy - Caldav: EWS refactoring, implement edit notifications comment - Caldav: fix task update regression ### Enhancement: - Merge #47, support soTimeout and connectionTimeout on exchange - Merge patch #46: Maven patch to add resources in the target/davmail.jar - Test: fix initial server and logging settings - Copy release notes to dist on release - Change test cases to load credentials from a separate test.properties file - Remove old jsmooth config file - Apply patch to fix #601 invalid davmail.server.certificate.hash format ### Documentation: - Doc: fix #320 Wrong link in documentation ### IMAP: - IMAP: Accept US-ASCII as charset in search condition - IMAP: fix #40 KEYWORD support for spring-integrations ### OSX: - OSX: Update universalJavaApplicationStub to 2.1.0 ### Windows: - Windows: Create a 64 bits installer for windows ### Carddav: - Carddav: merge patch #44 Allow disabling reading photo from contact data ## DavMail 4.8.2 2018-01-02 EWS Caldav refactoring in progress, enabled through new davmail.caldavRealUpdate setting to avoid regressions as seen in 4.8.1. ### Caldav: - Caldav: EWS refactoring, handle mozilla alarm fields - Caldav: EWS refactoring, implement modified occurrences - Caldav: EWS refactoring, implement excluded dates (deleted occurrences) - Caldav: optionally enable new EWS caldav implementation with davmail.caldavRealUpdate - Caldav: Improve meeting response detection to avoid NullPointerException - Caldav: EWS refactoring, implement reminder update ## DavMail 4.8.1 2017-12-12 Last release before major EWS caldav refactoring, includes only the first behaviour change: do not delete existing meeting on Accept/Decline, just send answer to organizer. Also includes central directory photo handling in Carddav service, improved Java 9 support and many other bug fixes. ### Caldav: - Caldav: temporarily disable EWS refactoring - Caldav: EWS refactoring, implement multiple day recurrence and end date - Caldav: EWS refactoring, first recurrence implementation step, improve ignore etag handling - Caldav: EWS refactoring, manage attendees - Caldav: prepare calendar refactoring, do not delete/add received meeting items, just send an Accept/Decline message - Caldav: fix regression, busy status is case sensitive in EWS - Caldav: fix #657 Tentative events shows as accepted in Thunderbird with user provided patch - Caldav: experimental davmail.ignoreNoneMatchStar to let DavMail overwrite existing event automatically processed by Exchange. ### Carddav: - Carddav: implement get photo from Active Directory ### Enhancements: - update winrun4j wrappers - Upgrade slf4j to 1.7.25 (patch #45) - Fix 654: trim OWA/EWS url - Ant: improve java version check - Remove useless debug statement ### Smartcard: - Smartcard: improve Java 9 error handling, no longer need a temporary file - Smartcard: try to implement code compatible with all java versions including Java 9 ### IMAP: - IMAP: implement ON search filter - IMAP: detect icedove header fetch to improve performance - IMAP: make sure we never return null even with broken 0 uid message ### POP: - POP3: Improve documentation on trash/sent folders purge, change default value from 90 to 0 (disable) ### Linux: - Linux: check system tray with gtk_status_icon_get_geometry only with Unity to avoid regression with other window managers ### SWT: - SWT: wait 10s for tray icon to be created ### OSX: - OSX: fix Info.plist path - OSX: fix JavaApplicationStub, do not expand folder classpath - OSX: revert change to JavaX new key, does not work - OSX: Update Info.plist to match new universalJavaApplicationStub ## DavMail 4.8.0 2017-03-23 This new release includes a lot of fixes and enhancements from user feedback, including improved Exchange categories handling, up to date TLS settings to match current requirements, various Caldav enhancements, and a fix for a major bug on IMAP large message handling. An experimental connection logging feature is also available. ### Debian: - Improve generated debian package to match official package, add keywords, move icon and adjust categories in desktop file ### RPM: - update RPM default config file - Remove ant-antlr from spec file ### Enhancement: - Use Office365 url as default davmail.url value - Remove Sun (Oracle) JDK dependency in unit test - Experimental: compile Junit tests - Change default url to https://outlook.office365.com/EWS/Exchange.asmx - Log all connections disconnect - Log all connections and logon success / failure - Improve TLS settings: disable Client-initiated TLS renegotiation with jdk.tls.rejectClientInitiatedRenegotiation and force strong ephemeral Diffie-Hellman parameter with jdk.tls.ephemeralDHKeySize - Remove sun.security.ssl.allowUnsafeRenegotiation=true system property as it's hopefully no longer required by iCal - Fix broken davmailservice64.exe ### Documentation: - Doc: document IMAP tags to Exchange categories custom mappings - Doc: Add TLS settings documentation from support request #289 - Doc: fix maven generated site dash encoding ### Caldav: - Caldav: Fix #643 VTODO PRIORITY 0 fails, map it to Normal importance - Caldav: accept all meeting item types in calendar (MeetingMessage, MeetingRequest, MeetingResponse, MeetingCancellation) - Caldav: fix #639, task description is not visible in Thunderbird, try to get description from text body - Caldav: fix #628, remove METHOD: PUBLISH from events retrieved from Exchange - Caldav: make sure retrieved item name is always the same as requested item name (e.g. for tasks stored value ends with .EML when requested value ends with .ics) - Caldav: Additional recurrence search test ### IMAP: - IMAP: flags to category conversion unit tests and make standard flags case insensitive - IMAP: make IMAP flag to category lookup case insensitive - IMAP: fix huge cache issue, chunk IMAP fetch triggers multiple full message download - IMAP: fix regression after #41 IMAP wildcard LIST supportwith unit test - IMAP: apply patch #41 IMAP wildcard LIST supportwith unit test - IMAP: mark message seen only if unseen - IMAP: fix #629 Read email doesn't stay read. According to IMAP RFC: The \Seen flag is implicitly set - IMAP: merge patch from #634, copy mail doesn't preserve tag/category - IMAP: fix regression in mime message handling and rename mimeBody to mimeContent - IMAP: Fix #633 Compatibility with javamail 1.5.6, store byte array instead of SharedByteArrayInputStream ### Carddav: - Carddav: do not send empty EmailAddresses collection tag ### EWS: - EWS: Change isrecurring property to PidLidRecurring (0x8223) - EWS/Webdav: implement exists filter condition ### SWT: - SWT: Try to detect if system tray is indeed available ### OSX: - OSX: Update universalJavaApplicationStub to version 2.0.1 - OSX: Upgrade jarbundler to 3.3.0 ### SMTP: - SMTP: append a line feed to avoid thunderbird message drop ## DavMail 4.7.3 2016-11-22 Another bugfix release, mostly from user feedback. Also improve Windows installer to let users choose whether they want to run DavMail automatically at logon. ### Enhancement: - Improve windows installer, make auto start at logon optional - Update release guide with opensuse build env - update icon cache - Update winrun4j wrappers icon to 128x128 ### EWS: - EWS: workaround for invalid cookie domain on Office365 ### DAV: - DAV: merge patch from #232 Outlook-created appt does not go through. OWA-created one does ### IMAP: - IMAP: additional fix for #626, workaround for from: header not searchable over EWS - IMAP: fix for #626, workaround for to: header not searchable over EWS ### SMTP: - SMTP: Merge patch 627 by Peter Chubb, server returns incorrect code on authentication failure ## DavMail 4.7.2 2016-04-09 Bugfix release, detect Exchange throttling to temporarily block requests and a few Carddav fixes. ### EWS: - EWS: handle Exchange throttling, suspend all requests according to server provided delay - EWS: send DavMailException instead of authentication exception on EWS not available error ### Enhancements: - 128x128 DavMail icon - Add a new davmail.httpMaxRedirects setting - DAV: add a hidden davmail.disableNTLM setting ### Carddav: - Carddav: fix another regression on contact create with empty field - Carddav: remove email over EWS unit test - Carddav: fix email address removal over EWS ## DavMail 4.7.1 2015-12-19 Bugfix release, mainly for Carddav regression over EWS, also includes an NTLM support enhancement. ### Enhancement: - Improve NTLM support try to send hostname as workstation name instead of UNKNOWN - Fix notification dialog message - Prepare ExchangeSessionFactory refactoring - Fix typo in french translation - Fix broken Sourceforge link in About dialog ### Carddav: - Carddav: fix regression on contact update with empty field triggering DeleteItemField ## DavMail 4.7.0 2015-11-05 This new release contains a lot of fixes from user feedback, a new -notray command line option to force window mode and avoid tricky tray icon issues on Linux and native smartcard support on Windows. ### Caldav: - Caldav: Map additional priority levels - Caldav: fix missing LAST-MODIFIED in events ### Enhancements: - Improved tray icon with alpha blend - Fix imports - Prepare mutual SSL authentication between client and DavMail implementation - Implement -notray command line option as a workaround for broken SWT and Unity issues - Change warning messages to debug in close method - Improve client certificate dialog, build description from certificate - Exclude client certificates not issued by server provided issuers list ### IMAP: - IMAP: Additional translations and doc for new IMAP setting - IMAP: Merge patch by Mauro Cicognini, add a new setting to always send approximate message in RFC822.SIZE to avoid downloading full message body - IMAP: fix regression with quotes inside folder names - IMAP: handle quotes inside folder names correctly ### OSX: - OSX link local address on loopback interface - Exclude arguments starting with dash to avoid patch 38 regression on OSX ### Documentation: - Doc: Document -notray option - Switch to OpenHub instead of Ohloh ### EWS: - EWS: prepare distribution list implementation - Fix #254 davmail.exchange.ews.EWSException: ErrorIncorrectUpdatePropertyCount ### Linux: - Refresh davmail.spec, make RPM noarch - Handle missing or broken SWT library ### Windows: - Windows: Make MSCAPI keystore type available in Settings for Windows native smartcard support - Instantiate MSCAPI explicitly to access Windows Smartcards - Enable native Windows SmartCard access through MSCAPI (no PKCS11 config required) ### Carddav: - Carddav: Test case for comma in ADR field - Carddav: Do not replace comma on ADR field, see support request 255 - Caldav: Ignore missing END:VCALENDAR line on modified occurrences - CardDav: Add empty property test case ## DavMail 4.6.2 2015-08-19 Another bug fix release with some efforts on packaging. ### Packaging: - Compute distribution packages checksums - Maven: set mimimum Maven version and fix FindBugs filter - Maven: add Gtk lib in repo to avoid ClassNotFound - Maven: exclude non DavMail classes from FindBugs report - Maven: Update POM to Maven 3 - Separate prepare-dist ant task - Separate jar ant task - RPM: Change log for 4.6.1 and remove ant-nodeps dependency for Fedora >=19 compatibility - RPM: first step to a noarch package, externalize SWT dependency - RPM: Add rcdavmail link, mark logrotate config file - RPM: Fix License and URL ### Enhancements: - Fix davmailconsole.exe - Switch to TLS in DavGatewaySSLProtocolSocketFactory - Improve refresh folder logic, ctag stamp is limited to second, check message count - Try to support Citrix NetScaler authentication form - Improve Java version check - Update compile level to 1.6 - Remove unneeded catch section ### WebDav: - DAV: avoid NullPointerException trying to access Exchange 2013 in Dav mode ### IMAP: - IMAP: refactor IMAP test cases - IMAP: ignore Draft flag on update, Draft is readonly after create - IMAP: fix new IMAP tokenizer - IMAP: rewrite tokenizer to manage quoted folder names and complex search - IMAP: Fix #591 Properly escape quotes in folder names - IMAP: additional IMAP test cases ### EWS: - EWS: davmail.enableChunkedRequest default value is now false, as IIS does not support chunked requests - EWS: Make chunked content optional in CreateItemMethod with new davmail.enableChunkedRequest property - Use EWS path in davmail.properties template file ### Doc: - Doc: add Indicator SystemtrayUnity to linux doc - Fix Javadoc ### OSX: - OSX: merge patch 38, allow commandline options to run multiple instances. ### SMTP: - SMTP: use content chunk to send large messages ## DavMail 4.6.1 2015-02-17 Bugfix release to fix recent regression with Office 365, also includes a few Linux and IMAP enhancements. ### Linux: - RPM: exclude Growl library from RPM package - Add genericname to desktop entry - RPM: Fix warning the init script refers to runlevel 4 which is admin defined. No distribution script must use it - Detect and log message for Unity users - RPM: Fix JAVA HOME detection for openSUSE_13.2 - RPM: update spec file from OpenSuse build by Dmitri Bachtin and Achim Herwig ### SWT: - SWT: improve tray init, preload image and add a delay on first message ### Enhancements: - Add a few more logging statements ### IMAP: - Fix #36 Endless loop when using IMAP IDLE feature with SSL sockets, replaced thread sleep with a short timeout on socket read ### EWS: - EWS: update checkEndPointUrl, send get root folder request instead of static wsdl request no longer available on Office365 ## DavMail 4.6.0 2015-01-27 Bugfix release with many IMAP enhancements over EWS, implement batch move items, also includes a brand new generic OSX package to handle new OSX java behaviour. ### OSX: - OSX: refactor OSX package based on universalJavaApplicationStub - Replace Java application stub with https://github.com/tofi86/universalJavaApplicationStub/blob/master/src/universalJavaApplicationStub ### Doc: - Doc: update OSX setup documentation - Doc: additional Linux instructions for Ubuntu 14 - Fix #31 A typo in davmail.properties example ### EWS: - EWS: improve main calendar folder test - EWS: fix batch move - EWS: Adjust paged search for folders - EWS: implement batch move items - EWS: improve folder paged search - Prepare batch move implementation - EWS: force NTLM in direct EWS mode - EWS: implement batch move method - EWS: switch to GetMethod to check endpoint - EWS: take paging into account in appendSubFolders - EWS: fix ErrorExceededFindCountLimit on FindFolder requests - EWS: avoid NullPointerException in fixAttendees ### Linux: - Allow Java 8 and default jre in debian package ### IMAP: - IMAP: fix 587 log and skip broken messages ### Caldav: - Caldav: fix #98 Support of Contacts in CardDav REPORT - Fix #35 duplicates in updated reoccurring events ### Enhancements: - Fix potential CVE-2014-3566 vulnerability - From audit: remove throws statement - Adjust KerberosHelper logging message - Fix for #534 Kerberos Authentication doesn't seem to be work cross domain ### LDAP: - LDAP: reset icon after search ## DavMail 4.5.1 2014-07-20 Bugfix release to fix Exchange 2013 regressions and wrong Europe/London timezone mapping. ### DAV: - DAV: Another email address failover ### Caldav: - Caldav: Fix GMT Standard Time mapping to Europe/London - More timezones - Caldav: do not request additional properties for MeetingCancellation and MeetingResponse - Caldav: merge 33, apply myresponsetype partstat on all Exchange versions - Caldav: fix 569 and patch 32, avoid NullPointerException with Exchange 2013 ### EWS: - EWS: Avoid null in log message ### Enhancements: - Merge patch 34: Fix false positive when searching for user alias and email ### Doc: - Update FAQ on EWS endpoint not available error ## DavMail 4.5.0 2014-06-03 Includes EWS performance enhancements, improved Exchange 2013 support and many fixes detected by Coverity audit tool ### EWS: - EWS: adjust declined item handling - EWS: used paged search with static search condition, send a single request when folderSizeLimit is enabled - EWS: Allow Item and PostItem elements in message folders - EWS: Improve Exchange 2013 support - EWS: avoid mime content String conversion - EWS: Improve javadoc and make ItemId serializable - EWS: expect UTF-8 in options responses - EWS: remove unused field - EWS: Force encoding in mimeContent decode - EWS: Avoid /owa form request in direct EWS mode ### Documentation: - Add davmail.defaultDomain to template properties file - Doc: Change default port in Thunderbird directory config screenshot - Update settings image ### IMAP: - IMAP: fix 564, Moving / copying messages in public mailbox - IMAP: implement separate thread folder load on STATUS request to avoid client timeouts - IMAP: fix 209, use isEqualTo instead of contains to search keywords on Exchange 2010 - IMAP : various enhancements from audit, switch to enum and avoid NullPointerException ### OSX: - OSX: force working directory to application root ### Enhancements: - Upgrade svnkit to 1.8 - Update WinRun4J wrappers - Upgrade WinRun4J to 0.4.5 - Kerberos: make sure access to client login context is synchronized - Kerberos: synchronize access to clientLoginContext - Make MessageWrapper static - Revert Java 7 only changes - Do not try WebDav mode if owa url ends with /ews/exchange.asmx - Additional code fixes from audit, do not try to get time zone from options page in direct EWS mode - Force encoding in message create thread - Prepare WoodStox Xml10AllowAllEscapedChars setting implementation - Apply Base64 refactoring to all classes - Apply new base64 methods to CaldavConnection - Refactor base64 encode/decode methods - Improve contact picture error handling - Improve session factory log statements - Avoid null in log statement - New experimental davmail.exchange.maxConnections setting to limit concurrent connections to Exchange server ### Caldav: - Caldav: fix bug in VCalendar dtend check ### POP: - Refactor PopConnection, use enumeration instead of int ### Coverity: - From coverity: listFiles may return null - From coverity: avoid null dereference in VProperty - From coverity: avoid null dereference in getFolderPath - From coverity: check null image in FrameGatewayTray - From coverity: more encoding fixes - From coverity: synchronize HttpClient cookies access - From coverity: synchronize FileAppender creation - From coverity: URI.getPath may return null - From coverity: ImageIO.read may return null - From coverity: trayItem.getImage may return null - From coverity: client.getInetAddress() may return null - From coverity: createSaslServer may return null - From coverity: use UTF-8 encoding in Hex conversion methods - From coverity: force encoding to UTF-8 on socket output stream - From coverity: set encoding on String to bytes conversion - From coverity: use getParamValue instead of getParam().getValue() to avoid null dereference - From coverity: editor pane font can be null - From coverity: check null after ImageIO.read ### UI: - UI: small fixes on ui code from audit - Refactor SWT tray dispose management on exit - Handle missing resource in loadSwtImage ### DAV: - DAV: decode base64 content as ASCII ## DavMail 4.4.1 2014-01-30 Includes mostly EWS support enhancements, Sogo carddav issue workaround, new IMAP uid based paging implementation to handle concurrent folder changes and a few other bug fixes. ### Documentation: - Doc: update donation link to let user choose currency - Doc: Update iCal Caldav setup for OSX Mavericks - Doc: update server setup documentation, use noinstall package on Windows - Doc: Update news url in release guide ### EWS: - EWS: workaround for user reported issue, less strict filter in isItemId - EWS: Override authentication mode test: EWS is never form based - EWS: new paging implementation based on imap uid sort to avoid issues on concurrent changes on searched folder - EWS: in direct EWS mode, try to use ResolveNames to get current user email address - EWS: Another try for checkEndPointUrl, head on /ews/exchange.asmx and follow redirects to wsdl - EWS: improve ItemId vs user provided item name detection ### Enhancements: - From coverity: avoid null dereference when no network interface is available - From coverity: set encoding on byte array to String conversion - From coverity: fix resource leak - Update svnant libraries - Fix reauthentication issue: separate domain from username in credentials - Fix NullPointerException in thread "Shutdown" - tray disposal - server mode - Fix authentication failure after session expiration ### Caldav: - Caldav: Fix 555 another broken Israeli timezone - Caldav: ignore invalid BEGIN line inside object (Sogo Carddav issue) ## DavMail 4.4.0 2013-11-13 Added folder size limit setting to let users avoid IMAP timeouts and reduce memory footprint. Also contains many documentation updates, including updated OSX instructions for Mavericks and some more bugfixes on IMAP, Caldav (iOS 7 user agent) and SMTP. ### Documentation: - Doc: update roadmap - Doc: reference Marcin Dulak as contributor (RPM package maintainer) - Doc: Document OSX Mavericks IMAP account creation - Doc: improve FAQ - Doc: Fix OSX download instructions - Doc: Update OSX doc - Doc: additional FAQ comment on shared calendar hierarchy - Doc: update smtp screenshot - Doc: update more Thunderbird screenshots - Doc: update Lightning screenshots - Doc: document calendar.caldav.sched.enabled in main Lightning setup doc ### Enhancements: - Additional IMAP unit tests - Add davmail.folderSizeLimit to UI and documentation - Fix AbstractConnection.readContent, see https://sourceforge.net/p/davmail/bugs/538/ ### SMTP: - SMTP: create a new davmail.smtpStripFrom boolean property to force From: header removal ### IMAP: - IMAP: Make flags case insensitive on append - IMAP: improve uidNext implementation - Italian IMAP flag translation thanks to puntogil@libero.it - IMAP: fix 538, send capabilities untagged response to avoid timeout on large message APPEND - IMAP: Implement davmail.folderSizeLimit ### Caldav: - Caldav: change user agent test to include all iOS versions ## DavMail 4.3.4 2013-09-09 Added a new OSX Java7 package, IMAP header management regression fixes. Also fixed a few bugs reported by users and improved documentation. ### Documentation: - Doc: Reference Alexandre Rossi as Debian package maintainer - Doc: Update FAQ shared mailbox path - Doc: update svn repository location in build doc - Force language on donations link - Doc: OSX LaunchDaemon ### Enhancements: - Add trust="true" to scp command - Italian translation from gil cattaneo https://bugzilla.redhat.com/show_bug.cgi?id=894413 - Allow identical username/userid in multiple factor authentication form - Rethrow DavMailException on connect exception - Fix NullPointerException on server unavailable - New experimental davmail.popCommonDeleted flag to switch to a different property on old Exchange 2003 servers ### Caldav: - Caldav: flag ORGANIZER participant status as ACCEPTED instead of NEEDS-ACTION - Caldav: do not overwrite X-MICROSOFT-CDO-BUSYSTATUS if TRANSP is not provided - Merge patch to set sensitivy on VTODO ### OSX: - OSX: Get application path from library path with Java7 launcher - OSX: move libgrowl to library path - OSX: build Java 7 package - Customized OSX app launcher messages - Java7 OSX app launcher ### EWS: - EWS: fix 537, detect 507 Insufficient Storage ### WebDav: - DAV: set SO timeout on connection ### IMAP: - IMAP: new header fix, do not rely on messageheaders attribute on full headers request, load message - IMAP: improve invalid message header test - IMAP: fix invalid message header filter - IMAP: write message without headers on BODY[TEXT] fetch ## DavMail 4.3.3 2013-06-13 Make keep alive optional new davmail.enableKeepalive setting and fix regressions in IMAP handler. ### Enhancements: - Update Maven POM to new Sourceforge project site - Rename new setting to davmail.enableKeepalive and include in settings GUI ### IMAP: - IMAP: make keepalive spaces optional with new davmail.imapEnableKeepalive setting - IMAP: interrupt EWS folder load on client timeout - IMAP: fix missing headers with Outlook - IMAP: Detect invalid content in message header field - IMAP: skip Microsoft Mail Internet Headers Version 2.0 in message headers field - IMAP: remove additional logging ## DavMail 4.3.2 2013-06-06 Another bugfix release. ### IMAP: Fix regression on IMAP select folder with thunderbird ## DavMail 4.3.1 2013-06-05 Bugfix release to fix regressions with some IMAP clients and enhanced FetchMail support. ### OSX: - OSX: switch back to single archive and add a comment ### IMAP: - IMAP: fix double header content and optimize header fetch with Fetchmail - IMAP: fix regression in append envelope - IMAP: fix multithreaded folder load implementation to support more IMAP clients ### POP: - POP: fix 3613743, remove additional +OK during message RETR ### Linux: - dos2unix on davmail.spec - Update davsvn ## DavMail 4.3.0 2013-05-21 New keep alive mechanism to avoid most IMAP and POP client timeouts: load large messages in a separate thread and send a character on client connection every ten seconds. Also includes some bug fixes, documentation enhancements and experimental Exchange 2013 support. ### OSX: - OSX: Add a readme.txt file to OSX package to help users temporarily disable Gatekeeper ### Documentation: - Doc: improve OSX setup doc for Mountain Lion - Update SSL doc, spaces in library path may break Sun PKCS11 - Update linux setup doc for Ubuntu 13 users - Update server setup doc with detailed davmail.properties file ### Caldav: - Caldav: New workaround for Lightning bug: sleep for 1 second on server unavailable error ### IMAP: - Interrupt message load thread on client connection exception - IMAP: try to avoid timeout on large message FETCH with a KeepAlive space character - IMAP: try to avoid timeout on folder SELECT with a KeepAlive space character - Improve message list count implementation - Always sort by IMAP uid desc ### POP: - POP: load big messages in a separate thread ### EWS: - EWS: Fix regression in checkEndPointUrl, get /ews/services.wsdl - Fix for Exchange 2013 support - EWS: implement SortOrder ### Enhancements: - Improve DavMail shell scripts - Set default file path to /var/log/davmail.log in reference davmail.properties - Set a default log file size in reference davmail.properties - Use reference davmail.properties in war file - Disable broken dist-rpm - Reference server davmail.properties file - Add disableUpdateCheck to default davmail.properties file - Exclude WinRun4J from debian package - Exclude libgrowl and winrun4J from war package - Exclude winrun4J from linux packages - Set davmail.logFileSize to 0 to use an external rotation mechanism, e.g. logrotate - Merge latest changes from Marcin Dulak - Archive jsmooth wrappers - Fix version in spec file ## DavMail 4.2.1 2013-04-11 Improved Kerberos support and a few bug fixes reported on tracker. ### Kerberos: - Add enable Kerberos checkbox to DavMail GUI - Kerberos read KRB5CCNAME environment variable to set ticket cache path - Kerberos implement graphical callback on missing token - Kerberos: Renew almost expired tickets and detect expired TGT in cache => try to relogin - Kerberos: Handle client context timeout, try to recreate context - Improve KerberosHelper implementation, prepare credential delegation support ### Enhancements: - Try to fix 3606267: New debian dependency with wrong package name - Fix 3602588, allow oracle-java7-jre - Fix regression: disable console appender in gui mode - Use NewIbmX509 on IBM JDK instead of NewSunX509 SSL algorithm implementation - Fix 3602351, detect missing item ### EWS: - EWS: do not catch socket exception in executeMethod - EWS: workaround for Nokia N9 Caldav implementation bug ### DAV: - DAV: throw error on broken connection ### SMTP: - SMTP: do not allow send as another user on Exchange 2003 ### IMAP: - IMAP: exclude Mutt header request from size optimization - IMAP: change kerberos login error message - IMAP send error on authentication failed ### Documentation: - Doc: Additional Kerberos documentation - Initial Kerberos documentation ### Caldav: - Caldav: do not send 401 on authentication error in Kerberos mode ## DavMail 4.2.0 2013-02-26 Contains some enhancements on iOS 6 support, Debian package encoding issue fix and partial Kerberos support (workstation mode) to provide transparent Exchange authentication. ### Kerberos: - Kerberos: implement server side security context and token handling - Kerberos: server side login module - Improve Kerberos logging and implement command line callback - Do not set preemptive authentication in Kerberos mode - Enable Kerberos authentication scheme with davmail.enableKerberos setting - Kerberos authentication implementation: SpNegoScheme to implement Negotiate authentication scheme, KerberosHelper to handle ticket access and KerberosLoginConfiguration to replace JAAS configuration file ### Enhancements: - Fix accept certificate message - Make davmail.sh executable in platform independent package - Update desktop entry comment - Update RPM spec file from build.opensuse.org (marcindulak) - Add libswt-cairo-gtk-3-jni to debian package dependencies - Clear cookies created by authentication test - Upgrade jackrabbit-webdav and htmlcleaner in davmailconsole wrapper - Upgrade jackrabbit-webdav to 2.4.3 - Upgrade htmlcleaner to 2.2 - Exclude Jsmooth, nsi, OSX and contribs (with binary) from source only package - Prepare source only package ### Bugfix: - Check file encoding in build file - Refactor StringUtil and encode ~ in urlcompname ### IMAP: - IMAP: Implement custom IMAP flags to keywords mapping in settings ### Caldav: - Caldav: add iOS6 user agent ## DavMail 4.1.0 2012-09-26 Bugfix release with improved IMAP support, including IMAP flags mapping to Outlook categories, enhanced IMAP noop/idle support, fixed emClient Caldav support and many Caldav and EWS fixes. ### Documentation: - Doc: update roadmap - Doc: new FAQ entry, Exchange RSA two factor authentication form ### Caldav: - Caldav: do not try to load tasks MIME body - Caldav: workaround for 3569922: quick fix for broken Israeli Timezone issue - Caldav: remove urlencoding workaround for emClient >= 4 - Caldav: Ignore 401 unauthorized on public event, return 200 - Caldav: Rename TZID also in RECURRENCE-ID - Caldav: force 403 forbidden instead of 401 on unauthorized update to public folder item - Caldav: Fix 3569934 NullPointerException on broken PROPFIND request - Caldav: Fix 3567364, regression on from/to/cc handling in calendar related to IMAP search enhancement. Separate mapping for message fields/headers ### IMAP: - IMAP: send updated flags on folder refresh - IMAP: fix keyword handling to avoid sending \Seen as keyword - IMAP: retrieve message count on folder - IMAP: apply flag to keyword conversion in SEARCH, refresh folder before search - IMAP: improve keyword support, map $label1 to 5 from Thunderbird to Outlook categories - IMAP: fix keywords implementation, make it case insensitive, implement KEYWORD search - IMAP: implement generic FLAGS mapping to Outlook categories - IMAP: fix 3566412, range iterator is on folder messages, not messages returned from search ### EWS: - EWS: Get primary smtp email address with ResolveNames in direct EWS mode ### Enhancements: - Allow Java 7 to build DavMail - Prepare message keywords/categories support ### WebDav: - Dav: implement multivalued property suppord in ExchangeDavMethod ### Web: - Web: Fix 3566941 Imap protocol is not activated by default in .war ## DavMail 4.0.0 2012-09-10 Includes full Exchange 2007 and 2010 support with EWS implementation, fixed OSX Mountain Lion support, switched Windows wrappers to WinRun4J and additional enhancements and bugfixes. ### IMAP: - IMAP: workaround for broken message headers on Exchange 2010 - IMAP: log content if less than 2K - IMAP: improve Exchange 2010 header search, use direct header names to implement substring search on some headers - IMAP: additional fix for Exchange 2010 header search, use PR_TRANSPORT_MESSAGE_HEADERS - IMAP: Exchange 2010 does not support header search, workaround to avoid duplicate items in Drafts folder with Thunderbird - IMAP: fix 3553942, unexpected imap NIL response - IMAP: detect and ignore missing message to avoid NullPointerException - IMAP: improve bodystructure error handling ### Documentation: - Doc: fix image swap - Doc: update roadmap - Doc: add Developed with Intellij Idea link ### Caldav: - Caldav: encode semicolon in urlcompname - Caldav: fix attendees in modified occurences - Caldav: additional timezone names for Exchange 2010 - Caldav: additional timezones available in Exchange 2007 - Caldav: Partial fix for missing items on Exchange 2010 - Caldav: fix OSX Mountain Lion (iCal 6) support ### Enhancement: - Merge patch 3488553: Make davmail.jar executable - Merge patch from 3562031, advanced noProxyFor handling - Display released version in about frame when different from current version - Fix 3562031, implement davmail.noProxyFor setting to exclude hosts from proxy settings - Merge preauthentication page patch - Prepare pre authentication page merge in ExchangeSession - Implement javascript redirect in executeFollowRedirects - Prepare javascript redirect merge (multiple authentication pages) - Try to improve shutdown hook ### Windows: - Update download url in 64 bit wrappers to http://java.com/en/download/manual.jsp - Add davmailservice64.exe WinRun4J service wrapper - Replace 64 bits jsmoothgen with WinRun4J wrapper - 64 bits Winrun4J wrapper - Fix Winrun4J service wrapper implementation, launch a non daemon thread - Win: switch to Winrun4J wrappers ### OSX: - OSX: Add a note on Gatekeeper for OSX Mountain Lion users ### EWS: - EWS: fix davmail.acceptEncodingGzip setting handling ## DavMail 3.9.9 2012-07-10 Bugfix release with major IMAP changes to improve sync performance, many Caldav enhancements and bugfixes and some documentation updates. ### Caldav: - Caldav: encode ? in urlcompname - Caldav: fix 3534615, patch allday dates only on Exchange 2007 - Caldav: implement full contact folder dump at /users//contacts/ - Caldav: implement task priority over EWS - Caldav: remove unsupported attachment reference to avoid iPhone/iPad crash - Caldav: reintroduce davmail.caldavDisableTasks setting to disable tasks support - Caldav: fix encode pipe | to %7C in urlcompname - Caldav: encode pipe | to %7C in urlcompname - CalDav: Fix 3512857, avoid double path encoding in DavExchangeSession.loadVtimezone() - Caldav: improve Exchange 2007 EWS meeting support - Caldav: rebuild meeting attendees only for Exchange 2007, Exchange 2010 ics parser is correct ### Enhancements: - Fixes from audit - store davmail.log in user home folder to avoid crash on first start when current directory is not writable by user - Add WinRun4J to Maven POM and update windows service documentation - Switch to WinRun4J for Windows service wrapper - Fix 3494770: Add missing antlr runtime - Upgrade svnkit for subversion 1.7 compatibility ### IMAP: - IMAP: Fix 3534801, workaround for missing From header - IMAP: fix 3441891, workaround for Exchange 2003 ActiveSync bug - IMAP: experimental implementation of header only FETCH, do not download full message content and send approximate RFC822.SIZE (MAPI size) - IMAP: avoid full message download on OSX Lion flags request with content-class header - IMAP: exclude IDLE from infinite loop detection - IMAP: add date header to rebuilt message - IMAP: Force UTF-8 on message rebuild - IMAP: implement RFC822 fetch request ### GUI: - GUI: force alwaysOnTop on dialogs to make sure they are visible - GUI: always bring dialog windows to front ### Documentation: - Doc: add a new FAQ entry on shared mailbox access over IMAP - Doc: Update doc to include Java 7 - Doc: small fix in Linux setup doc - Doc: Update Linux instructions for Ubuntu 12 Natty - Doc: New review - Doc: update Thunderbird POP account setup doc - Doc: Update SSL setup documentation on PKCS12 passwords - Doc: add a note on hidden folders on OSX Lion - Doc: Fix new thunderbird doc ### OSX: - OSX: new hide from Dock setting available directly in UI (DavMail restart needed) ### Carddav: - Carddav: Fix 3511472, implement fileas over EWS - Carddav: Skip carriage return in ICSBufferedWriter ### EWS: - EWS: disable gzip encoding if WIRE logging is at DEBUG level - EWS: fix 3263905 ErrorInvalidPropertyRequest, do not update message:IsRead on appointments - EWS: make isMainCalendar case insensitive - EWS: revert chunked inputstream inside gzip and create new setting davmail.acceptEncodingGzip - EWS: handle chunked inputstream inside gzip - EWS: improve error message handling, log error description - EWS: improve error handling on socket exception - EWS: avoid NullPointerException in broken message rebuild ### WebDav: - Dav: decode permanenturl to avoid double urlencoding issue - Dav: decode url returned on saveappt cmd in DavExchangeSession.loadVtimezone() ## DavMail 3.9.8 2012-02-21 Prepare 4.0 release with improved Exchange 2010 support, added IMAP MOVE extension support, include a new windows noinstall package and implement captcha authentication support. ### Documentation: - Doc: update roadmap - Doc: add a statement on adding NSIS to system path in build instructions - Doc: update Thunderbird IMAP setup instructions for Thunderbird 10 - Doc: update java package reference - Doc: update address book setup instructions for OSX Lion - Doc: add Growl reference in OSX setup ### Enhancements: - Fix nsis script: delete stax api jar on uninstall - Fixes from audit - New redline ant task definition fix - Exclude Junit from binary packages - Create Windows noinstall package - Implement a new davmail.clientSoTimeout setting to adjust or disable connection timeout - Improve message on invalid OWA uri - Fix notification dialog test - Improve Pinsafe captcha display - workaround for broken form with empty action - Implement ISA server PINsafeISAFilter support (captcha image) - Upgrade Redline RPM - Add StreamScanner.java from Woodstox 4.1.2 - Upgrade to Woodstox 4.1.2 - Fix 3454332: davmail.sh script missing shebang - add trust=true in upload-site ### IMAP: - IMAP: fix search date format for Exchange 2010 support (ErrorInvalidValueForProperty) - IMAP: implement SEARCH TEXT on from, to, cc, subject and body - IMAP: send error on COPY/MOVE when message iterator is empty - IMAP: implement MOVE RFC draft http://tools.ietf.org/id/draft-krecicki-imap-move-00.html - IMAP: fix 3480516, () instead of NIL on empty envelope header - IMAP: Fix 3479993, backslash in header ### SMTP: - SMTP: fix 3489007, Sparrow AUTH PLAIN authentication support ### Caldav: - Caldav: force context Timezone on Exchange 2010 - Caldav: add missing timezones from Exchange 2007 over WebDav - Caldav: let users edit outgoing notifications for meeting requests - Caldav: fix NullPointerException on addressbook request - Caldav: workaround for broken items with \n as first line character ### POP: - POP: add a new setting to mark messages read after RETR ### EWS: - EWS: fix ErrorInvalidValueForProperty on search undeleted with Exchange 2010, set type Integer on PidLidImapDeleted and junk 0x1083 - EWS: new fix to improve failover on error retrieving MimeContent - EWS: improve failover on error retrieving MimeContent - EWS: Fix 3471671, workaround for Exchange invalid chars ### LDAP: - LDAP: improve invalid dn message ### OSX: - OSX: make nodock mode the default - OSX: make sure davmail.jar is first in classpath ### DAV: - Dav: set contact email type to SMTP - Dav: add email type MAPI properties ### Carddav: - Carddav: avoid NullPointerException on broken contact - Carddav: fix regression on address book handling on Snow Leopard - Carddav: decode urlcompname before search to retrieve contacts with & in url ## DavMail 3.9.7 2012-01-10 Another bugfix release with new stax based webdav search method implementation to reduce memory footprint with large folders, exclude non event items from calendar to avoid errors, some EWS fixes on tasks handling and a few documentation updates ### WebDav: - Dav: fix regression in new Stax implementation - Dav: new stax based WebDav requests implementation to reduce memory usage, enabled on Search requests - Dav: switch back to mailbox path on Exchange 2003 for CmdBasePath ### Caldav: - Caldav: Experimental patch to support spaces in calendar or contacts path on OSX, see 3464086 - Caldav: Create a new davmail.caldavEnableLegacyTasks to allow access to tasks created in calendar folder by previous DavMail versions - Caldav: drop davmail.caldavDisableTasks setting, retrieve only events from calendar - Caldav: Change field update order for Exchange 2007 over EWS - Caldav: apply date filter to tasks - Caldav: new timezone for Mexico - Caldav: fix 3433584, encode comma in LOCATION field ### IMAP: - IMAP: fix double slash in folder path - IMAP: return all search results uids on a single line for Wanderlust - IMAP: new davmail.imapIncludeSpecialFolders setting to access all folders including calendar and tasks over IMAP - IMAP: fix wanderlust support, allow lower case fetch params ### Documentation: - Doc: Added DavMail hangs on 64-bit Linux FAQ entry - Doc: add documentation for davmail.logFileSize option ### Enhancements: - Change default use system proxies value to false - Avoid NullPointerException on WebdavNotAvailableException - Fix upload-version target site ### EWS: - EWS: fix Exchange 2010 SP1 support - EWS: use archivemsgfolderroot as archive root - EWS: enable preemptive authentication on non NTLM endpoints - EWS: add Exchange2010_SP1 support for online archive ### LDAP: - LDAP: avoid NullPointerException during SASL authentication ### Carddav: - Carddav: encode star in urlcompname ## DavMail 3.9.6 2011-10-30 Another bugfix release to improve iPad 2 and Debian based Linux support. Also includes new protocol mode options (EWS, WebDav or Auto), experimental Exchange online archive support, IMAP UTF-8 search parameter and many Caldav fixes ### Enhancements: - Add a new upload-version ant target to upload version.txt - Workaround for broken servers that send invalid Basic authentication challenge - Add exchangecookie to the list of authentication cookies for direct EWS access - Add a new auto value to davmail.enableEws setting to avoid unwanted switch from WebDav to EWS on temporary Exchange connection issue - Encode # in urlcompname - Fix bug on ITEM_PROPERTIES value on EWS/WebDav mode switch - Add new Default button to reset log levels - Implement a new option to let users disable all GUI notifications - Additional exception trace exclusion - Revert 1.7 test on SWT, tray implementation is still broken on Linux ### Documentation: - Doc: reformat urls in FAQ - Doc: add a note to help users with broken Unity desktop manager on Ubuntu - Doc: Fix typo in project description - Doc: additional note on Caldav setup in Thunderbird and new external review - Doc: document new disable balloon notifications setting - Doc: Update roadmap - Doc: New reviews - Doc: Update iCal doc to match both Snow Leopard and Lion - Doc: Update FAQ - Doc: Update DavMail settings screenshot ### Linux: - Allow openjdk-7-jre dependency in deb package - Fix 3418960: Update dependencies for Ubuntu 11.10, add libswt-gtk-3-java ### Caldav: - Caldav: apply iCal 5 workaround to iOS 5 - Caldav: new timezone in rename table - Caldav: try to merge Exchange 2010 and 2007 filters - Caldav: additional unit tests - Caldav: fix 3426148 decode and encode comma in RESOURCES field value - Caldav: Fix complex timezones sent by clients, leave only latest STANDARD and DAYLIGHT definition - Caldav: Fix 3420240, retrieve description from tasks over Dav ### EWS: - EWS: add new DistinguishedFolderId value for Exchange archive support - EWS: throw exception on 400 Bad request answer ### IMAP: - IMAP: fix 3426383, implement CHARSET in SEARCH command, allow ASCII and UTF-8 - IMAP: fix 3353862, long file names encoding in BODYSTRUCTURE ### SMTP: - SMTP: adjust workaround for misconfigured Exchange server that return 406 Not Acceptable on draft message creation, look inside multipart messages ## DavMail 3.9.5 2011-10-03 Bugfix release to avoid Growl plugin crash on OSX, make DavMail work with both Snow Leopard and Lion. Also includes DIGEST-MD5 implementation for OSX Lion Directory Utility support, however iCal attendee completion is still broken. ### OSX: - Fix crash in Growl plugin on OSX: do not sent SSL content to Growl ### EWS: - EWS: rebuild broken message (null MimeContent) from properties - EWS: improve error logging on invalid character - EWS: fix tasks field order, send Extended Properties first to match EWS schema - EWS: replace extension before looking for items in task folder - EWS: Fix 3407395, do not set mailbox on FolderIds returned by Exchange ### LDAP: - LDAP: fix DIGEST-MD5 authentication and adjust dn context for OSX Lion, still experimental - LDAP: fix DIGEST-MD5 SASL authentication for OSX Lion - LDAP: experimental SASL DIGEST-MD5 implementation for OSX Lion Directory Utility support ### Caldav: - Caldav: need to send principal-URL on principal path, only for OSX Lion - Caldav: allow direct access to task folder ### Enhancements: - Force toFront and requestFocus to bring windows to front - Additional proxy selector logging - Fixes from audit - Upgrade Log4J to 1.2.16 ## Documentation: - Doc: Add saveInSent reference in FAQ ## DavMail 3.9.4 2011-09-13 First release with full Exchange tasks (VTODO) support, automatically convert VTODOs to tasks inside default task folder. Also includes many bugfixes on iCal OSX Snow Leopard support (note: need to recreate the calendar to fix sync), mixed Exchange 2010/2003 architecture support and IMAP DRAFT and UNDRAFT search condition support ### Caldav: - Caldav: fix regression - Caldav: implement update folder - Caldav: fix regression on Snow Leopard - Caldav: more general fix for misconfigured Exchange server, replace host name in url also over Caldav - Caldav: additional fix for CRLF in urlcompname - Caldav: additional task fields over EWS and fix urlcompname decoding - Caldav: implement task categories over EWS - Caldav: update additional MAPI properties for tasks - Caldav: implement startdate and duedate on tasks - Caldav: implement task categories - Caldav: Need to encode % in urlcompname - Caldav: implement task percent complete and status over WebDav - Caldav: improve task support over WebDav, rename .ics to .EML and implement priority (importance) - Caldav: do not try to get ICS content from tasks - Caldav: encode @ in path only for iCal 5 (OSX Lion) - Caldav: implement supported-report-set ### Enhancements: - Do not always log stacktrace in handleNetworkDown - Fix IllegalArgumentException in fixClientHost when scheme is null - Temporary fix: log exception stack trace in handleNetworkDown - Temporary fix: log exception in handleNetworkDown - Another init script - Small failover fix - Improve client host update fix - Test various event count ### IMAP: - IMAP: implement DRAFT and UNDRAFT search conditions, fix 3396248 - IMAP: fix failover for misconfigured Exchange server, replace host name in url - IMAP: fix regression in EwsExchangeSession.createMessage - IMAP: Fix 3383832, set ItemClass to send read receipt over EWS to avoid ErrorObjectTypeChanged ### EWS: - EWS: Allow null value in StringUtil.decodeUrlcompname - EWS: use isrecurring with Exchange 2010 and instancetype with Exchange 2007 - EWS: revert 3317867 XML1.1 header workaround to fix 3385308 ### DAV: - Dav: check checkPublicFolder calls - Dav: Avoid returning null in getCmdBasePath ### Documentation: - Doc: fix OSX iCal setup documentation for OSX Lion ### LDAP: - LDAP: send error on DIGEST-MD5 bind request ## DavMail 3.9.3 2011-07-31 New release with improved iCal 5 (OSX Lion) support, partial VTODO conversion to Outlook tasks and many other bugfixes including event move item url encoding and event filter over EWS fix ### Caldav: - Caldav: new fix for @ encoding - Caldav: fix regression, do not encode @ in calendar-user-address-set - Caldav: fix principal-URL response - Caldav: encode @ in current-user-principal - Caldav: force @ encode to %40 for iCal 5 - Caldav: new CRLF in urlcompname patch for EWS, use _x000D__x000A_ as encoded value - Caldav: implement merged folder ctag over WebDav - Caldav: fix noneMatch handling over WebDav - Caldav: implement tasks delete over WebDav - Caldav: implement tasks support over WebDav - Caldav: send principal-URL for OSX Lion - Caldav: first duedate implementation on tasks, fix delete task and concat ctag to detect changes on both calendar and tasks folders - Caldav: implement percent complete and status VTODO updates - Caldav: implement task support over EWS - Caldav: decode destination path on move - Caldav: encode LF to %0A in urlcompname - Caldav: check Depth before search - Caldav: Task folder flag - Caldav: move remove quotes for Evolution to EWS mode only - Caldav: fix regression on iCal FreeBusy handling - Caldav: implement PROPFIND on single item - Caldav: remove quotes on etag for Evolution - Caldav: first Task (VTODO) implementation step - Caldav: allow infinity as Depth value ### Enhancements: - Fix DoubleDotInputStream - Improve system proxies and move item logging - Refactor buildSessionInfo to use /public first and mailbox path as failover for galfind requests - Fix bug in removeQuotes - Fix 3315942, patch cleanup - Fix server certificate label - Fixes from audit - Upgrade SWT to 3.7 - Fix 3315942, merge patch provided by Jeremiah Albrant: Ask user to select client certificate - Improve message download progress logging, switch icon every 100KB - Remove unused SwtAwtEventQueue class - Implement davmail.smtpSaveInSent option and reorganize tabs - Fix 3153691: Username with apostrophe - Patch by Manuel Barkhau: exclude private events flag - Reformat and fixes from audit ### EWS: - EWS: new recurring event filter implementation, exclude recurrence exception in results - EWS: fix new Exchange 2010 ItemId length support - EWS: Fix for some Exchange 2010 ItemIds different length - EWS: workaround for Exchange bug, replace xml 1.0 header with xml 1.1 and log message download progress - EWS: implement gzip encoding on response ### DAV: - Dav: update httpClient host after login ### IMAP: - IMAP: need to include base folder in recursive search, except on root - IMAP: Fix 3151800, force UTF-8 in appendEnvelopeHeaderValue ### Documentation: - Doc: Add davmail.smtpSaveInSent description in doc ## DavMail 3.9.2 2011-06-07 This release includes some documentation updates, implement IMAP Recent flag, Caldav support enhancements, 64 bits wrapper on windows, hanging issue with SWT on Linux 64 and many other bugfixes. ### LDAP: - LDAP: cancel search threads on connection close ### Enhancements: - Adjust system proxy log statement - Jsmooth patch with 64 bits skeletons - Additional statement on proxy load - SWT: register error handler early - Serialize session creation in workstation mode to avoid multiple OTP requests - SWT: register error handler to avoid application crash on concurrent X access from SWT and AWT - Revert LookAndFeel changes, switch to System.setProperty to set default LAF - SWT: make sure we don't start AWT threads too early - Update Jsmooth patch with 64bits exe support - SWT: delayed AWT frames creation to reduce memory usage - Experimental 64 bits windows exe - Add a log file size field in UI ### DAV: - Dav: back to old path in Destination header behavior - DAV: switch icon on large message download - Dav: Log message download progress - Dav: new patch to reset session timeout with a GET method on /owa/ - Dav: experimental, try to reset session timeout with a GET method - Dav: do not try property update failover on 507 SC_INSUFFICIENT_STORAGE ### OSX: - OSX: Avoid sending empty message to Growl ### IMAP: - IMAP: test custom header search - IMAP: workaround for Exchange 2003 search deleted support - IMAP: fix 3303767, do not send line count for non text bodyparts - IMAP: another fix for 3297849, ENVELOPE formating error/bogus quotes - IMAP: fix 3297849, ENVELOPE formating error/bogus quotes - IMAP: Fix nullpointer in broken message handling - IMAP: fix infinite loop detection - IMAP: detect infinite loop on the client side - IMAP: implement Recent flag on new messages based on read flag and creation/modification date - IMAP: fix 3223513 default flags on append ### Documentation: - Doc: How to run multiple instances of DavMail - Doc: FAQ note, iCal does not support folder names with spaces or special characters - Doc: Add reference to default windows domain setting in FAQ - Doc: additional Thunderbird and DavMail review - Doc: add Duplicate messages in Sent folder FAQ entry - Doc: add Piwik code to DavMail site - Doc: New (french) review - Doc: document custom certificate authority handling - Doc: improve initial setup documentation - Doc: describe the usual paths to use in OWA url field - Doc: update imapAutoExpunge flag doc - Doc: update roadmap - Doc: document public folder access in Lightning ### Caldav: - Caldav: allow tab as folding character, see RFC2445 - Caldav: Fix NullPointerException in getTimezoneIdFromExchange - Caldav: instancetype is null on Exchange 2010, switch to isrecurring in EWS FindItem - Caldav: Disable schedule-inbox for all Lightning versions - Caldav: prepare xmoz custom property support over DAV ### EWS: - EWS: fix UID and RECURRENCE-ID, broken at least on Exchange 2007 with recurring events - EWS: fix 3105534 GetUserAvailability default timezone compatibility with Exchange 2010 - EWS: new failovers on Timezone settings: use davmail.timezoneId setting or default to GMT Standard Time ## DavMail 3.9.1 2011-03-22 Another bugfix release, mainly on EWS Caldav support (fix 404 not found). Also implemented Microsoft Forefront Unified Access Gateway support. ### Documentation: - Doc: additional FAQ entry on shared calendars ### Caldav: - Caldav: first check that email address is valid to avoid InvalidSmtpAddress error on FreeBusy request and new timezone name mapping - Caldav: New fix for fix 3190219, regression on quote encoding since 3165749 fix - Caldav: rethrow SocketException to avoid event not available on client connection close or DavMail listener restart - Caldav: Fix timezone name - Caldav: fix 3190219, regression on quote encoding since 3165749 fix ## Exchange Web Services: - EWS: fix 3190774, LDAP galfind email address handling, use Mailbox value instead of EmailAddress1/2/3 - EWS: fix NullPointerException in item getContent - EWS: fix 404 not found with Exchange 2010 calendars ## Enhancements: - Convert shell script to unix LF - Implement Microsoft Forefront Unified Access Gateway logon form compatibility ### IMAP: - IMAP: fix 3201374 envelope superflous space - IMAP: fix LOGOUT implementation to improve SquirrelMail compatibility ### OSX: - OSX: Avoid sending null message to Growl ## DavMail 3.9.0 2011-02-22 Making progress towards 4.0 and full EWS support, some issues remaining on recurring events. This is mainly a bugfix release, with some Caldav enhancements, huge memory usage fix on IMAP and a workaround for Linux 64 bits futex issue (deadlock on first connection). ### POP: - POP: test new double dot implementation - POP: Fix from Stefan Guggisberg, handle invalid CR or LF line feeds in DoubleDotOutputStream ### Caldav: - Caldav: additional timezone names in table - Caldav: 3132513, implement well-known url, see http://tools.ietf.org/html/draft-daboo-srv-caldav-10 - Caldav: implement a new setting to disable task (VTODO) support: davmail.caldavDisableTasks and probably exclude most broken events - Caldav: throw exception on empty event body (EWS) - Caldav: fix multivalued param support in VProperty and always quote CN values ### Documentation: - Doc: Update release guide - Doc: Additional FAQ entry on public calendar access with iCal - Doc: Add Manchester wiki review ### LDAP: - LDAP: dump BER content on error - LDAP: fix 3166460, do not fail on NOT (0xa2) filter ### Bugfix: - New workaround for bug 3168560, load system proxy settings in static block - Fix 3161913 klauncher says davmail.desktop misses trailing semicolon - Restore stax-api jar for Java 1.5 compatibility - Fix 3150426 huge memory usage with IMAP - Workaround for bug 3168560, synchronize system proxy access - New NTLMv2 patch: provide fake workstation name and adjust Type3 message flags ### EWS: - EWS: Fix 3165749, exception with quotes in meeting subject and EWS ### Webdav: - Dav: log search response count ## DavMail 3.8.8 2011-01-11 Yet another bugfix release with many EWS support enhancements and fixes, many documentation improvements (still need to update Thunderbird/OSX instructions to latest versions though). ### Documentation: - Doc: change Maven site plugin version - Doc: additional external links - Doc: Add anew reviews page - Doc: Update POM and release guide - Doc: move advanced settings to a separate page to keep getting started page simple - Doc: add SWT bug reference to FAQ, on Ubuntu, notify text conflicts with default theme - Doc: full iPhone setup instructions - Doc: update war deployment description - Doc: Additional smartcard PKCS11 setup instructions with NSS and Coolkey examples ### Caldav: - Caldav: Additional timezone mappings - Caldav: workaround for Exchange 2010 bug, \n in timezone name generates invalid ICS content - Caldav: improve timezone rename error message - Caldav: fix floating timezone in iCal: rename TZID for maximum iCal/iPhone compatibility - Do not send Exchange 2003 appointment creation request to Exchange 2007 ### EWS: - EWS: return HttpNotFoundException on event not found to trigger Lightning workaround - EWS: fix instancetype field definition: Integer instead of String (fix Caldav filter over EWS) - EWS: improved email/alias failover fix - EWS: fix regression in comment - EWS: additional failover mail build on logon form failure - EWS: store X-MOZ-SEND-INVITATIONS property to fix no notification issue with Lightning - EWS: fix Caldav inbox handling over EWS - EWS: improve timezone handling - EWS: Update Field list - EWS: fix 3098008, implement result paging to handle message folders with more than 1000 messages - EWS: exclude non message types from searchMessages - EWS: fix email mapping on LDAP response - EWS: add BusinessCountryOrRegion contact field ### Enhancements: - Additional session create log statement - New multiple user fields implementation: expect userid|username as login value - Improve connection pool handling: do not pool simple checkConfig and getVersion connections. - Implement OTP form with multiple username fields (username and userid) - Contribution from Geert Stappers: start/stop script - Improve NTLM authentication detection - Always use private connection manager to avoid session conflict - Fixes from audit - Update javamail to 1.4.3 - Adjust Mime decoder settings (fix) - Adjust Mime decoder settings - Workaround for space in cookie name - Use a_sLgnQS instead of a_sLgn first to support new OWA 8.3.83.4 - Additional NTLM flags to match Firefox flags - Add UTF-7 support with jcharset - Failover for misconfigured Exchange server, replace host name in url ### SMTP: - SMTP: fix 3132569, always remove From header to avoid 403 error on send - SMTP: workaround for misconfigured Exchange servers: failover on Draft message creation through properties. Warning: attachments are lost ### IMAP: - IMAP: Fix 3137275 Imap header fetch bug ### WebDav: - Dav: make sure Destination contains full url and not only path, may fix SMTP send and IMAP copyMessage on Exchange 2003 ### Carddav - Carddav: Update contact test ## DavMail 3.8.7 2010-11-24 Bugfix and performance release with new Woodstox parser to reduce memory footprint in EWS mode, more Caldav broken events fixes and IMAP regression fixes. ### Documentation: - Doc: Update Carddav setup doc - Doc: ssl setup doc update from kerstkonijn ### Enhancements: - Unzip contribs content - Update rpm ant task parameters to create valid rpm package - Workaround for malformed cookies with space in name - From Geert Stappers: add includeantruntime="false" to avoid ant 1.8 warning - Workaround for invalid redirect location - Improve error handling: detect redirect to reason=0 as session expired - Suggestion from Geert Stappers: add svn:ignore property - RPM spec from Marko Myllynen ### Caldav: - Caldav: Fix timezone support with Exchange 2010 SP1 - Caldav: use rebuild event from MAPI properties failover in all error cases - Caldav: add requestFocus() to bring notification dialog to foreground - Caldav: added edit notifications checkbox in settings frame ### IMAP: - IMAP: include current folder in recursive search - IMAP: encode source path in copyMessage - IMAP: new test case to show Thunderbird perf issue - IMAP: Fix 3109303 Handle null string during mail fetch - IMAP: fix nullpointerException in header fetch - IMAP: fix 3106803, IMAP client stuck scanning Inbox, fix header and body fetch in same request - IMAP: throw error on 440 Login Timeout to avoid message corruption ### LDAP: - LDAP: do not log error on OSX groups request ### EWS: - EWS: Upgrade woodstox version to use enhanced base64 conversion (reduced memory usage) - EWS: allow autodiscover after authentication failure - EWS: fix contact email update ### OSX: - OSX: search and replace on existing file, spotted by Geert Stappers ## DavMail 3.8.6 2010-11-07 First release with automatic EWS mode detection, also includes many bugfixes on LDAP support over EWS, IMAP enhancements, Exchange 2010 SP1 cookie bug workaround and a brand new UI frame to let users edit Caldav notifications. ### LDAP: - LDAP: fix galfind search: add uid in response and use cn in fullsearch filter - LDAP: additional EWS attributes - LDAP: additional attributes for iPad ### Enhancements: - Fix 3103349: Cannot login if display name contains [brackets], regression after first patch - Fix 3103349: Cannot login if display name contains [brackets] - configFilePath is null in some test cases - Added passcode as token field for RSA support - Add DavMail version in welcome IMAP and SMTP header - Update test case - Handle exceptions on invalid UTF-8 characters or unexpected content triggered by XmlStreamReader.getElementText (based on patch 3081264) - Add exchange 2010 PBack cookie in compatibility mode - Novell iChain workaround ### POP: - POP: add version in welcome banner ### Caldav: - Caldav: Fix bug in Dav mode with broken events dtstart -> dtend - Caldav: fix french notification message - Caldav: protect ':' in VCALENDAR property params - Caldav: initial edit notification implementation - Caldav: Create fake DTEND on broken event - Caldav: fix nullpointer in VCalendar on missing DTEND - Caldav: implement main calendar folder rename - Caldav: use i18n calendar name as display name for iCal - Caldav: avoid renaming default calendar to null ### EWS: - Ews: improve ResolveNames implementation, parse addresses and phone attributes - EWS: implement failover on OWA authentication failure (e.g. with outlook.com) - Ews: improve invalid item in calendar error handling - EWS: improve resolveNames logging - EWS: add enableEws flag in UI settings frame - EWS: automatically detect Webdav not available and set davmail.enableEws flag ### IMAP: - IMAP: failover in message copy on 404 not found - IMAP: Fix append with no optional parameters - IMAP: additional test cases - IMAP: fix from kolos_dm: implement fake line count in BODYSTRUCTURE and [] block in IMAPTokenizer - IMAP: fix from kolos_dm: implement attachment name in BODYSTRUCTURE - IMAP: improve logging, do not log message content on 404 or 403 - IMAP: fix from kolos_dm: In-Reply-To is not email header and unfold header to remove CRLF in ENVELOPE response - IMAP: merge fix from Kolos, search command with message sequence set - IMAP: implement index (non uid) COPY - IMAP: workaround for broken message (500 error), rebuild mime message from properties - IMAP: send error on idle command without selected folder (Outlook) ### Documentation: - Doc: fixes and updates on ssl setup and build - Doc: update roadmap - Doc: Update architecture image - Doc: update ssl server certificate doc - Doc: Document PKCS12 self signed certificate creation to enable SSL in DavMail - Doc: iPhone screenshots ### SWT: - SWT: Custom AWT event queue to trap X errors and avoid application crash - SWT:enable debug mode ## DavMail 3.8.5 2010-09-27 Includes much progress on Caldav over EWS support, a few regression fixes and improved IMAP BODYSTRUCTURE implementation for complex messages. ### Bugfixes: - Fix regression in Exchange 2007 over Dav session ### Enhancements: - Detect and submit language selection automatically - More fixes from audit - Fixes from audit - Restore cookies on error - Improve buildSessionInfo failover - Fix ssl trustmanager error handling - Enable Webdav/Galfind failover on Exchange 2007 - Workaround for basic authentication on /exchange and form based authentication at /owa ### Caldav: - Caldav: detect invalid events with empty dtstart property - Caldav: implement mozilla alarm flags X-MOZ-LASTACK and X-MOZ-SNOOZE-TIME over EWS - Caldav: EWS, rebuild attendee list from properties - Caldav: test principal request - Caldav: fix 3067915 getRangeCondition too restrictive - Caldav: implememnt Busy flag over EWS and refactor create code - Caldav: fix create allday event over EWS and check if current user is organizer - Caldav: Fixed regression in allday event handling - Caldav: improve EWS implementation - Caldav: improve timezone error handling - Caldav: remove empty properties - Caldav: avoid invalid X-CALENDARSERVER-ACCESS and CLASS - Caldav: avoid empty X-CALENDARSERVER-ACCESS and CLASS - Caldav: reinsert the deleteBroken check - Caldav: fix VProperty parser - Caldav: additional VCalendar properties for rebuilt item: VALARM (reminder) - Caldav: additional VCalendar properties for rebuilt item: RRULE, EXDATE, CLASS - Caldav: failover for broken event, rebuild VCalendar content from raw properties - Caldav: fix 3063407, regression in sendPrincipal ### Carddav: - Carddav: fix null value in email address - Carddav: fix email address handling over EWS ### Exchange Web Services: - EWS: fix 3047563 double inbox - EWS: more caldav ews fixes ### SMTP: - SMTP: rewrite getAllRecipients to disable strict header check - SMTP: new try at encoding fix: set mailOverrideFormat and messageFormat ### Documentation: - Upgrade maven site-plugin and update release guide ### IMAP: - IMAP: fix 3072497 Imap server too picky about case - IMAP: improve BODYSTRUCTURE implementation, make it recursive - IMAP: implement partial header fetch ### LDAP: - LDAP: new attribute mapping - LDAP: cache current hostname value in sendComputerContext to improve iCal address completion performance - LDAP: additional ignore attributes - LDAP: add gidnumber to attribute ignore list - LDAP: fix regression on iCal 3 search completion ### SWT: - SWT: allow libswt-gtk-3.6-java on debian, available from ppa:aelmahmoudy/ppa ## DavMail 3.8.4 2010-09-08 Yet another bugfix release with more regressions fixes on SMTP, a few LDAP fixes and a caldav timezone update. ### Documentation: - Doc: Update release guide - Doc: Update swt version in maven pom ### SMTP: - SMTP: try to force IMS encoding mode according to message contenttype - SMTP: switching back to Draft then send mode over DAV for calendar messages - SMTP: switching back to Draft then send mode over DAV - SMTP: new duplicate message-id detection implementation, no need to search Sent folder ## LDAP: - LDAP: improve EWS filter support - LDAP: another gallookup detection fix to improve address completion in thunderbird ### Carddav: - Carddav: improve OSX client detection ## Enhancements: - Fixes from audit ### Caldav: - Caldav: accept login as alias in caldav principals path - Caldav: basic move item implementation - Caldav: adjust Lightning bug workaround - Caldav: yet another timezone fix, adjust Outlook created event time before allday conversion - Caldav: fix regression on meeting response subject ## DavMail 3.8.3 2010-09-02 Another bugfix release with major regressions fixed: missing calendar meeting messages and delivery status notification on some external addresses. Also includes improved autodiscover support. ### Enhancements: - Disable broken rpm generation - Fix test cases - Upgrade swt to 3.6 - workaround for TLS Renegotiation issue, see http://java.sun.com/javase/javaseforbusiness/docs/TLSReadme.html - Switch back to StreamReader.next instead of nextTag - Fix autodiscover support - Merge patch 3053324: Implement per service SSL flag (patch provided by scairt) - Fix XMLStreamUtil regression - Refactor XMLStreamUtil ### Exchange Web Services: - EWS: improve autodiscover implementation - EWS: fix possible NullPonterException - EWS: implement autodiscover to find actual EWS endpoint url ### Caldav: - Caldav: extend Lightning broken tests to all 1.* versions - Caldav: switch back to contentclass to get calendarmessages over webdav - Caldav : revert previous changes and fix meeting cancel support (IPM.Schedule.Meeting.Canceled) - Caldav: move to trash on processItem - Caldav: fix request parser regression on nextTag - Caldav: improve filter handling, support VTODO/VEVENT comp-filter - Caldav: make timezone name retrieval more robust ### SMTP: - SMTP: make duplicates check optional with davmail.smtpCheckDuplicates setting - SMTP: always remove From header with Exchange 2007 and 2010 - SMTP: Improve message on MAIL FROM without authentication - SMTP: experimental, advertise 8BITMIME ### IMAP: - IMAP: implement shared mailbox access ### Documentation: - minor doc fix - Doc: Additional Exchange Webdav setup documentation - Add ohloh widget on home page - Doc: a few doc fixes and update roadmap ## DavMail 3.8.2 2010-08-25 Bugfix release with improved Exchange 2010 IMAP support, CardDav fixes and improved error handling ### Enhancements: - Disable SWT on Java 7 - Update debian package description and categories - fix 2995990: Add support for already authenticated users - Fix missing hide password in log over IMAP - More session creation enhancements, fix public folder test when /public is 403 - Refactor email and alias retrieval: always use options page with Exchange 2007 - Improve socket closed error handling - Try default form url on authentication form not found - Add Java Service Wrapper contribution from Dustin Hawkins ### Caldav: - Caldav: move delete broken event logic to DavExchangeSession - Caldav: delete broken events when davmail.deleteBroken is true - Caldav: improve event logging, include subject ### IMAP: - IMAP: handle 507 InsufficientStorage error - IMAP: fix regression in NOT DELETED filter ### Documentation: - Doc: Update OSX directory setup documentation ### DAV: - DAV: Encode apos in urlcompname used in DAV search request ### EWS: - EWS: fix single message in folder with Exchange 2010 bug - EWS: implement loadVTimezone for Exchange 2010 ### SMTP: - SMTP: fix regression on bcc handling - SMTP: convert Resent- headers, see 3019708 ### LDAP: - LDAP: avoid galLookup in iCal searches ### Carddav: - Carddav: Fix email update over EWS ## DavMail 3.8.1 2010-08-18 Includes a full refactoring of Vcalendar content handling, much progress on Exchange Web Services support, LDAP optimizations and many other bufixes. ### Exchange Web Services: - EWS: hard method: delete/create on update - EWS: Fix DeleteItem for CalendarItem - EWS: implement loadVtimezone, get user timezone id from OWA settings - EWS: Fix FieldURIOrConstant test - EWS: separate domain from userName in NTLM mode - EWS: MultiCondition galFind - EWS: implement basic galFind search - EWS: implement resolvenames response parsing - EWS: fix subfolder search on Exchange 2010 - EWS: implement user availability (freebusy) and shared folder access - EWS: implement sendEvent - EWS: force urlcompname only on create - EWS: implement ResolveNames method - EWS: Apply workaround to events - EWS: workaround for missing urlcompname on Exchange 2010, use encoded ItemId instead - EWS: rename equals to isEqualTo and format search date - EWS: dynamic version detection - EWS: Exchange 2010 message handling - EWS: Exchange 2010 folder handling - EWS: Exchange 2010 compatibility: add test cookie, access /ews/exchange.asmx endpoint ### Caldav: - Caldav: Fix missing TZID in DTSTART from iPhone - Caldav: return reoccuring events on time-range request - Caldav: Fix METHOD on create from iPhone - Caldav: need to encode colon (:) in urlcompname search, implement a last failover on item search - Caldav: implement 2899430, change the subject line when replying to invites - Caldav: workaround for Lightning 1.0b2 bug - Caldav: disable caldav inbox with Lightning 1.0b2 - Caldav: fix regression in fixVCalendar (missing organizer) - Caldav: skip empty lines - Caldav: Fix regressions in Vcalendar handling - Caldav: fix nullpointer in VCalendar - Caldav: fix regressions and do not filter on outlookmessageclass - Caldav: major refactoring of event content handling and notifications - Caldav: switch to new VCalendar parser/patcher - Caldav: implement VALARM in VCalendar - Caldav: more vcalendar patches - Caldav: start new VCalendar fixICS implementation - Caldav: call fixICS on download - Caldav: reenable Lightning 1.0b2 bug workaround - Caldav: failover for 404 not found on items containing '+' in url, search item by urlcompname to get permanenturl ### LDAP: - LDAP: create a separate thread only for person/contact searches - LDAP: implement galFind MultiCondition over webdav and improve search by mail - LDAP: need to galLookup when search attribute is not in galfind result - LDAP: another search attribute mapping fix - LDAP: code cleanup and some galfind search fixes - LDAP: fix 3043659, include entries starting with Z - LDAP: Improve sizeLimit handling and ignore attributes - LDAP: a few more attribute fixes - LDAP: move galLookup to DavExchangeSession - LDAP: progress on EWS LDAP implementation and refactoring - LDAP: fix regression on OSX directory request on iCal start: filter invalid imapUid condition - LDAP: use sizeLimit in contactFind - LDAP: Fix OSX directory search on uid ### Enhancements: - Improve error handling - Add custom cookie policy to support extended host name - Fixes from audit ### Bugfixes: - Fix regression in getAliasFromMailboxDisplayName - Deb: Fix regression in debian desktop link ### DAV: - Dav: disable galFind on error ### SMTP: - SMTP: compare actual email address, not email with alias - SMTP: no need to remove From header with new sendMessage implementation ### SWT: - SWT: fix 2992428, hide instead of dispose on close ### Carddav: - Carddav: refactor VCard handling to merge with VCalendar code - Carddav: disable contact picture handling on Exchange 2007 - Carddav: implement range search ## DavMail 3.8.0b2 2010-07-26 Fixes the most obvious regressions in 3.8.0b1 and some documentation updates on Carddav. Note for EWS only users: add davmail.enableEws=true in davmail.properties ### Caldav: Caldav: fix sendEvent regression, conflict on outbox notifications Caldav: improve HttpNotFound message Caldav: Refactor getItem Caldav: fix MKCALENDAR http status code: return 201 instead of 207 Caldav: Another request parsing bug: handle empty elements Caldav: fix regression in REPORT requests parsing ### Carddav: Carddav: additional TEL properties Carddav: add fburl field ### Documentation Doc: fix carddav thunderbird doc Doc: update left menu Doc: set source encoding to UTF-8 in maven pom Doc: update roadmap Doc: Basic OSX setup instructions Doc: thunderbird carddav setup with SOGO connector Doc: Update homepage and project description ## DavMail 3.8.0b1 2010-07-25 First public release after major refactoring to implement Exchange 2010 and Exchange 2007 without Webdav support. This implementation is based on Exchange Web Services. EWS support is not yet complete: global address list search and free/busy support is missing. This release includes the new Carddav service sponsored by French Defense / DGA through project Trustedbird. OSX notifications will now use Growl if available. ### Carddav: - Carddav: another urlcompname encoding fix - Carddav: generate OSX compatible VCARD photo and change addressbook-home-set with OSX Address Book - Carddav: use new ExchangePropPatchMethod in full contact create/update - CardDav: use new ExchangePropPatchMethod to create haspicture boolean property - Carddav: improve error logging on photo update failure - Carddav: use email1 as default email on update - Carddav: fix multiple mail MAPI properties handling - Carddav: fix GET request on folder support for SOGO - Carddav: encode contact picture url - Carddav: return 404 not found on missing folder - Carddav: fix line folding in generated VCARD - Carddav: Fix regression in single value multiline properties - Carddav: add gender property - Carddav: adjust bday to timezone - Carddav: another anniversary property candidate - Carddav: Add Anniversary support - Carddav: Fix bday generation - Carddav: fix iPhone BDAY parser - Carddav: adjust fields accepting multiple values - Carddav: fix semicolon encoding in compound value - Carddav: workaround for iPhone categories encoding - CardDav: do not encode simple (not compound) properties - Carddav: fix regression in VCardWriter - Carddav: always encode values - Carddav: protect semicolon - Carddav: iPhone personalHomePage support - Carddav: ignore key prefix in VCARD - Carddav: resize contact picture - Carddav: Fix lower case param names - Carddav: add contact create or update log statement - Carddav: handle param values as parameter list - Carddav: encode photo href - Carddav: fix regression on VCARD photo detection - Carddav: use urlcompname value instead of path to get contact details - Carddav: fix case insensitive param values - Carddav: add haspicture to test case - Carddav: Implement picture delete and private flag over EWS - Carddav: handle picture delete - Carddav: fix boolean field handling - Carddav: Remove missing properties on update - Carddav: implement CLASS (private) flag - Carddav: convert image to jpeg over EWS - Carddav: implement photo update over WebDav - Carddav: implement photo handling over EWS - Carddav: implement categories support in EWS mode - Carddav: implement categories - Carddav: get SMTP email address - Carddav: move value decoding back to VCardReader - Carddav: decode multiline values - Carddav: encode comma and \n in values - CardDav: make getContactPhoto more robust - Carddav: iPhone iOS4 compatibility - Carddav: implement contact photo support (readonly) - Carddav: implement quoted param value support - Carddav: bday, assistant, manager and spouse properties - Carddav: other address and homeposteofficebox properties - Carddav: instant messaging and role properties - Carddav: more properties - Carddav: Implement phone, address and email properties - Carddav: handle multiple values on a single line and add new properties - CardDav: fix contact folder path handling and add create contact unit test - Carddav: refactor Contact creation and create VCardReader - CardDav: move Contact getBody to ExchangeSession and add more attributes support - CardDav: map contact fields - CardDav: improve automatic address book setup for OSX - CardDav: implement OSX AddressBook requests: current-user-privilege-set property, current-user-principal on root request, addressbook-home-set on principal request, addressbook-multiget REPORT request with address-data response, urn:ietf:params:xml:ns:carddav namespace ### Enhancement: - Disable preemptive authentication when adding NTLM scheme - Fixes from audit - Force log file encoding to UTF-8 - Add new davmail.logFileSize setting - Use linux friendly path separator in jsmooth config files - Fixes from audit - Major refactoring: use straight inpustream instead of reader everywhere - Disable ConsoleAppender in gui mode - Add missing Junit jar - Cleanup: System.setProperty of httpclient.useragent no longer needed - Improve item not found logging - Log gateway stop at info level - Improve empty keystore password handling to avoid NullPointerException - Fix 2999717 redirect console to /dev/null in desktop file ### Exchange Web Services: - EWS: fix urlcompname encoding issues - EWS: fix folder name ampersand encoding issue - EWS: return 403 forbidden on ErrorAccessDenied - EWS: xml encode values - EWS: use UTF-8 to decode request on error - EWS: send extended properties first on update - EWS: format datereceived date - EWS: fix bug in UnindexedFieldURI - EWS: update createMessage bcc handling to match sendMessage - EWS: implement bcc support in sendMessage - EWS: implement send message (SMTP) - EWS: fixes from audit - EWS: fix CalendarItem creation, no need to wrap ics in a MIME message - EWS: implement calendar event create or update, processed field, subfolder path handling - EWS: fix internaldate conversion - EWS: convert read flag to boolean and noneMatch/etag to detect create or update on items - EWS: use UnindexedFieldURI for read flag - EWS: fixes for Caldav and Carddav compatibility - EWS: fix folder id regression - EWS: fix country contact property mapping - EWS: implement getItem and various contact handling fixes - EWS: map all contact properties - EWS: implement more contact and event methods - EWS: implement copy method - EWS: datereceived flag support - EWS: handle bcc field - EWS: various flag handling fixes, implement message delete - EWS: implement getContent - EWS: fix iconIndex flag property - EWS: implement create and update message - EWS: fix single value in MultiCondition handling - EWS: rely on uid (PR_SEARCH_KEY) instead of permanentUrl to detect imap uid changes - EWS: implement searchMessages - EWS: fix bug in MultiCondition search - EWS: fix from audit - EWS: implement folder handling, including the new MoveFolderMethod - EWS: move mailbox folder urls to DavExchangeSession - EWS: use searchContacts in contactFind - EWS: fix regression in deleted flag handling - EWS: refactor contactFind, use new Condition API - EWS: still more WebDav code to DavExchangeSession - EWS: move more WebDav code to DavExchangeSession - EWS: Various fixes after refactoring on DASL request generation - EWS: in progress refactoring of contacts and events handling - EWS: implement folder ctag, remove deprecated foldername property - EWS: move WebDav message write and delete to DavExchangeSession - EWS: move WebDav code to DavExchangeSession - EWS: refactor IMAP search, use Conditions classes instead of string search filder - EWS: Use int values to create ExtendedFieldURI propertyTags - EWS: map folder path to and from IMAP - EWS: implement NotCondition and public folder access - EWS: implement IndexedFieldURI and InternetMessageHeader - EWS: refactor search to use classes instead of String filters - EWS: implement MultipleOperandBooleanExpression (And, Or, Not conditions) - EWS: refactor folder search, create abstract getFolder methods - EWS: start ExchangeSession refactoring to extract Dav calls - EWS: refactor options, use enums - EWS: implement basic SearchExpression restriction - EWS: Implement CreateFolder, DeleteFolder and CreateItem, refactor options - EWS: retrieve and decode MIME content - EWS: add standard field additional property, implement IncludeMimeContent in GetItem, add DeleteItemMethod - EWS: Generic item property mapping - EWS: refactor EWS code - EWS: experimental HttpClient based EWS methods ### Caldav: - Caldav: fix time-range filter support in EWS mode - Caldav: move calendar on displayname update - Caldav: partial MKCALENDAR implementation - Caldav: implement time-range request - Caldav: add missing dtstart field - Caldav: improve 404 error handling - Caldav: fix regression in processItem - Caldav: UTF-8 encode report body - Caldav: catch any exception in reportItems - Caldav: Process request before sending response to avoid sending headers twice on error - Caldav: Workaround for Lightning/1.0b2 href encoding bug in REPORT requests - Caldav: move processItem logic back to CaldavConnection - Caldav: Workaround for emClient broken href encoding - Caldav: remove buildCalendarPath method - Caldav: allows mixed case contentType in event MIME message (fix Unable to get event error) - Caldav: fix 3014204 missing timezone - Caldav: fix 2902372 private flag handling undex iCal 4 (OSX 10.6 Snow Leopard) - Caldav: send current-user-principal on principals folder for iCal - Caldav: workaround for iCal bug: do not notify if reply explicitly not requested - Caldav: add CRLF after END:VCALENDAR to comply with RFC - Caldav: fix regression in getItem, allow urn:content-classes:calendarmessage contentClass - Caldav: Fix Carddav etag handling (additional Head request) and implement card delete - Caldav: Implement Carddav create (only a few attributes mapped) - Caldav: Implement basic Carddav search requests ### DAV: - Dav: more property update fixes - Dav: patch filter on invalid Exchange Webdav response - Dav: new ExchangePropPatchMethod to handle custom exchange propertyupdate and invalid response tag names - Dav: refactor getContentReader and fix regression on null date value - Dav: fix nullpointer in DavExchangeSession - Dav: handle null properties with new createMessage - Dav: another datereceived fix - Dav: switch back to DAV:uid, used mainly in POP service (case sensitive) - Dav: fix bug 3022451 in new search filter implementation with empty sub conditions - Dav: Add folder unit tests - Dav: add private and sensitivity fields - Dav: implement timezone mapping for Exchange 2007, should fix the allday issue with Outlook - Dav: use search expression to request ishidden - Dav: fix regression in deleteItem - Dav: fix regression 3020385 on folder handling - Dav: Refactor folder search to use searchItems - Dav: use Email1EmailAddress mapi property to get mail attribute, add uid attribute - Dav: fix from audit - Dav: add unit tests, move buildCalendarPath logic to getFolderPath ## Bug fixes: - Use private MultiThreadedHttpConnectionManager with NTLM to avoid persistent authentication on connection issues - Fix regression in AbstractConnection: return null instead of empty string on closed connection - Fix 3001579: improve NTLM support ### IMAP: - IMAP: add uidNext MAPI property (not available under Exchange 2003) - IMAP: fix deleted flag handling over Webdav - IMAP: fix flag handling in createMessage - IMAP: new seen flag test case - IMAP: fix regression on imap uid restore - IMAP: fix 3023386, support BODY.PEEK[1.MIME] partial fetch - IMAP: new unit tests and fix $Forwarded flag removal - IMAP: implement deleted/undeleted search as condition instead of post filter - IMAP: add IMAP unit test - IMAP: fix 3014787 remove property over WebDav - IMAP: implement last message (simple *) fetch range - IMAP: send required "* SEARCH" on empty search response - IMAP: Add a new hidden davmail.deleteBroken setting to delete broken messages - IMAP: implement a new imapAutoExpunge setting to delete messages immediately over IMAP ### SMTP: - SMTP: send message directly without creating a Draft message to preserve Message-id - SMTP: fix log message - SMTP: fix 3024482, avoid duplicate messages with gmail - SMTP: Fix DoubleDotInputStream pushback size - SMTP: last CRLF is not included in message content ### Documentation: - Doc: javadoc and code cleanup - Doc: fix default domain label - Doc: new FAQ entry on OSX auto start "Login Items" - Doc: typos fixes from Raphael Fairise - Doc: update release guide - Doc: add a new mail.strictly_mime FAQ entry to enable quoted-printable ### POP: - POP: fix regression in TOP command - POP: fix message termination, append CRLF only when necessary - POP: replace deprecated write method, use DoubleDotOutputStream instead - POP: allow space in username ## LDAP: - LDAP: fix contact attributes reverse mapping - LDAP: improve contact attribute mapping and add a few new properties - LDAP: fix attribute map - LDAP: fix regression after EWS refactoring - LDAP: use imap uid as ldap uid - LDAP: use PR_SEARCH_KEY instead of DAV:uid as uid string ### OSX: - Exclude growl from non OSX packages - Fix growl build project name - OSX: implement growl support - include jnilib in OSX package - libgrowl-0.2 with libgrowl.jnilib compiled on OSX Snow Leopard - set libgrowl version to 0.2 - rename generated jar with version, exclude test classes and create Manifest with Michael Stringer author - Improve Growl exception handling, remove System.out and a few fixes from audit - Initial growl import from http://forums.cocoaforge.com/viewtopic.php?f=6&t=17320 ## DavMail 3.6.6 2010-05-04 This release is mainly focused on IMAP enhancements, including IDLE (RFC2177) aka "Push Mail" support and other protocol compliance fixes, particularly on partial fetch. NTLMv2 is also supported thanks to the JCIFS library. ### Documentation: - Doc: update doc and roadmap - Doc: adjust settings message - Doc: improve server/client certificates description - Doc: new FAQ entry on message deleted over IMAP still visible through OWA - Doc: fix maven site generation ### IMAP: - IMAP: send BAD instead of BYE on exception - IMAP: fix 2992976, implement complex index and uid range in SEARCH - IMAP: Handle exception during IDLE - IMAP: add a new setting to enable/disable IDLE - IMAP: use getRawInputStream instead of writeTo to avoid MIME message changes, cache message body in SharedByteArrayInputStream - IMAP: poll folder every 30 seconds in IDLE mode, clear cached message - IMAP: implement IDLE extension (RFC2177) - IMAP: fix 2971184, do not decode content in partial fetch (replace getDataHandler with PartOutputStream) ### Enhancements: - Exclude redline lib from distribution packages - Use https in default Exchange url - Make sure log messages are not localized - Remove unused messageId field - Do not shutdown connection manager on restart - Allow Exchange server to use gzip compression - Sample SocketAppender configuration - Improve NTLM mode detection - JCIFS based NTLMv2 implementation - Hardcode /owa/ path in getAliasFromOptions and getEmailFromOptions for Exchange 2007, improve failure message - Improve xmlEncode, use compiled static patterns ### Caldav: - Caldav: fix 2992811, missing timezones - Caldav: fix 2991030 tasks disappeared - Caldav: add VTODO to supported-calendar-component-set response - Caldav: fix regression in getAllDayLine() - Caldav: make shared calendar test case insensitive - Caldav: 0 or no value in caldavPastDelay means no limit ## DavMail 3.6.5 2010-04-13 This release includes a major refactoring of the IMAP FETCH implementation to improve performance and provide RFC compliant partial fetch. The Carddav support sponsored by french DGA through project TrustedBird is now included in the roadmap. Private events filter on shared calendar is also available and DavMail can now retrieve proxy settings directly from system configuration. ### SMTP: - SMTP: implement AUTH LOGIN username (with optional initial-response, see RFC2554) ### IMAP: - IMAP: Keep a single message in MessageList cache to handle chunked fetch, reenable maxSize in ImapConnection. - IMAP: implement subparts partial fetch - IMAP: Fix message write, double dot only for POP, not IMAP - IMAP: Do not advertise not yet supported custom flags - IMAP: fix from audit - IMAP: major FETCH implementation refactoring, make code simpler and more efficient - IMAP: add BODY.PEEK[index] support - IMAP: improve partial fetch support - IMAP: fix 2962071, quote folder names in STATUS response - IMAP: allow partial part fetch - IMAP: fix regression on unknown parameter handling - IMAP: implement part fetch (BODY[1]) - IMAP: detect unsupported parameter - IMAP: fix 2973213, escape quotes in subject - IMAP: fixes to improve JavaMail support ### Doc: - Doc: move CardDav reference before architecture schema - Doc: update project description in Maven pom and ant package - Doc: update project description and RoadMap, announce CardDav support sponsored by french DGA through project Trustedbird - Doc: update roadmap ### Enhancements: - Add a new setting to disable startup notification window (contribution from jsquyres) - Improve getAliasFromOptions to retrieve alias with custom dn - Workaround for NTLM authentication only on /public - Add a new setting to retrieve proxies from system configuration - Fix empty setting behavior: return null instead of empty string - Sort properties file - Fix new RPM ant task definition - Improve public folder url check - Experimental rpm package build ### Carddav: - Carddav: refactor folder handling code to prepart CardDav support ### Caldav: - Caldav: fix broken inbox, missing instancetype in search request and add is null in search query - Caldav: do not try to access inbox on shared calendar (to avoid 440 login timeout errors and session reset) - Caldav: exclude private events on shared or public calendar PROPFIND - Caldav: fix regression on invalid events handling, just warn on broken events - Caldav: drop timezone when converting allday events to client ## DavMail 3.6.4 2010-02-21 Well, yet another bugfix release, with improved IMAP support, SMTP enhancements to support Eudora, NTLM proxy authentication support and other bug fixes ### SMTP: - SMTP: fix 2953552, allow RSET in AUTHENTICATED state - SMTP: bug id 2953554, implement NOOP ## LDAP: - LDAP: Enable tray icon on LDAP connection ## Bug fixes: - Fix regression in 3.6.3: basic authentication broken in checkConfig - GUI: Fix client certificate setting switch ### Enhancements: - Change debian package dependence to accept openjdk-6-jre and libswt-gtk-3.5-java - Fix from audit - Improve log message on HTTP header error - Implement NTLM HTTP proxy support - Improve logging of expired sessions - Support multiple forms in form based authentication logon page - Catch error on SWT exit - Enable NTLM on Proxy-Authenticate return code with only NTLM available ### Documentation: - Doc: Document davmailservice.exe usage - Doc: Document Force ActiveSync setting in Getting Started - Doc: Add an FAQ entry on DavMail settings location - Doc: Update release notes and guide ### IMAP: - IMAP: new patch from Gellule to fix disappearing messages issue - IMAP: rethrow SocketException after error in handleFetch ### Caldav: - Caldav: new fix for invalid events - Caldav: add a hidden davmail.caldavDisableInbox to allow users to disable Caldav Inbox with Thunderbird 3 and Lightning - Caldav: improve broken events logging - Caldav: Follow redirects on GET with permanentUrl ## DavMail 3.6.3 2010-01-24 Another bugfix release, mostly documentation updates, some regressions in 3.6.2 in error handling fixed, a new IMAP workaround to completely hide the uid change issue, emacs IMAP support and new UI settings for previously hidden parameters. ### Bug fix: - Fix logging settings handling in webapp mode ### Enhancements: - Improve error handling: detect SocketException to avoid client socket closed errors - Implement file based (PKCS12 and JKS) client certificates in addition to smartcard support ### Documentation: - Doc: update roadmap - Doc: remove replace token and search page - Doc: added Gellule as Java Contributor - Doc: add a security section in the FAQ - Doc: update FAQ with Exchange prerequisites details - Document client keystore file settings ### IMAP: - IMAP: brand new IMAP uid workaround and refresh folder on Expunge from Gellule - IMAP: implement LIST "" "*%" for emacs - IMAP: another fix for the message uid bump issue - IMAP: fix 2934922, implement (NOT DELETED) in search filter - IMAP: extend thunderbird changed uid workaround to all contexts ### GUI: - Add new setting davmail.defaultDomain to set default windows domain - Prepare new advanced options ### Caldav: - Caldav: add davmail.forceActiveSyncUpdate option to the settings frame - Caldav: add davmail.caldavAlarmSound option to the settings frame (used to force conversion of Caldav alarms to AUDIO supported by iCal) - Caldav: fix 2884864, send notifications to all participants on CANCEL - Caldav: Fix invalid event handling, exclude events from returned list ### SMTP: - SMTP: implement RSET (reset) command to avoid connection timeout with Evolution ## DavMail 3.6.2 2010-01-11 New bugfix release, with improved OSX tray icon, Kontact support, a new workaround for thunderbird IMAP no message error, public folders on a separate server support, improved ActiveSync support and some documentation enhancements. ### LDAP: - LDAP: fix bug 2919463, escape quotes in search filter - LDAP: fix Kontact ldap filter parsing, allow LDAP_FILTER_PRESENT in subfilter ### Documentation: - Doc: fix script replace - Doc: new download and build pages - Doc: update roadmap - Doc: update doc - Doc: add search icon - Doc: Update roadmap - Doc: Add roadmap to site menu ### IMAP: - IMAP: workaround for thunderbird random issue with no message found, keep previous message list to cope with recent message uid change. - IMAP: try to support public folders hosted on a separate server (302 redirect on PROPFIND) - IMAP: fix date parsing error, see bug 2878289 - IMAP: fix 2878289, implement extended MIME header search in http://schemas.microsoft.com/mapi/string/{00020386-0000-0000-C000-000000000046}/ namespace - IMAP: improve error logging on 500 internal server error - IMAP: Improve error handling, do not fail on message retrieval error, just send error message - IMAP: implement EXPUNGE untagged response on NOOP to avoid NO message not found on Exchange message message uid change - IMAP: implement RFC822.HEADER for Sylpheed ### Caldav: - Caldav: do not send fake inbox for public calendars to iCal - Caldav: id 2900599, implement optional attendees in notifications - Caldav: fix bug 2896135, iCal login fails at iCal startup - Caldav: Send root instead of calendar href as inbox to fix iCal regression - Caldav: Exclude events with a null instancetype and no ICS content - Caldav: Workaround for Lightning 1.0pre public calendar, send calendar href as inbox/outbox urls - Caldav: Convert DISPLAY to AUDIO only if user defined an alarm sound in settings (davmail.caldavAlarmSound) - Caldav: fix NullPointerException in notifications - Caldav: Fix bug 2907350, multiple calendar support issue with iCal - Caldav: another timezone fix - Caldav: Improve error handling on invalid events - Caldav: another timezone fix - Caldav: do not return invalid message content - Caldav: move failover for Exchange 2007 plus encoding issue to Exchange session - Caldav: a brand new ActiveSync fix, set contentclass to make ActiveSync happy, but also set PR_INTERNET_CONTENT to preserve custom properties. Also get etag from updated event. - Caldav: major refactoring, move all ICS methods to Event inner class - Caldav: fix bug 2902358, encode messageUrl in PropPatch with forceActiveSyncUpdate=true - Caldav: improve MIME message headers in createOrUpdateEvent ### Bugfixes: - Fix last open session failover: do not append @hostname when alias contains @ - Revert to message url as default, use permanentUrl as failover - Always use NTCredentials for proxy authorization - Another NTLM fix: activate NTLM only on 401 unauthorized in executeGetMethod ### Enhancements: - Fix from audit (spelling errors) - Add search page and change default package name for default svn builds - Improve message logging - Fixes from audit - Additional Jsmooth settings - Force flags parameter to 4 in Form Based Authentication - Jsmooth patch to allow -X jvm options ### OSX: - OSX: replace inverted active icon - OSX: new Mac OS X only icons ## DavMail 3.6.1 2009-11-24 This is a bugfix release with fixed regressions from 3.6.0 and a few enhancements from user feedback. ### Documentation: - Doc: switch download links to generic link - Doc: Update roadmap - Doc: add roadmap ### Bugfixes: - Fix regression in Form Based Authentication: detect Exchange 2007 UserContext cookie - Host is mandatory for NTLMScheme, get current hostname for proxy authentication ### Enhancements: - Experimental: reactivate NTLM authentication but leave authentication preemptive mode to allow basic authentication. - Move PKCS11 registration to a separate class to avoid ClassNotFoundException - Experimental OTP (token) based authentication - Vista png icons support for JSmooth - Fix from audit - New upload-dist ant task to upload new release files ### Caldav: - Caldav: failover for Exchange 2007 plus encoding issue, search event by displayname to get permanent Url - Caldav: Additional timezones - Caldav: Revert commit 765, VTODO events have a null instancetype - Caldav: additional timezone - Caldav: Remove MAILTO: in addition to mailto: in getFreeBusy - Caldav: Bug 2898469 do not UrlEncode draft url twice to avoid 404 not found on send event message ## DavMail 3.6.0 2009-11-15 This release contains a lot of enhancements, both bug fixes and new features from user feedback on 3.5.0, including improved Evolution LDAP support, LDAP abandon support (faster searches with Evolution and OSX), experimental windows service wrapper, improved form based authentication support and ENVELOPE IMAP command support. I wish to thank Dan Foody for his valuable contributions on OSX Snow Leopard support (attendee completion in iCal and complex LDAP filters handling). Also added an architecture schema on DavMail home page to quickly describe DavMail features. ### LDAP: - LDAP: implement cn=* filter for Evolution - LDAP: run searches in separate threads to implement ABANDON, will make searches faster with some clients (Evolution and OSX address book) - LDAP: implement startsWith on Contact search, only objectclass=* is a full search - LDAP: fix for iCal4 attendee completion, send localhost if current socket is local, else send fully qualified domain name - LDAP: major refactoring from Dan Foody to improve complex filters handling - LDAP: improve contact search, reencode uids to hex to avoid case sensitivity issues ### Documentation: - Doc: Set Dan Foody as main java contributor - Doc: improve DavMail logo - Doc: add new Logo, improve internet explorer compatibility - Doc: Add an architecture schema on site welcome page - Doc: Improve getting started documentation, explain Exchange 2003 and 2007 paths (/exchange/ and /owa/) - Doc: fix site style - Doc: fix maven site title ### SMTP: - SMTP: fix by Marc Macenko, case sensitive RCPT TO: - SMTP: allow lower case commands - SMTP: experimental: remove Content-Type on create message to avoid 406 not acceptable with some Exchange servers. ### Bugfixes: - Fix 2887947: Exchange server with a username hidden field ### Enhancements: - Check for released version in a separate thread and set timeout to ten seconds - Refactor message url encoding - Upgrade Jmooth wrappers, add -Xrs jvm option to davmailservice wrapper to avoid service stop on user session logout (http://sourceforge.net/projects/jsmooth/forums/forum/297041/topic/2370742) - Fix regression from revision 811 - Refactor ExchangeSession, use StringUtil to simplify code - Remove username duplicate check, as formLogin now resets values before POST - Start refactoring: StringUtil class - Fix classpath in jsmooth wrappers to use new javamail - Allow custom form with userid/pw fields in form based authentication - Improve form based authentication, look for Exchange session cookies sessionid and cadata - Fix test - Upgrade JavaMail to 1.4.1 - New create folder method - Fix FBA authentication, reset query string in getAbsoluteURI() - New abstract JUnit test case class - Detect redirect form instead of logon form, follow redirect to logon form - Add an upload-site ant task - Fixes from audit - Fix settings default values and update doc - Drop icon activity switches under 250ms to avoid fast flickering on OSX, add new switch icon in IMAP fetch iterations - Improve script based form redirect to handle more cases - Refactor ExchangeSession to allow independent session creation. - Allow directory in logFilePath settings, add /davmail.log suffix in this case - Allow follow redirects on /public GET requests ### Caldav: - Caldav: use permanenturl for Caldav to avoid encoding issues - Caldav: do not close connection on 401 authorization required, may help iCal authentication - Caldav: Additional Allday fix for Exchange 2007 and Outlook, implement a failover with a new davmail.timezoneId setting. - Caldav: fix regression on create event, missing CRLF in mime message - Caldav: Fix regression on public calendar folders linked to multiple calendar support for iCal - Caldav: use chunked response to send calendar folder content as ICS to avoid timeout - Caldav: Experimental GET ics on folder and fix regression on public folder access - Caldav: get current VTIMEZONE body from OWA to create Allday events compatible with Outlook. Users still need to select the same Timezone in Outlook and OWA. - Caldav: Fix Timezone value - Caldav: Create a new setting davmail.forceActiveSyncUpdate to let users choose to force ActiveSync event. Note: custom iCal or Lightning ICS properties are lost if this option is enabled. - Caldav: Some Exchange servers redirect to a different host for freebusy, use wide auth scope - Caldav: Another fix from Dan Foody: improve dumpICS debug option - Caldav: need to check session on each request, credentials may have changed or session expired - Caldav: fix regression after ActiveSync patch, PROPPATCH on contentClass removes all custom ICS properties - Caldav: improve getICSValue, do not return values inside VALARM section - Caldav: do not send events with a null instancetype (may be the cause of iCal failure) - CalDav: Send sub folders for multi-calendar support under iCal - Caldav: fix path translation to Exchange for calendars in sub folders under /calendar - Caldav: Added supported-calendar-component-set to calendar response - Caldav: added a debug trace when requested calendar is not user calendar (maybe shared, but often url mistake in Caldav client) - Caldav: fix Bug 2686125, PROPPATCH event after PUT to trigger activeSync PUSH, tested with iPhone 3 using activeSync ### IMAP: - IMAP: use permanenturl instead of href to avoid url encoding issues - IMAP: Revert convert absolute IMAP path to relative path, breaks Caldav - IMAP: Convert absolute IMAP path to relative path and detect ISA server cookie starting with cadata (instead of equals cadata) - IMAP: use upper case NIL in ENVELOPE - IMAP: improve MimeMessage handling, drop after fetch to avoid keeping full message in memory - IMAP: fix new ENVELOPE feature, must return encoded values - IMAP: implement store by id and ENVELOPE - IMAP: update message flag only if changed to avoid unneeded message uid bump, may fix Evolution and Apple Mail constant reload issue - IMAP: implement search by id - IMAP: send default BODYSTRUCTURE on MIME encoding error - IMAP: improve complex content-type handling in BODYSTRUCTURE - IMAP: fix deleted flag handling, switch to official Exchange IMAP property http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/0x8570 - IMAP: detect HttpNotFoundException on folder select - IMAP: improve public folder error handling - IMAP: fix space at end of folder name - IMAP: Fix regression on LIST INBOX - IMAP: experimental public folder access - IMAP: switch to http://schemas.microsoft.com/exchange/contentstate to handle deleted flag (DAV:isdeleted did not work with some Exchange servers). - IMAP: implement undelete message ## DavMail 3.5.0 2009-09-22 This release improves OSX Snow Leopard support, thank to contributions from Dan Foody. Contact searches are also available now in addition to global address book searches over LDAP. IMAP with iPhone should now work correctly with most messages, Evolution IMAP read flag is fixed. Also added an experimental windows service support and a lot of other bug fixes and enhancements. ### Doc: - Doc: Fix FAQ whitespaces - Doc: improve javadoc and code cleanup - Doc: New OSX settings screenshot - Doc: update release guide - Doc: improve index and build doc - Doc: detailed WIRE debug log file creation ### Windows: - Windows: Include DavMail service in windows package - Windows: create windows service exe - Windows: create windows service exe ### IMAP: - IMAP: test session expiration on each command, get a new session on expiration - IMAP: improve error logging on network down - IMAP: fix bug 2845530 implement FLAGS.SILENT command - IMAP: fix absolute (public) path handling - IMAP: fix BODYSTRUCTURE, build message on full buffer, do not rely on partial buffer (header, body, ...) - IMAP: fix bug 2835529 FETCH with unordered range - IMAP: send default BODYSTRUCTURE on mime parsing failure - IMAP: Improve IMAP bodystructure error logging - IMAP: Send bodystructure with headers for iPhone request (BODYSTRUCTURE BODY.PEEK[HEADER]) - IMAP: send BODY[TEXT] for BODY.PEEK[TEXT] request, may improve iPhone support - IMAP: First fix for bug 2840255, do not follow redirects on message FETCH ### Caldav: - Caldav: fix conflict between X-MICROSOFT-CDO-BUSYSTATUS, X-MICROSOFT-CDO-ALLDAYEVENT and ORGANIZER ics patches - Caldav: check credentials on each request - Caldav: Disable broken sub calendar folders code - Caldav: Do not fail on Inbox access denied, just return an empty folder - Caldav: fix multi calendar Exchange path for sub folders - Caldav: Experimental, fix sub calendar folders path - Caldav: Experimental, send sub calendar folders on propfind with depth 1 - Caldav: Handle multi line description in calendar message body - Caldav: merged contribution from Dan Foody, - Caldav: convert sound to display alarms and back - Caldav: remove additional organizer attendee line - Caldav: remove RSVP=TRUE if PARTSTAT is not NEEDS-ACTION - Caldav: add dump ICS logging feature - Caldav: add a text/plain body to calendar messages - Caldav: create a subject for calendar messages - Caldav: fixed some encoding issues in Dan's code - Caldav: Additional timezones - Caldav: failover to DAV:comment instead of CALDAV:schedule-state on some Exchange servers ### LDAP: - LDAP: iCal fix to suit both iCal 3 and 4: move cn to sn, remove cn - LDAP: iCal: do not send LDAP_SIZE_LIMIT_EXCEEDED on apple-computer search by cn with sizelimit 1 - LDAP: copy uid to apple-generateduid for iCal attendee search - LDAP: Make sure we do not send empty description field, replace " \n" with null - LDAP: fix thread name - LDAP: exclude non contact entries from search, fiw map key and sn copy for iCal - LDAP: fix contact search, do not send unrequested attributes - LDAP: improve Contact search filter support - LDAP: Additional Contact attributes - LDAP: refactor contact find, generic attribute mapping - LDAP: experimental contact search support ### OSX: - OSX: Prepare hide from Dock option - OSX: crazy workaround from Dan Foody to fix attendee search on OSX Snow Leopard - OSX: iCal4 (OSX Snow Leopard fixes) ### Bug Fixes: - Fix regression in Form Based Logon: fix script based logon URI creation with path and query - Another network down fix: DavMailException is not network down - Improve Form Based Logon: fix script based logon URI creation - Improve Form Based Logon: use full URI instead of path in PostMethod, also force trusted=4 - Simplify HttpClient creation to avoid password decoding bug in commons httpclient ('+' in password decoded as ' ') ### Enhancements: - Improve HttpException error logging - Fixes from checkStyle audit - Adjust checkStyle settings - Improve error handling on invalid URL - Various fixes from FindBugs audit - Fix from audit: synchronize access to HttpConnectionManager - Refactor ExchangeSession: do not follow redirects with GET methods - Fix from audit - Do not pass DavMailAuthenticationException to handle network down - Custom form (txtUserName, tstUserPass) support - Another network down fix from Dan Foody - Merged another patch from Dan Foody on network down detection - New settings method: return log file directory ## DavMail 3.4.0 2009-08-14 This release includes iPhone 3 Caldav support, upgrade to SWT 3.5, Palm Pre IMAP fixes, improved shared/public calendar support and a lot of bug fixes. ### Doc: - Doc: Code cleanup and improve javadoc - Doc: Update doc - Doc: Upgrade maven site plugin and improve style - Doc: Update maven pom inceptionYear ### Bug: - Bug: Do not try to set Nimbus Look And Feel on Linux with Gtk ### Enhancements: - Remove NTLM authentication, breaks Basic authentication (missing domain in username) - Set NTLM as last authentication scheme - Experimental: reenable NTLM authentication - Upgrade SWT to 3.5 - Use getFolderPath in getSubFolders - Make API more consistent: createMessage must get a folder path, not URL - Enhancement: Patch 2826966 from Eivind Tagseth, Make davmail.sh work from any location ### IMAP: - IMAP: Need to reset index for Palm pre - IMAP: case insensitive search operators - IMAP: Fix bug 2835529, implement SEARCH ALL SINCE for Palm Pre ### Caldav: - Caldav: improve error handling, 440 means 403 forbidden on Exchange - Caldav: Fix shared calendar support for Lightning - Caldav: additional patch for Outlook created recurring events - Caldav: set X-MICROSOFT-CDO-BUSYSTATUS according to TRANSP field - Caldav: implement a timezone translation table for iPhone 3, revert organizer patch (breaks notifications with Lightning) - Caldav: another iPhone fix, remove organizer line if user is organizer - Caldav: generic timezone patch for iPhone 3 - Caldav: remove empty ics properties - Caldav: Remove calendar-proxy, only used for delegate calendars - Caldav: try to improve responses for iCal - Caldav: fix bug 2833044 Event not found error on dismissing reminders with events created in Outlook with a plus sign in subject - Caldav: Experimental, add calendar-proxy DAV option and version in server header - Caldav: Add missing allow OPTIONS header - Caldav: improve public (shared) calendar support, accept calendars at any depth - Caldav: set caldav logging to davmail logging level - Caldav: updated fix, remove organizer line if event has no attendees for iPhone - Caldav: remove organizer line if current user is organizer for iPhone, will not remove line for events with attendees - Caldav: Improve principal -> actualPrincipal detection: use session alias instead of login - Caldav: fix bug 2819028, case insensitive email in sendPrincipal test - Caldav: iPhone compatibility, remove - Caldav: iPhone workaround: send calendar subfolder - Caldav: revert @ encoding, breaks iCal - Caldav: iPhone fix, encode @ in Caldav response hrefs - Caldav: untested, extended PROPFIND / response for iPhone 3.0 - Caldav: fix infinite loop with Sunbird 1.0pre with invalid credentials ### SMTP: - SMTP: fix bug 2791607, do not patch message body (breaks electronic signature), no longer needed with latest Thunderbird ## DavMail 3.3.0 2009-07-22 This is a bug fix release after two beta releases, including PKCS11 (smartcard) client certificate support, gateway encryption (SSL) support, the new jackrabbit and httpclient libraries and I18N support (french and english available). - Caldav: updated caldav response headers according to gmail, added Expires and Cache-control HTTP headers - POP3: implement NOOP command - Doc: Update documentation header - Doc: Add GPLv2 header to all source files - Doc: Remove Apache license from checkstyle config file header - IMAP: fix DELETED/UNDELETED SEARCH parameters - IMAP: Fix bug 2822625: support index range in IMAP SEARCH - Enhancements: Merged network down (with firewall) code from Dan Foody - Caldav: Additional properties and ignore cases for Sunbird - Caldav: Fix empty organizer field in ICS (active sync support) and another getParticipants bug - GUI: Fix OSX menu default ActionListener - GUI: Try to set Nimbus Look And Feel on Linux with Gtk ## DavMail 3.3.0b2 2009-06-29 This is a bug fix release, with nonetheless one main new feature: PKCS11 (smartcard) client certificate support ! Tested with ActivIdentity ActivClient and Mozilla soft token, should work with any PKCS11 module. ### Security: - (RFE 2800206) PKCS11 (smartcard) client certificate support ### Server (daemon) mode: - Fix server mode: now all listener threads are daemon, avoid main thread exit and add a shutdown hook - Name shutdown thread ### Caldav: - Move wire debug log with headers - Fix NoSuchMethodError with Java 5 - revert supported-calendar-component-set on root and improve logging - fix regression on iCal calendar color change - only include attendees with RSVP=TRUE or PARTSTAT=NEEDS-ACTION for notifications (avoid iCal additional notifications) - Improve error handling on FreeBusy failure - add supported-calendar-component-set property requested by iPhone 3.0 Sunbird compatibility, exclude events with empty names - Fix for iCal: send etag on GET and HEAD requests - Send empty response instead of error on freebusy with unknown attendee ### IMAP: - revert refreshFolder calls that break Outlook ### OSX: - Remove default trayIcon listener on OSX - Fixed logFilePath logic on OSX ### Enhancements: - Update ExchangeSession test - Exclude optional log4j maven dependencies - Added a logFilePath setting to set log4j file appender path, this appender is now added dynamically to avoid davmail.log file create failure - Upgrade Log4J to 1.2.15 - Make sure we do exit: catch exceptions before System.exit ### Doc: - Document build process in FAQ ### Known issues: - Does not - yet - work with iPhone 3.0 Caldav - Still issues with Exchange activeSync mode ## Davmail 3.3.0b1 2009-06-10 This release is mainly a deep refactoring: replaced deprecated jakarta slide library with jackrabbit and upgrade httpclient. Also added client to gateway encryption (SSL) support, started I18N (french and english available) and many bug fixes and enhancements. ### I18N: - I18N: FrameGatewayTray - I18N: Format port numbers and add missing message - I18N: improve startup log message - I18N: remove Locale.ROOT not available under Java 1.5 - I18N: externalize and translate exception messages - I18N: Do not apply i18n on log file - I18N: french localization - I18N: externalize all DavGatewayTray log statements for i18n - I18N: ldap package - I18N: davmail package - I18N: start internationalization conversion ### POP: - POP: Defer message list after login phase and load only uid and size attributes - POP: make sure the url is encoded correctly on delete ### IMAP: - IMAP: Detect fetch of a missing (probably deleted) message to avoid infinite loop with Thunderbird - IMAP: reset icon after each command ### SMTP: - SMTP: fixed two bugs, header ignored because of Exchange 2007 from patch and bccbuffer double xml encoding (=> Delivery status notification) ### LDAP: - LDAP: improve ldap search logging ### Doc: - Add Mitchell V. Oliver as Java Contributor - SSL certificate settings documentation in getting started - Update OSX doc: credentials are mandatory in Directory Utility settings - Add Eivind Tagseth as Java Contributor ### Enhancements: - Check java version in ant build.xml - Fix ExchangeSession test - Refactor DavProperty handling with new jackrabbit library - Close idle connections to exchange after one minute - Avoid 401 roundtrips - Remove deprecated HttpException api - Replace deprecated setRequestBody with setRequestEntity - Refactor DavProperty handling with new jackrabbit library - Update packaging and Maven POM after library update - Major refactoring: replace deprecated jakarta slide with jackrabbit and upgrade httpclient - Upgrade svnkit library - Sort properties and display version in startup message - Use interactive console certificate accept in headless and/or server mode - Append svn build number to release name - Additional login failover : get email from options page - Replace greyscale inactive icon with a color icon - Avoid nullpointerexception in Settings.setProperty - Reinsert System.exit after clean shutdown to make sure we do exit - Make all threads daemon and remove System.exit calls - Patch 2790299 by Mitchell V. Oliver: Add support for SSL to client connections - Remember previous checkConfig status to detect network down - Fixes from audit - Refactor email retrieval : do not throw IOException in failovers - Implement BundleMessage.toString() for direct usage in Log4J logger - Revert to simple class names in thread names - Catch unknown host on session login - Workaround for post logon script redirect - Workaround for Exchange server misconfiguration: move galfind requests to mailPath or /exchange instead of /public - Enhancements from audit - Fix exchangeSession test class - Improve BindException error message - Cleanup from audit - Improve exception handling - Implement a last resort failover to build email from alias and domain name - Limit redirects to 10 instead of 100 - Replace hardcoded strings - Refactor SimpleDateFormat usage - Reorganize packages ### OSX: - OSX: replace JavaApplicationStub link with actual file - OSX: Move davmail.log to Library/Logs/DavMail on OSX - OSX: Improve Mac OSX Java6 support - OSX: fix regression on OSX Quit handler ### Bugs fixed: - Fix bug 2797272: Add disable update check - Do not localize port numbers - Replaced localhost check with the isLoopbackAddress() method, should be IPV6 compatible - Fix regression : /exchange/ does not work for galfind under Exchange 2007 - Fixed 2717547: Unsupported filter attribute: apple-group-memberguid - URI encode alias in getEmail() - Fix SSLProtocolSocketFactory with HttpClient 3.1 - Reenable limited timeout on getReleasedVersion - Always exclude NTLM authentication, not only for proxy authorization - Fix 2717446 from Eivind Tagseth ### Caldav: - Caldav: fix unknown recipient message - Caldav: do not send freebusy info if attendee is unknown - Caldav: Improve calendar-color patch answer - Caldav: implement HEAD request - Improve network down detection for Caldav - Caldav: No need to check connectivity on HTTPS - Caldav: Fix Bug 2783595, allow empty lines in ICS content - Caldav: Exclude RSVP=FALSE from notifications recipients list for Outlook 2003 compatibility - Caldav: exclude invalid attendees address from recipient list - Caldav: avoid duplicate / in event path - Caldav: implement public shared calendar - Caldav: In progress multi calendar support - Caldav: fix regression in FreeBusy date handling - Caldav: switch icon during event report - Caldav: refactor CaldavConnection, prepare /public context - Caldav: another special characters handling improvement - Caldav: iCal decodes hrefs, not lightning => detect client in CaldavRequest - Caldav: replace etag by resourcetag in getCalendarEtag - Caldav: Send events back to the client after each get on REPORT request (avoid iCal timeout) - Caldav: no inbox/outbox for delegated calendars davmail-6.3.0/appveyor.yml0100644 0000000 0000000 00000002620 14575630005 014261 0ustar000000000 0000000 version: '{build}' image: Visual Studio 2019 environment: ANT_HOME: C:\ant\apache-ant-1.10.14 matrix: - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 - JAVA_HOME: C:\Program Files\Java\jdk11 - JAVA_HOME: C:\Program Files\Java\jdk19 branches: only: - master install: - ps: | Add-Type -AssemblyName System.IO.Compression.FileSystem if (!(Test-Path -Path "C:\ant\apache-ant-1.10.14" )) { (new-object System.Net.WebClient).DownloadFile( 'https://www-eu.apache.org/dist//ant/binaries/apache-ant-1.10.14-bin.zip', 'C:\ant-bin.zip' ) [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\ant-bin.zip", "C:\ant") } - cmd: SET PATH=C:\ant\apache-ant-1.10.14\bin;%JAVA_HOME%\bin;%PATH% - cmd: set ANT_OPTS=-Dfile.encoding=UTF-8 - cmd: java -version - cmd: ant -version - cmd: copy /y C:\projects\davmail\nsis\* "C:\Program Files (x86)\NSIS\Plugins\x86-ansi" - cmd: copy /y C:\projects\davmail\nsis\* "C:\Program Files (x86)\NSIS\Plugins\x86-unicode" build_script: - ant dist - IF "%JAVA_HOME%" == "C:\Program Files\Java\jdk19" ant sonar -Dsonar.login=%SONAR_LOGIN% - IF not "%JAVA_HOME%" == "C:\Program Files\Java\jdk1.8.0" echo remove artifacts && del /s /q dist test: false cache: - C:\ant artifacts: - path: dist/*.zip - path: dist/*.deb - path: dist/*.tgz - path: dist/davmail-*.exe davmail-6.3.0/build.xml0100644 0000000 0000000 00000062055 14757572750 013540 0ustar000000000 0000000 Ever wanted to get rid of Outlook ? DavMail is a POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange and Office 365 gateway allowing users to use any mail/calendar client (e.g. Thunderbird with Lightning or Apple iCal) with an Exchange server, even from the internet or behind a firewall through Outlook Web Access. DavMail now includes an LDAP gateway to Exchange global address book and user personal contacts to allow recipient address completion in mail compose window and full calendar support with attendees free/busy display. The main goal of DavMail is to provide standard compliant protocols in front of proprietary Exchange. This means LDAP for global address book, SMTP to send messages, IMAP to browse messages on the server in any folder, POP to retrieve inbox messages only, Caldav for calendar support and Carddav for personal contacts sync. Thus any standard compliant client can be used with Microsoft Exchange. DavMail gateway is implemented in java and should run on any platform. Releases are tested on Windows, Linux (Ubuntu) and Mac OSX. Tested successfully with the Iphone (gateway running on a server). https://davmail.sourceforge.net
davmail-6.3.0/davmail-user.conf0100644 0000000 0000000 00000000162 14754153500 015127 0ustar000000000 0000000 #Type Name ID GECOS Home directory Shell g davmail - u davmail - "davmail" /var/lib/davmail - davmail-6.3.0/davmail.changes0100644 0000000 0000000 00000012711 14757572750 014660 0ustar000000000 0000000 ------------------------------------------------------------------- Wed Feb 26 2025 Mickael Guessant - update to 6.3.0 ------------------------------------------------------------------- Thu May 23 2024 Tristan Miller - Change to using systemd-sysusers ------------------------------------------------------------------- Sat Mar 30 2024 Mickael Guessant - update to 6.2.2 ------------------------------------------------------------------- Thu Jan 04 2024 Mickael Guessant - refactor to build with openjfx on fedora and drop init service dependency - update to 6.2.1 ------------------------------------------------------------------- Thu May 11 2023 Björn Bidar - Convert spec file back to Unix-like LF endings - Add back changelog file and convert to OpenSUSE format - Remove superfluous-%clean-section - Don't repeat package name in spec file - Remove check for obsolete openSUSE version ------------------------------------------------------------------- Wed Jul 07 2021 Michal Suchanek - Tumbleweed no longer supports init.d services and fails build when installed - Only install one of init.d service and systemd service. - Use systemd service macros on SUSE ------------------------------------------------------------------- Mon Jul 05 2021 Mickael Guessant - update to 6.0.0 ------------------------------------------------------------------- Wed Apr 15 2020 Mickael Guessant - update to 5.5.0 ------------------------------------------------------------------- Mon Nov 11 2019 Mickael Guessant - update to 5.4.0 ------------------------------------------------------------------- Mon Aug 12 2019 Mickael Guessant - update to 5.3.1 ------------------------------------------------------------------- Tue Aug 06 2019 Mickael Guessant - update to 5.3.0 ------------------------------------------------------------------- Mon Feb 11 2019 Mickael Guessant - update to 5.2.0 ------------------------------------------------------------------- Thu Dec 20 2018 Mickael Guessant - update to 5.1.0 ------------------------------------------------------------------- Wed Nov 21 2018 Mickael Guessant - update to 5.0.0 - merge files in trunk - various distribution specific fixes ------------------------------------------------------------------- Wed Sep 05 2018 Mickael Guessant - update to 4.9.0 ------------------------------------------------------------------- Wed Apr 04 2018 Mickael Guessant - update to 4.8.4 and build on EL7 with included SWT ------------------------------------------------------------------- Wed Dec 13 2017 Mickael Guessant - update to 4.8.1 and fix RHEL 6 ant buildrequires ------------------------------------------------------------------- Sun Oct 04 2015 Mickael Guessant - a few path fixes and switch to noarch mode ------------------------------------------------------------------- Sun Feb 22 2015 Mickael Guessant - Add rcdavmail link, mark logrotate config file ------------------------------------------------------------------- Sun Feb 22 2015 Mickael Guessant - Fix License and URL ------------------------------------------------------------------- Tue Feb 17 2015 Mickael Guessant - Adapted spec for davmail 4.6.1 ------------------------------------------------------------------- Sun Feb 15 2015 Mickael Guessant - Fix JAVA HOME detection for openSUSE_13.2 ------------------------------------------------------------------- Sun Feb 01 2015 Achim Herwig - Adapted spec for davmail-src-4.6.0-2331.tgz ------------------------------------------------------------------- Tue Oct 28 2014 Dmitri Bachtin - Adapted spec for davmail-src-4.5.1-2303.tgz ------------------------------------------------------------------- Fri Dec 09 2011 Marcin Dulak - use /var/run/davmail.lock instead of /var/lock/subsys/davmail http://en.opensuse.org/openSUSE:Packaging_checks#subsys-unsupported ------------------------------------------------------------------- Fri Dec 09 2011 Marcin Dulak - fixed https://bugzilla.novell.com/show_bug.cgi?id=734592 ------------------------------------------------------------------- Wed Apr 20 2011 Marcin Dulak - proper service handling on openSUSE http://en.opensuse.org/openSUSE:Cron_rename ------------------------------------------------------------------- Thu Mar 24 2011 Marcin Dulak - do not hard-code gid/uid: https://sourceforge.net/mailarchive/message.php?msg_id=27249602 ------------------------------------------------------------------- Fri Mar 18 2011 Marcin Dulak - fixed incorrect JAVA_HOME - added i386 i586 arch - uses davmail_gid and davmail_uid of default 213 - uses /etc/init.d for compatibility with other dists - BuildRequires and Requires compatible with openSUSE 11.4 - removed runlevels 2 4 from davmail-init: https://bugzilla.novell.com/show_bug.cgi?id=675870 ------------------------------------------------------------------- Mon Oct 18 2010 Marko Myllynen - Initial version davmail-6.3.0/davmail.spec0100644 0000000 0000000 00000017553 14757572750 014213 0ustar000000000 0000000 %define systemd_support 0%{?suse_version} || 0%{?el7} || 0%{?el8} || 0%{?el9} || 0%{?fedora} %define systemd_macros 0%{?suse_version} Summary: A POP/IMAP/SMTP/Caldav/Carddav/LDAP gateway for Microsoft Exchange Name: davmail URL: http://davmail.sourceforge.net Version: 6.3.0 Release: 1%{?dist} License: GPL-2.0+ Group: Applications/Internet BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRequires: ant >= 1.7.1, desktop-file-utils %{?fedora:BuildRequires: lua} # required to define _unitdir macro %{?systemd_support:BuildRequires: systemd} # same on suse %if %systemd_macros BuildRequires: systemd-rpm-macros %endif %{?el6:BuildRequires: ant-apache-regexp} %if 0%{?fedora} == 18 # missing ant dep on original Fedora 18 BuildRequires: xml-commons-apis %endif %{?fedora:BuildRequires: java-latest-openjdk-devel} # fedora rawhide only %if 0%{?fedora} > 39 %{?fedora:BuildRequires: ant-unbound} %endif %{?el9:BuildRequires: java-latest-openjdk-devel} %if 0%{?el7} || 0%{?el8} BuildRequires: java-1.8.0-openjdk-devel %endif %if 0%{?el6} BuildRequires: java-1.8.0-openjdk-devel BuildRequires: java-devel >= 1.8.0 BuildRequires: eclipse-swt %endif %if 0%{?is_opensuse} || 0%{?suse_version} BuildRequires: java-devel >= 1.8.0 BuildRequires: eclipse-swt %endif # compile with JavaFX on Fedora %if 0%{?fedora} > 38 || 0%{?el9} BuildRequires: openjfx %endif Requires: coreutils Requires: filesystem Requires(post): coreutils, filesystem Requires(postun): /sbin/service %if %systemd_macros Requires(preun): /sbin/service, coreutils BuildRequires: sysuser-tools %sysusers_requires %else Requires(preun): /sbin/service, coreutils, /usr/sbin/userdel, /usr/sbin/groupdel Requires(pre): /usr/sbin/useradd, /usr/sbin/groupadd %endif %{?fedora:Requires: java} %{?el9:Requires: java} %if 0%{?el7} || 0%{?el8} Requires: java-1.8.0-openjdk %endif %if 0%{?el6} Requires: /etc/init.d, logrotate, jre >= 1.8.0 Requires: eclipse-swt %endif %if 0%{?is_opensuse} || 0%{?suse_version} Requires: jre >= 1.8.0 Requires: eclipse-swt %endif Source0: %{name}-src-%{version}.tgz %description A POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange gateway allowing users to use any mail/calendar client with an Exchange server, even from the internet or behind a firewall through Outlook Web Access. DavMail now includes an LDAP gateway to Exchange global address book and user personal contacts to allow recipient address completion in mail compose window and full calendar support with attendees free/busy display. %prep %setup -q -n %{name}-src-%{version} %build # JAVA_HOME points to the JDK root directory: ${JAVA_HOME}/{bin,lib} jcompiler=`readlink -f $(which javac)` bin=`dirname ${jcompiler}` # level up java_home=`dirname ${bin}` # level up export JAVA_HOME=${java_home} # /scratch/rpmbuild/davmail-src-4.2.0-2066/build.xml:41: Please force UTF-8 encoding to build debian package with set ANT_OPTS=-Dfile.encoding=UTF-8 export ANT_OPTS="-Dfile.encoding=UTF-8" %if 0%{?el6} || 0%{?el7} || 0%{?el8} || 0%{?el9} || 0%{?fedora} || 0%{?is_opensuse} || 0%{?suse_version} echo keep included swt on el7 and opensuse %else # externalize SWT rm lib/swt* [ -f %{_libdir}/java/swt.jar ] && ln -s %{_libdir}/java/swt.jar lib/swt.jar || ln -s /usr/lib/java/swt.jar lib/swt.jar %endif # compile with OpenJFX [ -d /usr/lib/jvm/openjfx ] && cp /usr/lib/jvm/openjfx/*.jar lib # we have java 8 ant -Dant.java.version=1.8 prepare-dist %if %systemd_macros %sysusers_generate_pre %{name}-user.conf davmail %{name}-user.conf %endif %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_bindir} mkdir -p $RPM_BUILD_ROOT%{_sbindir} mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/init.d mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications mkdir -p $RPM_BUILD_ROOT%{_datadir}/pixmaps mkdir -p $RPM_BUILD_ROOT%{_datadir}/davmail/lib mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/davmail mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log # Init scripts, icons, configurations install -m 0775 src/bin/davmail $RPM_BUILD_ROOT%{_bindir}/davmail install -m 0644 src/init/davmail-logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/davmail install -m 0644 src/etc/davmail.properties $RPM_BUILD_ROOT%{_sysconfdir} # https://fedoraproject.org/wiki/TomCallaway/DesktopFileVendor desktop-file-install --dir $RPM_BUILD_ROOT%{_datadir}/applications/ src/desktop/davmail.desktop --vendor="" install -m 0775 src/init/davmail-wrapper $RPM_BUILD_ROOT%{_localstatedir}/lib/davmail/davmail %if %systemd_support install -D -m 644 src/init/davmail.service %{buildroot}%{_unitdir}/davmail.service %else install -m 0775 src/init/davmail-init $RPM_BUILD_ROOT%{_sysconfdir}/init.d/davmail ln -sf %{_sysconfdir}/init.d/davmail $RPM_BUILD_ROOT%{_sbindir}/rcdavmail %endif # Actual DavMail files install -m 0644 src/java/tray32.png $RPM_BUILD_ROOT%{_datadir}/pixmaps/davmail.png rm -f dist/lib/*win32*.jar %if 0%{?el6} || 0%{?el7} || 0%{?el8} || 0%{?el9} || 0%{?fedora} || 0%{?is_opensuse} || 0%{?suse_version} echo use included swt %else [ -f %{_libdir}/java/swt.jar ] && ln -s %{_libdir}/java/swt.jar $RPM_BUILD_ROOT%{_datadir}/davmail/lib/swt.jar || ln -s /usr/lib/java/swt.jar $RPM_BUILD_ROOT%{_datadir}/davmail/lib/swt.jar %endif rm -f dist/lib/*x86*.jar rm -f dist/lib/*growl*.jar rm -f dist/lib/javafx*.jar install -m 0664 dist/lib/* $RPM_BUILD_ROOT%{_datadir}/davmail/lib/ install -m 0664 dist/*.jar $RPM_BUILD_ROOT%{_datadir}/davmail/ %if 0%{?sle_version} != 120300 && 0%{?suse_version} != 1310 && 0%{?suse_version} != 1320 mkdir -p $RPM_BUILD_ROOT%{_datadir}/metainfo install -m 0644 src/appstream/org.davmail.DavMail.appdata.xml $RPM_BUILD_ROOT%{_datadir}/metainfo %endif %if %systemd_macros mkdir -p %{buildroot}%{_sysusersdir} install -m 0644 %{name}-user.conf %{buildroot}%{_sysusersdir}/ %else /usr/sbin/groupadd -f -r davmail > /dev/null 2>&1 || : /usr/sbin/useradd -r -s /sbin/nologin -d /var/lib/davmail -M \ -g davmail davmail > /dev/null 2>&1 || : %endif %if %systemd_macros %pre -f davmail.pre %service_add_pre davmail.service %else %pre %endif %post file=/var/log/davmail.log if [ ! -f ${file} ] then /bin/touch ${file} fi /bin/chown davmail:davmail ${file} /bin/chmod 0640 ${file} %if %systemd_macros %service_add_post davmail.service %endif %if %systemd_support %else # proper service handling http://en.opensuse.org/openSUSE:Cron_rename %{?fillup_and_insserv: %{fillup_and_insserv -y davmail} } %{!?fillup_and_insserv: # undefined /sbin/chkconfig --add davmail #/sbin/chkconfig davmail on } %endif %preun %if %systemd_macros %service_del_preun davmail.service %endif if [ "$1" = "0" ]; then %if %systemd_support %else /sbin/service davmail stop > /dev/null 2>&1 || : /bin/rm -f /var/lib/davmail/pid > /dev/null 2>&1 || : %{?stop_on_removal: %{stop_on_removal davmail} } %{!?stop_on_removal: # undefined /sbin/chkconfig davmail off /sbin/chkconfig --del davmail } %endif /usr/sbin/userdel davmail if [ ! `grep davmail /etc/group` = "" ]; then /usr/sbin/groupdel davmail fi fi %postun %if %systemd_macros %service_del_postun davmail.service %endif %if %systemd_support %else if [ $1 -ge 1 ]; then %{?restart_on_update: %{restart_on_update davmail} %insserv_cleanup } %{!?restart_on_update: # undefined /sbin/service davmail condrestart > /dev/null 2>&1 || : } fi %endif %files %defattr (-,root,root,-) %{_bindir}/* %if %systemd_macros %{_sysusersdir}/%{name}-user.conf %endif %if %systemd_support %{_unitdir}/davmail.service %else %{_sysconfdir}/init.d/davmail %{_sbindir}/rcdavmail %endif %config(noreplace) %{_sysconfdir}/logrotate.d/davmail %config(noreplace) %{_sysconfdir}/davmail.properties %{_datadir}/applications/* %{_datadir}/pixmaps/* %{_datadir}/davmail/ %if 0%{?sle_version} != 120300 && 0%{?suse_version} != 1310 && 0%{?suse_version} != 1320 %{_datadir}/metainfo/org.davmail.DavMail.appdata.xml %endif %attr(0775,davmail,davmail) %{_localstatedir}/lib/davmail %changelog davmail-6.3.0/env.cmd0100644 0000000 0000000 00000000271 14521747677 013165 0ustar000000000 0000000 set PATH=C:\apache-ant-1.10.14\bin;C:\mguessan\bin\NSIS\App\NSIS\Bin;C:\apache-maven-3.9.5\bin;%PATH% set JAVA_HOME=C:\java\corretto-1.8.0_382 set ANT_OPTS=-Dfile.encoding=UTF-8 davmail-6.3.0/pom.xml0100644 0000000 0000000 00000040423 14757572750 013227 0ustar000000000 0000000 4.0.0 davmail davmail jar 6.3.0 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange and Office 365 Gateway Mickaël Guessant https://www.sourceforge.net/projects/davmail 2001 Ever wanted to get rid of Outlook ? DavMail is a POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange and Office 365 gateway allowing users to use any mail/calendar client (e.g. Thunderbird with Lightning or Apple iCal) with an Exchange server, even from the internet or behind a firewall through Outlook Web Access. DavMail now includes an LDAP gateway to Exchange global address book and user personal contacts to allow recipient address completion in mail compose window and full calendar support with attendees free/busy display. The main goal of DavMail is to provide standard compliant protocols in front of proprietary Exchange. This means LDAP for address book, SMTP to send messages, IMAP to browse messages on the server in any folder, POP to retrieve inbox messages only and Caldav for calendar support. Thus any standard compliant client can be used with Microsoft Exchange. DavMail gateway is implemented in java and should run on any platform. Releases are tested on Windows, Linux (Ubuntu) and Mac OSX. Tray does not work on MacOS and is replaced with a full frame. Tested successfully with the Iphone (gateway running on a server). DavMail gateway is implemented in java and should run on any platform. Releases are tested on Windows, Linux (Ubuntu) and Mac OSX. Tested successfully with the Iphone (gateway running on a server). UTF-8 Mickaël Guessant mguessan mguessan@free.fr https://github.com/mguessan Project Founder Java Developer Dfoody dfoody@users.sourceforge.net https://sourceforge.net/users/dfoody Main Java Contributor Alexandre Rossi alexandre.rossi@gmail.com https://tracker.debian.org/pkg/davmail Debian DavMail package maintainer Marcin Dulak marcin.dulak@gmail.com https://build.opensuse.org/package/show/home:marcindulak/davmail DavMail RPM package maintainer John Ahern jahern2502@users.sourceforge.net https://sourceforge.net/users/jahern2502 Java Contributor Eivind Tagseth eivindt@users.sourceforge.net https://sourceforge.net/users/eivindt Java Contributor Mitchell V. Oliver pianoman113@users.sourceforge.net https://sourceforge.net/users/pianoman113 Java Contributor Gellule gellule@users.sourceforge.net https://sourceforge.net/users/gellule Java Contributor Jeremiah Albrant https://sourceforge.net/users/?user_id=2903536 Java Contributor Henning Holtschneider hehol@users.sourceforge.net https://sourceforge.net/users/hehol Tester Shocker gkwait@users.sourceforge.net https://sourceforge.net/users/gkwait Tester Guido guido2@users.sourceforge.net https://sourceforge.net/users/guido2 Tester GNU General Public License https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt repo DavMail User List davmail-users@lists.sourceforge.net. https://sourceforge.net/projects/davmail/lists/davmail-users https://sourceforge.net/projects/davmail/lists/davmail-users https://sourceforge.net/p/davmail/mailman/davmail-users/ scm:svn:https://svn.code.sf.net/p/davmail/code/trunk scm:svn:https://svn.code.sf.net/p/davmail/code/trunk HEAD https://sourceforge.net/p/davmail/code/HEAD/tree/trunk/ SourceForge https://sourceforge.net/p/davmail/_list/tickets junit junit 4.13.1 test org.apache.jackrabbit jackrabbit-webdav 2.20.15 org.apache.jackrabbit jackrabbit-jcr-commons xml-apis xml-apis commons-httpclient commons-httpclient commons-codec commons-codec org.slf4j slf4j-log4j12 1.7.25 org.slf4j jcl-over-slf4j commons-codec commons-codec 1.15 log4j log4j 1.2.17 javax.jms jms com.sun.jdmk jmxtools com.sun.jmx jmxri com.sun.mail javax.mail 1.5.6 javax.activation activation javax.activation activation 1.1.1 org.eclipse swt 4.9 true system ${project.basedir}/lib/swt-4.9-gtk-linux-x86_64.jar javax.servlet servlet-api 2.4 true net.sourceforge.htmlcleaner htmlcleaner 2.29 com.fasterxml.woodstox woodstox-core 6.4.0 net.freeutils jcharset 2.0 xyz.cofe winrun4j 0.4.5 org.codehaus.jettison jettison 1.5.4 apache.snapshots https://repository.apache.org/snapshots false src/java **/O365Interactive*.java src/java org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 **/O365Interactive*.java 3.10.1 org.apache.maven.plugins maven-site-plugin 3.7.1 org.apache.maven.plugins maven-surefire-plugin 2.22.0 sourceforge.net scp://web.sourceforge.net/home/groups/d/da/davmail/htdocs org.apache.maven.plugins maven-project-info-reports-plugin 3.0.0 dependencies dependency-convergence team mailing-lists issue-management licenses scm org.apache.maven.plugins maven-javadoc-plugin 3.0.1 none org.apache.maven.plugins maven-changelog-plugin 2.3 org.codehaus.mojo findbugs-maven-plugin 3.0.5 Normal Default davmail.- org.apache.maven.plugins maven-checkstyle-plugin 3.0.0 src/checkstyle/checkstyle-configuration.xml com/ctc/wstx/sr/StreamScanner.java org.apache.maven.plugins maven-jxr-plugin 2.5 davmail-6.3.0/releaseguide.txt0100644 0000000 0000000 00000002020 14577576171 015101 0ustar000000000 0000000 Release guide : - update roadmap - update RELEASE-NOTES.md from svn log - update appdata.xml from release notes - change version in build.xml, pom.xml and davmail.spec, README.md, commit - update staging (clean checkout) directory - launch ant release, check generated packages - upload packages: ant upload-release - check maven plugin versions: mvn versions:display-plugin-updates - generate site: mvn site - upload site: ant upload-site - create tag in subversion - create news message at https://sourceforge.net/p/davmail/news/ - send user mailing list message - change default download files on frs - update readme.md at https://sourceforge.net/projects/davmail/files/davmail - upload version.txt with ant upload-version - update git tag with git svn fetch / git tag - create new version in sourceforge bug tracker - connect to https://build.opensuse.org/ - upload src package - update spec file - connect to https://copr.fedorainfracloud.org/coprs/mguessan/davmail - launch a build with source rpm from opensusedavmail-6.3.0/sonar.properties0100644 0000000 0000000 00000002350 13576355772 015150 0ustar000000000 0000000 # # DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway # Copyright (C) 2010 Mickael Guessant # # 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. # sonar.host.url=https://sonarcloud.io sonar.organization=mguessan sonar.projectKey=mguessan_davmail sonar.sources=src/java sonar.tests=src/test sonar.exclusions=src/java/com/ctc/wstx/sr/StreamScanner.java sonar.java.libraries=lib/*.jar sonar.java.binaries=target/classes sonar.sourceEncoding=UTF-8 sonar.java.source=1.8 sonar.java.test.libraries=lib/*.jar sonar.coverage.jacoco.xmlReportPaths=target/jacoco.xmldavmail-6.3.0/src/appstream/org.davmail.DavMail.appdata.xml0100644 0000000 0000000 00000116554 14757572750 022360 0ustar000000000 0000000 org.davmail.DavMail.desktop DavMail CC0-1.0 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway

Ever wanted to get rid of Outlook ? DavMail is a POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange and Office 365 gateway allowing users to use any mail/calendar client (e.g. Thunderbird with Lightning or Apple iCal) with an Exchange server, even from the internet or behind a firewall through Outlook Web Access. DavMail now includes an LDAP gateway to Exchange global address book and user personal contacts to allow recipient address completion in mail compose window and full calendar support with attendees free/busy display. The main goal of DavMail is to provide standard compliant protocols in front of proprietary Exchange. This means LDAP for address book, SMTP to send messages, IMAP to browse messages on the server in any folder, POP to retrieve inbox messages only and Caldav for calendar support. Thus any standard compliant client can be used with Microsoft Exchange. DavMail gateway is implemented in java and should run on any platform. Releases are tested on Windows, Linux (Ubuntu) and Mac OSX. Tray does not work on MacOS and is replaced with a full frame. Tested successfully with the Iphone (gateway running on a server).

https://davmail.sourceforge.net https://sourceforge.net/donate/index.php?group_id=184600 https://screenshots.debian.net/screenshots/000/015/485/large.png https://davmail.sourceforge.net/images/davmailArchitecture.png GPL-2.0 Mickaël Guessant Merged some contributions provided by users on github, updated embedded jre to 21 for improved TLS 1.3 support, applied documentation fixes, reviewed rpm build to provide el9 compatibility, implemented channel binding for NTLM authentication. Also added a more recent Docker file in contribs, worked on GCC high tenants compatibility. Microsoft Graph backend implementation is in progress but far from complete. ### Caldav - Caldav: handle multiple categories on TODO items, see https://github.com/mguessan/davmail/issues/372 - Caldav: Merge https://github.com/mguessan/davmail/pull/386 validate and repair Exchange calendar characters ### LDAP - LDAP: merge https://github.com/mguessan/davmail/pull/353, fix first certificate selection logic - LDAP: merge https://github.com/mguessan/davmail/pull/353 Add support for retrieving user certificates ### IMAP - IMAP: fix backslash in password quoted string by: Max-Julian Pogner <max-julian@pogner.at>, finalize merge, call new parsing method from nextToken and remove backslash handling in username - IMAP: fix backslash in password quoted string by: Max-Julian Pogner <max-julian@pogner.at>, review and switch to ParseException for error handling and chars instead of bytes - IMAP: merge unit test for patch fix backslash in password quoted string by: Max-Julian Pogner <max-julian@pogner.at> - IMAP: initial merge of patch fix backslash in password quoted string by: Max-Julian Pogner <max-julian@pogner.at> - IMAP: fix https://github.com/mguessan/davmail/issues/359, handle RFC822.TEXT ### O365 - O365: add GCC high example settings in default davmail.properties - O365: https://github.com/mguessan/davmail/pull/380 Remove trailing slash from O365_LOGIN_URL - O365: merge https://github.com/mguessan/davmail/pull/380 Missed one change - O365: merge https://github.com/mguessan/davmail/pull/380 Enhance support for the davmail.outlookUrl property setting and fully support GCC-High endpoints - O365: implement OneWaySMS MFA prompt, see https://github.com/mguessan/davmail/pull/134 - O365: get O365 Login Url from settings for non standard tenants and add additional error use case - O365: detect live.com token. Note: may not be enough to make DavMail work with live.com accounts - O365: dropping all workaroungs for OpenJFX bugs that should be fixed in recent versions ### EWS - EWS: experimental, try to implement recurrence count with NumberOfOccurrences, see https://github.com/mguessan/davmail/issues/373 - EWS: make settings timezoneid higher priority than mailbox configuration, make encode/decode foldername methods public for graph API ### Graph - Graph: introduce GRAPH_URL and davmail.loginUrl in Settings - Graph: initiate search filter implementation - Graph: implement folder recursive search - Introduce folderClass - Graph: Create folders unit tests - Graph: fix folder retrieval by id - Graph: initial folder retrieval implementation - Graph: compute graph API property id from name and tag - Graph: Empty Graph ExchangeSession implementation - Graph: prepare graph request builder for graph implementation - Graph: Experimental, introduce davmail.enableGraph property to obtain a token compatible with Microsoft Graph API ### Linux - Linux: fix ant dependency for fedora - Linux: davmail.spec to not try to link os provided swt.jar when using embedded one - Linux: work on el9 compatibility for RPM build - Linux: Embed davmail-user.conf in source package, see https://github.com/mguessan/davmail/issues/356 - Linux: Create davmail user/group per new conventions in RPM 4.19, merge changes from https://github.com/mguessan/davmail/issues/356 - Build: fix https://github.com/mguessan/davmail/issues/346 unable to run jlink on linux - Linux: force shutdown with -token option - Linux: Add OpenJFX case for Kubuntu ### Documentation - Doc: update windows build documentation, see https://github.com/mguessan/davmail/issues/384 - Doc: merge https://github.com/mguessan/davmail/pull/174 fix docs typo in property davmail.enableKeepAlive - Doc: improve documentation on how to run DavMail as a windows service - Doc: update documentation for non default tenants (US, China) - Doc: provide more information in initial consent for O365 authentication - Doc: update FAQ on application registration in Entra ID (Azure AD) - Doc: mention AppIndicator and KStatusNotifierItem Support in Fedora setup instructions ### Docker - Docker: merge https://github.com/mguessan/davmail/pull/381 by SethRobertson Bug 201: Docker support for building and running ### NTLM - NTLM: remove CIFS dependency - NTLM: cleanup code from audit - NTLM: use ThreadLocal to manage SecureRandom generators - NTLM: switch to DavMailNTLMSchemeFactory to enable channel binding, see https://github.com/mguessan/davmail/issues/352 - NTLM: retrieve certificate from http context - NTLM: Duplicate of NTLMScheme from HttpClient to implement channel binding - NTLM: adjust NTLMEngineImpl to handle channel binding - NTLM: Duplicate code from NTLMEngineImpl to implement channel binding ### Enhancements - Fix from audit - Drop web component - Drop servlet-api.jar, no longer required - Drop deprecated DavGatewayServletContextListener (we no longer provide an embedded war file) - Trying to fix custom jre for TLS 1.3, see https://stackoverflow.com/questions/63964939/tls-1-3-handshake-failure-when-using-openjdk-14-java-module-runtime and https://github.com/mguessan/davmail/pull/388 - fix download-jre for embedded JDK on windows, fetch version 21 - switch davmail linux launcher to zulu JDK 21 for better TLS 1.3 support - switch main package to zulu JDK 21 for better TLS 1.3 support - StringUtilTest CRLF => LF, see https://github.com/mguessan/davmail/pull/378 - StringUtil CRLF => LF, see https://github.com/mguessan/davmail/pull/378 - Security: Enable TLSv1.3 between DavMail and Exchange/O365 - PKCS11: review SunPKCS11ProviderHandler - HttpClient: cleanup from audit - svn ignore .idea - Downgrade jackrabbit to 2.20.15 for java 8 compatibility - Upgrade jackrabbit to 2.21.25 and httpclient to 4.5.14 Includes some build process fixes, use jlink to build a customized jre for standalone package, Thunderbird configuration documentation updated with new screenshots. Also implemented a new -token command line option to launch O365InteractiveAuthenticator and get an authentication token. ### OSX - OSX: document how to embed Zulu jre inside DavMail app ### Enhancements - Fix comment in DavMail shell - Detect missing network connectivity during token refresh to avoid invalidating token - Upgrade JCIFS to 1.3.19 for NTLM support - Cleanup from audit - Drop war package from release files, there are more modern ways to run DavMail in server mode without a webapp container - From audit: place LOCK.wait in a loop - Fix from audit, use try with resource - Cleanup from audit, remove deprecated getSubjectDN, getIssuerDN ### O365 - O365: Improve error message on missing add-exports, see https://github.com/mguessan/davmail/issues/344 - O365: Refactor manual authentication dialog to clearly separate steps - Remove explicit dependency on O365InteractiveAuthenticator for -token option - Implement a -token option to launch interactive authenticator and print obtained refresh token, see https://github.com/mguessan/davmail/issues/338 - O365: Try to adjust ItemId to 140 length, see https://github.com/mguessan/davmail/issues/328 - O365: prepare GCC-High/DoD endpoints support, fix regression - O365: prepare GCC-High/DoD endpoints support, move Outlook login url references to Settings - O365: prepare GCC-High/DoD endpoints support, move outlook url references to Settings ### EWS - EWS: Properly set errorDetail on xml stream error to raise exception - EWS: disable IS_SUPPORTING_EXTERNAL_ENTITIES to fix xml parsing security warning ### Caldav - Fix https://github.com/mguessan/davmail/issues/342 map America/Winnipeg to Central Standard Time - Caldav: Fix https://github.com/mguessan/davmail/issues/337 take timezone into account when looking for excluded occurrence - Fix settings implementation, # are allowed in values, see https://github.com/mguessan/davmail/issues/326 ### IMAP - IMAP: fix https://github.com/mguessan/davmail/issues/339 classcast exception on malformed content ### Build - Maven: update compiler to 3.10.1 - Maven: optimize dependencies - Maven: exclure httpclient 3 transitive dependency - Appveyor: build only master branch - Build: use jlink to create a custom jre to reduce embedded jre size ### Security - Security: fix security alert on Runtime.getRuntime().exec - Security: fix security alert on Runtime.getRuntime().exec ### Linux - Linux: force GTK2 only with SWT - Linux: switch to Azul JRE 17 with "davmail azul" command - Linux: Enable OpenJFX on Fedora to make O365Interactive work with Java 17 and later ### Documentation - Doc: update roadmap - Doc: Add donation buttons to GitHub main readme page - Doc: update Thunderbird documentation messages - Update release guide, mvn install file no longer required - Doc: update Thunderbird documentation, as requested in https://github.com/mguessan/davmail/issues/294 - Doc: update documentation for Thunderbird configuration - Doc: use COPR badge - Doc: update release guide - Doc: reference OpenSuse build service and Fedora COPR for RPM based linux distributions - Update changes file for https://build.opensuse.org/package/show/home:mguessan:davmail/davmail

Most changes are related to build process and rpm packaging for Fedora/RHEL, also includes a few bug fixes on IMAP ### Security - Security: Upgrade commons codec to 1.15 ### O365 - O365: cleanup from audit - O365: no longer apply the disable integrity check workaround by default, fixed in openjfx - O365: add a warning message on FIDO authentication triggered - O365: allow refresh token persistence without provided password - O365: Merge https://github.com/mguessan/davmail/pull/236 Changed authentication link log level ### Linux - Linux: refactor spec file for fedora, do not call old init service scripts and compile with openjfx - Linux: Fix systemd condition for fedora in spec file - Linux: Adjust JDK dependencies for RPM build ### Build - AppVeyor: Cleanup - AppVeyor: copy plugin to x86-unicode - AppVeyor: switch to server 2019 - Appveyor: investigate java versions - AppVeyor: set ANT_HOME value - AppVeyor: update ant path - AppVeyor: update ant download path - Run Sonar scan under JDK19 - Switch Appveyor build to JDK 19 - Maven: fix urls from https://github.com/mguessan/davmail/pull/225 by Stefan Weil ### IMAP - IMAP: merge patch from https://github.com/mguessan/davmail/pull/140, return folders including special use folders when query is % - IMAP: implement fetch macro flags, see https://github.com/mguessan/davmail/issues/314 - IMAP: fix APPENDUID value order ### Enhancements - Cleanup from audit - Fix typo - NTLM: improve logging of NTLM negotiation - Update Winrun4J wrappers with commons codec 1.15

Another bugfix release to merge user contributions from GitHub, refactor Linux build, upgrade dependencies and a few IMAP and Caldav fixes. ### Security - Update htmlcleaner to 2.29 cf CVE-2023-34624 ### Enhancements - Drop Travis-ci, no longer working for opensource projects - fix quotes from audit - Remove space at end of line +0630=Myanmar Standard Time, see https://github.com/mguessan/davmail/issues/309 - Fix https://github.com/mguessan/davmail/issues/271, keep line order and comments on settings save - Fix from audit - Maven: convert pom.xml to UTF-8 ### IMAP - IMAP: merge fix suggested on https://github.com/mguessan/davmail/issues/298 - IMAP: merge according to last comment on https://github.com/mguessan/davmail/pull/239 - IMAP: improve bodystructure handling, merge https://github.com/mguessan/davmail/pull/239 - IMAP: implement APPENDUID and advertise UIDPLUS - IMAP: implement APPENDUID and advertise UIDPLUS - IMAP: Prepare uidplus, fetch message after create ### Caldav - Caldav: Fix nullpointer as in https://github.com/mguessan/davmail/issues/303 - Caldav: Fix https://github.com/mguessan/davmail/issues/309 Thunderbird daily sends TZOFFSETTO with optional second value - Caldav: adjust isLightning test to include Thunderbird user agent, see https://github.com/mguessan/davmail/issues/287 ### Linux - Linux: based on https://github.com/mguessan/davmail/pull/290 by Björn Bidar <bjorn.bidar@thaodan.de>, remove svn commit reference in davmail.spec - Remove svn tag from folder name inside source packages - Linux: remove chkconfig from Requires preun and post in davmail.spec as suggested on build.opensuse.org - Linux: dos2unix davmail.changes - Linux: update changelog with Björn Bidar <bjorn.bidar@thaodan.de> contribution from https://github.com/mguessan/davmail/pull/289 - Linux: Add back changelog file and convert to OpenSUSE format from https://github.com/mguessan/davmail/pull/289 - Linux: Merge changes from https://github.com/mguessan/davmail/pull/290 except %version that may impact release cycle - Linux: convert davmail.spec changelog to OpenSUSE format, see https://github.com/mguessan/davmail/pull/290 - Linux: restore spec file with lf and changelog, see https://github.com/mguessan/davmail/pull/289 - Linux: remove downloaded azul jdk package ### ADFS - ADFS: merge https://github.com/mguessan/davmail/pull/270 by Felix Engelmann, enable ADFS authentication with SAML assertions ### EWS - EWS: Cleanup from audit - EWS: fix https://github.com/mguessan/davmail/issues/299 avoid logging large response message content - EWS: BackOffMilliseconds unit test - EWS: parse BackOffMilliseconds value on throttling ### O365 - O365: in O365 interactive, use invokeAndWait on failover to manual to avoid multiple instances of popup window - Upgrade jettison to 1.5.4 in pom.xml - Upgrade jettison to 1.5.4 ### Windows - Windows: drop explicit reference to sun.security.mscapi.SunMSCAPI, Windows-MY should be available on all windows JDK ### Documentation - Doc: Update server properties documentation with davmail.oauth.persistToken - Doc: fix link to SonarCloud

First release in a long time to publish pending changes, including Kerberos support fix, experimental number matching support for upcoming Microsoft authenticator default configuration change, store new refresh token received at authentication. In addition, some Log4J specific patches to remove vulnerable classes from library (even if DavMail is not impacted with standard configuration) ### O365 - O365: implement number matching logic in O365Authenticator - O365: retrieve number matching value during phone app MFA - O365: adjust logging level on O365 refresh token error - O365: change persist token logic to store new refresh token after succesful refresh - Experimental: store refreshed token when davmail.storeRefreshedToken=true ### Windows - Windows: Add missing labelReplace active wait with wait/notifyAll in DavService - Update winrun4j wrappers after lib upgrades ### Linux - Linux: block davmail azul when davmail script is located under /usr/bin (package installed) - Linux: fix PosixFilePermissions for writeable only by user - Linux: try to make .davmail.properties file readable by user only on create - Linux: improve launch script to take into account script location ### Enhancements - Add missing label - Replace active wait with wait/notifyAll - Upgrade woodstox to 1.4.0 and jettison to 1.5.3 - Merge https://github.com/mguessan/davmail/pull/225 remove (most) http links in Maven POM - Make ScheduledThreadPool thread daemon - Switch to https for version check - DavMailIdleConnectionEvictor fix from audit - Refactor DavMailIdleConnectionEvictor to be less agressive on idle connection checks/purge and use scheduler instead of active polling - Override SPNegoScheme to take into account DavMail kerberos settings ### Documentation - Sample syslog configuration - Update current version in README.md - OSX: remove reference to Growl in documentation - Doc: security note on DavMail not vulnerable to CVE-2021-44228 - Doc: add a section on Fedora installation from copr ### Caldav - Caldav: Do not try to update modified occurrences on Mozilla thunderbird dismiss event ### Security - Security: Strip packaged log4j jar from JMSSink and JDBCAppender to ensure DavMail is not vulnerable to CVE-2022-23305 & CVE-2022-23302, see https://github.com/mguessan/davmail/issues/250 - Remove JMSAppender, SMTPAppender and SocketServer from Log4J binary as an additional security measure (CVE-2019-17571 CVE-2021-4104), even if DavMail is not vulnerable with standard configuration - Upgrade Log4J to latest version 1.2.17 in Winrun4J wrappers - Upgrade Log4J to latest version 1.2.17

Bugfix release with a few Office 365 enhancements ### O365 - O365: default to MSCAPI on windows for native client certificate access - O365: name button Send instead of OK in manual authenticator dialog - OS65: merge https://github.com/mguessan/davmail/pull/158 Added Copy to Clipboard button Manual auth dialog ### Linux - Linux: improve "davmail azul" error handling - Linux: Update changelog in RPM spec - Linux: Fix RPM spec, remote source does not work - Linux: Merge RPM spec contribution from michals on https://build.opensuse.org, check for systemd support and deploy the right service ### HC4 - HC4: make DavMail Kerberos configuration provider ### EWS - EWS: merge https://github.com/mguessan/davmail/pull/106 Support servers only offering EWS/Services.wsdl instead of EWS/Exchange.asmx ### Documentation - Doc: Remove HttpClient migration warning - Doc: instructions on standalone setup on Linux for best O365 support - Update readme for GitHub home page

First major release in a long time, main change is switch from HttpClient 3 to 4, please report any regression related to this major rewrite. DavMail now supports more O365 configurations, including access to client certificate to validate device trust. O365 refresh tokens can now be stored securely in a separate (writable) file. On Linux, in order to ensure the right java version is used, a command line option to download latest Azul JRE with OpenJFX support was added, on windows a standalone package contains Azul JRE FX 15, on OSX updated universalJavaApplicationStub to latest version. ### OSX: - OSX: completely drop Growl support - OSX: prepare possible path for an embedded jre mode - OSX: update universalJavaApplicationStub to latest version from https://github.com/tofi86/universalJavaApplicationStub/blob/master/src/universalJavaApplicationStub ### Documentation: - Doc: merge Clarify the usage of imapIdleDelay https://github.com/mguessan/davmail/pull/116 - Doc: add comment on IDLE and timeout setting - Doc: link to standalone windows package - Doc: fix Zulu link - Doc: remove references to Java 6 in documentation ### Build: - Appveyor: update ant - Appveyor: build with jdk15 - Appveyor: purge artifacts for all builds except jdk 8 - Build: run Sonar with JDK 11 - Update junit to 4.13.1 in Maven - Update junit to 4.13.1 ### Linux: - Linux: Experimental: download Azul JRE FX with command 'davmail azul' - Linux: merge https://github.com/mguessan/davmail/pull/133 Linux Gnome Desktop: fix systray support - Linux: Update service file to allow 0-1023 ports binding (https://github.com/mguessan/davmail/pull/117) ### Windows: - Windows: switch standalone jre to Azul FX 15 - Windows: create a standalone package with Azul JRE FX in order to have a working O365InteractiveAuthenticator - Winrun4J: prefer embedded VM for standalone package and export sun.net.www.protocol.https - Winrun4J: update binaries - Winrun4J: prepare standalone configuration - Windows: update winrun4j config to require Java >= 8 ### IMAP: - IMAP: fix thread handling from audit - IMAP: Compute body part size with failover ### O365: - O365: log token file creation - O365: cleanup from audit - O365: Add davmail.oauth.tokenFilePath to sample properties file - O365: disable HTTP/2 loader on Java 14 and later to enable custom socket factory - O365: allow user agent override in O365InteractiveAuthenticator, switch default user agent to latest Edge - O365: with Java 15 url with code returns as CANCELLED - O365: MSCAPI and Java version 13 or higher required to access TPM protected client certificate on Windows - O365: merge first commit from https://github.com/mguessan/davmail/pull/134/ OAuth via ADFS with MFA support - O365: fix store refreshToken call - O365: introduce davmail.oauth.tokenFilePath setting to store Oauth tokens in a separate file - O365: switch to try with resource style - Drop explicit dependency to netscape.javascript package in O365InteractiveJSLogger - O365: follow redirects on ADFS authentication ### HC4: - Refactor ExchangeSessionFactory, create HttpClientAdapter in session - HC4: update winrun4j binaries - HC4: drop HttpClient 3 dependency in Maven, winrun4j binaries and nsi setup - HC4: drop remaining HttpClient 3 classes - HC4: drop DavMailCookieSpec and DavGatewaySSLProtocolSocketFactory (merge in SSLProtocolSocketFactory) - HC4: drop DavGatewayHttpClientFacade and RestMethod - HC4: default to Edge user agent - HC4: Do not enable NTLM in Kerberos mode - HC4: switch checkConfig to HttpClient 4 - HC4: merge HC4DavExchangeSession to DavExchangeSession - HC4: cleanup HC4ExchangeFormAuthenticator references - HC4: merge HC4ExchangeFormAuthenticator to ExchangeFormAuthenticator, extend authenticator interface to return HttpClientAdapter, switch to DavExchangeSession - HC4: switch O365 authenticators test code to HttpClient 4 - HC4: adjust CreateItemMethod chunked call - HC4: switch ExchangeSessionFactory to HttpClient 4 - HC4: add a warning about HttpClient 4 migration - HC4: Enable ssl logging in addition to wire with HttpClient 4 - HC4: switch EWS implementation to HttpClient 4 ### EWS: - EWS: improve isItemId detection to match base 64 encoded id - EWS: drop NTLM as a failover logic - EWS: cleanup unused code now that we have a reliable way to retrieve email address with ConvertId - EWS: drop property davmail.caldavRealUpdate, no longer used - EWS: Improved uid handling from audit - EWS: Enable Woodstox workaround for malformed xml with latest Woodstox version ### Enhancements: - Clear session pool on DavMail restart - Upgrade to Woodstox 6.2.0 as it's now available on debian, drop Woodstox patched StreamScanner ### Caldav: - Caldav: merge https://github.com/mguessan/davmail/pull/139 Fix missing XML encode - Caldav: use Exchange timezone to compute event time in test case - Caldav: create test cases for recurring events

Fix regression on domain\username authentication over IMAP and some cleanup ### IMAP: - IMAP: fix https://github.com/mguessan/davmail/issues/100 regression with domain\username authentication ### O365: - O365: set jdk.http.ntlm.transparentAuth=allHosts to enable NTLM for ADFS support ### Build: - dist cleanup - Update release guide with Fedora copr instructions - Exclude .sonarwork from source package - Build: fix release file name

This release contains a lot of bugfixes, enhancements and some user contributions from Github. Most activity is related to HttpClient 4 refactoring, this will probably be the latest version based in HttpClient 3. Minimum Java version is now 8, also dropped Growl support on MacOS. Notable changes for end users are Oauth token persistence to avoid frequent O365 authentications and OIDC support for personal outlook accounts. Known issues: some users reported regressions with form authentication, please report such regressions with log files. ### IMAP: - IMAP: catch non IOException errors in FolderLoadThread - IMAP: fix https://github.com/mguessan/davmail/pull/91 Allow user name to be specified as user@domain.com in addition to domain\user to access shared mailbox - IMAP: unquote CHARSET in IMAP search - IMAP: cleanup test cases ### Documentation: - Doc: describe new Office 365 authentication modes - Doc: remove deprecated enableEWS reference - Doc: Document new connection modes in template davmail.properties - Doc: Add all time downloads badge - Doc: push sonarcloud badges ### Enhancements: - Apply xml transformer settings recommended by Sonar - dos2unix template davmail.properties file - prepare migration to https://davmail.sourceforge.io - Settings: cleanup from audit - Latest edge user agent does not work, use Outlook 2013 instead - Convert HTTP code to Java 8 - Cleanup from audit - Fix sonar detected vulnerability - Update to Java 8 and code cleanup - Comment HttpURLConnectionWrapper - Fix regression in AbstractServer - Remove unused label - Cleanup from audit at Java 8 language level ### Security: - Enable TLSv1.1 and TLSv1.2 ### HttpClient 4: - HC4: httpClient is not shared between clients, do not track connection state to enable NTLM connection pooling - HC4: set default connection per route to 5 - HC4: refactor Exchange 2007 test cases - HC4: Prepare switch, create a temporary HC4WebDav mode - HC4: ExchangeSession cleanup - HC4: unit test cleanup - HC4: make ExchangeSession independent of HttpClient implementation - HC4: remove reference to old HttpStatus in HttpClientAdapter - HC4: more HC4ExchangeFormAuthenticator refactoring and fixes - HC4: test form authentication failure - HC4: more DavExchangeSession refactoring - HC4: more form authenticator fixes - HC4: create ResponseWrapper interface for PostRequest and GetRequest - HC4: new executeFollowRedirect implementation and get user agent from settings - HC4: cleanup from audit and fix regression, need to follow redirect after OWA authentication - HC4: more authentication test case - HC4: Implement single thread connection evictor - HC4: improve PostRequest and RestRequest - HC4: implement executePostRequest with test case - HC4: new GetRequest implementation with test case - HC4: more request refactoring - Refactor RestRequest to use ResponseHandler mode only - Refactor TestHttpClientAdapter - HC4: improve RestRequest - HC4: remove old HttpException and move to HttpResponseException - HC4: switch to HttpGet - HC4: add buildHttpException to HttpClientAdapter - HC4: cleanup from audit - HC4: keep statusLine in request - HC4: cleanup to finalize migration - HC4: convert encodeAndFixUrl - HC4: Remove old HttpStatus dependency - Remove HttpException dependency - HC4: convert Head and Post methods - HC4: convert GetMethod to HttpGet - HC4: convert remaining http client 3 methods - HC4: Implement create/delete folder - HC4: implement Exchange WebDav search request - HC4: Fix initial uri in HttpClientAdapter - HC4: convert internalGetFolder - HC4: refactor TestCaldavHttpClient4 - HC4: more test cases on session creation - HC4: convert getWellKnownFolders, first working version of session creation - HC4: convert checkPublicFolder - HC4: get httpClientAdapter from HC4ExchangeFormAuthenticator - HC4: Main test case for HC4DavExchangeSession - HC4: convert getEmailAndAliasFromOptions - HC4: convert getMailpathFromWelcomePage - HC4: baseline DavExchangeSession for HttpClient 4 migration - HTTP: Improve HttpClientAdapter, enable kerberos support according to setting - HttpClient4: improve HttpClientAdapter - HttpClient4: Test timeouts with proxy - Refactor TestHttpClient4 with try with resource ### Caldav: - Caldav: fix https://github.com/mguessan/davmail/pull/88 EXDATE timezone issue ### O365: - O365: fix https://github.com/mguessan/davmail/pull/92 failover for null query with non https URI - O365: refactor O365Authenticator and fix regressions - O365: switch to new executeFollowRedirect implementation - O365: refactor O365Authenticator - Refactor O365InteractiveJSLogger to work with more JDK versions ### Test: - Test: improve notification dialog test - Test: Improve client certificate test - Improve getReleasedVersion test case - Test: Improve base test cases - Add new harmcrest-core junit dependency ant enable IMAP test cases - Test: update junit to 4.12 - Run a SSL server socket - Test: cleanup code - Improve TestDavGateway - Make AbstractDavMailTestCase abstract - HttpClient: improve test cases ### Build: - Fix file name for Appveyor trunk builds - Fix git svn warning - try to get svn revision from git - Set jacoco path in sonar config - fix test-compile language level - Upload coverage report to sourceforge for AppVeyor - Prepare Jacoco coverage report - Cleanup unused ant check - Exclude Sonar working directory from package - Appveyor: try to run sonar from Appveyor build ### EWS: - EWS: make getPageSize static - EWS: merge PR Allow to configure EWS folder fetch page size https://github.com/mguessan/davmail/pull/79 - EWS: fix response handling - EWS: fix O365Authenticator - EWS: fix regression in O365Token - EWS: handle malformed id_token - EWS: refactor authenticators to use davmail.enableOidc - EWS: create a new davmail.enableOidc setting tp switch to new v2.0 OIDC compliant endpoint https://docs.microsoft.com/en-us/azure/active-directory/develop/azure-ad-endpoint-comparison - EWS: Prepare OIDC support, add v2.0 url in interactive authenticator - EWS: Prepare OIDC support, decode id_token - EWS: enable davmail.oauth.persistToken by default ### DAV: - DAV: MOVE returns SC_CONFLICT on missing target folder - Dav: Update to Java 8 ### SMTP: - SMTP: improve error message handling - SMTP: fix smtp test cases ### LDAP: - LDAP: clean test case - LDAP: fix dn authentication - LDAP: Ber code cleanup from audit - LDAP: update LdapConnection to Java 8 - LDAP: make parseIntWithTag protected to call it from LdapConnection - Use imported Ber implementation instead of com.sun.jndi.ldap - Import Ber implementation from OpenJDK to avoid compilation warnings ### OSX: - OSX: drop Growl support

davmail-6.3.0/src/bin/davmail0100644 0000000 0000000 00000006462 14754153477 014614 0ustar000000000 0000000 #!/bin/sh # # Usage: davmail [] # # In case of SWT crash under JDK 9/11, uninstall SWT or remove SWT cases below # BASE=$(dirname "$0") # set memory and enable DNS expiration JAVA_OPTS="-Xmx512M -Dsun.net.inetaddr.ttl=60" JAVA=java # Experimental: download Azul JRE FX with command 'davmail azul' if [ "x$1" = 'xazul' ]; then if [ "$BASE" = '/usr/bin' ]; then echo Use platform independent package to run DavMail with Azul JDK exit 1 fi if curl -L --fail -o "$BASE/jre.tgz" "https://api.azul.com/zulu/download/community/v1.0/bundles/latest/binary/?jdk_version=21&ext=tar.gz&os=linux&arch=x86&hw_bitness=64&bundle_type=jre&features=fx"; then echo Downloaded Azul JRE else echo Unable to download Azul JRE exit 1 fi; rm -Rf "$BASE/jre" mkdir "$BASE/jre" tar xvzf "$BASE/jre.tgz" -C "$BASE/jre" --strip 1 rm "$BASE/jre.tgz" echo "Downloaded latest Azul JRE, launch davmail normally" exit fi # check for embedded jre if [ -e "$BASE/jre/bin/java" ]; then JAVA=$BASE/jre/bin/java JAVA_OPTS="$JAVA_OPTS --add-exports java.base/sun.net.www.protocol.https=ALL-UNNAMED" echo "Using embedded JRE" $JAVA -version elif java -version 2>&1 >/dev/null | grep -q "version" ; then echo "Using system provided JRE" java -version if [ -e "/usr/lib/jvm/openjfx" ]; then echo "Enable OpenJFX" JAVA_OPTS="$JAVA_OPTS --add-exports java.base/sun.net.www.protocol.https=ALL-UNNAMED" JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/lib/jvm/openjfx --module-path /usr/lib/jvm/openjfx --add-modules javafx.base,javafx.controls,javafx.web,javafx.fxml,javafx.swing" elif [ -e "/usr/share/openjfx" ]; then # matches Kubuntu echo "Enable OpenJFX" JAVA_OPTS="$JAVA_OPTS --add-exports java.base/sun.net.www.protocol.https=ALL-UNNAMED" else # add JFX to classpath with OpenJDK 11 JFX_CLASSPATH=/usr/share/java/javafx-base.jar:/usr/share/java/javafx-controls.jar:/usr/share/java/javafx-fxml.jar:/usr/share/java/javafx-graphics.jar:/usr/share/java/javafx-media.jar:/usr/share/java/javafx-swing.jar:/usr/share/java/javafx-web.jar fi elif [ -e "$BASE/davmail.jar" ]; then # display message for platform independent package echo "Java not found, try davmail azul to fetch latest Azul JRE" exit 1 fi # uncomment this to force JDK 8 #JAVA=/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java if [ -e "$BASE/davmail.jar" ]; then # this is the platform independent package exec "${JAVA}" $JAVA_OPTS -cp "$BASE/davmail.jar:$BASE/lib/*:${JFX_CLASSPATH}" davmail.DavGateway "$@" elif [ -e /usr/share/java/swt.jar ]; then # SWT 3 is available JAVA_OPTS="$JAVA_OPTS -Djdk.gtk.version=2.2" export LD_LIBRARY_PATH=/usr/lib/jni exec "${JAVA}" $JAVA_OPTS -cp "/usr/share/davmail/davmail.jar:/usr/share/java/swt.jar:${JFX_CLASSPATH}:/usr/share/davmail/lib/*" davmail.DavGateway "$@" elif [ -e /usr/share/java/swt4.jar ]; then # SWT 4 is available, force GTK 2 in SWT JAVA_OPTS="$JAVA_OPTS -Djdk.gtk.version=2.2" export LD_LIBRARY_PATH=/usr/lib/jni export SWT_GTK3=0 exec "${JAVA}" $JAVA_OPTS -cp "/usr/share/davmail/davmail.jar:/usr/share/java/swt4.jar:${JFX_CLASSPATH}:/usr/share/davmail/lib/*" davmail.DavGateway "$@" else exec "${JAVA}" $JAVA_OPTS -cp "/usr/share/davmail/davmail.jar:/usr/share/davmail/lib/*:${JFX_CLASSPATH}" davmail.DavGateway "$@" fi davmail-6.3.0/src/checkstyle/checkstyle-configuration.xml0100644 0000000 0000000 00000015242 12564635036 022354 0ustar000000000 0000000 davmail-6.3.0/src/desktop/davmail.desktop0100644 0000000 0000000 00000000506 13356755113 017146 0ustar000000000 0000000 [Desktop Entry] Version=1.0 Type=Application Terminal=false Name=DavMail Comment=DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway Exec=/usr/bin/davmail Icon=davmail Categories=GTK;GNOME;Network;Email; Keywords=pop;imap;smtp;exchange;owa;outlook GenericName=DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway davmail-6.3.0/src/etc/davmail.properties0100644 0000000 0000000 00000011511 14757572750 017003 0ustar000000000 0000000 # DavMail settings, see http://davmail.sourceforge.net/ for documentation ############################################################# # Basic settings # Server or workstation mode davmail.server=true # Exchange/Office 365 connection mode: # - O365Modern Office 365 modern authentication (Oauth2) # - O365Interactive Office 365 with interactive browser window, not available in headless mode (OpenJFX required) # - O365Manual Office 365 with interactive dialog, not available in headless mode # - O365 Office 365 EWS mode # - EWS Exchange 2007 and later # - WebDav Exchange 2007 and earlier WebDav mode # - Auto WebDav mode with EWS failover davmail.mode=EWS # base Exchange OWA or EWS url davmail.url=https://outlook.office365.com/EWS/Exchange.asmx # optional: non-standard tenants #davmail.tld=us # login url, default https://login.microsoftonline.com, China https://login.chinacloudapi.cn #davmail.loginUrl=https://login.microsoftonline.com # Outlook O365 url, default https://outlook.office365.com, China https://partner.outlook.cn #davmail.outlookUrl=https://outlook.office365.com # Listener ports davmail.caldavPort=1080 davmail.imapPort=1143 davmail.ldapPort=1389 davmail.popPort=1110 davmail.smtpPort=1025 # Optional: separate file to store Oauth tokens #davmail.oauth.tokenFilePath= ############################################################# # Network settings # Network proxy settings davmail.enableProxy=false davmail.useSystemProxies=false davmail.proxyHost= davmail.proxyPort= davmail.proxyUser= davmail.proxyPassword= # proxy exclude list davmail.noProxyFor= # allow remote connection to DavMail davmail.allowRemote=true # bind server sockets to a specific address davmail.bindAddress= # client connection timeout in seconds - default 300, 0 to disable davmail.clientSoTimeout= # DavMail listeners SSL configuration davmail.ssl.keystoreType= davmail.ssl.keystoreFile= davmail.ssl.keystorePass= davmail.ssl.keyPass= # Accept specified certificate even if invalid according to trust store davmail.server.certificate.hash= # disable SSL for specified listeners davmail.ssl.nosecurecaldav=false davmail.ssl.nosecureimap=false davmail.ssl.nosecureldap=false davmail.ssl.nosecurepop=false davmail.ssl.nosecuresmtp=false # disable update check davmail.disableUpdateCheck=true # Send keepalive character during large folder and messages download davmail.enableKeepAlive=true # Message count limit on folder retrieval davmail.folderSizeLimit=0 # Default windows domain for NTLM and basic authentication davmail.defaultDomain= ############################################################# # Caldav settings # override default alarm sound davmail.caldavAlarmSound= # retrieve calendar events not older than 90 days davmail.caldavPastDelay=90 # EWS only: enable server managed meeting notifications davmail.caldavAutoSchedule=true # WebDav only: force event update to trigger ActiveSync clients update davmail.forceActiveSyncUpdate=false ############################################################# # IMAP settings # Delete messages immediately on IMAP STORE \Deleted flag davmail.imapAutoExpunge=true # To enable IDLE support, set a maximum client polling delay in minutes # Clients using IDLE should poll more frequently than this delay davmail.imapIdleDelay= # Always reply to IMAP RFC822.SIZE requests with Exchange approximate message size for performance reasons davmail.imapAlwaysApproxMsgSize= ############################################################# # POP settings # Delete messages on server after 30 days davmail.keepDelay=30 # Delete messages in server sent folder after 90 days davmail.sentKeepDelay=90 # Mark retrieved messages read on server davmail.popMarkReadOnRetr=false ############################################################# # SMTP settings # let Exchange save a copy of sent messages in Sent folder davmail.smtpSaveInSent=true ############################################################# # Loggings settings # log file path, leave empty for default path davmail.logFilePath=/var/log/davmail.log # maximum log file size, use Log4J syntax, set to 0 to use an external rotation mechanism, e.g. logrotate davmail.logFileSize=1MB # log levels log4j.logger.davmail=WARN log4j.logger.httpclient.wire=WARN log4j.logger.httpclient=WARN log4j.rootLogger=WARN ############################################################# # Workstation only settings # smartcard access settings davmail.ssl.pkcs11Config= davmail.ssl.pkcs11Library= # SSL settings for mutual authentication davmail.ssl.clientKeystoreType= davmail.ssl.clientKeystoreFile= davmail.ssl.clientKeystorePass= # disable all balloon notifications davmail.disableGuiNotifications=false # disable tray icon color switch on activity davmail.disableTrayActivitySwitch=false # disable startup balloon notifications davmail.showStartupBanner=true # enable transparent client Kerberos authentication davmail.enableKerberos=false davmail-6.3.0/src/icon/davmail.png0100644 0000000 0000000 00000020105 12702212011 015510 0ustar000000000 0000000 PNG  IHDR>agAMA7IDATxxT**`.' " UB`B[H =BzJBz!8̽sw7nvsi3gΔ;ixix7zM~:ۂGtH DoLO)1ySϠ-&ifx@+ EJJk?P`zu 86~pM =Q9DYtG'asՑv~Me %\Xhx ;b,DW?n#4g )B~$FH\|%@DpvO6i0(hDW }HibkKE\O pؘ `?Ϗv ÄO#3GKCG)*OtM^"o,F@񲁂`% A[ŏY $<.NC 5lZ71~: `-D^? (]8LXanuC y_o4 .s‡2+ra29ÈF2&#{+u*X!g Izh8&xBw?φKE0d%rI3>d!P0P$WəoC6wxOx {mNx&~z*,b";: 637 JYu~(w05ף 2#2bYF@80[Bnk@7i7#!5"$b'@~z7 Kײ_@:kmrl6f q/"GX?I|OanDѨ(U:!ke8E$ ɟgF`0LJ<,u'^oB [ߺEa mx(/ECE~J(/%?PN@n }5bQ#0[qv5s{x!ىAP^II 3t5]r#p AGb(~sC/H(dŻ(w쉷E?G*䥺nmZ,5 s$8o:ħ|oA\F+J#}0҇ʲ(.?JRQʶͼŋO0Pپ񏢻O8T]'nAzUB- ?LmU qI>CB.!*~Ue4 :~F:fʎCn>l`a#o[X'obOS$)f9Zm.JQ)W;k}Y.^;D`?OװB$؅AF/ {\ifZ/>gyp@^go5һa(d9)y]^;;/0&JL|Y#G> O)hi?=G&&?_bRpiR2ʹyͪU#7eo 9 D^;lER%;x)ƓMyA+f)35/7B"JL/~C1ְBZ$G`!,ZB?C* B\d3w~7ZT3) v*xe8+d!hfnoVdoGCIraovu&y]͋} C %tU'pyX dBvKj`LPl_D?q~N#*/&~ uZdVu%w],^|egUiQf^@&39فvہ'/.GoYmg( ;`[-f(Z.2 dhIGX&*g]@7/ ' "~^l0EzmIWM֦N@[tHׁNXYwhů*/!}diJy#_|&:1&Pt$Y\j. ? 9KO\X;Gkc[`=:Ӓ<[dI9xo> wH,_g: %$:kAſlϧ $Aj ,FU,e6, +rS XQ;Ai0/>eioqk>@H} +4\N|6$G.>7M2a:J7P2zOyF}G&wPj 2=0͙fҦ?HŽ&GqS B Pb[0Xŧؽ 4?`:{!$H9,zj2Ax/=_]H6- q0ָ@!9$H@CHSG'Ly$Ⳏ'./L{R> h/Um ]n =-r.P $ޤc5Ak&ߵ<ˊI6aqt*;yWߞ.xNNY.lBbE"CKĺV"X5$?͓MXVw=cb'OI; Ř0 abU'+Z3梇4di'RYjPS'Eo[rmD_#5 l`k1h{ )p̴(gI7X v5иO7pi$UHš,70N}c4i j;T0^vqhXn*vqE.$(ⷊ[o|riQ֏O?5Gw5~i^~L&^(#_Hs=Y um= m ˋڅ[J۷])xP{[2=eiި?mp+^|J6Zm?d/B~߆qv\:r; 7PѲo[ 7 <$a[$-rzG0Kt #(w7EWtn9"\u3& YHņAM^7tWbuV$Y}?mPw$KCV I'WȾ}KR_ 8ͯM0aM J hܝē|jK%3zU.ڭf@tW0 i[J1_mސtf `lٰma$(? 5ylmf:̯^23w=1B/q9]jp\%)ta|[P29hś$!y߅/1zirY߄6q`Fǥrzy̟dڎ{r% S]Y 7M 0 (˪͛@,y$O6S]Hts dF}7P ХB g1kz"mQTm 9KpWGtg*7 ൖ']ˡf㺀ߛM)騸ϘwWoEn [h>[M\h/ Amֲ7 `uV8 sl=troOenF[S2ӖOe>p P ]`8oK:]m6?p5of~K6adu߻ dGؙgkz=w,{ P&Ai,-^+ĭu4e՗JyݙU`C4~K~*] U,x5(X<ko.G-YZ#ꧮߎ-jO`aC  eMCEV"@JW>CB/V\i`۽cgn "=X2# |SJשs/xe3$=ilU,'L{txf^ 1ta|aȪ/O~#Q2ԭr)wlܟ|ĢFb@#H_6|oku<ݙFn[z>6_ڇg;?ՅEN|E#xVLְi8$ˌ`<`L[id$t%+J3wg^Ox/lh?.x AAXɿ3H\`2~Yu°7e|)gPk_"Fuj`[ߎ yO6!vGF3@WnVo!tP%2½\SQ5tNς3a;[_vhorSe=Ax=f -YkA,~Է>1H~'G@|A&eQ/ | x N_La,{Ms-7ipYþȌn~ȦSA|ͶPTk%9LHule3_Xc0> STW% wUkU6CdQ 38aBzl6CX כub^? Ⅷ-Y/|M+db˄tmcz̰:1ޖylhjpflMِтk̰*y ts~VIENDB`davmail-6.3.0/src/init/davmail-init0100644 0000000 0000000 00000004417 13357210410 015721 0ustar000000000 0000000 #!/bin/sh # # davmail: davmail exchange gateway daemon # # chkconfig: 345 98 02 # description: DavMail gateway for Microsoft Exchange # processname: davmail # config: /etc/davmail.properties # LSB init-info ### BEGIN INIT INFO # Provides: davmail # Required-Start: $network # Required-Stop: $network # Default-Start: 2 3 5 # Default-Stop: 0 1 6 # Short-Description: DavMail gateway for Microsoft Exchange ### END INIT INFO # Source function library. if [ -e /etc/init.d/functions ]; then . /etc/init.d/functions fi # Check that networking is configured. [ "${NETWORKING}" = "no" ] && exit 0 DAVMAIL_CONF=/etc/davmail.properties test -f $DAVMAIL_CONF || exit 4 DAVMAIL_HOME=/var/lib/davmail test -d $DAVMAIL_HOME || exit 5 LOGFILE=/var/log/davmail.log PIDFILE=/var/run/davmail.pid LOCKFILE=/var/run/davmail.lock start() { echo -n $"Starting DavMail gateway: " dostatus > /dev/null 2>&1 if [ $RETVAL -eq 0 ] then echo -n $"DavMail gateway already running" echo_failure RETVAL=1 return fi su - davmail -s /bin/sh -c "exec nohup $DAVMAIL_HOME/davmail $DAVMAIL_CONF >> $LOGFILE 2>&1 &" RETVAL=$? if [ $RETVAL -eq 0 ] then sleep 1 cat $DAVMAIL_HOME/pid > $PIDFILE touch $LOCKFILE echo_success else echo_failure fi return $RETVAL } stop() { echo -n $"Shutting down DavMail gateway: " kill $(cat $PIDFILE 2>/dev/null) > /dev/null 2>&1 RETVAL=$? sleep 1 if [ $RETVAL -eq 0 ] then rm -f $PIDFILE $LOCKFILE echo_success else echo_failure fi return $RETVAL } restart() { stop start } condrestart() { [ -f $LOCKFILE ] && restart || : } dostatus() { kill -0 $(cat $PIDFILE 2>/dev/null) > /dev/null 2>&1 RETVAL=$? if [ $RETVAL -eq 0 ] then echo "DavMail gateway (pid $(cat $PIDFILE 2>/dev/null)) is running..." else if [ -f $PIDFILE ] then echo "DavMail gateway dead but pid file exists" RETVAL=1 return fi if [ -f $LOCKFILE ] then echo "DavMail gateway dead but subsys locked" RETVAL=2 return fi echo "DavMail gateway is stopped" RETVAL=3 fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) dostatus ;; restart|reload) restart ;; condrestart) condrestart ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}" exit 1 esac exit $RETVAL davmail-6.3.0/src/init/davmail-logrotate0100644 0000000 0000000 00000000200 13357210410 016740 0ustar000000000 0000000 /var/log/davmail.log { copytruncate missingok notifempty size 30k monthly create 0640 davmail davmail } davmail-6.3.0/src/init/davmail-wrapper0100644 0000000 0000000 00000000410 13357210410 016423 0ustar000000000 0000000 #!/bin/sh # davmail owns davmail.log LOGFILE=/var/log/davmail.log # davmail owned pidfile PIDFILE=/var/lib/davmail/pid echo $$ > ${PIDFILE} exec java -cp /usr/share/davmail/davmail.jar:/usr/share/davmail/lib/* \ davmail.DavGateway "$@" >> ${LOGFILE} 2>&1 davmail-6.3.0/src/init/davmail.service0100644 0000000 0000000 00000001124 13760147443 016424 0ustar000000000 0000000 [Unit] Description=Davmail Exchange gateway Documentation=http://davmail.sourceforge.net/serversetup.html Documentation=http://davmail.sourceforge.net/advanced.html Documentation=http://davmail.sourceforge.net/sslsetup.html After=network.target [Service] Type=simple User=davmail PermissionsStartOnly=true AmbientCapabilities=CAP_NET_BIND_SERVICE ExecStartPre=/usr/bin/touch /var/log/davmail.log ExecStartPre=/bin/chown davmail:davmail /var/log/davmail.log ExecStart=/usr/bin/davmail -server /etc/davmail.properties SuccessExitStatus=143 [Install] WantedBy=multi-user.target davmail-6.3.0/src/java/davmail/AbstractConnection.java0100644 0000000 0000000 00000022536 14545543571 021464 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail; import davmail.exception.DavMailException; import davmail.exchange.ExchangeSession; import davmail.ui.tray.DavGatewayTray; import org.apache.log4j.Logger; import java.io.*; import java.net.Socket; import java.nio.charset.StandardCharsets; /** * Generic connection common to pop3 and smtp implementations */ public abstract class AbstractConnection extends Thread implements Closeable { protected enum State { INITIAL, LOGIN, USER, PASSWORD, AUTHENTICATED, STARTMAIL, RECIPIENT, MAILDATA } protected static class LineReaderInputStream extends PushbackInputStream { final String encoding; protected LineReaderInputStream(InputStream in, String encoding) { super(in); if (encoding == null) { this.encoding = "ASCII"; } else { this.encoding = encoding; } } public String readLine() throws IOException { ByteArrayOutputStream baos = null; int b; while ((b = read()) > -1) { if (b == '\r') { int next = read(); if (next != '\n') { unread(next); } break; } else if (b == '\n') { break; } if (baos == null) { baos = new ByteArrayOutputStream(); } baos.write(b); } if (baos != null) { return baos.toString(encoding); } else { return null; } } /** * Read byteSize bytes from inputStream, return content as String. * * @param byteSize content size * @return content * @throws IOException on error */ public String readContentAsString(int byteSize) throws IOException { return new String(readContent(byteSize), encoding); } /** * Read byteSize bytes from inputStream, return content as byte array. * * @param byteSize content size * @return content * @throws IOException on error */ public byte[] readContent(int byteSize) throws IOException { byte[] buffer = new byte[byteSize]; int startIndex = 0; int count = 0; while (count >= 0 && startIndex < byteSize) { count = read(buffer, startIndex, byteSize - startIndex); startIndex += count; } if (startIndex < byteSize) { throw new DavMailException("EXCEPTION_END_OF_STREAM"); } return buffer; } } protected final Socket client; protected LineReaderInputStream in; protected OutputStream os; // user name and password initialized through connection protected String userName; protected String password; // connection state protected State state = State.INITIAL; // Exchange session proxy protected ExchangeSession session; /** * Only set the thread name and socket * * @param name thread type name * @param clientSocket client socket */ public AbstractConnection(String name, Socket clientSocket) { super(name + '-' + clientSocket.getPort()); this.client = clientSocket; setDaemon(true); } /** * Initialize the streams and set thread name. * * @param name thread type name * @param clientSocket client socket * @param encoding socket stream encoding */ public AbstractConnection(String name, Socket clientSocket, String encoding) { super(name + '-' + clientSocket.getPort()); this.client = clientSocket; logConnection("CONNECT", ""); try { in = new LineReaderInputStream(client.getInputStream(), encoding); os = new BufferedOutputStream(client.getOutputStream()); } catch (IOException e) { close(); DavGatewayTray.error(new BundleMessage("LOG_EXCEPTION_GETTING_SOCKET_STREAMS"), e); } } public void logConnection(String action, String userName) { Logger.getLogger("davmail.connection").info(action+" - "+client.getInetAddress().getHostAddress()+":"+client.getPort()+" " + userName); } /** * Send message to client followed by CRLF. * * @param message message * @throws IOException on error */ public void sendClient(String message) throws IOException { sendClient(null, message); } /** * Send prefix and message to client followed by CRLF. * * @param prefix prefix * @param message message * @throws IOException on error */ public void sendClient(String prefix, String message) throws IOException { if (prefix != null) { os.write(prefix.getBytes(StandardCharsets.UTF_8)); DavGatewayTray.debug(new BundleMessage("LOG_SEND_CLIENT_PREFIX_MESSAGE", prefix, message)); } else { DavGatewayTray.debug(new BundleMessage("LOG_SEND_CLIENT_MESSAGE", message)); } os.write(message.getBytes(StandardCharsets.UTF_8)); os.write((char) 13); os.write((char) 10); os.flush(); } /** * Send only bytes to client. * * @param messageBytes content * @throws IOException on error */ public void sendClient(byte[] messageBytes) throws IOException { sendClient(messageBytes, 0, messageBytes.length); } /** * Send only bytes to client. * * @param messageBytes content * @param offset the start offset in the data. * @param length the number of bytes to write. * @throws IOException on error */ public void sendClient(byte[] messageBytes, int offset, int length) throws IOException { //StringBuffer logBuffer = new StringBuffer("> "); //logBuffer.append(new String(messageBytes, offset, length)); //DavGatewayTray.debug(logBuffer.toString()); os.write(messageBytes, offset, length); os.flush(); } /** * Read a line from the client connection. * Log message to logger * * @return command line or null * @throws IOException when unable to read line */ public String readClient() throws IOException { String line = in.readLine(); if (line != null) { if (line.startsWith("PASS")) { DavGatewayTray.debug(new BundleMessage("LOG_READ_CLIENT_PASS")); // SMTP LOGIN } else if (line.startsWith("AUTH LOGIN ")) { DavGatewayTray.debug(new BundleMessage("LOG_READ_CLIENT_AUTH_LOGIN")); // IMAP LOGIN } else if (state == State.INITIAL && line.indexOf(' ') >= 0 && line.substring(line.indexOf(' ') + 1).toUpperCase().startsWith("LOGIN")) { DavGatewayTray.debug(new BundleMessage("LOG_READ_CLIENT_LOGIN")); } else if (state == State.PASSWORD) { DavGatewayTray.debug(new BundleMessage("LOG_READ_CLIENT_PASSWORD")); // HTTP Basic Authentication } else if (line.startsWith("Authorization:")) { DavGatewayTray.debug(new BundleMessage("LOG_READ_CLIENT_AUTHORIZATION")); } else if (line.startsWith("AUTH PLAIN")) { DavGatewayTray.debug(new BundleMessage("LOG_READ_CLIENT_AUTH_PLAIN")); } else { DavGatewayTray.debug(new BundleMessage("LOG_READ_CLIENT_LINE", line)); } } DavGatewayTray.switchIcon(); return line; } /** * Close client connection, streams and Exchange session . */ public void close() { logConnection("DISCONNECT", ""); if (in != null) { try { in.close(); } catch (IOException e2) { // ignore } } if (os != null) { try { os.close(); } catch (IOException e2) { // ignore } } try { client.close(); } catch (IOException e2) { DavGatewayTray.debug(new BundleMessage("LOG_EXCEPTION_CLOSING_CLIENT_SOCKET"), e2); } } } davmail-6.3.0/src/java/davmail/AbstractServer.java0100644 0000000 0000000 00000023113 14575630005 020613 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail; import davmail.exception.DavMailException; import davmail.ui.tray.DavGatewayTray; import javax.net.ServerSocketFactory; import javax.net.ssl.*; import java.io.FileInputStream; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.security.*; import java.security.cert.CertificateException; import java.util.HashSet; /** * Generic abstract server common to SMTP and POP3 implementations */ public abstract class AbstractServer extends Thread { protected boolean nosslFlag; // will cause same behavior as before with unchanged config files private final int port; private ServerSocket serverSocket; /** * Get server protocol name (SMTP, POP, IMAP, ...). * * @return server protocol name */ public abstract String getProtocolName(); /** * Server socket TCP port * * @return port */ public int getPort() { return port; } /** * Create a ServerSocket to listen for connections. * Start the thread. * * @param name thread name * @param port tcp socket chosen port * @param defaultPort tcp socket default port */ protected AbstractServer(String name, int port, int defaultPort) { super(name); setDaemon(true); if (port == 0) { this.port = defaultPort; } else { this.port = port; } } /** * Bind server socket on defined port. * * @throws DavMailException unable to create server socket */ public void bind() throws DavMailException { String bindAddress = Settings.getProperty("davmail.bindAddress"); String keystoreFile = Settings.getProperty("davmail.ssl.keystoreFile"); ServerSocketFactory serverSocketFactory; if (keystoreFile == null || keystoreFile.isEmpty() || nosslFlag) { serverSocketFactory = ServerSocketFactory.getDefault(); } else { try { // SSLContext is environment for implementing JSSE... // create ServerSocketFactory SSLContext sslContext = SSLContext.getInstance("TLS"); // initialize sslContext to work with key managers sslContext.init(getKeyManagers(), getTrustManagers(), null); // create ServerSocketFactory from sslContext serverSocketFactory = sslContext.getServerSocketFactory(); } catch (IOException | GeneralSecurityException ex) { throw new DavMailException("LOG_EXCEPTION_CREATING_SSL_SERVER_SOCKET", getProtocolName(), port, ex.getMessage() == null ? ex.toString() : ex.getMessage()); } } try { // create the server socket if (bindAddress == null || bindAddress.isEmpty()) { serverSocket = serverSocketFactory.createServerSocket(port); } else { serverSocket = serverSocketFactory.createServerSocket(port, 0, InetAddress.getByName(bindAddress)); } if (serverSocket instanceof SSLServerSocket) { // CVE-2014-3566 disable SSLv3 HashSet protocols = new HashSet<>(); for (String protocol : ((SSLServerSocket) serverSocket).getEnabledProtocols()) { if (!protocol.startsWith("SSL")) { protocols.add(protocol); } } ((SSLServerSocket) serverSocket).setEnabledProtocols(protocols.toArray(new String[0])); ((SSLServerSocket) serverSocket).setNeedClientAuth(Settings.getBooleanProperty("davmail.ssl.needClientAuth", false)); } } catch (IOException e) { throw new DavMailException("LOG_SOCKET_BIND_FAILED", getProtocolName(), port); } } /** * Build trust managers from truststore file. * * @return trust managers * @throws CertificateException on error * @throws NoSuchAlgorithmException on error * @throws IOException on error * @throws KeyStoreException on error */ protected TrustManager[] getTrustManagers() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException { String truststoreFile = Settings.getProperty("davmail.ssl.truststoreFile"); if (truststoreFile == null || truststoreFile.isEmpty()) { return null; } try (FileInputStream trustStoreInputStream = new FileInputStream(truststoreFile)) { KeyStore trustStore = KeyStore.getInstance(Settings.getProperty("davmail.ssl.truststoreType")); trustStore.load(trustStoreInputStream, Settings.getCharArrayProperty("davmail.ssl.truststorePass")); TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); return tmf.getTrustManagers(); } } /** * Build key managers from keystore file. * * @return key managers * @throws CertificateException on error * @throws NoSuchAlgorithmException on error * @throws IOException on error * @throws KeyStoreException on error */ protected KeyManager[] getKeyManagers() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException, UnrecoverableKeyException { String keystoreFile = Settings.getProperty("davmail.ssl.keystoreFile"); if (keystoreFile == null || keystoreFile.isEmpty()) { return null; } try (FileInputStream keyStoreInputStream = new FileInputStream(keystoreFile)) { KeyStore keystore = KeyStore.getInstance(Settings.getProperty("davmail.ssl.keystoreType")); keystore.load(keyStoreInputStream, Settings.getCharArrayProperty("davmail.ssl.keystorePass")); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keystore, Settings.getCharArrayProperty("davmail.ssl.keyPass")); return kmf.getKeyManagers(); } } /** * The body of the server thread. Loop forever, listening for and * accepting connections from clients. For each connection, * create a Connection object to handle communication through the * new Socket. */ @Override public void run() { AbstractConnection connection = null; Socket clientSocket = null; try { while (!serverSocket.isClosed()) { clientSocket = serverSocket.accept(); // set default timeout to 5 minutes clientSocket.setSoTimeout(Settings.getIntProperty("davmail.clientSoTimeout", 300) * 1000); DavGatewayTray.debug(new BundleMessage("LOG_CONNECTION_FROM", clientSocket.getInetAddress(), port)); // only accept localhost connections for security reasons if (Settings.getBooleanProperty("davmail.allowRemote") || clientSocket.getInetAddress().isLoopbackAddress() || // OSX link local address on loopback interface clientSocket.getInetAddress().equals(InetAddress.getByAddress(new byte[]{(byte) 0xfe, (byte) 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}) )) { connection = createConnectionHandler(clientSocket); connection.start(); } else { DavGatewayTray.warn(new BundleMessage("LOG_EXTERNAL_CONNECTION_REFUSED")); } } } catch (IOException e) { // do not warn if exception on socket close (gateway restart) if (!serverSocket.isClosed()) { DavGatewayTray.warn(new BundleMessage("LOG_EXCEPTION_LISTENING_FOR_CONNECTIONS"), e); } } finally { try { if (clientSocket != null) { clientSocket.close(); } } catch (IOException e) { DavGatewayTray.warn(new BundleMessage("LOG_EXCEPTION_CLOSING_CLIENT_SOCKET"), e); } if (connection != null) { connection.close(); } } } /** * Create a connection handler for the current listener. * * @param clientSocket client socket * @return connection handler */ public abstract AbstractConnection createConnectionHandler(Socket clientSocket); /** * Close server socket */ public void close() { try { if (serverSocket != null) { serverSocket.close(); } } catch (IOException e) { DavGatewayTray.warn(new BundleMessage("LOG_EXCEPTION_CLOSING_SERVER_SOCKET"), e); } } } davmail-6.3.0/src/java/davmail/BundleMessage.java0100644 0000000 0000000 00000016450 14575630005 020405 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail; import davmail.exception.DavMailException; import java.io.Serializable; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Locale; import java.util.ResourceBundle; /** * Internationalization message. */ public class BundleMessage implements Serializable { /** * Root locale to get english messages for logging. */ public static final Locale ROOT_LOCALE = Locale.ROOT; protected static final String MESSAGE_BUNDLE_NAME = "davmailmessages"; protected final String key; private final Object[] arguments; /** * Internationalization message. * * @param key message key in resource bundle * @param arguments message values */ public BundleMessage(String key, Object... arguments) { this.key = key; this.arguments = arguments; } /** * Format message with the default locale. * * @return formatted message */ public String format() { return format(null); } /** * Format message with the given locale. * * @param locale resource bundle locale * @return formatted message */ public String format(Locale locale) { return BundleMessage.format(locale, key, arguments); } /** * Format message for logging (with the root locale). * Log file should remain in english * * @return log formatted message */ public String formatLog() { return format(ROOT_LOCALE); } /** * Format message for logging (with the root locale). * Log file should remain in english * * @return log formatted message */ @Override public String toString() { return formatLog(); } /** * Get bundle for the given locale. * Load the properties file for the given locale in a resource bundle * * @param locale resource bundle locale * @return resource bundle */ protected static ResourceBundle getBundle(Locale locale) { if (locale == null) { return ResourceBundle.getBundle(MESSAGE_BUNDLE_NAME); } else { return ResourceBundle.getBundle(MESSAGE_BUNDLE_NAME, locale); } } /** * Get formatted message for message key and values with the default locale. * * @param key message key in resource bundle * @param arguments message values * @return formatted message */ public static String format(String key, Object... arguments) { return format(null, key, arguments); } /** * Get formatted message for message key and values with the given locale. * * @param locale resource bundle locale * @param key message key in resource bundle * @param arguments message values * @return formatted message */ public static String format(Locale locale, String key, Object... arguments) { Object[] formattedArguments = null; if (arguments != null) { formattedArguments = new Object[arguments.length]; for (int i = 0; i < arguments.length; i++) { if (arguments[i] instanceof BundleMessage) { formattedArguments[i] = ((BundleMessage) arguments[i]).format(locale); } else if (arguments[i] instanceof BundleMessageList) { StringBuilder buffer = new StringBuilder(); for (BundleMessage bundleMessage : (BundleMessageList) arguments[i]) { buffer.append(bundleMessage.format(locale)); } formattedArguments[i] = buffer.toString(); } else if (arguments[i] instanceof DavMailException) { formattedArguments[i] = ((DavMailException) arguments[i]).getMessage(locale); } else if (arguments[i] instanceof Throwable) { formattedArguments[i] = ((Throwable) arguments[i]).getMessage(); if (formattedArguments[i] == null) { formattedArguments[i] = arguments[i].toString(); } } else { formattedArguments[i] = arguments[i]; } } } return MessageFormat.format(getBundle(locale).getString(key), formattedArguments); } /** * Get formatted log message for message key and values. * Use the root locale * * @param key message key in resource bundle * @param arguments message values * @return formatted message */ public static String formatLog(String key, Object... arguments) { return format(ROOT_LOCALE, key, arguments); } /** * Get formatted error message for bundle message and exception for logging. * Use the root locale * * @param message bundle message * @param e exception * @return formatted message */ public static String getExceptionLogMessage(BundleMessage message, Exception e) { return getExceptionMessage(message, e, ROOT_LOCALE); } /** * Get formatted error message for bundle message and exception with default locale. * * @param message bundle message * @param e exception * @return formatted message */ public static String getExceptionMessage(BundleMessage message, Exception e) { return getExceptionMessage(message, e, null); } /** * Get formatted error message for bundle message and exception with given locale. * * @param message bundle message * @param e exception * @param locale bundle locale * @return formatted message */ public static String getExceptionMessage(BundleMessage message, Exception e, Locale locale) { StringBuilder buffer = new StringBuilder(); if (message != null) { buffer.append(message.format(locale)).append(' '); } if (e instanceof DavMailException) { buffer.append(((DavMailException) e).getMessage(locale)); } else if (e.getMessage() != null) { buffer.append(e.getMessage()); } else { buffer.append(e); } return buffer.toString(); } /** * Typed bundle message collection */ public static class BundleMessageList extends ArrayList { } } davmail-6.3.0/src/java/davmail/DavGateway.java0100644 0000000 0000000 00000023177 14603561352 017727 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail; import davmail.caldav.CaldavServer; import davmail.exception.DavMailException; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.auth.ExchangeAuthenticator; import davmail.http.HttpClientAdapter; import davmail.http.request.GetRequest; import davmail.imap.ImapServer; import davmail.ldap.LdapServer; import davmail.pop.PopServer; import davmail.smtp.SmtpServer; import davmail.ui.tray.DavGatewayTray; import org.apache.log4j.Logger; import java.awt.*; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; /** * DavGateway main class */ public final class DavGateway { private static final Logger LOGGER = Logger.getLogger(DavGateway.class); private static final String HTTP_DAVMAIL_SOURCEFORGE_NET_VERSION_TXT = "https://davmail.sourceforge.net/version.txt"; private static final Object LOCK = new Object(); private static boolean shutdown = false; private DavGateway() { } private static final ArrayList SERVER_LIST = new ArrayList<>(); /** * Start the gateway, listen on specified smtp and pop3 ports * * @param args command line parameter config file path */ public static void main(String[] args) { boolean notray = false; boolean server = false; boolean token = false; for (String arg : args) { if (arg.startsWith("-")) { if ("-notray".equals(arg)) { notray = true; } else if ("-server".equals(arg)) { server = true; } else if ("-token".equals(arg)) { token = true; } } else { Settings.setConfigFilePath(arg); } } Settings.load(); if (token) { try { ExchangeAuthenticator authenticator = (ExchangeAuthenticator) Class.forName("davmail.exchange.auth.O365InteractiveAuthenticator") .getDeclaredConstructor().newInstance(); authenticator.setUsername(""); authenticator.authenticate(); System.out.println(authenticator.getToken().getRefreshToken()); } catch (IOException | ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { System.err.println(e+" "+e.getMessage()); } // force shutdown on Linux System.exit(0); } else { if (GraphicsEnvironment.isHeadless()) { // force server mode LOGGER.debug("Headless mode, do not create GUI"); server = true; } if (server) { Settings.setProperty("davmail.server", "true"); Settings.updateLoggingConfig(); } if (Settings.getBooleanProperty("davmail.server")) { LOGGER.debug("Start DavMail in server mode"); } else { LOGGER.debug("Start DavMail in GUI mode"); DavGatewayTray.init(notray); } start(); // server mode: all threads are daemon threads, do not let main stop if (Settings.getBooleanProperty("davmail.server")) { Runtime.getRuntime().addShutdownHook(new Thread("Shutdown") { @Override public void run() { shutdown = true; DavGatewayTray.debug(new BundleMessage("LOG_GATEWAY_INTERRUPTED")); DavGateway.stop(); synchronized (LOCK) { LOCK.notifyAll(); } } }); synchronized (LOCK) { try { while (!shutdown) { LOCK.wait(); } } catch (InterruptedException e) { DavGatewayTray.debug(new BundleMessage("LOG_GATEWAY_INTERRUPTED")); Thread.currentThread().interrupt(); } } } } } /** * Start DavMail listeners. */ public static void start() { SERVER_LIST.clear(); int smtpPort = Settings.getIntProperty("davmail.smtpPort"); if (smtpPort != 0) { SERVER_LIST.add(new SmtpServer(smtpPort)); } int popPort = Settings.getIntProperty("davmail.popPort"); if (popPort != 0) { SERVER_LIST.add(new PopServer(popPort)); } int imapPort = Settings.getIntProperty("davmail.imapPort"); if (imapPort != 0) { SERVER_LIST.add(new ImapServer(imapPort)); } int caldavPort = Settings.getIntProperty("davmail.caldavPort"); if (caldavPort != 0) { SERVER_LIST.add(new CaldavServer(caldavPort)); } int ldapPort = Settings.getIntProperty("davmail.ldapPort"); if (ldapPort != 0) { SERVER_LIST.add(new LdapServer(ldapPort)); } BundleMessage.BundleMessageList messages = new BundleMessage.BundleMessageList(); BundleMessage.BundleMessageList errorMessages = new BundleMessage.BundleMessageList(); for (AbstractServer server : SERVER_LIST) { try { server.bind(); server.start(); messages.add(new BundleMessage("LOG_PROTOCOL_PORT", server.getProtocolName(), server.getPort())); } catch (DavMailException e) { errorMessages.add(e.getBundleMessage()); } } final String currentVersion = getCurrentVersion(); boolean showStartupBanner = Settings.getBooleanProperty("davmail.showStartupBanner", true); if (showStartupBanner) { DavGatewayTray.info(new BundleMessage("LOG_DAVMAIL_GATEWAY_LISTENING", currentVersion, messages)); } if (!errorMessages.isEmpty()) { DavGatewayTray.error(new BundleMessage("LOG_MESSAGE", errorMessages)); } // check for new version in a separate thread new Thread("CheckRelease") { @Override public void run() { String releasedVersion = getReleasedVersion(); if (!currentVersion.isEmpty() && releasedVersion != null && currentVersion.compareTo(releasedVersion) < 0) { DavGatewayTray.info(new BundleMessage("LOG_NEW_VERSION_AVAILABLE", releasedVersion)); } } }.start(); } /** * Stop all listeners, shutdown connection pool and clear session cache. */ public static void stop() { DavGateway.stopServers(); // close pooled connections ExchangeSessionFactory.shutdown(); DavGatewayTray.info(new BundleMessage("LOG_GATEWAY_STOP")); DavGatewayTray.dispose(); } /** * Stop all listeners and clear session cache. */ public static void restart() { DavGateway.stopServers(); // clear session cache ExchangeSessionFactory.shutdown(); DavGateway.start(); } private static void stopServers() { for (AbstractServer server : SERVER_LIST) { server.close(); try { server.join(); } catch (InterruptedException e) { DavGatewayTray.warn(new BundleMessage("LOG_EXCEPTION_WAITING_SERVER_THREAD_DIE"), e); Thread.currentThread().interrupt(); } } } /** * Get current DavMail version. * * @return current version */ public static String getCurrentVersion() { Package davmailPackage = DavGateway.class.getPackage(); String currentVersion = davmailPackage.getImplementationVersion(); if (currentVersion == null) { currentVersion = ""; } return currentVersion; } /** * Get latest released version from SourceForge. * * @return latest version */ public static String getReleasedVersion() { String version = null; if (!Settings.getBooleanProperty("davmail.disableUpdateCheck")) { try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(HTTP_DAVMAIL_SOURCEFORGE_NET_VERSION_TXT)) { GetRequest getRequest = new GetRequest(HTTP_DAVMAIL_SOURCEFORGE_NET_VERSION_TXT); getRequest = httpClientAdapter.executeFollowRedirect(getRequest); version = getRequest.getResponseBodyAsString(); LOGGER.debug("DavMail released version: " + version); } catch (IOException e) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_GET_RELEASED_VERSION")); } } return version; } } davmail-6.3.0/src/java/davmail/Settings.java0100644 0000000 0000000 00000072307 14754417473 017505 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail; import davmail.ui.tray.DavGatewayTray; import org.apache.log4j.*; import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.PosixFilePermissions; import java.util.*; import static org.apache.http.util.TextUtils.isEmpty; /** * Settings facade. * DavMail settings are stored in the .davmail.properties file in current * user home directory or in the file specified on the command line. */ public final class Settings { private static final Logger LOGGER = Logger.getLogger(Settings.class); public static final String OUTLOOK_URL = "https://outlook.office365.com"; public static final String O365_URL = OUTLOOK_URL+"/EWS/Exchange.asmx"; public static final String GRAPH_URL = "https://graph.microsoft.com"; public static final String O365_LOGIN_URL = "https://login.microsoftonline.com"; public static final String O365 = "O365"; public static final String O365_MODERN = "O365Modern"; public static final String O365_INTERACTIVE = "O365Interactive"; public static final String O365_MANUAL = "O365Manual"; public static final String WEBDAV = "WebDav"; public static final String EWS = "EWS"; public static final String AUTO = "Auto"; public static final String EDGE_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.49"; private Settings() { } private static final Properties SETTINGS_PROPERTIES = new Properties() { @Override public synchronized Enumeration keys() { Enumeration keysEnumeration = super.keys(); TreeSet sortedKeySet = new TreeSet<>(); while (keysEnumeration.hasMoreElements()) { sortedKeySet.add((String) keysEnumeration.nextElement()); } final Iterator sortedKeysIterator = sortedKeySet.iterator(); return new Enumeration() { public boolean hasMoreElements() { return sortedKeysIterator.hasNext(); } public Object nextElement() { return sortedKeysIterator.next(); } }; } }; private static String configFilePath; private static boolean isFirstStart; /** * Set config file path (from command line parameter). * * @param path davmail properties file path */ public static synchronized void setConfigFilePath(String path) { configFilePath = path; } /** * Detect first launch (properties file does not exist). * * @return true if this is the first start with the current file path */ public static synchronized boolean isFirstStart() { return isFirstStart; } /** * Load properties from provided stream (used in webapp mode). * * @param inputStream properties stream * @throws IOException on error */ public static synchronized void load(InputStream inputStream) throws IOException { SETTINGS_PROPERTIES.load(inputStream); updateLoggingConfig(); } /** * Load properties from current file path (command line or default). */ public static synchronized void load() { try { if (configFilePath == null) { //noinspection AccessOfSystemProperties configFilePath = System.getProperty("user.home") + "/.davmail.properties"; } File configFile = new File(configFilePath); if (configFile.exists()) { try (FileInputStream fileInputStream = new FileInputStream(configFile)) { load(fileInputStream); } } else { isFirstStart = true; // first start : set default values, ports above 1024 for unix/linux setDefaultSettings(); save(); } } catch (IOException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_LOAD_SETTINGS"), e); } updateLoggingConfig(); } /** * Set all settings to default values. * Ports above 1024 for unix/linux */ public static void setDefaultSettings() { SETTINGS_PROPERTIES.put("davmail.mode", "EWS"); SETTINGS_PROPERTIES.put("davmail.url", getO365Url()); SETTINGS_PROPERTIES.put("davmail.popPort", "1110"); SETTINGS_PROPERTIES.put("davmail.imapPort", "1143"); SETTINGS_PROPERTIES.put("davmail.smtpPort", "1025"); SETTINGS_PROPERTIES.put("davmail.caldavPort", "1080"); SETTINGS_PROPERTIES.put("davmail.ldapPort", "1389"); SETTINGS_PROPERTIES.put("davmail.clientSoTimeout", ""); SETTINGS_PROPERTIES.put("davmail.keepDelay", "30"); SETTINGS_PROPERTIES.put("davmail.sentKeepDelay", "0"); SETTINGS_PROPERTIES.put("davmail.caldavPastDelay", "0"); SETTINGS_PROPERTIES.put("davmail.caldavAutoSchedule", Boolean.TRUE.toString()); SETTINGS_PROPERTIES.put("davmail.imapIdleDelay", ""); SETTINGS_PROPERTIES.put("davmail.folderSizeLimit", ""); SETTINGS_PROPERTIES.put("davmail.enableKeepAlive", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.allowRemote", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.bindAddress", ""); SETTINGS_PROPERTIES.put("davmail.useSystemProxies", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.enableProxy", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.enableKerberos", "false"); SETTINGS_PROPERTIES.put("davmail.disableUpdateCheck", "false"); SETTINGS_PROPERTIES.put("davmail.proxyHost", ""); SETTINGS_PROPERTIES.put("davmail.proxyPort", ""); SETTINGS_PROPERTIES.put("davmail.proxyUser", ""); SETTINGS_PROPERTIES.put("davmail.proxyPassword", ""); SETTINGS_PROPERTIES.put("davmail.noProxyFor", ""); SETTINGS_PROPERTIES.put("davmail.server", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.server.certificate.hash", ""); SETTINGS_PROPERTIES.put("davmail.caldavAlarmSound", ""); SETTINGS_PROPERTIES.put("davmail.carddavReadPhoto", Boolean.TRUE.toString()); SETTINGS_PROPERTIES.put("davmail.forceActiveSyncUpdate", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.showStartupBanner", Boolean.TRUE.toString()); SETTINGS_PROPERTIES.put("davmail.disableGuiNotifications", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.disableTrayActivitySwitch", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.imapAutoExpunge", Boolean.TRUE.toString()); SETTINGS_PROPERTIES.put("davmail.imapAlwaysApproxMsgSize", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.popMarkReadOnRetr", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.smtpSaveInSent", Boolean.TRUE.toString()); SETTINGS_PROPERTIES.put("davmail.ssl.keystoreType", ""); SETTINGS_PROPERTIES.put("davmail.ssl.keystoreFile", ""); SETTINGS_PROPERTIES.put("davmail.ssl.keystorePass", ""); SETTINGS_PROPERTIES.put("davmail.ssl.keyPass", ""); if (isWindows()) { // default to MSCAPI on windows for native client certificate access SETTINGS_PROPERTIES.put("davmail.ssl.clientKeystoreType", "MSCAPI"); } else { SETTINGS_PROPERTIES.put("davmail.ssl.clientKeystoreType", ""); } SETTINGS_PROPERTIES.put("davmail.ssl.clientKeystoreFile", ""); SETTINGS_PROPERTIES.put("davmail.ssl.clientKeystorePass", ""); SETTINGS_PROPERTIES.put("davmail.ssl.pkcs11Library", ""); SETTINGS_PROPERTIES.put("davmail.ssl.pkcs11Config", ""); SETTINGS_PROPERTIES.put("davmail.ssl.nosecurepop", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.ssl.nosecureimap", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.ssl.nosecuresmtp", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.ssl.nosecurecaldav", Boolean.FALSE.toString()); SETTINGS_PROPERTIES.put("davmail.ssl.nosecureldap", Boolean.FALSE.toString()); // logging SETTINGS_PROPERTIES.put("log4j.rootLogger", Level.WARN.toString()); SETTINGS_PROPERTIES.put("log4j.logger.davmail", Level.DEBUG.toString()); SETTINGS_PROPERTIES.put("log4j.logger.httpclient.wire", Level.WARN.toString()); SETTINGS_PROPERTIES.put("log4j.logger.httpclient", Level.WARN.toString()); SETTINGS_PROPERTIES.put("davmail.logFilePath", ""); } /** * Return DavMail log file path * * @return full log file path */ public static String getLogFilePath() { String logFilePath = Settings.getProperty("davmail.logFilePath"); // set default log file path if ((logFilePath == null || logFilePath.isEmpty())) { if (Settings.getBooleanProperty("davmail.server")) { logFilePath = "davmail.log"; } else if (System.getProperty("os.name").toLowerCase().startsWith("mac os x")) { // store davmail.log in OSX Logs directory logFilePath = System.getProperty("user.home") + "/Library/Logs/DavMail/davmail.log"; } else { // store davmail.log in user home folder logFilePath = System.getProperty("user.home") + "/davmail.log"; } } else { File logFile = new File(logFilePath); if (logFile.isDirectory()) { logFilePath += "/davmail.log"; } } return logFilePath; } /** * Return DavMail log file directory * * @return full log file directory */ public static String getLogFileDirectory() { String logFilePath = getLogFilePath(); if (logFilePath == null || logFilePath.isEmpty()) { return "."; } int lastSlashIndex = logFilePath.lastIndexOf('/'); if (lastSlashIndex == -1) { lastSlashIndex = logFilePath.lastIndexOf('\\'); } if (lastSlashIndex >= 0) { return logFilePath.substring(0, lastSlashIndex); } else { return "."; } } /** * Update Log4J config from settings. */ public static void updateLoggingConfig() { String logFilePath = getLogFilePath(); try { if (logFilePath != null && !logFilePath.isEmpty()) { File logFile = new File(logFilePath); // create parent directory if needed File logFileDir = logFile.getParentFile(); if (logFileDir != null && !logFileDir.exists() && (!logFileDir.mkdirs())) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_CREATE_LOG_FILE_DIR")); throw new IOException(); } } else { logFilePath = "davmail.log"; } synchronized (Logger.getRootLogger()) { // Build file appender FileAppender fileAppender = (FileAppender) Logger.getRootLogger().getAppender("FileAppender"); if (fileAppender == null) { String logFileSize = Settings.getProperty("davmail.logFileSize"); if (logFileSize == null || logFileSize.isEmpty()) { logFileSize = "1MB"; } // set log file size to 0 to use an external rotation mechanism, e.g. logrotate if ("0".equals(logFileSize)) { fileAppender = new FileAppender(); } else { fileAppender = new RollingFileAppender(); ((RollingFileAppender) fileAppender).setMaxBackupIndex(2); ((RollingFileAppender) fileAppender).setMaxFileSize(logFileSize); } fileAppender.setName("FileAppender"); fileAppender.setEncoding("UTF-8"); fileAppender.setLayout(new PatternLayout("%d{ISO8601} %-5p [%t] %c %x - %m%n")); } fileAppender.setFile(logFilePath, true, false, 8192); Logger.getRootLogger().addAppender(fileAppender); } // disable ConsoleAppender in gui mode ConsoleAppender consoleAppender = (ConsoleAppender) Logger.getRootLogger().getAppender("ConsoleAppender"); if (consoleAppender != null) { if (Settings.getBooleanProperty("davmail.server")) { consoleAppender.setThreshold(Level.ALL); } else { consoleAppender.setThreshold(Level.OFF); } } } catch (IOException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_SET_LOG_FILE_PATH")); } // update logging levels Settings.setLoggingLevel("rootLogger", Settings.getLoggingLevel("rootLogger")); Settings.setLoggingLevel("davmail", Settings.getLoggingLevel("davmail")); // set logging levels for HttpClient 4 Settings.setLoggingLevel("org.apache.http.wire", Settings.getLoggingLevel("httpclient.wire")); Settings.setLoggingLevel("org.apache.http.conn.ssl", Settings.getLoggingLevel("httpclient.wire")); Settings.setLoggingLevel("org.apache.http", Settings.getLoggingLevel("httpclient")); } /** * Save settings in current file path (command line or default). */ public static synchronized void save() { // configFilePath is null in some test cases if (configFilePath != null) { // clone settings Properties properties = new Properties(); properties.putAll(SETTINGS_PROPERTIES); // file lines ArrayList lines = new ArrayList<>(); // try to make .davmail.properties file readable by user only on create Path path = Paths.get(configFilePath); if (!Files.exists(path) && isUnix()) { FileAttribute permissions = PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rw-------")); try { Files.createFile(path, permissions); } catch (IOException e) { LOGGER.error(e.getMessage()); } } readLines(lines, properties); try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(Paths.get(configFilePath)), StandardCharsets.ISO_8859_1))) { for (String value : lines) { writer.write(value); writer.newLine(); } // write remaining lines Enumeration propertyEnumeration = properties.propertyNames(); while (propertyEnumeration.hasMoreElements()) { String propertyName = (String) propertyEnumeration.nextElement(); writer.write(propertyName + "=" + escapeValue(properties.getProperty(propertyName))); writer.newLine(); } } catch (IOException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_STORE_SETTINGS"), e); } } updateLoggingConfig(); } private static void readLines(ArrayList lines, Properties properties) { try { File configFile = new File(configFilePath); if (configFile.exists()) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(Files.newInputStream(configFile.toPath()), StandardCharsets.ISO_8859_1))) { String line; while ((line = reader.readLine()) != null) { lines.add(convertLine(line, properties)); } } } } catch (IOException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_LOAD_SETTINGS"), e); } } /** * Convert input property line to new line with value from properties. * Preserve comments * * @param line input line * @param properties new property values * @return new line */ private static String convertLine(String line, Properties properties) { int hashIndex = line.indexOf('#'); int equalsIndex = line.indexOf('='); // allow # in values, no a comment // comments are pass through if (equalsIndex >= 0 && (hashIndex < 0 || hashIndex >= equalsIndex)) { String key = line.substring(0, equalsIndex); String value = properties.getProperty(key); if (value != null) { // build property with new value line = key + "=" + escapeValue(value); // remove property from source properties.remove(key); } } return line; } /** * Escape backslash in value. * * @param value value * @return escaped value */ private static String escapeValue(String value) { StringBuilder buffer = new StringBuilder(); for (char c : value.toCharArray()) { if (c == '\\') { buffer.append('\\'); } buffer.append(c); } return buffer.toString(); } /** * Get a property value as String. * * @param property property name * @return property value */ public static synchronized String getProperty(String property) { String value = SETTINGS_PROPERTIES.getProperty(property); // return null on empty value if (value != null && value.isEmpty()) { value = null; } return value; } /** * Get property value or default. * * @param property property name * @param defaultValue default property value * @return property value */ public static synchronized String getProperty(String property, String defaultValue) { String value = getProperty(property); if (value == null) { value = defaultValue; } return value; } /** * Get a property value as char[]. * * @param property property name * @return property value */ public static synchronized char[] getCharArrayProperty(String property) { String propertyValue = Settings.getProperty(property); char[] value = null; if (propertyValue != null) { value = propertyValue.toCharArray(); } return value; } /** * Set a property value. * * @param property property name * @param value property value */ public static synchronized void setProperty(String property, String value) { if (value != null) { SETTINGS_PROPERTIES.setProperty(property, value); } else { SETTINGS_PROPERTIES.setProperty(property, ""); } } /** * Get a property value as int. * * @param property property name * @return property value */ public static synchronized int getIntProperty(String property) { return getIntProperty(property, 0); } /** * Get a property value as int, return default value if null. * * @param property property name * @param defaultValue default property value * @return property value */ public static synchronized int getIntProperty(String property, int defaultValue) { int value = defaultValue; try { String propertyValue = SETTINGS_PROPERTIES.getProperty(property); if (propertyValue != null && !propertyValue.isEmpty()) { value = Integer.parseInt(propertyValue); } } catch (NumberFormatException e) { DavGatewayTray.error(new BundleMessage("LOG_INVALID_SETTING_VALUE", property), e); } return value; } /** * Get a property value as boolean. * * @param property property name * @return property value */ public static synchronized boolean getBooleanProperty(String property) { String propertyValue = SETTINGS_PROPERTIES.getProperty(property); return Boolean.parseBoolean(propertyValue); } /** * Get a property value as boolean. * * @param property property name * @param defaultValue default property value * @return property value */ public static synchronized boolean getBooleanProperty(String property, boolean defaultValue) { boolean value = defaultValue; String propertyValue = SETTINGS_PROPERTIES.getProperty(property); if (propertyValue != null && !propertyValue.isEmpty()) { value = Boolean.parseBoolean(propertyValue); } return value; } public static synchronized String loadRefreshToken(String username) { String tokenFilePath = Settings.getProperty("davmail.oauth.tokenFilePath"); if (isEmpty(tokenFilePath)) { return Settings.getProperty("davmail.oauth." + username.toLowerCase() + ".refreshToken"); } else { return loadtokenFromFile(tokenFilePath, username.toLowerCase()); } } public static synchronized void storeRefreshToken(String username, String refreshToken) { String tokenFilePath = Settings.getProperty("davmail.oauth.tokenFilePath"); if (isEmpty(tokenFilePath)) { Settings.setProperty("davmail.oauth." + username.toLowerCase() + ".refreshToken", refreshToken); Settings.save(); } else { savetokentoFile(tokenFilePath, username.toLowerCase(), refreshToken); } } /** * Persist token in davmail.oauth.tokenFilePath. * * @param tokenFilePath token file path * @param username username * @param refreshToken Oauth refresh token */ private static void savetokentoFile(String tokenFilePath, String username, String refreshToken) { try { checkCreateTokenFilePath(tokenFilePath); Properties properties = new Properties(); try (FileInputStream fis = new FileInputStream(tokenFilePath)) { properties.load(fis); } properties.setProperty(username, refreshToken); try (FileOutputStream fos = new FileOutputStream(tokenFilePath)) { properties.store(fos, "Oauth tokens"); } } catch (IOException e) { Logger.getLogger(Settings.class).warn(e + " " + e.getMessage()); } } /** * Load token from davmail.oauth.tokenFilePath. * * @param tokenFilePath token file path * @param username username * @return encrypted token value */ private static String loadtokenFromFile(String tokenFilePath, String username) { try { checkCreateTokenFilePath(tokenFilePath); Properties properties = new Properties(); try (FileInputStream fis = new FileInputStream(tokenFilePath)) { properties.load(fis); } return properties.getProperty(username); } catch (IOException e) { Logger.getLogger(Settings.class).warn(e + " " + e.getMessage()); } return null; } private static void checkCreateTokenFilePath(String tokenFilePath) throws IOException { File file = new File(tokenFilePath); File parentFile = file.getParentFile(); if (parentFile != null && (parentFile.mkdirs())) { LOGGER.info("Created token file directory "+parentFile.getAbsolutePath()); } if (file.createNewFile()) { LOGGER.info("Created token file "+tokenFilePath); } } /** * Build logging properties prefix. * * @param category logging category * @return prefix */ private static String getLoggingPrefix(String category) { String prefix; if ("rootLogger".equals(category)) { prefix = "log4j."; } else { prefix = "log4j.logger."; } return prefix; } /** * Return Log4J logging level for the category. * * @param category logging category * @return logging level */ public static synchronized Level getLoggingLevel(String category) { String prefix = getLoggingPrefix(category); String currentValue = SETTINGS_PROPERTIES.getProperty(prefix + category); if (currentValue != null && !currentValue.isEmpty()) { return Level.toLevel(currentValue); } else if ("rootLogger".equals(category)) { return Logger.getRootLogger().getLevel(); } else { return Logger.getLogger(category).getLevel(); } } /** * Get all properties that are in the specified scope, that is, that start with '<scope>.'. * * @param scope start of property name * @return properties */ public static synchronized Properties getSubProperties(String scope) { final String keyStart; if (scope == null || scope.isEmpty()) { keyStart = ""; } else if (scope.endsWith(".")) { keyStart = scope; } else { keyStart = scope + '.'; } Properties result = new Properties(); for (Map.Entry entry : SETTINGS_PROPERTIES.entrySet()) { String key = (String) entry.getKey(); if (key.startsWith(keyStart)) { String value = (String) entry.getValue(); result.setProperty(key.substring(keyStart.length()), value); } } return result; } /** * Set Log4J logging level for the category * * @param category logging category * @param level logging level */ public static synchronized void setLoggingLevel(String category, Level level) { if (level != null) { String prefix = getLoggingPrefix(category); SETTINGS_PROPERTIES.setProperty(prefix + category, level.toString()); if ("rootLogger".equals(category)) { Logger.getRootLogger().setLevel(level); } else { Logger.getLogger(category).setLevel(level); } } } /** * Change and save a single property. * * @param property property name * @param value property value */ public static synchronized void saveProperty(String property, String value) { Settings.load(); Settings.setProperty(property, value); Settings.save(); } /** * Test if running on Windows * * @return true on Windows */ public static boolean isWindows() { return System.getProperty("os.name").toLowerCase().startsWith("windows"); } /** * Test if running on Linux * * @return true on Linux */ public static boolean isLinux() { return System.getProperty("os.name").toLowerCase().startsWith("linux"); } public static boolean isUnix() { return isLinux() || System.getProperty("os.name").toLowerCase().startsWith("freebsd"); } public static String getUserAgent() { return getProperty("davmail.userAgent", Settings.EDGE_USER_AGENT); } public static String getOutlookUrl() { String tld = getProperty("davmail.tld"); String outlookUrl = getProperty("davmail.outlookUrl"); if (outlookUrl != null) { return outlookUrl; } else if (tld == null) { return OUTLOOK_URL; } else { return "https://outlook.office365."+tld; } } public static String getO365Url() { String tld = getProperty("davmail.tld"); String outlookUrl = getProperty("davmail.outlookUrl"); if (outlookUrl != null) { return outlookUrl+"/EWS/Exchange.asmx"; } else if (tld == null) { return O365_URL; } else { return "https://outlook.office365."+tld+"/EWS/Exchange.asmx"; } } public static String getO365LoginUrl() { String tld = getProperty("davmail.tld"); String loginUrl = getProperty("davmail.loginUrl"); if (loginUrl != null) { return loginUrl; } else if (tld == null) { return O365_LOGIN_URL; } else { return "https://login.microsoftonline."+tld; } } } davmail-6.3.0/src/java/davmail/caldav/CaldavConnection.java0100644 0000000 0000000 00000232360 14503245212 022324 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.caldav; import davmail.AbstractConnection; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; import davmail.exception.HttpNotFoundException; import davmail.exception.HttpPreconditionFailedException; import davmail.exception.HttpServerErrorException; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.ICSBufferedReader; import davmail.exchange.XMLStreamUtil; import davmail.exchange.dav.DavExchangeSession; import davmail.http.URIUtil; import davmail.ui.tray.DavGatewayTray; import davmail.util.IOUtil; import davmail.util.StringUtil; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; import org.apache.http.impl.EnglishReasonPhraseCatalog; import org.apache.log4j.Logger; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringReader; import java.io.Writer; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.URL; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.*; /** * Handle a caldav connection. */ public class CaldavConnection extends AbstractConnection { /** * Maximum keep alive time in seconds */ protected static final int MAX_KEEP_ALIVE_TIME = 300; protected final Logger wireLogger = Logger.getLogger(this.getClass()); protected boolean closed; /** * custom url encode path set for iCal 5 */ public static final BitSet ical_allowed_abs_path = new BitSet(256); static { ical_allowed_abs_path.or(URIUtil.allowed_abs_path); ical_allowed_abs_path.clear('@'); } static String encodePath(CaldavRequest request, String path) { if (request.isIcal5()) { return URIUtil.encode(path, ical_allowed_abs_path); } else { return URIUtil.encodePath(path); } } /** * Initialize the streams and start the thread. * * @param clientSocket Caldav client socket */ public CaldavConnection(Socket clientSocket) { super(CaldavConnection.class.getSimpleName(), clientSocket, "UTF-8"); // set caldav logging to davmail logging level wireLogger.setLevel(Settings.getLoggingLevel("davmail")); } protected Map parseHeaders() throws IOException { HashMap headers = new HashMap<>(); String line; while ((line = readClient()) != null && line.length() > 0) { int index = line.indexOf(':'); if (index <= 0) { wireLogger.warn("Invalid header: " + line); throw new DavMailException("EXCEPTION_INVALID_HEADER"); } headers.put(line.substring(0, index).toLowerCase(), line.substring(index + 1).trim()); } return headers; } protected String getContent(String contentLength) throws IOException { if (contentLength == null || contentLength.length() == 0) { return null; } else { int size; try { size = Integer.parseInt(contentLength); } catch (NumberFormatException e) { throw new DavMailException("EXCEPTION_INVALID_CONTENT_LENGTH", contentLength); } String content = in.readContentAsString(size); if (wireLogger.isDebugEnabled()) { wireLogger.debug("< " + content); } return content; } } protected void setSocketTimeout(String keepAliveValue) throws IOException { if (keepAliveValue != null && keepAliveValue.length() > 0) { int keepAlive; try { keepAlive = Integer.parseInt(keepAliveValue); } catch (NumberFormatException e) { throw new DavMailException("EXCEPTION_INVALID_KEEPALIVE", keepAliveValue); } if (keepAlive > MAX_KEEP_ALIVE_TIME) { keepAlive = MAX_KEEP_ALIVE_TIME; } client.setSoTimeout(keepAlive * 1000); DavGatewayTray.debug(new BundleMessage("LOG_SET_SOCKET_TIMEOUT", keepAlive)); } } @Override public void run() { String line; StringTokenizer tokens; try { while (!closed) { line = readClient(); // unable to read line, connection closed ? if (line == null) { break; } tokens = new StringTokenizer(line); String command = tokens.nextToken(); Map headers = parseHeaders(); String encodedPath = StringUtil.encodePlusSign(tokens.nextToken()); String path = URIUtil.decode(encodedPath); String content = getContent(headers.get("content-length")); setSocketTimeout(headers.get("keep-alive")); // client requested connection close closed = "close".equals(headers.get("connection")); if ("OPTIONS".equals(command)) { sendOptions(); } else if (!headers.containsKey("authorization")) { sendUnauthorized(); } else { decodeCredentials(headers.get("authorization")); // need to check session on each request, credentials may have changed or session expired try { session = ExchangeSessionFactory.getInstance(userName, password); logConnection("LOGON", userName); handleRequest(command, path, headers, content); } catch (DavMailAuthenticationException e) { logConnection("FAILED", userName); if (Settings.getBooleanProperty("davmail.enableKerberos")) { // authentication failed in Kerberos mode => not available throw new HttpServerErrorException("Kerberos authentication failed"); } else { sendUnauthorized(); } } } os.flush(); DavGatewayTray.resetIcon(); } } catch (SocketTimeoutException e) { DavGatewayTray.debug(new BundleMessage("LOG_CLOSE_CONNECTION_ON_TIMEOUT")); } catch (SocketException e) { DavGatewayTray.debug(new BundleMessage("LOG_CONNECTION_CLOSED")); } catch (Exception e) { if (!(e instanceof HttpNotFoundException)) { DavGatewayTray.log(e); } try { sendErr(e); } catch (IOException e2) { DavGatewayTray.debug(new BundleMessage("LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT"), e2); } } finally { close(); } DavGatewayTray.resetIcon(); } /** * Handle caldav request. * * @param command Http command * @param path request path * @param headers Http headers map * @param body request body * @throws IOException on error */ public void handleRequest(String command, String path, Map headers, String body) throws IOException { CaldavRequest request = new CaldavRequest(command, path, headers, body); if (request.isOptions()) { sendOptions(); } else if (request.isPropFind() && request.isRoot()) { sendRoot(request); } else if (request.isGet() && request.isRoot()) { sendGetRoot(); } else if (request.isPath(1, "principals")) { handlePrincipals(request); } else if (request.isPath(1, "users")) { if (request.isPropFind() && request.isPathLength(3)) { sendUserRoot(request); } else { handleFolderOrItem(request); } } else if (request.isPath(1, "public")) { handleFolderOrItem(request); } else if (request.isPath(1, "directory")) { sendDirectory(request); } else if (request.isPath(1, ".well-known")) { sendWellKnown(); } else { sendNotFound(request); } } protected void handlePrincipals(CaldavRequest request) throws IOException { if (request.isPath(2, "users")) { if (request.isPropFind() && request.isPathLength(4)) { sendPrincipal(request, "users", URIUtil.decode(request.getPathElement(3))); // send back principal on search } else if (request.isReport() && request.isPathLength(3)) { sendPrincipal(request, "users", session.getEmail()); // iCal current-user-principal request } else if (request.isPropFind() && request.isPathLength(3)) { sendPrincipalsFolder(request); } else { sendNotFound(request); } } else if (request.isPath(2, "public")) { StringBuilder prefixBuffer = new StringBuilder("public"); for (int i = 3; i < request.getPathLength() - 1; i++) { prefixBuffer.append('/').append(request.getPathElement(i)); } sendPrincipal(request, URIUtil.decode(prefixBuffer.toString()), URIUtil.decode(request.getLastPath())); } else { sendNotFound(request); } } protected void handleFolderOrItem(CaldavRequest request) throws IOException { String lastPath = StringUtil.xmlDecode(request.getLastPath()); // folder requests if (request.isPropFind() && "inbox".equals(lastPath)) { sendInbox(request); } else if (request.isPropFind() && "outbox".equals(lastPath)) { sendOutbox(request); } else if (request.isPost() && "outbox".equals(lastPath)) { if (request.isFreeBusy()) { sendFreeBusy(request.getBody()); } else { int status = session.sendEvent(request.getBody()); // TODO: implement Itip response body sendHttpResponse(status); } } else if (request.isPropFind()) { sendFolderOrItem(request); } else if (request.isPropPatch()) { patchCalendar(request); } else if (request.isReport()) { reportItems(request); // event requests } else if (request.isPut()) { String etag = request.getHeader("if-match"); String noneMatch = request.getHeader("if-none-match"); ExchangeSession.ItemResult itemResult = session.createOrUpdateItem(request.getFolderPath(), lastPath, request.getBody(), etag, noneMatch); sendHttpResponse(itemResult.status, buildEtagHeader(request, itemResult), null, "", true); } else if (request.isDelete()) { if (request.getFolderPath().endsWith("inbox")) { session.processItem(request.getFolderPath(), lastPath); } else { session.deleteItem(request.getFolderPath(), lastPath); } sendHttpResponse(HttpStatus.SC_OK); } else if (request.isGet()) { if (request.path.endsWith("/")) { // GET request on a folder => build ics content of all folder events String folderPath = request.getFolderPath(); ExchangeSession.Folder folder = session.getFolder(folderPath); if (folder.isContact()) { List contacts = session.getAllContacts(folderPath, !isOldCardavClient(request)); ChunkedResponse response = new ChunkedResponse(HttpStatus.SC_OK, "text/vcard;charset=UTF-8"); for (ExchangeSession.Contact contact : contacts) { contact.setVCardVersion(getVCardVersion(request)); String contactBody = contact.getBody(); if (contactBody != null) { response.append(contactBody); response.append("\n"); } } response.close(); } else if (folder.isCalendar() || folder.isTask()) { List events = session.getAllEvents(folderPath); ChunkedResponse response = new ChunkedResponse(HttpStatus.SC_OK, "text/calendar;charset=UTF-8"); response.append("BEGIN:VCALENDAR\r\n"); response.append("VERSION:2.0\r\n"); response.append("PRODID:-//davmail.sf.net/NONSGML DavMail Calendar V1.1//EN\r\n"); response.append("METHOD:PUBLISH\r\n"); for (ExchangeSession.Event event : events) { String icsContent = StringUtil.getToken(event.getBody(), "BEGIN:VTIMEZONE", "END:VCALENDAR"); if (icsContent != null) { response.append("BEGIN:VTIMEZONE"); response.append(icsContent); } else { icsContent = StringUtil.getToken(event.getBody(), "BEGIN:VEVENT", "END:VCALENDAR"); if (icsContent != null) { response.append("BEGIN:VEVENT"); response.append(icsContent); } } } response.append("END:VCALENDAR"); response.close(); } else { sendHttpResponse(HttpStatus.SC_OK, buildEtagHeader(folder.etag), "text/html", (byte[]) null, true); } } else { ExchangeSession.Item item = session.getItem(request.getFolderPath(), lastPath); if (item instanceof ExchangeSession.Contact) { ((ExchangeSession.Contact) item).setVCardVersion(getVCardVersion(request)); } sendHttpResponse(HttpStatus.SC_OK, buildEtagHeader(item.getEtag()), item.getContentType(), item.getBody(), true); } } else if (request.isHead()) { // test event ExchangeSession.Item item = session.getItem(request.getFolderPath(), lastPath); sendHttpResponse(HttpStatus.SC_OK, buildEtagHeader(item.getEtag()), item.getContentType(), (byte[]) null, true); } else if (request.isMkCalendar()) { HashMap properties = new HashMap<>(); //properties.put("displayname", request.getProperty("displayname")); int status = session.createCalendarFolder(request.getFolderPath(), properties); sendHttpResponse(status, null); } else if (request.isMove()) { String destinationUrl = request.getHeader("destination"); session.moveItem(request.path, URIUtil.decode(new URL(destinationUrl).getPath())); sendHttpResponse(HttpStatus.SC_CREATED, null); } else { sendNotFound(request); } } private boolean isOldCardavClient(CaldavRequest request) { return request.isUserAgent("iOS/"); } private String getVCardVersion(CaldavRequest request) { if (isOldCardavClient(request)) { return "3.0"; } else { return "4.0"; } } protected HashMap buildEtagHeader(CaldavRequest request, ExchangeSession.ItemResult itemResult) { HashMap headers = null; if (itemResult.etag != null) { headers = new HashMap<>(); headers.put("ETag", itemResult.etag); } if (itemResult.itemName != null) { if (headers == null) { headers = new HashMap<>(); } headers.put("Location", buildEventPath(request, itemResult.itemName)); } return headers; } protected HashMap buildEtagHeader(String etag) { if (etag != null) { HashMap etagHeader = new HashMap<>(); etagHeader.put("ETag", etag); return etagHeader; } else { return null; } } private void appendContactsResponses(CaldavResponse response, CaldavRequest request, List contacts) throws IOException { if (contacts != null) { int count = 0; for (ExchangeSession.Contact contact : contacts) { DavGatewayTray.debug(new BundleMessage("LOG_LISTING_ITEM", ++count, contacts.size())); DavGatewayTray.switchIcon(); appendItemResponse(response, request, contact); } } } protected void appendEventsResponses(CaldavResponse response, CaldavRequest request, List events) throws IOException { if (events != null) { int size = events.size(); int count = 0; for (ExchangeSession.Event event : events) { DavGatewayTray.debug(new BundleMessage("LOG_LISTING_ITEM", ++count, size)); DavGatewayTray.switchIcon(); appendItemResponse(response, request, event); } } } protected String buildEventPath(CaldavRequest request, String itemName) { StringBuilder eventPath = new StringBuilder(); eventPath.append(encodePath(request, request.getFolderPath())); if (!(eventPath.charAt(eventPath.length() - 1) == '/')) { eventPath.append('/'); } eventPath.append(URIUtil.encodeWithinQuery(StringUtil.xmlEncode(itemName))); return eventPath.toString(); } protected void appendItemResponse(CaldavResponse response, CaldavRequest request, ExchangeSession.Item item) throws IOException { response.startResponse(buildEventPath(request, item.getName())); response.startPropstat(); if (request.hasProperty("calendar-data") && item instanceof ExchangeSession.Event) { response.appendCalendarData(item.getBody()); } if (request.hasProperty("address-data") && item instanceof ExchangeSession.Contact) { ((ExchangeSession.Contact) item).setVCardVersion(getVCardVersion(request)); response.appendContactData(item.getBody()); } if (request.hasProperty("getcontenttype")) { if (item instanceof ExchangeSession.Event) { response.appendProperty("D:getcontenttype", "text/calendar; component=vevent"); } else if (item instanceof ExchangeSession.Contact) { response.appendProperty("D:getcontenttype", "text/vcard"); } } if (request.hasProperty("getetag")) { response.appendProperty("D:getetag", item.getEtag()); } if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype"); } if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", StringUtil.xmlEncode(item.getName())); } response.endPropStatOK(); response.endResponse(); } /** * Append folder object to Caldav response. * * @param response Caldav response * @param request Caldav request * @param folder folder object * @param subFolder calendar folder path relative to request path * @throws IOException on error */ public void appendFolderOrItem(CaldavResponse response, CaldavRequest request, ExchangeSession.Folder folder, String subFolder) throws IOException { response.startResponse(encodePath(request, request.getPath(subFolder))); response.startPropstat(); if (request.hasProperty("resourcetype")) { if (folder.isContact()) { response.appendProperty("D:resourcetype", "" + ""); } else if (folder.isCalendar() || folder.isTask()) { response.appendProperty("D:resourcetype", "" + ""); } else { response.appendProperty("D:resourcetype", ""); } } if (request.hasProperty("owner")) { if ("users".equals(request.getPathElement(1))) { response.appendHrefProperty("D:owner", "/principals/users/" + request.getPathElement(2)); } else { response.appendHrefProperty("D:owner", "/principals" + request.getPath()); } } if (request.hasProperty("getcontenttype")) { if (folder.isContact()) { response.appendProperty("D:getcontenttype", "text/x-vcard"); } else if (folder.isCalendar()) { response.appendProperty("D:getcontenttype", "text/calendar; component=vevent"); } else if (folder.isTask()) { response.appendProperty("D:getcontenttype", "text/calendar; component=vtodo"); } } if (request.hasProperty("getetag")) { response.appendProperty("D:getetag", folder.etag); } if (request.hasProperty("getctag")) { response.appendProperty("CS:getctag", "CS=\"http://calendarserver.org/ns/\"", IOUtil.encodeBase64AsString(folder.ctag)); } if (request.hasProperty("displayname")) { if (subFolder == null || subFolder.length() == 0) { // use i18n calendar name as display name String displayname = request.getLastPath(); if ("calendar".equals(displayname)) { displayname = folder.displayName; } response.appendProperty("D:displayname", displayname); } else { response.appendProperty("D:displayname", subFolder); } } if (request.hasProperty("calendar-description")) { response.appendProperty("C:calendar-description", ""); } if (request.hasProperty("supported-calendar-component-set")) { if (folder.isCalendar()) { response.appendProperty("C:supported-calendar-component-set", ""); } else if (folder.isTask()) { response.appendProperty("C:supported-calendar-component-set", ""); } } if (request.hasProperty("current-user-privilege-set")) { response.appendProperty("D:current-user-privilege-set", ""); } response.endPropStatOK(); response.endResponse(); } /** * Append calendar inbox object to Caldav response. * * @param response Caldav response * @param request Caldav request * @param subFolder inbox folder path relative to request path * @throws IOException on error */ public void appendInbox(CaldavResponse response, CaldavRequest request, String subFolder) throws IOException { String ctag = "0"; String etag = "0"; String folderPath = request.getFolderPath(subFolder); // do not try to access inbox on shared calendar if (!session.isSharedFolder(folderPath)) { try { ExchangeSession.Folder folder = session.getFolder(folderPath); ctag = IOUtil.encodeBase64AsString(folder.ctag); etag = IOUtil.encodeBase64AsString(folder.etag); } catch (HttpResponseException e) { // unauthorized access, probably an inbox on shared calendar DavGatewayTray.debug(new BundleMessage("LOG_ACCESS_FORBIDDEN", folderPath, e.getMessage())); } } response.startResponse(encodePath(request, request.getPath(subFolder))); response.startPropstat(); if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", "" + ""); } if (request.hasProperty("getcontenttype")) { response.appendProperty("D:getcontenttype", "text/calendar; component=vevent"); } if (request.hasProperty("getctag")) { response.appendProperty("CS:getctag", "CS=\"http://calendarserver.org/ns/\"", ctag); } if (request.hasProperty("getetag")) { response.appendProperty("D:getetag", etag); } if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", "inbox"); } response.endPropStatOK(); response.endResponse(); } /** * Append calendar outbox object to Caldav response. * * @param response Caldav response * @param request Caldav request * @param subFolder outbox folder path relative to request path * @throws IOException on error */ public void appendOutbox(CaldavResponse response, CaldavRequest request, String subFolder) throws IOException { response.startResponse(encodePath(request, request.getPath(subFolder))); response.startPropstat(); if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", "" + ""); } if (request.hasProperty("getctag")) { response.appendProperty("CS:getctag", "CS=\"http://calendarserver.org/ns/\"", "0"); } if (request.hasProperty("getetag")) { response.appendProperty("D:getetag", "0"); } if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", "outbox"); } response.endPropStatOK(); response.endResponse(); } /** * Send simple html response to GET /. * * @throws IOException on error */ public void sendGetRoot() throws IOException { String buffer = "Connected to DavMail" + DavGateway.getCurrentVersion() + "
" + "UserName: " + userName + "
" + "Email: " + session.getEmail() + "
"; sendHttpResponse(HttpStatus.SC_OK, null, "text/html;charset=UTF-8", buffer, true); } /** * Send inbox response for request. * * @param request Caldav request * @throws IOException on error */ public void sendInbox(CaldavRequest request) throws IOException { CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); appendInbox(response, request, null); // do not try to access inbox on shared calendar if (!session.isSharedFolder(request.getFolderPath(null)) && request.getDepth() == 1 && !request.isLightning()) { try { DavGatewayTray.debug(new BundleMessage("LOG_SEARCHING_CALENDAR_MESSAGES")); List events = session.getEventMessages(request.getFolderPath()); DavGatewayTray.debug(new BundleMessage("LOG_FOUND_CALENDAR_MESSAGES", events.size())); appendEventsResponses(response, request, events); } catch (HttpResponseException e) { // unauthorized access, probably an inbox on shared calendar DavGatewayTray.debug(new BundleMessage("LOG_ACCESS_FORBIDDEN", request.getFolderPath(), e.getMessage())); } } response.endMultistatus(); response.close(); } /** * Send outbox response for request. * * @param request Caldav request * @throws IOException on error */ public void sendOutbox(CaldavRequest request) throws IOException { CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); appendOutbox(response, request, null); response.endMultistatus(); response.close(); } /** * Send calendar response for request. * * @param request Caldav request * @throws IOException on error */ public void sendFolderOrItem(CaldavRequest request) throws IOException { String folderPath = request.getFolderPath(); // process request before sending response to avoid sending headers twice on error ExchangeSession.Folder folder = session.getFolder(folderPath); List contacts = null; List events = null; List folderList = null; if (request.getDepth() == 1) { if (folder.isContact()) { contacts = session.getAllContacts(folderPath, !isOldCardavClient(request)); } else if (folder.isCalendar() || folder.isTask()) { events = session.getAllEvents(folderPath); if (!folderPath.startsWith("/public")) { folderList = session.getSubCalendarFolders(folderPath, false); } } } CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); appendFolderOrItem(response, request, folder, null); if (request.getDepth() == 1) { if (folder.isContact()) { appendContactsResponses(response, request, contacts); } else if (folder.isCalendar() || folder.isTask()) { appendEventsResponses(response, request, events); // Send sub folders for multi-calendar support under iCal, except for public folders if (folderList != null) { for (ExchangeSession.Folder subFolder : folderList) { appendFolderOrItem(response, request, subFolder, subFolder.folderPath.substring(subFolder.folderPath.indexOf('/') + 1)); } } } } response.endMultistatus(); response.close(); } /** * Fake PROPPATCH response for request. * * @param request Caldav request * @throws IOException on error */ public void patchCalendar(CaldavRequest request) throws IOException { String displayname = request.getProperty("displayname"); String folderPath = request.getFolderPath(); if (displayname != null) { String targetPath = request.getParentFolderPath() + '/' + displayname; if (!targetPath.equals(folderPath)) { session.moveFolder(folderPath, targetPath); } } CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); // ical calendar folder proppatch if (request.hasProperty("calendar-color") || request.hasProperty("calendar-order")) { response.startPropstat(); if (request.hasProperty("calendar-color")) { response.appendProperty("x1:calendar-color", "x1=\"http://apple.com/ns/ical/\"", null); } if (request.hasProperty("calendar-order")) { response.appendProperty("x1:calendar-order", "x1=\"http://apple.com/ns/ical/\"", null); } response.endPropStatOK(); } response.endMultistatus(); response.close(); } protected String getEventFileNameFromPath(String path) { int index = path.lastIndexOf('/'); if (index < 0) { return null; } else { return StringUtil.xmlDecode(path.substring(index + 1)); } } /** * Report items listed in request. * * @param request Caldav request * @throws IOException on error */ public void reportItems(CaldavRequest request) throws IOException { String folderPath = request.getFolderPath(); List events; List notFound = new ArrayList<>(); CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); if (request.isMultiGet()) { int count = 0; int total = request.getHrefs().size(); for (String href : request.getHrefs()) { DavGatewayTray.debug(new BundleMessage("LOG_REPORT_ITEM", ++count, total)); DavGatewayTray.switchIcon(); String eventName = getEventFileNameFromPath(href); try { // ignore cases for Sunbird if (eventName != null && eventName.length() > 0 && !"inbox".equals(eventName) && !"calendar".equals(eventName)) { ExchangeSession.Item item; try { item = session.getItem(folderPath, eventName); } catch (HttpNotFoundException e) { // workaround for Lightning bug if (request.isBrokenLightning() && eventName.indexOf('%') >= 0) { item = session.getItem(folderPath, URIUtil.decode(StringUtil.encodePlusSign(eventName))); } else { throw e; } } if (!eventName.equals(item.getName())) { DavGatewayTray.warn(new BundleMessage("LOG_MESSAGE", "wrong item name requested " + eventName + " received " + item.getName())); // force item name to requested value item.setItemName(eventName); } appendItemResponse(response, request, item); } } catch (SocketException e) { // rethrow SocketException (client closed connection) throw e; } catch (Exception e) { wireLogger.debug(e.getMessage(), e); DavGatewayTray.warn(new BundleMessage("LOG_ITEM_NOT_AVAILABLE", eventName, href)); notFound.add(href); } } } else if (request.isPath(1, "users") && request.isPath(3, "inbox")) { events = session.getEventMessages(request.getFolderPath()); appendEventsResponses(response, request, events); } else { ExchangeSession.Folder folder = session.getFolder(folderPath); if (folder.isContact()) { List contacts = session.getAllContacts(folderPath, !isOldCardavClient(request)); appendContactsResponses(response, request, contacts); } else { if (request.vTodoOnly) { events = session.searchTasksOnly(request.getFolderPath()); } else if (request.vEventOnly) { events = session.searchEventsOnly(request.getFolderPath(), request.timeRangeStart, request.timeRangeEnd); } else { events = session.searchEvents(request.getFolderPath(), request.timeRangeStart, request.timeRangeEnd); } appendEventsResponses(response, request, events); } } // send not found events errors for (String href : notFound) { response.startResponse(encodePath(request, href)); response.appendPropstatNotFound(); response.endResponse(); } response.endMultistatus(); response.close(); } /** * Send principals folder. * * @param request Caldav request * @throws IOException on error */ public void sendPrincipalsFolder(CaldavRequest request) throws IOException { CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); response.startResponse(encodePath(request, request.getPath())); response.startPropstat(); if (request.hasProperty("current-user-principal")) { response.appendHrefProperty("D:current-user-principal", encodePath(request, "/principals/users/" + session.getEmail())); } response.endPropStatOK(); response.endResponse(); response.endMultistatus(); response.close(); } /** * Send user response for request. * * @param request Caldav request * @throws IOException on error */ public void sendUserRoot(CaldavRequest request) throws IOException { CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); response.startResponse(encodePath(request, request.getPath())); response.startPropstat(); if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", ""); } if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", request.getLastPath()); } if (request.hasProperty("getctag")) { ExchangeSession.Folder rootFolder = session.getFolder(""); response.appendProperty("CS:getctag", "CS=\"http://calendarserver.org/ns/\"", IOUtil.encodeBase64AsString(rootFolder.ctag)); } response.endPropStatOK(); if (request.getDepth() == 1) { appendInbox(response, request, "inbox"); appendOutbox(response, request, "outbox"); appendFolderOrItem(response, request, session.getFolder(request.getFolderPath("calendar")), "calendar"); appendFolderOrItem(response, request, session.getFolder(request.getFolderPath("contacts")), "contacts"); } response.endResponse(); response.endMultistatus(); response.close(); } /** * Send caldav response for / request. * * @param request Caldav request * @throws IOException on error */ public void sendRoot(CaldavRequest request) throws IOException { CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); response.startResponse("/"); response.startPropstat(); if (request.hasProperty("principal-collection-set")) { response.appendHrefProperty("D:principal-collection-set", "/principals/users/"); } if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", "ROOT"); } if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", ""); } if (request.hasProperty("current-user-principal")) { response.appendHrefProperty("D:current-user-principal", encodePath(request, "/principals/users/" + session.getEmail())); } response.endPropStatOK(); response.endResponse(); if (request.depth == 1) { // iPhone workaround: send calendar subfolder response.startResponse("/users/" + session.getEmail() + "/calendar"); response.startPropstat(); if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", "" + ""); } if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", session.getEmail()); } if (request.hasProperty("supported-calendar-component-set")) { response.appendProperty("C:supported-calendar-component-set", ""); } response.endPropStatOK(); response.endResponse(); response.startResponse("/users"); response.startPropstat(); if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", "users"); } if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", ""); } response.endPropStatOK(); response.endResponse(); response.startResponse("/principals"); response.startPropstat(); if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", "principals"); } if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", ""); } response.endPropStatOK(); response.endResponse(); } response.endMultistatus(); response.close(); } /** * Send caldav response for /directory/ request. * * @param request Caldav request * @throws IOException on error */ public void sendDirectory(CaldavRequest request) throws IOException { CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); response.startResponse("/directory/"); response.startPropstat(); if (request.hasProperty("current-user-privilege-set")) { response.appendProperty("D:current-user-privilege-set", ""); } response.endPropStatOK(); response.endResponse(); response.endMultistatus(); response.close(); } /** * Send caldav response for /.well-known/ request. * * @throws IOException on error */ public void sendWellKnown() throws IOException { HashMap headers = new HashMap<>(); headers.put("Location", "/"); sendHttpResponse(HttpStatus.SC_MOVED_PERMANENTLY, headers); } /** * Send Caldav principal response. * * @param request Caldav request * @param prefix principal prefix (users or public) * @param principal principal name (email address for users) * @throws IOException on error */ public void sendPrincipal(CaldavRequest request, String prefix, String principal) throws IOException { // actual principal is email address String actualPrincipal = principal; if ("users".equals(prefix) && (principal.equalsIgnoreCase(session.getAlias()) || (principal.equalsIgnoreCase(session.getAliasFromLogin())))) { actualPrincipal = session.getEmail(); } CaldavResponse response = new CaldavResponse(HttpStatus.SC_MULTI_STATUS); response.startMultistatus(); response.startResponse(encodePath(request, "/principals/" + prefix + '/' + principal)); response.startPropstat(); if (request.hasProperty("principal-URL") && request.isIcal5()) { response.appendHrefProperty("D:principal-URL", encodePath(request, "/principals/" + prefix + '/' + actualPrincipal)); } if (request.hasProperty("calendar-home-set")) { if ("users".equals(prefix)) { response.appendHrefProperty("C:calendar-home-set", encodePath(request, "/users/" + actualPrincipal + "/calendar/")); } else { response.appendHrefProperty("C:calendar-home-set", encodePath(request, '/' + prefix + '/' + actualPrincipal)); } } if (request.hasProperty("calendar-user-address-set") && "users".equals(prefix)) { response.appendHrefProperty("C:calendar-user-address-set", "mailto:" + actualPrincipal); } if (request.hasProperty("addressbook-home-set")) { if (request.isUserAgent("Address%20Book") || request.isUserAgent("Darwin")) { response.appendHrefProperty("E:addressbook-home-set", encodePath(request, '/' + prefix + '/' + actualPrincipal + '/')); } else if ("users".equals(prefix)) { response.appendHrefProperty("E:addressbook-home-set", encodePath(request, "/users/" + actualPrincipal + "/contacts/")); } else { response.appendHrefProperty("E:addressbook-home-set", encodePath(request, '/' + prefix + '/' + actualPrincipal + '/')); } } if ("users".equals(prefix)) { if (request.hasProperty("schedule-inbox-URL")) { response.appendHrefProperty("C:schedule-inbox-URL", encodePath(request, "/users/" + actualPrincipal + "/inbox/")); } if (request.hasProperty("schedule-outbox-URL")) { response.appendHrefProperty("C:schedule-outbox-URL", encodePath(request, "/users/" + actualPrincipal + "/outbox/")); } } else { // public calendar, send root href as inbox url (always empty) for Lightning if (request.isLightning() && request.hasProperty("schedule-inbox-URL")) { response.appendHrefProperty("C:schedule-inbox-URL", "/"); } // send user outbox if (request.hasProperty("schedule-outbox-URL")) { response.appendHrefProperty("C:schedule-outbox-URL", encodePath(request, "/users/" + session.getEmail() + "/outbox/")); } } if (request.hasProperty("displayname")) { response.appendProperty("D:displayname", actualPrincipal); } if (request.hasProperty("resourcetype")) { response.appendProperty("D:resourcetype", ""); } if (request.hasProperty("supported-report-set")) { response.appendProperty("D:supported-report-set", ""); } response.endPropStatOK(); response.endResponse(); response.endMultistatus(); response.close(); } /** * Send free busy response for body request. * * @param body request body * @throws IOException on error */ public void sendFreeBusy(String body) throws IOException { HashMap valueMap = new HashMap<>(); ArrayList attendees = new ArrayList<>(); HashMap attendeeKeyMap = new HashMap<>(); ICSBufferedReader reader = new ICSBufferedReader(new StringReader(body)); String line; String key; while ((line = reader.readLine()) != null) { int index = line.indexOf(':'); if (index <= 0) { throw new DavMailException("EXCEPTION_INVALID_REQUEST", body); } String fullkey = line.substring(0, index); String value = line.substring(index + 1); int semicolonIndex = fullkey.indexOf(';'); if (semicolonIndex > 0) { key = fullkey.substring(0, semicolonIndex); } else { key = fullkey; } if ("ATTENDEE".equals(key)) { attendees.add(value); attendeeKeyMap.put(value, fullkey); } else { valueMap.put(key, value); } } // get freebusy for each attendee HashMap freeBusyMap = new HashMap<>(); for (String attendee : attendees) { ExchangeSession.FreeBusy freeBusy = session.getFreebusy(attendee, valueMap.get("DTSTART"), valueMap.get("DTEND")); if (freeBusy != null) { freeBusyMap.put(attendee, freeBusy); } } CaldavResponse response = new CaldavResponse(HttpStatus.SC_OK); response.startScheduleResponse(); for (Map.Entry entry : freeBusyMap.entrySet()) { String attendee = entry.getKey(); response.startRecipientResponse(attendee); StringBuilder ics = new StringBuilder(); ics.append("BEGIN:VCALENDAR").append((char) 13).append((char) 10) .append("VERSION:2.0").append((char) 13).append((char) 10) .append("PRODID:-//davmail.sf.net/NONSGML DavMail Calendar V1.1//EN").append((char) 13).append((char) 10) .append("METHOD:REPLY").append((char) 13).append((char) 10) .append("BEGIN:VFREEBUSY").append((char) 13).append((char) 10) .append("DTSTAMP:").append(valueMap.get("DTSTAMP")).append((char) 13).append((char) 10) .append("ORGANIZER:").append(valueMap.get("ORGANIZER")).append((char) 13).append((char) 10) .append("DTSTART:").append(valueMap.get("DTSTART")).append((char) 13).append((char) 10) .append("DTEND:").append(valueMap.get("DTEND")).append((char) 13).append((char) 10) .append("UID:").append(valueMap.get("UID")).append((char) 13).append((char) 10) .append(attendeeKeyMap.get(attendee)).append(':').append(attendee).append((char) 13).append((char) 10); entry.getValue().appendTo(ics); ics.append("END:VFREEBUSY").append((char) 13).append((char) 10) .append("END:VCALENDAR"); response.appendCalendarData(ics.toString()); response.endRecipientResponse(); } response.endScheduleResponse(); response.close(); } /** * Send Http error response for exception * * @param e exception * @throws IOException on error */ public void sendErr(Exception e) throws IOException { String message = e.getMessage(); if (message == null) { message = e.toString(); } if (e instanceof HttpNotFoundException) { sendErr(HttpStatus.SC_NOT_FOUND, message); } else if (e instanceof HttpPreconditionFailedException) { sendErr(HttpStatus.SC_PRECONDITION_FAILED, message); } else { // workaround for Lightning bug: sleep for 1 second try { Thread.sleep(1000); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } sendErr(HttpStatus.SC_SERVICE_UNAVAILABLE, message); } } /** * Send 404 not found for unknown request. * * @param request Caldav request * @throws IOException on error */ public void sendNotFound(CaldavRequest request) throws IOException { BundleMessage message = new BundleMessage("LOG_UNSUPPORTED_REQUEST", request); DavGatewayTray.warn(message); sendErr(HttpStatus.SC_NOT_FOUND, message.format()); } /** * Send Http error status and message. * * @param status Http status * @param message error messagee * @throws IOException on error */ public void sendErr(int status, String message) throws IOException { sendHttpResponse(status, null, "text/plain;charset=UTF-8", message, false); } /** * Send OPTIONS response. * * @throws IOException on error */ public void sendOptions() throws IOException { HashMap headers = new HashMap<>(); headers.put("Allow", "OPTIONS, PROPFIND, HEAD, GET, REPORT, PROPPATCH, PUT, DELETE, POST"); sendHttpResponse(HttpStatus.SC_OK, headers); } /** * Send 401 Unauthorized response. * * @throws IOException on error */ public void sendUnauthorized() throws IOException { HashMap headers = new HashMap<>(); headers.put("WWW-Authenticate", "Basic realm=\"" + BundleMessage.format("UI_DAVMAIL_GATEWAY") + '\"'); sendHttpResponse(HttpStatus.SC_UNAUTHORIZED, headers, null, (byte[]) null, true); } /** * Send Http response with given status. * * @param status Http status * @throws IOException on error */ public void sendHttpResponse(int status) throws IOException { sendHttpResponse(status, null, null, (byte[]) null, true); } /** * Send Http response with given status and headers. * * @param status Http status * @param headers Http headers * @throws IOException on error */ public void sendHttpResponse(int status, Map headers) throws IOException { sendHttpResponse(status, headers, null, (byte[]) null, true); } /** * Send Http response with given status in chunked mode. * * @param status Http status * @param contentType MIME content type * @throws IOException on error */ public void sendChunkedHttpResponse(int status, String contentType) throws IOException { HashMap headers = new HashMap<>(); headers.put("Transfer-Encoding", "chunked"); sendHttpResponse(status, headers, contentType, (byte[]) null, true); } /** * Send Http response with given status, headers, content type and content. * Close connection if keepAlive is false * * @param status Http status * @param headers Http headers * @param contentType MIME content type * @param content response body as string * @param keepAlive keep connection open * @throws IOException on error */ public void sendHttpResponse(int status, Map headers, String contentType, String content, boolean keepAlive) throws IOException { sendHttpResponse(status, headers, contentType, content.getBytes(StandardCharsets.UTF_8), keepAlive); } /** * Send Http response with given status, headers, content type and content. * Close connection if keepAlive is false * * @param status Http status * @param headers Http headers * @param contentType MIME content type * @param content response body as byte array * @param keepAlive keep connection open * @throws IOException on error */ public void sendHttpResponse(int status, Map headers, String contentType, byte[] content, boolean keepAlive) throws IOException { sendClient("HTTP/1.1 " + status + ' ' + EnglishReasonPhraseCatalog.INSTANCE.getReason(status, Locale.ENGLISH)); if (status != HttpStatus.SC_UNAUTHORIZED) { sendClient("Server: DavMail Gateway " + DavGateway.getCurrentVersion()); String scheduleMode; // enable automatic scheduling over EWS, can be disabled if (Settings.getBooleanProperty("davmail.caldavAutoSchedule", true) && !(session instanceof DavExchangeSession)) { scheduleMode = "calendar-auto-schedule"; } else { scheduleMode = "calendar-schedule"; } sendClient("DAV: 1, calendar-access, " + scheduleMode + ", calendarserver-private-events, addressbook"); SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH); // force GMT timezone formatter.setTimeZone(ExchangeSession.GMT_TIMEZONE); String now = formatter.format(new Date()); sendClient("Date: " + now); sendClient("Expires: " + now); sendClient("Cache-Control: private, max-age=0"); } if (headers != null) { for (Map.Entry header : headers.entrySet()) { sendClient(header.getKey() + ": " + header.getValue()); } } if (contentType != null) { sendClient("Content-Type: " + contentType); } closed = closed || !keepAlive; sendClient("Connection: " + (closed ? "close" : "keep-alive")); if (content != null && content.length > 0) { sendClient("Content-Length: " + content.length); } else if (headers == null || !"chunked".equals(headers.get("Transfer-Encoding"))) { sendClient("Content-Length: 0"); } sendClient(""); if (content != null && content.length > 0) { // full debug trace if (wireLogger.isDebugEnabled()) { wireLogger.debug("> " + new String(content, StandardCharsets.UTF_8)); } sendClient(content); } } /** * Decode HTTP credentials * * @param authorization http authorization header value * @throws IOException if invalid credentials */ protected void decodeCredentials(String authorization) throws IOException { int index = authorization.indexOf(' '); if (index > 0) { String mode = authorization.substring(0, index).toLowerCase(); if (!"basic".equals(mode)) { throw new DavMailException("EXCEPTION_UNSUPPORTED_AUTHORIZATION_MODE", mode); } String encodedCredentials = authorization.substring(index + 1); String decodedCredentials = IOUtil.decodeBase64AsString(encodedCredentials); index = decodedCredentials.indexOf(':'); if (index > 0) { userName = decodedCredentials.substring(0, index); password = decodedCredentials.substring(index + 1); } else { throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } else { throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } protected static class CaldavRequest { protected final String command; protected final String path; protected final String[] pathElements; protected final Map headers; protected int depth; protected final String body; protected final HashMap properties = new HashMap<>(); protected HashSet hrefs; protected boolean isMultiGet; protected String timeRangeStart; protected String timeRangeEnd; protected boolean vTodoOnly; protected boolean vEventOnly; protected CaldavRequest(String command, String path, Map headers, String body) throws IOException { this.command = command; this.path = path.replaceAll("//", "/"); pathElements = this.path.split("/"); this.headers = headers; buildDepth(); this.body = body; if (isPropFind() || isReport() || isMkCalendar() || isPropPatch()) { parseXmlBody(); } } public boolean isOptions() { return "OPTIONS".equals(command); } public boolean isPropFind() { return "PROPFIND".equals(command); } public boolean isPropPatch() { return "PROPPATCH".equals(command); } public boolean isReport() { return "REPORT".equals(command); } public boolean isGet() { return "GET".equals(command); } public boolean isHead() { return "HEAD".equals(command); } public boolean isPut() { return "PUT".equals(command); } public boolean isPost() { return "POST".equals(command); } public boolean isDelete() { return "DELETE".equals(command); } public boolean isMkCalendar() { return "MKCALENDAR".equals(command); } public boolean isMove() { return "MOVE".equals(command); } /** * Check if this request is a folder request. * * @return true if this is a folder (not event) request */ public boolean isFolder() { return path.endsWith("/") || isPropFind() || isReport() || isPropPatch() || isOptions() || isPost(); } public boolean isRoot() { return (pathElements.length == 0 || pathElements.length == 1); } public boolean isPathLength(int length) { return pathElements.length == length; } public int getPathLength() { return pathElements.length; } public String getPath() { return path; } public String getPath(String subFolder) { String folderPath; if (subFolder == null || subFolder.length() == 0) { folderPath = path; } else if (path.endsWith("/")) { folderPath = path + subFolder; } else { folderPath = path + '/' + subFolder; } if (folderPath.endsWith("/")) { return folderPath; } else { return folderPath + '/'; } } /** * Check if path element at index is value * * @param index path element index * @param value path value * @return true if path element at index is value */ public boolean isPath(int index, String value) { return value != null && value.equals(getPathElement(index)); } protected String getPathElement(int index) { if (index < pathElements.length) { return pathElements[index]; } else { return null; } } public String getLastPath() { return getPathElement(getPathLength() - 1); } protected boolean isBrokenHrefEncoding() { return isUserAgent("DAVKit/3") || isUserAgent("eM Client/3") || isBrokenLightning(); } protected boolean isBrokenLightning() { return isUserAgent("Lightning/1.0b2"); } protected boolean isLightning() { return isUserAgent("Lightning/") || isUserAgent("Thunderbird/"); } protected boolean isIcal5() { return isUserAgent("CoreDAV/") || isUserAgent("iOS/") // iCal 6 || isUserAgent("Mac OS X/10.8"); } protected boolean isUserAgent(String key) { String userAgent = headers.get("user-agent"); return userAgent != null && userAgent.contains(key); } public boolean isFreeBusy() { return body != null && body.contains("VFREEBUSY"); } protected void buildDepth() { String depthValue = headers.get("depth"); if ("infinity".equalsIgnoreCase(depthValue)) { depth = Integer.MAX_VALUE; } else if (depthValue != null) { try { depth = Integer.parseInt(depthValue); } catch (NumberFormatException e) { DavGatewayTray.warn(new BundleMessage("LOG_INVALID_DEPTH", depthValue)); } } } public int getDepth() { return depth; } public String getBody() { return body; } public String getHeader(String headerName) { return headers.get(headerName); } protected void parseXmlBody() throws IOException { if (body == null) { throw new DavMailException("EXCEPTION_INVALID_CALDAV_REQUEST", "Missing body"); } XMLStreamReader streamReader = null; try { streamReader = XMLStreamUtil.createXMLStreamReader(body); while (streamReader.hasNext()) { streamReader.next(); if (XMLStreamUtil.isStartTag(streamReader)) { String tagLocalName = streamReader.getLocalName(); if ("prop".equals(tagLocalName)) { handleProp(streamReader); } else if ("calendar-multiget".equals(tagLocalName) || "addressbook-multiget".equals(tagLocalName)) { isMultiGet = true; } else if ("comp-filter".equals(tagLocalName)) { handleCompFilter(streamReader); } else if ("href".equals(tagLocalName)) { if (hrefs == null) { hrefs = new HashSet<>(); } if (isBrokenHrefEncoding()) { hrefs.add(streamReader.getElementText()); } else { hrefs.add(URIUtil.decode(StringUtil.encodePlusSign(streamReader.getElementText()))); } } } } } catch (XMLStreamException e) { throw new DavMailException("EXCEPTION_INVALID_CALDAV_REQUEST", e.getMessage()); } finally { try { if (streamReader != null) { streamReader.close(); } } catch (XMLStreamException e) { DavGatewayTray.error(e); } } } public void handleCompFilter(XMLStreamReader reader) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "comp-filter")) { reader.next(); if (XMLStreamUtil.isStartTag(reader, "comp-filter")) { String name = reader.getAttributeValue(null, "name"); if ("VEVENT".equals(name)) { vEventOnly = true; } else if ("VTODO".equals(name)) { vTodoOnly = true; } } else if (XMLStreamUtil.isStartTag(reader, "time-range")) { timeRangeStart = reader.getAttributeValue(null, "start"); timeRangeEnd = reader.getAttributeValue(null, "end"); } } } public void handleProp(XMLStreamReader reader) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "prop")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); String tagText = null; if ("displayname".equals(tagLocalName) || reader.hasText()) { tagText = XMLStreamUtil.getElementText(reader); } properties.put(tagLocalName, tagText); } } } public boolean hasProperty(String propertyName) { return properties.containsKey(propertyName); } public String getProperty(String propertyName) { return properties.get(propertyName); } public boolean isMultiGet() { return isMultiGet && hrefs != null; } public Set getHrefs() { return hrefs; } @Override public String toString() { return command + ' ' + path + " Depth: " + depth + '\n' + body; } /** * Get request folder path. * * @return exchange folder path */ public String getFolderPath() { return getFolderPath(null); } public String getParentFolderPath() { int endIndex; if (isFolder()) { endIndex = getPathLength() - 1; } else { endIndex = getPathLength() - 2; } return getFolderPath(endIndex, null); } /** * Get request folder path with subFolder. * * @param subFolder sub folder path * @return folder path */ public String getFolderPath(String subFolder) { int endIndex; if (isFolder()) { endIndex = getPathLength(); } else { endIndex = getPathLength() - 1; } return getFolderPath(endIndex, subFolder); } protected String getFolderPath(int endIndex, String subFolder) { StringBuilder calendarPath = new StringBuilder(); for (int i = 0; i < endIndex; i++) { if (getPathElement(i).length() > 0) { calendarPath.append('/').append(getPathElement(i)); } } if (subFolder != null && subFolder.length() > 0) { calendarPath.append('/').append(subFolder); } if (this.isUserAgent("Address%20Book") || this.isUserAgent("Darwin")) { /* WARNING - This is a kludge - * If your public folder address book path has spaces, then Address Book app just ignores that account * This kludge allows you to specify the path in which spaces are encoded as ___ * It'll make Address book to not ignore the account and communicate with DavMail. * Here we replace the ___ in the path with spaces. Be warned if your actual address book path has ___ * it'll fail. */ String result = calendarPath.toString(); // replace unsupported spaces if (result.indexOf(' ') >= 0) { result = result.replaceAll("___", " "); } // replace /addressbook suffix on public folders if (result.startsWith("/public")) { result = result.replaceAll("/addressbook", ""); } return result; } else { return calendarPath.toString(); } } } /** * Http chunked response. */ protected class ChunkedResponse { Writer writer; protected ChunkedResponse(int status, String contentType) throws IOException { writer = new OutputStreamWriter(new BufferedOutputStream(new OutputStream() { @Override public void write(byte[] data, int offset, int length) throws IOException { sendClient(Integer.toHexString(length)); sendClient(data, offset, length); if (wireLogger.isDebugEnabled()) { wireLogger.debug("> " + new String(data, offset, length, StandardCharsets.UTF_8)); } sendClient(""); } @Override public void write(int b) { throw new UnsupportedOperationException(); } @Override public void close() throws IOException { sendClient("0"); sendClient(""); } }), StandardCharsets.UTF_8); sendChunkedHttpResponse(status, contentType); } public void append(String data) throws IOException { writer.write(data); } public void close() throws IOException { writer.close(); } } /** * Caldav response wrapper, content sent in chunked mode to avoid timeout */ protected class CaldavResponse extends ChunkedResponse { protected CaldavResponse(int status) throws IOException { super(status, "text/xml;charset=UTF-8"); writer.write(""); } public void startMultistatus() throws IOException { writer.write(""); } public void startResponse(String href) throws IOException { writer.write(""); writer.write(""); writer.write(StringUtil.xmlEncode(href)); writer.write(""); } public void startPropstat() throws IOException { writer.write(""); writer.write(""); } public void appendCalendarData(String ics) throws IOException { if (ics != null && ics.length() > 0) { writer.write(""); writer.write(StringUtil.xmlEncode(ics)); writer.write(""); } } public void appendContactData(String vcard) throws IOException { if (vcard != null && vcard.length() > 0) { writer.write(""); writer.write(StringUtil.xmlEncode(vcard)); writer.write(""); } } public void appendHrefProperty(String propertyName, String propertyValue) throws IOException { appendProperty(propertyName, null, "" + StringUtil.xmlEncode(propertyValue) + ""); } public void appendProperty(String propertyName) throws IOException { appendProperty(propertyName, null); } public void appendProperty(String propertyName, String propertyValue) throws IOException { appendProperty(propertyName, null, propertyValue); } public void appendProperty(String propertyName, String namespace, String propertyValue) throws IOException { if (propertyValue != null) { startTag(propertyName, namespace); writer.write('>'); writer.write(propertyValue); writer.write("'); } else { startTag(propertyName, namespace); writer.write("/>"); } } private void startTag(String propertyName, String namespace) throws IOException { writer.write('<'); writer.write(propertyName); if (namespace != null) { writer.write(" xmlns:"); writer.write(namespace); } } public void endPropStatOK() throws IOException { writer.write("HTTP/1.1 200 OK"); } public void appendPropstatNotFound() throws IOException { writer.write("HTTP/1.1 404 Not Found"); } public void endResponse() throws IOException { writer.write(""); } public void endMultistatus() throws IOException { writer.write(""); } public void startScheduleResponse() throws IOException { writer.write(""); } public void startRecipientResponse(String recipient) throws IOException { writer.write(""); writer.write(recipient); writer.write("2.0;Success"); } public void endRecipientResponse() throws IOException { writer.write(""); } public void endScheduleResponse() throws IOException { writer.write(""); } } } davmail-6.3.0/src/java/davmail/caldav/CaldavServer.java0100644 0000000 0000000 00000003344 12564151517 021502 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.caldav; import davmail.AbstractConnection; import davmail.AbstractServer; import davmail.Settings; import java.net.Socket; /** * Calendar server, handle HTTP Caldav requests. */ public class CaldavServer extends AbstractServer { /** * Default HTTP Caldav port */ public static final int DEFAULT_PORT = 80; /** * Create a ServerSocket to listen for connections. * Start the thread. * * @param port pop listen port, 80 if not defined (0) */ public CaldavServer(int port) { super(CaldavServer.class.getName(), port, CaldavServer.DEFAULT_PORT); nosslFlag = Settings.getBooleanProperty("davmail.ssl.nosecurecaldav"); } @Override public String getProtocolName() { return "CALDAV"; } @Override public AbstractConnection createConnectionHandler(Socket clientSocket) { return new CaldavConnection(clientSocket); } }davmail-6.3.0/src/java/davmail/exception/DavMailAuthenticationException.java0100644 0000000 0000000 00000003012 12564151517 025751 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exception; /** * I18 AuthenticationException subclass. */ public class DavMailAuthenticationException extends DavMailException { /** * Create a DavMail authentication exception with the given BundleMessage key. * * @param key message key */ public DavMailAuthenticationException(String key) { super(key); } /** * Create a DavMail authentication exception with the given BundleMessage key and arguments. * * @param key message key * @param arguments message values */ public DavMailAuthenticationException(String key, Object... arguments) { super(key, arguments); } } davmail-6.3.0/src/java/davmail/exception/DavMailException.java0100644 0000000 0000000 00000003766 12564151517 023071 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exception; import davmail.BundleMessage; import java.io.IOException; import java.util.Locale; /** * I18 IOException subclass. */ public class DavMailException extends IOException { private final BundleMessage message; /** * Create a DavMail exception with the given BundleMessage key and arguments. * * @param key message key * @param arguments message values */ public DavMailException(String key, Object... arguments) { this.message = new BundleMessage(key, arguments); } /** * Get formatted message * * @return english formatted message */ @Override public String getMessage() { return message.formatLog(); } /** * Get formatted message using locale. * * @param locale locale * @return localized formatted message */ public String getMessage(Locale locale) { return message.format(locale); } /** * Get internal exception BundleMessage. * * @return unformatted message */ public BundleMessage getBundleMessage() { return message; } } davmail-6.3.0/src/java/davmail/exception/HttpForbiddenException.java0100644 0000000 0000000 00000002464 13575531320 024277 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exception; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; /** * HttpResponseException with 403 forbidden status. */ public class HttpForbiddenException extends HttpResponseException { /** * HttpResponseException with 403 forbidden status. * * @param message exception message */ public HttpForbiddenException(String message) { super(HttpStatus.SC_FORBIDDEN, message); } } davmail-6.3.0/src/java/davmail/exception/HttpNotFoundException.java0100644 0000000 0000000 00000002462 13575531320 024135 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exception; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; /** * HttpResponseException with 404 not found status. */ public class HttpNotFoundException extends HttpResponseException { /** * HttpResponseException with 404 not found status. * * @param message exception message */ public HttpNotFoundException(String message) { super(HttpStatus.SC_NOT_FOUND, message); } } davmail-6.3.0/src/java/davmail/exception/HttpPreconditionFailedException.java0100644 0000000 0000000 00000002544 13575531320 026144 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exception; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; /** * HttpResponseException with 412 precondition failed status. */ public class HttpPreconditionFailedException extends HttpResponseException { /** * HttpResponseException with 412 precondition failed status. * * @param message exception message */ public HttpPreconditionFailedException(String message) { super(HttpStatus.SC_PRECONDITION_FAILED, message); } } davmail-6.3.0/src/java/davmail/exception/HttpServerErrorException.java0100644 0000000 0000000 00000002534 13575531320 024661 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exception; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; /** * HttpResponseException with 500 internal server error status. */ public class HttpServerErrorException extends HttpResponseException { /** * HttpResponseException with 500 internal server error status. * * @param message exception message */ public HttpServerErrorException(String message) { super(HttpStatus.SC_INTERNAL_SERVER_ERROR, message); } } davmail-6.3.0/src/java/davmail/exception/InsufficientStorageException.java0100644 0000000 0000000 00000002541 13575531320 025512 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exception; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; /** * HttpResponseException with 507 Insufficient Storage status. */ public class InsufficientStorageException extends HttpResponseException { /** * HttpResponseException with 507 Insufficient Storage status. * * @param message exception message */ public InsufficientStorageException(String message) { super(HttpStatus.SC_INSUFFICIENT_STORAGE, message); } }davmail-6.3.0/src/java/davmail/exception/LoginTimeoutException.java0100644 0000000 0000000 00000002402 13575531320 024152 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exception; import org.apache.http.client.HttpResponseException; /** * HttpResponseException with 440 login timeout status. */ public class LoginTimeoutException extends HttpResponseException { /** * HttpResponseException with 550 login timeout status. * * @param message exception message */ public LoginTimeoutException(String message) { super(440, message); } } davmail-6.3.0/src/java/davmail/exception/WebdavNotAvailableException.java0100644 0000000 0000000 00000002451 12564151517 025234 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exception; /** * Exchange 2007 with Webdav disabled will trigger this exception. */ public class WebdavNotAvailableException extends DavMailException { /** * Create a DavMail exception with the given BundleMessage key and arguments. * * @param key message key * @param arguments message values */ public WebdavNotAvailableException(String key, Object... arguments) { super(key, arguments); } } davmail-6.3.0/src/java/davmail/exchange/DoubleDotInputStream.java0100644 0000000 0000000 00000005076 13454122541 023524 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import java.io.IOException; import java.io.InputStream; import java.io.PushbackInputStream; /** * Replace double dot lines with single dot in input stream. * A line with a single dot means end of stream */ public class DoubleDotInputStream extends PushbackInputStream { final int[] buffer = new int[4]; int index = -1; public DoubleDotInputStream(InputStream in) { super(in, 4); } /** * Push current byte to buffer and read next byte. * * @return next byte * @throws IOException on error */ protected int readNextByte() throws IOException { int b = super.read(); buffer[++index] = b; return b; } @Override public int read() throws IOException { int b = super.read(); if (b == '\r') { // \r\n if (readNextByte() == '\n') { // \r\n. if (readNextByte() == '.') { // \r\n.\r if (readNextByte() == '\r') { // \r\n.\r\n if (readNextByte() == '\n') { // end of stream index = -1; b = -1; } // \r\n.. } else if (buffer[index] == '.') { // replace double dot index--; } } } // push back characters if (index >= 0) { while (index >= 0) { unread(buffer[index--]); } } } return b; } } davmail-6.3.0/src/java/davmail/exchange/DoubleDotOutputStream.java0100644 0000000 0000000 00000004210 13454122541 023712 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; /** * RFC 1939: 3 Basic Operations * [...] * If any line begins with the termination octet, the line is "byte-stuffed" by * pre-pending the termination octet to that line of the response. */ public class DoubleDotOutputStream extends FilterOutputStream { // remember last 2 bytes written final int[] buf = {0, 0}; public DoubleDotOutputStream(OutputStream out) { super(out); } @Override public void write(int b) throws IOException { if (b == '.' && (buf[0] == '\r' || buf[0] == '\n' || buf[0] == 0)) { // line starts with '.', prepend it with an additional '.' out.write('.'); } out.write(b); buf[1] = buf[0]; buf[0] = b; } /** * RFC 1939: 3 Basic Operations * [...] * Hence a multi-line response is terminated with the five octets * "CRLF.CRLF" *

* Do not close actual outputstream * * @throws IOException on error */ @Override public void close() throws IOException { if (buf[1] != '\r' || buf[0] != '\n') { out.write('\r'); out.write('\n'); } out.write('.'); out.write('\r'); out.write('\n'); } } davmail-6.3.0/src/java/davmail/exchange/ExchangeSession.java0100644 0000000 0000000 00000350320 14754417473 022547 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.BundleMessage; import davmail.Settings; import davmail.exception.DavMailException; import davmail.exception.HttpNotFoundException; import davmail.http.URIUtil; import davmail.ui.NotificationDialog; import davmail.util.StringUtil; import org.apache.log4j.Logger; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetHeaders; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimePart; import javax.mail.util.SharedByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.StringReader; import java.net.NoRouteToHostException; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * Exchange session through Outlook Web Access (DAV) */ public abstract class ExchangeSession { protected static final Logger LOGGER = Logger.getLogger("davmail.exchange.ExchangeSession"); /** * Reference GMT timezone to format dates */ public static final SimpleTimeZone GMT_TIMEZONE = new SimpleTimeZone(0, "GMT"); protected static final int FREE_BUSY_INTERVAL = 15; protected static final String PUBLIC_ROOT = "/public/"; protected static final String CALENDAR = "calendar"; protected static final String TASKS = "tasks"; /** * Contacts folder logical name */ public static final String CONTACTS = "contacts"; protected static final String ADDRESSBOOK = "addressbook"; protected static final String INBOX = "INBOX"; protected static final String LOWER_CASE_INBOX = "inbox"; protected static final String MIXED_CASE_INBOX = "Inbox"; protected static final String SENT = "Sent"; protected static final String SENDMSG = "##DavMailSubmissionURI##"; protected static final String DRAFTS = "Drafts"; protected static final String TRASH = "Trash"; protected static final String JUNK = "Junk"; protected static final String UNSENT = "Unsent Messages"; protected static final List SPECIAL = Arrays.asList(SENT, DRAFTS, TRASH, JUNK); static { // Adjust Mime decoder settings System.setProperty("mail.mime.ignoreunknownencoding", "true"); System.setProperty("mail.mime.decodetext.strict", "false"); } protected String publicFolderUrl; /** * Base user mailboxes path (used to select folder) */ protected String mailPath; protected String rootPath; protected String email; protected String alias; /** * Lower case Caldav path to current user mailbox. * /users/email */ protected String currentMailboxPath; protected String userName; protected String serverVersion; protected static final String YYYY_MM_DD_HH_MM_SS = "yyyy/MM/dd HH:mm:ss"; private static final String YYYYMMDD_T_HHMMSS_Z = "yyyyMMdd'T'HHmmss'Z'"; protected static final String YYYY_MM_DD_T_HHMMSS_Z = "yyyy-MM-dd'T'HH:mm:ss'Z'"; private static final String YYYY_MM_DD = "yyyy-MM-dd"; private static final String YYYY_MM_DD_T_HHMMSS_SSS_Z = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; public ExchangeSession() { // empty constructor } /** * Close session. * Shutdown http client connection manager */ public abstract void close(); /** * Format date to exchange search format. * * @param date date object * @return formatted search date */ public abstract String formatSearchDate(Date date); /** * Return standard zulu date formatter. * * @return zulu date formatter */ public static SimpleDateFormat getZuluDateFormat() { SimpleDateFormat dateFormat = new SimpleDateFormat(YYYYMMDD_T_HHMMSS_Z, Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); return dateFormat; } protected static SimpleDateFormat getVcardBdayFormat() { SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD, Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); return dateFormat; } protected static SimpleDateFormat getExchangeDateFormat(String value) { SimpleDateFormat dateFormat; if (value.length() == 8) { dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); } else if (value.length() == 15) { dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); } else if (value.length() == 16) { dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); } else { dateFormat = ExchangeSession.getExchangeZuluDateFormat(); } return dateFormat; } protected static SimpleDateFormat getExchangeZuluDateFormat() { SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD_T_HHMMSS_Z, Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); return dateFormat; } protected static SimpleDateFormat getExchangeZuluDateFormatMillisecond() { SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD_T_HHMMSS_SSS_Z, Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); return dateFormat; } protected static Date parseDate(String dateString) throws ParseException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); dateFormat.setTimeZone(GMT_TIMEZONE); return dateFormat.parse(dateString); } /** * Test if the session expired. * * @return true this session expired * @throws NoRouteToHostException on error * @throws UnknownHostException on error */ public boolean isExpired() throws NoRouteToHostException, UnknownHostException { boolean isExpired = false; try { getFolder(""); } catch (UnknownHostException | NoRouteToHostException exc) { throw exc; } catch (IOException e) { isExpired = true; } return isExpired; } protected abstract void buildSessionInfo(java.net.URI uri) throws IOException; /** * Create message in specified folder. * Will overwrite an existing message with same subject in the same folder * * @param folderPath Exchange folder path * @param messageName message name * @param properties message properties (flags) * @param mimeMessage MIME message * @throws IOException when unable to create message */ public abstract Message createMessage(String folderPath, String messageName, HashMap properties, MimeMessage mimeMessage) throws IOException; /** * Update given properties on message. * * @param message Exchange message * @param properties Webdav properties map * @throws IOException on error */ public abstract void updateMessage(Message message, Map properties) throws IOException; /** * Delete Exchange message. * * @param message Exchange message * @throws IOException on error */ public abstract void deleteMessage(Message message) throws IOException; /** * Get raw MIME message content * * @param message Exchange message * @return message body * @throws IOException on error */ protected abstract byte[] getContent(Message message) throws IOException; protected static final Set POP_MESSAGE_ATTRIBUTES = new HashSet<>(); static { POP_MESSAGE_ATTRIBUTES.add("uid"); POP_MESSAGE_ATTRIBUTES.add("imapUid"); POP_MESSAGE_ATTRIBUTES.add("messageSize"); } /** * Return folder message list with id and size only (for POP3 listener). * * @param folderName Exchange folder name * @return folder message list * @throws IOException on error */ public MessageList getAllMessageUidAndSize(String folderName) throws IOException { return searchMessages(folderName, POP_MESSAGE_ATTRIBUTES, null); } protected static final Set IMAP_MESSAGE_ATTRIBUTES = new HashSet<>(); static { IMAP_MESSAGE_ATTRIBUTES.add("permanenturl"); IMAP_MESSAGE_ATTRIBUTES.add("urlcompname"); IMAP_MESSAGE_ATTRIBUTES.add("uid"); IMAP_MESSAGE_ATTRIBUTES.add("messageSize"); IMAP_MESSAGE_ATTRIBUTES.add("imapUid"); IMAP_MESSAGE_ATTRIBUTES.add("junk"); IMAP_MESSAGE_ATTRIBUTES.add("flagStatus"); IMAP_MESSAGE_ATTRIBUTES.add("messageFlags"); IMAP_MESSAGE_ATTRIBUTES.add("lastVerbExecuted"); IMAP_MESSAGE_ATTRIBUTES.add("read"); IMAP_MESSAGE_ATTRIBUTES.add("deleted"); IMAP_MESSAGE_ATTRIBUTES.add("date"); IMAP_MESSAGE_ATTRIBUTES.add("lastmodified"); // OSX IMAP requests content-class IMAP_MESSAGE_ATTRIBUTES.add("contentclass"); IMAP_MESSAGE_ATTRIBUTES.add("keywords"); } protected static final Set UID_MESSAGE_ATTRIBUTES = new HashSet<>(); static { UID_MESSAGE_ATTRIBUTES.add("uid"); } /** * Get all folder messages. * * @param folderPath Exchange folder name * @return message list * @throws IOException on error */ public MessageList searchMessages(String folderPath) throws IOException { return searchMessages(folderPath, IMAP_MESSAGE_ATTRIBUTES, null); } /** * Search folder for messages matching conditions, with attributes needed by IMAP listener. * * @param folderName Exchange folder name * @param condition search filter * @return message list * @throws IOException on error */ public MessageList searchMessages(String folderName, Condition condition) throws IOException { return searchMessages(folderName, IMAP_MESSAGE_ATTRIBUTES, condition); } /** * Search folder for messages matching conditions, with given attributes. * * @param folderName Exchange folder name * @param attributes requested Webdav attributes * @param condition search filter * @return message list * @throws IOException on error */ public abstract MessageList searchMessages(String folderName, Set attributes, Condition condition) throws IOException; /** * Get server version (Exchange2003, Exchange2007 or Exchange2010) * * @return server version */ public String getServerVersion() { return serverVersion; } public enum Operator { Or, And, Not, IsEqualTo, IsGreaterThan, IsGreaterThanOrEqualTo, IsLessThan, IsLessThanOrEqualTo, IsNull, IsTrue, IsFalse, Like, StartsWith, Contains } /** * Exchange search filter. */ public interface Condition { /** * Append condition to buffer. * * @param buffer search filter buffer */ void appendTo(StringBuilder buffer); /** * True if condition is empty. * * @return true if condition is empty */ boolean isEmpty(); /** * Test if the contact matches current condition. * * @param contact Exchange Contact * @return true if contact matches condition */ boolean isMatch(ExchangeSession.Contact contact); } /** * Attribute condition. */ public abstract static class AttributeCondition implements Condition { protected final String attributeName; protected final Operator operator; protected final String value; protected AttributeCondition(String attributeName, Operator operator, String value) { this.attributeName = attributeName; this.operator = operator; this.value = value; } public boolean isEmpty() { return false; } /** * Get attribute name. * * @return attribute name */ public String getAttributeName() { return attributeName; } /** * Condition value. * * @return value */ public String getValue() { return value; } } /** * Multiple condition. */ public abstract static class MultiCondition implements Condition { protected final Operator operator; protected final List conditions; protected MultiCondition(Operator operator, Condition... conditions) { this.operator = operator; this.conditions = new ArrayList<>(); for (Condition condition : conditions) { if (condition != null) { this.conditions.add(condition); } } } /** * Conditions list. * * @return conditions */ public List getConditions() { return conditions; } /** * Condition operator. * * @return operator */ public Operator getOperator() { return operator; } /** * Add a new condition. * * @param condition single condition */ public void add(Condition condition) { if (condition != null) { conditions.add(condition); } } public boolean isEmpty() { boolean isEmpty = true; for (Condition condition : conditions) { if (!condition.isEmpty()) { isEmpty = false; break; } } return isEmpty; } public boolean isMatch(ExchangeSession.Contact contact) { if (operator == Operator.And) { for (Condition condition : conditions) { if (!condition.isMatch(contact)) { return false; } } return true; } else if (operator == Operator.Or) { for (Condition condition : conditions) { if (condition.isMatch(contact)) { return true; } } return false; } else { return false; } } } /** * Not condition. */ public abstract static class NotCondition implements Condition { protected final Condition condition; protected NotCondition(Condition condition) { this.condition = condition; } public boolean isEmpty() { return condition.isEmpty(); } public boolean isMatch(ExchangeSession.Contact contact) { return !condition.isMatch(contact); } } /** * Single search filter condition. */ public abstract static class MonoCondition implements Condition { protected final String attributeName; protected final Operator operator; protected MonoCondition(String attributeName, Operator operator) { this.attributeName = attributeName; this.operator = operator; } public boolean isEmpty() { return false; } public boolean isMatch(ExchangeSession.Contact contact) { String actualValue = contact.get(attributeName); return (operator == Operator.IsNull && actualValue == null) || (operator == Operator.IsFalse && "false".equals(actualValue)) || (operator == Operator.IsTrue && "true".equals(actualValue)); } } /** * And search filter. * * @param condition search conditions * @return condition */ public abstract MultiCondition and(Condition... condition); /** * Or search filter. * * @param condition search conditions * @return condition */ public abstract MultiCondition or(Condition... condition); /** * Not search filter. * * @param condition search condition * @return condition */ public abstract Condition not(Condition condition); /** * Equals condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ public abstract Condition isEqualTo(String attributeName, String value); /** * Equals condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ public abstract Condition isEqualTo(String attributeName, int value); /** * MIME header equals condition. * * @param headerName MIME header name * @param value attribute value * @return condition */ public abstract Condition headerIsEqualTo(String headerName, String value); /** * Greater than or equals condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ public abstract Condition gte(String attributeName, String value); /** * Greater than condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ public abstract Condition gt(String attributeName, String value); /** * Lower than condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ public abstract Condition lt(String attributeName, String value); /** * Lower than or equals condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ @SuppressWarnings({"UnusedDeclaration"}) public abstract Condition lte(String attributeName, String value); /** * Contains condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ public abstract Condition contains(String attributeName, String value); /** * Starts with condition. * * @param attributeName logical Exchange attribute name * @param value attribute value * @return condition */ public abstract Condition startsWith(String attributeName, String value); /** * Is null condition. * * @param attributeName logical Exchange attribute name * @return condition */ public abstract Condition isNull(String attributeName); /** * Exists condition. * * @param attributeName logical Exchange attribute name * @return condition */ public abstract Condition exists(String attributeName); /** * Is true condition. * * @param attributeName logical Exchange attribute name * @return condition */ public abstract Condition isTrue(String attributeName); /** * Is false condition. * * @param attributeName logical Exchange attribute name * @return condition */ public abstract Condition isFalse(String attributeName); /** * Search mail and generic folders under given folder. * Exclude calendar and contacts folders * * @param folderName Exchange folder name * @param recursive deep search if true * @return list of folders * @throws IOException on error */ public List getSubFolders(String folderName, boolean recursive, boolean wildcard) throws IOException { MultiCondition folderCondition = and(); if (!Settings.getBooleanProperty("davmail.imapIncludeSpecialFolders", false)) { folderCondition.add(or(isEqualTo("folderclass", "IPF.Note"), isEqualTo("folderclass", "IPF.Note.Microsoft.Conversation"), isNull("folderclass"))); } if (wildcard) { folderCondition.add(startsWith("displayname", folderName)); folderName = ""; } List results = getSubFolders(folderName, folderCondition, recursive); // need to include base folder in recursive search, except on root if (recursive && folderName.length() > 0) { results.add(getFolder(folderName)); } return results; } /** * Search calendar folders under given folder. * * @param folderName Exchange folder name * @param recursive deep search if true * @return list of folders * @throws IOException on error */ public List getSubCalendarFolders(String folderName, boolean recursive) throws IOException { return getSubFolders(folderName, isEqualTo("folderclass", "IPF.Appointment"), recursive); } /** * Search folders under given folder matching filter. * * @param folderName Exchange folder name * @param condition search filter * @param recursive deep search if true * @return list of folders * @throws IOException on error */ public abstract List getSubFolders(String folderName, Condition condition, boolean recursive) throws IOException; /** * Delete oldest messages in trash. * keepDelay is the number of days to keep messages in trash before delete * * @throws IOException when unable to purge messages */ public void purgeOldestTrashAndSentMessages() throws IOException { int keepDelay = Settings.getIntProperty("davmail.keepDelay"); if (keepDelay != 0) { purgeOldestFolderMessages(TRASH, keepDelay); } // this is a new feature, default is : do nothing int sentKeepDelay = Settings.getIntProperty("davmail.sentKeepDelay"); if (sentKeepDelay != 0) { purgeOldestFolderMessages(SENT, sentKeepDelay); } } protected void purgeOldestFolderMessages(String folderPath, int keepDelay) throws IOException { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, -keepDelay); LOGGER.debug("Delete messages in " + folderPath + " not modified since " + cal.getTime()); MessageList messages = searchMessages(folderPath, UID_MESSAGE_ATTRIBUTES, lt("lastmodified", formatSearchDate(cal.getTime()))); for (Message message : messages) { message.delete(); } } protected void convertResentHeader(MimeMessage mimeMessage, String headerName) throws MessagingException { String[] resentHeader = mimeMessage.getHeader("Resent-" + headerName); if (resentHeader != null) { mimeMessage.removeHeader("Resent-" + headerName); mimeMessage.removeHeader(headerName); for (String value : resentHeader) { mimeMessage.addHeader(headerName, value); } } } protected String lastSentMessageId; /** * Send message in reader to recipients. * Detect visible recipients in message body to determine bcc recipients * * @param rcptToRecipients recipients list * @param mimeMessage mime message * @throws IOException on error * @throws MessagingException on error */ public void sendMessage(List rcptToRecipients, MimeMessage mimeMessage) throws IOException, MessagingException { // detect duplicate send command String messageId = mimeMessage.getMessageID(); if (lastSentMessageId != null && lastSentMessageId.equals(messageId)) { LOGGER.debug("Dropping message id " + messageId + ": already sent"); return; } lastSentMessageId = messageId; convertResentHeader(mimeMessage, "From"); convertResentHeader(mimeMessage, "To"); convertResentHeader(mimeMessage, "Cc"); convertResentHeader(mimeMessage, "Bcc"); convertResentHeader(mimeMessage, "Message-Id"); // do not allow send as another user on Exchange 2003 if ("Exchange2003".equals(serverVersion) || Settings.getBooleanProperty("davmail.smtpStripFrom", false)) { mimeMessage.removeHeader("From"); } // remove visible recipients from list Set visibleRecipients = new HashSet<>(); List recipients = getAllRecipients(mimeMessage); for (InternetAddress address : recipients) { visibleRecipients.add((address.getAddress().toLowerCase())); } for (String recipient : rcptToRecipients) { if (!visibleRecipients.contains(recipient.toLowerCase())) { mimeMessage.addRecipient(javax.mail.Message.RecipientType.BCC, new InternetAddress(recipient)); } } sendMessage(mimeMessage); } static final String[] RECIPIENT_HEADERS = {"to", "cc", "bcc"}; protected List getAllRecipients(MimeMessage mimeMessage) throws MessagingException { List recipientList = new ArrayList<>(); for (String recipientHeader : RECIPIENT_HEADERS) { final String recipientHeaderValue = mimeMessage.getHeader(recipientHeader, ","); if (recipientHeaderValue != null) { // parse headers in non strict mode recipientList.addAll(Arrays.asList(InternetAddress.parseHeader(recipientHeaderValue, false))); } } return recipientList; } /** * Send Mime message. * * @param mimeMessage MIME message * @throws IOException on error * @throws MessagingException on error */ public abstract void sendMessage(MimeMessage mimeMessage) throws IOException, MessagingException; /** * Get folder object. * Folder name can be logical names INBOX, Drafts, Trash or calendar, * or a path relative to user base folder or absolute path. * * @param folderPath folder path * @return Folder object * @throws IOException on error */ public ExchangeSession.Folder getFolder(String folderPath) throws IOException { Folder folder = internalGetFolder(folderPath); if (isMainCalendar(folderPath)) { Folder taskFolder = internalGetFolder(TASKS); folder.ctag += taskFolder.ctag; } return folder; } protected abstract Folder internalGetFolder(String folderName) throws IOException; /** * Check folder ctag and reload messages as needed. * * @param currentFolder current folder * @return true if folder changed * @throws IOException on error */ public boolean refreshFolder(Folder currentFolder) throws IOException { Folder newFolder = getFolder(currentFolder.folderPath); if (currentFolder.ctag == null || !currentFolder.ctag.equals(newFolder.ctag) // ctag stamp is limited to second, check message count || !(currentFolder.count == newFolder.count) ) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Contenttag or count changed on " + currentFolder.folderPath + " ctag: " + currentFolder.ctag + " => " + newFolder.ctag + " count: " + currentFolder.count + " => " + newFolder.count + ", reloading messages"); } currentFolder.hasChildren = newFolder.hasChildren; currentFolder.noInferiors = newFolder.noInferiors; currentFolder.unreadCount = newFolder.unreadCount; currentFolder.ctag = newFolder.ctag; currentFolder.etag = newFolder.etag; if (newFolder.uidNext > currentFolder.uidNext) { currentFolder.uidNext = newFolder.uidNext; } currentFolder.loadMessages(); return true; } else { return false; } } /** * Create Exchange message folder. * * @param folderName logical folder name * @throws IOException on error */ public void createMessageFolder(String folderName) throws IOException { createFolder(folderName, "IPF.Note", null); } /** * Create Exchange calendar folder. * * @param folderName logical folder name * @param properties folder properties * @return status * @throws IOException on error */ public int createCalendarFolder(String folderName, Map properties) throws IOException { return createFolder(folderName, "IPF.Appointment", properties); } /** * Create Exchange contact folder. * * @param folderName logical folder name * @param properties folder properties * @throws IOException on error */ public void createContactFolder(String folderName, Map properties) throws IOException { createFolder(folderName, "IPF.Contact", properties); } /** * Create Exchange folder with given folder class. * * @param folderName logical folder name * @param folderClass folder class * @param properties folder properties * @return status * @throws IOException on error */ public abstract int createFolder(String folderName, String folderClass, Map properties) throws IOException; /** * Update Exchange folder properties. * * @param folderName logical folder name * @param properties folder properties * @return status * @throws IOException on error */ public abstract int updateFolder(String folderName, Map properties) throws IOException; /** * Delete Exchange folder. * * @param folderName logical folder name * @throws IOException on error */ public abstract void deleteFolder(String folderName) throws IOException; /** * Copy message to target folder * * @param message Exchange message * @param targetFolder target folder * @throws IOException on error */ public abstract void copyMessage(Message message, String targetFolder) throws IOException; public void copyMessages(List messages, String targetFolder) throws IOException { for (Message message : messages) { copyMessage(message, targetFolder); } } /** * Move message to target folder * * @param message Exchange message * @param targetFolder target folder * @throws IOException on error */ public abstract void moveMessage(Message message, String targetFolder) throws IOException; public void moveMessages(List messages, String targetFolder) throws IOException { for (Message message : messages) { moveMessage(message, targetFolder); } } /** * Move folder to target name. * * @param folderName current folder name/path * @param targetName target folder name/path * @throws IOException on error */ public abstract void moveFolder(String folderName, String targetName) throws IOException; /** * Move item from source path to target path. * * @param sourcePath item source path * @param targetPath item target path * @throws IOException on error */ public abstract void moveItem(String sourcePath, String targetPath) throws IOException; protected abstract void moveToTrash(Message message) throws IOException; /** * Convert keyword value to IMAP flag. * * @param value keyword value * @return IMAP flag */ public String convertKeywordToFlag(String value) { // first test for keyword in settings Properties flagSettings = Settings.getSubProperties("davmail.imapFlags"); Enumeration flagSettingsEnum = flagSettings.propertyNames(); while (flagSettingsEnum.hasMoreElements()) { String key = (String) flagSettingsEnum.nextElement(); if (value.equalsIgnoreCase(flagSettings.getProperty(key))) { return key; } } ResourceBundle flagBundle = ResourceBundle.getBundle("imapflags"); Enumeration flagBundleEnum = flagBundle.getKeys(); while (flagBundleEnum.hasMoreElements()) { String key = flagBundleEnum.nextElement(); if (value.equalsIgnoreCase(flagBundle.getString(key))) { return key; } } // fall back to raw value return value; } /** * Convert IMAP flag to keyword value. * * @param value IMAP flag * @return keyword value */ public String convertFlagToKeyword(String value) { // first test for flag in settings Properties flagSettings = Settings.getSubProperties("davmail.imapFlags"); // case insensitive lookup for (String key : flagSettings.stringPropertyNames()) { if (key.equalsIgnoreCase(value)) { return flagSettings.getProperty(key); } } // fall back to predefined flags ResourceBundle flagBundle = ResourceBundle.getBundle("imapflags"); for (String key : flagBundle.keySet()) { if (key.equalsIgnoreCase(value)) { return flagBundle.getString(key); } } // fall back to raw value return value; } /** * Convert IMAP flags to keyword value. * * @param flags IMAP flags * @return keyword value */ public String convertFlagsToKeywords(HashSet flags) { HashSet keywordSet = new HashSet<>(); for (String flag : flags) { keywordSet.add(decodeKeyword(convertFlagToKeyword(flag))); } return StringUtil.join(keywordSet, ","); } protected String decodeKeyword(String keyword) { String result = keyword; if (keyword.contains("_x0028_") || keyword.contains("_x0029_")) { result = result.replaceAll("_x0028_", "(") .replaceAll("_x0029_", ")"); } return result; } protected String encodeKeyword(String keyword) { String result = keyword; if (keyword.indexOf('(') >= 0|| keyword.indexOf(')') >= 0) { result = result.replaceAll("\\(", "_x0028_") .replaceAll("\\)", "_x0029_" ); } return result; } /** * Exchange folder with IMAP properties */ public class Folder { /** * Logical (IMAP) folder path. */ public String folderPath; /** * Display Name. */ public String displayName; /** * Folder class (PR_CONTAINER_CLASS). */ public String folderClass; /** * Folder message count. */ public int count; /** * Folder unread message count. */ public int unreadCount; /** * true if folder has subfolders (DAV:hassubs). */ public boolean hasChildren; /** * true if folder has no subfolders (DAV:nosubs). */ public boolean noInferiors; /** * Folder content tag (to detect folder content changes). */ public String ctag; /** * Folder etag (to detect folder object changes). */ public String etag; /** * Next IMAP uid */ public long uidNext; /** * recent count */ public int recent; /** * Folder message list, empty before loadMessages call. */ public ExchangeSession.MessageList messages; /** * Permanent uid (PR_SEARCH_KEY) to IMAP UID map. */ private final HashMap permanentUrlToImapUidMap = new HashMap<>(); /** * Get IMAP folder flags. * * @return folder flags in IMAP format */ public String getFlags() { String specialFlag = ""; if (isSpecial()) { specialFlag = "\\" + folderPath + " "; } if (noInferiors) { return specialFlag + "\\NoInferiors"; } else if (hasChildren) { return specialFlag + "\\HasChildren"; } else { return specialFlag + "\\HasNoChildren"; } } /** * Special folder flag (Sent, Drafts, Trash, Junk). * @return true if folder is special */ public boolean isSpecial() { return SPECIAL.contains(folderPath); } /** * Load folder messages. * * @throws IOException on error */ public void loadMessages() throws IOException { messages = ExchangeSession.this.searchMessages(folderPath, null); fixUids(messages); recent = 0; for (Message message : messages) { if (message.recent) { recent++; } } long computedUidNext = 1; if (!messages.isEmpty()) { computedUidNext = messages.get(messages.size() - 1).getImapUid() + 1; } if (computedUidNext > uidNext) { uidNext = computedUidNext; } } /** * Search messages in folder matching query. * * @param condition search query * @return message list * @throws IOException on error */ public MessageList searchMessages(Condition condition) throws IOException { MessageList localMessages = ExchangeSession.this.searchMessages(folderPath, condition); fixUids(localMessages); return localMessages; } /** * Restore previous uids changed by a PROPPATCH (flag change). * * @param messages message list */ protected void fixUids(MessageList messages) { boolean sortNeeded = false; for (Message message : messages) { if (permanentUrlToImapUidMap.containsKey(message.getPermanentId())) { long previousUid = permanentUrlToImapUidMap.get(message.getPermanentId()); if (message.getImapUid() != previousUid) { LOGGER.debug("Restoring IMAP uid " + message.getImapUid() + " -> " + previousUid + " for message " + message.getPermanentId()); message.setImapUid(previousUid); sortNeeded = true; } } else { // add message to uid map permanentUrlToImapUidMap.put(message.getPermanentId(), message.getImapUid()); } } if (sortNeeded) { Collections.sort(messages); } } /** * Folder message count. * * @return message count */ public int count() { if (messages == null) { return count; } else { return messages.size(); } } /** * Compute IMAP uidnext. * * @return max(messageuids)+1 */ public long getUidNext() { return uidNext; } /** * Get message at index. * * @param index message index * @return message */ public Message get(int index) { return messages.get(index); } /** * Get current folder messages imap uids and flags * * @return imap uid list */ public TreeMap getImapFlagMap() { TreeMap imapFlagMap = new TreeMap<>(); for (ExchangeSession.Message message : messages) { imapFlagMap.put(message.getImapUid(), message.getImapFlags()); } return imapFlagMap; } /** * Calendar folder flag. * * @return true if this is a calendar folder */ public boolean isCalendar() { return "IPF.Appointment".equals(folderClass); } /** * Contact folder flag. * * @return true if this is a calendar folder */ public boolean isContact() { return "IPF.Contact".equals(folderClass); } /** * Task folder flag. * * @return true if this is a task folder */ public boolean isTask() { return "IPF.Task".equals(folderClass); } /** * drop cached message */ public void clearCache() { messages.cachedMimeContent = null; messages.cachedMimeMessage = null; messages.cachedMessageImapUid = 0; } } /** * Exchange message. */ public abstract class Message implements Comparable { /** * enclosing message list */ public MessageList messageList; /** * Message url. */ public String messageUrl; /** * Message permanent url (does not change on message move). */ public String permanentUrl; /** * Message uid. */ public String uid; /** * Message content class. */ public String contentClass; /** * Message keywords (categories). */ public String keywords; /** * Message IMAP uid, unique in folder (x0e230003). */ public long imapUid; /** * MAPI message size. */ public int size; /** * Message date (urn:schemas:mailheader:date). */ public String date; /** * Message flag: read. */ public boolean read; /** * Message flag: deleted. */ public boolean deleted; /** * Message flag: junk. */ public boolean junk; /** * Message flag: flagged. */ public boolean flagged; /** * Message flag: recent. */ public boolean recent; /** * Message flag: draft. */ public boolean draft; /** * Message flag: answered. */ public boolean answered; /** * Message flag: fowarded. */ public boolean forwarded; /** * Unparsed message content. */ protected byte[] mimeContent; /** * Message content parsed in a MIME message. */ protected MimeMessage mimeMessage; /** * Get permanent message id. * permanentUrl over WebDav or IitemId over EWS * * @return permanent id */ public abstract String getPermanentId(); /** * IMAP uid , unique in folder (x0e230003) * * @return IMAP uid */ public long getImapUid() { return imapUid; } /** * Set IMAP uid. * * @param imapUid new uid */ public void setImapUid(long imapUid) { this.imapUid = imapUid; } /** * Exchange uid. * * @return uid */ public String getUid() { return uid; } /** * Return message flags in IMAP format. * * @return IMAP flags */ public String getImapFlags() { StringBuilder buffer = new StringBuilder(); if (read) { buffer.append("\\Seen "); } if (deleted) { buffer.append("\\Deleted "); } if (recent) { buffer.append("\\Recent "); } if (flagged) { buffer.append("\\Flagged "); } if (junk) { buffer.append("Junk "); } if (draft) { buffer.append("\\Draft "); } if (answered) { buffer.append("\\Answered "); } if (forwarded) { buffer.append("$Forwarded "); } if (keywords != null) { for (String keyword : keywords.split(",")) { buffer.append(encodeKeyword(convertKeywordToFlag(keyword))).append(" "); } } return buffer.toString().trim(); } /** * Load message content in a Mime message * * @throws IOException on error * @throws MessagingException on error */ public void loadMimeMessage() throws IOException, MessagingException { if (mimeMessage == null) { // try to get message content from cache if (this.imapUid == messageList.cachedMessageImapUid // make sure we never return null even with broken 0 uid message && messageList.cachedMimeContent != null && messageList.cachedMimeMessage != null) { mimeContent = messageList.cachedMimeContent; mimeMessage = messageList.cachedMimeMessage; LOGGER.debug("Got message content for " + imapUid + " from cache"); } else { // load and parse message mimeContent = getContent(this); mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(mimeContent)); // workaround for Exchange 2003 ActiveSync bug if (mimeMessage.getHeader("MAIL FROM") != null) { // find start of actual message byte[] mimeContentCopy = new byte[((SharedByteArrayInputStream) mimeMessage.getRawInputStream()).available()]; int offset = mimeContent.length - mimeContentCopy.length; // remove unwanted header System.arraycopy(mimeContent, offset, mimeContentCopy, 0, mimeContentCopy.length); mimeContent = mimeContentCopy; mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(mimeContent)); } LOGGER.debug("Downloaded full message content for IMAP UID " + imapUid + " (" + mimeContent.length + " bytes)"); } } } /** * Get message content as a Mime message. * * @return mime message * @throws IOException on error * @throws MessagingException on error */ public MimeMessage getMimeMessage() throws IOException, MessagingException { loadMimeMessage(); return mimeMessage; } public Enumeration getMatchingHeaderLinesFromHeaders(String[] headerNames) throws MessagingException { Enumeration result = null; if (mimeMessage == null) { // message not loaded, try to get headers only InputStream headers = getMimeHeaders(); if (headers != null) { InternetHeaders internetHeaders = new InternetHeaders(headers); if (internetHeaders.getHeader("Subject") == null) { // invalid header content return null; } if (headerNames == null) { result = internetHeaders.getAllHeaderLines(); } else { result = internetHeaders.getMatchingHeaderLines(headerNames); } } } return result; } public Enumeration getMatchingHeaderLines(String[] headerNames) throws MessagingException, IOException { Enumeration result = getMatchingHeaderLinesFromHeaders(headerNames); if (result == null) { if (headerNames == null) { result = getMimeMessage().getAllHeaderLines(); } else { result = getMimeMessage().getMatchingHeaderLines(headerNames); } } return result; } protected abstract InputStream getMimeHeaders(); /** * Get message body size. * * @return mime message size * @throws IOException on error * @throws MessagingException on error */ public int getMimeMessageSize() throws IOException, MessagingException { loadMimeMessage(); return mimeContent.length; } /** * Get message body input stream. * * @return mime message InputStream * @throws IOException on error * @throws MessagingException on error */ public InputStream getRawInputStream() throws IOException, MessagingException { loadMimeMessage(); return new SharedByteArrayInputStream(mimeContent); } /** * Drop mime message to avoid keeping message content in memory, * keep a single message in MessageList cache to handle chunked fetch. */ public void dropMimeMessage() { // update single message cache if (mimeMessage != null) { messageList.cachedMessageImapUid = imapUid; messageList.cachedMimeContent = mimeContent; messageList.cachedMimeMessage = mimeMessage; } // drop curent message body to save memory mimeMessage = null; mimeContent = null; } public boolean isLoaded() { // check and retrieve cached content if (imapUid == messageList.cachedMessageImapUid) { mimeContent = messageList.cachedMimeContent; mimeMessage = messageList.cachedMimeMessage; } return mimeMessage != null; } /** * Delete message. * * @throws IOException on error */ public void delete() throws IOException { deleteMessage(this); } /** * Move message to trash, mark message read. * * @throws IOException on error */ public void moveToTrash() throws IOException { markRead(); ExchangeSession.this.moveToTrash(this); } /** * Mark message as read. * * @throws IOException on error */ public void markRead() throws IOException { HashMap properties = new HashMap<>(); properties.put("read", "1"); updateMessage(this, properties); } /** * Comparator to sort messages by IMAP uid * * @param message other message * @return imapUid comparison result */ public int compareTo(Message message) { long compareValue = (imapUid - message.imapUid); if (compareValue > 0) { return 1; } else if (compareValue < 0) { return -1; } else { return 0; } } /** * Override equals, compare IMAP uids * * @param message other message * @return true if IMAP uids are equal */ @Override public boolean equals(Object message) { return message instanceof Message && imapUid == ((Message) message).imapUid; } /** * Override hashCode, return imapUid hashcode. * * @return imapUid hashcode */ @Override public int hashCode() { return (int) (imapUid ^ (imapUid >>> 32)); } public String removeFlag(String flag) { if (keywords != null) { final String exchangeFlag = convertFlagToKeyword(flag); Set keywordSet = new HashSet<>(); String[] keywordArray = keywords.split(","); for (String value : keywordArray) { if (!value.equalsIgnoreCase(exchangeFlag)) { keywordSet.add(value); } } keywords = StringUtil.join(keywordSet, ","); } return keywords; } public String addFlag(String flag) { final String exchangeFlag = convertFlagToKeyword(flag); HashSet keywordSet = new HashSet<>(); boolean hasFlag = false; if (keywords != null) { String[] keywordArray = keywords.split(","); for (String value : keywordArray) { keywordSet.add(value); if (value.equalsIgnoreCase(exchangeFlag)) { hasFlag = true; } } } if (!hasFlag) { keywordSet.add(exchangeFlag); } keywords = StringUtil.join(keywordSet, ","); return keywords; } public String setFlags(HashSet flags) { keywords = convertFlagsToKeywords(flags); return keywords; } } /** * Message list, includes a single messsage cache */ public static class MessageList extends ArrayList { /** * Cached message content parsed in a MIME message. */ protected transient MimeMessage cachedMimeMessage; /** * Cached message uid. */ protected transient long cachedMessageImapUid; /** * Cached unparsed message */ protected transient byte[] cachedMimeContent; } /** * Generic folder item. */ public abstract static class Item extends HashMap { protected String folderPath; protected String itemName; protected String permanentUrl; /** * Display name. */ public String displayName; /** * item etag */ public String etag; protected String noneMatch; /** * Build item instance. * * @param folderPath folder path * @param itemName item name class * @param etag item etag * @param noneMatch none match flag */ public Item(String folderPath, String itemName, String etag, String noneMatch) { this.folderPath = folderPath; this.itemName = itemName; this.etag = etag; this.noneMatch = noneMatch; } /** * Default constructor. */ protected Item() { } /** * Return item content type * * @return content type */ public abstract String getContentType(); /** * Retrieve item body from Exchange * * @return item body * @throws IOException on error */ public abstract String getBody() throws IOException; /** * Get event name (file name part in URL). * * @return event name */ public String getName() { return itemName; } /** * Get event etag (last change tag). * * @return event etag */ public String getEtag() { return etag; } /** * Set item href. * * @param href item href */ public void setHref(String href) { int index = href.lastIndexOf('/'); if (index >= 0) { folderPath = href.substring(0, index); itemName = href.substring(index + 1); } else { throw new IllegalArgumentException(href); } } /** * Return item href. * * @return item href */ public String getHref() { return folderPath + '/' + itemName; } public void setItemName(String itemName) { this.itemName = itemName; } } /** * Contact object */ public abstract class Contact extends Item { protected ArrayList distributionListMembers = null; protected String vCardVersion; public Contact(String folderPath, String itemName, Map properties, String etag, String noneMatch) { super(folderPath, itemName.endsWith(".vcf") ? itemName.substring(0, itemName.length() - 3) + "EML" : itemName, etag, noneMatch); this.putAll(properties); } protected Contact() { } public void setVCardVersion(String vCardVersion) { this.vCardVersion = vCardVersion; } public abstract ItemResult createOrUpdate() throws IOException; /** * Convert EML extension to vcf. * * @return item name */ @Override public String getName() { String name = super.getName(); if (name.endsWith(".EML")) { name = name.substring(0, name.length() - 3) + "vcf"; } return name; } /** * Set contact name * * @param name contact name */ public void setName(String name) { this.itemName = name; } /** * Compute vcard uid from name. * * @return uid */ public String getUid() { String uid = getName(); int dotIndex = uid.lastIndexOf('.'); if (dotIndex > 0) { uid = uid.substring(0, dotIndex); } return URIUtil.encodePath(uid); } @Override public String getContentType() { return "text/vcard"; } public void addMember(String member) { if (distributionListMembers == null) { distributionListMembers = new ArrayList<>(); } distributionListMembers.add(member); } @Override public String getBody() { // build RFC 2426 VCard from contact information VCardWriter writer = new VCardWriter(); writer.startCard(vCardVersion); writer.appendProperty("UID", getUid()); // common name String cn = get("cn"); if (cn == null) { cn = get("displayname"); } String sn = get("sn"); if (sn == null) { sn = cn; } writer.appendProperty("FN", cn); // RFC 2426: Family Name, Given Name, Additional Names, Honorific Prefixes, and Honorific Suffixes writer.appendProperty("N", sn, get("givenName"), get("middlename"), get("personaltitle"), get("namesuffix")); if (distributionListMembers != null) { writer.appendProperty("KIND", "group"); for (String member : distributionListMembers) { writer.appendProperty("MEMBER", member); } } writer.appendProperty("TEL;TYPE=cell", get("mobile")); writer.appendProperty("TEL;TYPE=work", get("telephoneNumber")); writer.appendProperty("TEL;TYPE=home", get("homePhone")); writer.appendProperty("TEL;TYPE=fax", get("facsimiletelephonenumber")); writer.appendProperty("TEL;TYPE=pager", get("pager")); writer.appendProperty("TEL;TYPE=car", get("othermobile")); writer.appendProperty("TEL;TYPE=home,fax", get("homefax")); writer.appendProperty("TEL;TYPE=isdn", get("internationalisdnnumber")); writer.appendProperty("TEL;TYPE=msg", get("otherTelephone")); // The structured type value corresponds, in sequence, to the post office box; the extended address; // the street address; the locality (e.g., city); the region (e.g., state or province); // the postal code; the country name writer.appendProperty("ADR;TYPE=home", get("homepostofficebox"), null, get("homeStreet"), get("homeCity"), get("homeState"), get("homePostalCode"), get("homeCountry")); writer.appendProperty("ADR;TYPE=work", get("postofficebox"), get("roomnumber"), get("street"), get("l"), get("st"), get("postalcode"), get("co")); writer.appendProperty("ADR;TYPE=other", get("otherpostofficebox"), null, get("otherstreet"), get("othercity"), get("otherstate"), get("otherpostalcode"), get("othercountry")); writer.appendProperty("EMAIL;TYPE=work", get("smtpemail1")); writer.appendProperty("EMAIL;TYPE=home", get("smtpemail2")); writer.appendProperty("EMAIL;TYPE=other", get("smtpemail3")); writer.appendProperty("ORG", get("o"), get("department")); writer.appendProperty("URL;TYPE=work", get("businesshomepage")); writer.appendProperty("URL;TYPE=home", get("personalHomePage")); writer.appendProperty("TITLE", get("title")); writer.appendProperty("NOTE", get("description")); writer.appendProperty("CUSTOM1", get("extensionattribute1")); writer.appendProperty("CUSTOM2", get("extensionattribute2")); writer.appendProperty("CUSTOM3", get("extensionattribute3")); writer.appendProperty("CUSTOM4", get("extensionattribute4")); writer.appendProperty("ROLE", get("profession")); writer.appendProperty("NICKNAME", get("nickname")); writer.appendProperty("X-AIM", get("im")); writer.appendProperty("BDAY", convertZuluDateToBday(get("bday"))); writer.appendProperty("ANNIVERSARY", convertZuluDateToBday(get("anniversary"))); String gender = get("gender"); if ("1".equals(gender)) { writer.appendProperty("SEX", "2"); } else if ("2".equals(gender)) { writer.appendProperty("SEX", "1"); } writer.appendProperty("CATEGORIES", get("keywords")); writer.appendProperty("FBURL", get("fburl")); if ("1".equals(get("private"))) { writer.appendProperty("CLASS", "PRIVATE"); } writer.appendProperty("X-ASSISTANT", get("secretarycn")); writer.appendProperty("X-MANAGER", get("manager")); writer.appendProperty("X-SPOUSE", get("spousecn")); writer.appendProperty("REV", get("lastmodified")); ContactPhoto contactPhoto = null; if (Settings.getBooleanProperty("davmail.carddavReadPhoto", true)) { if (("true".equals(get("haspicture")))) { try { contactPhoto = getContactPhoto(this); } catch (IOException e) { LOGGER.warn("Unable to get photo from contact " + this.get("cn")); } } if (contactPhoto == null) { contactPhoto = getADPhoto(get("smtpemail1")); } } if (contactPhoto != null) { writer.writeLine("PHOTO;TYPE=" + contactPhoto.contentType + ";ENCODING=BASE64:"); writer.writeLine(contactPhoto.content, true); } writer.appendProperty("KEY1;X509;ENCODING=BASE64", get("msexchangecertificate")); writer.appendProperty("KEY2;X509;ENCODING=BASE64", get("usersmimecertificate")); writer.endCard(); return writer.toString(); } } /** * Calendar event object. */ public abstract class Event extends Item { protected String contentClass; protected String subject; protected VCalendar vCalendar; public Event(String folderPath, String itemName, String contentClass, String itemBody, String etag, String noneMatch) throws IOException { super(folderPath, itemName, etag, noneMatch); this.contentClass = contentClass; fixICS(itemBody.getBytes(StandardCharsets.UTF_8), false); // fix task item name if (vCalendar.isTodo() && this.itemName.endsWith(".ics")) { this.itemName = itemName.substring(0, itemName.length() - 3) + "EML"; } } protected Event() { } @Override public String getContentType() { return "text/calendar;charset=UTF-8"; } @Override public String getBody() throws IOException { if (vCalendar == null) { fixICS(getEventContent(), true); } return vCalendar.toString(); } protected HttpNotFoundException buildHttpNotFoundException(Exception e) { String message = "Unable to get event " + getName() + " subject: " + subject + " at " + permanentUrl + ": " + e.getMessage(); LOGGER.warn(message); return new HttpNotFoundException(message); } /** * Retrieve item body from Exchange * * @return item content * @throws IOException on error */ public abstract byte[] getEventContent() throws IOException; protected static final String TEXT_CALENDAR = "text/calendar"; protected static final String APPLICATION_ICS = "application/ics"; protected boolean isCalendarContentType(String contentType) { return TEXT_CALENDAR.regionMatches(true, 0, contentType, 0, TEXT_CALENDAR.length()) || APPLICATION_ICS.regionMatches(true, 0, contentType, 0, APPLICATION_ICS.length()); } protected MimePart getCalendarMimePart(MimeMultipart multiPart) throws IOException, MessagingException { MimePart bodyPart = null; for (int i = 0; i < multiPart.getCount(); i++) { String contentType = multiPart.getBodyPart(i).getContentType(); if (isCalendarContentType(contentType)) { bodyPart = (MimePart) multiPart.getBodyPart(i); break; } else if (contentType.startsWith("multipart")) { Object content = multiPart.getBodyPart(i).getContent(); if (content instanceof MimeMultipart) { bodyPart = getCalendarMimePart((MimeMultipart) content); } } } return bodyPart; } /** * Load ICS content from MIME message input stream * * @param mimeInputStream mime message input stream * @return mime message ics attachment body * @throws IOException on error * @throws MessagingException on error */ protected byte[] getICS(InputStream mimeInputStream) throws IOException, MessagingException { byte[] result; MimeMessage mimeMessage = new MimeMessage(null, mimeInputStream); String[] contentClassHeader = mimeMessage.getHeader("Content-class"); // task item, return null if (contentClassHeader != null && contentClassHeader.length > 0 && "urn:content-classes:task".equals(contentClassHeader[0])) { return null; } Object mimeBody = mimeMessage.getContent(); MimePart bodyPart = null; if (mimeBody instanceof MimeMultipart) { bodyPart = getCalendarMimePart((MimeMultipart) mimeBody); } else if (isCalendarContentType(mimeMessage.getContentType())) { // no multipart, single body bodyPart = mimeMessage; } if (bodyPart != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bodyPart.getDataHandler().writeTo(baos); baos.close(); result = baos.toByteArray(); } else { ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); baos.close(); throw new DavMailException("EXCEPTION_INVALID_MESSAGE_CONTENT", new String(baos.toByteArray(), StandardCharsets.UTF_8)); } return result; } protected void fixICS(byte[] icsContent, boolean fromServer) throws IOException { if (LOGGER.isDebugEnabled() && fromServer) { dumpIndex++; String icsBody = new String(icsContent, StandardCharsets.UTF_8); ICSCalendarValidator.ValidationResult vr = ICSCalendarValidator.validateWithDetails(icsBody); dumpICS(icsBody, true, false); LOGGER.debug("Vcalendar body ValidationResult: "+ vr.isValid() +" "+ vr.showReason()); LOGGER.debug("Vcalendar body received from server:\n" + icsBody); } vCalendar = new VCalendar(icsContent, getEmail(), getVTimezone()); vCalendar.fixVCalendar(fromServer); if (LOGGER.isDebugEnabled() && !fromServer) { String resultString = vCalendar.toString(); ICSCalendarValidator.ValidationResult vr = ICSCalendarValidator.validateWithDetails(resultString); LOGGER.debug("Fixed Vcalendar body ValidationResult: "+ vr.isValid() +" "+ vr.showReason()); LOGGER.debug("Fixed Vcalendar body to server:\n" + resultString); dumpICS(resultString, false, true); } } protected void dumpICS(String icsBody, boolean fromServer, boolean after) { String logFileDirectory = Settings.getLogFileDirectory(); // additional setting to activate ICS dump (not available in GUI) int dumpMax = Settings.getIntProperty("davmail.dumpICS"); if (dumpMax > 0) { if (dumpIndex > dumpMax) { // Delete the oldest dump file final int oldest = dumpIndex - dumpMax; try { File[] oldestFiles = (new File(logFileDirectory)).listFiles((dir, name) -> { if (name.endsWith(".ics")) { int dashIndex = name.indexOf('-'); if (dashIndex > 0) { try { int fileIndex = Integer.parseInt(name.substring(0, dashIndex)); return fileIndex < oldest; } catch (NumberFormatException nfe) { // ignore } } } return false; }); if (oldestFiles != null) { for (File file : oldestFiles) { if (!file.delete()) { LOGGER.warn("Unable to delete " + file.getAbsolutePath()); } } } } catch (Exception ex) { LOGGER.warn("Error deleting ics dump: " + ex.getMessage()); } } StringBuilder filePath = new StringBuilder(); filePath.append(logFileDirectory).append('/') .append(dumpIndex) .append(after ? "-to" : "-from") .append((after ^ fromServer) ? "-server" : "-client") .append(".ics"); if ((icsBody != null) && (icsBody.length() > 0)) { OutputStreamWriter writer = null; try { writer = new OutputStreamWriter(new FileOutputStream(filePath.toString()), StandardCharsets.UTF_8); writer.write(icsBody); } catch (IOException e) { LOGGER.error(e); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { LOGGER.error(e); } } } } } } /** * Build Mime body for event or event message. * * @return mimeContent as byte array or null * @throws IOException on error */ public byte[] createMimeContent() throws IOException { String boundary = UUID.randomUUID().toString(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); MimeOutputStreamWriter writer = new MimeOutputStreamWriter(baos); writer.writeHeader("Content-Transfer-Encoding", "7bit"); writer.writeHeader("Content-class", contentClass); // append date writer.writeHeader("Date", new Date()); // Make sure invites have a proper subject line String vEventSubject = vCalendar.getFirstVeventPropertyValue("SUMMARY"); if (vEventSubject == null) { vEventSubject = BundleMessage.format("MEETING_REQUEST"); } // Write a part of the message that contains the // ICS description so that invites contain the description text String description = vCalendar.getFirstVeventPropertyValue("DESCRIPTION"); // handle notifications if ("urn:content-classes:calendarmessage".equals(contentClass)) { // need to parse attendees and organizer to build recipients VCalendar.Recipients recipients = vCalendar.getRecipients(true); String to; String cc; String notificationSubject; if (email.equalsIgnoreCase(recipients.organizer)) { // current user is organizer => notify all to = recipients.attendees; cc = recipients.optionalAttendees; notificationSubject = subject; } else { String status = vCalendar.getAttendeeStatus(); // notify only organizer to = recipients.organizer; cc = null; notificationSubject = (status != null) ? (BundleMessage.format(status) + vEventSubject) : subject; description = ""; } // Allow end user notification edit if (Settings.getBooleanProperty("davmail.caldavEditNotifications")) { // create notification edit dialog NotificationDialog notificationDialog = new NotificationDialog(to, cc, notificationSubject, description); if (!notificationDialog.getSendNotification()) { LOGGER.debug("Notification canceled by user"); return null; } // get description from dialog to = notificationDialog.getTo(); cc = notificationDialog.getCc(); notificationSubject = notificationDialog.getSubject(); description = notificationDialog.getBody(); } // do not send notification if no recipients found if ((to == null || to.length() == 0) && (cc == null || cc.length() == 0)) { return null; } writer.writeHeader("To", to); writer.writeHeader("Cc", cc); writer.writeHeader("Subject", notificationSubject); if (LOGGER.isDebugEnabled()) { StringBuilder logBuffer = new StringBuilder("Sending notification "); if (to != null) { logBuffer.append("to: ").append(to); } if (cc != null) { logBuffer.append("cc: ").append(cc); } LOGGER.debug(logBuffer.toString()); } } else { // need to parse attendees and organizer to build recipients VCalendar.Recipients recipients = vCalendar.getRecipients(false); // storing appointment, full recipients header if (recipients.attendees != null) { writer.writeHeader("To", recipients.attendees); } else { // use current user as attendee writer.writeHeader("To", email); } writer.writeHeader("Cc", recipients.optionalAttendees); if (recipients.organizer != null) { writer.writeHeader("From", recipients.organizer); } else { writer.writeHeader("From", email); } } if (vCalendar.getMethod() == null) { vCalendar.setPropertyValue("METHOD", "REQUEST"); } writer.writeHeader("MIME-Version", "1.0"); writer.writeHeader("Content-Type", "multipart/alternative;\r\n" + "\tboundary=\"----=_NextPart_" + boundary + '\"'); writer.writeLn(); writer.writeLn("This is a multi-part message in MIME format."); writer.writeLn(); writer.writeLn("------=_NextPart_" + boundary); if (description != null && description.length() > 0) { writer.writeHeader("Content-Type", "text/plain;\r\n" + "\tcharset=\"utf-8\""); writer.writeHeader("content-transfer-encoding", "8bit"); writer.writeLn(); writer.flush(); baos.write(description.getBytes(StandardCharsets.UTF_8)); writer.writeLn(); writer.writeLn("------=_NextPart_" + boundary); } writer.writeHeader("Content-class", contentClass); writer.writeHeader("Content-Type", "text/calendar;\r\n" + "\tmethod=" + vCalendar.getMethod() + ";\r\n" + "\tcharset=\"utf-8\"" ); writer.writeHeader("Content-Transfer-Encoding", "8bit"); writer.writeLn(); writer.flush(); baos.write(vCalendar.toString().getBytes(StandardCharsets.UTF_8)); writer.writeLn(); writer.writeLn("------=_NextPart_" + boundary + "--"); writer.close(); return baos.toByteArray(); } /** * Create or update item * * @return action result * @throws IOException on error */ public abstract ItemResult createOrUpdate() throws IOException; } protected abstract Set getItemProperties(); /** * Search contacts in provided folder. * * @param folderPath Exchange folder path * @param includeDistList include distribution lists * @return list of contacts * @throws IOException on error */ public List getAllContacts(String folderPath, boolean includeDistList) throws IOException { return searchContacts(folderPath, ExchangeSession.CONTACT_ATTRIBUTES, isEqualTo("outlookmessageclass", "IPM.Contact"), 0); } /** * Search contacts in provided folder matching the search query. * * @param folderPath Exchange folder path * @param attributes requested attributes * @param condition Exchange search query * @param maxCount maximum item count * @return list of contacts * @throws IOException on error */ public abstract List searchContacts(String folderPath, Set attributes, Condition condition, int maxCount) throws IOException; /** * Search calendar messages in provided folder. * * @param folderPath Exchange folder path * @return list of calendar messages as Event objects * @throws IOException on error */ public abstract List getEventMessages(String folderPath) throws IOException; /** * Search calendar events in provided folder. * * @param folderPath Exchange folder path * @return list of calendar events * @throws IOException on error */ public List getAllEvents(String folderPath) throws IOException { List results = searchEvents(folderPath, getCalendarItemCondition(getPastDelayCondition("dtstart"))); if (!Settings.getBooleanProperty("davmail.caldavDisableTasks", false) && isMainCalendar(folderPath)) { // retrieve tasks from main tasks folder results.addAll(searchTasksOnly(TASKS)); } return results; } protected abstract Condition getCalendarItemCondition(Condition dateCondition); protected Condition getPastDelayCondition(String attribute) { int caldavPastDelay = Settings.getIntProperty("davmail.caldavPastDelay"); Condition dateCondition = null; if (caldavPastDelay != 0) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_MONTH, -caldavPastDelay); dateCondition = gt(attribute, formatSearchDate(cal.getTime())); } return dateCondition; } protected Condition getRangeCondition(String timeRangeStart, String timeRangeEnd) throws IOException { try { SimpleDateFormat parser = getZuluDateFormat(); ExchangeSession.MultiCondition andCondition = and(); if (timeRangeStart != null) { andCondition.add(gt("dtend", formatSearchDate(parser.parse(timeRangeStart)))); } if (timeRangeEnd != null) { andCondition.add(lt("dtstart", formatSearchDate(parser.parse(timeRangeEnd)))); } return andCondition; } catch (ParseException e) { throw new IOException(e + " " + e.getMessage()); } } /** * Search events between start and end. * * @param folderPath Exchange folder path * @param timeRangeStart date range start in zulu format * @param timeRangeEnd date range start in zulu format * @return list of calendar events * @throws IOException on error */ public List searchEvents(String folderPath, String timeRangeStart, String timeRangeEnd) throws IOException { Condition dateCondition = getRangeCondition(timeRangeStart, timeRangeEnd); Condition condition = getCalendarItemCondition(dateCondition); return searchEvents(folderPath, condition); } /** * Search events between start and end, exclude tasks. * * @param folderPath Exchange folder path * @param timeRangeStart date range start in zulu format * @param timeRangeEnd date range start in zulu format * @return list of calendar events * @throws IOException on error */ public List searchEventsOnly(String folderPath, String timeRangeStart, String timeRangeEnd) throws IOException { Condition dateCondition = getRangeCondition(timeRangeStart, timeRangeEnd); return searchEvents(folderPath, getCalendarItemCondition(dateCondition)); } /** * Search tasks only (VTODO). * * @param folderPath Exchange folder path * @return list of tasks * @throws IOException on error */ public List searchTasksOnly(String folderPath) throws IOException { return searchEvents(folderPath, and(isEqualTo("outlookmessageclass", "IPM.Task"), or(isNull("datecompleted"), getPastDelayCondition("datecompleted")))); } /** * Search calendar events in provided folder. * * @param folderPath Exchange folder path * @param filter search filter * @return list of calendar events * @throws IOException on error */ public List searchEvents(String folderPath, Condition filter) throws IOException { Condition privateCondition = null; if (isSharedFolder(folderPath) && Settings.getBooleanProperty("davmail.excludePrivateEvents", true)) { LOGGER.debug("Shared or public calendar: exclude private events"); privateCondition = isEqualTo("sensitivity", 0); } return searchEvents(folderPath, getItemProperties(), and(filter, privateCondition)); } /** * Search calendar events or messages in provided folder matching the search query. * * @param folderPath Exchange folder path * @param attributes requested attributes * @param condition Exchange search query * @return list of calendar messages as Event objects * @throws IOException on error */ public abstract List searchEvents(String folderPath, Set attributes, Condition condition) throws IOException; /** * convert vcf extension to EML. * * @param itemName item name * @return EML item name */ protected String convertItemNameToEML(String itemName) { if (itemName.endsWith(".vcf")) { return itemName.substring(0, itemName.length() - 3) + "EML"; } else { return itemName; } } /** * Get item named eventName in folder * * @param folderPath Exchange folder path * @param itemName event name * @return event object * @throws IOException on error */ public abstract Item getItem(String folderPath, String itemName) throws IOException; /** * Contact picture */ public static class ContactPhoto { /** * Contact picture content type (always image/jpeg on read) */ public String contentType; /** * Base64 encoded picture content */ public String content; } /** * Retrieve contact photo attached to contact * * @param contact address book contact * @return contact photo * @throws IOException on error */ public abstract ContactPhoto getContactPhoto(Contact contact) throws IOException; /** * Retrieve contact photo from AD * * @param email address book contact * @return contact photo */ public ContactPhoto getADPhoto(String email) { return null; } /** * Delete event named itemName in folder * * @param folderPath Exchange folder path * @param itemName item name * @throws IOException on error */ public abstract void deleteItem(String folderPath, String itemName) throws IOException; /** * Mark event processed named eventName in folder * * @param folderPath Exchange folder path * @param itemName item name * @throws IOException on error */ public abstract void processItem(String folderPath, String itemName) throws IOException; private static int dumpIndex; /** * Replace iCal4 (Snow Leopard) principal paths with mailto expression * * @param value attendee value or ics line * @return fixed value */ protected String replaceIcal4Principal(String value) { if (value != null && value.contains("/principals/__uuids__/")) { return value.replaceAll("/principals/__uuids__/([^/]*)__AT__([^/]*)/", "mailto:$1@$2"); } else { return value; } } /** * Event result object to hold HTTP status and event etag from an event creation/update. */ public static class ItemResult { /** * HTTP status */ public int status; /** * Event etag from response HTTP header */ public String etag; /** * Created item name */ public String itemName; } /** * Build and send the MIME message for the provided ICS event. * * @param icsBody event in iCalendar format * @return HTTP status * @throws IOException on error */ public abstract int sendEvent(String icsBody) throws IOException; /** * Create or update item (event or contact) on the Exchange server * * @param folderPath Exchange folder path * @param itemName event name * @param itemBody event body in iCalendar format * @param etag previous event etag to detect concurrent updates * @param noneMatch if-none-match header value * @return HTTP response event result (status and etag) * @throws IOException on error */ public ItemResult createOrUpdateItem(String folderPath, String itemName, String itemBody, String etag, String noneMatch) throws IOException { if (itemBody.startsWith("BEGIN:VCALENDAR")) { return internalCreateOrUpdateEvent(folderPath, itemName, "urn:content-classes:appointment", itemBody, etag, noneMatch); } else if (itemBody.startsWith("BEGIN:VCARD")) { return createOrUpdateContact(folderPath, itemName, itemBody, etag, noneMatch); } else { throw new IOException(BundleMessage.format("EXCEPTION_INVALID_MESSAGE_CONTENT", itemBody)); } } static final String[] VCARD_N_PROPERTIES = {"sn", "givenName", "middlename", "personaltitle", "namesuffix"}; static final String[] VCARD_ADR_HOME_PROPERTIES = {"homepostofficebox", null, "homeStreet", "homeCity", "homeState", "homePostalCode", "homeCountry"}; static final String[] VCARD_ADR_WORK_PROPERTIES = {"postofficebox", "roomnumber", "street", "l", "st", "postalcode", "co"}; static final String[] VCARD_ADR_OTHER_PROPERTIES = {"otherpostofficebox", null, "otherstreet", "othercity", "otherstate", "otherpostalcode", "othercountry"}; static final String[] VCARD_ORG_PROPERTIES = {"o", "department"}; protected void convertContactProperties(Map properties, String[] contactProperties, List values) { for (int i = 0; i < values.size() && i < contactProperties.length; i++) { if (contactProperties[i] != null) { properties.put(contactProperties[i], values.get(i)); } } } protected ItemResult createOrUpdateContact(String folderPath, String itemName, String itemBody, String etag, String noneMatch) throws IOException { // parse VCARD body to build contact property map Map properties = new HashMap<>(); VObject vcard = new VObject(new ICSBufferedReader(new StringReader(itemBody))); if ("group".equalsIgnoreCase(vcard.getPropertyValue("KIND"))) { properties.put("outlookmessageclass", "IPM.DistList"); properties.put("displayname", vcard.getPropertyValue("FN")); } else { properties.put("outlookmessageclass", "IPM.Contact"); for (VProperty property : vcard.getProperties()) { if ("FN".equals(property.getKey())) { properties.put("cn", property.getValue()); properties.put("subject", property.getValue()); properties.put("fileas", property.getValue()); } else if ("N".equals(property.getKey())) { convertContactProperties(properties, VCARD_N_PROPERTIES, property.getValues()); } else if ("NICKNAME".equals(property.getKey())) { properties.put("nickname", property.getValue()); } else if ("TEL".equals(property.getKey())) { if (property.hasParam("TYPE", "cell") || property.hasParam("X-GROUP", "cell")) { properties.put("mobile", property.getValue()); } else if (property.hasParam("TYPE", "work") || property.hasParam("X-GROUP", "work")) { properties.put("telephoneNumber", property.getValue()); } else if (property.hasParam("TYPE", "home") || property.hasParam("X-GROUP", "home")) { properties.put("homePhone", property.getValue()); } else if (property.hasParam("TYPE", "fax")) { if (property.hasParam("TYPE", "home")) { properties.put("homefax", property.getValue()); } else { properties.put("facsimiletelephonenumber", property.getValue()); } } else if (property.hasParam("TYPE", "pager")) { properties.put("pager", property.getValue()); } else if (property.hasParam("TYPE", "car")) { properties.put("othermobile", property.getValue()); } else { properties.put("otherTelephone", property.getValue()); } } else if ("ADR".equals(property.getKey())) { // address if (property.hasParam("TYPE", "home")) { convertContactProperties(properties, VCARD_ADR_HOME_PROPERTIES, property.getValues()); } else if (property.hasParam("TYPE", "work")) { convertContactProperties(properties, VCARD_ADR_WORK_PROPERTIES, property.getValues()); // any other type goes to other address } else { convertContactProperties(properties, VCARD_ADR_OTHER_PROPERTIES, property.getValues()); } } else if ("EMAIL".equals(property.getKey())) { if (property.hasParam("TYPE", "home")) { properties.put("email2", property.getValue()); properties.put("smtpemail2", property.getValue()); } else if (property.hasParam("TYPE", "other")) { properties.put("email3", property.getValue()); properties.put("smtpemail3", property.getValue()); } else { properties.put("email1", property.getValue()); properties.put("smtpemail1", property.getValue()); } } else if ("ORG".equals(property.getKey())) { convertContactProperties(properties, VCARD_ORG_PROPERTIES, property.getValues()); } else if ("URL".equals(property.getKey())) { if (property.hasParam("TYPE", "work")) { properties.put("businesshomepage", property.getValue()); } else if (property.hasParam("TYPE", "home")) { properties.put("personalHomePage", property.getValue()); } else { // default: set personal home page properties.put("personalHomePage", property.getValue()); } } else if ("TITLE".equals(property.getKey())) { properties.put("title", property.getValue()); } else if ("NOTE".equals(property.getKey())) { properties.put("description", property.getValue()); } else if ("CUSTOM1".equals(property.getKey())) { properties.put("extensionattribute1", property.getValue()); } else if ("CUSTOM2".equals(property.getKey())) { properties.put("extensionattribute2", property.getValue()); } else if ("CUSTOM3".equals(property.getKey())) { properties.put("extensionattribute3", property.getValue()); } else if ("CUSTOM4".equals(property.getKey())) { properties.put("extensionattribute4", property.getValue()); } else if ("ROLE".equals(property.getKey())) { properties.put("profession", property.getValue()); } else if ("X-AIM".equals(property.getKey())) { properties.put("im", property.getValue()); } else if ("BDAY".equals(property.getKey())) { properties.put("bday", convertBDayToZulu(property.getValue())); } else if ("ANNIVERSARY".equals(property.getKey()) || "X-ANNIVERSARY".equals(property.getKey())) { properties.put("anniversary", convertBDayToZulu(property.getValue())); } else if ("CATEGORIES".equals(property.getKey())) { properties.put("keywords", property.getValue()); } else if ("CLASS".equals(property.getKey())) { if ("PUBLIC".equals(property.getValue())) { properties.put("sensitivity", "0"); properties.put("private", "false"); } else { properties.put("sensitivity", "2"); properties.put("private", "true"); } } else if ("SEX".equals(property.getKey())) { String propertyValue = property.getValue(); if ("1".equals(propertyValue)) { properties.put("gender", "2"); } else if ("2".equals(propertyValue)) { properties.put("gender", "1"); } } else if ("FBURL".equals(property.getKey())) { properties.put("fburl", property.getValue()); } else if ("X-ASSISTANT".equals(property.getKey())) { properties.put("secretarycn", property.getValue()); } else if ("X-MANAGER".equals(property.getKey())) { properties.put("manager", property.getValue()); } else if ("X-SPOUSE".equals(property.getKey())) { properties.put("spousecn", property.getValue()); } else if ("PHOTO".equals(property.getKey())) { properties.put("photo", property.getValue()); properties.put("haspicture", "true"); } else if ("KEY1".equals(property.getKey())) { properties.put("msexchangecertificate", property.getValue()); } else if ("KEY2".equals(property.getKey())) { properties.put("usersmimecertificate", property.getValue()); } } LOGGER.debug("Create or update contact " + itemName + ": " + properties); // reset missing properties to null for (String key : CONTACT_ATTRIBUTES) { if (!"imapUid".equals(key) && !"etag".equals(key) && !"urlcompname".equals(key) && !"lastmodified".equals(key) && !"sensitivity".equals(key) && !properties.containsKey(key)) { properties.put(key, null); } } } Contact contact = buildContact(folderPath, itemName, properties, etag, noneMatch); for (VProperty property : vcard.getProperties()) { if ("MEMBER".equals(property.getKey())) { String member = property.getValue(); if (member.startsWith("urn:uuid:")) { Item item = getItem(folderPath, member.substring(9) + ".EML"); if (item != null) { if (item.get("smtpemail1") != null) { member = "mailto:" + item.get("smtpemail1"); } else if (item.get("smtpemail2") != null) { member = "mailto:" + item.get("smtpemail2"); } else if (item.get("smtpemail3") != null) { member = "mailto:" + item.get("smtpemail3"); } } } contact.addMember(member); } } return contact.createOrUpdate(); } protected String convertZuluDateToBday(String value) { String result = null; if (value != null && value.length() > 0) { try { SimpleDateFormat parser = ExchangeSession.getZuluDateFormat(); Calendar cal = Calendar.getInstance(); cal.setTime(parser.parse(value)); cal.add(Calendar.HOUR_OF_DAY, 12); result = ExchangeSession.getVcardBdayFormat().format(cal.getTime()); } catch (ParseException e) { LOGGER.warn("Invalid date: " + value); } } return result; } protected String convertBDayToZulu(String value) { String result = null; if (value != null && value.length() > 0) { try { SimpleDateFormat parser; if (value.length() == 10) { parser = ExchangeSession.getVcardBdayFormat(); } else if (value.length() == 15) { parser = new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH); parser.setTimeZone(GMT_TIMEZONE); } else { parser = ExchangeSession.getExchangeZuluDateFormat(); } result = ExchangeSession.getExchangeZuluDateFormatMillisecond().format(parser.parse(value)); } catch (ParseException e) { LOGGER.warn("Invalid date: " + value); } } return result; } protected abstract Contact buildContact(String folderPath, String itemName, Map properties, String etag, String noneMatch) throws IOException; protected abstract ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException; /** * Get current Exchange alias name from login name * * @return user name */ public String getAliasFromLogin() { // login is email, not alias if (this.userName.indexOf('@') >= 0) { return null; } String result = this.userName; // remove domain name int index = Math.max(result.indexOf('\\'), result.indexOf('/')); if (index >= 0) { result = result.substring(index + 1); } return result; } /** * Test if folderPath is inside user mailbox. * * @param folderPath absolute folder path * @return true if folderPath is a public or shared folder */ public abstract boolean isSharedFolder(String folderPath); /** * Test if folderPath is main calendar. * * @param folderPath absolute folder path * @return true if folderPath is a public or shared folder */ public abstract boolean isMainCalendar(String folderPath) throws IOException; protected static final String MAILBOX_BASE = "/cn="; /** * Get current user email * * @return user email */ public String getEmail() { return email; } /** * Get current user alias * * @return user email */ public String getAlias() { return alias; } /** * Search global address list * * @param condition search filter * @param returningAttributes returning attributes * @param sizeLimit size limit * @return matching contacts from gal * @throws IOException on error */ public abstract Map galFind(Condition condition, Set returningAttributes, int sizeLimit) throws IOException; /** * Full Contact attribute list */ public static final Set CONTACT_ATTRIBUTES = new HashSet<>(); static { CONTACT_ATTRIBUTES.add("imapUid"); CONTACT_ATTRIBUTES.add("etag"); CONTACT_ATTRIBUTES.add("urlcompname"); CONTACT_ATTRIBUTES.add("extensionattribute1"); CONTACT_ATTRIBUTES.add("extensionattribute2"); CONTACT_ATTRIBUTES.add("extensionattribute3"); CONTACT_ATTRIBUTES.add("extensionattribute4"); CONTACT_ATTRIBUTES.add("bday"); CONTACT_ATTRIBUTES.add("anniversary"); CONTACT_ATTRIBUTES.add("businesshomepage"); CONTACT_ATTRIBUTES.add("personalHomePage"); CONTACT_ATTRIBUTES.add("cn"); CONTACT_ATTRIBUTES.add("co"); CONTACT_ATTRIBUTES.add("department"); CONTACT_ATTRIBUTES.add("smtpemail1"); CONTACT_ATTRIBUTES.add("smtpemail2"); CONTACT_ATTRIBUTES.add("smtpemail3"); CONTACT_ATTRIBUTES.add("facsimiletelephonenumber"); CONTACT_ATTRIBUTES.add("givenName"); CONTACT_ATTRIBUTES.add("homeCity"); CONTACT_ATTRIBUTES.add("homeCountry"); CONTACT_ATTRIBUTES.add("homePhone"); CONTACT_ATTRIBUTES.add("homePostalCode"); CONTACT_ATTRIBUTES.add("homeState"); CONTACT_ATTRIBUTES.add("homeStreet"); CONTACT_ATTRIBUTES.add("homepostofficebox"); CONTACT_ATTRIBUTES.add("l"); CONTACT_ATTRIBUTES.add("manager"); CONTACT_ATTRIBUTES.add("mobile"); CONTACT_ATTRIBUTES.add("namesuffix"); CONTACT_ATTRIBUTES.add("nickname"); CONTACT_ATTRIBUTES.add("o"); CONTACT_ATTRIBUTES.add("pager"); CONTACT_ATTRIBUTES.add("personaltitle"); CONTACT_ATTRIBUTES.add("postalcode"); CONTACT_ATTRIBUTES.add("postofficebox"); CONTACT_ATTRIBUTES.add("profession"); CONTACT_ATTRIBUTES.add("roomnumber"); CONTACT_ATTRIBUTES.add("secretarycn"); CONTACT_ATTRIBUTES.add("sn"); CONTACT_ATTRIBUTES.add("spousecn"); CONTACT_ATTRIBUTES.add("st"); CONTACT_ATTRIBUTES.add("street"); CONTACT_ATTRIBUTES.add("telephoneNumber"); CONTACT_ATTRIBUTES.add("title"); CONTACT_ATTRIBUTES.add("description"); CONTACT_ATTRIBUTES.add("im"); CONTACT_ATTRIBUTES.add("middlename"); CONTACT_ATTRIBUTES.add("lastmodified"); CONTACT_ATTRIBUTES.add("otherstreet"); CONTACT_ATTRIBUTES.add("otherstate"); CONTACT_ATTRIBUTES.add("otherpostofficebox"); CONTACT_ATTRIBUTES.add("otherpostalcode"); CONTACT_ATTRIBUTES.add("othercountry"); CONTACT_ATTRIBUTES.add("othercity"); CONTACT_ATTRIBUTES.add("haspicture"); CONTACT_ATTRIBUTES.add("keywords"); CONTACT_ATTRIBUTES.add("othermobile"); CONTACT_ATTRIBUTES.add("otherTelephone"); CONTACT_ATTRIBUTES.add("gender"); CONTACT_ATTRIBUTES.add("private"); CONTACT_ATTRIBUTES.add("sensitivity"); CONTACT_ATTRIBUTES.add("fburl"); CONTACT_ATTRIBUTES.add("msexchangecertificate"); CONTACT_ATTRIBUTES.add("usersmimecertificate"); } protected static final Set DISTRIBUTION_LIST_ATTRIBUTES = new HashSet<>(); static { DISTRIBUTION_LIST_ATTRIBUTES.add("imapUid"); DISTRIBUTION_LIST_ATTRIBUTES.add("etag"); DISTRIBUTION_LIST_ATTRIBUTES.add("urlcompname"); DISTRIBUTION_LIST_ATTRIBUTES.add("cn"); DISTRIBUTION_LIST_ATTRIBUTES.add("members"); } /** * Get freebusy data string from Exchange. * * @param attendee attendee email address * @param start start date in Exchange zulu format * @param end end date in Exchange zulu format * @param interval freebusy interval in minutes * @return freebusy data or null * @throws IOException on error */ protected abstract String getFreeBusyData(String attendee, String start, String end, int interval) throws IOException; /** * Get freebusy info for attendee between start and end date. * * @param attendee attendee email * @param startDateValue start date * @param endDateValue end date * @return FreeBusy info * @throws IOException on error */ public FreeBusy getFreebusy(String attendee, String startDateValue, String endDateValue) throws IOException { // replace ical encoded attendee name attendee = replaceIcal4Principal(attendee); // then check that email address is valid to avoid InvalidSmtpAddress error if (attendee == null || attendee.indexOf('@') < 0 || attendee.charAt(attendee.length() - 1) == '@') { return null; } if (attendee.startsWith("mailto:") || attendee.startsWith("MAILTO:")) { attendee = attendee.substring("mailto:".length()); } SimpleDateFormat exchangeZuluDateFormat = getExchangeZuluDateFormat(); SimpleDateFormat icalDateFormat = getZuluDateFormat(); Date startDate; Date endDate; try { if (startDateValue.length() == 8) { startDate = parseDate(startDateValue); } else { startDate = icalDateFormat.parse(startDateValue); } if (endDateValue.length() == 8) { endDate = parseDate(endDateValue); } else { endDate = icalDateFormat.parse(endDateValue); } } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATES", e.getMessage()); } FreeBusy freeBusy = null; String fbdata = getFreeBusyData(attendee, exchangeZuluDateFormat.format(startDate), exchangeZuluDateFormat.format(endDate), FREE_BUSY_INTERVAL); if (fbdata != null) { freeBusy = new FreeBusy(icalDateFormat, startDate, fbdata); } if (freeBusy != null && freeBusy.knownAttendee) { return freeBusy; } else { return null; } } /** * Exchange to iCalendar Free/Busy parser. * Free time returns 0, Tentative returns 1, Busy returns 2, and Out of Office (OOF) returns 3 */ public static final class FreeBusy { final SimpleDateFormat icalParser; boolean knownAttendee = true; static final HashMap FBTYPES = new HashMap<>(); static { FBTYPES.put('1', "BUSY-TENTATIVE"); FBTYPES.put('2', "BUSY"); FBTYPES.put('3', "BUSY-UNAVAILABLE"); } final HashMap busyMap = new HashMap<>(); StringBuilder getBusyBuffer(char type) { String fbType = FBTYPES.get(type); StringBuilder buffer = busyMap.get(fbType); if (buffer == null) { buffer = new StringBuilder(); busyMap.put(fbType, buffer); } return buffer; } void startBusy(char type, Calendar currentCal) { if (type == '4') { knownAttendee = false; } else if (type != '0') { StringBuilder busyBuffer = getBusyBuffer(type); if (busyBuffer.length() > 0) { busyBuffer.append(','); } busyBuffer.append(icalParser.format(currentCal.getTime())); } } void endBusy(char type, Calendar currentCal) { if (type != '0' && type != '4') { getBusyBuffer(type).append('/').append(icalParser.format(currentCal.getTime())); } } FreeBusy(SimpleDateFormat icalParser, Date startDate, String fbdata) { this.icalParser = icalParser; if (fbdata.length() > 0) { Calendar currentCal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); currentCal.setTime(startDate); startBusy(fbdata.charAt(0), currentCal); for (int i = 1; i < fbdata.length() && knownAttendee; i++) { currentCal.add(Calendar.MINUTE, FREE_BUSY_INTERVAL); char previousState = fbdata.charAt(i - 1); char currentState = fbdata.charAt(i); if (previousState != currentState) { endBusy(previousState, currentCal); startBusy(currentState, currentCal); } } currentCal.add(Calendar.MINUTE, FREE_BUSY_INTERVAL); endBusy(fbdata.charAt(fbdata.length() - 1), currentCal); } } /** * Append freebusy information to buffer. * * @param buffer String buffer */ public void appendTo(StringBuilder buffer) { for (Map.Entry entry : busyMap.entrySet()) { buffer.append("FREEBUSY;FBTYPE=").append(entry.getKey()) .append(':').append(entry.getValue()).append((char) 13).append((char) 10); } } } protected VObject vTimezone; /** * Load and return current user OWA timezone. * * @return current timezone */ public VObject getVTimezone() { if (vTimezone == null) { // need to load Timezone info from OWA loadVtimezone(); } return vTimezone; } public void clearVTimezone() { vTimezone = null; } protected abstract void loadVtimezone(); } davmail-6.3.0/src/java/davmail/exchange/ExchangeSessionFactory.java0100644 0000000 0000000 00000043433 14754417473 024103 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.BundleMessage; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; import davmail.exception.WebdavNotAvailableException; import davmail.exchange.auth.ExchangeAuthenticator; import davmail.exchange.auth.ExchangeFormAuthenticator; import davmail.exchange.dav.DavExchangeSession; import davmail.exchange.ews.EwsExchangeSession; import davmail.http.HttpClientAdapter; import davmail.http.request.GetRequest; import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; import java.awt.*; import java.io.IOException; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; /** * Create ExchangeSession instances. */ public final class ExchangeSessionFactory { private static final Object LOCK = new Object(); private static final Map POOL_MAP = new HashMap<>(); private static boolean configChecked; private static boolean errorSent; static class PoolKey { final String url; final String userName; final String password; PoolKey(String url, String userName, String password) { this.url = url; this.userName = convertUserName(userName); this.password = password; } @Override public boolean equals(Object object) { return object == this || object instanceof PoolKey && ((PoolKey) object).url.equals(this.url) && ((PoolKey) object).userName.equals(this.userName) && ((PoolKey) object).password.equals(this.password); } @Override public int hashCode() { return url.hashCode() + userName.hashCode() + password.hashCode(); } } private ExchangeSessionFactory() { } /** * Create authenticated Exchange session * * @param userName user login * @param password user password * @return authenticated session * @throws IOException on error */ public static ExchangeSession getInstance(String userName, String password) throws IOException { String baseUrl = Settings.getProperty("davmail.url", Settings.getO365Url()); if (Settings.getBooleanProperty("davmail.server")) { return getInstance(baseUrl, userName, password); } else { // serialize session creation in workstation mode to avoid multiple OTP requests synchronized (LOCK) { return getInstance(baseUrl, userName, password); } } } private static String convertUserName(String userName) { String result = userName; // prepend default windows domain prefix String defaultDomain = Settings.getProperty("davmail.defaultDomain"); if (defaultDomain != null && userName.indexOf('\\') < 0 && userName.indexOf('@') < 0) { result = defaultDomain + '\\' + userName; } return result; } /** * Create authenticated Exchange session * * @param baseUrl OWA base URL * @param userName user login * @param password user password * @return authenticated session * @throws IOException on error */ public static ExchangeSession getInstance(String baseUrl, String userName, String password) throws IOException { ExchangeSession session = null; try { String mode = Settings.getProperty("davmail.mode"); if (Settings.O365.equals(mode)) { // force url with O365 baseUrl = Settings.getO365Url(); } PoolKey poolKey = new PoolKey(baseUrl, userName, password); synchronized (LOCK) { session = POOL_MAP.get(poolKey); } if (session != null) { ExchangeSession.LOGGER.debug("Got session " + session + " from cache"); } if (session != null && session.isExpired()) { synchronized (LOCK) { session.close(); ExchangeSession.LOGGER.debug("Session " + session + " for user " + session.userName + " expired"); session = null; // expired session, remove from cache POOL_MAP.remove(poolKey); } } if (session == null) { // convert old setting if (mode == null) { if ("false".equals(Settings.getProperty("davmail.enableEws"))) { mode = Settings.WEBDAV; } else { mode = Settings.EWS; } } // check for overridden authenticator String authenticatorClass = Settings.getProperty("davmail.authenticator"); if (authenticatorClass == null) { switch (mode) { case Settings.O365_MODERN: authenticatorClass = "davmail.exchange.auth.O365Authenticator"; break; case Settings.O365_INTERACTIVE: authenticatorClass = "davmail.exchange.auth.O365InteractiveAuthenticator"; if (GraphicsEnvironment.isHeadless()) { throw new DavMailException("EXCEPTION_DAVMAIL_CONFIGURATION", "O365Interactive not supported in headless mode"); } break; case Settings.O365_MANUAL: authenticatorClass = "davmail.exchange.auth.O365ManualAuthenticator"; break; } } if (authenticatorClass != null) { ExchangeAuthenticator authenticator = (ExchangeAuthenticator) Class.forName(authenticatorClass) .getDeclaredConstructor().newInstance(); authenticator.setUsername(poolKey.userName); authenticator.setPassword(poolKey.password); authenticator.authenticate(); session = new EwsExchangeSession(authenticator.getExchangeUri(), authenticator.getToken(), poolKey.userName); } else if (Settings.EWS.equals(mode) || Settings.O365.equals(mode) // direct EWS even if mode is different || poolKey.url.toLowerCase().endsWith("/ews/exchange.asmx") || poolKey.url.toLowerCase().endsWith("/ews/services.wsdl")) { if (poolKey.url.toLowerCase().endsWith("/ews/exchange.asmx") || poolKey.url.toLowerCase().endsWith("/ews/services.wsdl")) { ExchangeSession.LOGGER.debug("Direct EWS authentication"); session = new EwsExchangeSession(poolKey.url, poolKey.userName, poolKey.password); } else { ExchangeSession.LOGGER.debug("OWA authentication in EWS mode"); ExchangeFormAuthenticator exchangeFormAuthenticator = new ExchangeFormAuthenticator(); exchangeFormAuthenticator.setUrl(poolKey.url); exchangeFormAuthenticator.setUsername(poolKey.userName); exchangeFormAuthenticator.setPassword(poolKey.password); exchangeFormAuthenticator.authenticate(); session = new EwsExchangeSession(exchangeFormAuthenticator.getHttpClientAdapter(), exchangeFormAuthenticator.getExchangeUri(), exchangeFormAuthenticator.getUsername()); } } else { ExchangeFormAuthenticator exchangeFormAuthenticator = new ExchangeFormAuthenticator(); exchangeFormAuthenticator.setUrl(poolKey.url); exchangeFormAuthenticator.setUsername(poolKey.userName); exchangeFormAuthenticator.setPassword(poolKey.password); exchangeFormAuthenticator.authenticate(); try { session = new DavExchangeSession(exchangeFormAuthenticator.getHttpClientAdapter(), exchangeFormAuthenticator.getExchangeUri(), exchangeFormAuthenticator.getUsername()); } catch (WebdavNotAvailableException e) { if (Settings.AUTO.equals(mode)) { ExchangeSession.LOGGER.debug(e.getMessage() + ", retry with EWS"); session = new EwsExchangeSession(poolKey.url, poolKey.userName, poolKey.password); } else { throw e; } } } checkWhiteList(session.getEmail()); ExchangeSession.LOGGER.debug("Created new session " + session + " for user " + poolKey.userName); } // successful login, put session in cache synchronized (LOCK) { POOL_MAP.put(poolKey, session); } // session opened, future failure will mean network down configChecked = true; // Reset so next time an problem occurs message will be sent once errorSent = false; } catch (DavMailException | IllegalStateException | NullPointerException exc) { throw exc; } catch (Exception exc) { handleNetworkDown(exc); } return session; } /** * Check if whitelist is empty or email is allowed. * userWhiteList is a comma separated list of values. * \@company.com means all domain users are allowed * * @param email user email */ private static void checkWhiteList(String email) throws DavMailAuthenticationException { String whiteListString = Settings.getProperty("davmail.userWhiteList"); if (whiteListString != null && !whiteListString.isEmpty()) { for (String whiteListvalue : whiteListString.split(",")) { if (whiteListvalue.startsWith("@") && email.endsWith(whiteListvalue)) { return; } else if (email.equalsIgnoreCase(whiteListvalue)) { return; } } ExchangeSession.LOGGER.warn(email + " not allowed by whitelist"); throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } } /** * Get a non expired session. * If the current session is not expired, return current session, else try to create a new session * * @param currentSession current session * @param userName user login * @param password user password * @return authenticated session * @throws IOException on error */ public static ExchangeSession getInstance(ExchangeSession currentSession, String userName, String password) throws IOException { ExchangeSession session = currentSession; try { if (session.isExpired()) { ExchangeSession.LOGGER.debug("Session " + session + " expired, trying to open a new one"); session = null; String baseUrl = Settings.getProperty("davmail.url", Settings.getO365Url()); PoolKey poolKey = new PoolKey(baseUrl, userName, password); // expired session, remove from cache synchronized (LOCK) { POOL_MAP.remove(poolKey); } session = getInstance(userName, password); } } catch (DavMailAuthenticationException exc) { ExchangeSession.LOGGER.debug("Unable to reopen session", exc); throw exc; } catch (Exception exc) { ExchangeSession.LOGGER.debug("Unable to reopen session", exc); handleNetworkDown(exc); } return session; } /** * Send a request to Exchange server to check current settings. * * @throws IOException if unable to access Exchange server */ public static void checkConfig() throws IOException { String url = Settings.getProperty("davmail.url", Settings.getO365Url()); if (url == null || (!url.startsWith("http://") && !url.startsWith("https://"))) { throw new DavMailException("LOG_INVALID_URL", url); } try ( HttpClientAdapter httpClientAdapter = new HttpClientAdapter(url); CloseableHttpResponse response = httpClientAdapter.execute(new GetRequest(url)) ) { // get webMail root url (will not follow redirects) int status = response.getStatusLine().getStatusCode(); ExchangeSession.LOGGER.debug("Test configuration status: " + status); if (status != HttpStatus.SC_OK && status != HttpStatus.SC_UNAUTHORIZED && !HttpClientAdapter.isRedirect(status)) { throw new DavMailException("EXCEPTION_CONNECTION_FAILED", url, status); } // session opened, future failure will mean network down configChecked = true; // Reset so next time an problem occurs message will be sent once errorSent = false; } catch (Exception exc) { handleNetworkDown(exc); } } private static void handleNetworkDown(Exception exc) throws DavMailException { if (!checkNetwork() || configChecked) { ExchangeSession.LOGGER.warn(BundleMessage.formatLog("EXCEPTION_NETWORK_DOWN")); // log full stack trace for unknown errors if (!((exc instanceof UnknownHostException) || (exc instanceof NetworkDownException))) { ExchangeSession.LOGGER.debug(exc, exc); } throw new NetworkDownException("EXCEPTION_NETWORK_DOWN"); } else { BundleMessage message = new BundleMessage("EXCEPTION_CONNECT", exc.getClass().getName(), exc.getMessage()); if (errorSent) { ExchangeSession.LOGGER.warn(message); throw new NetworkDownException("EXCEPTION_DAVMAIL_CONFIGURATION", message); } else { // Mark that an error has been sent so you only get one // error in a row (not a repeating string of errors). errorSent = true; ExchangeSession.LOGGER.error(message); throw new DavMailException("EXCEPTION_DAVMAIL_CONFIGURATION", message); } } } /** * Get user password from session pool for SASL authentication * * @param userName Exchange user name * @return user password */ public static String getUserPassword(String userName) { String fullUserName = convertUserName(userName); for (PoolKey poolKey : POOL_MAP.keySet()) { if (poolKey.userName.equals(fullUserName)) { return poolKey.password; } } return null; } /** * Check if at least one network interface is up and active (i.e. has an address) * * @return true if network available */ static boolean checkNetwork() { boolean up = false; Enumeration enumeration; try { enumeration = NetworkInterface.getNetworkInterfaces(); if (enumeration != null) { while (!up && enumeration.hasMoreElements()) { NetworkInterface networkInterface = enumeration.nextElement(); up = networkInterface.isUp() && !networkInterface.isLoopback() && networkInterface.getInetAddresses().hasMoreElements(); } } } catch (NoSuchMethodError error) { ExchangeSession.LOGGER.debug("Unable to test network interfaces (not available under Java 1.5)"); up = true; } catch (SocketException exc) { ExchangeSession.LOGGER.error("DavMail configuration exception: \n Error listing network interfaces " + exc.getMessage(), exc); } return up; } /** * Reset config check status and clear session pool. */ public static void shutdown() { configChecked = false; errorSent = false; synchronized (LOCK) { for (ExchangeSession session:POOL_MAP.values()) { session.close(); } POOL_MAP.clear(); } } } davmail-6.3.0/src/java/davmail/exchange/FolderLoadThread.java0100644 0000000 0000000 00000006202 14577576166 022631 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2013 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import org.apache.log4j.Logger; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; /** * Load folder messages in a separate thread. */ public class FolderLoadThread extends Thread { private static final Logger LOGGER = Logger.getLogger(FolderLoadThread.class); boolean isComplete = false; ExchangeSession.Folder folder; IOException exception; FolderLoadThread(String threadName, ExchangeSession.Folder folder) { super(threadName + "-LoadFolder"); setDaemon(true); this.folder = folder; } @Override public void run() { try { folder.loadMessages(); } catch (IOException e) { exception = e; } catch (Exception e) { LOGGER.error(e+" "+e.getMessage(), e); exception = new IOException(e.getMessage(), e); } finally { isComplete = true; } } /** * Load folder in a separate thread. * * @param folder current folder * @param outputStream client connection * @throws IOException on error */ public static void loadFolder(ExchangeSession.Folder folder, OutputStream outputStream) throws IOException { FolderLoadThread folderLoadThread = new FolderLoadThread(currentThread().getName(), folder); folderLoadThread.start(); while (!folderLoadThread.isComplete) { try { folderLoadThread.join(20000); } catch (InterruptedException e) { LOGGER.warn("Thread interrupted", e); Thread.currentThread().interrupt(); } LOGGER.debug("Still loading " + folder.folderPath + " (" + folder.count() + " messages)"); if (Settings.getBooleanProperty("davmail.enableKeepAlive", false)) { try { outputStream.write(' '); outputStream.flush(); } catch (SocketException e) { folderLoadThread.interrupt(); throw e; } } } if (folderLoadThread.exception != null) { throw folderLoadThread.exception; } } }davmail-6.3.0/src/java/davmail/exchange/ICSBufferedReader.java0100644 0000000 0000000 00000005211 14754417473 022661 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; /** * ICS Buffered Reader. * Read events by line, handle multiple line elements */ public class ICSBufferedReader extends BufferedReader { protected String nextLine; protected final StringBuilder currentLine = new StringBuilder(75); /** * Create an ICS reader on the provided reader * * @param in input reader * @throws IOException on error */ public ICSBufferedReader(Reader in) throws IOException { super(in); nextLine = super.readLine(); } /** * Read a line from input reader, unwrap long lines. */ @Override public String readLine() throws IOException { if (nextLine == null) { return null; } else { currentLine.setLength(0); currentLine.append(nextLine); nextLine = super.readLine(); while (nextLine != null && !(nextLine.length() == 0) && (nextLine.charAt(0) == ' ' || nextLine.charAt(0) == '\t' // workaround for broken items with \n as first line character || nextLine.charAt(0) == '\\' // workaround for Exchange 2010 bug || nextLine.charAt(0) == ':')) { // Timezone ends with \n => next line starts with : if (nextLine.charAt(0) == ':') { currentLine.append(nextLine); } else { currentLine.append(nextLine.substring(1)); } nextLine = super.readLine(); } return ICSCalendarValidator.repairICSContent(currentLine.toString()); } } } davmail-6.3.0/src/java/davmail/exchange/ICSBufferedWriter.java0100644 0000000 0000000 00000006705 13452623365 022735 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; /** * ICS String writer. * split lines longer than 75 characters */ public class ICSBufferedWriter { final StringBuilder buffer = new StringBuilder(); /** * Write content to buffer, do not split lines. * * @param content ics content */ public void write(String content) { if (content != null) { buffer.append(content); } } /** * Write line to buffer, split lines at 75 characters. * * @param line ics event line */ public void writeLine(String line) { writeLine(line, false); } /** * Write line with or without continuation prefix. * * @param line line content * @param prefix continuation flag */ public void writeLine(String line, boolean prefix) { int maxLength = 77; if (prefix) { maxLength--; buffer.append(' '); } if (line.length() > maxLength) { buffer.append(line, 0, maxLength); newLine(); writeLine(line.substring(maxLength), true); } else { buffer.append(line); newLine(); } } /** * Append CRLF. */ public void newLine() { buffer.append((char) 13).append((char) 10); } /** * Get buffer as String * * @return ICS content as String */ @Override public String toString() { return buffer.toString(); } /** * Append single value property * * @param propertyName property name * @param propertyValue property value */ public void appendProperty(String propertyName, String propertyValue) { if ((propertyValue != null) && (propertyValue.length() > 0)) { StringBuilder lineBuffer = new StringBuilder(); lineBuffer.append(propertyName); lineBuffer.append(':'); appendMultilineEncodedValue(lineBuffer, propertyValue); writeLine(lineBuffer.toString()); } } /** * Append and encode \n to \\n in value. * * @param buffer line buffer * @param value value */ protected void appendMultilineEncodedValue(StringBuilder buffer, String value) { for (int i = 0; i < value.length(); i++) { char c = value.charAt(i); if (c == '\n') { buffer.append("\\n"); // skip carriage return } else if (c != '\r') { buffer.append(value.charAt(i)); } } } } davmail-6.3.0/src/java/davmail/exchange/ICSCalendarValidator.java0100644 0000000 0000000 00000014401 14754417473 023374 0ustar000000000 0000000 package davmail.exchange; import java.util.regex.Pattern; import org.apache.log4j.Logger; /** * Validator for iCalendar data according to RFC 5545 specifications. * This implementation provides comprehensive validation and repair capabilities for iCalendar content, * specifically focusing on character validation rather than XML structure. * * This helpful tool addresses synchronization issues between different calendar clients * (OWA, Outlook, and Thunderbird via DavMail) where calendar entries containing invalid * characters are handled differently across platforms. These problematic entries originate * from the MS Exchange Server, where they were either stored with invalid characters or * became corrupted during storage. While OWA and Outlook silently hide such entries without * displaying them to users, Thunderbird logs XML parse errors in its error console. The * validator provides detailed validation information about invalid characters and offers * repair functionality to automatically remove problematic characters while preserving * valid content. * * The implementation was developed to address a specific issue where calendar entries * containing invalid string content are hidden in OWA and Outlook, making them inaccessible * for manual deletion or repair. Since these entries are not visible in OWA and Outlook, * users cannot remove or fix them before synchronization to Thunderbird, where they cause * XML parsing errors. The solution provides a way to detect and repair these problematic * entries, which could otherwise be handled by DavMail during the synchronization process. * The issue is documented in Bugzilla at https://bugzilla.mozilla.org/show_bug.cgi?id=1941840. * * @author ifrh (GitHub) * @author ifrh (SourceForge) * @since 2025-02-05 // yyyy-mm-dd */ public class ICSCalendarValidator { protected static final Logger LOGGER = Logger.getLogger(ICSCalendarValidator.class); // Optimized pattern for validation private static final Pattern VALID_CHARS_PATTERN = Pattern.compile("^[\\x20-\\x7E\u0080-\uFFFF]*$"); // Constants for better readability private static final char NULL_BYTE = '\u0000'; private static final char SPACE = ' '; private static final char DELETE = '\u007F'; /** * Validates whether a string contains only valid characters for iCalendar content. * Ensures the string contains no null bytes and only printable ASCII characters, * while allowing properly encoded Unicode characters. * @param content The string to validate * @return true if all characters are valid */ public static boolean isValidICSContent(String content) { return content != null && VALID_CHARS_PATTERN.matcher(content).matches(); } /** * Returns detailed validation information about the content. * @param content The string to validate * @return ValidationResult object containing details */ public static ValidationResult validateWithDetails(String content) { if (content == null) { return new ValidationResult(false, "Content is null"); } // Efficient validation checking all conditions in one pass StringBuilder issues = new StringBuilder(); int nullByteCount = 0; StringBuilder invalidChars = new StringBuilder(); for (char c : content.toCharArray()) { if (c == NULL_BYTE) { nullByteCount++; } else if ((c < 32 || c == DELETE || (c >= 128 && c <= 159))) { invalidChars.append(String.format("\\u%04x,", (int)c)); } } // Collect all found problems if (nullByteCount > 0) { issues.append(nullByteCount).append(" null byte(s) found"); } if (invalidChars.length() > 0) { if (issues.length() > 0) issues.append(", "); issues.append("Invalid character(s): ").append( invalidChars.substring(0, invalidChars.length() - 1)); } return new ValidationResult(issues.length() == 0, issues.toString()); } /** * Repairs an iCalendar string by removing invalid characters. * Replaces multiple consecutive invalid characters with a single space. * @param content The string to repair * @return The repaired string */ public static String repairICSContent(String content) { if (content == null) return null; String message ="ICSCalendarValidator repair characters in ICS content:"; StringBuilder repaired = new StringBuilder(); boolean lastWasInvalid = false; for (char c : content.toCharArray()) { if (isValidChar(c)) { repaired.append(c); lastWasInvalid = false; } else if (!lastWasInvalid) { repaired.append(SPACE); lastWasInvalid = true; } } String fixed = repaired.toString().trim(); // just put output to debug logger, only if some invalid characters has been changed. if (!content.equals(fixed)){ LOGGER.debug ( message + "\n[" + content + "]\n => [" + fixed + "]\n fix complete."); } return fixed ; } /** * Checks if a single character is valid. * A character is valid if it is: * - Not a control character (ASCII 0-31) * - Not a delete character (ASCII 127) * - Not an invalid Unicode character (128-159) * @param c The character to check * @return true if the character is valid */ static boolean isValidChar(char c) { return c > 0 && !(c == DELETE || (c >= 128 && c <= 159)); } /** * Result structure for validation results. */ public static class ValidationResult { private final boolean isValid; private final String reason; public ValidationResult(boolean isValid, String reason) { this.isValid = isValid; this.reason = reason; } public boolean isValid() { return isValid; } public String showReason() { return reason; } } } davmail-6.3.0/src/java/davmail/exchange/MessageCreateThread.java0100644 0000000 0000000 00000007106 14503245212 023300 0ustar000000000 0000000 package davmail.exchange; import davmail.Settings; import org.apache.log4j.Logger; import javax.mail.internet.MimeMessage; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; import java.nio.charset.StandardCharsets; import java.util.HashMap; /** * Create message in a separate thread. */ public class MessageCreateThread extends Thread { private static final Logger LOGGER = Logger.getLogger(MessageCreateThread.class); boolean isComplete = false; ExchangeSession session; String folderPath; String messageName; HashMap properties; MimeMessage mimeMessage; ExchangeSession.Message message; IOException exception; MessageCreateThread(String threadName, ExchangeSession session, String folderPath, String messageName, HashMap properties, MimeMessage mimeMessage) { super(threadName + "-MessageCreate"); setDaemon(true); this.session = session; this.folderPath = folderPath; this.messageName = messageName; this.properties = properties; this.mimeMessage = mimeMessage; } public void run() { try { this.message = session.createMessage(folderPath, messageName, properties, mimeMessage); } catch (IOException e) { exception = e; } finally { isComplete = true; } } /** * Create message in a separate thread. * * @param session Exchange session * @param folderPath folder path * @param messageName message name * @param properties message properties * @param mimeMessage message content * @param outputStream output stream * @param capabilities IMAP capabilities * @throws InterruptedException on error * @throws IOException on error */ public static ExchangeSession.Message createMessage(ExchangeSession session, String folderPath, String messageName, HashMap properties, MimeMessage mimeMessage, OutputStream outputStream, String capabilities) throws IOException { MessageCreateThread messageCreateThread = new MessageCreateThread(currentThread().getName(), session, folderPath, messageName, properties, mimeMessage); messageCreateThread.start(); while (!messageCreateThread.isComplete) { try { messageCreateThread.join(20000); } catch (InterruptedException e) { LOGGER.warn("Thread interrupted", e); Thread.currentThread().interrupt(); } if (!messageCreateThread.isComplete) { if (Settings.getBooleanProperty("davmail.enableKeepAlive", false)) { LOGGER.debug("Still loading message, send capabilities untagged response to avoid timeout"); try { LOGGER.debug("* " + capabilities); outputStream.write(("* " + capabilities).getBytes(StandardCharsets.US_ASCII)); outputStream.write((char) 13); outputStream.write((char) 10); outputStream.flush(); } catch (SocketException e) { messageCreateThread.interrupt(); throw e; } } } } if (messageCreateThread.exception != null) { throw messageCreateThread.exception; } return messageCreateThread.message; } } davmail-6.3.0/src/java/davmail/exchange/MessageLoadThread.java0100644 0000000 0000000 00000006437 14503245212 022762 0ustar000000000 0000000 package davmail.exchange; import davmail.Settings; import org.apache.log4j.Logger; import javax.mail.MessagingException; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; /** * Message load thread. * Used to avoid timeouts over POP and IMAP */ public class MessageLoadThread extends Thread { private static final Logger LOGGER = Logger.getLogger(MessageLoadThread.class); protected boolean isComplete = false; protected ExchangeSession.Message message; protected IOException ioException; protected MessagingException messagingException; protected MessageLoadThread(String threadName, ExchangeSession.Message message) { super(threadName + "-LoadMessage"); setDaemon(true); this.message = message; } public void run() { try { message.loadMimeMessage(); } catch (IOException e) { ioException = e; } catch (MessagingException e) { messagingException = e; } finally { isComplete = true; } } /** * Load mime message in a separate thread if over 1MB. * Send a space character every ten seconds to avoid client timeouts * * @param message message * @param outputStream output stream * @throws IOException on error * @throws MessagingException on error */ public static void loadMimeMessage(ExchangeSession.Message message, OutputStream outputStream) throws IOException, MessagingException { if (message.size < 1024 * 1024) { message.loadMimeMessage(); } else { LOGGER.debug("Load large message " + (message.size / 1024) + "KB uid " + message.getUid() + " imapUid " + message.getImapUid() + " in a separate thread"); MessageLoadThread messageLoadThread = new MessageLoadThread(currentThread().getName(), message); messageLoadThread.start(); while (!messageLoadThread.isComplete) { try { messageLoadThread.join(10000); } catch (InterruptedException e) { LOGGER.warn("Thread interrupted", e); Thread.currentThread().interrupt(); } LOGGER.debug("Still loading uid " + message.getUid() + " imapUid " + message.getImapUid()); if (Settings.getBooleanProperty("davmail.enableKeepAlive", false)) { try { outputStream.write(' '); outputStream.flush(); } catch (SocketException e) { // client closed connection, stop thread message.dropMimeMessage(); messageLoadThread.interrupt(); throw e; } } } if (messageLoadThread.ioException != null) { throw messageLoadThread.ioException; } if (messageLoadThread.messagingException != null) { throw messageLoadThread.messagingException; } } } }davmail-6.3.0/src/java/davmail/exchange/MimeOutputStreamWriter.java0100644 0000000 0000000 00000005444 12564151517 024135 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; import javax.mail.internet.MimeUtility; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; /** * Mime OutputStreamWriter to build in memory Mime message. */ public class MimeOutputStreamWriter extends OutputStreamWriter { /** * Build MIME outputStreamWriter * * @param out outputstream * @throws UnsupportedEncodingException on error */ public MimeOutputStreamWriter(OutputStream out) throws UnsupportedEncodingException { super(out, "ASCII"); } /** * Write MIME header * * @param header header name * @param value header value * @throws IOException on error */ public void writeHeader(String header, String value) throws IOException { // do not write empty headers if (value != null && value.length() > 0) { write(header); write(": "); write(MimeUtility.encodeText(value, "UTF-8", null)); writeLn(); } } /** * Write MIME header * * @param header header name * @param value header value * @throws IOException on error */ public void writeHeader(String header, Date value) throws IOException { SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss Z", Locale.ENGLISH); writeHeader(header, formatter.format(value)); } /** * Write line. * * @param line line content * @throws IOException on error */ public void writeLn(String line) throws IOException { write(line); write("\r\n"); } /** * Write CRLF. * * @throws IOException on error */ public void writeLn() throws IOException { write("\r\n"); } } davmail-6.3.0/src/java/davmail/exchange/NetworkDownException.java0100644 0000000 0000000 00000002766 12564151517 023620 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.exception.DavMailException; /** * Custom exception to mark network down case. */ public class NetworkDownException extends DavMailException { /** * Build a network down exception with the provided BundleMessage key. * * @param key message key */ public NetworkDownException(String key) { super(key); } /** * Build a network down exception with the provided BundleMessage key. * * @param key message key * @param message detailed message */ public NetworkDownException(String key, Object message) { super(key, message); } } davmail-6.3.0/src/java/davmail/exchange/VCalendar.java0100644 0000000 0000000 00000112421 14521747274 021313 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import davmail.util.StringUtil; import org.apache.log4j.Logger; import java.io.*; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * VCalendar object. */ public class VCalendar extends VObject { protected static final Logger LOGGER = Logger.getLogger(VCalendar.class); protected VObject firstVevent; protected VObject vTimezone; protected String email; /** * Create VCalendar object from reader; * * @param reader stream reader * @param email current user email * @param vTimezone user OWA timezone * @throws IOException on error */ public VCalendar(BufferedReader reader, String email, VObject vTimezone) throws IOException { super(reader); if (!"VCALENDAR".equals(type)) { throw new IOException("Invalid type: " + type); } this.email = email; // set OWA timezone information if (this.vTimezone == null && vTimezone != null) { setTimezone(vTimezone); } } /** * Create VCalendar object from string; * * @param vCalendarBody item body * @param email current user email * @param vTimezone user OWA timezone * @throws IOException on error */ public VCalendar(String vCalendarBody, String email, VObject vTimezone) throws IOException { this(new ICSBufferedReader(new StringReader(vCalendarBody)), email, vTimezone); } /** * Create VCalendar object from string; * * @param vCalendarContent item content * @param email current user email * @param vTimezone user OWA timezone * @throws IOException on error */ public VCalendar(byte[] vCalendarContent, String email, VObject vTimezone) throws IOException { this(new ICSBufferedReader(new InputStreamReader(new ByteArrayInputStream(vCalendarContent), StandardCharsets.UTF_8)), email, vTimezone); } /** * Empty constructor */ public VCalendar() { type = "VCALENDAR"; } /** * Set timezone on vObject * * @param vTimezone timezone object */ public void setTimezone(VObject vTimezone) { if (vObjects == null) { addVObject(vTimezone); } else { vObjects.add(0, vTimezone); } this.vTimezone = vTimezone; } @Override public void addVObject(VObject vObject) { if (firstVevent == null && ("VEVENT".equals(vObject.type) || "VTODO".equals(vObject.type))) { firstVevent = vObject; } if ("VTIMEZONE".equals(vObject.type)) { if (vTimezone == null) { vTimezone = vObject; } else if (vTimezone.getPropertyValue("TZID").equals(vObject.getPropertyValue("TZID"))){ // drop duplicate TZID definition (Korganizer bug) vObject = null; } } if (vObject != null) { super.addVObject(vObject); } } protected boolean isAllDay(VObject vObject) { VProperty dtstart = vObject.getProperty("DTSTART"); return dtstart != null && dtstart.hasParam("VALUE", "DATE"); } protected boolean isCdoAllDay(VObject vObject) { return "TRUE".equals(vObject.getPropertyValue("X-MICROSOFT-CDO-ALLDAYEVENT")); } /** * Check if vCalendar is CDO allday. * * @return true if vCalendar has X-MICROSOFT-CDO-ALLDAYEVENT property set to TRUE */ public boolean isCdoAllDay() { return firstVevent != null && isCdoAllDay(firstVevent); } /** * Get email from property value. * * @param property property * @return email value */ public String getEmailValue(VProperty property) { if (property == null) { return null; } String propertyValue = property.getValue(); if (propertyValue != null && (propertyValue.startsWith("MAILTO:") || propertyValue.startsWith("mailto:"))) { return propertyValue.substring(7); } else { return propertyValue; } } protected String getMethod() { return getPropertyValue("METHOD"); } protected void fixVCalendar(boolean fromServer) { // set iCal 4 global X-CALENDARSERVER-ACCESS from CLASS if (fromServer) { setPropertyValue("X-CALENDARSERVER-ACCESS", getCalendarServerAccess()); } if (fromServer && "PUBLISH".equals(getPropertyValue("METHOD"))) { removeProperty("METHOD"); } // iCal 4 global X-CALENDARSERVER-ACCESS String calendarServerAccess = getPropertyValue("X-CALENDARSERVER-ACCESS"); String now = ExchangeSession.getZuluDateFormat().format(new Date()); // fix method from iPhone if (!fromServer && getPropertyValue("METHOD") == null) { setPropertyValue("METHOD", "PUBLISH"); } // rename TZID for maximum iCal/iPhone compatibility String tzid = null; if (fromServer) { // get current tzid VObject vObject = vTimezone; if (vObject != null) { String currentTzid = vObject.getPropertyValue("TZID"); // fix TZID with \n (Exchange 2010 bug) if (currentTzid != null && currentTzid.endsWith("\n")) { currentTzid = currentTzid.substring(0, currentTzid.length() - 1); vObject.setPropertyValue("TZID", currentTzid); } if (currentTzid != null && currentTzid.indexOf(' ') >= 0) { try { tzid = ResourceBundle.getBundle("timezones").getString(currentTzid); vObject.setPropertyValue("TZID", tzid); } catch (MissingResourceException e) { LOGGER.debug("Timezone " + currentTzid + " not found in rename table"); } } } } if (!fromServer) { fixTimezoneToServer(); } // iterate over vObjects for (VObject vObject : vObjects) { if ("VEVENT".equals(vObject.type)) { if (calendarServerAccess != null) { vObject.setPropertyValue("CLASS", getEventClass(calendarServerAccess)); // iCal 3, get X-CALENDARSERVER-ACCESS from local VEVENT } else if (vObject.getPropertyValue("X-CALENDARSERVER-ACCESS") != null) { vObject.setPropertyValue("CLASS", getEventClass(vObject.getPropertyValue("X-CALENDARSERVER-ACCESS"))); } if (fromServer) { // remove organizer line for event without attendees for iPhone if (vObject.getProperty("ATTENDEE") == null) { vObject.setPropertyValue("ORGANIZER", null); } // detect allday and update date properties if (isCdoAllDay(vObject)) { setClientAllday(vObject.getProperty("DTSTART")); setClientAllday(vObject.getProperty("DTEND")); setClientAllday(vObject.getProperty("RECURRENCE-ID")); } String cdoBusyStatus = vObject.getPropertyValue("X-MICROSOFT-CDO-BUSYSTATUS"); if (cdoBusyStatus != null) { // we set status only if it's tentative if ("TENTATIVE".equals(cdoBusyStatus)) { vObject.setPropertyValue("STATUS", "TENTATIVE"); } // in all cases, we set the transparency (also called "show time as" in UI) vObject.setPropertyValue("TRANSP", !"FREE".equals(cdoBusyStatus) ? "OPAQUE" : "TRANSPARENT"); } // Apple iCal doesn't understand this key, and it's entourage // specific (i.e. not needed by any caldav client): strip it out vObject.removeProperty("X-ENTOURAGE_UUID"); splitExDate(vObject); // remove empty properties if ("".equals(vObject.getPropertyValue("LOCATION"))) { vObject.removeProperty("LOCATION"); } if ("".equals(vObject.getPropertyValue("DESCRIPTION"))) { vObject.removeProperty("DESCRIPTION"); } if ("".equals(vObject.getPropertyValue("CLASS"))) { vObject.removeProperty("CLASS"); } // rename TZID if (tzid != null) { VProperty dtStart = vObject.getProperty("DTSTART"); if (dtStart != null && dtStart.getParam("TZID") != null) { dtStart.setParam("TZID", tzid); } VProperty dtEnd = vObject.getProperty("DTEND"); if (dtEnd != null && dtEnd.getParam("TZID") != null) { dtEnd.setParam("TZID", tzid); } VProperty recurrenceId = vObject.getProperty("RECURRENCE-ID"); if (recurrenceId != null && recurrenceId.getParam("TZID") != null) { recurrenceId.setParam("TZID", tzid); } VProperty exDate = vObject.getProperty("EXDATE"); if (exDate != null && exDate.getParam("TZID") != null) { exDate.setParam("TZID", tzid); } } // remove unsupported attachment reference if (vObject.getProperty("ATTACH") != null) { List toRemoveValues = null; List values = vObject.getProperty("ATTACH").getValues(); for (String value : values) { if (value.contains("CID:")) { if (toRemoveValues == null) { toRemoveValues = new ArrayList<>(); } toRemoveValues.add(value); } } if (toRemoveValues != null) { values.removeAll(toRemoveValues); if (values.size() == 0) { vObject.removeProperty("ATTACH"); } } } } else { // add organizer line to all events created in Exchange for active sync String organizer = getEmailValue(vObject.getProperty("ORGANIZER")); if (organizer == null) { vObject.setPropertyValue("ORGANIZER", "MAILTO:" + email); } else if (!email.equalsIgnoreCase(organizer) && vObject.getProperty("X-MICROSOFT-CDO-REPLYTIME") == null) { vObject.setPropertyValue("X-MICROSOFT-CDO-REPLYTIME", now); } // set OWA allday flag vObject.setPropertyValue("X-MICROSOFT-CDO-ALLDAYEVENT", isAllDay(vObject) ? "TRUE" : "FALSE"); if (vObject.getPropertyValue("TRANSP") != null) { vObject.setPropertyValue("X-MICROSOFT-CDO-BUSYSTATUS", !"TRANSPARENT".equals(vObject.getPropertyValue("TRANSP")) ? "BUSY" : "FREE"); } if (isAllDay(vObject)) { // convert date values to outlook compatible values setServerAllday(vObject.getProperty("DTSTART")); setServerAllday(vObject.getProperty("DTEND")); } else { fixTzid(vObject.getProperty("DTSTART")); fixTzid(vObject.getProperty("DTEND")); } } fixAttendees(vObject, fromServer); fixAlarm(vObject, fromServer); } } } private void fixTimezoneToServer() { if (vTimezone != null && vTimezone.vObjects != null && vTimezone.vObjects.size() > 2) { VObject standard = null; VObject daylight = null; for (VObject vObject : vTimezone.vObjects) { if ("STANDARD".equals(vObject.type)) { if (standard == null || (vObject.getPropertyValue("DTSTART").compareTo(standard.getPropertyValue("DTSTART")) > 0)) { standard = vObject; } } if ("DAYLIGHT".equals(vObject.type)) { if (daylight == null || (vObject.getPropertyValue("DTSTART").compareTo(daylight.getPropertyValue("DTSTART")) > 0)) { daylight = vObject; } } } vTimezone.vObjects.clear(); vTimezone.vObjects.add(standard); vTimezone.vObjects.add(daylight); } // fix 3569922: quick workaround for broken Israeli Timezone issue if (vTimezone != null && vTimezone.vObjects != null) { for (VObject vObject : vTimezone.vObjects) { VProperty rrule = vObject.getProperty("RRULE"); if (rrule != null && rrule.getValues().size() == 3 && "BYDAY=-2SU".equals(rrule.getValues().get(1))) { rrule.getValues().set(1, "BYDAY=4SU"); } // Fix 555 another broken Israeli timezone if (rrule != null && rrule.getValues().size() == 4 && "BYDAY=FR".equals(rrule.getValues().get(1)) && "BYMONTHDAY=23,24,25,26,27,28,29".equals(rrule.getValues().get(2))) { rrule.getValues().set(1, "BYDAY=-1FR"); rrule.getValues().remove(2); } } } // validate RRULE - COUNT and UNTIL may not occur at once if (vTimezone != null && vTimezone.vObjects != null) { for (VObject vObject : vTimezone.vObjects) { VProperty rrule = vObject.getProperty("RRULE"); if (rrule != null) { Map rruleValueMap = rrule.getValuesAsMap(); if (rruleValueMap.containsKey("UNTIL") && rruleValueMap.containsKey("COUNT")) { rrule.removeValue("UNTIL="+rruleValueMap.get("UNTIL")); } } } } // end validate RRULE // convert TZID to Exchange time zone id ResourceBundle tzBundle = ResourceBundle.getBundle("exchtimezones"); ResourceBundle tzidsBundle = ResourceBundle.getBundle("stdtimezones"); for (VObject vObject : vObjects) { if (vObject.isVTimezone()) { String tzid = vObject.getPropertyValue("TZID"); // check if tzid is avalid Exchange timezone id if (!tzidsBundle.containsKey(tzid)) { String exchangeTzid = null; // try to convert standard timezone id to Exchange timezone id if (tzBundle.containsKey(tzid)) { exchangeTzid = tzBundle.getString(tzid); } else { // failover, map to a close timezone for (VObject tzDefinition : vObject.vObjects) { if ("STANDARD".equals(tzDefinition.type)) { exchangeTzid = getTzidFromOffset(tzDefinition.getPropertyValue("TZOFFSETTO")); } } } if (exchangeTzid != null) { vObject.setPropertyValue("TZID", exchangeTzid); // also replace TZID in properties updateTzid(tzid, exchangeTzid); } } } } } protected void updateTzid(String tzid, String newTzid) { for (VObject vObject : vObjects) { if (vObject.isVEvent()) { for (VProperty vProperty : vObject.properties) { if (tzid.equalsIgnoreCase(vProperty.getParamValue("TZID"))) { vProperty.setParam("TZID", newTzid); } } } } } private void fixTzid(VProperty property) { if (property != null && !property.hasParam("TZID")) { property.addParam("TZID", vTimezone.getPropertyValue("TZID")); } } protected void splitExDate(VObject vObject) { List exDateProperties = vObject.getProperties("EXDATE"); if (exDateProperties != null) { for (VProperty property : exDateProperties) { String value = property.getValue(); if (value.indexOf(',') >= 0) { // split property vObject.removeProperty(property); for (String singleValue : value.split(",")) { VProperty singleProperty = new VProperty("EXDATE", singleValue); singleProperty.setParams(property.getParams()); vObject.addProperty(singleProperty); } } } } } protected void setServerAllday(VProperty property) { if (vTimezone != null) { // set TZID param if (!property.hasParam("TZID")) { property.addParam("TZID", vTimezone.getPropertyValue("TZID")); } // remove VALUE property.removeParam("VALUE"); String value = property.getValue(); if (value.length() != 8) { LOGGER.warn("Invalid date value in allday event: " + value); } property.setValue(property.getValue() + "T000000"); } } protected void setClientAllday(VProperty property) { if (property != null) { // set VALUE=DATE param if (!property.hasParam("VALUE")) { property.addParam("VALUE", "DATE"); } // remove TZID property.removeParam("TZID"); String value = property.getValue(); if (value.length() != 8) { // try to convert datetime value to date value try { Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateParser = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); calendar.setTime(dateParser.parse(value)); calendar.add(Calendar.HOUR_OF_DAY, 12); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd"); value = dateFormatter.format(calendar.getTime()); } catch (ParseException e) { LOGGER.warn("Invalid date value in allday event: " + value); } } property.setValue(value); } } protected void fixAlarm(VObject vObject, boolean fromServer) { if (vObject.vObjects != null) { if (Settings.getBooleanProperty("davmail.caldavDisableReminders", false)) { ArrayList vAlarms = null; for (VObject vAlarm : vObject.vObjects) { if ("VALARM".equals(vAlarm.type)) { if (vAlarms == null) { vAlarms = new ArrayList<>(); } vAlarms.add(vAlarm); } } // remove all vAlarms if (vAlarms != null) { for (VObject vAlarm : vAlarms) { vObject.vObjects.remove(vAlarm); } } } else { for (VObject vAlarm : vObject.vObjects) { if ("VALARM".equals(vAlarm.type)) { String action = vAlarm.getPropertyValue("ACTION"); if (fromServer && "DISPLAY".equals(action) // convert DISPLAY to AUDIO only if user defined an alarm sound && Settings.getProperty("davmail.caldavAlarmSound") != null) { // Convert alarm to audio for iCal vAlarm.setPropertyValue("ACTION", "AUDIO"); if (vAlarm.getPropertyValue("ATTACH") == null) { // Add defined sound into the audio alarm VProperty vProperty = new VProperty("ATTACH", Settings.getProperty("davmail.caldavAlarmSound")); vProperty.addParam("VALUE", "URI"); vAlarm.addProperty(vProperty); } } else if (!fromServer && "AUDIO".equals(action)) { // Use the alarm action that exchange (and blackberry) understand // (exchange and blackberry don't understand audio actions) vAlarm.setPropertyValue("ACTION", "DISPLAY"); } } } } } } /** * Replace iCal4 (Snow Leopard) principal paths with mailto expression * * @param value attendee value or ics line * @return fixed value */ protected String replaceIcal4Principal(String value) { if (value.contains("/principals/__uuids__/")) { return value.replaceAll("/principals/__uuids__/([^/]*)__AT__([^/]*)/", "mailto:$1@$2"); } else { return value; } } private void fixAttendees(VObject vObject, boolean fromServer) { if (vObject.properties != null) { for (VProperty property : vObject.properties) { if ("ATTENDEE".equalsIgnoreCase(property.getKey())) { if (fromServer) { // If this is coming from the server, strip out RSVP for this // user as an attendee where the partstat is something other // than PARTSTAT=NEEDS-ACTION since the RSVP confuses iCal4 into // thinking the attendee has not replied if (isCurrentUser(property) && property.hasParam("RSVP", "TRUE")) { if (!"NEEDS-ACTION".equals(property.getParamValue("PARTSTAT"))) { property.removeParam("RSVP"); } } } else { property.setValue(replaceIcal4Principal(property.getValue())); } } } } } private boolean isCurrentUser(VProperty property) { return property.getValue().equalsIgnoreCase("mailto:" + email); } /** * Return VTimezone object * * @return VTimezone */ public VObject getVTimezone() { return vTimezone; } /** * Convert X-CALENDARSERVER-ACCESS to CLASS. * see http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-privateevents.txt * * @param calendarServerAccess X-CALENDARSERVER-ACCESS value * @return CLASS value */ protected String getEventClass(String calendarServerAccess) { if ("PRIVATE".equalsIgnoreCase(calendarServerAccess)) { return "CONFIDENTIAL"; } else if ("CONFIDENTIAL".equalsIgnoreCase(calendarServerAccess) || "RESTRICTED".equalsIgnoreCase(calendarServerAccess)) { return "PRIVATE"; } else { return null; } } /** * Convert CLASS to X-CALENDARSERVER-ACCESS. * see http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-privateevents.txt * * * @return X-CALENDARSERVER-ACCESS value */ protected String getCalendarServerAccess() { String eventClass = getFirstVeventPropertyValue("CLASS"); if ("PRIVATE".equalsIgnoreCase(eventClass)) { return "CONFIDENTIAL"; } else if ("CONFIDENTIAL".equalsIgnoreCase(eventClass)) { return "PRIVATE"; } else { return null; } } /** * Get property value from first VEVENT in VCALENDAR. * * @param name property name * @return property value */ public String getFirstVeventPropertyValue(String name) { if (firstVevent == null) { return null; } else { return firstVevent.getPropertyValue(name); } } protected VProperty getFirstVeventProperty(String name) { if (firstVevent == null) { return null; } else { return firstVevent.getProperty(name); } } /** * Get properties by name from first VEVENT. * * @param name property name * @return properties */ public List getFirstVeventProperties(String name) { if (firstVevent == null) { return null; } else { return firstVevent.getProperties(name); } } /** * Remove VAlarm from VCalendar. */ public void removeVAlarm() { if (vObjects != null) { for (VObject vObject : vObjects) { if ("VEVENT".equals(vObject.type)) { // As VALARM is the only possible inner object, just drop all objects if (vObject.vObjects != null) { vObject.vObjects = null; } } } } } /** * Check if VCalendar has a VALARM item. * * @return true if VCalendar has a VALARM */ public boolean hasVAlarm() { if (vObjects != null) { for (VObject vObject : vObjects) { if ("VEVENT".equals(vObject.type)) { if (vObject.vObjects != null && !vObject.vObjects.isEmpty()) { return vObject.vObjects.get(0).isVAlarm(); } } } } return false; } public String getReminderMinutesBeforeStart() { String result = "0"; if (vObjects != null) { for (VObject vObject : vObjects) { if (vObject.vObjects != null && !vObject.vObjects.isEmpty() && vObject.vObjects.get(0).isVAlarm()) { String trigger = vObject.vObjects.get(0).getPropertyValue("TRIGGER"); if (trigger != null) { if (trigger.startsWith("-PT") && trigger.endsWith("M")) { result = trigger.substring(3, trigger.length() - 1); } else if (trigger.startsWith("-PT") && trigger.endsWith("H")) { result = trigger.substring(3, trigger.length() - 1); // convert to minutes result = String.valueOf(Integer.parseInt(result) * 60); } else if (trigger.startsWith("-P") && trigger.endsWith("D")) { result = trigger.substring(2, trigger.length() - 1); // convert to minutes result = String.valueOf(Integer.parseInt(result) * 60 * 24); } else if (trigger.startsWith("-P") && trigger.endsWith("W")) { result = trigger.substring(2, trigger.length() - 1); // convert to minutes result = String.valueOf(Integer.parseInt(result) * 60 * 24 * 7); } } } } } return result; } /** * Check if this VCalendar is a meeting. * * @return true if this VCalendar has attendees */ public boolean isMeeting() { return getFirstVeventProperty("ATTENDEE") != null; } /** * Check if current user is meeting organizer. * * @return true it user email matched organizer email */ public boolean isMeetingOrganizer() { return email.equalsIgnoreCase(getEmailValue(getFirstVeventProperty("ORGANIZER"))); } /** * Set property value on first VEVENT. * * @param propertyName property name * @param propertyValue property value */ public void setFirstVeventPropertyValue(String propertyName, String propertyValue) { firstVevent.setPropertyValue(propertyName, propertyValue); } /** * Add property on first VEVENT. * * @param vProperty property object */ public void addFirstVeventProperty(VProperty vProperty) { firstVevent.addProperty(vProperty); } /** * Check if this item is a VTODO item * * @return true with VTODO items */ public boolean isTodo() { return firstVevent != null && "VTODO".equals(firstVevent.type); } /** * VCalendar recipients for notifications */ public static class Recipients { /** * attendee list */ public String attendees; /** * optional attendee list */ public String optionalAttendees; /** * vCalendar organizer */ public String organizer; } /** * Build recipients value for VCalendar. * * @param isNotification if true, filter recipients that should receive meeting notifications * @return notification/event recipients */ public Recipients getRecipients(boolean isNotification) { HashSet attendees = new HashSet<>(); HashSet optionalAttendees = new HashSet<>(); // get recipients from first VEVENT List attendeeProperties = getFirstVeventProperties("ATTENDEE"); if (attendeeProperties != null) { for (VProperty property : attendeeProperties) { // exclude current user and invalid values from recipients // also exclude no action attendees String attendeeEmail = getEmailValue(property); if (!email.equalsIgnoreCase(attendeeEmail) && attendeeEmail != null && attendeeEmail.indexOf('@') >= 0 // return all attendees for user calendar folder, filter for notifications && (!isNotification // notify attendee if reply explicitly requested || (property.hasParam("RSVP", "TRUE")) || ( // workaround for iCal bug: do not notify if reply explicitly not requested !(property.hasParam("RSVP", "FALSE")) && ((property.hasParam("PARTSTAT", "NEEDS-ACTION") // need to include other PARTSTATs participants for CANCEL notifications || property.hasParam("PARTSTAT", "ACCEPTED") || property.hasParam("PARTSTAT", "DECLINED") || property.hasParam("PARTSTAT", "TENTATIVE"))) ))) { if (property.hasParam("ROLE", "OPT-PARTICIPANT")) { optionalAttendees.add(attendeeEmail); } else { attendees.add(attendeeEmail); } } } } Recipients recipients = new Recipients(); recipients.organizer = getEmailValue(getFirstVeventProperty("ORGANIZER")); recipients.attendees = StringUtil.join(attendees, ", "); recipients.optionalAttendees = StringUtil.join(optionalAttendees, ", "); return recipients; } public String getAttendeeStatus() { String status = null; List attendeeProperties = getFirstVeventProperties("ATTENDEE"); if (attendeeProperties != null) { for (VProperty property : attendeeProperties) { String attendeeEmail = getEmailValue(property); if (email.equalsIgnoreCase(attendeeEmail) && property.hasParam("PARTSTAT")) { // found current user attendee line status = property.getParamValue("PARTSTAT"); break; } } } return status; } /** * Get first VEvent * * @return first VEvent */ public VObject getFirstVevent() { return firstVevent; } /** * Get recurring VCalendar occurence exceptions. * * @return event occurences */ public List getModifiedOccurrences() { boolean first = true; ArrayList results = new ArrayList<>(); for (VObject vObject : vObjects) { if ("VEVENT".equals(vObject.type)) { if (first) { first = false; } else { results.add(vObject); } } } return results; } public TimeZone getStandardTimezoneId(String tzid) { String convertedTzid; // convert Exchange TZID to standard timezone try { convertedTzid = ResourceBundle.getBundle("timezones").getString(tzid); } catch (MissingResourceException e) { convertedTzid = tzid; // failover: detect timezone from offset VObject vTimezone = getVTimezone(); for (VObject tzDefinition : vTimezone.vObjects) { if ("STANDARD".equals(tzDefinition.type)) { convertedTzid = getTzidFromOffset(tzDefinition.getPropertyValue("TZOFFSETTO")); } } convertedTzid = ResourceBundle.getBundle("timezones").getString(convertedTzid); } return TimeZone.getTimeZone(convertedTzid); } private String getTzidFromOffset(String tzOffset) { if (tzOffset == null) { return null; } else if (tzOffset.length() == 7) { tzOffset = tzOffset.substring(0, 5); } return ResourceBundle.getBundle("tzoffsettimezones").getString(tzOffset); } public String convertCalendarDateToExchangeZulu(String vcalendarDateValue, String tzid) throws IOException { String zuluDateValue = null; TimeZone timeZone; if (tzid == null) { timeZone = ExchangeSession.GMT_TIMEZONE; } else { timeZone = getStandardTimezoneId(tzid); } if (vcalendarDateValue != null) { try { SimpleDateFormat dateParser; if (vcalendarDateValue.length() == 8) { dateParser = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); } else { dateParser = new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH); } dateParser.setTimeZone(timeZone); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH); dateFormatter.setTimeZone(ExchangeSession.GMT_TIMEZONE); zuluDateValue = dateFormatter.format(dateParser.parse(vcalendarDateValue)); } catch (ParseException e) { throw new IOException("Invalid date " + vcalendarDateValue + " with tzid " + tzid); } } return zuluDateValue; } } davmail-6.3.0/src/java/davmail/exchange/VCardWriter.java0100644 0000000 0000000 00000005756 13560360636 021657 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; /** * VCard Writer */ public class VCardWriter extends ICSBufferedWriter { /** * Begin VCard and version */ public void startCard() { startCard(null); } /** * Begin VCard and version */ public void startCard(String version) { writeLine("BEGIN:VCARD"); writeLine("VERSION:"+((version == null)?"4.0":version)); } /** * Append compound value * * @param propertyName property name * @param propertyValue property values */ public void appendProperty(String propertyName, String... propertyValue) { boolean hasValue = false; for (String value : propertyValue) { if ((value != null) && (value.length() > 0)) { hasValue = true; break; } } if (hasValue) { boolean first = true; StringBuilder lineBuffer = new StringBuilder(); lineBuffer.append(propertyName); lineBuffer.append(':'); for (String value : propertyValue) { if (first) { first = false; } else { lineBuffer.append(';'); } appendEncodedValue(lineBuffer, value); } writeLine(lineBuffer.toString()); } } /** * Encode and append value to buffer * * @param buffer current buffer * @param value property value */ private void appendEncodedValue(StringBuilder buffer, String value) { if (value != null) { for (int i = 0; i < value.length(); i++) { char c = value.charAt(i); if (c == ',' || c == ';') { buffer.append('\\'); } if (c == '\n') { buffer.append("\\n"); } else if (c != '\r') { buffer.append(value.charAt(i)); } } } } /** * End VCard */ public void endCard() { writeLine("END:VCARD"); } } davmail-6.3.0/src/java/davmail/exchange/VObject.java0100644 0000000 0000000 00000020356 13574116520 021004 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.List; /** * Base class for VCalendar, VTimezone, VEvent. */ public class VObject { /** * VObject properties */ ArrayList properties; /** * Inner VObjects (e.g. VEVENT, VALARM, ...) */ ArrayList vObjects; /** * Object base name (VCALENDAR, VEVENT, VCARD...). */ public String type; /** * Create VObject with given type * * @param beginProperty first line property * @param reader stream reader just after the BEGIN:TYPE line * @throws IOException on error */ public VObject(VProperty beginProperty, BufferedReader reader) throws IOException { if (!"BEGIN".equals(beginProperty.getKey())) { throw new IOException("Invalid first line: " + beginProperty); } type = beginProperty.getValue(); String beginLine = "BEGIN:" + type; String endLine = "END:" + type; String line = reader.readLine(); while (line != null && !line.startsWith(endLine)) { // ignore invalid BEGIN line inside object (Sogo Carddav issue) if (!beginLine.equals(line)) { handleLine(line, reader); } line = reader.readLine(); } // ignore missing END:VCALENDAR line on modified occurrences } /** * Create VObject from reader. * * @param reader stream reader just after the BEGIN:TYPE line * @throws IOException on error */ public VObject(BufferedReader reader) throws IOException { this(new VProperty(reader.readLine()), reader); } /** * Create VCalendar object from string; * * @param itemBody item body * @throws IOException on error */ public VObject(String itemBody) throws IOException { this(new ICSBufferedReader(new StringReader(itemBody))); } /** * Create empty VCalendar object; */ public VObject() { } public boolean isVTimezone() { return "VTIMEZONE".equals(type); } public boolean isVEvent() { return "VEVENT".equals(type); } public boolean isVAlarm() { return "VALARM".equals(type); } protected void handleLine(String line, BufferedReader reader) throws IOException { // skip empty lines if (line.length() > 0) { VProperty property = new VProperty(line); // inner object if ("BEGIN".equals(property.getKey())) { addVObject(new VObject(property, reader)); } else if (property.getKey() != null) { addProperty(property); } } } /** * Add vObject. * * @param vObject inner object */ public void addVObject(VObject vObject) { if (vObjects == null) { vObjects = new ArrayList<>(); } vObjects.add(vObject); } /** * Add vProperty. * * @param property vProperty */ public void addProperty(VProperty property) { if (property.getValue() != null) { if (properties == null) { properties = new ArrayList<>(); } properties.add(property); } } /** * Write VObject to writer. * * @param writer buffered writer */ public void writeTo(ICSBufferedWriter writer) { writer.write("BEGIN:"); writer.writeLine(type); if (properties != null) { for (VProperty property : properties) { writer.writeLine(property.toString()); } } if (vObjects != null) { for (VObject object : vObjects) { object.writeTo(writer); } } writer.write("END:"); writer.writeLine(type); } public String toString() { ICSBufferedWriter writer = new ICSBufferedWriter(); writeTo(writer); return writer.toString(); } /** * Get VObject properties * * @return properties */ public List getProperties() { return properties; } /** * Get vProperty by name. * * @param name property name * @return property object */ public VProperty getProperty(String name) { if (properties != null) { for (VProperty property : properties) { if (property.getKey() != null && property.getKey().equalsIgnoreCase(name)) { return property; } } } return null; } /** * Get multivalued vProperty by name. * * @param name property name * @return property list */ public List getProperties(String name) { List result = null; if (properties != null) { for (VProperty property : properties) { if (property.getKey() != null && property.getKey().equalsIgnoreCase(name)) { if (result == null) { result = new ArrayList<>(); } result.add(property); } } } return result; } /** * Get vProperty value by name. * * @param name property name * @return property value */ public String getPropertyValue(String name) { VProperty property = getProperty(name); if (property != null) { return property.getValue(); } else { return null; } } /** * Set vProperty value on vObject, remove property if value is null. * * @param name property name * @param value property value */ public void setPropertyValue(String name, String value) { if (value == null) { removeProperty(name); } else { VProperty property = getProperty(name); if (property == null) { property = new VProperty(name, value); addProperty(property); } else { property.setValue(value); } } } /** * Add vProperty value on vObject. * * @param name property name * @param value property value */ public void addPropertyValue(String name, String value) { if (value != null) { VProperty property = new VProperty(name, value); addProperty(property); } } /** * Remove vProperty from vObject. * * @param name property name */ public void removeProperty(String name) { if (properties != null) { VProperty property = getProperty(name); if (property != null) { properties.remove(property); } } } /** * Remove vProperty object from vObject. * * @param property object */ public void removeProperty(VProperty property) { if (properties != null) { properties.remove(property); } } public void setType(String type) { this.type = type; } } davmail-6.3.0/src/java/davmail/exchange/VProperty.java0100644 0000000 0000000 00000040477 13574116520 021430 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import java.util.*; /** * VCard property */ public class VProperty { protected enum State { KEY, PARAM_NAME, PARAM_VALUE, QUOTED_PARAM_VALUE, VALUE, BACKSLASH } protected static final HashSet MULTIVALUED_PROPERTIES = new HashSet<>(); static { MULTIVALUED_PROPERTIES.add("RESOURCES"); MULTIVALUED_PROPERTIES.add("LOCATION"); } protected static class Param { String name; List values; public void addAll(List paramValues) { if (values == null) { values = new ArrayList<>(); } values.addAll(paramValues); } protected String getValue() { if (values != null && !values.isEmpty()) { return values.get(0); } else { return null; } } } protected String key; protected List params; protected List values; /** * Create VProperty for key and value. * * @param name property name * @param value property value */ public VProperty(String name, String value) { setKey(name); setValue(value); } /** * Create VProperty from line. * * @param line card line */ public VProperty(String line) { if (line != null && !"END:VCARD".equals(line)) { State state = State.KEY; String paramName = null; List paramValues = null; int startIndex = 0; for (int i = 0; i < line.length(); i++) { char currentChar = line.charAt(i); if (state == State.KEY) { if (currentChar == ':') { setKey(line.substring(startIndex, i)); state = State.VALUE; startIndex = i + 1; } else if (currentChar == ';') { setKey(line.substring(startIndex, i)); state = State.PARAM_NAME; startIndex = i + 1; } } else if (state == State.PARAM_NAME) { if (currentChar == '=') { paramName = line.substring(startIndex, i).toUpperCase(); state = State.PARAM_VALUE; paramValues = new ArrayList<>(); startIndex = i + 1; } else if (currentChar == ';') { // param with no value paramName = line.substring(startIndex, i).toUpperCase(); addParam(paramName); state = State.PARAM_NAME; startIndex = i + 1; } else if (currentChar == ':') { // param with no value paramName = line.substring(startIndex, i).toUpperCase(); addParam(paramName); state = State.VALUE; startIndex = i + 1; } } else if (state == State.PARAM_VALUE) { if (currentChar == '"') { state = State.QUOTED_PARAM_VALUE; startIndex = i + 1; } else if (currentChar == ':') { if (startIndex < i) { paramValues = addParamValue(paramValues, line.substring(startIndex, i)); } addParam(paramName, paramValues); state = State.VALUE; startIndex = i + 1; } else if (currentChar == ';') { if (startIndex < i) { paramValues = addParamValue(paramValues, line.substring(startIndex, i)); } addParam(paramName, paramValues); state = State.PARAM_NAME; startIndex = i + 1; } else if (currentChar == ',') { if (startIndex < i) { paramValues = addParamValue(paramValues, line.substring(startIndex, i)); } startIndex = i + 1; } } else if (state == State.QUOTED_PARAM_VALUE) { if (currentChar == '"') { state = State.PARAM_VALUE; paramValues = addParamValue(paramValues, line.substring(startIndex, i)); startIndex = i + 1; } } else if (state == State.VALUE) { if (currentChar == '\\') { state = State.BACKSLASH; } else if (currentChar == ';' || (MULTIVALUED_PROPERTIES.contains(key) && currentChar == ',')) { addValue(line.substring(startIndex, i)); startIndex = i + 1; } } else if (state == State.BACKSLASH) { state = State.VALUE; } } if (state == State.VALUE) { addValue(line.substring(startIndex)); } else { throw new IllegalArgumentException("Invalid property line: " + line); } } } /** * Property key, without optional parameters (e.g. TEL). * * @return key */ public String getKey() { return key; } /** * Property value. * * @return value */ public String getValue() { if (values == null || values.isEmpty()) { return null; } else { return values.get(0); } } /** * Property values. * * @return values */ public List getValues() { return values; } /** * Return property values as a map. * Typical use for RRULE content * @return values as map */ public Map getValuesAsMap() { HashMap valuesMap = new HashMap<>(); if (values != null) { for (String value:values) { if (value.contains("=")) { int index = value.indexOf("="); valuesMap.put(value.substring(0, index), value.substring(index+1)); } } } return valuesMap; } /** * Test if the property has a param named paramName with given value. * * @param paramName param name * @param paramValue param value * @return true if property has param name and value */ public boolean hasParam(String paramName, String paramValue) { return params != null && getParam(paramName) != null && containsIgnoreCase(getParam(paramName).values, paramValue); } /** * Test if the property has a param named paramName. * * @param paramName param name * @return true if property has param name */ public boolean hasParam(String paramName) { return params != null && getParam(paramName) != null; } /** * Remove param from property. * * @param paramName param name */ public void removeParam(String paramName) { if (params != null) { Param param = getParam(paramName); if (param != null) { params.remove(param); } } } protected boolean containsIgnoreCase(List stringCollection, String value) { for (String collectionValue : stringCollection) { if (value.equalsIgnoreCase(collectionValue)) { return true; } } return false; } /** * Add value to paramValues and return list, create list if null. * * @param paramValues value list * @param value new value * @return updated value list */ protected List addParamValue(List paramValues, String value) { List result = paramValues; if (result == null) { result = new ArrayList<>(); } result.add(value); return result; } protected void addParam(String paramName) { addParam(paramName, (String) null); } /** * Set param value on property. * * @param paramName param name * @param paramValue param value */ public void setParam(String paramName, String paramValue) { Param currentParam = getParam(paramName); if (currentParam != null) { params.remove(currentParam); } addParam(paramName, paramValue); } /** * Add param value on property. * * @param paramName param name * @param paramValue param value */ public void addParam(String paramName, String paramValue) { if (paramValue != null) { List paramValues = new ArrayList<>(); paramValues.add(paramValue); addParam(paramName, paramValues); } } protected void addParam(String paramName, List paramValues) { if (params == null) { params = new ArrayList<>(); } Param currentParam = getParam(paramName); if (currentParam == null) { currentParam = new Param(); currentParam.name = paramName; params.add(currentParam); } currentParam.addAll(paramValues); } protected Param getParam(String paramName) { if (params != null && paramName != null) { for (Param param : params) { if (paramName.equals(param.name)) { return param; } } } return null; } /** * Return param value. * @param paramName param name * @return value */ public String getParamValue(String paramName) { Param param = getParam(paramName); if (param != null) { return param.getValue(); } else { return null; } } protected List getParams() { return params; } protected void setParams(List params) { this.params = params; } protected void setValue(String value) { if (value == null) { values = null; } else { if (values == null) { values = new ArrayList<>(); } else { values.clear(); } values.add(decodeValue(value)); } } protected void addValue(String value) { if (values == null) { values = new ArrayList<>(); } values.add(decodeValue(value)); } public void removeValue(String value) { if (values != null) { int index = -1; for (int i=0;i= 0) { values.remove(index); } } } protected String decodeValue(String value) { if (value == null || (value.indexOf('\\') < 0 && value.indexOf(',') < 0)) { return value; } else { // decode value StringBuilder decodedValue = new StringBuilder(); for (int i = 0; i < value.length(); i++) { char c = value.charAt(i); if (c == '\\') { //noinspection AssignmentToForLoopParameter i++; if (i == value.length()) { break; } c = value.charAt(i); if (c == 'n' || c == 'N') { c = '\n'; } else if (c == 'r') { c = '\r'; } } // iPhone encodes category separator if (c == ',' && // multivalued properties ("N".equals(key) || //"CATEGORIES".equals(key) || "NICKNAME".equals(key) )) { // convert multiple values to multiline values (e.g. street) c = '\n'; } decodedValue.append(c); } return decodedValue.toString(); } } /** * Set property key. * * @param key property key */ public void setKey(String key) { int dotIndex = key.indexOf('.'); if (dotIndex < 0) { this.key = key; } else { this.key = key.substring(dotIndex + 1); } } public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append(key); if (params != null) { for (Param param : params) { buffer.append(';').append(param.name); appendParamValues(buffer, param); } } buffer.append(':'); if (values != null) { boolean firstValue = true; for (String value : values) { if (firstValue) { firstValue = false; } else if (MULTIVALUED_PROPERTIES.contains(key)) { buffer.append(','); } else { buffer.append(';'); } appendMultilineEncodedValue(buffer, value); } } return buffer.toString(); } protected void appendParamValues(StringBuilder buffer, Param param) { if (param.values != null) { buffer.append('='); boolean first = true; for (String value : param.values) { if (first) { first = false; } else { buffer.append(','); } // always quote CN param if ("CN".equalsIgnoreCase(param.name) // quote param values with special characters || value.indexOf(';') >= 0 || value.indexOf(',') >= 0 || value.indexOf('(') >= 0 || value.indexOf('/') >= 0 || value.indexOf(':') >= 0) { buffer.append('"').append(value).append('"'); } else { buffer.append(value); } } } } /** * Append and encode \n to \\n in value. * * @param buffer line buffer * @param value value */ protected void appendMultilineEncodedValue(StringBuilder buffer, String value) { for (int i = 0; i < value.length(); i++) { char c = value.charAt(i); if (c == '\n') { buffer.append("\\n"); } else if (MULTIVALUED_PROPERTIES.contains(key) && c == ',') { buffer.append('\\').append(','); // skip carriage return } else if (c != '\r') { buffer.append(value.charAt(i)); } } } } davmail-6.3.0/src/java/davmail/exchange/XMLStreamUtil.java0100644 0000000 0000000 00000017046 14575630005 022125 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; import org.apache.log4j.Logger; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.util.HashMap; import java.util.Map; /** * XmlStreamReader utility methods */ public final class XMLStreamUtil { private static final Logger LOGGER = Logger.getLogger(XMLStreamUtil.class); private XMLStreamUtil() { } /** * Build a new XMLInputFactory. * * @return XML input factory */ public static XMLInputFactory getXmlInputFactory() { XMLInputFactory inputFactory = XMLInputFactory.newInstance(); inputFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE); inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.TRUE); inputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); // Woodstox 5.2.0 or later if (inputFactory.isPropertySupported("com.ctc.wstx.allowXml11EscapedCharsInXml10")) { inputFactory.setProperty("com.ctc.wstx.allowXml11EscapedCharsInXml10", Boolean.TRUE); } return inputFactory; } /** * Convert the XML stream to a map of entries. * An entry is also a key/value map * * @param inputStream xml input stream * @param rowName xml tag name of entries * @param idName xml tag name of entry attribute used as key in the main map * @return map of entries * @throws IOException on error */ public static Map> getElementContentsAsMap(InputStream inputStream, String rowName, String idName) throws IOException { Map> results = new HashMap<>(); Map item = null; String currentElement = null; XMLStreamReader reader = null; try { XMLInputFactory inputFactory = getXmlInputFactory(); reader = inputFactory.createXMLStreamReader(inputStream); while (reader.hasNext()) { int event = reader.next(); if (event == XMLStreamConstants.START_ELEMENT && rowName.equals(reader.getLocalName())) { item = new HashMap<>(); } else if (event == XMLStreamConstants.END_ELEMENT && rowName.equals(reader.getLocalName())) { if (item != null && item.containsKey(idName)) { results.put(item.get(idName).toLowerCase(), item); } item = null; } else if (event == XMLStreamConstants.START_ELEMENT && item != null) { currentElement = reader.getLocalName(); } else if (event == XMLStreamConstants.CHARACTERS && currentElement != null) { String text = reader.getText(); if (item != null) { item.put(currentElement, text); } currentElement = null; } } } catch (XMLStreamException e) { throw new IOException(e.getMessage()); } finally { try { if (reader != null) { reader.close(); } } catch (XMLStreamException e) { ExchangeSession.LOGGER.error(e); } } return results; } /** * Test if reader is on a start tag named tagLocalName. * * @param reader xml stream reader * @param tagLocalName tag local name * @return true if reader is on a start tag named tagLocalName */ public static boolean isStartTag(XMLStreamReader reader, String tagLocalName) { return (reader.getEventType() == XMLStreamConstants.START_ELEMENT) && (reader.getLocalName().equals(tagLocalName)); } /** * Test if reader is on a start tag. * * @param reader xml stream reader * @return true if reader is on a start tag */ public static boolean isStartTag(XMLStreamReader reader) { return (reader.getEventType() == XMLStreamConstants.START_ELEMENT); } /** * Test if reader is on an end tag named tagLocalName. * * @param reader xml stream reader * @param tagLocalName tag local name * @return true if reader is on an end tag named tagLocalName */ public static boolean isEndTag(XMLStreamReader reader, String tagLocalName) { return (reader.getEventType() == XMLStreamConstants.END_ELEMENT) && (reader.getLocalName().equals(tagLocalName)); } /** * Create XML stream reader for byte array * * @param xmlContent xml content as byte array * @return XML stream reader * @throws XMLStreamException on error */ public static XMLStreamReader createXMLStreamReader(byte[] xmlContent) throws XMLStreamException { return createXMLStreamReader(new ByteArrayInputStream(xmlContent)); } /** * Create XML stream reader for string * * @param xmlContent xml content as string * @return XML stream reader * @throws XMLStreamException on error */ public static XMLStreamReader createXMLStreamReader(String xmlContent) throws XMLStreamException { XMLInputFactory xmlInputFactory = XMLStreamUtil.getXmlInputFactory(); return xmlInputFactory.createXMLStreamReader(new StringReader(xmlContent)); } /** * Create XML stream reader for inputStream * * @param inputStream xml content inputStream * @return XML stream reader * @throws XMLStreamException on error */ public static XMLStreamReader createXMLStreamReader(InputStream inputStream) throws XMLStreamException { XMLInputFactory xmlInputFactory = XMLStreamUtil.getXmlInputFactory(); return xmlInputFactory.createXMLStreamReader(inputStream); } /** * Get element text. * * @param reader stream reader * @return element text */ public static String getElementText(XMLStreamReader reader) { String value = null; try { value = reader.getElementText(); } catch (XMLStreamException | RuntimeException e) { // RuntimeException: probably com.ctc.wstx.exc.WstxLazyException on invalid character sequence LOGGER.warn(e.getMessage()); } return value; } } davmail-6.3.0/src/java/davmail/exchange/auth/ExchangeAuthenticator.java0100644 0000000 0000000 00000003403 13760157441 024664 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.http.HttpClientAdapter; import java.io.IOException; import java.net.URI; /** * Common interface for all Exchange and O365 authenticators. * Implement this interface to build custom authenticators for unsupported Exchange architecture */ public interface ExchangeAuthenticator { void setUsername(String username); void setPassword(String password); /** * Authenticate against Exchange or O365 * @throws IOException on error */ void authenticate() throws IOException; O365Token getToken() throws IOException; /** * Return default or computed Exchange or O365 url * @return target url */ URI getExchangeUri(); /** * Return a new HttpClientAdapter instance with pooling enabled for ExchangeSession * @return HttpClientAdapter instance */ HttpClientAdapter getHttpClientAdapter(); } davmail-6.3.0/src/java/davmail/exchange/auth/ExchangeFormAuthenticator.java0100644 0000000 0000000 00000076565 14545543570 025537 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.BundleMessage; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; import davmail.exception.WebdavNotAvailableException; import davmail.http.DavGatewayOTPPrompt; import davmail.http.HttpClientAdapter; import davmail.http.URIUtil; import davmail.http.request.GetRequest; import davmail.http.request.PostRequest; import davmail.http.request.ResponseWrapper; import davmail.util.StringUtil; import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.client.utils.URIBuilder; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.cookie.BasicClientCookie; import org.apache.log4j.Logger; import org.htmlcleaner.BaseToken; import org.htmlcleaner.CommentNode; import org.htmlcleaner.ContentNode; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.TagNode; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.ConnectException; import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * New Exchange form authenticator based on HttpClient 4. */ public class ExchangeFormAuthenticator implements ExchangeAuthenticator { protected static final Logger LOGGER = Logger.getLogger("davmail.exchange.ExchangeSession"); /** * Various username fields found on custom Exchange authentication forms */ protected static final Set USER_NAME_FIELDS = new HashSet<>(); static { USER_NAME_FIELDS.add("username"); USER_NAME_FIELDS.add("txtusername"); USER_NAME_FIELDS.add("userid"); USER_NAME_FIELDS.add("SafeWordUser"); USER_NAME_FIELDS.add("user_name"); USER_NAME_FIELDS.add("login"); USER_NAME_FIELDS.add("UserName"); } /** * Various password fields found on custom Exchange authentication forms */ protected static final Set PASSWORD_FIELDS = new HashSet<>(); static { PASSWORD_FIELDS.add("password"); PASSWORD_FIELDS.add("txtUserPass"); PASSWORD_FIELDS.add("pw"); PASSWORD_FIELDS.add("basicPassword"); PASSWORD_FIELDS.add("passwd"); PASSWORD_FIELDS.add("Password"); } /** * Various OTP (one time password) fields found on custom Exchange authentication forms. * Used to open OTP dialog */ protected static final Set TOKEN_FIELDS = new HashSet<>(); static { TOKEN_FIELDS.add("SafeWordPassword"); TOKEN_FIELDS.add("passcode"); } /** * User provided username. * Old preauth syntax: preauthusername"username * Windows authentication with domain: domain\\username * Note that OSX Mail.app does not support backslash in username, set default domain in DavMail settings instead */ private String username; /** * User provided password */ private String password; /** * OWA or EWS url */ private String url; /** * HttpClient 4 adapter */ private HttpClientAdapter httpClientAdapter; /** * A OTP pre-auth page may require a different username. */ private String preAuthusername; /** * Logon form user name fields. */ private final List usernameInputs = new ArrayList<>(); /** * Logon form password field, default is password. */ private String passwordInput = null; /** * Tells if, during the login navigation, an OTP pre-auth page has been found. */ private boolean otpPreAuthFound = false; /** * Lets the user try again a couple of times to enter the OTP pre-auth key before giving up. */ private int otpPreAuthRetries = 0; /** * Maximum number of times the user can try to input again the OTP pre-auth key before giving up. */ private static final int MAX_OTP_RETRIES = 3; /** * base Exchange URI after authentication */ private java.net.URI exchangeUri; @Override public void setUsername(String username) { this.username = username; } @Override public void setPassword(String password) { this.password = password; } public void setUrl(String url) { this.url = url; } @Override public void authenticate() throws DavMailException { try { // create HttpClient adapter, enable pooling as this instance will be passed to ExchangeSession httpClientAdapter = new HttpClientAdapter(url, true); boolean isHttpAuthentication = isHttpAuthentication(httpClientAdapter, url); // The user may have configured an OTP pre-auth username. It is processed // so early because OTP pre-auth may disappear in the Exchange LAN and this // helps the user to not change is account settings in mail client at each network change. if (preAuthusername == null) { // Searches for the delimiter in configured username for the pre-auth user. // The double-quote is not allowed inside email addresses anyway. int doubleQuoteIndex = this.username.indexOf('"'); if (doubleQuoteIndex > 0) { preAuthusername = this.username.substring(0, doubleQuoteIndex); this.username = this.username.substring(doubleQuoteIndex + 1); } else { // No doublequote: the pre-auth user is the full username, or it is not used at all. preAuthusername = this.username; } } // set real credentials on http client httpClientAdapter.setCredentials(username, password); // get webmail root url // providing credentials // manually follow redirect GetRequest getRequest = httpClientAdapter.executeFollowRedirect(new GetRequest(url)); if (!this.isAuthenticated(getRequest)) { if (isHttpAuthentication) { int status = getRequest.getStatusCode(); if (status == HttpStatus.SC_UNAUTHORIZED) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else if (status != HttpStatus.SC_OK) { throw HttpClientAdapter.buildHttpResponseException(getRequest, getRequest.getHttpResponse()); } // workaround for basic authentication on /exchange and form based authentication at /owa if ("/owa/auth/logon.aspx".equals(getRequest.getURI().getPath())) { formLogin(httpClientAdapter, getRequest, password); } } else { formLogin(httpClientAdapter, getRequest, password); } } } catch (DavMailAuthenticationException exc) { close(); LOGGER.error(exc.getMessage()); throw exc; } catch (ConnectException | UnknownHostException exc) { close(); BundleMessage message = new BundleMessage("EXCEPTION_CONNECT", exc.getClass().getName(), exc.getMessage()); LOGGER.error(message); throw new DavMailException("EXCEPTION_DAVMAIL_CONFIGURATION", message); } catch (WebdavNotAvailableException exc) { close(); throw exc; } catch (IOException exc) { close(); LOGGER.error(BundleMessage.formatLog("EXCEPTION_EXCHANGE_LOGIN_FAILED", exc)); throw new DavMailException("EXCEPTION_EXCHANGE_LOGIN_FAILED", exc); } LOGGER.debug("Successfully authenticated to " + exchangeUri); } /** * Test authentication mode : form based or basic. * * @param url exchange base URL * @param httpClient httpClientAdapter instance * @return true if basic authentication detected */ protected boolean isHttpAuthentication(HttpClientAdapter httpClient, String url) { boolean isHttpAuthentication = false; HttpGet httpGet = new HttpGet(url); // Create a local context to avoid cookies in main httpClient HttpClientContext context = HttpClientContext.create(); context.setCookieStore(new BasicCookieStore()); try (CloseableHttpResponse response = httpClient.execute(httpGet, context)) { isHttpAuthentication = response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED; } catch (IOException e) { // ignore } return isHttpAuthentication; } /** * Look for session cookies. * * @return true if session cookies are available */ protected boolean isAuthenticated(ResponseWrapper getRequest) { boolean authenticated = false; if (getRequest.getStatusCode() == HttpStatus.SC_OK && "/ews/services.wsdl".equalsIgnoreCase(getRequest.getURI().getPath())) { // direct EWS access returned wsdl authenticated = true; } else { // check cookies for (Cookie cookie : httpClientAdapter.getCookies()) { // Exchange 2003 cookies if (cookie.getName().startsWith("cadata") || "sessionid".equals(cookie.getName()) // Exchange 2007 cookie || "UserContext".equals(cookie.getName()) // Federated Authentication || "TimeWindowSig".equals(cookie.getName()) ) { authenticated = true; break; } } } return authenticated; } protected void formLogin(HttpClientAdapter httpClient, ResponseWrapper initRequest, String password) throws IOException { LOGGER.debug("Form based authentication detected"); PostRequest postRequest = buildLogonMethod(httpClient, initRequest); if (postRequest == null) { LOGGER.debug("Authentication form not found at " + initRequest.getURI() + ", trying default url"); postRequest = new PostRequest("/owa/auth/owaauth.dll"); } exchangeUri = postLogonMethod(httpClient, postRequest, password).getURI(); } /** * Try to find logon method path from logon form body. * * @param httpClient httpClientAdapter instance * @param responseWrapper init request response wrapper * @return logon method */ protected PostRequest buildLogonMethod(HttpClientAdapter httpClient, ResponseWrapper responseWrapper) { PostRequest logonMethod = null; // create an instance of HtmlCleaner HtmlCleaner cleaner = new HtmlCleaner(); // In the federated auth flow, an input field may contain a saml xml assertion with > characters cleaner.getProperties().setAllowHtmlInsideAttributes(true); // A OTP token authentication form in a previous page could have username fields with different names usernameInputs.clear(); try { URI uri = responseWrapper.getURI(); String responseBody = responseWrapper.getResponseBodyAsString(); TagNode node = cleaner.clean(new ByteArrayInputStream(responseBody.getBytes(StandardCharsets.UTF_8))); List forms = node.getElementListByName("form", true); TagNode logonForm = null; // select form if (forms.size() == 1) { logonForm = forms.get(0); } else if (forms.size() > 1) { for (TagNode form : forms) { if ("logonForm".equals(form.getAttributeByName("name"))) { logonForm = form; } else if ("loginForm".equals(form.getAttributeByName("id"))) { logonForm = form; } } } if (logonForm != null) { String logonMethodPath = logonForm.getAttributeByName("action"); // workaround for broken form with empty action if (logonMethodPath != null && logonMethodPath.isEmpty()) { logonMethodPath = "/owa/auth.owa"; } logonMethod = new PostRequest(getAbsoluteUri(uri, logonMethodPath)); // retrieve lost inputs attached to body List inputList = node.getElementListByName("input", true); for (TagNode input : inputList) { String type = input.getAttributeByName("type"); String name = input.getAttributeByName("name"); String value = input.getAttributeByName("value"); if ("hidden".equalsIgnoreCase(type) && name != null && value != null) { // decode XML SAML assertion correctly from hidden field value if ("wresult".equals(name)) { String decoded = value.replaceAll(""","\"").replaceAll("<","<"); logonMethod.setParameter(name, decoded); // The OWA accepting this assertion needs the Referer set, but it can be anything logonMethod.setRequestHeader("Referer", url); } else if ("wctx".equals(name)) { String decoded = value.replaceAll("&","&"); logonMethod.setParameter(name, decoded); } else { logonMethod.setParameter(name, value); } } // custom login form if (USER_NAME_FIELDS.contains(name) && !usernameInputs.contains(name)) { usernameInputs.add(name); } else if (PASSWORD_FIELDS.contains(name)) { passwordInput = name; } else if ("addr".equals(name)) { // this is not a logon form but a redirect form logonMethod = buildLogonMethod(httpClient, httpClient.executeFollowRedirect(logonMethod)); } else if (TOKEN_FIELDS.contains(name)) { // one time password, ask it to the user logonMethod.setParameter(name, DavGatewayOTPPrompt.getOneTimePassword()); } else if ("otc".equals(name)) { // captcha image, get image and ask user String pinsafeUser = getAliasFromLogin(); if (pinsafeUser == null) { pinsafeUser = username; } HttpGet pinRequest = new HttpGet("/PINsafeISAFilter.dll?username=" + pinsafeUser); try (CloseableHttpResponse pinResponse = httpClient.execute(pinRequest)) { int status = pinResponse.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_OK) { throw HttpClientAdapter.buildHttpResponseException(pinRequest, pinResponse.getStatusLine()); } BufferedImage captchaImage = ImageIO.read(pinResponse.getEntity().getContent()); logonMethod.setParameter(name, DavGatewayOTPPrompt.getCaptchaValue(captchaImage)); } } } } else { List frameList = node.getElementListByName("frame", true); if (frameList.size() == 1) { String src = frameList.get(0).getAttributeByName("src"); if (src != null) { LOGGER.debug("Frames detected in form page, try frame content"); logonMethod = buildLogonMethod(httpClient, httpClient.executeFollowRedirect(new GetRequest(src))); } } else { // another failover for script based logon forms (Exchange 2007) List scriptList = node.getElementListByName("script", true); for (TagNode script : scriptList) { List contents = script.getAllChildren(); for (Object content : contents) { if (content instanceof CommentNode) { String scriptValue = ((CommentNode) content).getCommentedContent(); String sUrl = StringUtil.getToken(scriptValue, "var a_sUrl = \"", "\""); String sLgn = StringUtil.getToken(scriptValue, "var a_sLgnQS = \"", "\""); if (sLgn == null) { sLgn = StringUtil.getToken(scriptValue, "var a_sLgn = \"", "\""); } if (sUrl != null && sLgn != null) { URI src = getScriptBasedFormURL(uri, sLgn + sUrl); LOGGER.debug("Detected script based logon, redirect to form at " + src); logonMethod = buildLogonMethod(httpClient, httpClient.executeFollowRedirect(new GetRequest(src))); } } else if (content instanceof ContentNode) { // Microsoft Forefront Unified Access Gateway redirect String scriptValue = ((ContentNode) content).getContent(); String location = StringUtil.getToken(scriptValue, "window.location.replace(\"", "\""); if (location != null) { LOGGER.debug("Post logon redirect to: " + location); logonMethod = buildLogonMethod(httpClient, httpClient.executeFollowRedirect(new GetRequest(location))); } } } } } } } catch (IOException | URISyntaxException e) { LOGGER.error("Error parsing login form at " + responseWrapper.getURI()); } return logonMethod; } protected ResponseWrapper postLogonMethod(HttpClientAdapter httpClient, PostRequest logonMethod, String password) throws IOException { setAuthFormFields(logonMethod, httpClient, password); // add exchange 2010 PBack cookie in compatibility mode BasicClientCookie pBackCookie = new BasicClientCookie("PBack", "0"); pBackCookie.setPath("/"); pBackCookie.setDomain(httpClientAdapter.getHost()); httpClient.addCookie(pBackCookie); ResponseWrapper resultRequest = httpClient.executeFollowRedirect(logonMethod); // test form based authentication checkFormLoginQueryString(resultRequest); // workaround for post logon script redirect if (!isAuthenticated(resultRequest)) { // try to get new method from script based redirection logonMethod = buildLogonMethod(httpClient, resultRequest); if (logonMethod != null) { if (otpPreAuthFound && otpPreAuthRetries < MAX_OTP_RETRIES) { // A OTP pre-auth page has been found, it is needed to restart the login process. // This applies to both the case the user entered a good OTP code (the usual login process // takes place) and the case the user entered a wrong OTP code (another code will be asked to him). // The user has up to MAX_OTP_RETRIES chances to input a valid OTP key. return postLogonMethod(httpClient, logonMethod, password); } // if logonMethod is not null, try to follow redirection resultRequest = httpClient.executeFollowRedirect(logonMethod); checkFormLoginQueryString(resultRequest); // also check cookies if (!isAuthenticated(resultRequest)) { throwAuthenticationFailed(); } } else { // authentication failed throwAuthenticationFailed(); } } // check for language selection form if ("/owa/languageselection.aspx".equals(resultRequest.getURI().getPath())) { // need to submit form resultRequest = submitLanguageSelectionForm(resultRequest.getURI(), resultRequest.getResponseBodyAsString()); } return resultRequest; } protected ResponseWrapper submitLanguageSelectionForm(URI uri, String responseBodyAsString) throws IOException { PostRequest postLanguageFormMethod; // create an instance of HtmlCleaner HtmlCleaner cleaner = new HtmlCleaner(); try { TagNode node = cleaner.clean(responseBodyAsString); List forms = node.getElementListByName("form", true); TagNode languageForm; // select form if (forms.size() == 1) { languageForm = forms.get(0); } else { throw new IOException("Form not found"); } String languageMethodPath = languageForm.getAttributeByName("action"); postLanguageFormMethod = new PostRequest(getAbsoluteUri(uri, languageMethodPath)); List inputList = languageForm.getElementListByName("input", true); for (TagNode input : inputList) { String name = input.getAttributeByName("name"); String value = input.getAttributeByName("value"); if (name != null && value != null) { postLanguageFormMethod.setParameter(name, value); } } List selectList = languageForm.getElementListByName("select", true); for (TagNode select : selectList) { String name = select.getAttributeByName("name"); List optionList = select.getElementListByName("option", true); String value = null; for (TagNode option : optionList) { if (option.getAttributeByName("selected") != null) { value = option.getAttributeByName("value"); break; } } if (name != null && value != null) { postLanguageFormMethod.setParameter(name, value); } } } catch (IOException | URISyntaxException e) { String errorMessage = "Error parsing language selection form at " + uri; LOGGER.error(errorMessage); throw new IOException(errorMessage); } return httpClientAdapter.executeFollowRedirect(postLanguageFormMethod); } protected void setAuthFormFields(HttpRequestBase logonMethod, HttpClientAdapter httpClient, String password) throws IllegalArgumentException { String usernameInput; if (usernameInputs.size() == 2) { String userid; // multiple username fields, split userid|username on | int pipeIndex = username.indexOf('|'); if (pipeIndex < 0) { LOGGER.debug("Multiple user fields detected, please use userid|username as user name in client, except when userid is username"); userid = username; } else { userid = username.substring(0, pipeIndex); username = username.substring(pipeIndex + 1); // adjust credentials httpClient.setCredentials(username, password); } ((PostRequest) logonMethod).removeParameter("userid"); ((PostRequest) logonMethod).setParameter("userid", userid); usernameInput = "username"; } else if (usernameInputs.size() == 1) { // simple username field usernameInput = usernameInputs.get(0); } else { // should not happen usernameInput = "username"; } // make sure username and password fields are empty ((PostRequest) logonMethod).removeParameter(usernameInput); if (passwordInput != null) { ((PostRequest) logonMethod).removeParameter(passwordInput); } ((PostRequest) logonMethod).removeParameter("trusted"); ((PostRequest) logonMethod).removeParameter("flags"); if (passwordInput == null) { // This is a OTP pre-auth page. A different username may be required. otpPreAuthFound = true; otpPreAuthRetries++; ((PostRequest) logonMethod).setParameter(usernameInput, preAuthusername); } else { otpPreAuthFound = false; otpPreAuthRetries = 0; // This is a regular Exchange login page ((PostRequest) logonMethod).setParameter(usernameInput, username); ((PostRequest) logonMethod).setParameter(passwordInput, password); ((PostRequest) logonMethod).setParameter("trusted", "4"); ((PostRequest) logonMethod).setParameter("flags", "4"); } } protected URI getAbsoluteUri(URI uri, String path) throws URISyntaxException { URIBuilder uriBuilder = new URIBuilder(uri); if (path != null) { // reset query string uriBuilder.clearParameters(); if (path.startsWith("/")) { // path is absolute, replace method path uriBuilder.setPath(path); } else if (path.startsWith("http://") || path.startsWith("https://")) { return URI.create(path); } else { // relative path, build new path String currentPath = uri.getPath(); int end = currentPath.lastIndexOf('/'); if (end >= 0) { uriBuilder.setPath(currentPath.substring(0, end + 1) + path); } else { throw new URISyntaxException(uriBuilder.build().toString(), "Invalid path"); } } } return uriBuilder.build(); } protected URI getScriptBasedFormURL(URI uri, String pathQuery) throws URISyntaxException, IOException { URIBuilder uriBuilder = new URIBuilder(uri); int queryIndex = pathQuery.indexOf('?'); if (queryIndex >= 0) { if (queryIndex > 0) { // update path String newPath = pathQuery.substring(0, queryIndex); if (newPath.startsWith("/")) { // absolute path uriBuilder.setPath(newPath); } else { String currentPath = uriBuilder.getPath(); int folderIndex = currentPath.lastIndexOf('/'); if (folderIndex >= 0) { // replace relative path uriBuilder.setPath(currentPath.substring(0, folderIndex + 1) + newPath); } else { // should not happen uriBuilder.setPath('/' + newPath); } } } uriBuilder.setCustomQuery(URIUtil.decode(pathQuery.substring(queryIndex + 1))); } return uriBuilder.build(); } protected void checkFormLoginQueryString(ResponseWrapper logonMethod) throws DavMailAuthenticationException { String queryString = logonMethod.getURI().getRawQuery(); if (queryString != null && (queryString.contains("reason=2") || queryString.contains("reason=4"))) { throwAuthenticationFailed(); } } protected void throwAuthenticationFailed() throws DavMailAuthenticationException { if (this.username != null && this.username.contains("\\")) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED_RETRY"); } } /** * Get current Exchange alias name from login name * * @return user name */ public String getAliasFromLogin() { // login is email, not alias if (this.username.indexOf('@') >= 0) { return null; } String result = this.username; // remove domain name int index = Math.max(result.indexOf('\\'), result.indexOf('/')); if (index >= 0) { result = result.substring(index + 1); } return result; } /** * Close session. * Shutdown http client connection manager */ public void close() { httpClientAdapter.close(); } /** * Oauth token. * Only for Office 365 authenticators * * @return unsupported */ @Override public O365Token getToken() { throw new UnsupportedOperationException(); } /** * Base Exchange URL. * Welcome page for Exchange 2003, EWS url for Exchange 2007 and later * * @return Exchange url */ @Override public java.net.URI getExchangeUri() { return exchangeUri; } /** * Return authenticated HttpClient 4 HttpClientAdapter * * @return HttpClientAdapter instance */ public HttpClientAdapter getHttpClientAdapter() { return httpClientAdapter; } /** * Actual username. * may be different from input username with preauth * * @return username */ public String getUsername() { return username; } } davmail-6.3.0/src/java/davmail/exchange/auth/HttpURLConnectionWrapper.java0100644 0000000 0000000 00000011475 14754153477 025313 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import org.apache.log4j.Logger; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import java.util.List; import java.util.Map; /** * Wrapper for HttpURLConnection to fix missing content type and add logging. */ public class HttpURLConnectionWrapper extends HttpURLConnection { private static final Logger LOGGER = Logger.getLogger(HttpURLConnectionWrapper.class); HttpURLConnection httpURLConnection; HttpURLConnectionWrapper(HttpURLConnection httpURLConnection, URL url) { super(url); this.httpURLConnection = httpURLConnection; } @Override public void setRequestMethod(String method) throws ProtocolException { httpURLConnection.setRequestMethod(method); } @Override public void setInstanceFollowRedirects(boolean followRedirects) { httpURLConnection.setInstanceFollowRedirects(followRedirects); } @Override public boolean getInstanceFollowRedirects() { return httpURLConnection.getInstanceFollowRedirects(); } @Override public String getRequestMethod() { return httpURLConnection.getRequestMethod(); } @Override public int getResponseCode() throws IOException { return httpURLConnection.getResponseCode(); } @Override public String getResponseMessage() throws IOException { return httpURLConnection.getResponseMessage(); } @Override public Map> getHeaderFields() { LOGGER.debug(httpURLConnection.getHeaderFields()); return httpURLConnection.getHeaderFields(); } @Override public String getHeaderField(String name) { return httpURLConnection.getHeaderField(name); } @Override public String getHeaderField(int n) { return httpURLConnection.getHeaderField(n); } @Override public void disconnect() { httpURLConnection.disconnect(); } @Override public void setDoOutput(boolean dooutput) { httpURLConnection.setDoOutput(dooutput); } @Override public boolean usingProxy() { return httpURLConnection.usingProxy(); } @Override public void connect() throws IOException { try { httpURLConnection.connect(); } catch (IOException e) { LOGGER.error(e.getMessage()); throw e; } } @Override public InputStream getInputStream() throws IOException { return httpURLConnection.getInputStream(); } @Override public OutputStream getOutputStream() throws IOException { return httpURLConnection.getOutputStream(); } @Override public InputStream getErrorStream() { return httpURLConnection.getErrorStream(); } @Override public void setRequestProperty(String key, String value) { httpURLConnection.setRequestProperty(key, value); } @Override public void addRequestProperty(String key, String value) { httpURLConnection.setRequestProperty(key, value); } @Override public Map> getRequestProperties() { return httpURLConnection.getRequestProperties(); } @Override public String getRequestProperty(String key) { return httpURLConnection.getRequestProperty(key); } /** * Fix missing content type * @return content type or text/html if missing */ @Override public String getContentType() { final String contentType = httpURLConnection.getContentType(); // workaround for missing content type if (contentType == null && getContentLength() > 0) { LOGGER.debug("Fix missing content-type at "+url.toString()); return "text/html"; } return contentType; } } davmail-6.3.0/src/java/davmail/exchange/auth/O365Authenticator.java0100644 0000000 0000000 00000074371 14754417473 023622 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.BundleMessage; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.http.HttpClientAdapter; import davmail.http.request.GetRequest; import davmail.http.request.PostRequest; import davmail.http.request.ResponseWrapper; import davmail.http.request.RestRequest; import davmail.ui.NumberMatchingFrame; import davmail.ui.PasswordPromptDialog; import org.apache.http.HttpStatus; import org.apache.http.client.utils.URIBuilder; import org.apache.log4j.Logger; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import javax.swing.*; import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class O365Authenticator implements ExchangeAuthenticator { protected static final Logger LOGGER = Logger.getLogger(O365Authenticator.class); private String tenantId; // Office 365 username private String username; // authentication userid, can be different from username private String userid; private String password; private O365Token token; public static String buildAuthorizeUrl(String tenantId, String clientId, String redirectUri, String username) throws IOException { URI uri; try { URIBuilder uriBuilder = new URIBuilder(Settings.getO365LoginUrl()) .addParameter("client_id", clientId) .addParameter("response_type", "code") .addParameter("redirect_uri", redirectUri) .addParameter("response_mode", "query") .addParameter("login_hint", username); // force consent //uriBuilder.addParameter("prompt", "consent"); // switch to new v2.0 OIDC compliant endpoint https://docs.microsoft.com/en-us/azure/active-directory/develop/azure-ad-endpoint-comparison if (Settings.getBooleanProperty("davmail.enableOidc", false)) { uriBuilder.setPath("/" + tenantId + "/oauth2/v2.0/authorize") .addParameter("scope", "openid " + Settings.getOutlookUrl() + "/EWS.AccessAsUser.All"); } else if (Settings.getBooleanProperty("davmail.enableGraph", false)) { uriBuilder.setPath("/" + tenantId + "/oauth2/authorize") .addParameter("resource", "https://graph.microsoft.com"); // OIDC compliant //uriBuilder.setPath("/" + tenantId + "/oauth2/v2.0/authorize") // .addParameter("scope", "Mail.ReadWrite Calendars.ReadWrite MailboxSettings.Read"); //.addParameter("scope", "openid " + Settings.getOutlookUrl() + "/EWS.AccessAsUser.All AuditLog.Read.All Calendar.ReadWrite Calendars.Read.Shared Calendars.ReadWrite Contacts.ReadWrite DataLossPreventionPolicy.Evaluate Directory.AccessAsUser.All Directory.Read.All Files.Read Files.Read.All Files.ReadWrite.All Group.Read.All Group.ReadWrite.All InformationProtectionPolicy.Read Mail.ReadWrite Mail.Send Notes.Create Organization.Read.All People.Read People.Read.All Printer.Read.All PrintJob.ReadWriteBasic SensitiveInfoType.Detect SensitiveInfoType.Read.All SensitivityLabel.Evaluate Tasks.ReadWrite TeamMember.ReadWrite.All TeamsTab.ReadWriteForChat User.Read.All User.ReadBasic.All User.ReadWrite Users.Read"); } else { uriBuilder.setPath("/" + tenantId + "/oauth2/authorize") .addParameter("resource", Settings.getOutlookUrl()); } uri = uriBuilder.build(); } catch (URISyntaxException e) { throw new IOException(e); } return uri.toString(); } public void setUsername(String username) { if (username.contains("|")) { this.userid = username.substring(0, username.indexOf("|")); this.username = username.substring(username.indexOf("|") + 1); } else { this.username = username; this.userid = username; } } public void setPassword(String password) { this.password = password; } public O365Token getToken() { return token; } public URI getExchangeUri() { return URI.create(Settings.getO365Url()); } /** * Return a pool enabled HttpClientAdapter instance to access O365 * * @return HttpClientAdapter instance */ @Override public HttpClientAdapter getHttpClientAdapter() { return new HttpClientAdapter(getExchangeUri(), username, password, true); } public void authenticate() throws IOException { // common DavMail client id String clientId = Settings.getProperty("davmail.oauth.clientId", "facd6cff-a294-4415-b59f-c5b01937d7bd"); // standard native app redirectUri String redirectUri = Settings.getProperty("davmail.oauth.redirectUri", Settings.getO365LoginUrl()+"/common/oauth2/nativeclient"); // company tenantId or common tenantId = Settings.getProperty("davmail.oauth.tenantId", "common"); // first try to load stored token token = O365Token.load(tenantId, clientId, redirectUri, username, password); if (token != null) { return; } String url = O365Authenticator.buildAuthorizeUrl(tenantId, clientId, redirectUri, username); try ( HttpClientAdapter httpClientAdapter = new HttpClientAdapter(url, userid, password) ) { GetRequest getRequest = new GetRequest(url); String responseBodyAsString = executeFollowRedirect(httpClientAdapter, getRequest); String code; if (!responseBodyAsString.contains("Config=")) { // we are no longer on Microsoft, try ADFS code = authenticateADFS(httpClientAdapter, responseBodyAsString, url); } else { JSONObject config = extractConfig(responseBodyAsString); String context = config.getString("sCtx"); // csts request String apiCanary = config.getString("apiCanary"); // canary for API calls String clientRequestId = config.getString("correlationId"); String hpgact = config.getString("hpgact"); String hpgid = config.getString("hpgid"); String flowToken = config.getString("sFT"); String canary = config.getString("canary"); String sessionId = config.getString("sessionId"); String referer = getRequest.getURI().toString(); RestRequest getCredentialMethod = new RestRequest(Settings.getO365LoginUrl() + "/" + tenantId + "/GetCredentialType"); getCredentialMethod.setRequestHeader("Accept", "application/json"); getCredentialMethod.setRequestHeader("canary", apiCanary); getCredentialMethod.setRequestHeader("client-request-id", clientRequestId); getCredentialMethod.setRequestHeader("hpgact", hpgact); getCredentialMethod.setRequestHeader("hpgid", hpgid); getCredentialMethod.setRequestHeader("hpgrequestid", sessionId); getCredentialMethod.setRequestHeader("Referer", referer); final JSONObject jsonObject = new JSONObject(); jsonObject.put("username", username); jsonObject.put("isOtherIdpSupported", true); jsonObject.put("checkPhones", false); jsonObject.put("isRemoteNGCSupported", false); jsonObject.put("isCookieBannerShown", false); jsonObject.put("isFidoSupported", false); jsonObject.put("flowToken", flowToken); jsonObject.put("originalRequest", context); getCredentialMethod.setJsonBody(jsonObject); JSONObject credentialType = httpClientAdapter.executeRestRequest(getCredentialMethod); LOGGER.debug("CredentialType=" + credentialType); JSONObject credentials = credentialType.getJSONObject("Credentials"); String federationRedirectUrl = credentials.optString("FederationRedirectUrl"); if (federationRedirectUrl != null && !federationRedirectUrl.isEmpty()) { LOGGER.debug("Detected ADFS, redirecting to " + federationRedirectUrl); code = authenticateRedirectADFS(httpClientAdapter, federationRedirectUrl, url); } else { PostRequest logonMethod = new PostRequest(Settings.getO365LoginUrl() + "/" + tenantId + "/login"); logonMethod.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); logonMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); logonMethod.setRequestHeader("Referer", referer); logonMethod.setParameter("canary", canary); logonMethod.setParameter("ctx", context); logonMethod.setParameter("flowToken", flowToken); logonMethod.setParameter("hpgrequestid", sessionId); logonMethod.setParameter("login", username); logonMethod.setParameter("loginfmt", username); logonMethod.setParameter("passwd", password); responseBodyAsString = httpClientAdapter.executePostRequest(logonMethod); URI location = logonMethod.getRedirectLocation(); if (responseBodyAsString != null && responseBodyAsString.contains("arrUserProofs")) { location = handleMfa(httpClientAdapter, logonMethod, username, clientRequestId); } if (location == null || !location.toString().startsWith(redirectUri)) { // extract response config = extractConfig(logonMethod.getResponseBodyAsString()); if (config.optJSONArray("arrScopes") != null || config.optJSONArray("urlPostRedirect") != null) { LOGGER.warn("Authentication successful but user consent or validation needed, please open the following url in a browser"); LOGGER.warn(url); throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else if ("50126".equals(config.optString("sErrorCode"))) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else if ("50125".equals(config.optString("sErrorCode"))) { throw new DavMailAuthenticationException("LOG_MESSAGE", "Your organization needs more information to keep your account secure, authenticate once in a web browser and try again"); } else if (config.optString("strServiceExceptionMessage") != null) { LOGGER.debug("O365 returned error: " + config.optString("strServiceExceptionMessage")); throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else { throw new DavMailAuthenticationException("LOG_MESSAGE", "Authentication failed, unknown error: " + config); } } String query = location.toString(); if (query.contains("code=")) { code = query.substring(query.indexOf("code=") + 5, query.indexOf("&session_state=")); } else { throw new DavMailAuthenticationException("LOG_MESSAGE", "Authentication failed, unknown error: " + query); } } } LOGGER.debug("Authentication Code: " + code); token = O365Token.build(tenantId, clientId, redirectUri, code, password); LOGGER.debug("Authenticated username: " + token.getUsername()); if (!username.equalsIgnoreCase(token.getUsername())) { throw new IOException("Authenticated username " + token.getUsername() + " does not match " + username); } } catch (JSONException e) { throw new IOException(e + " " + e.getMessage()); } } private String authenticateRedirectADFS(HttpClientAdapter httpClientAdapter, String federationRedirectUrl, String authorizeUrl) throws IOException, JSONException { // get ADFS login form GetRequest logonFormMethod = new GetRequest(federationRedirectUrl); logonFormMethod = httpClientAdapter.executeFollowRedirect(logonFormMethod); String responseBodyAsString = logonFormMethod.getResponseBodyAsString(); return authenticateADFS(httpClientAdapter, responseBodyAsString, authorizeUrl); } private String authenticateADFS(HttpClientAdapter httpClientAdapter, String responseBodyAsString, String authorizeUrl) throws IOException, JSONException { URI location; if (responseBodyAsString.contains(Settings.getO365LoginUrl())) { LOGGER.info("Already authenticated through Basic or NTLM"); } else { // parse form to get target url, authenticate as userid PostRequest logonMethod = new PostRequest(extract("method=\"post\" action=\"([^\"]+)\"", responseBodyAsString)); logonMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); logonMethod.setParameter("UserName", userid); logonMethod.setParameter("Password", password); logonMethod.setParameter("AuthMethod", "FormsAuthentication"); httpClientAdapter.executePostRequest(logonMethod); location = logonMethod.getRedirectLocation(); if (location == null) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } GetRequest redirectMethod = new GetRequest(location); responseBodyAsString = httpClientAdapter.executeGetRequest(redirectMethod); } if (!responseBodyAsString.contains(Settings.getO365LoginUrl())) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } String targetUrl = extract("action=\"([^\"]+)\"", responseBodyAsString); String wa = extract("name=\"wa\" value=\"([^\"]+)\"", responseBodyAsString); String wresult = extract("name=\"wresult\" value=\"([^\"]+)\"", responseBodyAsString); // decode wresult wresult = wresult.replaceAll(""", "\""); wresult = wresult.replaceAll("<", "<"); wresult = wresult.replaceAll(">", ">"); String wctx = extract("name=\"wctx\" value=\"([^\"]+)\"", responseBodyAsString); wctx = wctx.replaceAll("&", "&"); PostRequest targetMethod = new PostRequest(targetUrl); targetMethod.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); targetMethod.setParameter("wa", wa); targetMethod.setParameter("wresult", wresult); targetMethod.setParameter("wctx", wctx); responseBodyAsString = httpClientAdapter.executePostRequest(targetMethod); location = targetMethod.getRedirectLocation(); LOGGER.debug(targetMethod.getURI().toString()); LOGGER.debug(targetMethod.getReasonPhrase()); LOGGER.debug(responseBodyAsString); if (targetMethod.getStatusCode() == HttpStatus.SC_OK) { JSONObject config = extractConfig(responseBodyAsString); if (config.optJSONArray("arrScopes") != null || config.optJSONArray("urlPostRedirect") != null) { LOGGER.warn("Authentication successful but user consent or validation needed, please open the following url in a browser"); LOGGER.warn(authorizeUrl); throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } } else if (targetMethod.getStatusCode() != HttpStatus.SC_MOVED_TEMPORARILY || location == null) { throw new IOException("Unknown ADFS authentication failure"); } if (location.getHost().startsWith("device")) { location = processDeviceLogin(httpClientAdapter, location); } String query = location.getQuery(); if (query == null) { // failover for null query with non https URI like urn:ietf:wg:oauth:2.0:oob?code=... query = location.getSchemeSpecificPart(); } if (query.contains("code=") && query.contains("&session_state=")) { String code = query.substring(query.indexOf("code=") + 5, query.indexOf("&session_state=")); LOGGER.debug("Authentication Code: " + code); return code; } throw new IOException("Unknown ADFS authentication failure"); } private URI processDeviceLogin(HttpClientAdapter httpClient, URI location) throws IOException, JSONException { URI result = location; LOGGER.debug("Proceed to device authentication, must have access to a client certificate signed by MS-Organization-Access"); if (Settings.isWindows() && (System.getProperty("java.version").compareTo("13") < 0 || !"MSCAPI".equals(Settings.getProperty("davmail.ssl.clientKeystoreType"))) ) { LOGGER.warn("MSCAPI and Java version 13 or higher required to access TPM protected client certificate on Windows"); } GetRequest deviceLoginMethod = new GetRequest(location); String responseBodyAsString = httpClient.executeGetRequest(deviceLoginMethod); if (responseBodyAsString.contains(Settings.getO365LoginUrl())) { String ctx = extract("name=\"ctx\" value=\"([^\"]+)\"", responseBodyAsString); String flowtoken = extract("name=\"flowtoken\" value=\"([^\"]+)\"", responseBodyAsString); PostRequest processMethod = new PostRequest(extract("action=\"([^\"]+)\"", responseBodyAsString)); processMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); processMethod.setParameter("ctx", ctx); processMethod.setParameter("flowtoken", flowtoken); responseBodyAsString = httpClient.executePostRequest(processMethod); result = processMethod.getRedirectLocation(); // MFA triggered after device authentication if (result == null && responseBodyAsString != null && responseBodyAsString.contains("arrUserProofs")) { result = handleMfa(httpClient, processMethod, username, null); } if (result == null) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } } return result; } private URI handleMfa(HttpClientAdapter httpClientAdapter, PostRequest logonMethod, String username, String clientRequestId) throws IOException, JSONException { JSONObject config = extractConfig(logonMethod.getResponseBodyAsString()); LOGGER.debug("Config=" + config); String urlBeginAuth = config.getString("urlBeginAuth"); String urlEndAuth = config.getString("urlEndAuth"); // Get processAuth url from config String urlProcessAuth = config.optString("urlPost", Settings.getO365LoginUrl() + "/" + tenantId + "/SAS/ProcessAuth"); boolean isMFAMethodSupported = false; String chosenAuthMethodId = null; String chosenAuthMethodPrompt = null; for (int i = 0; i < config.getJSONArray("arrUserProofs").length(); i++) { JSONObject authMethod = (JSONObject) config.getJSONArray("arrUserProofs").get(i); String authMethodId = authMethod.getString("authMethodId"); LOGGER.debug("Authentication method: " + authMethodId); if ("PhoneAppNotification".equals(authMethodId)) { LOGGER.debug("Found phone app auth method " + authMethod.getString("display")); isMFAMethodSupported = true; chosenAuthMethodId = authMethodId; chosenAuthMethodPrompt = authMethod.getString("display"); // prefer phone app break; } if ("OneWaySMS".equals(authMethodId)) { LOGGER.debug("Found OneWaySMS auth method " + authMethod.getString("display")); chosenAuthMethodId = authMethodId; chosenAuthMethodPrompt = authMethod.getString("display"); isMFAMethodSupported = true; } } if (!isMFAMethodSupported) { throw new IOException("MFA authentication methods not supported"); } String context = config.getString("sCtx"); String flowToken = config.getString("sFT"); String canary = config.getString("canary"); String apiCanary = config.getString("apiCanary"); String hpgrequestid = logonMethod.getResponseHeader("x-ms-request-id").getValue(); String hpgact = config.getString("hpgact"); String hpgid = config.getString("hpgid"); // clientRequestId is null coming from device login String correlationId = clientRequestId; if (correlationId == null) { correlationId = config.getString("correlationId"); } RestRequest beginAuthMethod = new RestRequest(urlBeginAuth); beginAuthMethod.setRequestHeader("Accept", "application/json"); beginAuthMethod.setRequestHeader("canary", apiCanary); beginAuthMethod.setRequestHeader("client-request-id", correlationId); beginAuthMethod.setRequestHeader("hpgact", hpgact); beginAuthMethod.setRequestHeader("hpgid", hpgid); beginAuthMethod.setRequestHeader("hpgrequestid", hpgrequestid); // only support PhoneAppNotification JSONObject beginAuthJson = new JSONObject(); beginAuthJson.put("AuthMethodId", chosenAuthMethodId); beginAuthJson.put("Ctx", context); beginAuthJson.put("FlowToken", flowToken); beginAuthJson.put("Method", "BeginAuth"); beginAuthMethod.setJsonBody(beginAuthJson); config = httpClientAdapter.executeRestRequest(beginAuthMethod); LOGGER.debug(config); if (!config.getBoolean("Success")) { throw new IOException("Authentication failed: " + config); } // look for number matching value String entropy = config.optString("Entropy", null); // display number matching value to user NumberMatchingFrame numberMatchingFrame = null; if (entropy != null && !"0".equals(entropy)) { LOGGER.info("Number matching value for " + username + ": " + entropy); if (!Settings.getBooleanProperty("davmail.server") && !GraphicsEnvironment.isHeadless()) { numberMatchingFrame = new NumberMatchingFrame(entropy); } } String smsCode = retrieveSmsCode(chosenAuthMethodId, chosenAuthMethodPrompt); context = config.getString("Ctx"); flowToken = config.getString("FlowToken"); String sessionId = config.getString("SessionId"); int i = 0; boolean success = false; try { while (!success && i++ < 12) { try { Thread.sleep(5000); } catch (InterruptedException e) { LOGGER.debug("Interrupted"); Thread.currentThread().interrupt(); } RestRequest endAuthMethod = new RestRequest(urlEndAuth); endAuthMethod.setRequestHeader("Accept", "application/json"); endAuthMethod.setRequestHeader("canary", apiCanary); endAuthMethod.setRequestHeader("client-request-id", clientRequestId); endAuthMethod.setRequestHeader("hpgact", hpgact); endAuthMethod.setRequestHeader("hpgid", hpgid); endAuthMethod.setRequestHeader("hpgrequestid", hpgrequestid); JSONObject endAuthJson = new JSONObject(); endAuthJson.put("AuthMethodId", chosenAuthMethodId); endAuthJson.put("Ctx", context); endAuthJson.put("FlowToken", flowToken); endAuthJson.put("Method", "EndAuth"); endAuthJson.put("PollCount", "1"); endAuthJson.put("SessionId", sessionId); // When in beginAuthMethod is used 'AuthMethodId': 'OneWaySMS', then in endAuthMethod is send SMS code // via attribute 'AdditionalAuthData' endAuthJson.put("AdditionalAuthData", smsCode); endAuthMethod.setJsonBody(endAuthJson); config = httpClientAdapter.executeRestRequest(endAuthMethod); LOGGER.debug(config); String resultValue = config.getString("ResultValue"); if ("PhoneAppDenied".equals(resultValue) || "PhoneAppNoResponse".equals(resultValue)) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED_REASON", resultValue); } if ("SMSAuthFailedWrongCodeEntered".equals(resultValue)) { smsCode = retrieveSmsCode(chosenAuthMethodId, chosenAuthMethodPrompt); } if (config.getBoolean("Success")) { success = true; } } } finally { // close number matching frame if exists if (numberMatchingFrame != null && numberMatchingFrame.isVisible()) { final JFrame finalNumberMatchingFrame = numberMatchingFrame; SwingUtilities.invokeLater(() -> { finalNumberMatchingFrame.setVisible(false); finalNumberMatchingFrame.dispose(); }); } } if (!success) { throw new IOException("Authentication failed: " + config); } String authMethod = "PhoneAppOTP"; String type = "22"; context = config.getString("Ctx"); flowToken = config.getString("FlowToken"); // process auth PostRequest processAuthMethod = new PostRequest(urlProcessAuth); processAuthMethod.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); processAuthMethod.setParameter("type", type); processAuthMethod.setParameter("request", context); processAuthMethod.setParameter("mfaAuthMethod", authMethod); processAuthMethod.setParameter("canary", canary); processAuthMethod.setParameter("login", username); processAuthMethod.setParameter("flowToken", flowToken); processAuthMethod.setParameter("hpgrequestid", hpgrequestid); httpClientAdapter.executePostRequest(processAuthMethod); return processAuthMethod.getRedirectLocation(); } private String retrieveSmsCode(String chosenAuthMethodId, String chosenAuthMethodPrompt) throws IOException { String smsCode = null; if ("OneWaySMS".equals(chosenAuthMethodId)) { LOGGER.info("Need to retrieve SMS verification code for " + username); if (Settings.getBooleanProperty("davmail.server") || GraphicsEnvironment.isHeadless()) { // headless or server mode System.out.print(BundleMessage.format("UI_SMS_PHONE_CODE", chosenAuthMethodPrompt)); BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in)); smsCode = inReader.readLine(); } else { PasswordPromptDialog passwordPromptDialog = new PasswordPromptDialog(BundleMessage.format("UI_SMS_PHONE_CODE", chosenAuthMethodPrompt)); smsCode = String.valueOf(passwordPromptDialog.getPassword()); } } return smsCode; } private String executeFollowRedirect(HttpClientAdapter httpClientAdapter, GetRequest getRequest) throws IOException { LOGGER.debug(getRequest.getURI()); ResponseWrapper responseWrapper = httpClientAdapter.executeFollowRedirect(getRequest); if (responseWrapper.getURI().getHost().endsWith("okta.com")) { throw new DavMailAuthenticationException("LOG_MESSAGE", "Okta authentication not supported, please try O365Interactive"); } return responseWrapper.getResponseBodyAsString(); } public JSONObject extractConfig(String content) throws IOException { try { return new JSONObject(extract("Config=([^\n]+);", content)); } catch (JSONException e1) { LOGGER.debug(content); throw new IOException("Unable to extract config from response body"); } } public String extract(String pattern, String content) throws IOException { String value; Matcher matcher = Pattern.compile(pattern).matcher(content); if (matcher.find()) { value = matcher.group(1); } else { throw new IOException("pattern not found"); } return value; } } davmail-6.3.0/src/java/davmail/exchange/auth/O365InteractiveAuthenticator.java0100644 0000000 0000000 00000025253 14754417473 026013 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; import davmail.exchange.ews.BaseShape; import davmail.exchange.ews.DistinguishedFolderId; import davmail.exchange.ews.GetFolderMethod; import davmail.exchange.ews.GetUserConfigurationMethod; import davmail.http.HttpClientAdapter; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.log4j.Logger; import javax.swing.*; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.net.URI; import java.security.Security; public class O365InteractiveAuthenticator implements ExchangeAuthenticator { private static final int MAX_COUNT = 300; private static final Logger LOGGER = Logger.getLogger(O365InteractiveAuthenticator.class); static { // disable HTTP/2 loader on Java 14 and later to enable custom socket factory System.setProperty("com.sun.webkit.useHTTP2Loader", "false"); } boolean isAuthenticated = false; String errorCode = null; String code = null; URI ewsUrl = URI.create(Settings.getO365Url()); private O365InteractiveAuthenticatorFrame o365InteractiveAuthenticatorFrame; private O365ManualAuthenticatorDialog o365ManualAuthenticatorDialog; private String username; private String password; private O365Token token; public O365Token getToken() { return token; } @Override public URI getExchangeUri() { return ewsUrl; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } /** * Return a pool enabled HttpClientAdapter instance to access O365 * * @return HttpClientAdapter instance */ @Override public HttpClientAdapter getHttpClientAdapter() { return new HttpClientAdapter(getExchangeUri(), username, password, true); } public void authenticate() throws IOException { // allow cross domain requests for Okta form support System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); // enable NTLM for ADFS support System.setProperty("jdk.http.ntlm.transparentAuth", "allHosts"); // common DavMail client id final String clientId = Settings.getProperty("davmail.oauth.clientId", "facd6cff-a294-4415-b59f-c5b01937d7bd"); // standard native app redirectUri final String redirectUri = Settings.getProperty("davmail.oauth.redirectUri", Settings.getO365LoginUrl()+"/common/oauth2/nativeclient"); // company tenantId or common String tenantId = Settings.getProperty("davmail.oauth.tenantId", "common"); // first try to load stored token token = O365Token.load(tenantId, clientId, redirectUri, username, password); if (token != null) { isAuthenticated = true; return; } final String initUrl = O365Authenticator.buildAuthorizeUrl(tenantId, clientId, redirectUri, username); // set default authenticator Authenticator.setDefault(new Authenticator() { @Override public PasswordAuthentication getPasswordAuthentication() { if (getRequestorType() == RequestorType.PROXY) { String proxyUser = Settings.getProperty("davmail.proxyUser"); String proxyPassword = Settings.getProperty("davmail.proxyPassword"); if (proxyUser != null && proxyPassword != null) { LOGGER.debug("Proxy authentication with user " + proxyUser); return new PasswordAuthentication(proxyUser, proxyPassword.toCharArray()); } else { LOGGER.debug("Missing proxy credentials "); return null; } } else { LOGGER.debug("Password authentication with user " + username); return new PasswordAuthentication(username, password.toCharArray()); } } }); boolean isJFXAvailable = true; try { Class.forName("javafx.application.Platform"); } catch (ClassNotFoundException e) { LOGGER.warn("Unable to load JavaFX (OpenJFX), switch to manual mode"); isJFXAvailable = false; } if (isJFXAvailable) { SwingUtilities.invokeLater(() -> { try { o365InteractiveAuthenticatorFrame = new O365InteractiveAuthenticatorFrame(); o365InteractiveAuthenticatorFrame.setO365InteractiveAuthenticator(O365InteractiveAuthenticator.this); o365InteractiveAuthenticatorFrame.authenticate(initUrl, redirectUri); } catch (NoClassDefFoundError e) { LOGGER.warn("Unable to load JavaFX (OpenJFX)"); } catch (IllegalAccessError e) { LOGGER.warn("Unable to load JavaFX (OpenJFX), append --add-exports java.base/sun.net.www.protocol.https=ALL-UNNAMED to java options"); } }); } else { if (o365InteractiveAuthenticatorFrame == null) { try { SwingUtilities.invokeAndWait(() -> o365ManualAuthenticatorDialog = new O365ManualAuthenticatorDialog(initUrl)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (InvocationTargetException e) { throw new IOException(e); } code = o365ManualAuthenticatorDialog.getCode(); isAuthenticated = code != null; if (!isAuthenticated) { errorCode = "User did not provide authentication code"; } } } int count = 0; while (!isAuthenticated && errorCode == null && count++ < MAX_COUNT) { try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } if (count > MAX_COUNT) { errorCode = "Timed out waiting for interactive authentication"; } if (o365InteractiveAuthenticatorFrame != null && o365InteractiveAuthenticatorFrame.isVisible()) { o365InteractiveAuthenticatorFrame.close(); } if (isAuthenticated) { token = O365Token.build(tenantId, clientId, redirectUri, code, password); LOGGER.debug("Authenticated username: " + token.getUsername()); if (username != null && !username.isEmpty() && !username.equalsIgnoreCase(token.getUsername())) { throw new DavMailAuthenticationException("Authenticated username " + token.getUsername() + " does not match " + username); } } else { LOGGER.error("Authentication failed " + errorCode); throw new DavMailException("EXCEPTION_AUTHENTICATION_FAILED_REASON", errorCode); } } public static void main(String[] argv) { try { // set custom factory before loading OpenJFX Security.setProperty("ssl.SocketFactory.provider", "davmail.http.DavGatewaySSLSocketFactory"); Settings.setDefaultSettings(); Settings.setConfigFilePath("davmail-interactive.properties"); Settings.load(); O365InteractiveAuthenticator authenticator = new O365InteractiveAuthenticator(); authenticator.setUsername(""); authenticator.authenticate(); try ( HttpClientAdapter httpClientAdapter = new HttpClientAdapter(authenticator.getExchangeUri(), true) ) { // switch to EWS url GetFolderMethod checkMethod = new GetFolderMethod(BaseShape.ID_ONLY, DistinguishedFolderId.getInstance(null, DistinguishedFolderId.Name.root), null); checkMethod.setHeader("Authorization", "Bearer " + authenticator.getToken().getAccessToken()); try ( CloseableHttpResponse response = httpClientAdapter.execute(checkMethod) ) { checkMethod.handleResponse(response); checkMethod.checkSuccess(); } LOGGER.info("Retrieved folder id " + checkMethod.getResponseItem().get("FolderId")); // loop to check expiration int i = 0; while (i++ < 12 * 60 * 2) { GetUserConfigurationMethod getUserConfigurationMethod = new GetUserConfigurationMethod(); getUserConfigurationMethod.setHeader("Authorization", "Bearer " + authenticator.getToken().getAccessToken()); try ( CloseableHttpResponse response = httpClientAdapter.execute(getUserConfigurationMethod) ) { getUserConfigurationMethod.handleResponse(response); getUserConfigurationMethod.checkSuccess(); } LOGGER.info(getUserConfigurationMethod.getResponseItem()); Thread.sleep(5000); } } } catch (InterruptedException e) { LOGGER.warn("Thread interrupted", e); Thread.currentThread().interrupt(); } catch (Exception e) { LOGGER.error(e + " " + e.getMessage(), e); } System.exit(0); } } davmail-6.3.0/src/java/davmail/exchange/auth/O365InteractiveAuthenticatorFrame.java0100644 0000000 0000000 00000024003 14754153477 026757 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.BundleMessage; import davmail.Settings; import davmail.ui.tray.DavGatewayTray; import javafx.application.Platform; import javafx.concurrent.Worker; import javafx.embed.swing.JFXPanel; import javafx.scene.Scene; import javafx.scene.control.ProgressBar; import javafx.scene.layout.StackPane; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import org.apache.log4j.Logger; import org.w3c.dom.Document; import javax.swing.*; import javax.xml.XMLConstants; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ByteArrayOutputStream; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import java.nio.charset.StandardCharsets; /** * Interactive authenticator UI based on OpenJFX. * Need access to internal urlhandler on recent JDK versions with: --add-exports java.base/sun.net.www.protocol.https=ALL-UNNAMED */ public class O365InteractiveAuthenticatorFrame extends JFrame { private static final Logger LOGGER = Logger.getLogger(O365InteractiveAuthenticatorFrame.class); private O365InteractiveAuthenticator authenticator; static { // register a stream handler for msauth protocol URL.setURLStreamHandlerFactory((String protocol) -> { if ("msauth".equals(protocol) || "urn".equals(protocol)) { return new URLStreamHandler() { @Override protected URLConnection openConnection(URL u) { return new URLConnection(u) { @Override public void connect() { // ignore } }; } }; } return null; } ); } String location; final JFXPanel fxPanel = new JFXPanel(); public O365InteractiveAuthenticatorFrame() { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if (!authenticator.isAuthenticated && authenticator.errorCode == null) { authenticator.errorCode = "user closed authentication window"; } } }); setTitle(BundleMessage.format("UI_DAVMAIL_GATEWAY")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel mainPanel = new JPanel(); mainPanel.add(fxPanel); add(BorderLayout.CENTER, mainPanel); pack(); setResizable(true); // center frame setSize(600, 600); setLocationRelativeTo(null); setVisible(true); // bring window to top setAlwaysOnTop(true); setAlwaysOnTop(false); } public void setO365InteractiveAuthenticator(O365InteractiveAuthenticator authenticator) { this.authenticator = authenticator; } private void initFX(final JFXPanel fxPanel, final String url, final String redirectUri) { WebView webView = new WebView(); final WebEngine webViewEngine = webView.getEngine(); final ProgressBar loadProgress = new ProgressBar(); loadProgress.progressProperty().bind(webViewEngine.getLoadWorker().progressProperty()); StackPane hBox = new StackPane(); hBox.getChildren().setAll(webView, loadProgress); Scene scene = new Scene(hBox); fxPanel.setScene(scene); webViewEngine.setUserAgent(Settings.getUserAgent()); webViewEngine.setOnAlert(stringWebEvent -> SwingUtilities.invokeLater(() -> { String message = stringWebEvent.getData(); JOptionPane.showMessageDialog(O365InteractiveAuthenticatorFrame.this, message); })); webViewEngine.setOnError(event -> LOGGER.error(event.getMessage())); webViewEngine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> { // with Java 15 url with code returns as CANCELLED if (newState == Worker.State.SUCCEEDED || newState == Worker.State.CANCELLED) { loadProgress.setVisible(false); location = webViewEngine.getLocation(); updateTitleAndFocus(location); LOGGER.debug("Webview location: " + location); // override console.log O365InteractiveJSLogger.register(webViewEngine); if (LOGGER.isDebugEnabled()) { LOGGER.debug(dumpDocument(webViewEngine.getDocument())); } if (location.startsWith(redirectUri)) { LOGGER.debug("Location starts with redirectUri, check code"); authenticator.isAuthenticated = location.contains("code=") && location.contains("&session_state="); if (!authenticator.isAuthenticated && location.contains("error=")) { authenticator.errorCode = location.substring(location.indexOf("error=")); } if (authenticator.isAuthenticated) { LOGGER.debug("Authenticated location: " + location); String code = location.substring(location.indexOf("code=") + 5, location.indexOf("&session_state=")); String sessionState = location.substring(location.lastIndexOf('=')); LOGGER.debug("Authentication Code: " + code); LOGGER.debug("Authentication session state: " + sessionState); authenticator.code = code; } close(); } } else if (newState == Worker.State.FAILED) { Throwable e = webViewEngine.getLoadWorker().getException(); if (e != null) { handleError(e); } close(); } else { LOGGER.debug(webViewEngine.getLoadWorker().getState() + " " + webViewEngine.getLoadWorker().getMessage() + " " + webViewEngine.getLocation() + " "); } }); webViewEngine.load(url); } private void updateTitleAndFocus(final String location) { SwingUtilities.invokeLater(() -> { setState(Frame.NORMAL); setAlwaysOnTop(true); setAlwaysOnTop(false); setTitle("DavMail: " + location); }); } public String dumpDocument(Document document) { String result; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); TransformerFactory transformerFactory = TransformerFactory.newInstance(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.transform(new DOMSource(document), new StreamResult(new OutputStreamWriter(baos, StandardCharsets.UTF_8))); result = baos.toString("UTF-8"); } catch (Exception e) { result = e + " " + e.getMessage(); } return result; } public void authenticate(final String initUrl, final String redirectUri) { // Run initFX as JavaFX-Thread Platform.runLater(() -> { try { Platform.setImplicitExit(false); initFX(fxPanel, initUrl, redirectUri); } catch (Exception e) { handleError(e); close(); } }); } public void handleError(Throwable t) { LOGGER.error(t + " " + t.getMessage()); authenticator.errorCode = t.getMessage(); if (authenticator.errorCode == null) { authenticator.errorCode = t.toString(); } } public void close() { SwingUtilities.invokeLater(() -> { setVisible(false); dispose(); }); } } davmail-6.3.0/src/java/davmail/exchange/auth/O365InteractiveJSLogger.java0100644 0000000 0000000 00000003757 13760147443 024653 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import javafx.scene.web.WebEngine; import org.apache.log4j.Logger; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @SuppressWarnings({"rawtypes", "unchecked"}) public class O365InteractiveJSLogger { private static final Logger LOGGER = Logger.getLogger(O365InteractiveJSLogger.class); public void log(String message) { LOGGER.info(message); } public static void register(WebEngine webEngine) { try { Class jsObjectClass = Class.forName("netscape.javascript.JSObject"); Method setMemberMethod = jsObjectClass.getDeclaredMethod("setMember", String.class,Object.class); Object window = webEngine.executeScript("window"); setMemberMethod.invoke(window, "davmail", new O365InteractiveJSLogger()); webEngine.executeScript("console.log = function(message) { davmail.log(message); }"); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { LOGGER.info("netscape.javascript.JSObject not available"); } } } davmail-6.3.0/src/java/davmail/exchange/auth/O365ManualAuthenticator.java0100644 0000000 0000000 00000017275 14754417473 024760 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.BundleMessage; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; import davmail.exchange.ews.BaseShape; import davmail.exchange.ews.DistinguishedFolderId; import davmail.exchange.ews.GetFolderMethod; import davmail.exchange.ews.GetUserConfigurationMethod; import davmail.http.HttpClientAdapter; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.log4j.Logger; import javax.swing.*; import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.net.URI; public class O365ManualAuthenticator implements ExchangeAuthenticator { private static final Logger LOGGER = Logger.getLogger(O365ManualAuthenticator.class); String errorCode = null; String code = null; URI ewsUrl = URI.create(Settings.getO365Url()); private O365ManualAuthenticatorDialog o365ManualAuthenticatorDialog; private String username; private String password; private O365Token token; public O365Token getToken() { return token; } @Override public URI getExchangeUri() { return ewsUrl; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } /** * Return a pool enabled HttpClientAdapter instance to access O365 * @return HttpClientAdapter instance */ @Override public HttpClientAdapter getHttpClientAdapter() { return new HttpClientAdapter(getExchangeUri(), username, password, true); } public void authenticate() throws IOException { // common DavMail client id final String clientId = Settings.getProperty("davmail.oauth.clientId", "facd6cff-a294-4415-b59f-c5b01937d7bd"); // standard native app redirectUri final String redirectUri = Settings.getProperty("davmail.oauth.redirectUri", Settings.getO365LoginUrl()+"/common/oauth2/nativeclient"); // company tenantId or common String tenantId = Settings.getProperty("davmail.oauth.tenantId", "common"); // first try to load stored token token = O365Token.load(tenantId, clientId, redirectUri, username, password); if (token != null) { return; } final String initUrl = O365Authenticator.buildAuthorizeUrl(tenantId, clientId, redirectUri, username); if (Settings.getBooleanProperty("davmail.server") || GraphicsEnvironment.isHeadless()) { // command line mode code = getCodeFromConsole(initUrl); } else { try { SwingUtilities.invokeAndWait(() -> o365ManualAuthenticatorDialog = new O365ManualAuthenticatorDialog(initUrl)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (InvocationTargetException e) { throw new IOException(e); } code = o365ManualAuthenticatorDialog.getCode(); } if (code == null) { LOGGER.error("Authentication failed, code not available"); throw new DavMailException("EXCEPTION_AUTHENTICATION_FAILED_REASON", errorCode); } token = O365Token.build(tenantId, clientId, redirectUri, code, password); LOGGER.debug("Authenticated username: " + token.getUsername()); if (username != null && !username.isEmpty() && !username.equalsIgnoreCase(token.getUsername())) { throw new DavMailAuthenticationException("Authenticated username " + token.getUsername() + " does not match " + username); } } private String getCodeFromConsole(String initUrl) { BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in)); StringBuilder buffer = new StringBuilder(); buffer.append(BundleMessage.format("UI_0365_AUTHENTICATION_PROMPT_CONSOLE", initUrl)).append("\n") .append(BundleMessage.format("UI_0365_AUTHENTICATION_CODE")); try { System.out.print(buffer.toString()); code = inReader.readLine(); if (code != null && code.contains("code=") && code.contains("&session_state=")) { code = code.substring(code.indexOf("code=")+5, code.indexOf("&session_state=")); } } catch (IOException e) { System.err.println(e + " " + e.getMessage()); } return code; } public static void main(String[] argv) { try { Settings.setDefaultSettings(); Settings.setProperty("davmail.server", "false"); //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); O365ManualAuthenticator authenticator = new O365ManualAuthenticator(); authenticator.setUsername(""); authenticator.authenticate(); // switch to EWS url HttpClientAdapter httpClientAdapter = new HttpClientAdapter(authenticator.getExchangeUri(), true); GetFolderMethod checkMethod = new GetFolderMethod(BaseShape.ID_ONLY, DistinguishedFolderId.getInstance(null, DistinguishedFolderId.Name.root), null); checkMethod.setHeader("Authorization", "Bearer " + authenticator.getToken().getAccessToken()); try ( CloseableHttpResponse response = httpClientAdapter.execute(checkMethod) ) { checkMethod.handleResponse(response); checkMethod.checkSuccess(); } System.out.println("Retrieved folder id " + checkMethod.getResponseItem().get("FolderId")); // loop to check expiration int i = 0; while (i++ < 12 * 60 * 2) { GetUserConfigurationMethod getUserConfigurationMethod = new GetUserConfigurationMethod(); getUserConfigurationMethod.setHeader("Authorization", "Bearer " + authenticator.getToken().getAccessToken()); try ( CloseableHttpResponse response = httpClientAdapter.execute(checkMethod) ) { checkMethod.handleResponse(response); checkMethod.checkSuccess(); } System.out.println(getUserConfigurationMethod.getResponseItem()); Thread.sleep(5000); } } catch (InterruptedException e) { LOGGER.warn("Thread interrupted", e); Thread.currentThread().interrupt(); } catch (Exception e) { LOGGER.error(e + " " + e.getMessage(), e); } System.exit(0); } } davmail-6.3.0/src/java/davmail/exchange/auth/O365ManualAuthenticatorDialog.java0100644 0000000 0000000 00000014751 14602052450 026052 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.BundleMessage; import davmail.ui.browser.DesktopBrowser; import davmail.ui.tray.DavGatewayTray; import javax.swing.*; import javax.swing.event.HyperlinkEvent; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.StyleSheet; import java.awt.*; import java.net.URISyntaxException; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; public class O365ManualAuthenticatorDialog extends JDialog { final JTextField codeField = new JTextField(30); protected String code; /** * Get Oauth authentication code. * * @return authentication code */ public String getCode() { if (code != null && code.contains("code=") && code.contains("&session_state=")) { code = code.substring(code.indexOf("code=")+5, code.indexOf("&session_state=")); } return code; } /** * Get credentials. * * @param initUrl Kerberos prompt from callback handler */ public O365ManualAuthenticatorDialog(String initUrl) { setAlwaysOnTop(true); setTitle(BundleMessage.format("UI_O365_MANUAL_PROMPT")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel messagePanel = new JPanel(); messagePanel.setLayout(new BoxLayout(messagePanel, BoxLayout.X_AXIS)); JLabel imageLabel = new JLabel(); imageLabel.setIcon(UIManager.getIcon("OptionPane.questionIcon")); messagePanel.add(imageLabel); messagePanel.add(getEditorPane(BundleMessage.format("UI_0365_AUTHENTICATION_PROMPT", initUrl))); JPanel credentialPanel = new JPanel(); credentialPanel.setLayout(new BoxLayout(credentialPanel, BoxLayout.X_AXIS)); JLabel promptLabel = new JLabel(BundleMessage.format("UI_0365_AUTHENTICATION_CODE")); promptLabel.setHorizontalAlignment(SwingConstants.RIGHT); promptLabel.setVerticalAlignment(SwingConstants.CENTER); credentialPanel.add(promptLabel); codeField.setMaximumSize(codeField.getPreferredSize()); codeField.addActionListener(evt -> { code = codeField.getText(); setVisible(false); }); credentialPanel.add(codeField); JPanel centerPanel = new JPanel(); centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS)); centerPanel.add(messagePanel); centerPanel.add(getOpenButtonPanel(initUrl)); centerPanel.add(getEditorPane(BundleMessage.format("UI_0365_AUTHENTICATION_CODE_PROMPT"))); centerPanel.add(credentialPanel); centerPanel.add(Box.createVerticalGlue()); //add(messagePanel, BorderLayout.NORTH); add(centerPanel, BorderLayout.CENTER); add(getSendButtonPanel(), BorderLayout.SOUTH); setModal(true); pack(); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); setAlwaysOnTop(true); setVisible(true); } private JEditorPane getEditorPane(String text) { JEditorPane jEditorPane = new JEditorPane(); HTMLEditorKit htmlEditorKit = new HTMLEditorKit(); StyleSheet stylesheet = htmlEditorKit.getStyleSheet(); Font font = jEditorPane.getFont(); stylesheet.addRule("body { font-size:small;font-family: " + ((font==null)?"Arial":font.getFamily()) + '}'); jEditorPane.setEditorKit(htmlEditorKit); jEditorPane.setContentType("text/html"); jEditorPane.setText(text); jEditorPane.setEditable(false); jEditorPane.setOpaque(false); jEditorPane.addHyperlinkListener(hle -> { if (HyperlinkEvent.EventType.ACTIVATED.equals(hle.getEventType())) { try { DesktopBrowser.browse(hle.getURL().toURI()); } catch (URISyntaxException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e); } } }); return jEditorPane; } protected JPanel getOpenButtonPanel(final String initUrl) { JPanel buttonPanel = new JPanel(); JButton openButton = new JButton(BundleMessage.format("UI_BUTTON_OPEN")); JButton copyButton = new JButton(BundleMessage.format("UI_BUTTON_COPY")); openButton.addActionListener(evt -> DesktopBrowser.browse(initUrl)); copyButton.addActionListener(evt -> { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(new StringSelection(initUrl), null); }); buttonPanel.add(openButton); buttonPanel.add(copyButton); return buttonPanel; } protected JPanel getSendButtonPanel() { JPanel buttonPanel = new JPanel(); JButton sendButton = new JButton(BundleMessage.format("UI_BUTTON_SEND")); JButton cancelButton = new JButton(BundleMessage.format("UI_BUTTON_CANCEL")); sendButton.addActionListener(evt -> { code = codeField.getText(); setVisible(false); }); cancelButton.addActionListener(evt -> { code = null; setVisible(false); }); buttonPanel.add(sendButton); buttonPanel.add(cancelButton); return buttonPanel; } } davmail-6.3.0/src/java/davmail/exchange/auth/O365StoredTokenAuthenticator.java0100644 0000000 0000000 00000007041 14754417473 025772 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.Settings; import davmail.http.HttpClientAdapter; import org.apache.log4j.Logger; import java.io.IOException; import java.net.URI; /** * Experimental: load Oauth2 token from settings */ @SuppressWarnings("unused") public class O365StoredTokenAuthenticator implements ExchangeAuthenticator { private static final Logger LOGGER = Logger.getLogger(O365StoredTokenAuthenticator.class); URI ewsUrl = URI.create(Settings.getO365Url()); private String username; private String password; private O365Token token; @Override public void setUsername(String username) { this.username = username; } @Override public void setPassword(String password) { this.password = password; } /** * Return a pool enabled HttpClientAdapter instance to access O365 * @return HttpClientAdapter instance */ @Override public HttpClientAdapter getHttpClientAdapter() { return new HttpClientAdapter(getExchangeUri(), username, password, true); } @Override public void authenticate() throws IOException { // common DavMail client id final String clientId = Settings.getProperty("davmail.oauth.clientId", "facd6cff-a294-4415-b59f-c5b01937d7bd"); // standard native app redirectUri final String redirectUri = Settings.getProperty("davmail.oauth.redirectUri", Settings.getO365LoginUrl()+"/common/oauth2/nativeclient"); // company tenantId or common String tenantId = Settings.getProperty("davmail.oauth.tenantId", "common"); String refreshToken = Settings.getProperty("davmail.oauth."+username.toLowerCase()+".refreshToken"); if (refreshToken == null) { // single user mode refreshToken = Settings.getProperty("davmail.oauth.refreshToken"); } String accessToken = Settings.getProperty("davmail.oauth.accessToken"); if (refreshToken == null && accessToken == null) { LOGGER.warn("No stored Oauth refresh token found for "+username); throw new IOException("No stored Oauth refresh token found for "+username); } token = new O365Token(tenantId, clientId, redirectUri, password); if (accessToken != null) { // for tests only: load access token, will expire in at most one hour token.setAccessToken(accessToken); } else { token.setRefreshToken(refreshToken); token.refreshToken(); } } @Override public O365Token getToken() { return token; } @Override public URI getExchangeUri() { return ewsUrl; } } davmail-6.3.0/src/java/davmail/exchange/auth/O365Token.java0100644 0000000 0000000 00000024024 14754417473 022056 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.auth; import davmail.Settings; import davmail.http.HttpClientAdapter; import davmail.http.request.RestRequest; import davmail.util.IOUtil; import davmail.util.StringEncryptor; import org.apache.http.Consts; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.message.BasicNameValuePair; import org.apache.log4j.Logger; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import java.io.IOException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Date; /** * O365 token wrapper */ public class O365Token { protected static final Logger LOGGER = Logger.getLogger(O365Token.class); private String clientId; private String tokenUrl; private String password; private String redirectUri; private String username; private String refreshToken; private String accessToken; private long expiresOn; public O365Token(String tenantId, String clientId, String redirectUri, String password) { this.clientId = clientId; this.redirectUri = redirectUri; this.tokenUrl = Settings.getO365LoginUrl() + "/" + tenantId + "/oauth2/token"; this.password = password; } public O365Token(String tenantId, String clientId, String redirectUri, String code, String password) throws IOException { this.clientId = clientId; this.redirectUri = redirectUri; this.tokenUrl = Settings.getO365LoginUrl() + "/" + tenantId + "/oauth2/token"; this.password = password; ArrayList parameters = new ArrayList<>(); parameters.add(new BasicNameValuePair("grant_type", "authorization_code")); parameters.add(new BasicNameValuePair("code", code)); parameters.add(new BasicNameValuePair("redirect_uri", redirectUri)); parameters.add(new BasicNameValuePair("client_id", clientId)); RestRequest tokenRequest = new RestRequest(tokenUrl, new UrlEncodedFormEntity(parameters, Consts.UTF_8)); executeRequest(tokenRequest); } public String getUsername() { return username; } public void setJsonToken(JSONObject jsonToken) throws IOException { try { if (jsonToken.opt("error") != null) { throw new IOException(jsonToken.optString("error") + " " + jsonToken.optString("error_description")); } // access token expires after one hour accessToken = jsonToken.getString("access_token"); // precious refresh token refreshToken = jsonToken.getString("refresh_token"); // expires_on is in second, not millisecond expiresOn = jsonToken.getLong("expires_on") * 1000; LOGGER.debug("Access token expires " + new Date(expiresOn)); // get username from id_token String idToken = jsonToken.optString("id_token"); if (idToken != null && idToken.contains(".")) { String decodedJwt = IOUtil.decodeBase64AsString(idToken.substring(idToken.indexOf("."), idToken.lastIndexOf("."))); try { JSONObject tokenBody = new JSONObject(decodedJwt); LOGGER.debug("Token: " + tokenBody); username = tokenBody.getString("unique_name"); // detect live.com token final String liveDotCom = "live.com#"; if (username.startsWith(liveDotCom)) { username = username.substring(liveDotCom.length()); } } catch (JSONException e) { LOGGER.warn("Invalid id_token " + e.getMessage(), e); } } // failover: get username from bearer if (username == null) { String decodedBearer = IOUtil.decodeBase64AsString(accessToken.substring(accessToken.indexOf('.') + 1, accessToken.lastIndexOf('.')) + "=="); JSONObject tokenBody = new JSONObject(decodedBearer); LOGGER.debug("Token: " + tokenBody); username = tokenBody.getString("unique_name"); } } catch (JSONException e) { throw new IOException("Exception parsing token", e); } } public void setClientId(String clientId) { this.clientId = clientId; } public void setRedirectUri(String redirectUri) { this.redirectUri = redirectUri; } public String getAccessToken() throws IOException { // detect expiration and refresh token if (isTokenExpired()) { LOGGER.debug("Access token expires soon, trying to refresh it"); refreshToken(); } //LOGGER.debug("Access token for " + username + " expires in " + (expiresOn - System.currentTimeMillis()) / 60000 + " minutes"); return accessToken; } private boolean isTokenExpired() { return System.currentTimeMillis() > (expiresOn - 60000); } public void setAccessToken(String accessToken) { this.accessToken = accessToken; // assume unexpired token expiresOn = System.currentTimeMillis() + 1000 * 60 * 60; } public void setRefreshToken(String refreshToken) { this.refreshToken = refreshToken; } public String getRefreshToken() { return refreshToken; } public void refreshToken() throws IOException { ArrayList parameters = new ArrayList<>(); parameters.add(new BasicNameValuePair("grant_type", "refresh_token")); parameters.add(new BasicNameValuePair("refresh_token", refreshToken)); parameters.add(new BasicNameValuePair("redirect_uri", redirectUri)); parameters.add(new BasicNameValuePair("client_id", clientId)); parameters.add(new BasicNameValuePair("resource", Settings.getOutlookUrl())); RestRequest tokenRequest = new RestRequest(tokenUrl, new UrlEncodedFormEntity(parameters, Consts.UTF_8)); executeRequest(tokenRequest); // persist new refresh token persistToken(); } private void executeRequest(RestRequest tokenMethod) throws IOException { // do not keep login connections open (no pooling) try ( HttpClientAdapter httpClientAdapter = new HttpClientAdapter(tokenUrl); CloseableHttpResponse response = httpClientAdapter.execute(tokenMethod) ) { setJsonToken(tokenMethod.handleResponse(response)); } } static O365Token build(String tenantId, String clientId, String redirectUri, String code, String password) throws IOException { O365Token token = new O365Token(tenantId, clientId, redirectUri, code, password); token.persistToken(); return token; } static O365Token load(String tenantId, String clientId, String redirectUri, String username, String password) throws UnknownHostException { O365Token token = null; if (Settings.getBooleanProperty("davmail.oauth.persistToken", true)) { String encryptedRefreshToken = Settings.loadRefreshToken(username); if (encryptedRefreshToken != null) { String refreshToken; try { refreshToken = decryptToken(encryptedRefreshToken, password); LOGGER.debug("Loaded stored token for " + username); O365Token localToken = new O365Token(tenantId, clientId, redirectUri, password); localToken.setRefreshToken(refreshToken); localToken.refreshToken(); LOGGER.debug("Authenticated user " + localToken.getUsername() + " from stored token"); token = localToken; } catch (UnknownHostException e) { // network down, rethrow to avoid invalidating token throw e; } catch (IOException e) { LOGGER.error("refresh token failed " + e.getMessage()); // TODO detect network down and rethrow exception } } } return token; } private void persistToken() throws IOException { if (Settings.getBooleanProperty("davmail.oauth.persistToken", true)) { if (password == null || password.isEmpty()) { // no password provided, store token unencrypted Settings.storeRefreshToken(username, refreshToken); } else { Settings.storeRefreshToken(username, O365Token.encryptToken(refreshToken, password)); } } } private static String decryptToken(String encryptedRefreshToken, String password) throws IOException { return new StringEncryptor(password).decryptString(encryptedRefreshToken); } private static String encryptToken(String refreshToken, String password) throws IOException { return new StringEncryptor(password).encryptString(refreshToken); } } davmail-6.3.0/src/java/davmail/exchange/dav/DavExchangeSession.java0100644 0000000 0000000 00000454122 14503245212 023737 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import davmail.BundleMessage; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; import davmail.exception.HttpNotFoundException; import davmail.exception.HttpPreconditionFailedException; import davmail.exception.InsufficientStorageException; import davmail.exception.LoginTimeoutException; import davmail.exception.WebdavNotAvailableException; import davmail.exchange.ExchangeSession; import davmail.exchange.VCalendar; import davmail.exchange.VObject; import davmail.exchange.VProperty; import davmail.exchange.XMLStreamUtil; import davmail.http.HttpClientAdapter; import davmail.http.URIUtil; import davmail.http.request.ExchangePropPatchRequest; import davmail.ui.tray.DavGatewayTray; import davmail.util.IOUtil; import davmail.util.StringUtil; import org.apache.http.Consts; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.HttpResponseException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpHead; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.client.utils.URIUtils; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ContentType; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.message.BasicNameValuePair; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.client.methods.HttpCopy; import org.apache.jackrabbit.webdav.client.methods.HttpMove; import org.apache.jackrabbit.webdav.client.methods.HttpPropfind; import org.apache.jackrabbit.webdav.client.methods.HttpProppatch; import org.apache.jackrabbit.webdav.property.DavProperty; import org.apache.jackrabbit.webdav.property.DavPropertyNameSet; import org.apache.jackrabbit.webdav.property.DavPropertySet; import org.apache.jackrabbit.webdav.property.PropEntry; import org.w3c.dom.Node; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimePart; import javax.mail.util.SharedByteArrayInputStream; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.NoRouteToHostException; import java.net.SocketException; import java.net.URISyntaxException; import java.net.URL; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.zip.GZIPInputStream; /** * Webdav Exchange adapter. * Compatible with Exchange 2003 and 2007 with webdav available. */ @SuppressWarnings("rawtypes") public class DavExchangeSession extends ExchangeSession { protected enum FolderQueryTraversal { Shallow, Deep } protected static final DavPropertyNameSet WELL_KNOWN_FOLDERS = new DavPropertyNameSet(); static { WELL_KNOWN_FOLDERS.add(Field.getPropertyName("inbox")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("deleteditems")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("sentitems")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("sendmsg")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("drafts")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("calendar")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("tasks")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("contacts")); WELL_KNOWN_FOLDERS.add(Field.getPropertyName("outbox")); } static final Map vTodoToTaskStatusMap = new HashMap<>(); static final Map taskTovTodoStatusMap = new HashMap<>(); static { //taskTovTodoStatusMap.put("0", null); taskTovTodoStatusMap.put("1", "IN-PROCESS"); taskTovTodoStatusMap.put("2", "COMPLETED"); taskTovTodoStatusMap.put("3", "NEEDS-ACTION"); taskTovTodoStatusMap.put("4", "CANCELLED"); //vTodoToTaskStatusMap.put(null, "0"); vTodoToTaskStatusMap.put("IN-PROCESS", "1"); vTodoToTaskStatusMap.put("COMPLETED", "2"); vTodoToTaskStatusMap.put("NEEDS-ACTION", "3"); vTodoToTaskStatusMap.put("CANCELLED", "4"); } /** * HttpClient 4 adapter to replace httpClient */ private HttpClientAdapter httpClientAdapter; /** * Various standard mail boxes Urls */ protected String inboxUrl; protected String deleteditemsUrl; protected String sentitemsUrl; protected String sendmsgUrl; protected String draftsUrl; protected String calendarUrl; protected String tasksUrl; protected String contactsUrl; protected String outboxUrl; protected String inboxName; protected String deleteditemsName; protected String sentitemsName; protected String sendmsgName; protected String draftsName; protected String calendarName; protected String tasksName; protected String contactsName; protected String outboxName; protected static final String USERS = "/users/"; /** * HttpClient4 conversion. * TODO: move up to ExchangeSession */ protected void getEmailAndAliasFromOptions() { // get user mail URL from html body HttpGet optionsMethod = new HttpGet("/owa/?ae=Options&t=About"); try ( CloseableHttpResponse response = httpClientAdapter.execute(optionsMethod, cloneContext()); InputStream inputStream = response.getEntity().getContent(); BufferedReader optionsPageReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)) ) { String line; // find email and alias //noinspection StatementWithEmptyBody while ((line = optionsPageReader.readLine()) != null && (line.indexOf('[') == -1 || line.indexOf('@') == -1 || line.indexOf(']') == -1 || !line.toLowerCase().contains(MAILBOX_BASE))) { } if (line != null) { int start = line.toLowerCase().lastIndexOf(MAILBOX_BASE) + MAILBOX_BASE.length(); int end = line.indexOf('<', start); alias = line.substring(start, end); end = line.lastIndexOf(']'); start = line.lastIndexOf('[', end) + 1; email = line.substring(start, end); } } catch (IOException e) { LOGGER.error("Error parsing options page at " + optionsMethod.getURI()); } } /** * Create a separate Http context to protect session cookies. * * @return HttpClientContext instance with cookies */ private HttpClientContext cloneContext() { // Create a local context to avoid cookie reset on error BasicCookieStore cookieStore = new BasicCookieStore(); cookieStore.addCookies(httpClientAdapter.getCookies().toArray(new org.apache.http.cookie.Cookie[0])); HttpClientContext context = HttpClientContext.create(); context.setCookieStore(cookieStore); return context; } @Override public boolean isExpired() throws NoRouteToHostException, UnknownHostException { // experimental: try to reset session timeout if ("Exchange2007".equals(serverVersion)) { HttpGet getMethod = new HttpGet("/owa/"); try (CloseableHttpResponse response = httpClientAdapter.execute(getMethod)) { LOGGER.debug(response.getStatusLine().getStatusCode() + " at /owa/"); } catch (IOException e) { LOGGER.warn(e.getMessage()); } } return super.isExpired(); } /** * Convert logical or relative folder path to exchange folder path. * * @param folderPath folder name * @return folder path */ public String getFolderPath(String folderPath) { String exchangeFolderPath; // IMAP path if (folderPath.startsWith(INBOX)) { exchangeFolderPath = mailPath + inboxName + folderPath.substring(INBOX.length()); } else if (folderPath.startsWith(TRASH)) { exchangeFolderPath = mailPath + deleteditemsName + folderPath.substring(TRASH.length()); } else if (folderPath.startsWith(DRAFTS)) { exchangeFolderPath = mailPath + draftsName + folderPath.substring(DRAFTS.length()); } else if (folderPath.startsWith(SENT)) { exchangeFolderPath = mailPath + sentitemsName + folderPath.substring(SENT.length()); } else if (folderPath.startsWith(SENDMSG)) { exchangeFolderPath = mailPath + sendmsgName + folderPath.substring(SENDMSG.length()); } else if (folderPath.startsWith(CONTACTS)) { exchangeFolderPath = mailPath + contactsName + folderPath.substring(CONTACTS.length()); } else if (folderPath.startsWith(CALENDAR)) { exchangeFolderPath = mailPath + calendarName + folderPath.substring(CALENDAR.length()); } else if (folderPath.startsWith(TASKS)) { exchangeFolderPath = mailPath + tasksName + folderPath.substring(TASKS.length()); } else if (folderPath.startsWith("public")) { exchangeFolderPath = publicFolderUrl + folderPath.substring("public".length()); // caldav path } else if (folderPath.startsWith(USERS)) { // get requested principal String principal; String localPath; int principalIndex = folderPath.indexOf('/', USERS.length()); if (principalIndex >= 0) { principal = folderPath.substring(USERS.length(), principalIndex); localPath = folderPath.substring(USERS.length() + principal.length() + 1); if (localPath.startsWith(LOWER_CASE_INBOX) || localPath.startsWith(INBOX) || localPath.startsWith(MIXED_CASE_INBOX)) { localPath = inboxName + localPath.substring(LOWER_CASE_INBOX.length()); } else if (localPath.startsWith(CALENDAR)) { localPath = calendarName + localPath.substring(CALENDAR.length()); } else if (localPath.startsWith(TASKS)) { localPath = tasksName + localPath.substring(TASKS.length()); } else if (localPath.startsWith(CONTACTS)) { localPath = contactsName + localPath.substring(CONTACTS.length()); } else if (localPath.startsWith(ADDRESSBOOK)) { localPath = contactsName + localPath.substring(ADDRESSBOOK.length()); } } else { principal = folderPath.substring(USERS.length()); localPath = ""; } if (principal.length() == 0) { exchangeFolderPath = rootPath; } else if (alias.equalsIgnoreCase(principal) || (email != null && email.equalsIgnoreCase(principal))) { exchangeFolderPath = mailPath + localPath; } else { LOGGER.debug("Detected shared path for principal " + principal + ", user principal is " + email); exchangeFolderPath = rootPath + principal + '/' + localPath; } // absolute folder path } else if (folderPath.startsWith("/")) { exchangeFolderPath = folderPath; } else { exchangeFolderPath = mailPath + folderPath; } return exchangeFolderPath; } /** * Test if folderPath is inside user mailbox. * * @param folderPath absolute folder path * @return true if folderPath is a public or shared folder */ @Override public boolean isSharedFolder(String folderPath) { return !getFolderPath(folderPath).toLowerCase().startsWith(mailPath.toLowerCase()); } /** * Test if folderPath is main calendar. * * @param folderPath absolute folder path * @return true if folderPath is a public or shared folder */ @Override public boolean isMainCalendar(String folderPath) { return getFolderPath(folderPath).equalsIgnoreCase(getFolderPath("calendar")); } /** * Build base path for cmd commands (galfind, gallookup). * * @return cmd base path */ public String getCmdBasePath() { if (("Exchange2003".equals(serverVersion) || PUBLIC_ROOT.equals(publicFolderUrl)) && mailPath != null) { // public folder is not available => try to use mailbox path // Note: This does not work with freebusy, which requires /public/ return mailPath; } else { // use public folder url return publicFolderUrl; } } /** * LDAP to Exchange Criteria Map */ static final HashMap GALFIND_CRITERIA_MAP = new HashMap<>(); static { GALFIND_CRITERIA_MAP.put("imapUid", "AN"); GALFIND_CRITERIA_MAP.put("smtpemail1", "EM"); GALFIND_CRITERIA_MAP.put("cn", "DN"); GALFIND_CRITERIA_MAP.put("givenName", "FN"); GALFIND_CRITERIA_MAP.put("sn", "LN"); GALFIND_CRITERIA_MAP.put("title", "TL"); GALFIND_CRITERIA_MAP.put("o", "CP"); GALFIND_CRITERIA_MAP.put("l", "OF"); GALFIND_CRITERIA_MAP.put("department", "DP"); } static final HashSet GALLOOKUP_ATTRIBUTES = new HashSet<>(); static { GALLOOKUP_ATTRIBUTES.add("givenName"); GALLOOKUP_ATTRIBUTES.add("initials"); GALLOOKUP_ATTRIBUTES.add("sn"); GALLOOKUP_ATTRIBUTES.add("street"); GALLOOKUP_ATTRIBUTES.add("st"); GALLOOKUP_ATTRIBUTES.add("postalcode"); GALLOOKUP_ATTRIBUTES.add("co"); GALLOOKUP_ATTRIBUTES.add("departement"); GALLOOKUP_ATTRIBUTES.add("mobile"); } /** * Exchange to LDAP attribute map */ static final HashMap GALFIND_ATTRIBUTE_MAP = new HashMap<>(); static { GALFIND_ATTRIBUTE_MAP.put("uid", "AN"); GALFIND_ATTRIBUTE_MAP.put("smtpemail1", "EM"); GALFIND_ATTRIBUTE_MAP.put("cn", "DN"); GALFIND_ATTRIBUTE_MAP.put("displayName", "DN"); GALFIND_ATTRIBUTE_MAP.put("telephoneNumber", "PH"); GALFIND_ATTRIBUTE_MAP.put("l", "OFFICE"); GALFIND_ATTRIBUTE_MAP.put("o", "CP"); GALFIND_ATTRIBUTE_MAP.put("title", "TL"); GALFIND_ATTRIBUTE_MAP.put("givenName", "first"); GALFIND_ATTRIBUTE_MAP.put("initials", "initials"); GALFIND_ATTRIBUTE_MAP.put("sn", "last"); GALFIND_ATTRIBUTE_MAP.put("street", "street"); GALFIND_ATTRIBUTE_MAP.put("st", "state"); GALFIND_ATTRIBUTE_MAP.put("postalcode", "zip"); GALFIND_ATTRIBUTE_MAP.put("co", "country"); GALFIND_ATTRIBUTE_MAP.put("department", "department"); GALFIND_ATTRIBUTE_MAP.put("mobile", "mobile"); GALFIND_ATTRIBUTE_MAP.put("roomnumber", "office"); } boolean disableGalFind; protected Map> galFind(String query) throws IOException { Map> results; String path = getCmdBasePath() + "?Cmd=galfind" + query; HttpGet httpGet = new HttpGet(path); try (CloseableHttpResponse response = httpClientAdapter.execute(httpGet)) { results = XMLStreamUtil.getElementContentsAsMap(response.getEntity().getContent(), "item", "AN"); if (LOGGER.isDebugEnabled()) { LOGGER.debug(path + ": " + results.size() + " result(s)"); } } catch (IOException e) { LOGGER.debug("GET " + path + " failed: " + e + ' ' + e.getMessage()); disableGalFind = true; throw e; } return results; } @Override public Map galFind(Condition condition, Set returningAttributes, int sizeLimit) throws IOException { Map contacts = new HashMap<>(); //noinspection StatementWithEmptyBody if (disableGalFind) { // do nothing } else if (condition instanceof MultiCondition) { List conditions = ((ExchangeSession.MultiCondition) condition).getConditions(); Operator operator = ((ExchangeSession.MultiCondition) condition).getOperator(); if (operator == Operator.Or) { for (Condition innerCondition : conditions) { contacts.putAll(galFind(innerCondition, returningAttributes, sizeLimit)); } } else if (operator == Operator.And && !conditions.isEmpty()) { Map innerContacts = galFind(conditions.get(0), returningAttributes, sizeLimit); for (ExchangeSession.Contact contact : innerContacts.values()) { if (condition.isMatch(contact)) { contacts.put(contact.getName().toLowerCase(), contact); } } } } else if (condition instanceof AttributeCondition) { String searchAttributeName = ((ExchangeSession.AttributeCondition) condition).getAttributeName(); String searchAttribute = GALFIND_CRITERIA_MAP.get(searchAttributeName); if (searchAttribute != null) { String searchValue = ((ExchangeSession.AttributeCondition) condition).getValue(); StringBuilder query = new StringBuilder(); if ("EM".equals(searchAttribute)) { // mail search, split int atIndex = searchValue.indexOf('@'); // remove suffix if (atIndex >= 0) { searchValue = searchValue.substring(0, atIndex); } // split firstname.lastname int dotIndex = searchValue.indexOf('.'); if (dotIndex >= 0) { // assume mail starts with firstname query.append("&FN=").append(URIUtil.encodeWithinQuery(searchValue.substring(0, dotIndex))); query.append("&LN=").append(URIUtil.encodeWithinQuery(searchValue.substring(dotIndex + 1))); } else { query.append("&FN=").append(URIUtil.encodeWithinQuery(searchValue)); } } else { query.append('&').append(searchAttribute).append('=').append(URIUtil.encodeWithinQuery(searchValue)); } Map> results = galFind(query.toString()); for (Map result : results.values()) { Contact contact = new Contact(); contact.setName(result.get("AN")); contact.put("imapUid", result.get("AN")); buildGalfindContact(contact, result); if (needGalLookup(searchAttributeName, returningAttributes)) { galLookup(contact); // iCal fix to suit both iCal 3 and 4: move cn to sn, remove cn } else if (returningAttributes.contains("apple-serviceslocator")) { if (contact.get("cn") != null && returningAttributes.contains("sn")) { contact.put("sn", contact.get("cn")); contact.remove("cn"); } } if (condition.isMatch(contact)) { contacts.put(contact.getName().toLowerCase(), contact); } } } } return contacts; } protected boolean needGalLookup(String searchAttributeName, Set returningAttributes) { // return all attributes => call gallookup if (returningAttributes == null || returningAttributes.isEmpty()) { return true; // iCal search, do not call gallookup } else if (returningAttributes.contains("apple-serviceslocator")) { return false; // Lightning search, no need to gallookup } else if ("sn".equals(searchAttributeName)) { return returningAttributes.contains("sn"); // search attribute is gallookup attribute, need to fetch value for isMatch } else if (GALLOOKUP_ATTRIBUTES.contains(searchAttributeName)) { return true; } for (String attributeName : GALLOOKUP_ATTRIBUTES) { if (returningAttributes.contains(attributeName)) { return true; } } return false; } private boolean disableGalLookup; /** * Get extended address book information for person with gallookup. * Does not work with Exchange 2007 * * @param contact galfind contact */ public void galLookup(Contact contact) { if (!disableGalLookup) { LOGGER.debug("galLookup(" + contact.get("smtpemail1") + ')'); HttpGet httpGet = new HttpGet(URIUtil.encodePathQuery(getCmdBasePath() + "?Cmd=gallookup&ADDR=" + contact.get("smtpemail1"))); try (CloseableHttpResponse response = httpClientAdapter.execute(httpGet)) { Map> results = XMLStreamUtil.getElementContentsAsMap(response.getEntity().getContent(), "person", "alias"); // add detailed information if (!results.isEmpty()) { Map personGalLookupDetails = results.get(contact.get("uid").toLowerCase()); if (personGalLookupDetails != null) { buildGalfindContact(contact, personGalLookupDetails); } } } catch (IOException e) { LOGGER.warn("Unable to gallookup person: " + contact + ", disable GalLookup"); disableGalLookup = true; } } } protected void buildGalfindContact(Contact contact, Map response) { for (Map.Entry entry : GALFIND_ATTRIBUTE_MAP.entrySet()) { String attributeValue = response.get(entry.getValue()); if (attributeValue != null) { contact.put(entry.getKey(), attributeValue); } } } @Override protected String getFreeBusyData(String attendee, String start, String end, int interval) throws IOException { String freebusyUrl = publicFolderUrl + "/?cmd=freebusy" + "&start=" + start + "&end=" + end + "&interval=" + interval + "&u=SMTP:" + attendee; HttpGet httpGet = new HttpGet(freebusyUrl); httpGet.setHeader("Content-Type", "text/xml"); String fbdata; try (CloseableHttpResponse response = httpClientAdapter.execute(httpGet)) { fbdata = StringUtil.getLastToken(new BasicResponseHandler().handleResponse(response), "", ""); } return fbdata; } public DavExchangeSession(HttpClientAdapter httpClientAdapter, java.net.URI uri, String userName) throws IOException { this.httpClientAdapter = httpClientAdapter; this.userName = userName; buildSessionInfo(uri); } @Override public void buildSessionInfo(java.net.URI uri) throws DavMailException { buildMailPath(uri); // get base http mailbox http urls getWellKnownFolders(); } static final String BASE_HREF = "= 0) { email = mailBoxPath; alias = getAliasFromMailboxDisplayName(); if (alias == null) { alias = getAliasFromLogin(); } } else { // use mailbox name as alias alias = mailBoxPath; email = getEmail(alias); if (email == null) { // failover: try to get email from login name alias = getAliasFromLogin(); email = getEmail(alias); } // another failover : get alias from mailPath display name if (email == null) { alias = getAliasFromMailboxDisplayName(); email = getEmail(alias); } if (email == null) { LOGGER.debug("Unable to get user email with alias " + mailBoxPath + " or " + getAliasFromLogin() + " or " + alias ); // last failover: build email from domain name and mailbox display name StringBuilder buffer = new StringBuilder(); // most reliable alias if (mailBoxPath != null) { alias = mailBoxPath; } else { alias = getAliasFromLogin(); } if (alias == null) { alias = "unknown"; } buffer.append(alias); if (alias.indexOf('@') < 0) { buffer.append('@'); if (hostName == null) { hostName = "mail.unknown.com"; } int dotIndex = hostName.indexOf('.'); if (dotIndex >= 0) { buffer.append(hostName.substring(dotIndex + 1)); } } email = buffer.toString(); } } } /** * Get user alias from mailbox display name over Webdav. * * @return user alias */ public String getAliasFromMailboxDisplayName() { if (mailPath == null) { return null; } String displayName = null; try { Folder rootFolder = getFolder(""); if (rootFolder == null) { LOGGER.warn(new BundleMessage("EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER", mailPath)); } else { displayName = rootFolder.displayName; } } catch (IOException e) { LOGGER.warn(new BundleMessage("EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER", mailPath)); } return displayName; } /** * Get current Exchange alias name from mailbox name * * @return user name */ protected String getMailboxPath() { if (mailPath == null) { return null; } int index = mailPath.lastIndexOf('/', mailPath.length() - 2); if (index >= 0 && mailPath.endsWith("/")) { return mailPath.substring(index + 1, mailPath.length() - 1); } else { LOGGER.warn(new BundleMessage("EXCEPTION_INVALID_MAIL_PATH", mailPath)); return null; } } /** * Get user email from global address list (galfind). * * @param alias user alias * @return user email */ public String getEmail(String alias) { String emailResult = null; if (alias != null && !disableGalFind) { try { Map> results = galFind("&AN=" + URIUtil.encodeWithinQuery(alias)); Map result = results.get(alias.toLowerCase()); if (result != null) { emailResult = result.get("EM"); } } catch (IOException e) { // galfind not available disableGalFind = true; LOGGER.debug("getEmail(" + alias + ") failed"); } } return emailResult; } protected String getURIPropertyIfExists(DavPropertySet properties, String alias) throws IOException { DavProperty property = properties.get(Field.getPropertyName(alias)); if (property == null) { return null; } else { return URIUtil.decode((String) property.getValue()); } } // return last folder name from url protected String getFolderName(String url) { if (url != null) { if (url.endsWith("/")) { return url.substring(url.lastIndexOf('/', url.length() - 2) + 1, url.length() - 1); } else if (url.indexOf('/') > 0) { return url.substring(url.lastIndexOf('/') + 1); } else { return null; } } else { return null; } } protected void fixClientHost(java.net.URI currentUri) { // update client host, workaround for Exchange 2003 mailbox with an Exchange 2007 frontend if (currentUri != null && currentUri.getHost() != null && currentUri.getScheme() != null) { httpClientAdapter.setUri(currentUri); } } protected void checkPublicFolder() { // check public folder access try { publicFolderUrl = URIUtils.resolve(httpClientAdapter.getUri(), PUBLIC_ROOT).toString(); DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(Field.getPropertyName("displayname")); HttpPropfind httpPropfind = new HttpPropfind(publicFolderUrl, davPropertyNameSet, 0); httpClientAdapter.executeDavRequest(httpPropfind); // update public folder URI publicFolderUrl = httpPropfind.getURI().toString(); } catch (IOException e) { LOGGER.warn("Public folders not available: " + (e.getMessage() == null ? e : e.getMessage())); // default public folder path publicFolderUrl = PUBLIC_ROOT; } } protected void getWellKnownFolders() throws DavMailException { // Retrieve well known URLs try { HttpPropfind httpPropfind = new HttpPropfind(mailPath, WELL_KNOWN_FOLDERS, 0); MultiStatus multiStatus; try (CloseableHttpResponse response = httpClientAdapter.execute(httpPropfind)) { multiStatus = httpPropfind.getResponseBodyAsMultiStatus(response); } MultiStatusResponse[] responses = multiStatus.getResponses(); if (responses.length == 0) { throw new WebdavNotAvailableException("EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER", mailPath); } DavPropertySet properties = responses[0].getProperties(org.apache.http.HttpStatus.SC_OK); inboxUrl = getURIPropertyIfExists(properties, "inbox"); inboxName = getFolderName(inboxUrl); deleteditemsUrl = getURIPropertyIfExists(properties, "deleteditems"); deleteditemsName = getFolderName(deleteditemsUrl); sentitemsUrl = getURIPropertyIfExists(properties, "sentitems"); sentitemsName = getFolderName(sentitemsUrl); sendmsgUrl = getURIPropertyIfExists(properties, "sendmsg"); sendmsgName = getFolderName(sendmsgUrl); draftsUrl = getURIPropertyIfExists(properties, "drafts"); draftsName = getFolderName(draftsUrl); calendarUrl = getURIPropertyIfExists(properties, "calendar"); calendarName = getFolderName(calendarUrl); tasksUrl = getURIPropertyIfExists(properties, "tasks"); tasksName = getFolderName(tasksUrl); contactsUrl = getURIPropertyIfExists(properties, "contacts"); contactsName = getFolderName(contactsUrl); outboxUrl = getURIPropertyIfExists(properties, "outbox"); outboxName = getFolderName(outboxUrl); // junk folder not available over webdav LOGGER.debug("Inbox URL: " + inboxUrl + " Trash URL: " + deleteditemsUrl + " Sent URL: " + sentitemsUrl + " Send URL: " + sendmsgUrl + " Drafts URL: " + draftsUrl + " Calendar URL: " + calendarUrl + " Tasks URL: " + tasksUrl + " Contacts URL: " + contactsUrl + " Outbox URL: " + outboxUrl + " Public folder URL: " + publicFolderUrl ); } catch (IOException | DavException e) { LOGGER.error(e.getMessage()); throw new WebdavNotAvailableException("EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER", mailPath); } } protected static class MultiCondition extends ExchangeSession.MultiCondition { protected MultiCondition(Operator operator, Condition... condition) { super(operator, condition); } public void appendTo(StringBuilder buffer) { boolean first = true; for (Condition condition : conditions) { if (condition != null && !condition.isEmpty()) { if (first) { buffer.append('('); first = false; } else { buffer.append(' ').append(operator).append(' '); } condition.appendTo(buffer); } } // at least one non empty condition if (!first) { buffer.append(')'); } } } protected static class NotCondition extends ExchangeSession.NotCondition { protected NotCondition(Condition condition) { super(condition); } public void appendTo(StringBuilder buffer) { buffer.append("(Not "); condition.appendTo(buffer); buffer.append(')'); } } static final Map OPERATOR_MAP = new HashMap<>(); static { OPERATOR_MAP.put(Operator.IsEqualTo, " = "); OPERATOR_MAP.put(Operator.IsGreaterThanOrEqualTo, " >= "); OPERATOR_MAP.put(Operator.IsGreaterThan, " > "); OPERATOR_MAP.put(Operator.IsLessThanOrEqualTo, " <= "); OPERATOR_MAP.put(Operator.IsLessThan, " < "); OPERATOR_MAP.put(Operator.Like, " like "); OPERATOR_MAP.put(Operator.IsNull, " is null"); OPERATOR_MAP.put(Operator.IsFalse, " = false"); OPERATOR_MAP.put(Operator.IsTrue, " = true"); OPERATOR_MAP.put(Operator.StartsWith, " = "); OPERATOR_MAP.put(Operator.Contains, " = "); } protected static class AttributeCondition extends ExchangeSession.AttributeCondition { protected boolean isIntValue; protected AttributeCondition(String attributeName, Operator operator, String value) { super(attributeName, operator, value); } protected AttributeCondition(String attributeName, Operator operator, int value) { super(attributeName, operator, String.valueOf(value)); isIntValue = true; } public void appendTo(StringBuilder buffer) { Field field = Field.get(attributeName); buffer.append('"').append(field.getUri()).append('"'); buffer.append(OPERATOR_MAP.get(operator)); //noinspection VariableNotUsedInsideIf if (field.cast != null) { buffer.append("CAST (\""); } else if (!isIntValue && !field.isIntValue()) { buffer.append('\''); } if (Operator.Like == operator) { buffer.append('%'); } if ("urlcompname".equals(field.alias)) { buffer.append(StringUtil.encodeUrlcompname(StringUtil.davSearchEncode(value))); } else if (field.isIntValue()) { // check value try { Integer.parseInt(value); buffer.append(value); } catch (NumberFormatException e) { // invalid value, replace with 0 buffer.append('0'); } } else { buffer.append(StringUtil.davSearchEncode(value)); } if (Operator.Like == operator || Operator.StartsWith == operator) { buffer.append('%'); } if (field.cast != null) { buffer.append("\" as '").append(field.cast).append("')"); } else if (!isIntValue && !field.isIntValue()) { buffer.append('\''); } } public boolean isMatch(ExchangeSession.Contact contact) { String lowerCaseValue = value.toLowerCase(); String actualValue = contact.get(attributeName); Operator actualOperator = operator; // patch for iCal or Lightning search without galLookup if (actualValue == null && ("givenName".equals(attributeName) || "sn".equals(attributeName))) { actualValue = contact.get("cn"); actualOperator = Operator.Like; } if (actualValue == null) { return false; } actualValue = actualValue.toLowerCase(); return (actualOperator == Operator.IsEqualTo && actualValue.equals(lowerCaseValue)) || (actualOperator == Operator.Like && actualValue.contains(lowerCaseValue)) || (actualOperator == Operator.StartsWith && actualValue.startsWith(lowerCaseValue)); } } protected static class HeaderCondition extends AttributeCondition { protected HeaderCondition(String attributeName, Operator operator, String value) { super(attributeName, operator, value); } @Override public void appendTo(StringBuilder buffer) { buffer.append('"').append(Field.getHeader(attributeName).getUri()).append('"'); buffer.append(OPERATOR_MAP.get(operator)); buffer.append('\''); if (Operator.Like == operator) { buffer.append('%'); } buffer.append(value); if (Operator.Like == operator) { buffer.append('%'); } buffer.append('\''); } } protected static class MonoCondition extends ExchangeSession.MonoCondition { protected MonoCondition(String attributeName, Operator operator) { super(attributeName, operator); } public void appendTo(StringBuilder buffer) { buffer.append('"').append(Field.get(attributeName).getUri()).append('"'); buffer.append(OPERATOR_MAP.get(operator)); } } @Override public ExchangeSession.MultiCondition and(Condition... condition) { return new MultiCondition(Operator.And, condition); } @Override public ExchangeSession.MultiCondition or(Condition... condition) { return new MultiCondition(Operator.Or, condition); } @Override public Condition not(Condition condition) { if (condition == null) { return null; } else { return new NotCondition(condition); } } @Override public Condition isEqualTo(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsEqualTo, value); } @Override public Condition isEqualTo(String attributeName, int value) { return new AttributeCondition(attributeName, Operator.IsEqualTo, value); } @Override public Condition headerIsEqualTo(String headerName, String value) { return new HeaderCondition(headerName, Operator.IsEqualTo, value); } @Override public Condition gte(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsGreaterThanOrEqualTo, value); } @Override public Condition lte(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsLessThanOrEqualTo, value); } @Override public Condition lt(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsLessThan, value); } @Override public Condition gt(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsGreaterThan, value); } @Override public Condition contains(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.Like, value); } @Override public Condition startsWith(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.StartsWith, value); } @Override public Condition isNull(String attributeName) { return new MonoCondition(attributeName, Operator.IsNull); } @Override public Condition exists(String attributeName) { return not(new MonoCondition(attributeName, Operator.IsNull)); } @Override public Condition isTrue(String attributeName) { if ("Exchange2003".equals(this.serverVersion) && "deleted".equals(attributeName)) { return isEqualTo(attributeName, "1"); } else { return new MonoCondition(attributeName, Operator.IsTrue); } } @Override public Condition isFalse(String attributeName) { if ("Exchange2003".equals(this.serverVersion) && "deleted".equals(attributeName)) { return or(isEqualTo(attributeName, "0"), isNull(attributeName)); } else { return new MonoCondition(attributeName, Operator.IsFalse); } } /** * @inheritDoc */ public class Message extends ExchangeSession.Message { @Override public String getPermanentId() { return permanentUrl; } @Override protected InputStream getMimeHeaders() { InputStream result = null; try { String messageHeaders = getItemProperty(permanentUrl, "messageheaders"); if (messageHeaders != null) { final String MS_HEADER = "Microsoft Mail Internet Headers Version 2.0"; if (messageHeaders.startsWith(MS_HEADER)) { messageHeaders = messageHeaders.substring(MS_HEADER.length()); if (!messageHeaders.isEmpty() && messageHeaders.charAt(0) == '\r') { messageHeaders = messageHeaders.substring(1); } if (!messageHeaders.isEmpty() && messageHeaders.charAt(0) == '\n') { messageHeaders = messageHeaders.substring(1); } } // workaround for messages in Sent folder if (!messageHeaders.contains("From:")) { String from = getItemProperty(permanentUrl, "from"); messageHeaders = "From: " + from + '\n' + messageHeaders; } result = new ByteArrayInputStream(messageHeaders.getBytes(StandardCharsets.UTF_8)); } } catch (Exception e) { LOGGER.warn(e.getMessage()); } return result; } } /** * @inheritDoc */ public class Contact extends ExchangeSession.Contact { /** * Build Contact instance from multistatusResponse info * * @param multiStatusResponse response * @throws IOException on error * @throws DavMailException on error */ public Contact(MultiStatusResponse multiStatusResponse) throws IOException, DavMailException { setHref(URIUtil.decode(multiStatusResponse.getHref())); DavPropertySet properties = multiStatusResponse.getProperties(HttpStatus.SC_OK); permanentUrl = getURLPropertyIfExists(properties, "permanenturl"); etag = getPropertyIfExists(properties, "etag"); displayName = getPropertyIfExists(properties, "displayname"); for (String attributeName : CONTACT_ATTRIBUTES) { String value = getPropertyIfExists(properties, attributeName); if (value != null) { if ("bday".equals(attributeName) || "anniversary".equals(attributeName) || "lastmodified".equals(attributeName) || "datereceived".equals(attributeName)) { value = convertDateFromExchange(value); } else if ("haspicture".equals(attributeName) || "private".equals(attributeName)) { value = "1".equals(value) ? "true" : "false"; } put(attributeName, value); } } } public Contact(String folderPath, String itemName, Map properties, String etag, String noneMatch) { super(folderPath, itemName, properties, etag, noneMatch); } /** * Default constructor for galFind */ public Contact() { } protected Set buildProperties() { Set propertyValues = new HashSet<>(); for (Map.Entry entry : entrySet()) { String key = entry.getKey(); if (!"photo".equals(key)) { propertyValues.add(Field.createPropertyValue(key, entry.getValue())); if (key.startsWith("email")) { propertyValues.add(Field.createPropertyValue(key + "type", "SMTP")); } } } return propertyValues; } protected ExchangePropPatchRequest internalCreateOrUpdate(String encodedHref) throws IOException { ExchangePropPatchRequest propPatchRequest = new ExchangePropPatchRequest(encodedHref, buildProperties()); propPatchRequest.setHeader("Translate", "f"); if (etag != null) { propPatchRequest.setHeader("If-Match", etag); } if (noneMatch != null) { propPatchRequest.setHeader("If-None-Match", noneMatch); } try (CloseableHttpResponse response = httpClientAdapter.execute(propPatchRequest)) { LOGGER.debug("internalCreateOrUpdate returned " + response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase()); } return propPatchRequest; } /** * Create or update contact * * @return action result * @throws IOException on error */ @Override public ItemResult createOrUpdate() throws IOException { String encodedHref = URIUtil.encodePath(getHref()); ExchangePropPatchRequest propPatchRequest = internalCreateOrUpdate(encodedHref); int status = propPatchRequest.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_MULTI_STATUS) { try { status = propPatchRequest.getResponseStatusCode(); } catch (HttpResponseException e) { throw new IOException(e.getMessage(), e); } //noinspection VariableNotUsedInsideIf if (status == HttpStatus.SC_CREATED) { LOGGER.debug("Created contact " + encodedHref); } else { LOGGER.debug("Updated contact " + encodedHref); } } else if (status == HttpStatus.SC_NOT_FOUND) { LOGGER.debug("Contact not found at " + encodedHref + ", searching permanenturl by urlcompname"); // failover, search item by urlcompname MultiStatusResponse[] responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, DavExchangeSession.this.isEqualTo("urlcompname", convertItemNameToEML(itemName)), FolderQueryTraversal.Shallow, 1); if (responses.length == 1) { encodedHref = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "permanenturl"); LOGGER.warn("Contact found, permanenturl is " + encodedHref); propPatchRequest = internalCreateOrUpdate(encodedHref); status = propPatchRequest.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_MULTI_STATUS) { try { status = propPatchRequest.getResponseStatusCode(); } catch (HttpResponseException e) { throw new IOException(e.getMessage(), e); } LOGGER.debug("Updated contact " + encodedHref); } else { LOGGER.warn("Unable to create or update contact " + status + ' ' + propPatchRequest.getStatusLine()); } } } else { LOGGER.warn("Unable to create or update contact " + status + ' ' + propPatchRequest.getStatusLine().getReasonPhrase()); } ItemResult itemResult = new ItemResult(); // 440 means forbidden on Exchange if (status == 440) { status = HttpStatus.SC_FORBIDDEN; } itemResult.status = status; if (status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED) { String contactPictureUrl = URIUtil.encodePath(getHref() + "/ContactPicture.jpg"); String photo = get("photo"); if (photo != null) { try { final HttpPut httpPut = new HttpPut(contactPictureUrl); // need to update photo byte[] resizedImageBytes = IOUtil.resizeImage(IOUtil.decodeBase64(photo), 90); httpPut.setHeader("Overwrite", "t"); // TODO: required ? httpPut.setHeader("Content-Type", "image/jpeg"); httpPut.setEntity(new ByteArrayEntity(resizedImageBytes, ContentType.IMAGE_JPEG)); try (CloseableHttpResponse response = httpClientAdapter.execute(httpPut)) { status = response.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_OK && status != HttpStatus.SC_CREATED) { throw new IOException("Unable to update contact picture: " + status + ' ' + response.getStatusLine().getReasonPhrase()); } } } catch (IOException e) { LOGGER.error("Error in contact photo create or update", e); throw e; } Set picturePropertyValues = new HashSet<>(); picturePropertyValues.add(Field.createPropertyValue("attachmentContactPhoto", "true")); // picturePropertyValues.add(Field.createPropertyValue("renderingPosition", "-1")); picturePropertyValues.add(Field.createPropertyValue("attachExtension", ".jpg")); final ExchangePropPatchRequest attachmentPropPatchRequest = new ExchangePropPatchRequest(contactPictureUrl, picturePropertyValues); try (CloseableHttpResponse response = httpClientAdapter.execute(attachmentPropPatchRequest)) { attachmentPropPatchRequest.handleResponse(response); status = response.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_MULTI_STATUS) { LOGGER.error("Error in contact photo create or update: " + response.getStatusLine().getStatusCode()); throw new IOException("Unable to update contact picture"); } } } else { // try to delete picture HttpDelete httpDelete = new HttpDelete(contactPictureUrl); try (CloseableHttpResponse response = httpClientAdapter.execute(httpDelete)) { status = response.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_OK && status != HttpStatus.SC_NOT_FOUND) { LOGGER.error("Error in contact photo delete: " + status); throw new IOException("Unable to delete contact picture"); } } } // need to retrieve new etag HttpHead headMethod = new HttpHead(URIUtil.encodePath(getHref())); try (CloseableHttpResponse response = httpClientAdapter.execute(headMethod)) { if (response.getFirstHeader("ETag") != null) { itemResult.etag = response.getFirstHeader("ETag").getValue(); } } } return itemResult; } } /** * @inheritDoc */ public class Event extends ExchangeSession.Event { protected String instancetype; /** * Build Event instance from response info. * * @param multiStatusResponse response * @throws IOException on error */ public Event(MultiStatusResponse multiStatusResponse) throws IOException { setHref(URIUtil.decode(multiStatusResponse.getHref())); DavPropertySet properties = multiStatusResponse.getProperties(HttpStatus.SC_OK); permanentUrl = getURLPropertyIfExists(properties, "permanenturl"); etag = getPropertyIfExists(properties, "etag"); displayName = getPropertyIfExists(properties, "displayname"); subject = getPropertyIfExists(properties, "subject"); instancetype = getPropertyIfExists(properties, "instancetype"); contentClass = getPropertyIfExists(properties, "contentclass"); } protected String getPermanentUrl() { return permanentUrl; } public Event(String folderPath, String itemName, String contentClass, String itemBody, String etag, String noneMatch) throws IOException { super(folderPath, itemName, contentClass, itemBody, etag, noneMatch); } protected byte[] getICSFromInternetContentProperty() throws IOException, DavException, MessagingException { byte[] result = null; // PropFind PR_INTERNET_CONTENT String propertyValue = getItemProperty(permanentUrl, "internetContent"); if (propertyValue != null) { result = getICS(new ByteArrayInputStream(IOUtil.decodeBase64(propertyValue))); } return result; } /** * Load ICS content from Exchange server. * User Translate: f header to get MIME event content and get ICS attachment from it * * @return ICS (iCalendar) event * @throws IOException on error */ @Override public byte[] getEventContent() throws IOException { byte[] result = null; LOGGER.debug("Get event subject: " + subject + " contentclass: " + contentClass + " href: " + getHref() + " permanentUrl: " + permanentUrl); // do not try to load tasks MIME body if (!"urn:content-classes:task".equals(contentClass)) { // try to get PR_INTERNET_CONTENT try { result = getICSFromInternetContentProperty(); if (result == null) { HttpGet httpGet = new HttpGet(encodeAndFixUrl(permanentUrl)); httpGet.setHeader("Content-Type", "text/xml; charset=utf-8"); httpGet.setHeader("Translate", "f"); try (CloseableHttpResponse response = httpClientAdapter.execute(httpGet)) { result = getICS(response.getEntity().getContent()); } } } catch (DavException | IOException | MessagingException e) { LOGGER.warn(e.getMessage()); } } // failover: rebuild event from MAPI properties if (result == null) { try { result = getICSFromItemProperties(); } catch (IOException e) { deleteBroken(); throw e; } } // debug code /*if (new String(result).indexOf("VTODO") < 0) { LOGGER.debug("Original body: " + new String(result)); result = getICSFromItemProperties(); LOGGER.debug("Rebuilt body: " + new String(result)); }*/ return result; } private byte[] getICSFromItemProperties() throws HttpNotFoundException { byte[] result; // experimental: build VCALENDAR from properties try { //MultiStatusResponse[] responses = DavGatewayHttpClientFacade.executeMethod(httpClient, propFindMethod); Set eventProperties = new HashSet<>(); eventProperties.add("method"); eventProperties.add("created"); eventProperties.add("calendarlastmodified"); eventProperties.add("dtstamp"); eventProperties.add("calendaruid"); eventProperties.add("subject"); eventProperties.add("dtstart"); eventProperties.add("dtend"); eventProperties.add("transparent"); eventProperties.add("organizer"); eventProperties.add("to"); eventProperties.add("description"); eventProperties.add("rrule"); eventProperties.add("exdate"); eventProperties.add("sensitivity"); eventProperties.add("alldayevent"); eventProperties.add("busystatus"); eventProperties.add("reminderset"); eventProperties.add("reminderdelta"); // task eventProperties.add("importance"); eventProperties.add("uid"); eventProperties.add("taskstatus"); eventProperties.add("percentcomplete"); eventProperties.add("keywords"); eventProperties.add("startdate"); eventProperties.add("duedate"); eventProperties.add("datecompleted"); MultiStatusResponse[] responses = searchItems(folderPath, eventProperties, DavExchangeSession.this.isEqualTo("urlcompname", convertItemNameToEML(itemName)), FolderQueryTraversal.Shallow, 1); if (responses.length == 0) { throw new HttpNotFoundException(permanentUrl + " not found"); } DavPropertySet davPropertySet = responses[0].getProperties(HttpStatus.SC_OK); VCalendar localVCalendar = new VCalendar(); localVCalendar.setPropertyValue("PRODID", "-//davmail.sf.net/NONSGML DavMail Calendar V1.1//EN"); localVCalendar.setPropertyValue("VERSION", "2.0"); localVCalendar.setPropertyValue("METHOD", getPropertyIfExists(davPropertySet, "method")); VObject vEvent = new VObject(); vEvent.setPropertyValue("CREATED", convertDateFromExchange(getPropertyIfExists(davPropertySet, "created"))); vEvent.setPropertyValue("LAST-MODIFIED", convertDateFromExchange(getPropertyIfExists(davPropertySet, "calendarlastmodified"))); vEvent.setPropertyValue("DTSTAMP", convertDateFromExchange(getPropertyIfExists(davPropertySet, "dtstamp"))); String uid = getPropertyIfExists(davPropertySet, "calendaruid"); if (uid == null) { uid = getPropertyIfExists(davPropertySet, "uid"); } vEvent.setPropertyValue("UID", uid); vEvent.setPropertyValue("SUMMARY", getPropertyIfExists(davPropertySet, "subject")); vEvent.setPropertyValue("DESCRIPTION", getPropertyIfExists(davPropertySet, "description")); vEvent.setPropertyValue("PRIORITY", convertPriorityFromExchange(getPropertyIfExists(davPropertySet, "importance"))); vEvent.setPropertyValue("CATEGORIES", getPropertyIfExists(davPropertySet, "keywords")); String sensitivity = getPropertyIfExists(davPropertySet, "sensitivity"); if ("2".equals(sensitivity)) { vEvent.setPropertyValue("CLASS", "PRIVATE"); } else if ("3".equals(sensitivity)) { vEvent.setPropertyValue("CLASS", "CONFIDENTIAL"); } else if ("0".equals(sensitivity)) { vEvent.setPropertyValue("CLASS", "PUBLIC"); } if (instancetype == null) { vEvent.type = "VTODO"; double percentComplete = getDoublePropertyIfExists(davPropertySet, "percentcomplete"); if (percentComplete > 0) { vEvent.setPropertyValue("PERCENT-COMPLETE", String.valueOf((int) (percentComplete * 100))); } vEvent.setPropertyValue("STATUS", taskTovTodoStatusMap.get(getPropertyIfExists(davPropertySet, "taskstatus"))); vEvent.setPropertyValue("DUE;VALUE=DATE", convertDateFromExchangeToTaskDate(getPropertyIfExists(davPropertySet, "duedate"))); vEvent.setPropertyValue("DTSTART;VALUE=DATE", convertDateFromExchangeToTaskDate(getPropertyIfExists(davPropertySet, "startdate"))); vEvent.setPropertyValue("COMPLETED;VALUE=DATE", convertDateFromExchangeToTaskDate(getPropertyIfExists(davPropertySet, "datecompleted"))); } else { vEvent.type = "VEVENT"; // check mandatory dtstart value String dtstart = getPropertyIfExists(davPropertySet, "dtstart"); if (dtstart != null) { vEvent.setPropertyValue("DTSTART", convertDateFromExchange(dtstart)); } else { LOGGER.warn("missing dtstart on item, using fake value. Set davmail.deleteBroken=true to delete broken events"); vEvent.setPropertyValue("DTSTART", "20000101T000000Z"); deleteBroken(); } // same on DTEND String dtend = getPropertyIfExists(davPropertySet, "dtend"); if (dtend != null) { vEvent.setPropertyValue("DTEND", convertDateFromExchange(dtend)); } else { LOGGER.warn("missing dtend on item, using fake value. Set davmail.deleteBroken=true to delete broken events"); vEvent.setPropertyValue("DTEND", "20000101T010000Z"); deleteBroken(); } vEvent.setPropertyValue("TRANSP", getPropertyIfExists(davPropertySet, "transparent")); vEvent.setPropertyValue("RRULE", getPropertyIfExists(davPropertySet, "rrule")); String exdates = getPropertyIfExists(davPropertySet, "exdate"); if (exdates != null) { String[] exdatearray = exdates.split(","); for (String exdate : exdatearray) { vEvent.addPropertyValue("EXDATE", StringUtil.convertZuluDateTimeToAllDay(convertDateFromExchange(exdate))); } } String organizer = getPropertyIfExists(davPropertySet, "organizer"); String organizerEmail = null; if (organizer != null) { InternetAddress organizerAddress = new InternetAddress(organizer); organizerEmail = organizerAddress.getAddress(); vEvent.setPropertyValue("ORGANIZER", "MAILTO:" + organizerEmail); } // Parse attendee list String toHeader = getPropertyIfExists(davPropertySet, "to"); if (toHeader != null && !toHeader.equals(organizerEmail)) { InternetAddress[] attendees = InternetAddress.parseHeader(toHeader, false); for (InternetAddress attendee : attendees) { if (!attendee.getAddress().equalsIgnoreCase(organizerEmail)) { VProperty vProperty = new VProperty("ATTENDEE", attendee.getAddress()); if (attendee.getPersonal() != null) { vProperty.addParam("CN", attendee.getPersonal()); } vEvent.addProperty(vProperty); } } } vEvent.setPropertyValue("X-MICROSOFT-CDO-ALLDAYEVENT", "1".equals(getPropertyIfExists(davPropertySet, "alldayevent")) ? "TRUE" : "FALSE"); vEvent.setPropertyValue("X-MICROSOFT-CDO-BUSYSTATUS", getPropertyIfExists(davPropertySet, "busystatus")); if ("1".equals(getPropertyIfExists(davPropertySet, "reminderset"))) { VObject vAlarm = new VObject(); vAlarm.type = "VALARM"; vAlarm.setPropertyValue("ACTION", "DISPLAY"); vAlarm.setPropertyValue("DISPLAY", "Reminder"); String reminderdelta = getPropertyIfExists(davPropertySet, "reminderdelta"); VProperty vProperty = new VProperty("TRIGGER", "-PT" + reminderdelta + 'M'); vProperty.addParam("VALUE", "DURATION"); vAlarm.addProperty(vProperty); vEvent.addVObject(vAlarm); } } localVCalendar.addVObject(vEvent); result = localVCalendar.toString().getBytes(StandardCharsets.UTF_8); } catch (MessagingException | IOException e) { LOGGER.warn("Unable to rebuild event content: " + e.getMessage(), e); throw new HttpNotFoundException("Unable to get event " + getName() + " subject: " + subject + " at " + permanentUrl + ": " + e.getMessage()); } return result; } protected void deleteBroken() { // try to delete broken event if (Settings.getBooleanProperty("davmail.deleteBroken")) { LOGGER.warn("Deleting broken event at: " + permanentUrl); try { HttpDelete httpDelete = new HttpDelete(encodeAndFixUrl(permanentUrl)); try (CloseableHttpResponse response = httpClientAdapter.execute(httpDelete)) { LOGGER.warn("deleteBroken returned " + response.getStatusLine().getStatusCode()); } } catch (IOException e) { LOGGER.warn("Unable to delete broken event at: " + permanentUrl); } } } protected CloseableHttpResponse internalCreateOrUpdate(String encodedHref, byte[] mimeContent) throws IOException { HttpPut httpPut = new HttpPut(encodedHref); httpPut.setHeader("Translate", "f"); httpPut.setHeader("Overwrite", "f"); if (etag != null) { httpPut.setHeader("If-Match", etag); } if (noneMatch != null) { httpPut.setHeader("If-None-Match", noneMatch); } httpPut.setHeader("Content-Type", "message/rfc822"); httpPut.setEntity(new ByteArrayEntity(mimeContent, ContentType.getByMimeType("message/rfc822"))); try (CloseableHttpResponse response = httpClientAdapter.execute(httpPut)) { return response; } } /** * @inheritDoc */ @Override public ItemResult createOrUpdate() throws IOException { ItemResult itemResult = new ItemResult(); if (vCalendar.isTodo()) { if ((mailPath + calendarName).equals(folderPath)) { folderPath = mailPath + tasksName; } String encodedHref = URIUtil.encodePath(getHref()); Set propertyValues = new HashSet<>(); // set contentclass on create if (noneMatch != null) { propertyValues.add(Field.createPropertyValue("contentclass", "urn:content-classes:task")); propertyValues.add(Field.createPropertyValue("outlookmessageclass", "IPM.Task")); propertyValues.add(Field.createPropertyValue("calendaruid", vCalendar.getFirstVeventPropertyValue("UID"))); } propertyValues.add(Field.createPropertyValue("subject", vCalendar.getFirstVeventPropertyValue("SUMMARY"))); propertyValues.add(Field.createPropertyValue("description", vCalendar.getFirstVeventPropertyValue("DESCRIPTION"))); propertyValues.add(Field.createPropertyValue("importance", convertPriorityToExchange(vCalendar.getFirstVeventPropertyValue("PRIORITY")))); String percentComplete = vCalendar.getFirstVeventPropertyValue("PERCENT-COMPLETE"); if (percentComplete == null) { percentComplete = "0"; } propertyValues.add(Field.createPropertyValue("percentcomplete", String.valueOf(Double.parseDouble(percentComplete) / 100))); String taskStatus = vTodoToTaskStatusMap.get(vCalendar.getFirstVeventPropertyValue("STATUS")); propertyValues.add(Field.createPropertyValue("taskstatus", taskStatus)); propertyValues.add(Field.createPropertyValue("keywords", vCalendar.getFirstVeventPropertyValue("CATEGORIES"))); propertyValues.add(Field.createPropertyValue("startdate", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DTSTART")))); propertyValues.add(Field.createPropertyValue("duedate", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DUE")))); propertyValues.add(Field.createPropertyValue("datecompleted", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("COMPLETED")))); propertyValues.add(Field.createPropertyValue("iscomplete", "2".equals(taskStatus) ? "true" : "false")); propertyValues.add(Field.createPropertyValue("commonstart", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DTSTART")))); propertyValues.add(Field.createPropertyValue("commonend", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DUE")))); ExchangePropPatchRequest propPatchMethod = new ExchangePropPatchRequest(encodedHref, propertyValues); propPatchMethod.setHeader("Translate", "f"); if (etag != null) { propPatchMethod.setHeader("If-Match", etag); } if (noneMatch != null) { propPatchMethod.setHeader("If-None-Match", noneMatch); } try (CloseableHttpResponse response = httpClientAdapter.execute(propPatchMethod)) { int status = response.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_MULTI_STATUS) { Item newItem = getItem(folderPath, itemName); try { itemResult.status = propPatchMethod.getResponseStatusCode(); } catch (HttpResponseException e) { throw new IOException(e.getMessage(), e); } itemResult.etag = newItem.etag; } else { itemResult.status = status; } } } else { String encodedHref = URIUtil.encodePath(getHref()); byte[] mimeContent = createMimeContent(); HttpResponse httpResponse = internalCreateOrUpdate(encodedHref, mimeContent); int status = httpResponse.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_OK) { LOGGER.debug("Updated event " + encodedHref); } else if (status == HttpStatus.SC_CREATED) { LOGGER.debug("Created event " + encodedHref); } else if (status == HttpStatus.SC_NOT_FOUND) { LOGGER.debug("Event not found at " + encodedHref + ", searching permanenturl by urlcompname"); // failover, search item by urlcompname MultiStatusResponse[] responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, DavExchangeSession.this.isEqualTo("urlcompname", convertItemNameToEML(itemName)), FolderQueryTraversal.Shallow, 1); if (responses.length == 1) { encodedHref = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "permanenturl"); LOGGER.warn("Event found, permanenturl is " + encodedHref); httpResponse = internalCreateOrUpdate(encodedHref, mimeContent); status = httpResponse.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_OK) { LOGGER.debug("Updated event " + encodedHref); } else { LOGGER.warn("Unable to create or update event " + status + ' ' + httpResponse.getStatusLine().getReasonPhrase()); } } } else { LOGGER.warn("Unable to create or update event " + status + ' ' + httpResponse.getStatusLine().getReasonPhrase()); } // 440 means forbidden on Exchange if (status == 440) { status = HttpStatus.SC_FORBIDDEN; } else if (status == HttpStatus.SC_UNAUTHORIZED && getHref().startsWith("/public")) { LOGGER.warn("Ignore 401 unauthorized on public event"); status = HttpStatus.SC_OK; } itemResult.status = status; if (httpResponse.getFirstHeader("GetETag") != null) { itemResult.etag = httpResponse.getFirstHeader("GetETag").getValue(); } // trigger activeSync push event, only if davmail.forceActiveSyncUpdate setting is true if ((status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED) && (Settings.getBooleanProperty("davmail.forceActiveSyncUpdate"))) { ArrayList propertyList = new ArrayList<>(); // Set contentclass to make ActiveSync happy propertyList.add(Field.createDavProperty("contentclass", contentClass)); // ... but also set PR_INTERNET_CONTENT to preserve custom properties propertyList.add(Field.createDavProperty("internetContent", IOUtil.encodeBase64AsString(mimeContent))); HttpProppatch propPatchMethod = new HttpProppatch(encodedHref, propertyList); try (CloseableHttpResponse response = httpClientAdapter.execute(propPatchMethod)) { int patchStatus = response.getStatusLine().getStatusCode(); if (patchStatus != HttpStatus.SC_MULTI_STATUS) { LOGGER.warn("Unable to patch event to trigger activeSync push"); } else { // need to retrieve new etag Item newItem = getItem(folderPath, itemName); itemResult.etag = newItem.etag; } } } } return itemResult; } } protected Folder buildFolder(MultiStatusResponse entity) throws IOException { String href = URIUtil.decode(entity.getHref()); Folder folder = new Folder(); DavPropertySet properties = entity.getProperties(HttpStatus.SC_OK); folder.displayName = getPropertyIfExists(properties, "displayname"); folder.folderClass = getPropertyIfExists(properties, "folderclass"); folder.hasChildren = "1".equals(getPropertyIfExists(properties, "hassubs")); folder.noInferiors = "1".equals(getPropertyIfExists(properties, "nosubs")); folder.count = getIntPropertyIfExists(properties, "count"); folder.unreadCount = getIntPropertyIfExists(properties, "unreadcount"); // fake recent value folder.recent = folder.unreadCount; folder.ctag = getPropertyIfExists(properties, "contenttag"); folder.etag = getPropertyIfExists(properties, "lastmodified"); folder.uidNext = getIntPropertyIfExists(properties, "uidNext"); // replace well known folder names if (inboxUrl != null && href.startsWith(inboxUrl)) { folder.folderPath = href.replaceFirst(inboxUrl, INBOX); } else if (sentitemsUrl != null && href.startsWith(sentitemsUrl)) { folder.folderPath = href.replaceFirst(sentitemsUrl, SENT); } else if (draftsUrl != null && href.startsWith(draftsUrl)) { folder.folderPath = href.replaceFirst(draftsUrl, DRAFTS); } else if (deleteditemsUrl != null && href.startsWith(deleteditemsUrl)) { folder.folderPath = href.replaceFirst(deleteditemsUrl, TRASH); } else if (calendarUrl != null && href.startsWith(calendarUrl)) { folder.folderPath = href.replaceFirst(calendarUrl, CALENDAR); } else if (contactsUrl != null && href.startsWith(contactsUrl)) { folder.folderPath = href.replaceFirst(contactsUrl, CONTACTS); } else { int index = href.indexOf(mailPath.substring(0, mailPath.length() - 1)); if (index >= 0) { if (index + mailPath.length() > href.length()) { folder.folderPath = ""; } else { folder.folderPath = href.substring(index + mailPath.length()); } } else { try { java.net.URI folderURI = new java.net.URI(href); folder.folderPath = folderURI.getPath(); if (folder.folderPath == null) { throw new DavMailException("EXCEPTION_INVALID_FOLDER_URL", href); } } catch (URISyntaxException e) { throw new DavMailException("EXCEPTION_INVALID_FOLDER_URL", href); } } } if (folder.folderPath.endsWith("/")) { folder.folderPath = folder.folderPath.substring(0, folder.folderPath.length() - 1); } return folder; } protected static final Set FOLDER_PROPERTIES = new HashSet<>(); static { FOLDER_PROPERTIES.add("displayname"); FOLDER_PROPERTIES.add("folderclass"); FOLDER_PROPERTIES.add("hassubs"); FOLDER_PROPERTIES.add("nosubs"); FOLDER_PROPERTIES.add("count"); FOLDER_PROPERTIES.add("unreadcount"); FOLDER_PROPERTIES.add("contenttag"); FOLDER_PROPERTIES.add("lastmodified"); FOLDER_PROPERTIES.add("uidNext"); } protected static final DavPropertyNameSet FOLDER_PROPERTIES_NAME_SET = new DavPropertyNameSet(); static { for (String attribute : FOLDER_PROPERTIES) { FOLDER_PROPERTIES_NAME_SET.add(Field.getPropertyName(attribute)); } } /** * @inheritDoc */ @Override protected Folder internalGetFolder(String folderPath) throws IOException { MultiStatus multiStatus = httpClientAdapter.executeDavRequest(new HttpPropfind( URIUtil.encodePath(getFolderPath(folderPath)), FOLDER_PROPERTIES_NAME_SET, 0)); MultiStatusResponse[] responses = multiStatus.getResponses(); Folder folder = null; if (responses.length > 0) { folder = buildFolder(responses[0]); folder.folderPath = folderPath; } return folder; } /** * @inheritDoc */ @Override public List getSubFolders(String folderPath, Condition condition, boolean recursive) throws IOException { boolean isPublic = folderPath.startsWith("/public"); FolderQueryTraversal mode = (!isPublic && recursive) ? FolderQueryTraversal.Deep : FolderQueryTraversal.Shallow; List folders = new ArrayList<>(); MultiStatusResponse[] responses = searchItems(folderPath, FOLDER_PROPERTIES, and(isTrue("isfolder"), isFalse("ishidden"), condition), mode, 0); for (MultiStatusResponse response : responses) { Folder folder = buildFolder(response); folders.add(buildFolder(response)); if (isPublic && recursive) { getSubFolders(folder.folderPath, condition, recursive); } } return folders; } /** * @inheritDoc */ @Override public int createFolder(String folderPath, String folderClass, Map properties) throws IOException { Set propertyValues = new HashSet<>(); if (properties != null) { for (Map.Entry entry : properties.entrySet()) { propertyValues.add(Field.createPropertyValue(entry.getKey(), entry.getValue())); } } propertyValues.add(Field.createPropertyValue("folderclass", folderClass)); // standard MkColMethod does not take properties, override ExchangePropPatchRequest instead ExchangePropPatchRequest propPatchRequest = new ExchangePropPatchRequest(URIUtil.encodePath(getFolderPath(folderPath)), propertyValues) { @Override public String getMethod() { return "MKCOL"; } }; int status; try (CloseableHttpResponse response = httpClientAdapter.execute(propPatchRequest)) { propPatchRequest.handleResponse(response); status = response.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_MULTI_STATUS) { status = propPatchRequest.getResponseStatusCode(); } else if (status == HttpStatus.SC_METHOD_NOT_ALLOWED) { LOGGER.info("Folder " + folderPath + " already exists"); } } catch (HttpResponseException e) { throw new IOException(e.getMessage(), e); } LOGGER.debug("Create folder " + folderPath + " returned " + status); return status; } /** * @inheritDoc */ @Override public int updateFolder(String folderPath, Map properties) throws IOException { Set propertyValues = new HashSet<>(); if (properties != null) { for (Map.Entry entry : properties.entrySet()) { propertyValues.add(Field.createPropertyValue(entry.getKey(), entry.getValue())); } } ExchangePropPatchRequest propPatchRequest = new ExchangePropPatchRequest(URIUtil.encodePath(getFolderPath(folderPath)), propertyValues); try (CloseableHttpResponse response = httpClientAdapter.execute(propPatchRequest)) { propPatchRequest.handleResponse(response); int status = response.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_MULTI_STATUS) { try { status = propPatchRequest.getResponseStatusCode(); } catch (HttpResponseException e) { throw new IOException(e.getMessage(), e); } } return status; } } /** * @inheritDoc */ @Override public void deleteFolder(String folderPath) throws IOException { HttpDelete httpDelete = new HttpDelete(URIUtil.encodePath(getFolderPath(folderPath))); try (CloseableHttpResponse response = httpClientAdapter.execute(httpDelete)) { int status = response.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_OK && status != HttpStatus.SC_NOT_FOUND) { throw HttpClientAdapter.buildHttpResponseException(httpDelete, response); } } } /** * @inheritDoc */ @Override public void moveFolder(String folderPath, String targetPath) throws IOException { HttpMove httpMove = new HttpMove(URIUtil.encodePath(getFolderPath(folderPath)), URIUtil.encodePath(getFolderPath(targetPath)), false); try (CloseableHttpResponse response = httpClientAdapter.execute(httpMove)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_PRECONDITION_FAILED) { throw new HttpPreconditionFailedException(BundleMessage.format("EXCEPTION_UNABLE_TO_MOVE_FOLDER")); } else if (statusCode != HttpStatus.SC_CREATED) { throw HttpClientAdapter.buildHttpResponseException(httpMove, response); } else if (folderPath.equalsIgnoreCase("/users/" + getEmail() + "/calendar")) { // calendar renamed, need to reload well known folders getWellKnownFolders(); } } } /** * @inheritDoc */ @Override public void moveItem(String sourcePath, String targetPath) throws IOException { HttpMove httpMove = new HttpMove(URIUtil.encodePath(getFolderPath(sourcePath)), URIUtil.encodePath(getFolderPath(targetPath)), false); moveItem(httpMove); } protected void moveItem(HttpMove httpMove) throws IOException { try (CloseableHttpResponse response = httpClientAdapter.execute(httpMove)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_PRECONDITION_FAILED) { throw new DavMailException("EXCEPTION_UNABLE_TO_MOVE_ITEM"); } else if (statusCode != HttpStatus.SC_CREATED && statusCode != HttpStatus.SC_OK) { throw HttpClientAdapter.buildHttpResponseException(httpMove, response); } } } protected String getPropertyIfExists(DavPropertySet properties, String alias) { DavProperty property = properties.get(Field.getResponsePropertyName(alias)); if (property == null) { return null; } else { Object value = property.getValue(); if (value instanceof Node) { return ((Node) value).getTextContent(); } else if (value instanceof List) { StringBuilder buffer = new StringBuilder(); for (Object node : (List) value) { if (buffer.length() > 0) { buffer.append(','); } if (node instanceof Node) { // jackrabbit buffer.append(((Node) node).getTextContent()); } else { // ExchangeDavMethod buffer.append(node); } } return buffer.toString(); } else { return (String) value; } } } protected String getURLPropertyIfExists(DavPropertySet properties, @SuppressWarnings("SameParameterValue") String alias) throws IOException { String result = getPropertyIfExists(properties, alias); if (result != null) { result = URIUtil.decode(result); } return result; } protected int getIntPropertyIfExists(DavPropertySet properties, String alias) { DavProperty property = properties.get(Field.getPropertyName(alias)); if (property == null) { return 0; } else { return Integer.parseInt((String) property.getValue()); } } protected long getLongPropertyIfExists(DavPropertySet properties, @SuppressWarnings("SameParameterValue") String alias) { DavProperty property = properties.get(Field.getPropertyName(alias)); if (property == null) { return 0; } else { return Long.parseLong((String) property.getValue()); } } protected double getDoublePropertyIfExists(DavPropertySet properties, @SuppressWarnings("SameParameterValue") String alias) { DavProperty property = properties.get(Field.getResponsePropertyName(alias)); if (property == null) { return 0; } else { return Double.parseDouble((String) property.getValue()); } } protected byte[] getBinaryPropertyIfExists(DavPropertySet properties, @SuppressWarnings("SameParameterValue") String alias) { byte[] property = null; String base64Property = getPropertyIfExists(properties, alias); if (base64Property != null) { property = IOUtil.decodeBase64(base64Property); } return property; } protected Message buildMessage(MultiStatusResponse responseEntity) throws IOException { Message message = new Message(); message.messageUrl = URIUtil.decode(responseEntity.getHref()); DavPropertySet properties = responseEntity.getProperties(HttpStatus.SC_OK); message.permanentUrl = getURLPropertyIfExists(properties, "permanenturl"); message.size = getIntPropertyIfExists(properties, "messageSize"); message.uid = getPropertyIfExists(properties, "uid"); message.contentClass = getPropertyIfExists(properties, "contentclass"); message.imapUid = getLongPropertyIfExists(properties, "imapUid"); message.read = "1".equals(getPropertyIfExists(properties, "read")); message.junk = "1".equals(getPropertyIfExists(properties, "junk")); message.flagged = "2".equals(getPropertyIfExists(properties, "flagStatus")); message.draft = (getIntPropertyIfExists(properties, "messageFlags") & 8) != 0; String lastVerbExecuted = getPropertyIfExists(properties, "lastVerbExecuted"); message.answered = "102".equals(lastVerbExecuted) || "103".equals(lastVerbExecuted); message.forwarded = "104".equals(lastVerbExecuted); message.date = convertDateFromExchange(getPropertyIfExists(properties, "date")); message.deleted = "1".equals(getPropertyIfExists(properties, "deleted")); String lastmodified = convertDateFromExchange(getPropertyIfExists(properties, "lastmodified")); message.recent = !message.read && lastmodified != null && lastmodified.equals(message.date); message.keywords = getPropertyIfExists(properties, "keywords"); if (LOGGER.isDebugEnabled()) { StringBuilder buffer = new StringBuilder(); buffer.append("Message"); if (message.imapUid != 0) { buffer.append(" IMAP uid: ").append(message.imapUid); } if (message.uid != null) { buffer.append(" uid: ").append(message.uid); } buffer.append(" href: ").append(responseEntity.getHref()).append(" permanenturl:").append(message.permanentUrl); LOGGER.debug(buffer.toString()); } return message; } @Override public MessageList searchMessages(String folderPath, Set attributes, Condition condition) throws IOException { MessageList messages = new MessageList(); int maxCount = Settings.getIntProperty("davmail.folderSizeLimit", 0); MultiStatusResponse[] responses = searchItems(folderPath, attributes, and(isFalse("isfolder"), isFalse("ishidden"), condition), FolderQueryTraversal.Shallow, maxCount); for (MultiStatusResponse response : responses) { Message message = buildMessage(response); message.messageList = messages; messages.add(message); } Collections.sort(messages); return messages; } /** * @inheritDoc */ @Override public List searchContacts(String folderPath, Set attributes, Condition condition, int maxCount) throws IOException { List contacts = new ArrayList<>(); MultiStatusResponse[] responses = searchItems(folderPath, attributes, and(isEqualTo("outlookmessageclass", "IPM.Contact"), isFalse("isfolder"), isFalse("ishidden"), condition), FolderQueryTraversal.Shallow, maxCount); for (MultiStatusResponse response : responses) { contacts.add(new Contact(response)); } return contacts; } /** * Common item properties */ protected static final Set ITEM_PROPERTIES = new HashSet<>(); static { ITEM_PROPERTIES.add("etag"); ITEM_PROPERTIES.add("displayname"); // calendar CdoInstanceType ITEM_PROPERTIES.add("instancetype"); ITEM_PROPERTIES.add("urlcompname"); ITEM_PROPERTIES.add("subject"); ITEM_PROPERTIES.add("contentclass"); } @Override protected Set getItemProperties() { return ITEM_PROPERTIES; } /** * @inheritDoc */ @Override public List getEventMessages(String folderPath) throws IOException { return searchEvents(folderPath, ITEM_PROPERTIES, and(isEqualTo("contentclass", "urn:content-classes:calendarmessage"), or(isNull("processed"), isFalse("processed")))); } @Override public List searchEvents(String folderPath, Set attributes, Condition condition) throws IOException { List events = new ArrayList<>(); MultiStatusResponse[] responses = searchItems(folderPath, attributes, and(isFalse("isfolder"), isFalse("ishidden"), condition), FolderQueryTraversal.Shallow, 0); for (MultiStatusResponse response : responses) { String instancetype = getPropertyIfExists(response.getProperties(HttpStatus.SC_OK), "instancetype"); Event event = new Event(response); //noinspection VariableNotUsedInsideIf if (instancetype == null) { // check ics content try { event.getBody(); // getBody success => add event or task events.add(event); } catch (IOException e) { // invalid event: exclude from list LOGGER.warn("Invalid event " + event.displayName + " found at " + response.getHref(), e); } } else { events.add(event); } } return events; } @Override protected Condition getCalendarItemCondition(Condition dateCondition) { boolean caldavEnableLegacyTasks = Settings.getBooleanProperty("davmail.caldavEnableLegacyTasks", false); if (caldavEnableLegacyTasks) { // return tasks created in calendar folder return or(isNull("instancetype"), isEqualTo("instancetype", 1), and(isEqualTo("instancetype", 0), dateCondition)); } else { // instancetype 0 single appointment / 1 master recurring appointment return and(or(isEqualTo("outlookmessageclass", "IPM.Appointment"), isEqualTo("outlookmessageclass", "IPM.Appointment.MeetingEvent")), or(isEqualTo("instancetype", 1), and(isEqualTo("instancetype", 0), dateCondition))); } } protected MultiStatusResponse[] searchItems(String folderPath, Set attributes, Condition condition, FolderQueryTraversal folderQueryTraversal, int maxCount) throws IOException { String folderUrl; if (folderPath.startsWith("http")) { folderUrl = folderPath; } else { folderUrl = getFolderPath(folderPath); } StringBuilder searchRequest = new StringBuilder(); searchRequest.append("SELECT ") .append(Field.getRequestPropertyString("permanenturl")); if (attributes != null) { for (String attribute : attributes) { searchRequest.append(',').append(Field.getRequestPropertyString(attribute)); } } searchRequest.append(" FROM SCOPE('").append(folderQueryTraversal).append(" TRAVERSAL OF \"").append(folderUrl).append("\"')"); if (condition != null) { searchRequest.append(" WHERE "); condition.appendTo(searchRequest); } searchRequest.append(" ORDER BY ").append(Field.getRequestPropertyString("imapUid")).append(" DESC"); DavGatewayTray.debug(new BundleMessage("LOG_SEARCH_QUERY", searchRequest)); MultiStatusResponse[] responses = httpClientAdapter.executeSearchRequest( encodeAndFixUrl(folderUrl), searchRequest.toString(), maxCount); DavGatewayTray.debug(new BundleMessage("LOG_SEARCH_RESULT", responses.length)); return responses; } protected static final Set EVENT_REQUEST_PROPERTIES = new HashSet<>(); static { EVENT_REQUEST_PROPERTIES.add("permanenturl"); EVENT_REQUEST_PROPERTIES.add("urlcompname"); EVENT_REQUEST_PROPERTIES.add("etag"); EVENT_REQUEST_PROPERTIES.add("contentclass"); EVENT_REQUEST_PROPERTIES.add("displayname"); EVENT_REQUEST_PROPERTIES.add("subject"); } protected static final DavPropertyNameSet EVENT_REQUEST_PROPERTIES_NAME_SET = new DavPropertyNameSet(); static { for (String attribute : EVENT_REQUEST_PROPERTIES) { EVENT_REQUEST_PROPERTIES_NAME_SET.add(Field.getPropertyName(attribute)); } } @Override public Item getItem(String folderPath, String itemName) throws IOException { String emlItemName = convertItemNameToEML(itemName); String itemPath = getFolderPath(folderPath) + '/' + emlItemName; MultiStatusResponse[] responses = null; try { HttpPropfind httpPropfind = new HttpPropfind(URIUtil.encodePath(itemPath), EVENT_REQUEST_PROPERTIES_NAME_SET, 0); try (CloseableHttpResponse response = httpClientAdapter.execute(httpPropfind)) { responses = httpPropfind.getResponseBodyAsMultiStatus(response).getResponses(); } catch (HttpNotFoundException | DavException e) { // ignore } if (responses == null || responses.length == 0 && isMainCalendar(folderPath)) { if (itemName.endsWith(".ics")) { itemName = itemName.substring(0, itemName.length() - 3) + "EML"; } // look for item in tasks folder HttpPropfind taskHttpPropfind = new HttpPropfind(URIUtil.encodePath(getFolderPath(TASKS) + '/' + emlItemName), EVENT_REQUEST_PROPERTIES_NAME_SET, 0); try (CloseableHttpResponse response = httpClientAdapter.execute(taskHttpPropfind)) { responses = taskHttpPropfind.getResponseBodyAsMultiStatus(response).getResponses(); } catch (HttpNotFoundException | DavException e) { // ignore } } if (responses == null || responses.length == 0) { throw new HttpNotFoundException(itemPath + " not found"); } } catch (HttpNotFoundException e) { try { LOGGER.debug(itemPath + " not found, searching by urlcompname"); // failover: try to get event by displayname responses = searchItems(folderPath, EVENT_REQUEST_PROPERTIES, isEqualTo("urlcompname", emlItemName), FolderQueryTraversal.Shallow, 1); if (responses.length == 0 && isMainCalendar(folderPath)) { responses = searchItems(TASKS, EVENT_REQUEST_PROPERTIES, isEqualTo("urlcompname", emlItemName), FolderQueryTraversal.Shallow, 1); } if (responses.length == 0) { throw new HttpNotFoundException(itemPath + " not found"); } } catch (HttpNotFoundException e2) { LOGGER.debug("last failover: search all items"); List events = getAllEvents(folderPath); for (ExchangeSession.Event event : events) { if (itemName.equals(event.getName())) { HttpPropfind permanentHttpPropfind = new HttpPropfind(encodeAndFixUrl(((DavExchangeSession.Event) event).getPermanentUrl()), EVENT_REQUEST_PROPERTIES_NAME_SET, 0); try (CloseableHttpResponse response = httpClientAdapter.execute(permanentHttpPropfind)) { responses = permanentHttpPropfind.getResponseBodyAsMultiStatus(response).getResponses(); } catch (DavException e3) { // ignore } break; } } if (responses == null || responses.length == 0) { throw new HttpNotFoundException(itemPath + " not found"); } LOGGER.warn("search by urlcompname failed, actual value is " + getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "urlcompname")); } } // build item String contentClass = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "contentclass"); String urlcompname = getPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "urlcompname"); if ("urn:content-classes:person".equals(contentClass)) { // retrieve Contact properties List contacts = searchContacts(folderPath, CONTACT_ATTRIBUTES, isEqualTo("urlcompname", StringUtil.decodeUrlcompname(urlcompname)), 1); if (contacts.isEmpty()) { LOGGER.warn("Item found, but unable to build contact"); throw new HttpNotFoundException(itemPath + " not found"); } return contacts.get(0); } else if ("urn:content-classes:appointment".equals(contentClass) || "urn:content-classes:calendarmessage".equals(contentClass) || "urn:content-classes:task".equals(contentClass)) { return new Event(responses[0]); } else { LOGGER.warn("wrong contentclass on item " + itemPath + ": " + contentClass); // return item anyway return new Event(responses[0]); } } @Override public ExchangeSession.ContactPhoto getContactPhoto(ExchangeSession.Contact contact) throws IOException { ContactPhoto contactPhoto; final HttpGet httpGet = new HttpGet(URIUtil.encodePath(contact.getHref()) + "/ContactPicture.jpg"); httpGet.setHeader("Translate", "f"); httpGet.setHeader("Accept-Encoding", "gzip"); InputStream inputStream = null; try (CloseableHttpResponse response = httpClientAdapter.execute(httpGet)) { if (HttpClientAdapter.isGzipEncoded(response)) { inputStream = (new GZIPInputStream(response.getEntity().getContent())); } else { inputStream = response.getEntity().getContent(); } contactPhoto = new ContactPhoto(); contactPhoto.contentType = "image/jpeg"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream partInputStream = inputStream; IOUtil.write(partInputStream, baos); contactPhoto.content = IOUtil.encodeBase64AsString(baos.toByteArray()); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { LOGGER.debug(e); } } } return contactPhoto; } @Override public int sendEvent(String icsBody) throws IOException { String itemName = UUID.randomUUID().toString() + ".EML"; byte[] mimeContent = (new Event(getFolderPath(DRAFTS), itemName, "urn:content-classes:calendarmessage", icsBody, null, null)).createMimeContent(); if (mimeContent == null) { // no recipients, cancel return HttpStatus.SC_NO_CONTENT; } else { sendMessage(mimeContent); return HttpStatus.SC_OK; } } @Override public void deleteItem(String folderPath, String itemName) throws IOException { String eventPath = URIUtil.encodePath(getFolderPath(folderPath) + '/' + convertItemNameToEML(itemName)); HttpDelete httpDelete = new HttpDelete(eventPath); int status; try (CloseableHttpResponse response = httpClientAdapter.execute(httpDelete)) { status = response.getStatusLine().getStatusCode(); } if (status == HttpStatus.SC_NOT_FOUND && isMainCalendar(folderPath)) { // retry in tasks folder eventPath = URIUtil.encodePath(getFolderPath(TASKS) + '/' + convertItemNameToEML(itemName)); httpDelete = new HttpDelete(eventPath); try (CloseableHttpResponse response = httpClientAdapter.execute(httpDelete)) { status = response.getStatusLine().getStatusCode(); } } if (status == HttpStatus.SC_NOT_FOUND) { LOGGER.debug("Unable to delete " + itemName + ": item not found"); } } @Override public void processItem(String folderPath, String itemName) throws IOException { String eventPath = URIUtil.encodePath(getFolderPath(folderPath) + '/' + convertItemNameToEML(itemName)); // do not delete calendar messages, mark read and processed ArrayList list = new ArrayList<>(); list.add(Field.createDavProperty("processed", "true")); list.add(Field.createDavProperty("read", "1")); HttpProppatch patchMethod = new HttpProppatch(eventPath, list); try (CloseableHttpResponse response = httpClientAdapter.execute(patchMethod)) { LOGGER.debug("Processed " + itemName + " " + response.getStatusLine().getStatusCode()); } } @Override public ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException { return new Event(getFolderPath(folderPath), itemName, contentClass, icsBody, etag, noneMatch).createOrUpdate(); } /** * create a fake event to get VTIMEZONE body */ @Override protected void loadVtimezone() { try { // create temporary folder String folderPath = getFolderPath("davmailtemp"); createCalendarFolder(folderPath, null); String fakeEventUrl = null; if ("Exchange2003".equals(serverVersion)) { HttpPost httpPost = new HttpPost(URIUtil.encodePath(folderPath)); ArrayList parameters = new ArrayList<>(); parameters.add(new BasicNameValuePair("Cmd", "saveappt")); parameters.add(new BasicNameValuePair("FORMTYPE", "appointment")); httpPost.setEntity(new UrlEncodedFormEntity(parameters, Consts.UTF_8)); try (CloseableHttpResponse response = httpClientAdapter.execute(httpPost)) { // create fake event int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { fakeEventUrl = StringUtil.getToken(new BasicResponseHandler().handleResponse(response), "", ""); if (fakeEventUrl != null) { fakeEventUrl = URIUtil.decode(fakeEventUrl); } } } } // failover for Exchange 2007, use PROPPATCH with forced timezone if (fakeEventUrl == null) { ArrayList propertyList = new ArrayList<>(); propertyList.add(Field.createDavProperty("contentclass", "urn:content-classes:appointment")); propertyList.add(Field.createDavProperty("outlookmessageclass", "IPM.Appointment")); propertyList.add(Field.createDavProperty("instancetype", "0")); // get forced timezone id from settings String timezoneId = Settings.getProperty("davmail.timezoneId"); if (timezoneId == null) { // get timezoneid from OWA settings timezoneId = getTimezoneIdFromExchange(); } // without a timezoneId, use Exchange timezone if (timezoneId != null) { propertyList.add(Field.createDavProperty("timezoneid", timezoneId)); } String patchMethodUrl = folderPath + '/' + UUID.randomUUID().toString() + ".EML"; HttpProppatch patchMethod = new HttpProppatch(URIUtil.encodePath(patchMethodUrl), propertyList); try (CloseableHttpResponse response = httpClientAdapter.execute(patchMethod)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_MULTI_STATUS) { fakeEventUrl = patchMethodUrl; } } } if (fakeEventUrl != null) { // get fake event body HttpGet httpGet = new HttpGet(URIUtil.encodePath(fakeEventUrl)); httpGet.setHeader("Translate", "f"); try (CloseableHttpResponse response = httpClientAdapter.execute(httpGet)) { this.vTimezone = new VObject("BEGIN:VTIMEZONE" + StringUtil.getToken(new BasicResponseHandler().handleResponse(response), "BEGIN:VTIMEZONE", "END:VTIMEZONE") + "END:VTIMEZONE\r\n"); } } // delete temporary folder deleteFolder("davmailtemp"); } catch (IOException e) { LOGGER.warn("Unable to get VTIMEZONE info: " + e, e); } } protected String getTimezoneIdFromExchange() { String timezoneId = null; String timezoneName = null; try { Set attributes = new HashSet<>(); attributes.add("roamingdictionary"); MultiStatusResponse[] responses = searchItems("/users/" + getEmail() + "/NON_IPM_SUBTREE", attributes, isEqualTo("messageclass", "IPM.Configuration.OWA.UserOptions"), DavExchangeSession.FolderQueryTraversal.Deep, 1); if (responses.length == 1) { byte[] roamingdictionary = getBinaryPropertyIfExists(responses[0].getProperties(HttpStatus.SC_OK), "roamingdictionary"); if (roamingdictionary != null) { timezoneName = getTimezoneNameFromRoamingDictionary(roamingdictionary); if (timezoneName != null) { timezoneId = ResourceBundle.getBundle("timezoneids").getString(timezoneName); } } } } catch (MissingResourceException e) { LOGGER.warn("Unable to retrieve Exchange timezone id for name " + timezoneName); } catch (IOException e) { LOGGER.warn("Unable to retrieve Exchange timezone id: " + e.getMessage(), e); } return timezoneId; } protected String getTimezoneNameFromRoamingDictionary(byte[] roamingdictionary) { String timezoneName = null; XMLStreamReader reader; try { reader = XMLStreamUtil.createXMLStreamReader(roamingdictionary); while (reader.hasNext()) { reader.next(); if (XMLStreamUtil.isStartTag(reader, "e") && "18-timezone".equals(reader.getAttributeValue(null, "k"))) { String value = reader.getAttributeValue(null, "v"); if (value != null && value.startsWith("18-")) { timezoneName = value.substring(3); } } } } catch (XMLStreamException e) { LOGGER.error("Error while parsing RoamingDictionary: " + e, e); } return timezoneName; } @Override protected Contact buildContact(String folderPath, String itemName, Map properties, String etag, String noneMatch) { return new Contact(getFolderPath(folderPath), itemName, properties, etag, noneMatch); } protected List buildProperties(Map properties) { ArrayList list = new ArrayList<>(); if (properties != null) { for (Map.Entry entry : properties.entrySet()) { if ("read".equals(entry.getKey())) { list.add(Field.createDavProperty("read", entry.getValue())); } else if ("junk".equals(entry.getKey())) { list.add(Field.createDavProperty("junk", entry.getValue())); } else if ("flagged".equals(entry.getKey())) { list.add(Field.createDavProperty("flagStatus", entry.getValue())); } else if ("answered".equals(entry.getKey())) { list.add(Field.createDavProperty("lastVerbExecuted", entry.getValue())); if ("102".equals(entry.getValue())) { list.add(Field.createDavProperty("iconIndex", "261")); } } else if ("forwarded".equals(entry.getKey())) { list.add(Field.createDavProperty("lastVerbExecuted", entry.getValue())); if ("104".equals(entry.getValue())) { list.add(Field.createDavProperty("iconIndex", "262")); } } else if ("bcc".equals(entry.getKey())) { list.add(Field.createDavProperty("bcc", entry.getValue())); } else if ("deleted".equals(entry.getKey())) { list.add(Field.createDavProperty("deleted", entry.getValue())); } else if ("datereceived".equals(entry.getKey())) { list.add(Field.createDavProperty("datereceived", entry.getValue())); } else if ("keywords".equals(entry.getKey())) { list.add(Field.createDavProperty("keywords", entry.getValue())); } } } return list; } /** * Create message in specified folder. * Will overwrite an existing message with same messageName in the same folder * * @param folderPath Exchange folder path * @param messageName message name * @param properties message properties (flags) * @param mimeMessage MIME message * @throws IOException when unable to create message */ @Override public Message createMessage(String folderPath, String messageName, HashMap properties, MimeMessage mimeMessage) throws IOException { String messageUrl = URIUtil.encodePathQuery(getFolderPath(folderPath) + '/' + messageName); List davProperties = buildProperties(properties); if (properties != null && properties.containsKey("draft")) { // note: draft is readonly after create, create the message first with requested messageFlags davProperties.add(Field.createDavProperty("messageFlags", properties.get("draft"))); } if (properties != null && properties.containsKey("mailOverrideFormat")) { davProperties.add(Field.createDavProperty("mailOverrideFormat", properties.get("mailOverrideFormat"))); } if (properties != null && properties.containsKey("messageFormat")) { davProperties.add(Field.createDavProperty("messageFormat", properties.get("messageFormat"))); } if (!davProperties.isEmpty()) { HttpProppatch httpProppatch = new HttpProppatch(messageUrl, davProperties); try (CloseableHttpResponse response = httpClientAdapter.execute(httpProppatch)) { // update message with blind carbon copy and other flags int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_MULTI_STATUS) { throw new DavMailException("EXCEPTION_UNABLE_TO_CREATE_MESSAGE", messageUrl, statusCode, ' ', response.getStatusLine().getReasonPhrase()); } } } // update message body HttpPut putmethod = new HttpPut(messageUrl); putmethod.setHeader("Translate", "f"); putmethod.setHeader("Content-Type", "message/rfc822"); try { // use same encoding as client socket reader ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); baos.close(); putmethod.setEntity(new ByteArrayEntity(baos.toByteArray())); int code; String reasonPhrase; try (CloseableHttpResponse response = httpClientAdapter.execute(putmethod)) { code = response.getStatusLine().getStatusCode(); reasonPhrase = response.getStatusLine().getReasonPhrase(); } // workaround for misconfigured Exchange server if (code == HttpStatus.SC_NOT_ACCEPTABLE) { LOGGER.warn("Draft message creation failed, failover to property update. Note: attachments are lost"); ArrayList propertyList = new ArrayList<>(); propertyList.add(Field.createDavProperty("to", mimeMessage.getHeader("to", ","))); propertyList.add(Field.createDavProperty("cc", mimeMessage.getHeader("cc", ","))); propertyList.add(Field.createDavProperty("message-id", mimeMessage.getHeader("message-id", ","))); MimePart mimePart = mimeMessage; if (mimeMessage.getContent() instanceof MimeMultipart) { MimeMultipart multiPart = (MimeMultipart) mimeMessage.getContent(); for (int i = 0; i < multiPart.getCount(); i++) { String contentType = multiPart.getBodyPart(i).getContentType(); if (contentType.startsWith("text/")) { mimePart = (MimePart) multiPart.getBodyPart(i); break; } } } String contentType = mimePart.getContentType(); if (contentType.startsWith("text/plain")) { propertyList.add(Field.createDavProperty("description", (String) mimePart.getContent())); } else if (contentType.startsWith("text/html")) { propertyList.add(Field.createDavProperty("htmldescription", (String) mimePart.getContent())); } else { LOGGER.warn("Unsupported content type: " + contentType.replaceAll("[\n\r\t]", "_") + " message body will be empty"); } propertyList.add(Field.createDavProperty("subject", mimeMessage.getHeader("subject", ","))); HttpProppatch propPatchMethod = new HttpProppatch(messageUrl, propertyList); try (CloseableHttpResponse response = httpClientAdapter.execute(propPatchMethod)) { int patchStatus = response.getStatusLine().getStatusCode(); if (patchStatus == HttpStatus.SC_MULTI_STATUS) { code = HttpStatus.SC_OK; } } } if (code != HttpStatus.SC_OK && code != HttpStatus.SC_CREATED) { // first delete draft message if (!davProperties.isEmpty()) { HttpDelete httpDelete = new HttpDelete(messageUrl); try (CloseableHttpResponse response = httpClientAdapter.execute(httpDelete)) { int status = response.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_OK && status != HttpStatus.SC_NOT_FOUND) { throw HttpClientAdapter.buildHttpResponseException(httpDelete, response); } } catch (IOException e) { LOGGER.warn("Unable to delete draft message"); } } if (code == HttpStatus.SC_INSUFFICIENT_STORAGE) { throw new InsufficientStorageException(reasonPhrase); } else { throw new DavMailException("EXCEPTION_UNABLE_TO_CREATE_MESSAGE", messageUrl, code, ' ', reasonPhrase); } } } catch (MessagingException e) { throw new IOException(e.getMessage()); } finally { putmethod.releaseConnection(); } try { // need to update bcc after put if (mimeMessage.getHeader("Bcc") != null) { davProperties = new ArrayList<>(); davProperties.add(Field.createDavProperty("bcc", mimeMessage.getHeader("Bcc", ","))); HttpProppatch httpProppatch = new HttpProppatch(messageUrl, davProperties); // update message with blind carbon copy try (CloseableHttpResponse response = httpClientAdapter.execute(httpProppatch)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_MULTI_STATUS) { throw new DavMailException("EXCEPTION_UNABLE_TO_CREATE_MESSAGE", messageUrl, statusCode, ' ', response.getStatusLine().getReasonPhrase()); } } } } catch (MessagingException e) { throw new IOException(e.getMessage()); } // fetch after create not implemented return null; } /** * @inheritDoc */ @Override public void updateMessage(ExchangeSession.Message message, Map properties) throws IOException { HttpProppatch patchMethod = new HttpProppatch(encodeAndFixUrl(message.permanentUrl), buildProperties(properties)) { @Override public MultiStatus getResponseBodyAsMultiStatus(HttpResponse response) { // ignore response body, sometimes invalid with exchange mapi properties throw new UnsupportedOperationException(); } }; try (CloseableHttpResponse response = httpClientAdapter.execute(patchMethod)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_MULTI_STATUS) { throw new DavMailException("EXCEPTION_UNABLE_TO_UPDATE_MESSAGE"); } } } /** * @inheritDoc */ @Override public void deleteMessage(ExchangeSession.Message message) throws IOException { LOGGER.debug("Delete " + message.permanentUrl + " (" + message.messageUrl + ')'); HttpDelete httpDelete = new HttpDelete(encodeAndFixUrl(message.permanentUrl)); try (CloseableHttpResponse response = httpClientAdapter.execute(httpDelete)) { int status = response.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_OK && status != HttpStatus.SC_NOT_FOUND) { throw HttpClientAdapter.buildHttpResponseException(httpDelete, response); } } } /** * Send message. * * @param messageBody MIME message body * @throws IOException on error */ public void sendMessage(byte[] messageBody) throws IOException { try { sendMessage(new MimeMessage(null, new SharedByteArrayInputStream(messageBody))); } catch (MessagingException e) { throw new IOException(e.getMessage()); } } //protected static final long MAPI_SEND_NO_RICH_INFO = 0x00010000L; protected static final long ENCODING_PREFERENCE = 0x00020000L; protected static final long ENCODING_MIME = 0x00040000L; //protected static final long BODY_ENCODING_HTML = 0x00080000L; protected static final long BODY_ENCODING_TEXT_AND_HTML = 0x00100000L; //protected static final long MAC_ATTACH_ENCODING_UUENCODE = 0x00200000L; //protected static final long MAC_ATTACH_ENCODING_APPLESINGLE = 0x00400000L; //protected static final long MAC_ATTACH_ENCODING_APPLEDOUBLE = 0x00600000L; //protected static final long OOP_DONT_LOOKUP = 0x10000000L; @Override public void sendMessage(MimeMessage mimeMessage) throws IOException { try { // need to create draft first String itemName = UUID.randomUUID().toString() + ".EML"; HashMap properties = new HashMap<>(); properties.put("draft", "9"); String contentType = mimeMessage.getContentType(); if (contentType != null && contentType.startsWith("text/plain")) { properties.put("messageFormat", "1"); } else { properties.put("mailOverrideFormat", String.valueOf(ENCODING_PREFERENCE | ENCODING_MIME | BODY_ENCODING_TEXT_AND_HTML)); properties.put("messageFormat", "2"); } createMessage(DRAFTS, itemName, properties, mimeMessage); HttpMove httpMove = new HttpMove(URIUtil.encodePath(getFolderPath(DRAFTS + '/' + itemName)), URIUtil.encodePath(getFolderPath(SENDMSG)), false); // set header if saveInSent is disabled if (!Settings.getBooleanProperty("davmail.smtpSaveInSent", true)) { httpMove.setHeader("Saveinsent", "f"); } moveItem(httpMove); } catch (MessagingException e) { throw new IOException(e.getMessage()); } } // wrong hostname fix flag protected boolean restoreHostName; /** * @inheritDoc */ @Override protected byte[] getContent(ExchangeSession.Message message) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream contentInputStream; try { try { try { contentInputStream = getContentInputStream(message.messageUrl); } catch (UnknownHostException e) { // failover for misconfigured Exchange server, replace host name in url restoreHostName = true; contentInputStream = getContentInputStream(message.messageUrl); } } catch (HttpNotFoundException e) { LOGGER.debug("Message not found at: " + message.messageUrl + ", retrying with permanenturl"); contentInputStream = getContentInputStream(message.permanentUrl); } try { IOUtil.write(contentInputStream, baos); } finally { contentInputStream.close(); } } catch (LoginTimeoutException | SocketException e) { // throw error on expired session LOGGER.warn(e.getMessage()); throw e; } // throw error on broken connection catch (IOException e) { LOGGER.warn("Broken message at: " + message.messageUrl + " permanentUrl: " + message.permanentUrl + ", trying to rebuild from properties"); try { DavPropertyNameSet messageProperties = new DavPropertyNameSet(); messageProperties.add(Field.getPropertyName("contentclass")); messageProperties.add(Field.getPropertyName("message-id")); messageProperties.add(Field.getPropertyName("from")); messageProperties.add(Field.getPropertyName("to")); messageProperties.add(Field.getPropertyName("cc")); messageProperties.add(Field.getPropertyName("subject")); messageProperties.add(Field.getPropertyName("date")); messageProperties.add(Field.getPropertyName("htmldescription")); messageProperties.add(Field.getPropertyName("body")); HttpPropfind httpPropfind = new HttpPropfind(encodeAndFixUrl(message.permanentUrl), messageProperties, 0); try (CloseableHttpResponse response = httpClientAdapter.execute(httpPropfind)) { MultiStatus responses = httpPropfind.getResponseBodyAsMultiStatus(response); if (responses.getResponses().length > 0) { MimeMessage mimeMessage = new MimeMessage((Session) null); DavPropertySet properties = responses.getResponses()[0].getProperties(HttpStatus.SC_OK); String propertyValue = getPropertyIfExists(properties, "contentclass"); if (propertyValue != null) { mimeMessage.addHeader("Content-class", propertyValue); } propertyValue = getPropertyIfExists(properties, "date"); if (propertyValue != null) { mimeMessage.setSentDate(parseDateFromExchange(propertyValue)); } propertyValue = getPropertyIfExists(properties, "from"); if (propertyValue != null) { mimeMessage.addHeader("From", propertyValue); } propertyValue = getPropertyIfExists(properties, "to"); if (propertyValue != null) { mimeMessage.addHeader("To", propertyValue); } propertyValue = getPropertyIfExists(properties, "cc"); if (propertyValue != null) { mimeMessage.addHeader("Cc", propertyValue); } propertyValue = getPropertyIfExists(properties, "subject"); if (propertyValue != null) { mimeMessage.setSubject(propertyValue); } propertyValue = getPropertyIfExists(properties, "htmldescription"); if (propertyValue != null) { mimeMessage.setContent(propertyValue, "text/html; charset=UTF-8"); } else { propertyValue = getPropertyIfExists(properties, "body"); if (propertyValue != null) { mimeMessage.setText(propertyValue); } } mimeMessage.writeTo(baos); } } if (LOGGER.isDebugEnabled()) { LOGGER.debug("Rebuilt message content: " + new String(baos.toByteArray(), StandardCharsets.UTF_8)); } } catch (IOException | DavException | MessagingException e2) { LOGGER.warn(e2); } // other exception if (baos.size() == 0 && Settings.getBooleanProperty("davmail.deleteBroken")) { LOGGER.warn("Deleting broken message at: " + message.messageUrl + " permanentUrl: " + message.permanentUrl); try { message.delete(); } catch (IOException ioe) { LOGGER.warn("Unable to delete broken message at: " + message.permanentUrl); } throw e; } } return baos.toByteArray(); } /** * sometimes permanenturis inside items are wrong after an Exchange version migration * need to restore base uri to actual public Exchange uri * * @param url input uri * @return fixed uri * @throws IOException on error */ protected String encodeAndFixUrl(String url) throws IOException { String fixedurl = URIUtil.encodePath(url); // sometimes permanenturis inside items are wrong after an Exchange version migration // need to restore base uri to actual public Exchange uri if (restoreHostName && fixedurl.startsWith("http")) { try { return URIUtils.rewriteURI(new java.net.URI(fixedurl), URIUtils.extractHost(httpClientAdapter.getUri())).toString(); } catch (URISyntaxException e) { throw new IOException(e.getMessage(), e); } } return fixedurl; } protected InputStream getContentInputStream(String url) throws IOException { String encodedUrl = encodeAndFixUrl(url); final HttpGet httpGet = new HttpGet(encodedUrl); httpGet.setHeader("Content-Type", "text/xml; charset=utf-8"); httpGet.setHeader("Translate", "f"); httpGet.setHeader("Accept-Encoding", "gzip"); InputStream inputStream; try (CloseableHttpResponse response = httpClientAdapter.execute(httpGet)) { if (HttpClientAdapter.isGzipEncoded(response)) { inputStream = new GZIPInputStream(response.getEntity().getContent()); } else { inputStream = response.getEntity().getContent(); } inputStream = new FilterInputStream(inputStream) { int totalCount; int lastLogCount; @Override public int read(byte[] buffer, int offset, int length) throws IOException { int count = super.read(buffer, offset, length); totalCount += count; if (totalCount - lastLogCount > 1024 * 128) { DavGatewayTray.debug(new BundleMessage("LOG_DOWNLOAD_PROGRESS", String.valueOf(totalCount / 1024), httpGet.getURI())); DavGatewayTray.switchIcon(); lastLogCount = totalCount; } return count; } @Override public void close() throws IOException { try { super.close(); } finally { httpGet.releaseConnection(); } } }; } catch (IOException e) { LOGGER.warn("Unable to retrieve message at: " + url); throw e; } return inputStream; } /** * @inheritDoc */ @Override public void moveMessage(ExchangeSession.Message message, String targetFolder) throws IOException { try { moveMessage(message.permanentUrl, targetFolder); } catch (HttpNotFoundException e) { LOGGER.debug("404 not found at permanenturl: " + message.permanentUrl + ", retry with messageurl"); moveMessage(message.messageUrl, targetFolder); } } protected void moveMessage(String sourceUrl, String targetFolder) throws IOException { String targetPath = URIUtil.encodePath(getFolderPath(targetFolder)) + '/' + UUID.randomUUID().toString(); HttpMove method = new HttpMove(URIUtil.encodePath(sourceUrl), targetPath, false); // allow rename if a message with the same name exists method.setHeader("Allow-Rename", "t"); try (CloseableHttpResponse response = httpClientAdapter.execute(method)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_PRECONDITION_FAILED || statusCode == HttpStatus.SC_CONFLICT) { throw new DavMailException("EXCEPTION_UNABLE_TO_MOVE_MESSAGE"); } else if (statusCode != HttpStatus.SC_CREATED) { throw HttpClientAdapter.buildHttpResponseException(method, response); } } finally { method.releaseConnection(); } } /** * @inheritDoc */ @Override public void copyMessage(ExchangeSession.Message message, String targetFolder) throws IOException { try { copyMessage(message.permanentUrl, targetFolder); } catch (HttpNotFoundException e) { LOGGER.debug("404 not found at permanenturl: " + message.permanentUrl + ", retry with messageurl"); copyMessage(message.messageUrl, targetFolder); } } protected void copyMessage(String sourceUrl, String targetFolder) throws IOException { String targetPath = URIUtil.encodePath(getFolderPath(targetFolder)) + '/' + UUID.randomUUID().toString(); HttpCopy httpCopy = new HttpCopy(URIUtil.encodePath(sourceUrl), targetPath, false, false); // allow rename if a message with the same name exists httpCopy.addHeader("Allow-Rename", "t"); try (CloseableHttpResponse response = httpClientAdapter.execute(httpCopy)) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_PRECONDITION_FAILED) { throw new DavMailException("EXCEPTION_UNABLE_TO_COPY_MESSAGE"); } else if (statusCode != HttpStatus.SC_CREATED) { throw HttpClientAdapter.buildHttpResponseException(httpCopy, response); } } } @Override protected void moveToTrash(ExchangeSession.Message message) throws IOException { String destination = URIUtil.encodePath(deleteditemsUrl) + '/' + UUID.randomUUID().toString(); LOGGER.debug("Deleting : " + message.permanentUrl + " to " + destination); HttpMove method = new HttpMove(encodeAndFixUrl(message.permanentUrl), destination, false); method.addHeader("Allow-rename", "t"); try (CloseableHttpResponse response = httpClientAdapter.execute(method)) { int status = response.getStatusLine().getStatusCode(); // do not throw error if already deleted if (status != HttpStatus.SC_CREATED && status != HttpStatus.SC_NOT_FOUND) { throw HttpClientAdapter.buildHttpResponseException(method, response); } if (response.getFirstHeader("Location") != null) { destination = method.getFirstHeader("Location").getValue(); } } LOGGER.debug("Deleted to :" + destination); } protected String getItemProperty(String permanentUrl, String propertyName) throws IOException, DavException { String result = null; DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(Field.getPropertyName(propertyName)); HttpPropfind propFindMethod = new HttpPropfind(encodeAndFixUrl(permanentUrl), davPropertyNameSet, 0); MultiStatus responses; try (CloseableHttpResponse response = httpClientAdapter.execute(propFindMethod)) { responses = propFindMethod.getResponseBodyAsMultiStatus(response); } catch (UnknownHostException e) { // failover for misconfigured Exchange server, replace host name in url restoreHostName = true; propFindMethod = new HttpPropfind(encodeAndFixUrl(permanentUrl), davPropertyNameSet, 0); try (CloseableHttpResponse response = httpClientAdapter.execute(propFindMethod)) { responses = propFindMethod.getResponseBodyAsMultiStatus(response); } } if (responses.getResponses().length > 0) { DavPropertySet properties = responses.getResponses()[0].getProperties(HttpStatus.SC_OK); result = getPropertyIfExists(properties, propertyName); } return result; } protected String convertDateFromExchange(String exchangeDateValue) throws DavMailException { String zuluDateValue = null; if (exchangeDateValue != null) { try { zuluDateValue = getZuluDateFormat().format(getExchangeZuluDateFormatMillisecond().parse(exchangeDateValue)); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", exchangeDateValue); } } return zuluDateValue; } protected static final Map importanceToPriorityMap = new HashMap<>(); static { importanceToPriorityMap.put("high", "1"); importanceToPriorityMap.put("normal", "5"); importanceToPriorityMap.put("low", "9"); } protected static final Map priorityToImportanceMap = new HashMap<>(); static { priorityToImportanceMap.put("1", "high"); priorityToImportanceMap.put("5", "normal"); priorityToImportanceMap.put("9", "low"); } protected String convertPriorityFromExchange(String exchangeImportanceValue) { String value = null; if (exchangeImportanceValue != null) { value = importanceToPriorityMap.get(exchangeImportanceValue); } return value; } protected String convertPriorityToExchange(String vTodoPriorityValue) { String value = null; if (vTodoPriorityValue != null) { value = priorityToImportanceMap.get(vTodoPriorityValue); } return value; } @Override public void close() { httpClientAdapter.close(); } /** * Format date to exchange search format. * * @param date date object * @return formatted search date */ @Override public String formatSearchDate(Date date) { SimpleDateFormat dateFormatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS, Locale.ENGLISH); dateFormatter.setTimeZone(GMT_TIMEZONE); return dateFormatter.format(date); } protected String convertTaskDateToZulu(String value) { String result = null; if (value != null && value.length() > 0) { try { SimpleDateFormat parser = ExchangeSession.getExchangeDateFormat(value); Calendar calendarValue = Calendar.getInstance(GMT_TIMEZONE); calendarValue.setTime(parser.parse(value)); // zulu time: add 12 hours if (value.length() == 16) { calendarValue.add(Calendar.HOUR, 12); } calendarValue.set(Calendar.HOUR, 0); calendarValue.set(Calendar.MINUTE, 0); calendarValue.set(Calendar.SECOND, 0); result = ExchangeSession.getExchangeZuluDateFormatMillisecond().format(calendarValue.getTime()); } catch (ParseException e) { LOGGER.warn("Invalid date: " + value); } } return result; } protected String convertDateFromExchangeToTaskDate(String exchangeDateValue) throws DavMailException { String result = null; if (exchangeDateValue != null) { try { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); result = dateFormat.format(getExchangeZuluDateFormatMillisecond().parse(exchangeDateValue)); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", exchangeDateValue); } } return result; } protected Date parseDateFromExchange(String exchangeDateValue) throws DavMailException { Date result = null; if (exchangeDateValue != null) { try { result = getExchangeZuluDateFormatMillisecond().parse(exchangeDateValue); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", exchangeDateValue); } } return result; } } davmail-6.3.0/src/java/davmail/exchange/dav/Field.java0100644 0000000 0000000 00000107636 14503245212 021246 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import davmail.Settings; import davmail.util.StringUtil; import org.apache.jackrabbit.webdav.property.DavPropertyName; import org.apache.jackrabbit.webdav.property.DefaultDavProperty; import org.apache.jackrabbit.webdav.property.PropEntry; import org.apache.jackrabbit.webdav.xml.DomUtil; import org.apache.jackrabbit.webdav.xml.Namespace; import org.apache.jackrabbit.webdav.xml.XmlSerializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * WebDav Field */ public class Field { protected static final Map distinguishedPropertySetMap = new HashMap<>(); static { distinguishedPropertySetMap.put(DistinguishedPropertySetType.Meeting, "6ed8da90-450b-101b-98da-00aa003f1305"); distinguishedPropertySetMap.put(DistinguishedPropertySetType.Appointment, "00062002-0000-0000-c000-000000000046"); distinguishedPropertySetMap.put(DistinguishedPropertySetType.Common, "00062008-0000-0000-c000-000000000046"); distinguishedPropertySetMap.put(DistinguishedPropertySetType.PublicStrings, "00020329-0000-0000-c000-000000000046"); distinguishedPropertySetMap.put(DistinguishedPropertySetType.Address, "00062004-0000-0000-c000-000000000046"); distinguishedPropertySetMap.put(DistinguishedPropertySetType.InternetHeaders, "00020386-0000-0000-c000-000000000046"); distinguishedPropertySetMap.put(DistinguishedPropertySetType.UnifiedMessaging, "4442858e-a9e3-4e80-b900-317a210cc15b"); distinguishedPropertySetMap.put(DistinguishedPropertySetType.Task, "00062003-0000-0000-c000-000000000046"); } protected static final Namespace EMPTY = Namespace.getNamespace(""); protected static final Namespace XML = Namespace.getNamespace("xml:"); protected static final Namespace DAV = Namespace.getNamespace("DAV:"); protected static final Namespace URN_SCHEMAS_HTTPMAIL = Namespace.getNamespace("urn:schemas:httpmail:"); protected static final Namespace URN_SCHEMAS_MAILHEADER = Namespace.getNamespace("urn:schemas:mailheader:"); protected static final Namespace SCHEMAS_EXCHANGE = Namespace.getNamespace("http://schemas.microsoft.com/exchange/"); protected static final Namespace SCHEMAS_MAPI = Namespace.getNamespace("http://schemas.microsoft.com/mapi/"); protected static final Namespace SCHEMAS_MAPI_PROPTAG = Namespace.getNamespace("http://schemas.microsoft.com/mapi/proptag/"); protected static final Namespace SCHEMAS_MAPI_ID = Namespace.getNamespace("http://schemas.microsoft.com/mapi/id/"); protected static final Namespace SCHEMAS_MAPI_STRING = Namespace.getNamespace("http://schemas.microsoft.com/mapi/string/"); protected static final Namespace SCHEMAS_REPL = Namespace.getNamespace("http://schemas.microsoft.com/repl/"); protected static final Namespace URN_SCHEMAS_CONTACTS = Namespace.getNamespace("urn:schemas:contacts:"); protected static final Namespace URN_SCHEMAS_CALENDAR = Namespace.getNamespace("urn:schemas:calendar:"); protected static final Namespace SCHEMAS_MAPI_STRING_INTERNET_HEADERS = Namespace.getNamespace(SCHEMAS_MAPI_STRING.getURI() + '{' + distinguishedPropertySetMap.get(DistinguishedPropertySetType.InternetHeaders) + "}/"); protected static final Map propertyTypeMap = new HashMap<>(); static { propertyTypeMap.put(PropertyType.Integer, "0003"); // PT_INT propertyTypeMap.put(PropertyType.Boolean, "000b"); // PT_BOOLEAN propertyTypeMap.put(PropertyType.SystemTime, "0040"); // PT_SYSTIME propertyTypeMap.put(PropertyType.String, "001f"); // 001f is PT_UNICODE_STRING, 001E is PT_STRING propertyTypeMap.put(PropertyType.Binary, "0102"); // PT_BINARY propertyTypeMap.put(PropertyType.Double, "0005"); // PT_DOUBLE } @SuppressWarnings({"UnusedDeclaration"}) protected enum DistinguishedPropertySetType { Meeting, Appointment, Common, PublicStrings, Address, InternetHeaders, CalendarAssistant, UnifiedMessaging, Task } protected static final Map fieldMap = new HashMap<>(); static { // well known folders createField(URN_SCHEMAS_HTTPMAIL, "inbox"); createField(URN_SCHEMAS_HTTPMAIL, "deleteditems"); createField(URN_SCHEMAS_HTTPMAIL, "sentitems"); createField(URN_SCHEMAS_HTTPMAIL, "sendmsg"); createField(URN_SCHEMAS_HTTPMAIL, "drafts"); createField(URN_SCHEMAS_HTTPMAIL, "calendar"); createField(URN_SCHEMAS_HTTPMAIL, "tasks"); createField(URN_SCHEMAS_HTTPMAIL, "contacts"); createField(URN_SCHEMAS_HTTPMAIL, "outbox"); // folder createField("folderclass", SCHEMAS_EXCHANGE, "outlookfolderclass"); createField(DAV, "hassubs"); createField(DAV, "nosubs"); createField("count", DAV, "objectcount"); createField(URN_SCHEMAS_HTTPMAIL, "unreadcount"); createField(SCHEMAS_REPL, "contenttag"); createField("uidNext", 0x6751, PropertyType.Integer);// PR_ARTICLE_NUM_NEXT createField("highestUid", 0x6752, PropertyType.Integer);// PR_IMAP_LAST_ARTICLE_ID createField(DAV, "isfolder"); // item uid, do not use as search parameter, see http://support.microsoft.com/kb/320749 createField(DAV, "uid"); // based on PR_RECORD_KEY // POP and IMAP message createField("messageSize", 0x0e08, PropertyType.Integer);//PR_MESSAGE_SIZE createField("imapUid", 0x0e23, PropertyType.Integer);//PR_INTERNET_ARTICLE_NUMBER createField("junk", 0x1083, PropertyType.Integer); //PR_SPAMTYPE createField("flagStatus", 0x1090, PropertyType.Integer);//PR_FLAG_STATUS createField("messageFlags", 0x0e07, PropertyType.Integer);//PR_MESSAGE_FLAGS createField("lastVerbExecuted", 0x1081, PropertyType.Integer);//PR_LAST_VERB_EXECUTED createField("iconIndex", 0x1080, PropertyType.Integer);//PR_ICON_INDEX createField(URN_SCHEMAS_HTTPMAIL, "read"); //createField("read", 0x0e69, PropertyType.Boolean);//PR_READ if (Settings.getBooleanProperty("davmail.popCommonDeleted", true)) { // deleted flag, see http://microsoft.public.win32.programmer.messaging.narkive.com/w7Mrsrsx/how-to-detect-deleted-imap-messages-using-mapi-outlook-object-model-api createField("deleted", DistinguishedPropertySetType.Common, 0x8570, "deleted", PropertyType.String); } else { createField("deleted", DistinguishedPropertySetType.PublicStrings); } //createField(URN_SCHEMAS_HTTPMAIL, "date");//PR_CLIENT_SUBMIT_TIME, 0x0039 createField("date", 0x0e06, PropertyType.SystemTime);//PR_MESSAGE_DELIVERY_TIME createField(URN_SCHEMAS_MAILHEADER, "bcc");//PS_INTERNET_HEADERS/bcc createField(URN_SCHEMAS_HTTPMAIL, "datereceived");//PR_MESSAGE_DELIVERY_TIME, 0x0E06 // unused: force message encoding createField("messageFormat", 0x5909, PropertyType.Integer);//PR_MSG_EDITOR_FORMAT EDITOR_FORMAT_PLAINTEXT = 1 EDITOR_FORMAT_HTML = 2 createField("mailOverrideFormat", 0x5902, PropertyType.Integer);//PR_INETMAIL_OVERRIDE_FORMAT ENCODING_PREFERENCE = 2 BODY_ENCODING_TEXT_AND_HTML = 1 ENCODING_MIME = 4 // IMAP search createField(URN_SCHEMAS_HTTPMAIL, "subject"); // DistinguishedPropertySetType.InternetHeaders/Subject/String //createField("subject", 0x0037, PropertyType.String);//PR_SUBJECT createField("body", 0x1000, PropertyType.String);//PR_BODY createField("messageheaders", 0x007D, PropertyType.String);// PR_TRANSPORT_MESSAGE_HEADERS createField(URN_SCHEMAS_HTTPMAIL, "from"); //createField("from", DistinguishedPropertySetType.PublicStrings, 0x001f);//urn:schemas:httpmail:from createField(URN_SCHEMAS_MAILHEADER, "to"); // DistinguishedPropertySetType.InternetHeaders/To/String createField(URN_SCHEMAS_MAILHEADER, "cc"); // DistinguishedPropertySetType.InternetHeaders/To/String createField(URN_SCHEMAS_MAILHEADER, "message-id"); // DistinguishedPropertySetType.InternetHeaders/message-id/String createField(URN_SCHEMAS_MAILHEADER, "htmldescription"); // DistinguishedPropertySetType.InternetHeaders/htmldescription/String createField("lastmodified", DAV, "getlastmodified"); // PR_LAST_MODIFICATION_TIME 0x3008 SystemTime // failover search createField(DAV, "displayname"); createField("urlcompname", 0x10f3, PropertyType.String); //PR_URL_COMP_NAME // items createField("etag", DAV, "getetag"); // calendar createField(SCHEMAS_EXCHANGE, "permanenturl"); createField(URN_SCHEMAS_CALENDAR, "instancetype"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:instancetype/Integer createField(URN_SCHEMAS_CALENDAR, "dtstart"); // 0x10C3 SystemTime createField(URN_SCHEMAS_CALENDAR, "dtend"); // 0x10C4 SystemTime //createField(URN_SCHEMAS_CALENDAR, "prodid"); // // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:prodid/String createField("calendarversion", URN_SCHEMAS_CALENDAR, "version"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:version/String createField(URN_SCHEMAS_CALENDAR, "method"); // // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:method/String createField("calendarlastmodified", URN_SCHEMAS_CALENDAR, "lastmodified"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:isorganizer/Boolean createField(URN_SCHEMAS_CALENDAR, "dtstamp"); // PidLidOwnerCriticalChange createField("calendaruid", URN_SCHEMAS_CALENDAR, "uid"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:uid/String createField(URN_SCHEMAS_CALENDAR, "transparent"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:transparent/String createField(URN_SCHEMAS_CALENDAR, "organizer"); createField(URN_SCHEMAS_CALENDAR, "created"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:created/SystemTime createField(URN_SCHEMAS_CALENDAR, "alldayevent"); // DistinguishedPropertySetType.Appointment/0x8215 Boolean createField(URN_SCHEMAS_CALENDAR, "rrule"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:rrule/PtypMultipleString createField(URN_SCHEMAS_CALENDAR, "exdate"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:exdate/PtypMultipleTime createField(SCHEMAS_MAPI, "reminderset"); // PidLidReminderSet createField(SCHEMAS_MAPI, "reminderdelta"); // PidLidReminderDelta // TODO createField(SCHEMAS_MAPI, "allattendeesstring"); // PidLidAllAttendeesString createField(SCHEMAS_MAPI, "required_attendees"); // PidLidRequiredAttendees createField(SCHEMAS_MAPI, "apptendtime"); // PidLidAppointmentEndTime createField(SCHEMAS_MAPI, "apptstateflags"); // PidLidAppointmentStateFlags 1: Meeting, 2: Received, 4: Cancelled createField(URN_SCHEMAS_CALENDAR, "isorganizer"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:isorganizer/Boolean createField(URN_SCHEMAS_CALENDAR, "location"); // DistinguishedPropertySetType.Appointment/0x8208 String createField(URN_SCHEMAS_CALENDAR, "attendeerole"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:attendeerole/Integer createField(URN_SCHEMAS_CALENDAR, "busystatus"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:busystatus/String createField(URN_SCHEMAS_CALENDAR, "exrule"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:exrule/PtypMultipleString createField(URN_SCHEMAS_CALENDAR, "recurrenceidrange"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:recurrenceidrange/String createField(URN_SCHEMAS_CALENDAR, "rdate"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:rdate/PtypMultipleTime createField(URN_SCHEMAS_CALENDAR, "reminderoffset"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:reminderoffset/Integer createField(URN_SCHEMAS_CALENDAR, "timezone"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:timezone/String createField(SCHEMAS_EXCHANGE, "sensitivity"); // PR_SENSITIVITY 0x0036 Integer createField(URN_SCHEMAS_CALENDAR, "timezoneid"); // DistinguishedPropertySetType.PublicStrings/urn:schemas:calendar:timezoneid/Integer // should use PidLidServerProcessed ? createField("processed", 0x65e8, PropertyType.Boolean);// PR_MESSAGE_PROCESSED createField(DAV, "contentclass"); createField("internetContent", 0x6659, PropertyType.Binary); // contact createField(SCHEMAS_EXCHANGE, "outlookmessageclass"); createField(URN_SCHEMAS_HTTPMAIL, "subject"); createField(URN_SCHEMAS_CONTACTS, "middlename"); // PR_MIDDLE_NAME 0x3A44 createField(URN_SCHEMAS_CONTACTS, "fileas"); // urn:schemas:contacts:fileas PS_PUBLIC_STRINGS //createField("id", 0x0ff6, PropertyType.Binary); // PR_INSTANCE_KEY http://support.microsoft.com/kb/320749 createField(URN_SCHEMAS_CONTACTS, "homepostaladdress"); // homeAddress DistinguishedPropertySetType.Address/0x0000801A/String createField(URN_SCHEMAS_CONTACTS, "otherpostaladdress"); // otherAddress DistinguishedPropertySetType.Address/0x0000801C/String createField(URN_SCHEMAS_CONTACTS, "mailingaddressid"); // postalAddressId DistinguishedPropertySetType.Address/0x00008022/String createField(URN_SCHEMAS_CONTACTS, "workaddress"); // workAddress DistinguishedPropertySetType.Address/0x0000801B/String createField(URN_SCHEMAS_CONTACTS, "alternaterecipient"); // alternaterecipient DistinguishedPropertySetType.PublicStrings/urn:schemas:contacts:alternaterecipient/String createField(SCHEMAS_EXCHANGE, "extensionattribute1"); // DistinguishedPropertySetType.Address/0x0000804F/String createField(SCHEMAS_EXCHANGE, "extensionattribute2"); // DistinguishedPropertySetType.Address/0x00008050/String createField(SCHEMAS_EXCHANGE, "extensionattribute3"); // DistinguishedPropertySetType.Address/0x00008051/String createField(SCHEMAS_EXCHANGE, "extensionattribute4"); // DistinguishedPropertySetType.Address/0x00008052/String createField(URN_SCHEMAS_CONTACTS, "bday"); // PR_BIRTHDAY 0x3A42 SystemTime createField("anniversary", URN_SCHEMAS_CONTACTS, "weddinganniversary"); // WeddingAnniversary createField(URN_SCHEMAS_CONTACTS, "businesshomepage"); // PR_BUSINESS_HOME_PAGE 0x3A51 String createField(URN_SCHEMAS_CONTACTS, "personalHomePage"); // PR_PERSONAL_HOME_PAGE 0x3A50 String createField(URN_SCHEMAS_CONTACTS, "cn"); // PR_DISPLAY_NAME 0x3001 String createField(URN_SCHEMAS_CONTACTS, "co"); // workAddressCountry DistinguishedPropertySetType.Address/0x00008049/String createField(URN_SCHEMAS_CONTACTS, "department"); // PR_DEPARTMENT_NAME 0x3A18 String // smtp email createField("smtpemail1", DistinguishedPropertySetType.Address, 0x8084, "smtpemail1"); // Email1OriginalDisplayName createField("smtpemail2", DistinguishedPropertySetType.Address, 0x8094, "smtpemail2"); // Email2OriginalDisplayName createField("smtpemail3", DistinguishedPropertySetType.Address, 0x80A4, "smtpemail3"); // Email3OriginalDisplayName // native email createField("email1", DistinguishedPropertySetType.Address, 0x8083, "email1"); // Email1EmailAddress createField("email2", DistinguishedPropertySetType.Address, 0x8093, "email2"); // Email2EmailAddress createField("email3", DistinguishedPropertySetType.Address, 0x80A3, "email3"); // Email3EmailAddress // email type createField("email1type", DistinguishedPropertySetType.Address, 0x8082, "email1type"); // Email1AddressType createField("email2type", DistinguishedPropertySetType.Address, 0x8092, "email2type"); // Email2AddressType createField("email3type", DistinguishedPropertySetType.Address, 0x80A2, "email3type"); // Email3AddressType createField(URN_SCHEMAS_CONTACTS, "facsimiletelephonenumber"); // PR_BUSINESS_FAX_NUMBER 0x3A24 String createField(URN_SCHEMAS_CONTACTS, "givenName"); // PR_GIVEN_NAME 0x3A06 String createField(URN_SCHEMAS_CONTACTS, "homepostofficebox"); // PR_HOME_ADDRESS_POST_OFFICE_BOX 0x3A5E String createField(URN_SCHEMAS_CONTACTS, "homeCity"); // PR_HOME_ADDRESS_CITY 0x3A59 String createField(URN_SCHEMAS_CONTACTS, "homeCountry"); // PR_HOME_ADDRESS_COUNTRY 0x3A5A String createField(URN_SCHEMAS_CONTACTS, "homePhone"); // PR_HOME_TELEPHONE_NUMBER 0x3A09 String createField(URN_SCHEMAS_CONTACTS, "homePostalCode"); // PR_HOME_ADDRESS_POSTAL_CODE 0x3A5B String createField(URN_SCHEMAS_CONTACTS, "homeState"); // PR_HOME_ADDRESS_STATE_OR_PROVINCE 0x3A5C String createField(URN_SCHEMAS_CONTACTS, "homeStreet"); // PR_HOME_ADDRESS_STREET 0x3A5D String createField(URN_SCHEMAS_CONTACTS, "l"); // workAddressCity DistinguishedPropertySetType.Address/0x00008046/String createField(URN_SCHEMAS_CONTACTS, "manager"); // PR_MANAGER_NAME 0x3A4E String createField(URN_SCHEMAS_CONTACTS, "mobile"); // PR_MOBILE_TELEPHONE_NUMBER 0x3A1C String createField(URN_SCHEMAS_CONTACTS, "namesuffix"); // PR_GENERATION 0x3A05 String createField(URN_SCHEMAS_CONTACTS, "nickname"); // PR_NICKNAME 0x3A4F String createField(URN_SCHEMAS_CONTACTS, "o"); // PR_COMPANY_NAME 0x3A16 String createField(URN_SCHEMAS_CONTACTS, "pager"); // PR_PAGER_TELEPHONE_NUMBER 0x3A21 String createField(URN_SCHEMAS_CONTACTS, "personaltitle"); // PR_DISPLAY_NAME_PREFIX 0x3A45 String createField(URN_SCHEMAS_CONTACTS, "postalcode"); // workAddressPostalCode DistinguishedPropertySetType.Address/0x00008048/String createField(URN_SCHEMAS_CONTACTS, "postofficebox"); // workAddressPostOfficeBox DistinguishedPropertySetType.Address/0x0000804A/String createField(URN_SCHEMAS_CONTACTS, "profession"); // PR_PROFESSION 0x3A46 String createField(URN_SCHEMAS_CONTACTS, "roomnumber"); // PR_OFFICE_LOCATION 0x3A19 String createField(URN_SCHEMAS_CONTACTS, "secretarycn"); // PR_ASSISTANT 0x3A30 String createField(URN_SCHEMAS_CONTACTS, "sn"); // PR_SURNAME 0x3A11 String createField(URN_SCHEMAS_CONTACTS, "spousecn"); // PR_SPOUSE_NAME 0x3A48 String createField(URN_SCHEMAS_CONTACTS, "st"); // workAddressState DistinguishedPropertySetType.Address/0x00008047/String createField(URN_SCHEMAS_CONTACTS, "street"); // workAddressStreet DistinguishedPropertySetType.Address/0x00008045/String createField(URN_SCHEMAS_CONTACTS, "telephoneNumber"); // PR_BUSINESS_TELEPHONE_NUMBER 0x3A08 String createField(URN_SCHEMAS_CONTACTS, "title"); // PR_TITLE 0x3A17 String createField("description", URN_SCHEMAS_HTTPMAIL, "textdescription"); // PR_BODY 0x1000 String createField("im", SCHEMAS_MAPI, "InstMsg"); // InstantMessagingAddress DistinguishedPropertySetType.Address/0x00008062/String createField(URN_SCHEMAS_CONTACTS, "othermobile"); // PR_CAR_TELEPHONE_NUMBER 0x3A1E String createField(URN_SCHEMAS_CONTACTS, "internationalisdnnumber"); // PR_ISDN_NUMBER 0x3A2D String createField(URN_SCHEMAS_CONTACTS, "otherTelephone"); // PR_OTHER_TELEPHONE_NUMBER 0x3A21 String createField(URN_SCHEMAS_CONTACTS, "homefax"); // PR_HOME_FAX_NUMBER 0x3A25 String createField(URN_SCHEMAS_CONTACTS, "otherstreet"); // PR_OTHER_ADDRESS_STREET 0x3A63 String createField(URN_SCHEMAS_CONTACTS, "otherstate"); // PR_OTHER_ADDRESS_STATE_OR_PROVINCE 0x3A62 String createField(URN_SCHEMAS_CONTACTS, "otherpostofficebox"); // PR_OTHER_ADDRESS_POST_OFFICE_BOX 0x3A64 String createField(URN_SCHEMAS_CONTACTS, "otherpostalcode"); // PR_OTHER_ADDRESS_POSTAL_CODE 0x3A61 String createField(URN_SCHEMAS_CONTACTS, "othercountry"); // PR_OTHER_ADDRESS_COUNTRY 0x3A60 String createField(URN_SCHEMAS_CONTACTS, "othercity"); // PR_OTHER_ADDRESS_CITY 0x3A5F String createField(URN_SCHEMAS_CONTACTS, "gender"); // PR_GENDER 0x3A4D Integer16 createField("keywords", SCHEMAS_EXCHANGE, "keywords-utf8", PropertyType.StringArray); // PS_PUBLIC_STRINGS Keywords String //createField("keywords", DistinguishedPropertySetType.PublicStrings, "Keywords", ); // PS_PUBLIC_STRINGS Keywords String // contact private flags createField("private", DistinguishedPropertySetType.Common, 0x8506, "private", PropertyType.Boolean); // True/False createField("sensitivity", 0x0036, PropertyType.Integer); // PR_SENSITIVITY SENSITIVITY_PRIVATE = 2, SENSITIVITY_PERSONAL = 1, SENSITIVITY_NONE = 0 createField("haspicture", DistinguishedPropertySetType.Address, 0x8015, "haspicture", PropertyType.Boolean); // True/False createField(URN_SCHEMAS_CALENDAR, "fburl"); // freeBusyLocation // OWA settings createField("messageclass", 0x001a, PropertyType.String); createField("roamingxmlstream", 0x7c08, PropertyType.Binary); createField("roamingdictionary", 0x7c07, PropertyType.Binary); createField(DAV, "ishidden"); // attachment content createField("attachDataBinary", 0x3701, PropertyType.Binary); createField("attachmentContactPhoto", 0x7FFF, PropertyType.Boolean); // PR_ATTACHMENT_CONTACTPHOTO createField("renderingPosition", 0x370B, PropertyType.Integer);// PR_RENDERING_POSITION //createField("attachFilename", 0x3704, PropertyType.String); // PR_ATTACH_FILENAME createField("attachExtension", 0x3703, PropertyType.String); // PR_ATTACH_EXTENSION createField("xmozlastack", DistinguishedPropertySetType.PublicStrings); createField("xmozsnoozetime", DistinguishedPropertySetType.PublicStrings); createField("xmozsendinvitations", DistinguishedPropertySetType.PublicStrings); // task createField(URN_SCHEMAS_MAILHEADER, "importance");//PS_INTERNET_HEADERS/importance createField("percentcomplete", DistinguishedPropertySetType.Task, 0x8102, "percentcomplete", PropertyType.Double); createField("taskstatus", DistinguishedPropertySetType.Task, 0x8101, "taskstatus", PropertyType.Integer); createField("startdate", DistinguishedPropertySetType.Task, 0x8104, "startdate", PropertyType.SystemTime); createField("duedate", DistinguishedPropertySetType.Task, 0x8105, "duedate", PropertyType.SystemTime); createField("datecompleted", DistinguishedPropertySetType.Task, 0x810F, "datecompleted", PropertyType.SystemTime); createField("iscomplete", DistinguishedPropertySetType.Task, 0x811C, "iscomplete", PropertyType.Boolean); createField("commonstart", DistinguishedPropertySetType.Common, 0x8516, "commonstart", PropertyType.SystemTime); createField("commonend", DistinguishedPropertySetType.Common, 0x8517, "commonend", PropertyType.SystemTime); } protected static String toHexString(int propertyTag) { StringBuilder hexValue = new StringBuilder(Integer.toHexString(propertyTag)); while (hexValue.length() < 4) { hexValue.insert(0, '0'); } return hexValue.toString(); } protected static void createField(String alias, int propertyTag, PropertyType propertyType) { String name = 'x' + toHexString(propertyTag) + propertyTypeMap.get(propertyType); Field field; if (propertyType == PropertyType.Binary) { field = new Field(alias, SCHEMAS_MAPI_PROPTAG, name, propertyType, null, "bin.base64", name); } else { field = new Field(alias, SCHEMAS_MAPI_PROPTAG, name, propertyType); } fieldMap.put(field.alias, field); } protected static void createField(String alias,@SuppressWarnings("SameParameterValue") DistinguishedPropertySetType propertySetType) { Field field = new Field(Namespace.getNamespace(SCHEMAS_MAPI_STRING.getURI() + '{' + distinguishedPropertySetMap.get(propertySetType) + "}/"), alias); fieldMap.put(field.alias, field); } protected static void createField(String alias, @SuppressWarnings("SameParameterValue") DistinguishedPropertySetType propertySetType, int propertyTag, String responseAlias) { createField(alias, propertySetType, propertyTag, responseAlias, null); } protected static void createField(String alias, DistinguishedPropertySetType propertySetType, int propertyTag, String responseAlias, PropertyType propertyType) { String name; String updateAlias; if (propertySetType == DistinguishedPropertySetType.Address) { // Address namespace expects integer names name = String.valueOf(propertyTag); updateAlias = "_x0030_x" + toHexString(propertyTag); } else if (propertySetType == DistinguishedPropertySetType.Task) { name = "0x" + toHexString(propertyTag); updateAlias = "0x0000" + toHexString(propertyTag); } else { // Common namespace expects hex names name = "0x" + toHexString(propertyTag); updateAlias = "_x0030_x" + toHexString(propertyTag); } Field field = new Field(alias, Namespace.getNamespace(SCHEMAS_MAPI_ID.getURI() + '{' + distinguishedPropertySetMap.get(propertySetType) + "}/"), name, propertyType, responseAlias, null, updateAlias); fieldMap.put(field.alias, field); } protected static void createField(Namespace namespace, String name) { Field field = new Field(namespace, name); fieldMap.put(field.alias, field); } protected static void createField(String alias, Namespace namespace, String name) { Field field = new Field(alias, namespace, name, null); fieldMap.put(field.alias, field); } @SuppressWarnings("SameParameterValue") protected static void createField(String alias, Namespace namespace, String name, PropertyType propertyType) { Field field = new Field(alias, namespace, name, propertyType); fieldMap.put(field.alias, field); } private final DavPropertyName davPropertyName; protected final String alias; protected final String uri; protected final String requestPropertyString; protected final DavPropertyName responsePropertyName; protected final DavPropertyName updatePropertyName; protected final String cast; protected final boolean isIntValue; protected final boolean isMultivalued; protected final boolean isBooleanValue; protected final boolean isFloatValue; protected final boolean isDateValue; /** * Create field for namespace and name, use name as alias. * * @param namespace Exchange namespace * @param name Exchange name */ protected Field(Namespace namespace, String name) { this(name, namespace, name, null); } /** * Create field for namespace and name of type propertyType. * * @param alias logical name in DavMail * @param namespace Exchange namespace * @param name Exchange name * @param propertyType property type */ protected Field(String alias, Namespace namespace, String name, PropertyType propertyType) { this(alias, namespace, name, propertyType, null, null, name); } /** * Create field for namespace and name of type propertyType. * * @param alias logical name in DavMail * @param namespace Exchange namespace * @param name Exchange name * @param propertyType property type * @param responseAlias property name in SEARCH response (as responsealias in request) * @param cast response cast type (e.g. bin.base64) * @param updateAlias some properties use a different alias in PROPPATCH requests */ protected Field(String alias, Namespace namespace, String name, PropertyType propertyType, String responseAlias, String cast, String updateAlias) { this.alias = alias; // property name in PROPFIND requests davPropertyName = DavPropertyName.create(name, namespace); // property name in PROPPATCH requests updatePropertyName = DavPropertyName.create(updateAlias, namespace); // a few type based flags isMultivalued = propertyType != null && propertyType.toString().endsWith("Array"); isIntValue = propertyType == PropertyType.Long || propertyType == PropertyType.Integer || propertyType == PropertyType.Short; isBooleanValue = propertyType == PropertyType.Boolean; isFloatValue = propertyType == PropertyType.Float || propertyType == PropertyType.Double; isDateValue = propertyType == PropertyType.SystemTime; this.uri = namespace.getURI() + name; if (responseAlias == null) { this.requestPropertyString = '"' + uri + '"'; this.responsePropertyName = davPropertyName; } else { this.requestPropertyString = '"' + uri + "\" as " + responseAlias; this.responsePropertyName = DavPropertyName.create(responseAlias, EMPTY); } this.cast = cast; } /** * Property uri. * * @return uri */ public String getUri() { return uri; } /** * Integer value property type. * * @return true if the field value is integer */ public boolean isIntValue() { return isIntValue; } /** * Get Field by alias. * * @param alias field alias * @return field */ public static Field get(String alias) { Field field = fieldMap.get(alias); if (field == null) { throw new IllegalArgumentException("Unknown field: " + alias); } return field; } /** * Get Mime header field. * * @param headerName header name * @return field object */ public static Field getHeader(String headerName) { return new Field(SCHEMAS_MAPI_STRING_INTERNET_HEADERS, headerName); } /** * Create DavProperty object for field alias and value. * * @param alias DavMail field alias * @param value field value * @return DavProperty with value or DavPropertyName for null values */ public static PropEntry createDavProperty(String alias, String value) { Field field = Field.get(alias); if (value == null) { // return DavPropertyName to remove property return field.updatePropertyName; } else if (field.isMultivalued) { // multivalued field, split values separated by \n List valueList = new ArrayList<>(); String[] values = value.split(","); for (final String singleValue : values) { valueList.add(document -> DomUtil.createElement(document, "v", XML, singleValue)); } return new DefaultDavProperty<>(field.updatePropertyName, valueList); } else if (field.isBooleanValue && !"haspicture".equals(alias)) { if ("true".equals(value)) { return new DefaultDavProperty<>(field.updatePropertyName, "1"); } else if ("false".equals(value)) { return new DefaultDavProperty<>(field.updatePropertyName, "0"); } else { throw new RuntimeException("Invalid value for " + field.alias + ": " + value); } } else { return new DefaultDavProperty<>(field.updatePropertyName, value); } } /** * Create property value object for field and value. * * @param alias field alias * @param value field value * @return property value object * @see davmail.http.request.ExchangePropPatchRequest */ public static PropertyValue createPropertyValue(String alias, String value) { Field field = Field.get(alias); DavPropertyName davPropertyName = field.davPropertyName; if (value == null) { // return DavPropertyName to remove property return new PropertyValue(davPropertyName.getNamespace().getURI(), davPropertyName.getName()); } else if (field.isMultivalued) { StringBuilder buffer = new StringBuilder(); // multivalued field, split values separated by \n String[] values = value.split("\n"); for (final String singleValue : values) { buffer.append(""); buffer.append(StringUtil.xmlEncode(singleValue)); buffer.append(""); } return new PropertyValue(davPropertyName.getNamespace().getURI(), davPropertyName.getName(), buffer.toString()); } else if (field.isBooleanValue) { if ("true".equals(value)) { return new PropertyValue(davPropertyName.getNamespace().getURI(), davPropertyName.getName(), "1", "boolean"); } else if ("false".equals(value)) { return new PropertyValue(davPropertyName.getNamespace().getURI(), davPropertyName.getName(), "0", "boolean"); } else { throw new RuntimeException("Invalid value for " + field.alias + ": " + value); } } else if (field.isFloatValue) { return new PropertyValue(davPropertyName.getNamespace().getURI(), davPropertyName.getName(), StringUtil.xmlEncode(value), "float"); } else if (field.isIntValue) { return new PropertyValue(field.updatePropertyName.getNamespace().getURI(), field.updatePropertyName.getName(), StringUtil.xmlEncode(value), "int"); } else if (field.isDateValue) { return new PropertyValue(field.updatePropertyName.getNamespace().getURI(), field.updatePropertyName.getName(), StringUtil.xmlEncode(value), "dateTime.tz"); } else { return new PropertyValue(davPropertyName.getNamespace().getURI(), davPropertyName.getName(), StringUtil.xmlEncode(value)); } } /** * SEARCH request property name for alias * * @param alias field alias * @return request property string */ public static String getRequestPropertyString(String alias) { return Field.get(alias).requestPropertyString; } /** * PROPFIND request property name * * @param alias field alias * @return request property name */ public static DavPropertyName getPropertyName(String alias) { return Field.get(alias).davPropertyName; } /** * SEARCH response property name * * @param alias field alias * @return response property name */ public static DavPropertyName getResponsePropertyName(String alias) { return Field.get(alias).responsePropertyName; } } davmail-6.3.0/src/java/davmail/exchange/dav/PropertyType.java0100644 0000000 0000000 00000002342 13445647074 022715 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; /** * MAPI property types. */ public enum PropertyType { ApplicationTime, ApplicationTimeArray, Binary, BinaryArray, Boolean, CLSID, CLSIDArray, Currency, CurrencyArray, Double, DoubleArray, Error, Float, FloatArray, Integer, IntegerArray, Long, LongArray, Null, Object, ObjectArray, Short, ShortArray, SystemTime, SystemTimeArray, String, StringArray } davmail-6.3.0/src/java/davmail/exchange/dav/PropertyValue.java0100644 0000000 0000000 00000005524 12564151517 023046 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; /** * Property value. */ public class PropertyValue { protected final String namespaceUri; protected final String name; protected final String xmlEncodedValue; protected final String typeString; /** * Create Dav property value. * * @param namespaceUri property namespace * @param name property name */ public PropertyValue(String namespaceUri, String name) { this(namespaceUri, name, null, null); } /** * Create Dav property value. * * @param namespaceUri property namespace * @param name property name * @param xmlEncodedValue xml encoded value */ public PropertyValue(String namespaceUri, String name, String xmlEncodedValue) { this(namespaceUri, name, xmlEncodedValue, null); } /** * Create Dav property value. * * @param namespaceUri property namespace * @param name property name * @param xmlEncodedValue xml encoded value * @param typeString property type */ public PropertyValue(String namespaceUri, String name, String xmlEncodedValue, String typeString) { this.namespaceUri = namespaceUri; this.name = name; this.xmlEncodedValue = xmlEncodedValue; this.typeString = typeString; } /** * Get property namespace. * * @return property namespace */ public String getNamespaceUri() { return namespaceUri; } /** * Get xml encoded value. * * @return Xml encoded value */ public String getXmlEncodedValue() { return xmlEncodedValue; } /** * Get property type. * * @return property type */ public String getTypeString() { return typeString; } /** * Get property name. * * @return property name */ public String getName() { return name; } } davmail-6.3.0/src/java/davmail/exchange/ews/AffectedTaskOccurrences.java0100644 0000000 0000000 00000002543 13452623365 024771 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2011 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Item delete option. */ @SuppressWarnings({"UnusedDeclaration"}) public final class AffectedTaskOccurrences extends AttributeOption { private AffectedTaskOccurrences(String value) { super("AffectedTaskOccurrences", value); } public static final AffectedTaskOccurrences AllOccurrences = new AffectedTaskOccurrences("AllOccurrences"); public static final AffectedTaskOccurrences SpecifiedOccurrenceOnly = new AffectedTaskOccurrences("SpecifiedOccurrenceOnly"); } davmail-6.3.0/src/java/davmail/exchange/ews/AlternateId.java0100644 0000000 0000000 00000003446 13445647074 022455 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.util.StringUtil; import java.io.IOException; import java.io.Writer; public class AlternateId extends ElementOption { String format; // fake mailbox email String mailbox = "blah@blah.com"; protected AlternateId(String format, String id) { super("AlternateId", id); this.format = format; } protected AlternateId(String format, String id, String mailbox) { super("AlternateId", id); this.format = format; this.mailbox = mailbox; } /** * @inheritDoc */ @Override public void write(Writer writer) throws IOException { writer.write(""); } } davmail-6.3.0/src/java/davmail/exchange/ews/AttributeOption.java0100644 0000000 0000000 00000003033 12564151517 023376 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; /** * Generic attribute option. */ public class AttributeOption extends Option { protected AttributeOption(String name, String value) { super(name, value); } /** * @inheritDoc */ public void appendTo(StringBuilder buffer) { buffer.append(' ').append(name).append("=\"").append(value).append('"'); } /** * @inheritDoc */ @Override public void write(Writer writer) throws IOException { writer.write(" "); writer.write(name); writer.write("=\""); writer.write(value); writer.write("\""); } } davmail-6.3.0/src/java/davmail/exchange/ews/AutoDiscoverMethod.java0100644 0000000 0000000 00000007727 13574116520 024025 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.log4j.Logger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class AutoDiscoverMethod extends HttpPost implements ResponseHandler { protected static final Logger LOGGER = Logger.getLogger(AutoDiscoverMethod.class); public AutoDiscoverMethod(String url, String userEmail) { super(url); setRequestEntity(userEmail); } private void setRequestEntity(String userEmail) { String body = "" + "" + "" + userEmail + "" + "http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a" + "" + ""; setEntity(new StringEntity(body, ContentType.create("text/xml", "UTF-8"))); } @Override public Object handleResponse(HttpResponse response) throws IOException { String ewsUrl = null; try { Header contentTypeHeader = response.getFirstHeader("Content-Type"); if (contentTypeHeader != null && ("text/xml; charset=utf-8".equals(contentTypeHeader.getValue()) || "text/html; charset=utf-8".equals(contentTypeHeader.getValue()) )) { BufferedReader autodiscoverReader = null; try { autodiscoverReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), StandardCharsets.UTF_8)); String line; // find ews url //noinspection StatementWithEmptyBody while ((line = autodiscoverReader.readLine()) != null && (!line.contains("")) && (!line.contains(""))) { } if (line != null) { ewsUrl = line.substring(line.indexOf("") + 8, line.indexOf("")); } } catch (IOException e) { LOGGER.debug(e); } finally { if (autodiscoverReader != null) { try { autodiscoverReader.close(); } catch (IOException e) { LOGGER.debug(e); } } } } } finally { ((CloseableHttpResponse) response).close(); } return ewsUrl; } } davmail-6.3.0/src/java/davmail/exchange/ews/BaseShape.java0100644 0000000 0000000 00000002734 12564151517 022104 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Item or folder base shape. */ @SuppressWarnings({"UnusedDeclaration"}) public final class BaseShape extends ElementOption { private BaseShape(String value) { super("t:BaseShape", value); } /** * Return id only. */ public static final BaseShape ID_ONLY = new BaseShape("IdOnly"); /** * Return default properties. */ public static final BaseShape DEFAULT = new BaseShape("Default"); /** * Return all properties, except MAPI extended properties. */ public static final BaseShape ALL_PROPERTIES = new BaseShape("AllProperties"); }davmail-6.3.0/src/java/davmail/exchange/ews/ConflictResolution.java0100644 0000000 0000000 00000002635 13452623365 024100 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Item update conflict resolution */ @SuppressWarnings({"UnusedDeclaration"}) public final class ConflictResolution extends AttributeOption { private ConflictResolution(String value) { super("ConflictResolution", value); } public static final ConflictResolution NeverOverwrite = new ConflictResolution("NeverOverwrite"); public static final ConflictResolution AutoResolve = new ConflictResolution("AutoResolve"); public static final ConflictResolution AlwaysOverwrite = new ConflictResolution("AlwaysOverwrite"); } davmail-6.3.0/src/java/davmail/exchange/ews/ContactDataShape.java0100644 0000000 0000000 00000002554 14754153476 023430 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * ResolveNames contact data shape. */ @SuppressWarnings({"UnusedDeclaration"}) public class ContactDataShape extends AttributeOption { private ContactDataShape(String value) { super("ContactDataShape", value); } public static final ContactDataShape IdOnly = new ContactDataShape("IdOnly"); public static final ContactDataShape Default = new ContactDataShape("Default"); public static final ContactDataShape AllProperties = new ContactDataShape("AllProperties"); } davmail-6.3.0/src/java/davmail/exchange/ews/ContainmentComparison.java0100644 0000000 0000000 00000004055 13452623365 024563 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Contains comparison mode. */ @SuppressWarnings({"UnusedDeclaration"}) public final class ContainmentComparison extends AttributeOption { private ContainmentComparison(String value) { super("ContainmentComparison", value); } public static final ContainmentComparison Exact = new ContainmentComparison("Exact"); public static final ContainmentComparison IgnoreCase = new ContainmentComparison("IgnoreCase"); public static final ContainmentComparison IgnoreNonSpacingCharacters = new ContainmentComparison("IgnoreNonSpacingCharacters"); public static final ContainmentComparison Loose = new ContainmentComparison("Loose"); public static final ContainmentComparison IgnoreCaseAndNonSpacingCharacters = new ContainmentComparison("IgnoreCaseAndNonSpacingCharacters"); public static final ContainmentComparison LooseAndIgnoreCase = new ContainmentComparison("LooseAndIgnoreCase"); public static final ContainmentComparison LooseAndIgnoreNonSpace = new ContainmentComparison("LooseAndIgnoreNonSpace"); public static final ContainmentComparison LooseAndIgnoreCaseAndIgnoreNonSpace = new ContainmentComparison("LooseAndIgnoreCaseAndIgnoreNonSpace"); } davmail-6.3.0/src/java/davmail/exchange/ews/ContainmentMode.java0100644 0000000 0000000 00000003330 13452623365 023330 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Contains search mode. */ @SuppressWarnings({"UnusedDeclaration"}) public final class ContainmentMode extends AttributeOption { private ContainmentMode(String value) { super("ContainmentMode", value); } @Override public String toString() { return value; } /** * Full String. */ public static final ContainmentMode FullString = new ContainmentMode("FullString"); /** * Starts with. */ public static final ContainmentMode Prefixed = new ContainmentMode("Prefixed"); /** * Contains */ public static final ContainmentMode Substring = new ContainmentMode("Substring"); public static final ContainmentMode PrefixOnWords = new ContainmentMode("PrefixOnWords"); public static final ContainmentMode ExactPhrase = new ContainmentMode("ExactPhrase"); } davmail-6.3.0/src/java/davmail/exchange/ews/ConvertIdMethod.java0100644 0000000 0000000 00000004403 13445647074 023311 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.XMLStreamUtil; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; /** * ConvertId implementation to retrieve primary mailbox address */ public class ConvertIdMethod extends EWSMethod { /** * Build Resolve Names method * * @param value search value */ public ConvertIdMethod(String value) { super("SourceIds", "ConvertId", "ResponseMessages"); addMethodOption(new AttributeOption("DestinationFormat", "EwsId")); unresolvedEntry = new ElementOption("m:SourceIds", new AlternateId("EwsId", value)); } @Override protected Item handleItem(XMLStreamReader reader) throws XMLStreamException { Item responseItem = new Item(); responseItem.type = "AlternateId"; // skip to AlternateId while (reader.hasNext() && !XMLStreamUtil.isStartTag(reader, "AlternateId")) { reader.next(); } if (XMLStreamUtil.isStartTag(reader, "AlternateId")) { String mailbox = reader.getAttributeValue(null, "Mailbox"); if (mailbox != null) { responseItem.put("Mailbox", mailbox); } while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "AlternateId")) { reader.next(); } } return responseItem; } } davmail-6.3.0/src/java/davmail/exchange/ews/CopyItemMethod.java0100644 0000000 0000000 00000003146 12564151517 023141 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.List; /** * Copy item to another folder. */ public class CopyItemMethod extends EWSMethod { /** * Copy item method. * * @param itemId item id * @param toFolderId target folder id */ public CopyItemMethod(ItemId itemId, FolderId toFolderId) { super("Item", "CopyItem"); this.itemId = itemId; this.toFolderId = toFolderId; } /** * Copy items to target folder. * * @param itemIds item id list * @param toFolderId target folder id */ public CopyItemMethod(List itemIds, FolderId toFolderId) { super("Item", "CopyItem"); this.itemIds = itemIds; this.toFolderId = toFolderId; } } davmail-6.3.0/src/java/davmail/exchange/ews/CreateAttachmentMethod.java0100644 0000000 0000000 00000002475 12564151517 024630 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Create Attachment Method. */ public class CreateAttachmentMethod extends EWSMethod { /** * Create attachment method. * * @param parentItemId parent item id * @param attachment attachment object */ public CreateAttachmentMethod(ItemId parentItemId, FileAttachment attachment) { super("Item", "CreateAttachment"); this.parentItemId = parentItemId; this.attachment = attachment; } } davmail-6.3.0/src/java/davmail/exchange/ews/CreateFolderMethod.java0100644 0000000 0000000 00000002427 12564151517 023750 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Create Folder method. */ public class CreateFolderMethod extends EWSMethod { /** * Update folder method. * * @param parentFolderId parent folder id * @param item folder item */ public CreateFolderMethod(FolderId parentFolderId, Item item) { super("Folder", "CreateFolder"); this.parentFolderId = parentFolderId; this.item = item; } } davmail-6.3.0/src/java/davmail/exchange/ews/CreateItemMethod.java0100644 0000000 0000000 00000004446 13760150366 023436 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.Settings; import org.apache.http.entity.AbstractHttpEntity; /** * Create Item method. */ public class CreateItemMethod extends EWSMethod { /** * Create exchange item. * * @param messageDisposition save or send option * @param savedItemFolderId saved item folder id * @param item item content */ public CreateItemMethod(MessageDisposition messageDisposition, FolderId savedItemFolderId, EWSMethod.Item item) { super("Item", "CreateItem"); this.savedItemFolderId = savedItemFolderId; this.item = item; addMethodOption(messageDisposition); ((AbstractHttpEntity)getEntity()).setChunked(Settings.getBooleanProperty("davmail.enableChunkedRequest", false)); } /** * Create exchange item. * * @param messageDisposition save or send option * @param sendMeetingInvitations send invitation option * @param savedItemFolderId saved item folder id * @param item item content */ public CreateItemMethod(MessageDisposition messageDisposition, SendMeetingInvitations sendMeetingInvitations, FolderId savedItemFolderId, EWSMethod.Item item) { super("Item", "CreateItem"); this.savedItemFolderId = savedItemFolderId; this.item = item; addMethodOption(messageDisposition); addMethodOption(sendMeetingInvitations); } } davmail-6.3.0/src/java/davmail/exchange/ews/DeleteAttachmentMethod.java0100644 0000000 0000000 00000002314 12564151517 024617 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Delete attachment method. */ public class DeleteAttachmentMethod extends EWSMethod { /** * Delete attachment method. * * @param attachmentId attachment id */ public DeleteAttachmentMethod(String attachmentId) { super("Item", "DeleteAttachment"); this.attachmentId = attachmentId; } } davmail-6.3.0/src/java/davmail/exchange/ews/DeleteFolderMethod.java0100644 0000000 0000000 00000002330 12564151517 023740 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Delete Folder method. */ public class DeleteFolderMethod extends EWSMethod { /** * Delete folder method. * * @param folderId folder id */ public DeleteFolderMethod(FolderId folderId) { super("Folder", "DeleteFolder"); this.folderId = folderId; this.deleteType = Disposal.HardDelete; } } davmail-6.3.0/src/java/davmail/exchange/ews/DeleteItemMethod.java0100644 0000000 0000000 00000003016 12564151517 023425 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Delete Item method. */ public class DeleteItemMethod extends EWSMethod { /** * Delete item method. * * @param itemId item id * @param deleteType delete mode * @param sendMeetingCancellations send meeting cancellation notifications */ public DeleteItemMethod(ItemId itemId, DeleteType deleteType, SendMeetingCancellations sendMeetingCancellations) { super("Item", "DeleteItem"); addMethodOption(deleteType); addMethodOption(sendMeetingCancellations); addMethodOption(AffectedTaskOccurrences.AllOccurrences); this.itemId = itemId; } } davmail-6.3.0/src/java/davmail/exchange/ews/DeleteType.java0100644 0000000 0000000 00000002513 13452623365 022312 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * DeleteItem disposal type. */ @SuppressWarnings({"UnusedDeclaration"}) public final class DeleteType extends AttributeOption { private DeleteType(String value) { super("DeleteType", value); } public static final DeleteType HardDelete = new DeleteType("HardDelete"); public static final DeleteType SoftDelete = new DeleteType("SoftDelete"); public static final DeleteType MoveToDeletedItems = new DeleteType("MoveToDeletedItems"); } davmail-6.3.0/src/java/davmail/exchange/ews/Disposal.java0100644 0000000 0000000 00000002453 13452623365 022027 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Disposal. */ @SuppressWarnings({"UnusedDeclaration"}) public final class Disposal extends AttributeOption { private Disposal(String value) { super("DeleteType", value); } public static final Disposal HardDelete = new Disposal("HardDelete"); public static final Disposal SoftDelete = new Disposal("SoftDelete"); public static final Disposal MoveToDeletedItems = new Disposal("MoveToDeletedItems"); } davmail-6.3.0/src/java/davmail/exchange/ews/DistinguishedFolderId.java0100644 0000000 0000000 00000004470 13574116520 024461 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.HashMap; import java.util.Map; /** * Distinguished Folder Id. */ public final class DistinguishedFolderId extends FolderId { private DistinguishedFolderId(String value) { super("t:DistinguishedFolderId", value, null); } private DistinguishedFolderId(String value, String mailbox) { super("t:DistinguishedFolderId", value, null, mailbox); } /** * DistinguishedFolderId names */ @SuppressWarnings({"UnusedDeclaration"}) public enum Name { calendar, contacts, deleteditems, drafts, inbox, journal, notes, outbox, sentitems, tasks, msgfolderroot, publicfoldersroot, root, junkemail, searchfolders, voicemail, archivemsgfolderroot } private static final Map folderIdMap = new HashMap<>(); static { for (Name name : Name.values()) { folderIdMap.put(name, new DistinguishedFolderId(name.toString())); } } /** * Get DistinguishedFolderId object for mailbox and name. * * @param mailbox mailbox name * @param name folder id name * @return DistinguishedFolderId object */ public static DistinguishedFolderId getInstance(String mailbox, Name name) { if (mailbox == null) { return folderIdMap.get(name); } else { return new DistinguishedFolderId(name.toString(), mailbox); } } }davmail-6.3.0/src/java/davmail/exchange/ews/EWSException.java0100644 0000000 0000000 00000002234 12564151517 022561 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; /** * EWS Exception */ public class EWSException extends IOException { /** * Create EWS Exception with detailed error message * * @param message error message */ public EWSException(String message) { super(message); } } davmail-6.3.0/src/java/davmail/exchange/ews/EWSMethod.java0100644 0000000 0000000 00000137323 14754153476 022064 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.BundleMessage; import davmail.Settings; import davmail.exchange.XMLStreamUtil; import davmail.http.HttpClientAdapter; import davmail.ui.tray.DavGatewayTray; import davmail.util.StringUtil; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.ContentType; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.codehaus.stax2.typed.TypedXMLStreamReader; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.zip.GZIPInputStream; /** * EWS SOAP method. */ public abstract class EWSMethod extends HttpPost implements ResponseHandler { protected static final String CONTENT_TYPE = ContentType.create("text/xml", StandardCharsets.UTF_8).toString(); protected static final Logger LOGGER = Logger.getLogger(EWSMethod.class); protected static final int CHUNK_LENGTH = 131072; protected FolderQueryTraversal traversal; protected BaseShape baseShape; protected boolean includeMimeContent; protected FolderId folderId; protected FolderId savedItemFolderId; protected FolderId toFolderId; protected FolderId parentFolderId; protected ItemId itemId; protected List itemIds; protected ItemId parentItemId; protected Set additionalProperties; protected Disposal deleteType; protected Set methodOptions; protected ElementOption unresolvedEntry; // paging request protected int maxCount; protected int offset; // paging response protected boolean includesLastItemInRange; protected List updates; protected FileAttachment attachment; protected String attachmentId; protected final String itemType; protected final String methodName; protected final String responseCollectionName; protected List responseItems; protected String errorDetail; protected String errorDescription; protected String errorValue; protected long backOffMilliseconds; protected Item item; protected SearchExpression searchExpression; protected FieldOrder fieldOrder; protected String serverVersion; protected String timezoneContext; private HttpResponse response; /** * Build EWS method * * @param itemType item type * @param methodName method name */ public EWSMethod(String itemType, String methodName) { this(itemType, methodName, itemType + 's'); } /** * Build EWS method * * @param itemType item type * @param methodName method name * @param responseCollectionName item response collection name */ public EWSMethod(String itemType, String methodName, String responseCollectionName) { super(URI.create("/ews/exchange.asmx")); this.itemType = itemType; this.methodName = methodName; this.responseCollectionName = responseCollectionName; if (Settings.getBooleanProperty("davmail.acceptEncodingGzip", true) && !Level.DEBUG.toString().equals(Settings.getProperty("log4j.logger.httpclient.wire"))) { setHeader("Accept-Encoding", "gzip"); } AbstractHttpEntity httpEntity = new AbstractHttpEntity() { byte[] content; @Override public boolean isRepeatable() { return true; } @Override public long getContentLength() { if (content == null) { content = generateSoapEnvelope(); } return content.length; } @Override public InputStream getContent() throws UnsupportedOperationException { if (content == null) { content = generateSoapEnvelope(); } return new ByteArrayInputStream(content); } @Override public void writeTo(OutputStream outputStream) throws IOException { boolean firstPass = content == null; if (content == null) { content = generateSoapEnvelope(); } if (content.length < CHUNK_LENGTH) { outputStream.write(content); } else { int i = 0; while (i < content.length) { int length = CHUNK_LENGTH; if (i + CHUNK_LENGTH > content.length) { length = content.length - i; } outputStream.write(content, i, length); if (!firstPass) { DavGatewayTray.debug(new BundleMessage("LOG_UPLOAD_PROGRESS", String.valueOf((i + length) / 1024), (i + length) * 100 / content.length)); DavGatewayTray.switchIcon(); } i += CHUNK_LENGTH; } } } @Override public boolean isStreaming() { return false; } }; httpEntity.setContentType(CONTENT_TYPE); setEntity(httpEntity); } protected void addAdditionalProperty(FieldURI additionalProperty) { if (additionalProperties == null) { additionalProperties = new HashSet<>(); } additionalProperties.add(additionalProperty); } protected void addMethodOption(AttributeOption attributeOption) { if (methodOptions == null) { methodOptions = new HashSet<>(); } methodOptions.add(attributeOption); } protected void setSearchExpression(SearchExpression searchExpression) { this.searchExpression = searchExpression; } protected void setFieldOrder(FieldOrder fieldOrder) { this.fieldOrder = fieldOrder; } protected void writeShape(Writer writer) throws IOException { if (baseShape != null) { writer.write(""); baseShape.write(writer); if (includeMimeContent) { writer.write("true"); } if (additionalProperties != null) { writer.write(""); StringBuilder buffer = new StringBuilder(); for (FieldURI fieldURI : additionalProperties) { fieldURI.appendTo(buffer); } writer.write(buffer.toString()); writer.write(""); } writer.write(""); } } protected void writeItemId(Writer writer) throws IOException { if (itemId != null || itemIds != null) { if (updates == null) { writer.write(""); } if (itemId != null) { itemId.write(writer); } if (itemIds != null) { for (ItemId localItemId : itemIds) { localItemId.write(writer); } } if (updates == null) { writer.write(""); } } } protected void writeParentItemId(Writer writer) throws IOException { if (parentItemId != null) { writer.write(""); } } protected void writeFolderId(Writer writer) throws IOException { if (folderId != null) { if (updates == null) { writer.write(""); } folderId.write(writer); if (updates == null) { writer.write(""); } } } protected void writeSavedItemFolderId(Writer writer) throws IOException { if (savedItemFolderId != null) { writer.write(""); savedItemFolderId.write(writer); writer.write(""); } } protected void writeToFolderId(Writer writer) throws IOException { if (toFolderId != null) { writer.write(""); toFolderId.write(writer); writer.write(""); } } protected void writeParentFolderId(Writer writer) throws IOException { if (parentFolderId != null) { writer.write(""); parentFolderId.write(writer); writer.write(""); } } protected void writeItem(Writer writer) throws IOException { if (item != null) { writer.write(""); item.write(writer); writer.write(""); } } protected void writeRestriction(Writer writer) throws IOException { if (searchExpression != null) { writer.write(""); StringBuilder buffer = new StringBuilder(); searchExpression.appendTo(buffer); writer.write(buffer.toString()); writer.write(""); } } protected void writeSortOrder(Writer writer) throws IOException { if (fieldOrder != null) { writer.write(""); StringBuilder buffer = new StringBuilder(); fieldOrder.appendTo(buffer); writer.write(buffer.toString()); writer.write(""); } } protected void startChanges(Writer writer) throws IOException { //noinspection VariableNotUsedInsideIf if (updates != null) { writer.write(""); writer.write(""); } } protected void writeUpdates(Writer writer) throws IOException { if (updates != null) { writer.write(""); for (FieldUpdate fieldUpdate : updates) { fieldUpdate.write(itemType, writer); } writer.write(""); } } protected void writeUnresolvedEntry(Writer writer) throws IOException { if (unresolvedEntry != null) { unresolvedEntry.write(writer); } } protected void endChanges(Writer writer) throws IOException { //noinspection VariableNotUsedInsideIf if (updates != null) { writer.write(""); writer.write(""); } } protected byte[] generateSoapEnvelope() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { OutputStreamWriter writer = new OutputStreamWriter(baos, StandardCharsets.UTF_8); writer.write(""); writer.write(""); if (serverVersion != null) { writer.write(""); } if (timezoneContext != null) { writer.write(""); } writer.write(""); writer.write(""); writer.write(""); writeSoapBody(writer); writer.write(""); writer.write("" + ""); writer.flush(); } catch (IOException e) { throw new RuntimeException(e); } return baos.toByteArray(); } protected void writeSoapBody(Writer writer) throws IOException { startChanges(writer); writeShape(writer); writeIndexedPageView(writer); writeRestriction(writer); writeSortOrder(writer); writeParentFolderId(writer); writeToFolderId(writer); writeItemId(writer); writeParentItemId(writer); writeAttachments(writer); writeAttachmentId(writer); writeFolderId(writer); writeSavedItemFolderId(writer); writeItem(writer); writeUpdates(writer); writeUnresolvedEntry(writer); endChanges(writer); } protected void writeIndexedPageView(Writer writer) throws IOException { if (maxCount > 0) { writer.write(""); } } protected void writeAttachmentId(Writer writer) throws IOException { if (attachmentId != null) { if ("CreateAttachment".equals(methodName)) { writer.write(""); writer.write("true"); writer.write(""); } writer.write(""); writer.write(""); writer.write(""); } } protected void writeAttachments(Writer writer) throws IOException { if (attachment != null) { writer.write(""); attachment.write(writer); writer.write(""); } } /** * Get Exchange server version, Exchange2013, Exchange2010 or Exchange2007_SP1 * * @return server version */ public String getServerVersion() { return serverVersion; } /** * Set Exchange server version, Exchange2010 or Exchange2007_SP1 * * @param serverVersion server version */ public void setServerVersion(String serverVersion) { this.serverVersion = serverVersion; } /** * Set Exchange timezone context * * @param timezoneContext user timezone context */ public void setTimezoneContext(String timezoneContext) { this.timezoneContext = timezoneContext; } /** * Meeting attendee object */ public static class Attendee { /** * attendee role */ public String role; /** * attendee email address */ public String email; /** * attendee participation status */ public String partstat; /** * attendee fullname */ public String name; } /** * Recurring event occurrence */ public static class Occurrence { /** * Original occurence start date */ public String originalStart; /** * Occurence itemid */ public ItemId itemId; } /** * Item */ public static class Item extends HashMap { /** * Item type. */ public String type; protected byte[] mimeContent; protected List fieldUpdates; protected List attachments; protected List attendees; protected final List fieldNames = new ArrayList<>(); protected List occurrences; protected List members; protected ItemId referenceItemId; @Override public String toString() { return "type: " + type + ' ' + super.toString(); } @Override public String put(String key, String value) { if (value != null) { if (get(key) == null) { fieldNames.add(key); } return super.put(key, value); } else { return null; } } /** * Write XML content to writer. * * @param writer writer * @throws IOException on error */ public void write(Writer writer) throws IOException { writer.write(""); if (mimeContent != null) { writer.write(""); for (byte c : mimeContent) { writer.write(c); } writer.write(""); } // write ordered fields for (String key : fieldNames) { if ("MeetingTimeZone".equals(key)) { writer.write(""); } else if ("StartTimeZone".equals(key)) { writer.write(""); } else if ("Body".equals(key)) { writer.write(""); writer.write(StringUtil.xmlEncode(get(key))); writer.write(""); } else { writer.write(""); writer.write(StringUtil.xmlEncode(get(key))); writer.write(""); } } if (fieldUpdates != null) { for (FieldUpdate fieldUpdate : fieldUpdates) { fieldUpdate.write(null, writer); } } if (referenceItemId != null) { referenceItemId.write(writer); } writer.write(""); } /** * Field updates. * * @param fieldUpdates field updates */ public void setFieldUpdates(List fieldUpdates) { this.fieldUpdates = fieldUpdates; } /** * Get property value as int * * @param key property response name * @return property value */ public int getInt(String key) { int result = 0; String value = get(key); if (value != null && !value.isEmpty()) { result = Integer.parseInt(value); } return result; } /** * Get property value as long * * @param key property response name * @return property value */ public long getLong(String key) { long result = 0; String value = get(key); if (value != null && !value.isEmpty()) { result = Long.parseLong(value); } return result; } /** * Get property value as boolean * * @param key property response name * @return property value */ public boolean getBoolean(String key) { boolean result = false; String value = get(key); if (value != null && !value.isEmpty()) { result = Boolean.parseBoolean(value); } return result; } /** * Get file attachment by file name * * @param attachmentName attachment name * @return attachment */ public FileAttachment getAttachmentByName(String attachmentName) { FileAttachment result = null; if (attachments != null) { for (FileAttachment fileAttachment : attachments) { if (attachmentName.equals(fileAttachment.name)) { result = fileAttachment; break; } } } return result; } /** * Get all attendees. * * @return all attendees */ public List getAttendees() { return attendees; } /** * Add attendee. * * @param attendee attendee object */ public void addAttendee(Attendee attendee) { if (attendees == null) { attendees = new ArrayList<>(); } attendees.add(attendee); } /** * Add occurrence. * * @param occurrence event occurence */ public void addOccurrence(Occurrence occurrence) { if (occurrences == null) { occurrences = new ArrayList<>(); } occurrences.add(occurrence); } /** * Get occurences. * * @return event occurences */ public List getOccurrences() { return occurrences; } /** * Add member. * * @param member list member */ public void addMember(String member) { if (members == null) { members = new ArrayList<>(); } members.add(member); } /** * Get members. * * @return event members */ public List getMembers() { return members; } } /** * Check method success. * * @throws EWSException on error */ public void checkSuccess() throws EWSException { if ("The server cannot service this request right now. Try again later.".equals(errorDetail)) { throw new EWSThrottlingException(errorDetail); } if (errorDetail != null && (!"ErrorAccessDenied".equals(errorDetail) && !"ErrorMailRecipientNotFound".equals(errorDetail) && !"ErrorItemNotFound".equals(errorDetail) && !"ErrorCalendarOccurrenceIsDeletedFromRecurrence".equals(errorDetail) )) { throw new EWSException(errorDetail + ' ' + ((errorDescription != null) ? errorDescription : "") + ' ' + ((errorValue != null) ? errorValue : "") + "\n request: " + new String(generateSoapEnvelope(), StandardCharsets.UTF_8)); } if (getStatusCode() == HttpStatus.SC_BAD_REQUEST || getStatusCode() == HttpStatus.SC_INSUFFICIENT_STORAGE) { throw new EWSException(response.getStatusLine().getReasonPhrase()); } } public int getStatusCode() { if ("ErrorAccessDenied".equals(errorDetail)) { return HttpStatus.SC_FORBIDDEN; } else if ("ErrorItemNotFound".equals(errorDetail)) { return HttpStatus.SC_NOT_FOUND; } else { return response.getStatusLine().getStatusCode(); } } /** * Get response items. * * @return response items * @throws EWSException on error */ public List getResponseItems() throws EWSException { checkSuccess(); if (responseItems != null) { return responseItems; } else { return new ArrayList<>(); } } /** * Get single response item. * * @return response item * @throws EWSException on error */ public Item getResponseItem() throws EWSException { checkSuccess(); if (responseItems != null && !responseItems.isEmpty()) { return responseItems.get(0); } else { return null; } } /** * Get response mime content. * * @return mime content * @throws EWSException on error */ public byte[] getMimeContent() throws EWSException { checkSuccess(); Item responseItem = getResponseItem(); if (responseItem != null) { return responseItem.mimeContent; } else { return null; } } protected String handleTag(XMLStreamReader reader, String localName) throws XMLStreamException { StringBuilder result = null; int event = reader.getEventType(); if (event == XMLStreamConstants.START_ELEMENT && localName.equals(reader.getLocalName())) { result = new StringBuilder(); while (reader.hasNext() && !((event == XMLStreamConstants.END_ELEMENT && localName.equals(reader.getLocalName())))) { event = reader.next(); if (event == XMLStreamConstants.CHARACTERS) { result.append(reader.getText()); } else if ("MessageXml".equals(localName) && event == XMLStreamConstants.START_ELEMENT) { String attributeValue = null; for (int i = 0; i < reader.getAttributeCount(); i++) { if (result.length() > 0) { result.append(", "); } attributeValue = reader.getAttributeValue(i); result.append(reader.getAttributeLocalName(i)).append(": ").append(reader.getAttributeValue(i)); } // catch BackOffMilliseconds value if ("BackOffMilliseconds".equals(attributeValue)) { try { backOffMilliseconds = Long.parseLong(reader.getElementText()); } catch (NumberFormatException e) { LOGGER.error("Unable to parse BackOffMilliseconds"); } } } } } if (result != null && result.length() > 0) { return result.toString(); } else { return null; } } protected void handleErrors(XMLStreamReader reader) throws XMLStreamException { String result = handleTag(reader, "ResponseCode"); // store error description String messageText = handleTag(reader, "MessageText"); if (messageText != null) { errorDescription = messageText; } String messageXml = handleTag(reader, "MessageXml"); if (messageXml != null) { // contains BackOffMilliseconds on ErrorServerBusy errorValue = messageXml; } if (errorDetail == null && result != null && !"NoError".equals(result) && !"ErrorNameResolutionMultipleResults".equals(result) && !"ErrorNameResolutionNoResults".equals(result) && !"ErrorFolderExists".equals(result) ) { errorDetail = result; } if (XMLStreamUtil.isStartTag(reader, "faultstring")) { errorDetail = XMLStreamUtil.getElementText(reader); } } protected Item handleItem(XMLStreamReader reader) throws XMLStreamException { Item responseItem = new Item(); responseItem.type = reader.getLocalName(); while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, responseItem.type)) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); String value = null; if ("ExtendedProperty".equals(tagLocalName)) { addExtendedPropertyValue(reader, responseItem); } else if ("Members".equals(tagLocalName)) { handleMembers(reader, responseItem); } else if (tagLocalName.endsWith("MimeContent")) { handleMimeContent(reader, responseItem); } else if ("Attachments".equals(tagLocalName)) { responseItem.attachments = handleAttachments(reader); } else if ("EmailAddresses".equals(tagLocalName)) { handleEmailAddresses(reader, responseItem); } else if ("RequiredAttendees".equals(tagLocalName) || "OptionalAttendees".equals(tagLocalName)) { handleAttendees(reader, responseItem, tagLocalName); } else if ("ModifiedOccurrences".equals(tagLocalName)) { handleModifiedOccurrences(reader, responseItem); } else { if (tagLocalName.endsWith("Id")) { value = getAttributeValue(reader, "Id"); // get change key responseItem.put("ChangeKey", getAttributeValue(reader, "ChangeKey")); } if (value == null) { value = getTagContent(reader); } if (value != null) { responseItem.put(tagLocalName, value); } } } } return responseItem; } protected void handleEmailAddresses(XMLStreamReader reader, Item item) throws XMLStreamException { while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "EmailAddresses"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Entry".equals(tagLocalName)) { item.put(reader.getAttributeValue(null, "Key"), XMLStreamUtil.getElementText(reader)); } } } } protected void handleAttendees(XMLStreamReader reader, Item item, String attendeeType) throws XMLStreamException { while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, attendeeType))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Attendee".equals(tagLocalName)) { handleAttendee(reader, item, attendeeType); } } } } protected void handleModifiedOccurrences(XMLStreamReader reader, Item item) throws XMLStreamException { while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "ModifiedOccurrences"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Occurrence".equals(tagLocalName)) { handleOccurrence(reader, item); } } } } protected void handleOccurrence(XMLStreamReader reader, Item item) throws XMLStreamException { Occurrence occurrence = new Occurrence(); while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "Occurrence"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("ItemId".equals(tagLocalName)) { occurrence.itemId = new ItemId("ItemId", getAttributeValue(reader, "Id"), getAttributeValue(reader, "ChangeKey")); } if ("OriginalStart".equals(tagLocalName)) { occurrence.originalStart = XMLStreamUtil.getElementText(reader); } } } item.addOccurrence(occurrence); } protected void handleMembers(XMLStreamReader reader, Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Members")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Member".equals(tagLocalName)) { handleMember(reader, responseItem); } } } } protected void handleMember(XMLStreamReader reader, Item responseItem) throws XMLStreamException { String member = null; while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Member")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("EmailAddress".equals(tagLocalName) && member == null) { member = "mailto:" + XMLStreamUtil.getElementText(reader); } } } if (member != null) { responseItem.addMember(member); } } /** * Convert response type to partstat value * * @param responseType response type * @return partstat value */ public static String responseTypeToPartstat(String responseType) { if ("Accept".equals(responseType) || "Organizer".equals(responseType)) { return "ACCEPTED"; } else if ("Tentative".equals(responseType)) { return "TENTATIVE"; } else if ("Decline".equals(responseType)) { return "DECLINED"; } else { return "NEEDS-ACTION"; } } protected void handleAttendee(XMLStreamReader reader, Item item, String attendeeType) throws XMLStreamException { Attendee attendee = new Attendee(); if ("RequiredAttendees".equals(attendeeType)) { attendee.role = "REQ-PARTICIPANT"; } else { attendee.role = "OPT-PARTICIPANT"; } while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "Attendee"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("EmailAddress".equals(tagLocalName)) { attendee.email = reader.getElementText(); } else if ("Name".equals(tagLocalName)) { attendee.name = XMLStreamUtil.getElementText(reader); } else if ("ResponseType".equals(tagLocalName)) { String responseType = XMLStreamUtil.getElementText(reader); attendee.partstat = responseTypeToPartstat(responseType); } } } item.addAttendee(attendee); } protected List handleAttachments(XMLStreamReader reader) throws XMLStreamException { List attachments = new ArrayList<>(); while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "Attachments"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("FileAttachment".equals(tagLocalName)) { attachments.add(handleFileAttachment(reader)); } } } return attachments; } protected FileAttachment handleFileAttachment(XMLStreamReader reader) throws XMLStreamException { FileAttachment fileAttachment = new FileAttachment(); while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "FileAttachment"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("AttachmentId".equals(tagLocalName)) { fileAttachment.attachmentId = getAttributeValue(reader, "Id"); } else if ("Name".equals(tagLocalName)) { fileAttachment.name = getTagContent(reader); } else if ("ContentType".equals(tagLocalName)) { fileAttachment.contentType = getTagContent(reader); } } } return fileAttachment; } protected void handleMimeContent(XMLStreamReader reader, Item responseItem) throws XMLStreamException { if (reader instanceof TypedXMLStreamReader) { // Stax2 parser: use enhanced base64 conversion responseItem.mimeContent = ((TypedXMLStreamReader) reader).getElementAsBinary(); } else { // failover: slow and memory consuming conversion responseItem.mimeContent = Base64.decodeBase64(reader.getElementText().getBytes(StandardCharsets.US_ASCII)); } } protected void addExtendedPropertyValue(XMLStreamReader reader, Item item) throws XMLStreamException { String propertyTag = null; String propertyValue = null; while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "ExtendedProperty"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("ExtendedFieldURI".equals(tagLocalName)) { propertyTag = getAttributeValue(reader, "PropertyTag"); // property name is in PropertyId or PropertyName with DistinguishedPropertySetId if (propertyTag == null) { propertyTag = getAttributeValue(reader, "PropertyId"); } if (propertyTag == null) { propertyTag = getAttributeValue(reader, "PropertyName"); } } else if ("Value".equals(tagLocalName)) { propertyValue = XMLStreamUtil.getElementText(reader); } else if ("Values".equals(tagLocalName)) { StringBuilder buffer = new StringBuilder(); while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "Values"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { if (buffer.length() > 0) { buffer.append(','); } String singleValue = XMLStreamUtil.getElementText(reader); if (singleValue != null) { buffer.append(singleValue); } } } propertyValue = buffer.toString(); } } } if ((propertyTag != null) && (propertyValue != null)) { item.put(propertyTag, propertyValue); } } protected String getTagContent(XMLStreamReader reader) throws XMLStreamException { String tagLocalName = reader.getLocalName(); while (reader.hasNext() && !(reader.getEventType() == XMLStreamConstants.END_ELEMENT)) { reader.next(); if (reader.getEventType() == XMLStreamConstants.CHARACTERS) { return reader.getText(); } } // empty tag if (reader.hasNext()) { return null; } else { throw new XMLStreamException("End element for " + tagLocalName + " not found"); } } protected String getAttributeValue(XMLStreamReader reader, String attributeName) { for (int i = 0; i < reader.getAttributeCount(); i++) { if (attributeName.equals(reader.getAttributeLocalName(i))) { return reader.getAttributeValue(i); } } return null; } @Override public EWSMethod handleResponse(HttpResponse response) { this.response = response; org.apache.http.Header contentTypeHeader = response.getFirstHeader("Content-Type"); if (contentTypeHeader != null && "text/xml; charset=utf-8".equals(contentTypeHeader.getValue())) { try ( InputStream inputStream = response.getEntity().getContent() ) { if (HttpClientAdapter.isGzipEncoded(response)) { processResponseStream(new GZIPInputStream(inputStream)); } else { processResponseStream(inputStream); } } catch (IOException e) { LOGGER.error("Error while parsing soap response: " + e, e); } } return this; } protected void processResponseStream(InputStream inputStream) { responseItems = new ArrayList<>(); XMLStreamReader reader = null; try { inputStream = new FilterInputStream(inputStream) { int totalCount; int lastLogCount; @Override public int read(byte[] buffer, int offset, int length) throws IOException { int count = super.read(buffer, offset, length); totalCount += count; if (totalCount - lastLogCount > 1024 * 128) { DavGatewayTray.debug(new BundleMessage("LOG_DOWNLOAD_PROGRESS", String.valueOf(totalCount / 1024), EWSMethod.this.getURI())); DavGatewayTray.switchIcon(); lastLogCount = totalCount; } /*if (count > 0 && LOGGER.isDebugEnabled()) { LOGGER.debug(new String(buffer, offset, count, "UTF-8")); }*/ return count; } }; reader = XMLStreamUtil.createXMLStreamReader(inputStream); while (reader.hasNext()) { reader.next(); handleErrors(reader); if (serverVersion == null && XMLStreamUtil.isStartTag(reader, "ServerVersionInfo")) { String majorVersion = getAttributeValue(reader, "MajorVersion"); String minorVersion = getAttributeValue(reader, "MinorVersion"); if ("15".equals(majorVersion)) { if ("0".equals(minorVersion)) { serverVersion = "Exchange2013"; } else { serverVersion = "Exchange2013_SP1"; } } else if ("14".equals(majorVersion)) { if ("0".equals(minorVersion)) { serverVersion = "Exchange2010"; } else { serverVersion = "Exchange2010_SP1"; } } else { serverVersion = "Exchange2007_SP1"; } } else if (XMLStreamUtil.isStartTag(reader, "RootFolder")) { includesLastItemInRange = "true".equals(reader.getAttributeValue(null, "IncludesLastItemInRange")); } else if (XMLStreamUtil.isStartTag(reader, responseCollectionName)) { handleItems(reader); } else { handleCustom(reader); } } } catch (XMLStreamException e) { errorDetail = e.getMessage(); LOGGER.error("Error while parsing soap response: " + e, e); if (reader != null) { try { String content = reader.getText(); if (content != null && content.length() > 4096) { content = content.substring(0, 4096)+" ..."; } LOGGER.debug("Current text: " + content); } catch (IllegalStateException ise) { LOGGER.error(e + " " + e.getMessage()); } } } if (errorDetail != null) { LOGGER.debug(errorDetail); } } @SuppressWarnings({"NoopMethodInAbstractClass"}) protected void handleCustom(XMLStreamReader reader) throws XMLStreamException { // override to handle custom content } private void handleItems(XMLStreamReader reader) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, responseCollectionName)) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { responseItems.add(handleItem(reader)); } } } } davmail-6.3.0/src/java/davmail/exchange/ews/EWSThrottlingException.java0100644 0000000 0000000 00000002252 12702212011 024615 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Exchange throttling error. */ public class EWSThrottlingException extends EWSException { /** * Create EWS throttling Exception with detailed error message * * @param message error message */ public EWSThrottlingException(String message) { super(message); } }davmail-6.3.0/src/java/davmail/exchange/ews/ElementOption.java0100644 0000000 0000000 00000003526 12616753354 023040 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.util.StringUtil; import java.io.IOException; import java.io.Writer; /** * Generic element option. */ public class ElementOption extends Option { ElementOption option; /** * Create element option. * * @param name element tag name * @param value element value */ protected ElementOption(String name, String value) { super(name, value); } protected ElementOption(String name, ElementOption option) { super(name, null); this.option = option; } /** * @inheritDoc */ @Override public void write(Writer writer) throws IOException { writer.write('<'); writer.write(name); writer.write('>'); if (option != null) { option.write(writer); } else { writer.write(StringUtil.xmlEncode(value)); } writer.write("'); } } davmail-6.3.0/src/java/davmail/exchange/ews/EwsExchangeSession.java0100644 0000000 0000000 00000465431 14757042647 024036 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.BundleMessage; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exception.DavMailException; import davmail.exception.HttpNotFoundException; import davmail.exchange.ExchangeSession; import davmail.exchange.VCalendar; import davmail.exchange.VObject; import davmail.exchange.VProperty; import davmail.exchange.auth.O365Token; import davmail.http.HttpClientAdapter; import davmail.http.request.GetRequest; import davmail.ui.NotificationDialog; import davmail.util.IOUtil; import davmail.util.StringUtil; import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.util.SharedByteArrayInputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URI; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * EWS Exchange adapter. * Compatible with Exchange 2007, 2010 and 2013. */ public class EwsExchangeSession extends ExchangeSession { protected static final int PAGE_SIZE = 500; protected static final String ARCHIVE_ROOT = "/archive/"; /** * Message types. * * @see * http://msdn.microsoft.com/en-us/library/aa565652%28v=EXCHG.140%29.aspx */ protected static final Set MESSAGE_TYPES = new HashSet<>(); static { MESSAGE_TYPES.add("Message"); MESSAGE_TYPES.add("CalendarItem"); MESSAGE_TYPES.add("MeetingMessage"); MESSAGE_TYPES.add("MeetingRequest"); MESSAGE_TYPES.add("MeetingResponse"); MESSAGE_TYPES.add("MeetingCancellation"); MESSAGE_TYPES.add("Item"); MESSAGE_TYPES.add("PostItem"); // exclude types from IMAP //MESSAGE_TYPES.add("Contact"); //MESSAGE_TYPES.add("DistributionList"); //MESSAGE_TYPES.add("Task"); //ReplyToItem //ForwardItem //ReplyAllToItem //AcceptItem //TentativelyAcceptItem //DeclineItem //CancelCalendarItem //RemoveItem //PostReplyItem //SuppressReadReceipt //AcceptSharingInvitation } static final Map vTodoToTaskStatusMap = new HashMap<>(); static final Map taskTovTodoStatusMap = new HashMap<>(); static final Map partstatToResponseMap = new HashMap<>(); static final Map responseTypeToPartstatMap = new HashMap<>(); static final Map statusToBusyStatusMap = new HashMap<>(); static { //taskTovTodoStatusMap.put("NotStarted", null); taskTovTodoStatusMap.put("InProgress", "IN-PROCESS"); taskTovTodoStatusMap.put("Completed", "COMPLETED"); taskTovTodoStatusMap.put("WaitingOnOthers", "NEEDS-ACTION"); taskTovTodoStatusMap.put("Deferred", "CANCELLED"); //vTodoToTaskStatusMap.put(null, "NotStarted"); vTodoToTaskStatusMap.put("IN-PROCESS", "InProgress"); vTodoToTaskStatusMap.put("COMPLETED", "Completed"); vTodoToTaskStatusMap.put("NEEDS-ACTION", "WaitingOnOthers"); vTodoToTaskStatusMap.put("CANCELLED", "Deferred"); partstatToResponseMap.put("ACCEPTED", "AcceptItem"); partstatToResponseMap.put("TENTATIVE", "TentativelyAcceptItem"); partstatToResponseMap.put("DECLINED", "DeclineItem"); partstatToResponseMap.put("NEEDS-ACTION", "ReplyToItem"); responseTypeToPartstatMap.put("Accept", "ACCEPTED"); responseTypeToPartstatMap.put("Tentative", "TENTATIVE"); responseTypeToPartstatMap.put("Decline", "DECLINED"); responseTypeToPartstatMap.put("NoResponseReceived", "NEEDS-ACTION"); responseTypeToPartstatMap.put("Unknown", "NEEDS-ACTION"); statusToBusyStatusMap.put("TENTATIVE", "Tentative"); statusToBusyStatusMap.put("CONFIRMED", "Busy"); // Unable to map CANCELLED: cancelled events are directly deleted on Exchange } protected HttpClientAdapter httpClient; protected Map folderIdMap; protected boolean directEws; /** * Oauth2 token */ private O365Token token; protected class Folder extends ExchangeSession.Folder { public FolderId folderId; } protected static class FolderPath { protected final String parentPath; protected final String folderName; protected FolderPath(String folderPath) { int slashIndex = folderPath.lastIndexOf('/'); if (slashIndex < 0) { parentPath = ""; folderName = folderPath; } else { parentPath = folderPath.substring(0, slashIndex); folderName = folderPath.substring(slashIndex + 1); } } } public EwsExchangeSession(HttpClientAdapter httpClient, String userName) throws IOException { this.httpClient = httpClient; this.userName = userName; if (userName.contains("@")) { this.email = userName; } buildSessionInfo(null); } public EwsExchangeSession(HttpClientAdapter httpClient, URI uri, String userName) throws IOException { this.httpClient = httpClient; this.userName = userName; if (userName.contains("@")) { this.email = userName; this.alias = userName.substring(0, userName.indexOf('@')); } buildSessionInfo(uri); } public EwsExchangeSession(HttpClientAdapter httpClient, O365Token token, String userName) throws IOException { this.httpClient = httpClient; this.userName = userName; if (userName.contains("@")) { this.email = userName; this.alias = userName.substring(0, userName.indexOf('@')); } this.token = token; buildSessionInfo(null); } public EwsExchangeSession(URI uri, O365Token token, String userName) throws IOException { this(new HttpClientAdapter(uri, true), token, userName); } public EwsExchangeSession(String url, String userName, String password) throws IOException { this(new HttpClientAdapter(url, userName, password, true), userName); } /** * EWS fetch page size. * * @return page size */ private static int getPageSize() { return Settings.getIntProperty("davmail.folderFetchPageSize", PAGE_SIZE); } /** * Check endpoint url. * * @throws IOException on error */ protected void checkEndPointUrl() throws IOException { GetFolderMethod checkMethod = new GetFolderMethod(BaseShape.ID_ONLY, DistinguishedFolderId.getInstance(null, DistinguishedFolderId.Name.root), null); int status = executeMethod(checkMethod); if (status == HttpStatus.SC_UNAUTHORIZED) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } else if (status != HttpStatus.SC_OK) { throw new IOException("Ews endpoint not available at " + checkMethod.getURI().toString() + " status " + status); } } @Override public void buildSessionInfo(java.net.URI uri) throws IOException { // send a first request to get server version checkEndPointUrl(); // new approach based on ConvertId to find primary email address if (email == null || alias == null) { try { GetFolderMethod getFolderMethod = new GetFolderMethod(BaseShape.ID_ONLY, DistinguishedFolderId.getInstance(null, DistinguishedFolderId.Name.root), null); executeMethod(getFolderMethod); EWSMethod.Item item = getFolderMethod.getResponseItem(); String folderId = item.get("FolderId"); ConvertIdMethod convertIdMethod = new ConvertIdMethod(folderId); executeMethod(convertIdMethod); EWSMethod.Item convertIdItem = convertIdMethod.getResponseItem(); if (convertIdItem != null && !convertIdItem.isEmpty()) { email = convertIdItem.get("Mailbox"); alias = email.substring(0, email.indexOf('@')); } else { LOGGER.error("Unable to resolve email from root folder"); throw new IOException(); } } catch (IOException e) { throw new DavMailAuthenticationException("EXCEPTION_AUTHENTICATION_FAILED"); } } directEws = uri == null || "/ews/services.wsdl".equalsIgnoreCase(uri.getPath()) || "/ews/exchange.asmx".equalsIgnoreCase(uri.getPath()); currentMailboxPath = "/users/" + email.toLowerCase(); try { folderIdMap = new HashMap<>(); // load actual well known folder ids folderIdMap.put(internalGetFolder(INBOX).folderId.value, INBOX); folderIdMap.put(internalGetFolder(CALENDAR).folderId.value, CALENDAR); folderIdMap.put(internalGetFolder(CONTACTS).folderId.value, CONTACTS); folderIdMap.put(internalGetFolder(SENT).folderId.value, SENT); folderIdMap.put(internalGetFolder(DRAFTS).folderId.value, DRAFTS); folderIdMap.put(internalGetFolder(TRASH).folderId.value, TRASH); folderIdMap.put(internalGetFolder(JUNK).folderId.value, JUNK); folderIdMap.put(internalGetFolder(UNSENT).folderId.value, UNSENT); } catch (IOException e) { LOGGER.error(e.getMessage(), e); throw new DavMailAuthenticationException("EXCEPTION_EWS_NOT_AVAILABLE"); } LOGGER.debug("Current user email is " + email + ", alias is " + alias + " on " + serverVersion); } protected String getEmailSuffixFromHostname() { String domain = httpClient.getHost(); int start = domain.lastIndexOf('.', domain.lastIndexOf('.') - 1); if (start >= 0) { return '@' + domain.substring(start + 1); } else { return '@' + domain; } } protected void resolveEmailAddress(String userName) { String searchValue = userName; int index = searchValue.indexOf('\\'); if (index >= 0) { searchValue = searchValue.substring(index + 1); } ResolveNamesMethod resolveNamesMethod = new ResolveNamesMethod(searchValue); try { // send a fake request to get server version internalGetFolder(""); executeMethod(resolveNamesMethod); List responses = resolveNamesMethod.getResponseItems(); if (responses.size() == 1) { email = responses.get(0).get("EmailAddress"); } } catch (IOException e) { // ignore } } class Message extends ExchangeSession.Message { // message item id ItemId itemId; @Override public String getPermanentId() { return itemId.id; } @Override protected InputStream getMimeHeaders() { InputStream result = null; try { GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, false); getItemMethod.addAdditionalProperty(Field.get("messageheaders")); getItemMethod.addAdditionalProperty(Field.get("from")); executeMethod(getItemMethod); EWSMethod.Item item = getItemMethod.getResponseItem(); String messageHeaders = item.get(Field.get("messageheaders").getResponseName()); if (messageHeaders != null // workaround for broken message headers on Exchange 2010 && messageHeaders.toLowerCase().contains("message-id:")) { // workaround for messages in Sent folder if (!messageHeaders.contains("From:")) { String from = item.get(Field.get("from").getResponseName()); messageHeaders = "From: " + from + '\n' + messageHeaders; } result = new ByteArrayInputStream(messageHeaders.getBytes(StandardCharsets.UTF_8)); } } catch (Exception e) { LOGGER.warn(e.getMessage()); } return result; } } /** * Message create/update properties * * @param properties flag values map * @return field values */ protected List buildProperties(Map properties) { ArrayList list = new ArrayList<>(); for (Map.Entry entry : properties.entrySet()) { if ("read".equals(entry.getKey())) { list.add(Field.createFieldUpdate("read", Boolean.toString("1".equals(entry.getValue())))); } else if ("junk".equals(entry.getKey())) { list.add(Field.createFieldUpdate("junk", entry.getValue())); } else if ("flagged".equals(entry.getKey())) { list.add(Field.createFieldUpdate("flagStatus", entry.getValue())); } else if ("answered".equals(entry.getKey())) { list.add(Field.createFieldUpdate("lastVerbExecuted", entry.getValue())); if ("102".equals(entry.getValue())) { list.add(Field.createFieldUpdate("iconIndex", "261")); } } else if ("forwarded".equals(entry.getKey())) { list.add(Field.createFieldUpdate("lastVerbExecuted", entry.getValue())); if ("104".equals(entry.getValue())) { list.add(Field.createFieldUpdate("iconIndex", "262")); } } else if ("draft".equals(entry.getKey())) { // note: draft is readonly after create list.add(Field.createFieldUpdate("messageFlags", entry.getValue())); } else if ("deleted".equals(entry.getKey())) { list.add(Field.createFieldUpdate("deleted", entry.getValue())); } else if ("datereceived".equals(entry.getKey())) { list.add(Field.createFieldUpdate("datereceived", entry.getValue())); } else if ("keywords".equals(entry.getKey())) { list.add(Field.createFieldUpdate("keywords", entry.getValue())); } } return list; } @Override public Message createMessage(String folderPath, String messageName, HashMap properties, MimeMessage mimeMessage) throws IOException { EWSMethod.Item item = new EWSMethod.Item(); item.type = "Message"; ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { mimeMessage.writeTo(baos); } catch (MessagingException e) { throw new IOException(e.getMessage()); } baos.close(); item.mimeContent = IOUtil.encodeBase64(baos.toByteArray()); List fieldUpdates = buildProperties(properties); if (!properties.containsKey("draft")) { // need to force draft flag to false if (properties.containsKey("read")) { fieldUpdates.add(Field.createFieldUpdate("messageFlags", "1")); } else { fieldUpdates.add(Field.createFieldUpdate("messageFlags", "0")); } } fieldUpdates.add(Field.createFieldUpdate("urlcompname", messageName)); item.setFieldUpdates(fieldUpdates); CreateItemMethod createItemMethod = new CreateItemMethod(MessageDisposition.SaveOnly, getFolderId(folderPath), item); executeMethod(createItemMethod); ItemId newItemId = new ItemId(createItemMethod.getResponseItem()); GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, newItemId, false); for (String attribute : IMAP_MESSAGE_ATTRIBUTES) { getItemMethod.addAdditionalProperty(Field.get(attribute)); } executeMethod(getItemMethod); return buildMessage(getItemMethod.getResponseItem()); } @Override public void updateMessage(ExchangeSession.Message message, Map properties) throws IOException { if (properties.containsKey("read") && "urn:content-classes:appointment".equals(message.contentClass)) { properties.remove("read"); } if (!properties.isEmpty()) { UpdateItemMethod updateItemMethod = new UpdateItemMethod(MessageDisposition.SaveOnly, ConflictResolution.AlwaysOverwrite, SendMeetingInvitationsOrCancellations.SendToNone, ((EwsExchangeSession.Message) message).itemId, buildProperties(properties)); executeMethod(updateItemMethod); } } @Override public void deleteMessage(ExchangeSession.Message message) throws IOException { LOGGER.debug("Delete " + message.imapUid); DeleteItemMethod deleteItemMethod = new DeleteItemMethod(((EwsExchangeSession.Message) message).itemId, DeleteType.HardDelete, SendMeetingCancellations.SendToNone); executeMethod(deleteItemMethod); } protected void sendMessage(String itemClass, byte[] messageBody) throws IOException { EWSMethod.Item item = new EWSMethod.Item(); item.type = "Message"; item.mimeContent = IOUtil.encodeBase64(messageBody); if (itemClass != null) { item.put("ItemClass", itemClass); } MessageDisposition messageDisposition; if (Settings.getBooleanProperty("davmail.smtpSaveInSent", true)) { messageDisposition = MessageDisposition.SendAndSaveCopy; } else { messageDisposition = MessageDisposition.SendOnly; } CreateItemMethod createItemMethod = new CreateItemMethod(messageDisposition, getFolderId(SENT), item); executeMethod(createItemMethod); } @Override public void sendMessage(MimeMessage mimeMessage) throws IOException, MessagingException { String itemClass = null; if (mimeMessage.getContentType().startsWith("multipart/report")) { itemClass = "REPORT.IPM.Note.IPNRN"; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { mimeMessage.writeTo(baos); } catch (MessagingException e) { throw new IOException(e.getMessage()); } sendMessage(itemClass, baos.toByteArray()); } /** * @inheritDoc */ @Override protected byte[] getContent(ExchangeSession.Message message) throws IOException { return getContent(((EwsExchangeSession.Message) message).itemId); } /** * Get item content. * * @param itemId EWS item id * @return item content as byte array * @throws IOException on error */ protected byte[] getContent(ItemId itemId) throws IOException { GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, true); byte[] mimeContent = null; try { executeMethod(getItemMethod); mimeContent = getItemMethod.getMimeContent(); } catch (EWSException e) { LOGGER.warn("GetItem with MimeContent failed: " + e.getMessage()); } if (getItemMethod.getStatusCode() == HttpStatus.SC_NOT_FOUND) { throw new HttpNotFoundException("Item " + itemId + " not found"); } if (mimeContent == null) { LOGGER.warn("MimeContent not available, trying to rebuild from properties"); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, false); getItemMethod.addAdditionalProperty(Field.get("contentclass")); getItemMethod.addAdditionalProperty(Field.get("message-id")); getItemMethod.addAdditionalProperty(Field.get("from")); getItemMethod.addAdditionalProperty(Field.get("to")); getItemMethod.addAdditionalProperty(Field.get("cc")); getItemMethod.addAdditionalProperty(Field.get("subject")); getItemMethod.addAdditionalProperty(Field.get("date")); getItemMethod.addAdditionalProperty(Field.get("body")); executeMethod(getItemMethod); EWSMethod.Item item = getItemMethod.getResponseItem(); if (item == null) { throw new HttpNotFoundException("Item " + itemId + " not found"); } MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("Content-class", item.get(Field.get("contentclass").getResponseName())); mimeMessage.setSentDate(parseDateFromExchange(item.get(Field.get("date").getResponseName()))); mimeMessage.addHeader("From", item.get(Field.get("from").getResponseName())); mimeMessage.addHeader("To", item.get(Field.get("to").getResponseName())); mimeMessage.addHeader("Cc", item.get(Field.get("cc").getResponseName())); mimeMessage.setSubject(item.get(Field.get("subject").getResponseName())); String propertyValue = item.get(Field.get("body").getResponseName()); if (propertyValue == null) { propertyValue = ""; } mimeMessage.setContent(propertyValue, "text/html; charset=UTF-8"); mimeMessage.writeTo(baos); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Rebuilt message content: " + new String(baos.toByteArray(), StandardCharsets.UTF_8)); } mimeContent = baos.toByteArray(); } catch (IOException | MessagingException e2) { LOGGER.warn(e2); } if (mimeContent == null) { throw new IOException("GetItem returned null MimeContent"); } } return mimeContent; } protected Message buildMessage(EWSMethod.Item response) throws DavMailException { Message message = new Message(); // get item id message.itemId = new ItemId(response); message.permanentUrl = response.get(Field.get("permanenturl").getResponseName()); message.size = response.getInt(Field.get("messageSize").getResponseName()); message.uid = response.get(Field.get("uid").getResponseName()); message.contentClass = response.get(Field.get("contentclass").getResponseName()); message.imapUid = response.getLong(Field.get("imapUid").getResponseName()); message.read = response.getBoolean(Field.get("read").getResponseName()); message.junk = response.getBoolean(Field.get("junk").getResponseName()); message.flagged = "2".equals(response.get(Field.get("flagStatus").getResponseName())); message.draft = (response.getInt(Field.get("messageFlags").getResponseName()) & 8) != 0; String lastVerbExecuted = response.get(Field.get("lastVerbExecuted").getResponseName()); message.answered = "102".equals(lastVerbExecuted) || "103".equals(lastVerbExecuted); message.forwarded = "104".equals(lastVerbExecuted); message.date = convertDateFromExchange(response.get(Field.get("date").getResponseName())); message.deleted = "1".equals(response.get(Field.get("deleted").getResponseName())); String lastmodified = convertDateFromExchange(response.get(Field.get("lastmodified").getResponseName())); message.recent = !message.read && lastmodified != null && lastmodified.equals(message.date); message.keywords = response.get(Field.get("keywords").getResponseName()); if (LOGGER.isDebugEnabled()) { StringBuilder buffer = new StringBuilder(); buffer.append("Message"); if (message.imapUid != 0) { buffer.append(" IMAP uid: ").append(message.imapUid); } if (message.uid != null) { buffer.append(" uid: ").append(message.uid); } buffer.append(" ItemId: ").append(message.itemId.id); buffer.append(" ChangeKey: ").append(message.itemId.changeKey); LOGGER.debug(buffer.toString()); } return message; } @Override public MessageList searchMessages(String folderPath, Set attributes, Condition condition) throws IOException { MessageList messages = new MessageList(); int maxCount = Settings.getIntProperty("davmail.folderSizeLimit", 0); List responses = searchItems(folderPath, attributes, condition, FolderQueryTraversal.SHALLOW, maxCount); for (EWSMethod.Item response : responses) { if (MESSAGE_TYPES.contains(response.type)) { Message message = buildMessage(response); message.messageList = messages; messages.add(message); } } Collections.sort(messages); return messages; } protected List searchItems(String folderPath, Set attributes, Condition condition, FolderQueryTraversal folderQueryTraversal, int maxCount) throws IOException { if (maxCount == 0) { // unlimited search return searchItems(folderPath, attributes, condition, folderQueryTraversal); } // limited search, do not use paged search, limit with maxCount, sort by imapUid descending to get latest items int resultCount; FindItemMethod findItemMethod; // search items in folder, do not retrieve all properties findItemMethod = new FindItemMethod(folderQueryTraversal, BaseShape.ID_ONLY, getFolderId(folderPath), 0, maxCount); for (String attribute : attributes) { findItemMethod.addAdditionalProperty(Field.get(attribute)); } // make sure imapUid is available if (!attributes.contains("imapUid")) { findItemMethod.addAdditionalProperty(Field.get("imapUid")); } // always sort items by imapUid descending to retrieve recent messages first findItemMethod.setFieldOrder(new FieldOrder(Field.get("imapUid"), FieldOrder.Order.Descending)); if (condition != null && !condition.isEmpty()) { findItemMethod.setSearchExpression((SearchExpression) condition); } executeMethod(findItemMethod); List results = new ArrayList<>(findItemMethod.getResponseItems()); resultCount = results.size(); if (resultCount > 0 && LOGGER.isDebugEnabled()) { LOGGER.debug("Folder " + folderPath + " - Search items count: " + resultCount + " maxCount: " + maxCount + " highest uid: " + results.get(0).getLong(Field.get("imapUid").getResponseName()) + " lowest uid: " + results.get(resultCount - 1).getLong(Field.get("imapUid").getResponseName())); } return results; } /** * Paged search, retrieve all items. * * @param folderPath folder path * @param attributes attributes * @param condition search condition * @param folderQueryTraversal search mode * @return items * @throws IOException on error */ protected List searchItems(String folderPath, Set attributes, Condition condition, FolderQueryTraversal folderQueryTraversal) throws IOException { int resultCount = 0; List results = new ArrayList<>(); FolderId folderId = getFolderId(folderPath); FindItemMethod findItemMethod; do { // search items in folder, do not retrieve all properties findItemMethod = new FindItemMethod(folderQueryTraversal, BaseShape.ID_ONLY, folderId, resultCount, getPageSize()); for (String attribute : attributes) { findItemMethod.addAdditionalProperty(Field.get(attribute)); } // make sure imapUid is available if (!attributes.contains("imapUid")) { findItemMethod.addAdditionalProperty(Field.get("imapUid")); } // always sort items by imapUid ascending to retrieve pages in creation order findItemMethod.setFieldOrder(new FieldOrder(Field.get("imapUid"), FieldOrder.Order.Ascending)); if (condition != null && !condition.isEmpty()) { findItemMethod.setSearchExpression((SearchExpression) condition); } executeMethod(findItemMethod); if (findItemMethod.getStatusCode() == HttpStatus.SC_FORBIDDEN) { throw new EWSException(findItemMethod.errorDetail); } long highestUid = 0; if (resultCount > 0) { highestUid = results.get(resultCount - 1).getLong(Field.get("imapUid").getResponseName()); } // Only add new result if not already available (concurrent folder changes issue) for (EWSMethod.Item item : findItemMethod.getResponseItems()) { long imapUid = item.getLong(Field.get("imapUid").getResponseName()); if (imapUid > highestUid) { results.add(item); } } resultCount = results.size(); if (resultCount > 0 && LOGGER.isDebugEnabled()) { LOGGER.debug("Folder " + folderPath + " - Search items current count: " + resultCount + " fetchCount: " + getPageSize() + " highest uid: " + results.get(resultCount - 1).getLong(Field.get("imapUid").getResponseName()) + " lowest uid: " + results.get(0).getLong(Field.get("imapUid").getResponseName())); } if (Thread.interrupted()) { LOGGER.debug("Folder " + folderPath + " - Search items failed: Interrupted by client"); throw new IOException("Search items failed: Interrupted by client"); } } while (!(findItemMethod.includesLastItemInRange)); return results; } protected static class MultiCondition extends ExchangeSession.MultiCondition implements SearchExpression { protected MultiCondition(Operator operator, Condition... condition) { super(operator, condition); } public void appendTo(StringBuilder buffer) { int actualConditionCount = 0; for (Condition condition : conditions) { if (!condition.isEmpty()) { actualConditionCount++; } } if (actualConditionCount > 0) { if (actualConditionCount > 1) { buffer.append("'); } for (Condition condition : conditions) { condition.appendTo(buffer); } if (actualConditionCount > 1) { buffer.append("'); } } } } protected static class NotCondition extends ExchangeSession.NotCondition implements SearchExpression { protected NotCondition(Condition condition) { super(condition); } public void appendTo(StringBuilder buffer) { buffer.append(""); condition.appendTo(buffer); buffer.append(""); } } protected static class AttributeCondition extends ExchangeSession.AttributeCondition implements SearchExpression { protected ContainmentMode containmentMode; protected ContainmentComparison containmentComparison; protected AttributeCondition(String attributeName, Operator operator, String value) { super(attributeName, operator, value); } protected AttributeCondition(String attributeName, Operator operator, String value, ContainmentMode containmentMode, ContainmentComparison containmentComparison) { super(attributeName, operator, value); this.containmentMode = containmentMode; this.containmentComparison = containmentComparison; } protected FieldURI getFieldURI() { FieldURI fieldURI = Field.get(attributeName); // check to detect broken field mapping //noinspection ConstantConditions if (fieldURI == null) { throw new IllegalArgumentException("Unknown field: " + attributeName); } return fieldURI; } protected Operator getOperator() { return operator; } public void appendTo(StringBuilder buffer) { buffer.append("'); FieldURI fieldURI = getFieldURI(); fieldURI.appendTo(buffer); if (operator != Operator.Contains) { buffer.append(""); } buffer.append(""); if (operator != Operator.Contains) { buffer.append(""); } buffer.append("'); } public boolean isMatch(ExchangeSession.Contact contact) { String lowerCaseValue = value.toLowerCase(); String actualValue = contact.get(attributeName); if (actualValue == null) { return false; } actualValue = actualValue.toLowerCase(); if (operator == Operator.IsEqualTo) { return lowerCaseValue.equals(actualValue); } else { return operator == Operator.Contains && ((containmentMode.equals(ContainmentMode.Substring) && actualValue.contains(lowerCaseValue)) || (containmentMode.equals(ContainmentMode.Prefixed) && actualValue.startsWith(lowerCaseValue))); } } } protected static class HeaderCondition extends AttributeCondition { protected HeaderCondition(String attributeName, String value) { super(attributeName, Operator.Contains, value); containmentMode = ContainmentMode.Substring; containmentComparison = ContainmentComparison.IgnoreCase; } @Override protected FieldURI getFieldURI() { return new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, attributeName); } } protected static class IsNullCondition implements ExchangeSession.Condition, SearchExpression { protected final String attributeName; protected IsNullCondition(String attributeName) { this.attributeName = attributeName; } public void appendTo(StringBuilder buffer) { buffer.append(""); Field.get(attributeName).appendTo(buffer); buffer.append(""); } public boolean isEmpty() { return false; } public boolean isMatch(ExchangeSession.Contact contact) { String actualValue = contact.get(attributeName); return actualValue == null; } } protected static class ExistsCondition implements ExchangeSession.Condition, SearchExpression { protected final String attributeName; protected ExistsCondition(String attributeName) { this.attributeName = attributeName; } public void appendTo(StringBuilder buffer) { buffer.append(""); Field.get(attributeName).appendTo(buffer); buffer.append(""); } public boolean isEmpty() { return false; } public boolean isMatch(ExchangeSession.Contact contact) { String actualValue = contact.get(attributeName); return actualValue == null; } } @Override public ExchangeSession.MultiCondition and(Condition... condition) { return new MultiCondition(Operator.And, condition); } @Override public ExchangeSession.MultiCondition or(Condition... condition) { return new MultiCondition(Operator.Or, condition); } @Override public Condition not(Condition condition) { return new NotCondition(condition); } @Override public Condition isEqualTo(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsEqualTo, value); } @Override public Condition isEqualTo(String attributeName, int value) { return new AttributeCondition(attributeName, Operator.IsEqualTo, String.valueOf(value)); } @Override public Condition headerIsEqualTo(String headerName, String value) { if (serverVersion.startsWith("Exchange201")) { if ("from".equals(headerName) || "to".equals(headerName) || "cc".equals(headerName)) { return new AttributeCondition("msg" + headerName, Operator.Contains, value, ContainmentMode.Substring, ContainmentComparison.IgnoreCase); } else if ("message-id".equals(headerName) || "bcc".equals(headerName)) { return new AttributeCondition(headerName, Operator.Contains, value, ContainmentMode.Substring, ContainmentComparison.IgnoreCase); } else { // Exchange 2010 does not support header search, use PR_TRANSPORT_MESSAGE_HEADERS instead return new AttributeCondition("messageheaders", Operator.Contains, headerName + ": " + value, ContainmentMode.Substring, ContainmentComparison.IgnoreCase); } } else { return new HeaderCondition(headerName, value); } } @Override public Condition gte(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsGreaterThanOrEqualTo, value); } @Override public Condition lte(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsLessThanOrEqualTo, value); } @Override public Condition lt(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsLessThan, value); } @Override public Condition gt(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsGreaterThan, value); } @Override public Condition contains(String attributeName, String value) { // workaround for from: and to: headers not searchable over EWS if ("from".equals(attributeName)) { attributeName = "msgfrom"; } else if ("to".equals(attributeName)) { attributeName = "displayto"; } else if ("cc".equals(attributeName)) { attributeName = "displaycc"; } return new AttributeCondition(attributeName, Operator.Contains, value, ContainmentMode.Substring, ContainmentComparison.IgnoreCase); } @Override public Condition startsWith(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.Contains, value, ContainmentMode.Prefixed, ContainmentComparison.IgnoreCase); } @Override public Condition isNull(String attributeName) { return new IsNullCondition(attributeName); } @Override public Condition exists(String attributeName) { return new ExistsCondition(attributeName); } @Override public Condition isTrue(String attributeName) { return new AttributeCondition(attributeName, Operator.IsEqualTo, "true"); } @Override public Condition isFalse(String attributeName) { return new AttributeCondition(attributeName, Operator.IsEqualTo, "false"); } protected static final HashSet FOLDER_PROPERTIES = new HashSet<>(); static { FOLDER_PROPERTIES.add(Field.get("urlcompname")); FOLDER_PROPERTIES.add(Field.get("folderDisplayName")); FOLDER_PROPERTIES.add(Field.get("lastmodified")); FOLDER_PROPERTIES.add(Field.get("folderclass")); FOLDER_PROPERTIES.add(Field.get("ctag")); FOLDER_PROPERTIES.add(Field.get("count")); FOLDER_PROPERTIES.add(Field.get("unread")); FOLDER_PROPERTIES.add(Field.get("hassubs")); FOLDER_PROPERTIES.add(Field.get("uidNext")); FOLDER_PROPERTIES.add(Field.get("highestUid")); } protected Folder buildFolder(EWSMethod.Item item) { Folder folder = new Folder(); folder.folderId = new FolderId(item); folder.displayName = encodeFolderName(item.get(Field.get("folderDisplayName").getResponseName())); folder.folderClass = item.get(Field.get("folderclass").getResponseName()); folder.etag = item.get(Field.get("lastmodified").getResponseName()); folder.ctag = item.get(Field.get("ctag").getResponseName()); folder.count = item.getInt(Field.get("count").getResponseName()); folder.unreadCount = item.getInt(Field.get("unread").getResponseName()); // fake recent value folder.recent = folder.unreadCount; folder.hasChildren = item.getBoolean(Field.get("hassubs").getResponseName()); // noInferiors not implemented folder.uidNext = item.getInt(Field.get("uidNext").getResponseName()); return folder; } /** * @inheritDoc */ @Override public List getSubFolders(String folderPath, Condition condition, boolean recursive) throws IOException { String baseFolderPath = folderPath; if (baseFolderPath.startsWith("/users/")) { int index = baseFolderPath.indexOf('/', "/users/".length()); if (index >= 0) { baseFolderPath = baseFolderPath.substring(index + 1); } } List folders = new ArrayList<>(); appendSubFolders(folders, baseFolderPath, getFolderId(folderPath), condition, recursive); return folders; } protected void appendSubFolders(List folders, String parentFolderPath, FolderId parentFolderId, Condition condition, boolean recursive) throws IOException { int resultCount = 0; FindFolderMethod findFolderMethod; do { findFolderMethod = new FindFolderMethod(FolderQueryTraversal.SHALLOW, BaseShape.ID_ONLY, parentFolderId, FOLDER_PROPERTIES, (SearchExpression) condition, resultCount, getPageSize()); executeMethod(findFolderMethod); for (EWSMethod.Item item : findFolderMethod.getResponseItems()) { resultCount++; Folder folder = buildFolder(item); if (parentFolderPath.length() > 0) { if (parentFolderPath.endsWith("/")) { folder.folderPath = parentFolderPath + folder.displayName; } else { folder.folderPath = parentFolderPath + '/' + folder.displayName; } } else if (folderIdMap.get(folder.folderId.value) != null) { folder.folderPath = folderIdMap.get(folder.folderId.value); } else { folder.folderPath = folder.displayName; } folders.add(folder); if (recursive && folder.hasChildren) { appendSubFolders(folders, folder.folderPath, folder.folderId, condition, true); } } } while (!(findFolderMethod.includesLastItemInRange)); } /** * Get folder by path. * * @param folderPath folder path * @return folder object * @throws IOException on error */ @Override protected EwsExchangeSession.Folder internalGetFolder(String folderPath) throws IOException { FolderId folderId = getFolderId(folderPath); GetFolderMethod getFolderMethod = new GetFolderMethod(BaseShape.ID_ONLY, folderId, FOLDER_PROPERTIES); executeMethod(getFolderMethod); EWSMethod.Item item = getFolderMethod.getResponseItem(); Folder folder; if (item != null) { folder = buildFolder(item); folder.folderPath = folderPath; } else { throw new HttpNotFoundException("Folder " + folderPath + " not found"); } return folder; } /** * @inheritDoc */ @Override public int createFolder(String folderPath, String folderClass, Map properties) throws IOException { FolderPath path = new FolderPath(folderPath); EWSMethod.Item folder = new EWSMethod.Item(); folder.type = "Folder"; folder.put("FolderClass", folderClass); folder.put("DisplayName", decodeFolderName(path.folderName)); // TODO: handle properties CreateFolderMethod createFolderMethod = new CreateFolderMethod(getFolderId(path.parentPath), folder); executeMethod(createFolderMethod); return HttpStatus.SC_CREATED; } /** * @inheritDoc */ @Override public int updateFolder(String folderPath, Map properties) throws IOException { ArrayList updates = new ArrayList<>(); for (Map.Entry entry : properties.entrySet()) { updates.add(new FieldUpdate(Field.get(entry.getKey()), entry.getValue())); } UpdateFolderMethod updateFolderMethod = new UpdateFolderMethod(internalGetFolder(folderPath).folderId, updates); executeMethod(updateFolderMethod); return HttpStatus.SC_CREATED; } /** * @inheritDoc */ @Override public void deleteFolder(String folderPath) throws IOException { FolderId folderId = getFolderIdIfExists(folderPath); if (folderId != null) { DeleteFolderMethod deleteFolderMethod = new DeleteFolderMethod(folderId); executeMethod(deleteFolderMethod); } else { LOGGER.debug("Folder " + folderPath + " not found"); } } /** * @inheritDoc */ @Override public void moveMessage(ExchangeSession.Message message, String targetFolder) throws IOException { MoveItemMethod moveItemMethod = new MoveItemMethod(((EwsExchangeSession.Message) message).itemId, getFolderId(targetFolder)); executeMethod(moveItemMethod); } /** * @inheritDoc */ @Override public void moveMessages(List messages, String targetFolder) throws IOException { ArrayList itemIds = new ArrayList<>(); for (ExchangeSession.Message message : messages) { itemIds.add(((EwsExchangeSession.Message) message).itemId); } MoveItemMethod moveItemMethod = new MoveItemMethod(itemIds, getFolderId(targetFolder)); executeMethod(moveItemMethod); } /** * @inheritDoc */ @Override public void copyMessage(ExchangeSession.Message message, String targetFolder) throws IOException { CopyItemMethod copyItemMethod = new CopyItemMethod(((EwsExchangeSession.Message) message).itemId, getFolderId(targetFolder)); executeMethod(copyItemMethod); } /** * @inheritDoc */ @Override public void copyMessages(List messages, String targetFolder) throws IOException { ArrayList itemIds = new ArrayList<>(); for (ExchangeSession.Message message : messages) { itemIds.add(((EwsExchangeSession.Message) message).itemId); } CopyItemMethod copyItemMethod = new CopyItemMethod(itemIds, getFolderId(targetFolder)); executeMethod(copyItemMethod); } /** * @inheritDoc */ @Override public void moveFolder(String folderPath, String targetFolderPath) throws IOException { FolderPath path = new FolderPath(folderPath); FolderPath targetPath = new FolderPath(targetFolderPath); FolderId folderId = getFolderId(folderPath); FolderId toFolderId = getFolderId(targetPath.parentPath); toFolderId.changeKey = null; // move folder if (!path.parentPath.equals(targetPath.parentPath)) { MoveFolderMethod moveFolderMethod = new MoveFolderMethod(folderId, toFolderId); executeMethod(moveFolderMethod); } // rename folder if (!path.folderName.equals(targetPath.folderName)) { ArrayList updates = new ArrayList<>(); updates.add(new FieldUpdate(Field.get("folderDisplayName"), targetPath.folderName)); UpdateFolderMethod updateFolderMethod = new UpdateFolderMethod(folderId, updates); executeMethod(updateFolderMethod); } } @Override public void moveItem(String sourcePath, String targetPath) throws IOException { FolderPath sourceFolderPath = new FolderPath(sourcePath); Item item = getItem(sourceFolderPath.parentPath, sourceFolderPath.folderName); FolderPath targetFolderPath = new FolderPath(targetPath); FolderId toFolderId = getFolderId(targetFolderPath.parentPath); MoveItemMethod moveItemMethod = new MoveItemMethod(((Event) item).itemId, toFolderId); executeMethod(moveItemMethod); } /** * @inheritDoc */ @Override protected void moveToTrash(ExchangeSession.Message message) throws IOException { MoveItemMethod moveItemMethod = new MoveItemMethod(((EwsExchangeSession.Message) message).itemId, getFolderId(TRASH)); executeMethod(moveItemMethod); } protected class Contact extends ExchangeSession.Contact { // item id ItemId itemId; protected Contact(EWSMethod.Item response) throws DavMailException { itemId = new ItemId(response); permanentUrl = response.get(Field.get("permanenturl").getResponseName()); etag = response.get(Field.get("etag").getResponseName()); displayName = response.get(Field.get("displayname").getResponseName()); // prefer urlcompname (client provided item name) for contacts itemName = StringUtil.decodeUrlcompname(response.get(Field.get("urlcompname").getResponseName())); // if urlcompname is empty, this is a server created item // if urlcompname is an itemId, something went wrong, ignore if (itemName == null || isItemId(itemName)) { itemName = StringUtil.base64ToUrl(itemId.id) + ".EML"; } for (String attributeName : CONTACT_ATTRIBUTES) { String value = response.get(Field.get(attributeName).getResponseName()); if (value != null && value.length() > 0) { if ("bday".equals(attributeName) || "anniversary".equals(attributeName) || "lastmodified".equals(attributeName) || "datereceived".equals(attributeName)) { value = convertDateFromExchange(value); } put(attributeName, value); } } if (response.getMembers() != null) { for (String member : response.getMembers()) { addMember(member); } } } protected Contact(String folderPath, String itemName, Map properties, String etag, String noneMatch) { super(folderPath, itemName, properties, etag, noneMatch); } /** * Empty constructor for GalFind */ protected Contact() { } protected void buildFieldUpdates(List updates, boolean create) { for (Map.Entry entry : entrySet()) { if ("photo".equals(entry.getKey())) { updates.add(Field.createFieldUpdate("haspicture", "true")); } else if (!entry.getKey().startsWith("email") && !entry.getKey().startsWith("smtpemail") && !"fileas".equals(entry.getKey())) { updates.add(Field.createFieldUpdate(entry.getKey(), entry.getValue())); } } if (create && get("fileas") != null) { updates.add(Field.createFieldUpdate("fileas", get("fileas"))); } // handle email addresses IndexedFieldUpdate emailFieldUpdate = null; for (Map.Entry entry : entrySet()) { if (entry.getKey().startsWith("smtpemail")) { if (emailFieldUpdate == null) { emailFieldUpdate = new IndexedFieldUpdate("EmailAddresses"); } emailFieldUpdate.addFieldValue(Field.createFieldUpdate(entry.getKey(), entry.getValue())); } } if (emailFieldUpdate != null) { updates.add(emailFieldUpdate); } // handle list members MultiValuedFieldUpdate memberFieldUpdate = null; if (distributionListMembers != null) { for (String member : distributionListMembers) { if (memberFieldUpdate == null) { memberFieldUpdate = new MultiValuedFieldUpdate(Field.get("members")); } memberFieldUpdate.addValue(member); } } if (memberFieldUpdate != null) { updates.add(memberFieldUpdate); } } /** * Create or update contact * * @return action result * @throws IOException on error */ @Override public ItemResult createOrUpdate() throws IOException { String photo = get("photo"); ItemResult itemResult = new ItemResult(); EWSMethod createOrUpdateItemMethod; // first try to load existing event String currentEtag = null; ItemId currentItemId = null; FileAttachment currentFileAttachment = null; EWSMethod.Item currentItem = getEwsItem(folderPath, itemName, ITEM_PROPERTIES); if (currentItem != null) { currentItemId = new ItemId(currentItem); currentEtag = currentItem.get(Field.get("etag").getResponseName()); // load current picture GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, currentItemId, false); getItemMethod.addAdditionalProperty(Field.get("attachments")); executeMethod(getItemMethod); EWSMethod.Item item = getItemMethod.getResponseItem(); if (item != null) { currentFileAttachment = item.getAttachmentByName("ContactPicture.jpg"); } } if ("*".equals(noneMatch)) { // create requested //noinspection VariableNotUsedInsideIf if (currentItemId != null) { itemResult.status = HttpStatus.SC_PRECONDITION_FAILED; return itemResult; } } else if (etag != null) { // update requested if (currentItemId == null || !etag.equals(currentEtag)) { itemResult.status = HttpStatus.SC_PRECONDITION_FAILED; return itemResult; } } List fieldUpdates = new ArrayList<>(); if (currentItemId != null) { buildFieldUpdates(fieldUpdates, false); // update createOrUpdateItemMethod = new UpdateItemMethod(MessageDisposition.SaveOnly, ConflictResolution.AlwaysOverwrite, SendMeetingInvitationsOrCancellations.SendToNone, currentItemId, fieldUpdates); } else { // create EWSMethod.Item newItem = new EWSMethod.Item(); if ("IPM.DistList".equals(get("outlookmessageclass"))) { newItem.type = "DistributionList"; } else { newItem.type = "Contact"; } // force urlcompname on create fieldUpdates.add(Field.createFieldUpdate("urlcompname", convertItemNameToEML(itemName))); buildFieldUpdates(fieldUpdates, true); newItem.setFieldUpdates(fieldUpdates); createOrUpdateItemMethod = new CreateItemMethod(MessageDisposition.SaveOnly, getFolderId(folderPath), newItem); } executeMethod(createOrUpdateItemMethod); itemResult.status = createOrUpdateItemMethod.getStatusCode(); if (itemResult.status == HttpURLConnection.HTTP_OK) { //noinspection VariableNotUsedInsideIf if (etag == null) { itemResult.status = HttpStatus.SC_CREATED; LOGGER.debug("Created contact " + getHref()); } else { LOGGER.debug("Updated contact " + getHref()); } } else { return itemResult; } ItemId newItemId = new ItemId(createOrUpdateItemMethod.getResponseItem()); // disable contact picture handling on Exchange 2007 if (!"Exchange2007_SP1".equals(serverVersion) // prefer user provided photo && getADPhoto(get("smtpemail1")) == null) { // first delete current picture if (currentFileAttachment != null) { DeleteAttachmentMethod deleteAttachmentMethod = new DeleteAttachmentMethod(currentFileAttachment.attachmentId); executeMethod(deleteAttachmentMethod); } if (photo != null) { // convert image to jpeg byte[] resizedImageBytes = IOUtil.resizeImage(IOUtil.decodeBase64(photo), 90); FileAttachment attachment = new FileAttachment("ContactPicture.jpg", "image/jpeg", IOUtil.encodeBase64AsString(resizedImageBytes)); attachment.setIsContactPhoto(true); // update photo attachment CreateAttachmentMethod createAttachmentMethod = new CreateAttachmentMethod(newItemId, attachment); executeMethod(createAttachmentMethod); } } GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, newItemId, false); getItemMethod.addAdditionalProperty(Field.get("etag")); executeMethod(getItemMethod); itemResult.etag = getItemMethod.getResponseItem().get(Field.get("etag").getResponseName()); return itemResult; } } protected class Event extends ExchangeSession.Event { // item id ItemId itemId; String type; boolean isException; protected Event(String folderPath, EWSMethod.Item response) { this.folderPath = folderPath; itemId = new ItemId(response); type = response.type; permanentUrl = response.get(Field.get("permanenturl").getResponseName()); etag = response.get(Field.get("etag").getResponseName()); displayName = response.get(Field.get("displayname").getResponseName()); subject = response.get(Field.get("subject").getResponseName()); // ignore urlcompname and use item id itemName = StringUtil.base64ToUrl(itemId.id) + ".EML"; String instancetype = response.get(Field.get("instancetype").getResponseName()); isException = "3".equals(instancetype); } protected Event(String folderPath, String itemName, String contentClass, String itemBody, String etag, String noneMatch) throws IOException { super(folderPath, itemName, contentClass, itemBody, etag, noneMatch); } /** * Handle excluded dates (deleted occurrences). * * @param currentItemId current item id to iterate over occurrences * @param vCalendar vCalendar object * @throws DavMailException on error */ protected void handleExcludedDates(ItemId currentItemId, VCalendar vCalendar) throws DavMailException { List excludedDates = vCalendar.getFirstVeventProperties("EXDATE"); if (excludedDates != null) { for (VProperty property : excludedDates) { List values = property.getValues(); for (String value : values) { String convertedValue; try { convertedValue = vCalendar.convertCalendarDateToExchangeZulu(value, property.getParamValue("TZID")); } catch (IOException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", value); } LOGGER.debug("Looking for occurrence " + convertedValue); int instanceIndex = 0; // let's try to find occurence while (true) { instanceIndex++; try { GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, new OccurrenceItemId(currentItemId.id, instanceIndex) , false); getItemMethod.addAdditionalProperty(Field.get("originalstart")); executeMethod(getItemMethod); if (getItemMethod.getResponseItem() != null) { String itemOriginalStart = getItemMethod.getResponseItem().get(Field.get("originalstart").getResponseName()); LOGGER.debug("Occurrence " + instanceIndex + " itemOriginalStart " + itemOriginalStart + " looking for " + convertedValue); if (convertedValue.equals(itemOriginalStart)) { // found item, delete it DeleteItemMethod deleteItemMethod = new DeleteItemMethod(new ItemId(getItemMethod.getResponseItem()), DeleteType.HardDelete, SendMeetingCancellations.SendToAllAndSaveCopy); executeMethod(deleteItemMethod); break; } else if (convertedValue.compareTo(itemOriginalStart) < 0) { // current item is after searched item => probably already deleted break; } } } catch (IOException e) { LOGGER.warn("Error looking for occurrence " + convertedValue + ": " + e.getMessage()); // after end of recurrence break; } } } } } } /** * Handle modified occurrences. * * @param currentItemId current item id to iterate over occurrences * @param vCalendar vCalendar object * @throws DavMailException on error */ protected void handleModifiedOccurrences(ItemId currentItemId, VCalendar vCalendar) throws DavMailException { for (VObject modifiedOccurrence : vCalendar.getModifiedOccurrences()) { VProperty originalDateProperty = modifiedOccurrence.getProperty("RECURRENCE-ID"); String convertedValue; try { convertedValue = vCalendar.convertCalendarDateToExchangeZulu(originalDateProperty.getValue(), originalDateProperty.getParamValue("TZID")); } catch (IOException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", originalDateProperty.getValue()); } LOGGER.debug("Looking for occurrence " + convertedValue); int instanceIndex = 0; // let's try to find occurence while (true) { instanceIndex++; try { GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, new OccurrenceItemId(currentItemId.id, instanceIndex) , false); getItemMethod.addAdditionalProperty(Field.get("originalstart")); executeMethod(getItemMethod); if (getItemMethod.getResponseItem() != null) { String itemOriginalStart = getItemMethod.getResponseItem().get(Field.get("originalstart").getResponseName()); if (convertedValue.equals(itemOriginalStart)) { // found item, update it UpdateItemMethod updateItemMethod = new UpdateItemMethod(MessageDisposition.SaveOnly, ConflictResolution.AutoResolve, SendMeetingInvitationsOrCancellations.SendToAllAndSaveCopy, new ItemId(getItemMethod.getResponseItem()), buildFieldUpdates(vCalendar, modifiedOccurrence, false)); // force context Timezone on Exchange 2010 and 2013 if (serverVersion != null && serverVersion.startsWith("Exchange201")) { updateItemMethod.setTimezoneContext(EwsExchangeSession.this.getVTimezone().getPropertyValue("TZID")); } executeMethod(updateItemMethod); break; } else if (convertedValue.compareTo(itemOriginalStart) < 0) { // current item is after searched item => probably already deleted break; } } } catch (IOException e) { LOGGER.warn("Error looking for occurrence " + convertedValue + ": " + e.getMessage()); // after end of recurrence break; } } } } protected List buildFieldUpdates(VCalendar vCalendar, VObject vEvent, boolean isMozDismiss) throws DavMailException { List updates = new ArrayList<>(); if (isMozDismiss || "1".equals(vEvent.getPropertyValue("X-MOZ-FAKED-MASTER"))) { String xMozLastack = vCalendar.getFirstVeventPropertyValue("X-MOZ-LASTACK"); if (xMozLastack != null) { updates.add(Field.createFieldUpdate("xmozlastack", xMozLastack)); } String xMozSnoozeTime = vCalendar.getFirstVeventPropertyValue("X-MOZ-SNOOZE-TIME"); if (xMozSnoozeTime != null) { updates.add(Field.createFieldUpdate("xmozsnoozetime", xMozSnoozeTime)); } return updates; } // if we are not organizer, update only reminder info if (!vCalendar.isMeeting() || vCalendar.isMeetingOrganizer()) { // TODO: update all event fields and handle other occurrences updates.add(Field.createFieldUpdate("dtstart", convertCalendarDateToExchange(vEvent.getPropertyValue("DTSTART")))); updates.add(Field.createFieldUpdate("dtend", convertCalendarDateToExchange(vEvent.getPropertyValue("DTEND")))); if ("Exchange2007_SP1".equals(serverVersion)) { updates.add(Field.createFieldUpdate("meetingtimezone", vEvent.getProperty("DTSTART").getParamValue("TZID"))); } else { String starttimezone = vEvent.getProperty("DTSTART").getParamValue("TZID"); String endtimezone = starttimezone; if (vEvent.getProperty("DTEND") != null) { endtimezone = vEvent.getProperty("DTEND").getParamValue("TZID"); } updates.add(Field.createFieldUpdate("starttimezone", starttimezone)); updates.add(Field.createFieldUpdate("endtimezone", endtimezone)); } String status = statusToBusyStatusMap.get(vEvent.getPropertyValue("STATUS")); if (status != null) { updates.add(Field.createFieldUpdate("busystatus", status)); } updates.add(Field.createFieldUpdate("isalldayevent", Boolean.toString(vCalendar.isCdoAllDay()))); String eventClass = vEvent.getPropertyValue("CLASS"); if ("PRIVATE".equals(eventClass)) { eventClass = "Private"; } else if ("CONFIDENTIAL".equals(eventClass)) { eventClass = "Confidential"; } else { // PUBLIC eventClass = "Normal"; } updates.add(Field.createFieldUpdate("itemsensitivity", eventClass)); updates.add(Field.createFieldUpdate("description", vEvent.getPropertyValue("DESCRIPTION"))); updates.add(Field.createFieldUpdate("subject", vEvent.getPropertyValue("SUMMARY"))); updates.add(Field.createFieldUpdate("location", vEvent.getPropertyValue("LOCATION"))); // Collect categories on multiple lines List categories = vEvent.getProperties("CATEGORIES"); if (categories != null) { HashSet categoryValues = new HashSet<>(); for (VProperty category : categories) { categoryValues.add(category.getValue()); } updates.add(Field.createFieldUpdate("keywords", StringUtil.join(categoryValues, ","))); } VProperty rrule = vEvent.getProperty("RRULE"); if (rrule != null) { RecurrenceFieldUpdate recurrenceFieldUpdate = new RecurrenceFieldUpdate(); List rruleValues = rrule.getValues(); for (String rruleValue : rruleValues) { int index = rruleValue.indexOf("="); if (index >= 0) { String key = rruleValue.substring(0, index); String value = rruleValue.substring(index + 1); switch (key) { case "FREQ": recurrenceFieldUpdate.setRecurrencePattern(value); break; case "UNTIL": recurrenceFieldUpdate.setEndDate(parseDateFromExchange(convertCalendarDateToExchange(value) + "Z")); break; case "COUNT": recurrenceFieldUpdate.setCount(value); break; case "BYDAY": recurrenceFieldUpdate.setByDay(value.split(",")); break; case "INTERVAL": recurrenceFieldUpdate.setRecurrenceInterval(value); break; } } } recurrenceFieldUpdate.setStartDate(parseDateFromExchange(convertCalendarDateToExchange(vEvent.getPropertyValue("DTSTART")) + "Z")); updates.add(recurrenceFieldUpdate); } MultiValuedFieldUpdate requiredAttendees = new MultiValuedFieldUpdate(Field.get("requiredattendees")); MultiValuedFieldUpdate optionalAttendees = new MultiValuedFieldUpdate(Field.get("optionalattendees")); updates.add(requiredAttendees); updates.add(optionalAttendees); List attendees = vEvent.getProperties("ATTENDEE"); if (attendees != null) { for (VProperty property : attendees) { String attendeeEmail = vCalendar.getEmailValue(property); if (attendeeEmail != null && attendeeEmail.indexOf('@') >= 0) { if (!email.equals(attendeeEmail)) { String attendeeRole = property.getParamValue("ROLE"); if ("REQ-PARTICIPANT".equals(attendeeRole)) { requiredAttendees.addValue(attendeeEmail); } else { optionalAttendees.addValue(attendeeEmail); } } } } } // store mozilla invitations option String xMozSendInvitations = vCalendar.getFirstVeventPropertyValue("X-MOZ-SEND-INVITATIONS"); if (xMozSendInvitations != null) { updates.add(Field.createFieldUpdate("xmozsendinvitations", xMozSendInvitations)); } } // TODO: check with recurrence updates.add(Field.createFieldUpdate("reminderset", String.valueOf(vCalendar.hasVAlarm()))); if (vCalendar.hasVAlarm()) { updates.add(Field.createFieldUpdate("reminderminutesbeforestart", vCalendar.getReminderMinutesBeforeStart())); } // handle mozilla alarm String xMozLastack = vCalendar.getFirstVeventPropertyValue("X-MOZ-LASTACK"); if (xMozLastack != null) { updates.add(Field.createFieldUpdate("xmozlastack", xMozLastack)); } String xMozSnoozeTime = vCalendar.getFirstVeventPropertyValue("X-MOZ-SNOOZE-TIME"); if (xMozSnoozeTime != null) { updates.add(Field.createFieldUpdate("xmozsnoozetime", xMozSnoozeTime)); } return updates; } @Override public ItemResult createOrUpdate() throws IOException { if (vCalendar.isTodo() && isMainCalendar(folderPath)) { // task item, move to tasks folder folderPath = TASKS; } ItemResult itemResult = new ItemResult(); EWSMethod createOrUpdateItemMethod = null; // first try to load existing event String currentEtag = null; ItemId currentItemId = null; String ownerResponseReply = null; boolean isMeetingResponse = false; boolean isMozSendInvitations = true; boolean isMozDismiss = false; HashSet itemRequestProperties = CALENDAR_ITEM_REQUEST_PROPERTIES; if (vCalendar.isTodo()) { itemRequestProperties = EVENT_REQUEST_PROPERTIES; } EWSMethod.Item currentItem = getEwsItem(folderPath, itemName, itemRequestProperties); if (currentItem != null) { currentItemId = new ItemId(currentItem); currentEtag = currentItem.get(Field.get("etag").getResponseName()); String currentAttendeeStatus = responseTypeToPartstatMap.get(currentItem.get(Field.get("myresponsetype").getResponseName())); String newAttendeeStatus = vCalendar.getAttendeeStatus(); isMeetingResponse = vCalendar.isMeeting() && !vCalendar.isMeetingOrganizer() && newAttendeeStatus != null && !newAttendeeStatus.equals(currentAttendeeStatus) // avoid nullpointerexception on unknown status && partstatToResponseMap.get(newAttendeeStatus) != null; // Check mozilla last ack and snooze String newmozlastack = vCalendar.getFirstVeventPropertyValue("X-MOZ-LASTACK"); String currentmozlastack = currentItem.get(Field.get("xmozlastack").getResponseName()); boolean ismozack = newmozlastack != null && !newmozlastack.equals(currentmozlastack); String newmozsnoozetime = vCalendar.getFirstVeventPropertyValue("X-MOZ-SNOOZE-TIME"); String currentmozsnoozetime = currentItem.get(Field.get("xmozsnoozetime").getResponseName()); boolean ismozsnooze = newmozsnoozetime != null && !newmozsnoozetime.equals(currentmozsnoozetime); isMozSendInvitations = (newmozlastack == null && newmozsnoozetime == null) // not thunderbird || !(ismozack || ismozsnooze); isMozDismiss = ismozack || ismozsnooze; LOGGER.debug("Existing item found with etag: " + currentEtag + " client etag: " + etag + " id: " + currentItemId.id); } if (isMeetingResponse) { LOGGER.debug("Ignore etag check, meeting response"); } else if ("*".equals(noneMatch) && !Settings.getBooleanProperty("davmail.ignoreNoneMatchStar", true)) { // create requested //noinspection VariableNotUsedInsideIf if (currentItemId != null) { itemResult.status = HttpStatus.SC_PRECONDITION_FAILED; return itemResult; } } else if (etag != null) { // update requested if (currentItemId == null || !etag.equals(currentEtag)) { itemResult.status = HttpStatus.SC_PRECONDITION_FAILED; return itemResult; } } if (vCalendar.isTodo()) { // create or update task method EWSMethod.Item newItem = new EWSMethod.Item(); newItem.type = "Task"; List updates = new ArrayList<>(); updates.add(Field.createFieldUpdate("importance", convertPriorityToExchange(vCalendar.getFirstVeventPropertyValue("PRIORITY")))); updates.add(Field.createFieldUpdate("calendaruid", vCalendar.getFirstVeventPropertyValue("UID"))); // force urlcompname updates.add(Field.createFieldUpdate("urlcompname", convertItemNameToEML(itemName))); updates.add(Field.createFieldUpdate("subject", vCalendar.getFirstVeventPropertyValue("SUMMARY"))); updates.add(Field.createFieldUpdate("description", vCalendar.getFirstVeventPropertyValue("DESCRIPTION"))); // handle multiple keywords/categories List categories = vCalendar.getFirstVeventProperties("CATEGORIES"); if (categories != null) { HashSet categoryValues = new HashSet<>(); for (VProperty category : categories) { categoryValues.add(category.getValue()); } updates.add(Field.createFieldUpdate("keywords", StringUtil.join(categoryValues, ","))); } updates.add(Field.createFieldUpdate("startdate", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DTSTART")))); updates.add(Field.createFieldUpdate("duedate", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DUE")))); updates.add(Field.createFieldUpdate("datecompleted", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("COMPLETED")))); updates.add(Field.createFieldUpdate("commonstart", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DTSTART")))); updates.add(Field.createFieldUpdate("commonend", convertTaskDateToZulu(vCalendar.getFirstVeventPropertyValue("DUE")))); String percentComplete = vCalendar.getFirstVeventPropertyValue("PERCENT-COMPLETE"); if (percentComplete == null) { percentComplete = "0"; } updates.add(Field.createFieldUpdate("percentcomplete", percentComplete)); String vTodoStatus = vCalendar.getFirstVeventPropertyValue("STATUS"); if (vTodoStatus == null) { updates.add(Field.createFieldUpdate("taskstatus", "NotStarted")); } else { updates.add(Field.createFieldUpdate("taskstatus", vTodoToTaskStatusMap.get(vTodoStatus))); } //updates.add(Field.createFieldUpdate("iscomplete", "COMPLETED".equals(vTodoStatus)?"True":"False")); if (currentItemId != null) { // update createOrUpdateItemMethod = new UpdateItemMethod(MessageDisposition.SaveOnly, ConflictResolution.AutoResolve, SendMeetingInvitationsOrCancellations.SendToNone, currentItemId, updates); } else { newItem.setFieldUpdates(updates); // create createOrUpdateItemMethod = new CreateItemMethod(MessageDisposition.SaveOnly, SendMeetingInvitations.SendToNone, getFolderId(folderPath), newItem); } } else { // update existing item if (currentItemId != null) { if (isMeetingResponse && Settings.getBooleanProperty("davmail.caldavAutoSchedule", true)) { // meeting response with server managed notifications SendMeetingInvitations sendMeetingInvitations = SendMeetingInvitations.SendToAllAndSaveCopy; MessageDisposition messageDisposition = MessageDisposition.SendAndSaveCopy; String body = null; // This is a meeting response, let user edit notification message if (Settings.getBooleanProperty("davmail.caldavEditNotifications")) { String vEventSubject = vCalendar.getFirstVeventPropertyValue("SUMMARY"); if (vEventSubject == null) { vEventSubject = BundleMessage.format("MEETING_REQUEST"); } String status = vCalendar.getAttendeeStatus(); String notificationSubject = (status != null) ? (BundleMessage.format(status) + vEventSubject) : subject; NotificationDialog notificationDialog = new NotificationDialog(notificationSubject, ""); if (!notificationDialog.getSendNotification()) { LOGGER.debug("Notification canceled by user"); sendMeetingInvitations = SendMeetingInvitations.SendToNone; messageDisposition = MessageDisposition.SaveOnly; } // get description from dialog body = notificationDialog.getBody(); } EWSMethod.Item item = new EWSMethod.Item(); item.type = partstatToResponseMap.get(vCalendar.getAttendeeStatus()); item.referenceItemId = new ItemId("ReferenceItemId", currentItemId.id, currentItemId.changeKey); if (body != null && body.length() > 0) { item.put("Body", body); } createOrUpdateItemMethod = new CreateItemMethod(messageDisposition, sendMeetingInvitations, getFolderId(SENT), item ); } else if (Settings.getBooleanProperty("davmail.caldavAutoSchedule", true)) { // other changes with server side managed notifications MessageDisposition messageDisposition = MessageDisposition.SaveOnly; SendMeetingInvitationsOrCancellations sendMeetingInvitationsOrCancellations = SendMeetingInvitationsOrCancellations.SendToNone; if (vCalendar.isMeeting() && vCalendar.isMeetingOrganizer() && isMozSendInvitations) { messageDisposition = MessageDisposition.SendAndSaveCopy; sendMeetingInvitationsOrCancellations = SendMeetingInvitationsOrCancellations.SendToAllAndSaveCopy; } createOrUpdateItemMethod = new UpdateItemMethod(messageDisposition, ConflictResolution.AutoResolve, sendMeetingInvitationsOrCancellations, currentItemId, buildFieldUpdates(vCalendar, vCalendar.getFirstVevent(), isMozDismiss)); // force context Timezone on Exchange 2010 and 2013 if (serverVersion != null && serverVersion.startsWith("Exchange201")) { createOrUpdateItemMethod.setTimezoneContext(EwsExchangeSession.this.getVTimezone().getPropertyValue("TZID")); } } else { // old hard/delete approach on update, used with client side notifications DeleteItemMethod deleteItemMethod = new DeleteItemMethod(currentItemId, DeleteType.HardDelete, SendMeetingCancellations.SendToNone); executeMethod(deleteItemMethod); } } if (createOrUpdateItemMethod == null) { // create EWSMethod.Item newItem = new EWSMethod.Item(); newItem.type = "CalendarItem"; newItem.mimeContent = IOUtil.encodeBase64(vCalendar.toString()); ArrayList updates = new ArrayList<>(); if (!vCalendar.hasVAlarm()) { updates.add(Field.createFieldUpdate("reminderset", "false")); } //updates.add(Field.createFieldUpdate("outlookmessageclass", "IPM.Appointment")); // force urlcompname updates.add(Field.createFieldUpdate("urlcompname", convertItemNameToEML(itemName))); if (vCalendar.isMeeting()) { if (vCalendar.isMeetingOrganizer()) { updates.add(Field.createFieldUpdate("apptstateflags", "1")); } else { updates.add(Field.createFieldUpdate("apptstateflags", "3")); } } else { updates.add(Field.createFieldUpdate("apptstateflags", "0")); } // store mozilla invitations option String xMozSendInvitations = vCalendar.getFirstVeventPropertyValue("X-MOZ-SEND-INVITATIONS"); if (xMozSendInvitations != null) { updates.add(Field.createFieldUpdate("xmozsendinvitations", xMozSendInvitations)); } // handle mozilla alarm String xMozLastack = vCalendar.getFirstVeventPropertyValue("X-MOZ-LASTACK"); if (xMozLastack != null) { updates.add(Field.createFieldUpdate("xmozlastack", xMozLastack)); } String xMozSnoozeTime = vCalendar.getFirstVeventPropertyValue("X-MOZ-SNOOZE-TIME"); if (xMozSnoozeTime != null) { updates.add(Field.createFieldUpdate("xmozsnoozetime", xMozSnoozeTime)); } if (vCalendar.isMeeting() && "Exchange2007_SP1".equals(serverVersion)) { Set requiredAttendees = new HashSet<>(); Set optionalAttendees = new HashSet<>(); List attendeeProperties = vCalendar.getFirstVeventProperties("ATTENDEE"); if (attendeeProperties != null) { for (VProperty property : attendeeProperties) { String attendeeEmail = vCalendar.getEmailValue(property); if (attendeeEmail != null && attendeeEmail.indexOf('@') >= 0) { if (email.equals(attendeeEmail)) { String ownerPartStat = property.getParamValue("PARTSTAT"); if ("ACCEPTED".equals(ownerPartStat)) { ownerResponseReply = "AcceptItem"; // do not send DeclineItem to avoid deleting target event } else if ("DECLINED".equals(ownerPartStat) || "TENTATIVE".equals(ownerPartStat)) { ownerResponseReply = "TentativelyAcceptItem"; } } InternetAddress internetAddress = new InternetAddress(attendeeEmail, property.getParamValue("CN")); String attendeeRole = property.getParamValue("ROLE"); if ("REQ-PARTICIPANT".equals(attendeeRole)) { requiredAttendees.add(internetAddress.toString()); } else { optionalAttendees.add(internetAddress.toString()); } } } } List organizerProperties = vCalendar.getFirstVeventProperties("ORGANIZER"); if (organizerProperties != null) { VProperty property = organizerProperties.get(0); String organizerEmail = vCalendar.getEmailValue(property); if (organizerEmail != null && organizerEmail.indexOf('@') >= 0) { updates.add(Field.createFieldUpdate("from", organizerEmail)); } } if (requiredAttendees.size() > 0) { updates.add(Field.createFieldUpdate("to", StringUtil.join(requiredAttendees, ", "))); } if (optionalAttendees.size() > 0) { updates.add(Field.createFieldUpdate("cc", StringUtil.join(optionalAttendees, ", "))); } } // patch allday date values, only on 2007 if ("Exchange2007_SP1".equals(serverVersion) && vCalendar.isCdoAllDay()) { updates.add(Field.createFieldUpdate("dtstart", convertCalendarDateToExchange(vCalendar.getFirstVeventPropertyValue("DTSTART")))); updates.add(Field.createFieldUpdate("dtend", convertCalendarDateToExchange(vCalendar.getFirstVeventPropertyValue("DTEND")))); } String status = vCalendar.getFirstVeventPropertyValue("STATUS"); if ("TENTATIVE".equals(status)) { // this is a tentative event updates.add(Field.createFieldUpdate("busystatus", "Tentative")); } else { // otherwise, we use the same value as before, as received from the server // however, the case matters, so we still have to transform it "BUSY" -> "Busy" updates.add(Field.createFieldUpdate("busystatus", "BUSY".equals(vCalendar.getFirstVeventPropertyValue("X-MICROSOFT-CDO-BUSYSTATUS")) ? "Busy" : "Free")); } if ("Exchange2007_SP1".equals(serverVersion) && vCalendar.isCdoAllDay()) { updates.add(Field.createFieldUpdate("meetingtimezone", vCalendar.getVTimezone().getPropertyValue("TZID"))); } newItem.setFieldUpdates(updates); MessageDisposition messageDisposition = MessageDisposition.SaveOnly; SendMeetingInvitations sendMeetingInvitations = SendMeetingInvitations.SendToNone; if (vCalendar.isMeeting() && vCalendar.isMeetingOrganizer() && isMozSendInvitations && Settings.getBooleanProperty("davmail.caldavAutoSchedule", true)) { // meeting request creation with server managed notifications messageDisposition = MessageDisposition.SendAndSaveCopy; sendMeetingInvitations = SendMeetingInvitations.SendToAllAndSaveCopy; } createOrUpdateItemMethod = new CreateItemMethod(messageDisposition, sendMeetingInvitations, getFolderId(folderPath), newItem); // force context Timezone on Exchange 2010 and 2013 if (serverVersion != null && serverVersion.startsWith("Exchange201")) { createOrUpdateItemMethod.setTimezoneContext(EwsExchangeSession.this.getVTimezone().getPropertyValue("TZID")); } } } executeMethod(createOrUpdateItemMethod); itemResult.status = createOrUpdateItemMethod.getStatusCode(); if (itemResult.status == HttpURLConnection.HTTP_OK) { //noinspection VariableNotUsedInsideIf if (currentItemId == null) { itemResult.status = HttpStatus.SC_CREATED; LOGGER.debug("Created event " + getHref()); } else { LOGGER.warn("Overwritten event " + getHref()); } } // force responsetype on Exchange 2007 if (ownerResponseReply != null) { EWSMethod.Item responseTypeItem = new EWSMethod.Item(); responseTypeItem.referenceItemId = new ItemId("ReferenceItemId", createOrUpdateItemMethod.getResponseItem()); responseTypeItem.type = ownerResponseReply; createOrUpdateItemMethod = new CreateItemMethod(MessageDisposition.SaveOnly, SendMeetingInvitations.SendToNone, null, responseTypeItem); executeMethod(createOrUpdateItemMethod); // force urlcompname again ArrayList updates = new ArrayList<>(); updates.add(Field.createFieldUpdate("urlcompname", convertItemNameToEML(itemName))); createOrUpdateItemMethod = new UpdateItemMethod(MessageDisposition.SaveOnly, ConflictResolution.AlwaysOverwrite, SendMeetingInvitationsOrCancellations.SendToNone, new ItemId(createOrUpdateItemMethod.getResponseItem()), updates); executeMethod(createOrUpdateItemMethod); } // handle deleted occurrences if (!vCalendar.isTodo() && currentItemId != null && !isMeetingResponse && !isMozDismiss) { handleExcludedDates(currentItemId, vCalendar); handleModifiedOccurrences(currentItemId, vCalendar); } // update etag if (createOrUpdateItemMethod.getResponseItem() != null) { ItemId newItemId = new ItemId(createOrUpdateItemMethod.getResponseItem()); GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, newItemId, false); getItemMethod.addAdditionalProperty(Field.get("etag")); executeMethod(getItemMethod); itemResult.etag = getItemMethod.getResponseItem().get(Field.get("etag").getResponseName()); itemResult.itemName = StringUtil.base64ToUrl(newItemId.id) + ".EML"; } return itemResult; } @Override public byte[] getEventContent() throws IOException { byte[] content; if (LOGGER.isDebugEnabled()) { LOGGER.debug("Get event: " + itemName); } try { GetItemMethod getItemMethod; if ("Task".equals(type)) { getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, false); getItemMethod.addAdditionalProperty(Field.get("importance")); getItemMethod.addAdditionalProperty(Field.get("subject")); getItemMethod.addAdditionalProperty(Field.get("created")); getItemMethod.addAdditionalProperty(Field.get("lastmodified")); getItemMethod.addAdditionalProperty(Field.get("calendaruid")); getItemMethod.addAdditionalProperty(Field.get("description")); if (isExchange2013OrLater()) { getItemMethod.addAdditionalProperty(Field.get("textbody")); } getItemMethod.addAdditionalProperty(Field.get("percentcomplete")); getItemMethod.addAdditionalProperty(Field.get("taskstatus")); getItemMethod.addAdditionalProperty(Field.get("startdate")); getItemMethod.addAdditionalProperty(Field.get("duedate")); getItemMethod.addAdditionalProperty(Field.get("datecompleted")); getItemMethod.addAdditionalProperty(Field.get("keywords")); } else if (!"Message".equals(type) && !"MeetingCancellation".equals(type) && !"MeetingResponse".equals(type)) { getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, true); getItemMethod.addAdditionalProperty(Field.get("lastmodified")); getItemMethod.addAdditionalProperty(Field.get("reminderset")); getItemMethod.addAdditionalProperty(Field.get("calendaruid")); getItemMethod.addAdditionalProperty(Field.get("myresponsetype")); getItemMethod.addAdditionalProperty(Field.get("requiredattendees")); getItemMethod.addAdditionalProperty(Field.get("optionalattendees")); getItemMethod.addAdditionalProperty(Field.get("modifiedoccurrences")); getItemMethod.addAdditionalProperty(Field.get("xmozlastack")); getItemMethod.addAdditionalProperty(Field.get("xmozsnoozetime")); getItemMethod.addAdditionalProperty(Field.get("xmozsendinvitations")); } else { getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, true); } executeMethod(getItemMethod); if ("Task".equals(type)) { VCalendar localVCalendar = new VCalendar(); VObject vTodo = new VObject(); vTodo.type = "VTODO"; localVCalendar.setTimezone(getVTimezone()); vTodo.setPropertyValue("LAST-MODIFIED", convertDateFromExchange(getItemMethod.getResponseItem().get(Field.get("lastmodified").getResponseName()))); vTodo.setPropertyValue("CREATED", convertDateFromExchange(getItemMethod.getResponseItem().get(Field.get("created").getResponseName()))); String calendarUid = getItemMethod.getResponseItem().get(Field.get("calendaruid").getResponseName()); if (calendarUid == null) { // use item id as uid for Exchange created tasks calendarUid = itemId.id; } vTodo.setPropertyValue("UID", calendarUid); vTodo.setPropertyValue("SUMMARY", getItemMethod.getResponseItem().get(Field.get("subject").getResponseName())); String description = getItemMethod.getResponseItem().get(Field.get("description").getResponseName()); if (description == null) { // Exchange 2013: try to get description from body description = getItemMethod.getResponseItem().get(Field.get("textbody").getResponseName()); } vTodo.setPropertyValue("DESCRIPTION", description); vTodo.setPropertyValue("PRIORITY", convertPriorityFromExchange(getItemMethod.getResponseItem().get(Field.get("importance").getResponseName()))); vTodo.setPropertyValue("PERCENT-COMPLETE", getItemMethod.getResponseItem().get(Field.get("percentcomplete").getResponseName())); vTodo.setPropertyValue("STATUS", taskTovTodoStatusMap.get(getItemMethod.getResponseItem().get(Field.get("taskstatus").getResponseName()))); vTodo.setPropertyValue("DUE;VALUE=DATE", convertDateFromExchangeToTaskDate(getItemMethod.getResponseItem().get(Field.get("duedate").getResponseName()))); vTodo.setPropertyValue("DTSTART;VALUE=DATE", convertDateFromExchangeToTaskDate(getItemMethod.getResponseItem().get(Field.get("startdate").getResponseName()))); vTodo.setPropertyValue("COMPLETED;VALUE=DATE", convertDateFromExchangeToTaskDate(getItemMethod.getResponseItem().get(Field.get("datecompleted").getResponseName()))); vTodo.setPropertyValue("CATEGORIES", getItemMethod.getResponseItem().get(Field.get("keywords").getResponseName())); localVCalendar.addVObject(vTodo); content = localVCalendar.toString().getBytes(StandardCharsets.UTF_8); } else { content = getItemMethod.getMimeContent(); if (content == null) { throw new IOException("empty event body"); } if (!"CalendarItem".equals(type)) { content = getICS(new SharedByteArrayInputStream(content)); } VCalendar localVCalendar = new VCalendar(content, email, getVTimezone()); String calendaruid = getItemMethod.getResponseItem().get(Field.get("calendaruid").getResponseName()); if ("Exchange2007_SP1".equals(serverVersion)) { // remove additional reminder if (!"true".equals(getItemMethod.getResponseItem().get(Field.get("reminderset").getResponseName()))) { localVCalendar.removeVAlarm(); } if (calendaruid != null) { localVCalendar.setFirstVeventPropertyValue("UID", calendaruid); } } fixAttendees(getItemMethod, localVCalendar.getFirstVevent()); // fix UID and RECURRENCE-ID, broken at least on Exchange 2007 List occurences = getItemMethod.getResponseItem().getOccurrences(); if (occurences != null) { Iterator modifiedOccurrencesIterator = localVCalendar.getModifiedOccurrences().iterator(); for (EWSMethod.Occurrence occurrence : occurences) { if (modifiedOccurrencesIterator.hasNext()) { VObject modifiedOccurrence = modifiedOccurrencesIterator.next(); // fix modified occurrences attendees GetItemMethod getOccurrenceMethod = new GetItemMethod(BaseShape.ID_ONLY, occurrence.itemId, false); getOccurrenceMethod.addAdditionalProperty(Field.get("requiredattendees")); getOccurrenceMethod.addAdditionalProperty(Field.get("optionalattendees")); getOccurrenceMethod.addAdditionalProperty(Field.get("modifiedoccurrences")); getOccurrenceMethod.addAdditionalProperty(Field.get("lastmodified")); executeMethod(getOccurrenceMethod); fixAttendees(getOccurrenceMethod, modifiedOccurrence); // LAST-MODIFIED is missing in event content modifiedOccurrence.setPropertyValue("LAST-MODIFIED", convertDateFromExchange(getOccurrenceMethod.getResponseItem().get(Field.get("lastmodified").getResponseName()))); // fix uid, should be the same as main VEVENT if (calendaruid != null) { modifiedOccurrence.setPropertyValue("UID", calendaruid); } VProperty recurrenceId = modifiedOccurrence.getProperty("RECURRENCE-ID"); if (recurrenceId != null) { recurrenceId.removeParam("TZID"); recurrenceId.getValues().set(0, convertDateFromExchange(occurrence.originalStart)); } } } } // LAST-MODIFIED is missing in event content localVCalendar.setFirstVeventPropertyValue("LAST-MODIFIED", convertDateFromExchange(getItemMethod.getResponseItem().get(Field.get("lastmodified").getResponseName()))); // restore mozilla invitations option localVCalendar.setFirstVeventPropertyValue("X-MOZ-SEND-INVITATIONS", getItemMethod.getResponseItem().get(Field.get("xmozsendinvitations").getResponseName())); // restore mozilla alarm status localVCalendar.setFirstVeventPropertyValue("X-MOZ-LASTACK", getItemMethod.getResponseItem().get(Field.get("xmozlastack").getResponseName())); localVCalendar.setFirstVeventPropertyValue("X-MOZ-SNOOZE-TIME", getItemMethod.getResponseItem().get(Field.get("xmozsnoozetime").getResponseName())); // overwrite method // localVCalendar.setPropertyValue("METHOD", "REQUEST"); content = localVCalendar.toString().getBytes(StandardCharsets.UTF_8); } } catch (IOException | MessagingException e) { throw buildHttpNotFoundException(e); } return content; } protected void fixAttendees(GetItemMethod getItemMethod, VObject vEvent) throws EWSException { if (getItemMethod.getResponseItem() != null) { List attendees = getItemMethod.getResponseItem().getAttendees(); if (attendees != null) { for (EWSMethod.Attendee attendee : attendees) { VProperty attendeeProperty = new VProperty("ATTENDEE", "mailto:" + attendee.email); attendeeProperty.addParam("CN", attendee.name); String myResponseType = getItemMethod.getResponseItem().get(Field.get("myresponsetype").getResponseName()); if (email.equalsIgnoreCase(attendee.email) && myResponseType != null) { attendeeProperty.addParam("PARTSTAT", EWSMethod.responseTypeToPartstat(myResponseType)); } else { attendeeProperty.addParam("PARTSTAT", attendee.partstat); } //attendeeProperty.addParam("RSVP", "TRUE"); attendeeProperty.addParam("ROLE", attendee.role); vEvent.addProperty(attendeeProperty); } } } } } private boolean isExchange2013OrLater() { return "Exchange2013".compareTo(serverVersion) <= 0; } /** * Get all contacts and distribution lists in provided folder. * * @param folderPath Exchange folder path * @return list of contacts * @throws IOException on error */ @Override public List getAllContacts(String folderPath, boolean includeDistList) throws IOException { Condition condition; if (includeDistList) { condition = or(isEqualTo("outlookmessageclass", "IPM.Contact"), isEqualTo("outlookmessageclass", "IPM.DistList")); } else { condition = isEqualTo("outlookmessageclass", "IPM.Contact"); } return searchContacts(folderPath, ExchangeSession.CONTACT_ATTRIBUTES, condition, 0); } @Override public List searchContacts(String folderPath, Set attributes, Condition condition, int maxCount) throws IOException { List contacts = new ArrayList<>(); List responses = searchItems(folderPath, attributes, condition, FolderQueryTraversal.SHALLOW, maxCount); for (EWSMethod.Item response : responses) { contacts.add(new Contact(response)); } return contacts; } @Override protected Condition getCalendarItemCondition(Condition dateCondition) { // tasks in calendar not supported over EWS => do not look for instancetype null return or( // Exchange 2010 or(isTrue("isrecurring"), and(isFalse("isrecurring"), dateCondition)), // Exchange 2007 or(isEqualTo("instancetype", 1), and(isEqualTo("instancetype", 0), dateCondition)) ); } @Override public List getEventMessages(String folderPath) throws IOException { return searchEvents(folderPath, ITEM_PROPERTIES, and(startsWith("outlookmessageclass", "IPM.Schedule.Meeting."), or(isNull("processed"), isFalse("processed")))); } @Override public List searchEvents(String folderPath, Set attributes, Condition condition) throws IOException { List events = new ArrayList<>(); List responses = searchItems(folderPath, attributes, condition, FolderQueryTraversal.SHALLOW, 0); for (EWSMethod.Item response : responses) { Event event = new Event(folderPath, response); if ("Message".equals(event.type)) { // TODO: just exclude // need to check body try { event.getEventContent(); events.add(event); } catch (HttpNotFoundException e) { LOGGER.warn("Ignore invalid event " + event.getHref()); } // exclude exceptions } else if (event.isException) { LOGGER.debug("Exclude recurrence exception " + event.getHref()); } else { events.add(event); } } return events; } /** * Common item properties */ protected static final Set ITEM_PROPERTIES = new HashSet<>(); static { ITEM_PROPERTIES.add("etag"); ITEM_PROPERTIES.add("displayname"); // calendar CdoInstanceType ITEM_PROPERTIES.add("instancetype"); ITEM_PROPERTIES.add("urlcompname"); ITEM_PROPERTIES.add("subject"); } protected static final HashSet EVENT_REQUEST_PROPERTIES = new HashSet<>(); static { EVENT_REQUEST_PROPERTIES.add("permanenturl"); EVENT_REQUEST_PROPERTIES.add("etag"); EVENT_REQUEST_PROPERTIES.add("displayname"); EVENT_REQUEST_PROPERTIES.add("subject"); EVENT_REQUEST_PROPERTIES.add("urlcompname"); EVENT_REQUEST_PROPERTIES.add("displayto"); EVENT_REQUEST_PROPERTIES.add("displaycc"); EVENT_REQUEST_PROPERTIES.add("xmozlastack"); EVENT_REQUEST_PROPERTIES.add("xmozsnoozetime"); } protected static final HashSet CALENDAR_ITEM_REQUEST_PROPERTIES = new HashSet<>(); static { CALENDAR_ITEM_REQUEST_PROPERTIES.addAll(EVENT_REQUEST_PROPERTIES); CALENDAR_ITEM_REQUEST_PROPERTIES.add("ismeeting"); CALENDAR_ITEM_REQUEST_PROPERTIES.add("myresponsetype"); } @Override protected Set getItemProperties() { return ITEM_PROPERTIES; } protected EWSMethod.Item getEwsItem(String folderPath, String itemName, Set itemProperties) throws IOException { EWSMethod.Item item = null; String urlcompname = convertItemNameToEML(itemName); // workaround for missing urlcompname in Exchange 2010 if (isItemId(urlcompname)) { ItemId itemId = new ItemId(StringUtil.urlToBase64(urlcompname.substring(0, urlcompname.indexOf('.')))); GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, false); for (String attribute : itemProperties) { getItemMethod.addAdditionalProperty(Field.get(attribute)); } executeMethod(getItemMethod); item = getItemMethod.getResponseItem(); } // find item by urlcompname if (item == null) { List responses = searchItems(folderPath, itemProperties, isEqualTo("urlcompname", urlcompname), FolderQueryTraversal.SHALLOW, 0); if (!responses.isEmpty()) { item = responses.get(0); } } return item; } @Override public Item getItem(String folderPath, String itemName) throws IOException { EWSMethod.Item item = getEwsItem(folderPath, itemName, EVENT_REQUEST_PROPERTIES); if (item == null && isMainCalendar(folderPath)) { // look for item in task folder, replace extension first if (itemName.endsWith(".ics")) { item = getEwsItem(TASKS, itemName.substring(0, itemName.length() - 3) + "EML", EVENT_REQUEST_PROPERTIES); } else { item = getEwsItem(TASKS, itemName, EVENT_REQUEST_PROPERTIES); } } if (item == null) { throw new HttpNotFoundException(itemName + " not found in " + folderPath); } String itemType = item.type; if ("Contact".equals(itemType) || "DistributionList".equals(itemType)) { // retrieve Contact properties ItemId itemId = new ItemId(item); GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, false); Set attributes = CONTACT_ATTRIBUTES; if ("DistributionList".equals(itemType)) { attributes = DISTRIBUTION_LIST_ATTRIBUTES; } for (String attribute : attributes) { getItemMethod.addAdditionalProperty(Field.get(attribute)); } executeMethod(getItemMethod); item = getItemMethod.getResponseItem(); if (item == null) { throw new HttpNotFoundException(itemName + " not found in " + folderPath); } return new Contact(item); } else if ("CalendarItem".equals(itemType) || "MeetingMessage".equals(itemType) || "MeetingRequest".equals(itemType) || "MeetingResponse".equals(itemType) || "MeetingCancellation".equals(itemType) || "Task".equals(itemType) // VTODOs appear as Messages || "Message".equals(itemType)) { Event event = new Event(folderPath, item); // force item name to client provided name (for tasks) event.setItemName(itemName); return event; } else { throw new HttpNotFoundException(itemName + " not found in " + folderPath); } } @Override public ContactPhoto getContactPhoto(ExchangeSession.Contact contact) throws IOException { ContactPhoto contactPhoto; GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, ((EwsExchangeSession.Contact) contact).itemId, false); getItemMethod.addAdditionalProperty(Field.get("attachments")); executeMethod(getItemMethod); EWSMethod.Item item = getItemMethod.getResponseItem(); if (item == null) { throw new IOException("Missing contact picture"); } FileAttachment attachment = item.getAttachmentByName("ContactPicture.jpg"); if (attachment == null) { throw new IOException("Missing contact picture"); } // get attachment content GetAttachmentMethod getAttachmentMethod = new GetAttachmentMethod(attachment.attachmentId); executeMethod(getAttachmentMethod); contactPhoto = new ContactPhoto(); contactPhoto.content = getAttachmentMethod.getResponseItem().get("Content"); if (attachment.contentType == null) { contactPhoto.contentType = "image/jpeg"; } else { contactPhoto.contentType = attachment.contentType; } return contactPhoto; } @Override public ContactPhoto getADPhoto(String email) { ContactPhoto contactPhoto = null; if (email != null) { try { GetUserPhotoMethod userPhotoMethod = new GetUserPhotoMethod(email, GetUserPhotoMethod.SizeRequested.HR240x240); executeMethod(userPhotoMethod); if (userPhotoMethod.getPictureData() != null) { contactPhoto = new ContactPhoto(); contactPhoto.content = userPhotoMethod.getPictureData(); contactPhoto.contentType = userPhotoMethod.getContentType(); if (contactPhoto.contentType == null) { contactPhoto.contentType = "image/jpeg"; } } } catch (IOException e) { LOGGER.debug("Error loading contact image from AD " + e + " " + e.getMessage()); } } return contactPhoto; } @Override public void deleteItem(String folderPath, String itemName) throws IOException { EWSMethod.Item item = getEwsItem(folderPath, itemName, EVENT_REQUEST_PROPERTIES); if (item != null && "CalendarItem".equals(item.type)) { // reload with calendar property if (serverVersion.compareTo("Exchange2013") >= 0) { CALENDAR_ITEM_REQUEST_PROPERTIES.add("isorganizer"); } item = getEwsItem(folderPath, itemName, CALENDAR_ITEM_REQUEST_PROPERTIES); } if (item == null && isMainCalendar(folderPath)) { // look for item in task folder item = getEwsItem(TASKS, itemName, EVENT_REQUEST_PROPERTIES); } if (item != null) { boolean isMeeting = "true".equals(item.get(Field.get("ismeeting").getResponseName())); boolean isOrganizer; if (item.get(Field.get("isorganizer").getResponseName()) != null) { // Exchange 2013 or later isOrganizer = "true".equals(item.get(Field.get("isorganizer").getResponseName())); } else { isOrganizer = "Organizer".equals(item.get(Field.get("myresponsetype").getResponseName())); } boolean hasAttendees = item.get(Field.get("displayto").getResponseName()) != null || item.get(Field.get("displaycc").getResponseName()) != null; if (isMeeting && isOrganizer && hasAttendees && !isSharedFolder(folderPath) && Settings.getBooleanProperty("davmail.caldavAutoSchedule", true)) { // cancel meeting SendMeetingInvitations sendMeetingInvitations = SendMeetingInvitations.SendToAllAndSaveCopy; MessageDisposition messageDisposition = MessageDisposition.SendAndSaveCopy; String body = null; // This is a meeting cancel, let user edit notification message if (Settings.getBooleanProperty("davmail.caldavEditNotifications")) { String vEventSubject = item.get(Field.get("subject").getResponseName()); if (vEventSubject == null) { vEventSubject = ""; } String notificationSubject = (BundleMessage.format("CANCELLED") + vEventSubject); NotificationDialog notificationDialog = new NotificationDialog(notificationSubject, ""); if (!notificationDialog.getSendNotification()) { LOGGER.debug("Notification canceled by user"); sendMeetingInvitations = SendMeetingInvitations.SendToNone; messageDisposition = MessageDisposition.SaveOnly; } // get description from dialog body = notificationDialog.getBody(); } EWSMethod.Item cancelItem = new EWSMethod.Item(); cancelItem.type = "CancelCalendarItem"; cancelItem.referenceItemId = new ItemId("ReferenceItemId", item); if (body != null && body.length() > 0) { item.put("Body", body); } CreateItemMethod cancelItemMethod = new CreateItemMethod(messageDisposition, sendMeetingInvitations, getFolderId(SENT), cancelItem ); executeMethod(cancelItemMethod); } else { DeleteType deleteType = DeleteType.MoveToDeletedItems; if (isSharedFolder(folderPath)) { // can't move event to trash in a shared mailbox deleteType = DeleteType.HardDelete; } // delete item DeleteItemMethod deleteItemMethod = new DeleteItemMethod(new ItemId(item), deleteType, SendMeetingCancellations.SendToAllAndSaveCopy); executeMethod(deleteItemMethod); } } } @Override public void processItem(String folderPath, String itemName) throws IOException { EWSMethod.Item item = getEwsItem(folderPath, itemName, EVENT_REQUEST_PROPERTIES); if (item != null) { HashMap localProperties = new HashMap<>(); localProperties.put("processed", "1"); localProperties.put("read", "1"); UpdateItemMethod updateItemMethod = new UpdateItemMethod(MessageDisposition.SaveOnly, ConflictResolution.AlwaysOverwrite, SendMeetingInvitationsOrCancellations.SendToNone, new ItemId(item), buildProperties(localProperties)); executeMethod(updateItemMethod); } } @Override public int sendEvent(String icsBody) throws IOException { String itemName = UUID.randomUUID() + ".EML"; byte[] mimeContent = new Event(DRAFTS, itemName, "urn:content-classes:calendarmessage", icsBody, null, null).createMimeContent(); if (mimeContent == null) { // no recipients, cancel return HttpStatus.SC_NO_CONTENT; } else { sendMessage(null, mimeContent); return HttpStatus.SC_OK; } } @Override protected Contact buildContact(String folderPath, String itemName, Map properties, String etag, String noneMatch) { return new Contact(folderPath, itemName, properties, StringUtil.removeQuotes(etag), noneMatch); } @Override protected ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException { return new Event(folderPath, itemName, contentClass, icsBody, StringUtil.removeQuotes(etag), noneMatch).createOrUpdate(); } @Override public boolean isSharedFolder(String folderPath) { return folderPath.startsWith("/") && !folderPath.toLowerCase().startsWith(currentMailboxPath); } @Override public boolean isMainCalendar(String folderPath) throws IOException { FolderId currentFolderId = getFolderId(folderPath); FolderId calendarFolderId = getFolderId("calendar"); return calendarFolderId.name.equals(currentFolderId.name) && calendarFolderId.value.equals(currentFolderId.value); } @Override protected String getFreeBusyData(String attendee, String start, String end, int interval) { String result = null; GetUserAvailabilityMethod getUserAvailabilityMethod = new GetUserAvailabilityMethod(attendee, start, end, interval); try { executeMethod(getUserAvailabilityMethod); result = getUserAvailabilityMethod.getMergedFreeBusy(); } catch (IOException e) { // ignore } return result; } @Override protected void loadVtimezone() { try { String timezoneId = null; timezoneId = Settings.getProperty("davmail.timezoneId"); if (timezoneId == null && !"Exchange2007_SP1".equals(serverVersion)) { // On Exchange 2010, get user timezone from server GetUserConfigurationMethod getUserConfigurationMethod = new GetUserConfigurationMethod(); executeMethod(getUserConfigurationMethod); EWSMethod.Item item = getUserConfigurationMethod.getResponseItem(); if (item != null) { timezoneId = item.get("timezone"); } } else if (!directEws) { timezoneId = getTimezoneidFromOptions(); } // failover: use timezone id from settings file // last failover: use GMT if (timezoneId == null) { LOGGER.warn("Unable to get user timezone, using GMT Standard Time. Set davmail.timezoneId setting to override this."); timezoneId = "GMT Standard Time"; } // delete existing temp folder first to avoid errors deleteFolder("davmailtemp"); createCalendarFolder("davmailtemp", null); EWSMethod.Item item = new EWSMethod.Item(); item.type = "CalendarItem"; if (!"Exchange2007_SP1".equals(serverVersion)) { SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH); dateFormatter.setTimeZone(GMT_TIMEZONE); Calendar cal = Calendar.getInstance(); item.put("Start", dateFormatter.format(cal.getTime())); cal.add(Calendar.DAY_OF_MONTH, 1); item.put("End", dateFormatter.format(cal.getTime())); item.put("StartTimeZone", timezoneId); } else { item.put("MeetingTimeZone", timezoneId); } CreateItemMethod createItemMethod = new CreateItemMethod(MessageDisposition.SaveOnly, SendMeetingInvitations.SendToNone, getFolderId("davmailtemp"), item); executeMethod(createItemMethod); item = createItemMethod.getResponseItem(); if (item == null) { throw new IOException("Empty timezone item"); } VCalendar vCalendar = new VCalendar(getContent(new ItemId(item)), email, null); this.vTimezone = vCalendar.getVTimezone(); // delete temporary folder deleteFolder("davmailtemp"); } catch (IOException e) { LOGGER.warn("Unable to get VTIMEZONE info: " + e, e); } } protected String getTimezoneidFromOptions() { String result = null; // get time zone setting from html body String optionsPath = "/owa/?ae=Options&t=Regional"; GetRequest optionsMethod = new GetRequest(optionsPath); try ( CloseableHttpResponse response = httpClient.execute(optionsMethod); BufferedReader optionsPageReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), StandardCharsets.UTF_8)) ) { String line; // find timezone //noinspection StatementWithEmptyBody while ((line = optionsPageReader.readLine()) != null && (!line.contains("tblTmZn")) && (!line.contains("selTmZn"))) { } if (line != null) { if (line.contains("tblTmZn")) { int start = line.indexOf("oV=\"") + 4; int end = line.indexOf('\"', start); result = line.substring(start, end); } else { int end = line.lastIndexOf("\" selected>"); int start = line.lastIndexOf('\"', end - 1); result = line.substring(start + 1, end); } } } catch (IOException e) { LOGGER.error("Error parsing options page at " + optionsPath); } return result; } protected FolderId getFolderId(String folderPath) throws IOException { FolderId folderId = getFolderIdIfExists(folderPath); if (folderId == null) { throw new HttpNotFoundException("Folder '" + folderPath + "' not found"); } return folderId; } protected static final String USERS_ROOT = "/users/"; protected FolderId getFolderIdIfExists(String folderPath) throws IOException { String lowerCaseFolderPath = folderPath.toLowerCase(); if (lowerCaseFolderPath.equals(currentMailboxPath)) { return getSubFolderIdIfExists(null, ""); } else if (lowerCaseFolderPath.startsWith(currentMailboxPath + '/')) { return getSubFolderIdIfExists(null, folderPath.substring(currentMailboxPath.length() + 1)); } else if (folderPath.startsWith("/users/")) { int slashIndex = folderPath.indexOf('/', USERS_ROOT.length()); String mailbox; String subFolderPath; if (slashIndex >= 0) { mailbox = folderPath.substring(USERS_ROOT.length(), slashIndex); subFolderPath = folderPath.substring(slashIndex + 1); } else { mailbox = folderPath.substring(USERS_ROOT.length()); subFolderPath = ""; } return getSubFolderIdIfExists(mailbox, subFolderPath); } else { return getSubFolderIdIfExists(null, folderPath); } } protected FolderId getSubFolderIdIfExists(String mailbox, String folderPath) throws IOException { String[] folderNames; FolderId currentFolderId; if ("/public".equals(folderPath)) { return DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.publicfoldersroot); } else if ("/archive".equals(folderPath)) { return DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.archivemsgfolderroot); } else if (isSubFolderOf(folderPath, PUBLIC_ROOT)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.publicfoldersroot); folderNames = folderPath.substring(PUBLIC_ROOT.length()).split("/"); } else if (isSubFolderOf(folderPath, ARCHIVE_ROOT)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.archivemsgfolderroot); folderNames = folderPath.substring(ARCHIVE_ROOT.length()).split("/"); } else if (isSubFolderOf(folderPath, INBOX) || isSubFolderOf(folderPath, LOWER_CASE_INBOX) || isSubFolderOf(folderPath, MIXED_CASE_INBOX)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.inbox); folderNames = folderPath.substring(INBOX.length()).split("/"); } else if (isSubFolderOf(folderPath, CALENDAR)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.calendar); folderNames = folderPath.substring(CALENDAR.length()).split("/"); } else if (isSubFolderOf(folderPath, TASKS)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.tasks); folderNames = folderPath.substring(TASKS.length()).split("/"); } else if (isSubFolderOf(folderPath, CONTACTS)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.contacts); folderNames = folderPath.substring(CONTACTS.length()).split("/"); } else if (isSubFolderOf(folderPath, SENT)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.sentitems); folderNames = folderPath.substring(SENT.length()).split("/"); } else if (isSubFolderOf(folderPath, DRAFTS)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.drafts); folderNames = folderPath.substring(DRAFTS.length()).split("/"); } else if (isSubFolderOf(folderPath, TRASH)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.deleteditems); folderNames = folderPath.substring(TRASH.length()).split("/"); } else if (isSubFolderOf(folderPath, JUNK)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.junkemail); folderNames = folderPath.substring(JUNK.length()).split("/"); } else if (isSubFolderOf(folderPath, UNSENT)) { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.outbox); folderNames = folderPath.substring(UNSENT.length()).split("/"); } else { currentFolderId = DistinguishedFolderId.getInstance(mailbox, DistinguishedFolderId.Name.msgfolderroot); folderNames = folderPath.split("/"); } for (String folderName : folderNames) { if (folderName.length() > 0) { currentFolderId = getSubFolderByName(currentFolderId, folderName); if (currentFolderId == null) { break; } } } return currentFolderId; } /** * Check if folderPath is base folder or a sub folder path. * * @param folderPath folder path * @param baseFolder base folder * @return true if folderPath is under baseFolder */ private boolean isSubFolderOf(String folderPath, String baseFolder) { if (PUBLIC_ROOT.equals(baseFolder) || ARCHIVE_ROOT.equals(baseFolder)) { return folderPath.startsWith(baseFolder); } else { return folderPath.startsWith(baseFolder) && (folderPath.length() == baseFolder.length() || folderPath.charAt(baseFolder.length()) == '/'); } } protected FolderId getSubFolderByName(FolderId parentFolderId, String folderName) throws IOException { FolderId folderId = null; FindFolderMethod findFolderMethod = new FindFolderMethod( FolderQueryTraversal.SHALLOW, BaseShape.ID_ONLY, parentFolderId, FOLDER_PROPERTIES, new TwoOperandExpression(TwoOperandExpression.Operator.IsEqualTo, Field.get("folderDisplayName"), decodeFolderName(folderName)), 0, 1 ); executeMethod(findFolderMethod); EWSMethod.Item item = findFolderMethod.getResponseItem(); if (item != null) { folderId = new FolderId(item); } return folderId; } public static String decodeFolderName(String folderName) { if (folderName.contains("_xF8FF_")) { return folderName.replaceAll("_xF8FF_", "/"); } if (folderName.contains("_x003E_")) { return folderName.replaceAll("_x003E_", ">"); } return folderName; } public static String encodeFolderName(String folderName) { if (folderName.contains("/")) { folderName = folderName.replaceAll("/", "_xF8FF_"); } if (folderName.contains(">")) { folderName = folderName.replaceAll(">", "_x003E_"); } return folderName; } long throttlingTimestamp = 0; protected int executeMethod(EWSMethod ewsMethod) throws IOException { long throttlingDelay = throttlingTimestamp - System.currentTimeMillis(); try { if (throttlingDelay > 0) { LOGGER.warn("Throttling active on server, waiting " + (throttlingDelay / 1000) + " seconds"); try { Thread.sleep(throttlingDelay); } catch (InterruptedException e1) { LOGGER.error("Throttling delay interrupted " + e1.getMessage()); Thread.currentThread().interrupt(); } } internalExecuteMethod(ewsMethod); } catch (EWSThrottlingException e) { // default throttling delay is one minute throttlingDelay = 60000; if (ewsMethod.backOffMilliseconds > 0) { // server provided a throttling delay, add 10 seconds throttlingDelay = ewsMethod.backOffMilliseconds + 10000; } throttlingTimestamp = System.currentTimeMillis() + throttlingDelay; LOGGER.warn("Throttling active on server, waiting " + (throttlingDelay / 1000) + " seconds"); try { Thread.sleep(throttlingDelay); } catch (InterruptedException e1) { LOGGER.error("Throttling delay interrupted " + e1.getMessage()); Thread.currentThread().interrupt(); } // retry once internalExecuteMethod(ewsMethod); } return ewsMethod.getStatusCode(); } protected void internalExecuteMethod(EWSMethod ewsMethod) throws IOException { ewsMethod.setServerVersion(serverVersion); if (token != null) { ewsMethod.setHeader("Authorization", "Bearer " + token.getAccessToken()); } try (CloseableHttpResponse response = httpClient.execute(ewsMethod)) { ewsMethod.handleResponse(response); } if (serverVersion == null) { serverVersion = ewsMethod.getServerVersion(); } ewsMethod.checkSuccess(); } protected static final HashMap GALFIND_ATTRIBUTE_MAP = new HashMap<>(); static { GALFIND_ATTRIBUTE_MAP.put("imapUid", "Name"); GALFIND_ATTRIBUTE_MAP.put("cn", "DisplayName"); GALFIND_ATTRIBUTE_MAP.put("givenName", "GivenName"); GALFIND_ATTRIBUTE_MAP.put("sn", "Surname"); GALFIND_ATTRIBUTE_MAP.put("smtpemail1", "EmailAddress"); GALFIND_ATTRIBUTE_MAP.put("roomnumber", "OfficeLocation"); GALFIND_ATTRIBUTE_MAP.put("street", "BusinessStreet"); GALFIND_ATTRIBUTE_MAP.put("l", "BusinessCity"); GALFIND_ATTRIBUTE_MAP.put("o", "CompanyName"); GALFIND_ATTRIBUTE_MAP.put("postalcode", "BusinessPostalCode"); GALFIND_ATTRIBUTE_MAP.put("st", "BusinessState"); GALFIND_ATTRIBUTE_MAP.put("co", "BusinessCountryOrRegion"); GALFIND_ATTRIBUTE_MAP.put("manager", "Manager"); GALFIND_ATTRIBUTE_MAP.put("middlename", "Initials"); GALFIND_ATTRIBUTE_MAP.put("title", "JobTitle"); GALFIND_ATTRIBUTE_MAP.put("department", "Department"); GALFIND_ATTRIBUTE_MAP.put("otherTelephone", "OtherTelephone"); GALFIND_ATTRIBUTE_MAP.put("telephoneNumber", "BusinessPhone"); GALFIND_ATTRIBUTE_MAP.put("mobile", "MobilePhone"); GALFIND_ATTRIBUTE_MAP.put("facsimiletelephonenumber", "BusinessFax"); GALFIND_ATTRIBUTE_MAP.put("secretarycn", "AssistantName"); GALFIND_ATTRIBUTE_MAP.put("homePhone", "HomePhone"); GALFIND_ATTRIBUTE_MAP.put("pager", "Pager"); GALFIND_ATTRIBUTE_MAP.put("msexchangecertificate", "MSExchangeCertificate"); GALFIND_ATTRIBUTE_MAP.put("usersmimecertificate", "UserSMIMECertificate"); } protected static final HashSet IGNORE_ATTRIBUTE_SET = new HashSet<>(); static { IGNORE_ATTRIBUTE_SET.add("ContactSource"); IGNORE_ATTRIBUTE_SET.add("Culture"); IGNORE_ATTRIBUTE_SET.add("AssistantPhone"); } protected Contact buildGalfindContact(EWSMethod.Item response) { Contact contact = new Contact(); contact.setName(response.get("Name")); contact.put("imapUid", response.get("Name")); contact.put("uid", response.get("Name")); if (LOGGER.isDebugEnabled()) { for (Map.Entry entry : response.entrySet()) { String key = entry.getKey(); if (!IGNORE_ATTRIBUTE_SET.contains(key) && !GALFIND_ATTRIBUTE_MAP.containsValue(key)) { LOGGER.debug("Unsupported ResolveNames " + contact.getName() + " response attribute: " + key + " value: " + entry.getValue()); } } } for (Map.Entry entry : GALFIND_ATTRIBUTE_MAP.entrySet()) { String attributeValue = response.get(entry.getValue()); if (attributeValue != null && !attributeValue.isEmpty()) { contact.put(entry.getKey(), attributeValue); } } return contact; } @Override public Map galFind(Condition condition, Set returningAttributes, int sizeLimit) throws IOException { Map contacts = new HashMap<>(); if (condition instanceof MultiCondition) { List conditions = ((ExchangeSession.MultiCondition) condition).getConditions(); Operator operator = ((ExchangeSession.MultiCondition) condition).getOperator(); if (operator == Operator.Or) { for (Condition innerCondition : conditions) { contacts.putAll(galFind(innerCondition, returningAttributes, sizeLimit)); } } else if (operator == Operator.And && !conditions.isEmpty()) { Map innerContacts = galFind(conditions.get(0), returningAttributes, sizeLimit); for (ExchangeSession.Contact contact : innerContacts.values()) { if (condition.isMatch(contact)) { contacts.put(contact.getName().toLowerCase(), contact); } } } } else if (condition instanceof AttributeCondition) { String mappedAttributeName = GALFIND_ATTRIBUTE_MAP.get(((ExchangeSession.AttributeCondition) condition).getAttributeName()); if (mappedAttributeName != null) { String value = ((ExchangeSession.AttributeCondition) condition).getValue().toLowerCase(); Operator operator = ((AttributeCondition) condition).getOperator(); String searchValue = value; if (mappedAttributeName.startsWith("EmailAddress")) { searchValue = "smtp:" + searchValue; } if (operator == Operator.IsEqualTo) { searchValue = '=' + searchValue; } ResolveNamesMethod resolveNamesMethod = new ResolveNamesMethod(searchValue); executeMethod(resolveNamesMethod); List responses = resolveNamesMethod.getResponseItems(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("ResolveNames(" + searchValue + ") returned " + responses.size() + " results"); } for (EWSMethod.Item response : responses) { Contact contact = buildGalfindContact(response); if (condition.isMatch(contact)) { contacts.put(contact.getName().toLowerCase(), contact); } } } } return contacts; } protected Date parseDateFromExchange(String exchangeDateValue) throws DavMailException { Date dateValue = null; if (exchangeDateValue != null) { try { dateValue = getExchangeZuluDateFormat().parse(exchangeDateValue); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", exchangeDateValue); } } return dateValue; } protected String convertDateFromExchange(String exchangeDateValue) throws DavMailException { // yyyy-MM-dd'T'HH:mm:ss'Z' to yyyyMMdd'T'HHmmss'Z' if (exchangeDateValue == null) { return null; } else { if (exchangeDateValue.length() != 20) { throw new DavMailException("EXCEPTION_INVALID_DATE", exchangeDateValue); } StringBuilder buffer = new StringBuilder(); for (int i = 0; i < exchangeDateValue.length(); i++) { if (i == 4 || i == 7 || i == 13 || i == 16) { i++; } buffer.append(exchangeDateValue.charAt(i)); } return buffer.toString(); } } protected String convertCalendarDateToExchange(String vcalendarDateValue) throws DavMailException { String zuluDateValue = null; if (vcalendarDateValue != null) { try { SimpleDateFormat dateParser; if (vcalendarDateValue.length() == 8) { dateParser = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); } else { dateParser = new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH); } dateParser.setTimeZone(GMT_TIMEZONE); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH); dateFormatter.setTimeZone(GMT_TIMEZONE); zuluDateValue = dateFormatter.format(dateParser.parse(vcalendarDateValue)); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", vcalendarDateValue); } } return zuluDateValue; } protected String convertDateFromExchangeToTaskDate(String exchangeDateValue) throws DavMailException { String zuluDateValue = null; if (exchangeDateValue != null) { try { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); dateFormat.setTimeZone(GMT_TIMEZONE); zuluDateValue = dateFormat.format(getExchangeZuluDateFormat().parse(exchangeDateValue)); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", exchangeDateValue); } } return zuluDateValue; } protected String convertTaskDateToZulu(String value) { String result = null; if (value != null && value.length() > 0) { try { SimpleDateFormat parser = ExchangeSession.getExchangeDateFormat(value); Calendar calendarValue = Calendar.getInstance(GMT_TIMEZONE); calendarValue.setTime(parser.parse(value)); // zulu time: add 12 hours if (value.length() == 16) { calendarValue.add(Calendar.HOUR, 12); } calendarValue.set(Calendar.HOUR, 0); calendarValue.set(Calendar.MINUTE, 0); calendarValue.set(Calendar.SECOND, 0); result = ExchangeSession.getExchangeZuluDateFormat().format(calendarValue.getTime()); } catch (ParseException e) { LOGGER.warn("Invalid date: " + value); } } return result; } /** * Format date to exchange search format. * * @param date date object * @return formatted search date */ @Override public String formatSearchDate(Date date) { SimpleDateFormat dateFormatter = new SimpleDateFormat(YYYY_MM_DD_T_HHMMSS_Z, Locale.ENGLISH); dateFormatter.setTimeZone(GMT_TIMEZONE); return dateFormatter.format(date); } /** * Check if itemName is long and base64 encoded. * User generated item names are usually short * * @param itemName item name * @return true if itemName is an EWS item id */ protected static boolean isItemId(String itemName) { return itemName.length() >= 140 // item name is base64url && itemName.matches("^([A-Za-z0-9-_]{4})*([A-Za-z0-9-_]{4}|[A-Za-z0-9-_]{3}=|[A-Za-z0-9-_]{2}==)\\.EML$") && itemName.indexOf(' ') < 0; } protected static final Map importanceToPriorityMap = new HashMap<>(); static { importanceToPriorityMap.put("High", "1"); importanceToPriorityMap.put("Normal", "5"); importanceToPriorityMap.put("Low", "9"); } protected static final Map priorityToImportanceMap = new HashMap<>(); static { // 0 means undefined, map it to normal priorityToImportanceMap.put("0", "Normal"); priorityToImportanceMap.put("1", "High"); priorityToImportanceMap.put("2", "High"); priorityToImportanceMap.put("3", "High"); priorityToImportanceMap.put("4", "Normal"); priorityToImportanceMap.put("5", "Normal"); priorityToImportanceMap.put("6", "Normal"); priorityToImportanceMap.put("7", "Low"); priorityToImportanceMap.put("8", "Low"); priorityToImportanceMap.put("9", "Low"); } protected String convertPriorityFromExchange(String exchangeImportanceValue) { String value = null; if (exchangeImportanceValue != null) { value = importanceToPriorityMap.get(exchangeImportanceValue); } return value; } protected String convertPriorityToExchange(String vTodoPriorityValue) { String value = null; if (vTodoPriorityValue != null) { value = priorityToImportanceMap.get(vTodoPriorityValue); } return value; } /** * Close session. * Shutdown http client connection manager */ @Override public void close() { httpClient.close(); } } davmail-6.3.0/src/java/davmail/exchange/ews/ExpandDLMethod.java0100644 0000000 0000000 00000015037 13574116520 023046 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.XMLStreamUtil; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; /** * Expand distribution list. */ public class ExpandDLMethod extends EWSMethod { /** * Build Resolve Names method * * @param value search value */ public ExpandDLMethod(String value) { super("Mailbox", "ExpandDL", "ExpandDLResponseMessage"); unresolvedEntry = new ElementOption("m:Mailbox", new ElementOption("t:EmailAddress", value)); } @Override protected EWSMethod.Item handleItem(XMLStreamReader reader) throws XMLStreamException { EWSMethod.Item responseItem = new EWSMethod.Item(); responseItem.type = "Contact"; // skip to Contact while (reader.hasNext() && !XMLStreamUtil.isStartTag(reader, "Resolution")) { reader.next(); } while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Resolution")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Mailbox".equals(tagLocalName)) { handleMailbox(reader, responseItem); } else if ("Contact".equals(tagLocalName)) { handleContact(reader, responseItem); } } } return responseItem; } protected void handleMailbox(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Mailbox")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Name".equals(tagLocalName)) { responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader)); } else if ("EmailAddress".equals(tagLocalName)) { responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader)); } } } } protected void handleContact(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Contact")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("EmailAddresses".equals(tagLocalName)) { handleEmailAddresses(reader, responseItem); } else if ("PhysicalAddresses".equals(tagLocalName)) { handlePhysicalAddresses(reader, responseItem); } else if ("PhoneNumbers".equals(tagLocalName)) { handlePhoneNumbers(reader, responseItem); } else { responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader)); } } } } protected void handlePhysicalAddress(XMLStreamReader reader, EWSMethod.Item responseItem, String addressType) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Entry")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); String value = XMLStreamUtil.getElementText(reader); responseItem.put(addressType + tagLocalName, value); } } } protected void handlePhysicalAddresses(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhysicalAddresses")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Entry".equals(tagLocalName)) { String key = getAttributeValue(reader, "Key"); handlePhysicalAddress(reader, responseItem, key); } } } } protected void handlePhoneNumbers(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhoneNumbers")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Entry".equals(tagLocalName)) { String key = getAttributeValue(reader, "Key"); String value = XMLStreamUtil.getElementText(reader); responseItem.put(key, value); } } } } @Override protected void handleEmailAddresses(XMLStreamReader reader, EWSMethod.Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "EmailAddresses")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Entry".equals(tagLocalName)) { String value = XMLStreamUtil.getElementText(reader); if (value != null) { if (value.startsWith("smtp:") || value.startsWith("SMTP:")) { value = value.substring(5); // get smtp address only if not already available through Mailbox info responseItem.putIfAbsent("EmailAddress", value); } } } } } } } davmail-6.3.0/src/java/davmail/exchange/ews/ExtendedFieldURI.java0100644 0000000 0000000 00000014412 14754153476 023342 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.util.StringUtil; /** * Extended MAPI property. */ public class ExtendedFieldURI implements FieldURI { @SuppressWarnings({"UnusedDeclaration"}) protected enum PropertyType { ApplicationTime, ApplicationTimeArray, Binary, BinaryArray, Boolean, CLSID, CLSIDArray, Currency, CurrencyArray, Double, DoubleArray, Error, Float, FloatArray, Integer, IntegerArray, Long, LongArray, Null, Object, ObjectArray, Short, ShortArray, SystemTime, SystemTimeArray, String, StringArray } @SuppressWarnings({"UnusedDeclaration"}) protected enum DistinguishedPropertySetType { Meeting, Appointment, Common, PublicStrings, Address, InternetHeaders, CalendarAssistant, UnifiedMessaging, Task } protected String propertyTag; protected DistinguishedPropertySetType distinguishedPropertySetId; protected String propertyName; protected int propertyId; protected final PropertyType propertyType; /** * Create extended field uri. * * @param intPropertyTag property tag as int * @param propertyType property type */ public ExtendedFieldURI(int intPropertyTag, PropertyType propertyType) { this.propertyTag = "0x" + Integer.toHexString(intPropertyTag); this.propertyType = propertyType; } /** * Create extended field uri. * * @param distinguishedPropertySetId distinguished property set id * @param propertyId property id * @param propertyType property type */ public ExtendedFieldURI(DistinguishedPropertySetType distinguishedPropertySetId, int propertyId, PropertyType propertyType) { this.distinguishedPropertySetId = distinguishedPropertySetId; this.propertyId = propertyId; this.propertyType = propertyType; } /** * Create extended field uri. * * @param distinguishedPropertySetId distinguished property set id * @param propertyName property name */ public ExtendedFieldURI(DistinguishedPropertySetType distinguishedPropertySetId, String propertyName) { this.distinguishedPropertySetId = distinguishedPropertySetId; this.propertyName = propertyName; this.propertyType = PropertyType.String; } /** * Create extended field uri. * * @param distinguishedPropertySetId distinguished property set id * @param propertyName property name * @param propertyType property type */ public ExtendedFieldURI(DistinguishedPropertySetType distinguishedPropertySetId, String propertyName, PropertyType propertyType) { this.distinguishedPropertySetId = distinguishedPropertySetId; this.propertyName = propertyName; this.propertyType = propertyType; } public void appendTo(StringBuilder buffer) { buffer.append(""); } public void appendValue(StringBuilder buffer, String itemType, String value) { if (itemType != null) { appendTo(buffer); buffer.append("'); } buffer.append(""); appendTo(buffer); if (propertyType == PropertyType.StringArray) { buffer.append(""); String[] values = value.split(","); for (final String singleValue : values) { buffer.append(""); buffer.append(StringUtil.xmlEncode(singleValue)); buffer.append(""); } buffer.append(""); } else { buffer.append(""); if ("0x10f3".equals(propertyTag)) { buffer.append(StringUtil.xmlEncode(StringUtil.encodeUrlcompname(value))); } else { buffer.append(StringUtil.xmlEncode(value)); } buffer.append(""); } buffer.append(""); if (itemType != null) { buffer.append("'); } } /** * Field name in EWS response. * * @return field name in response */ public String getResponseName() { if (propertyTag != null) { return propertyTag; } else if (propertyName != null) { return propertyName; } else { return String.valueOf(propertyId); } } @Override public String getGraphId() { return propertyType.name()+" "+propertyTag; } } davmail-6.3.0/src/java/davmail/exchange/ews/Field.java0100644 0000000 0000000 00000055400 14754153476 021303 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.HashMap; import java.util.Map; /** * EWS MAPI fields; */ public final class Field { private static final Map FIELD_MAP = new HashMap<>(); private Field() { } static { // items FIELD_MAP.put("etag", new ExtendedFieldURI(0x3008, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("displayname", new ExtendedFieldURI(0x3001, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("urlcompname", new ExtendedFieldURI(0x10f3, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("lastmodified", new ExtendedFieldURI(0x3008, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("created", new ExtendedFieldURI(0x3007, ExtendedFieldURI.PropertyType.SystemTime)); // folder FIELD_MAP.put("ctag", new ExtendedFieldURI(0x670a, ExtendedFieldURI.PropertyType.SystemTime)); // PR_LOCAL_COMMIT_TIME_MAX FIELD_MAP.put("count", new ExtendedFieldURI(0x3602, ExtendedFieldURI.PropertyType.Integer)); // PR_CONTENT_COUNT FIELD_MAP.put("unread", new ExtendedFieldURI(0x3603, ExtendedFieldURI.PropertyType.Integer)); // PR_CONTENT_UNREAD FIELD_MAP.put("hassubs", new ExtendedFieldURI(0x360a, ExtendedFieldURI.PropertyType.Boolean)); // PR_SUBFOLDERS FIELD_MAP.put("folderDisplayName", new UnindexedFieldURI("folder:DisplayName")); FIELD_MAP.put("uidNext", new ExtendedFieldURI(0x6751, ExtendedFieldURI.PropertyType.Integer)); // PR_ARTICLE_NUM_NEXT FIELD_MAP.put("highestUid", new ExtendedFieldURI(0x6752, ExtendedFieldURI.PropertyType.Integer)); // PR_IMAP_LAST_ARTICLE_ID FIELD_MAP.put("permanenturl", new ExtendedFieldURI(0x670E, ExtendedFieldURI.PropertyType.String)); //PR_FLAT_URL_NAME FIELD_MAP.put("instancetype", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "urn:schemas:calendar:instancetype", ExtendedFieldURI.PropertyType.Integer)); //FIELD_MAP.put("dtstart", new ExtendedFieldURI(0x10C3, ExtendedFieldURI.PropertyType.SystemTime)); //FIELD_MAP.put("dtend", new ExtendedFieldURI(0x10C4, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("dtstart", new UnindexedFieldURI("calendar:Start")); FIELD_MAP.put("dtend", new UnindexedFieldURI("calendar:End")); FIELD_MAP.put("originalstart", new UnindexedFieldURI("calendar:OriginalStart")); FIELD_MAP.put("mimeContent", new UnindexedFieldURI("item:MimeContent")); // use PR_RECORD_KEY as unique key FIELD_MAP.put("uid", new ExtendedFieldURI(0x0FF9, ExtendedFieldURI.PropertyType.Binary)); FIELD_MAP.put("messageFlags", new ExtendedFieldURI(0x0e07, ExtendedFieldURI.PropertyType.Integer));//PR_MESSAGE_FLAGS FIELD_MAP.put("imapUid", new ExtendedFieldURI(0x0e23, ExtendedFieldURI.PropertyType.Integer)); FIELD_MAP.put("flagStatus", new ExtendedFieldURI(0x1090, ExtendedFieldURI.PropertyType.Integer)); FIELD_MAP.put("lastVerbExecuted", new ExtendedFieldURI(0x1081, ExtendedFieldURI.PropertyType.Integer)); FIELD_MAP.put("read", new UnindexedFieldURI("message:IsRead")); FIELD_MAP.put("messageSize", new ExtendedFieldURI(0x0e08, ExtendedFieldURI.PropertyType.Integer)); FIELD_MAP.put("date", new ExtendedFieldURI(0x0e06, ExtendedFieldURI.PropertyType.SystemTime)); // always empty on Exchange 2007 //FIELD_MAP.put("messageSize", new ExtendedFieldURI(0x6746, ExtendedFieldURI.PropertyType.Integer)); // PR_MIME_SIZE //FIELD_MAP.put("date", new ExtendedFieldURI(0x65f5, ExtendedFieldURI.PropertyType.SystemTime)); // PR_IMAP_INTERNAL_DATE FIELD_MAP.put("deleted", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Common, 0x8570, ExtendedFieldURI.PropertyType.Integer)); // PidLidImapDeleted FIELD_MAP.put("junk", new ExtendedFieldURI(0x1083, ExtendedFieldURI.PropertyType.Integer)); FIELD_MAP.put("iconIndex", new ExtendedFieldURI(0x1080, ExtendedFieldURI.PropertyType.Integer));// PR_ICON_INDEX FIELD_MAP.put("datereceived", new ExtendedFieldURI(0x0e06, ExtendedFieldURI.PropertyType.SystemTime));// PR_MESSAGE_DELIVERY_TIME FIELD_MAP.put("msgfrom", new UnindexedFieldURI("message:From")); FIELD_MAP.put("msgto", new UnindexedFieldURI("message:ToRecipients")); FIELD_MAP.put("msgcc", new UnindexedFieldURI("message:CcRecipients")); FIELD_MAP.put("msgbcc", new UnindexedFieldURI("message:BccRecipients")); FIELD_MAP.put("from", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, "from")); FIELD_MAP.put("to", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, "to")); FIELD_MAP.put("displayto", new UnindexedFieldURI("item:DisplayTo")); FIELD_MAP.put("cc", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, "cc")); FIELD_MAP.put("displaycc", new UnindexedFieldURI("item:DisplayCc")); FIELD_MAP.put("bcc", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, "bcc")); FIELD_MAP.put("message-id", new UnindexedFieldURI("message:InternetMessageId")); FIELD_MAP.put("messageheaders", new ExtendedFieldURI(0x007D, ExtendedFieldURI.PropertyType.String)); // PR_TRANSPORT_MESSAGE_HEADERS FIELD_MAP.put("contentclass", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, "content-class")); FIELD_MAP.put("body", new UnindexedFieldURI("item:Body")); FIELD_MAP.put("textbody", new UnindexedFieldURI("item:TextBody")); // folder FIELD_MAP.put("folderclass", new ExtendedFieldURI(0x3613, ExtendedFieldURI.PropertyType.String)); // contact FIELD_MAP.put("outlookmessageclass", new ExtendedFieldURI(0x001A, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("subject", new ExtendedFieldURI(0x0037, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("middlename", new ExtendedFieldURI(0x3A44, ExtendedFieldURI.PropertyType.String)); //FIELD_MAP.put("fileas", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "urn:schemas:contacts:fileas")); FIELD_MAP.put("fileas", new UnindexedFieldURI("contacts:FileAs")); FIELD_MAP.put("members", new UnindexedFieldURI("distributionlist:Members")); FIELD_MAP.put("homepostaladdress", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x801A, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("otherpostaladdress", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x801C, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("mailingaddressid", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8022, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("workaddress", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x801B, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("alternaterecipient", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "urn:schemas:contacts:alternaterecipient")); FIELD_MAP.put("extensionattribute1", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x804F, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("extensionattribute2", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8050, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("extensionattribute3", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8051, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("extensionattribute4", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8052, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("bday", new ExtendedFieldURI(0x3A42, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("anniversary", new ExtendedFieldURI(0x3A41, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("businesshomepage", new ExtendedFieldURI(0x3A51, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("personalHomePage", new ExtendedFieldURI(0x3A50, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("cn", new ExtendedFieldURI(0x3001, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("co", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8049, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("department", new ExtendedFieldURI(0x3A18, ExtendedFieldURI.PropertyType.String)); /* FIELD_MAP.put("email1", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8083, ExtendedFieldURI.PropertyType.String)); // Email1EmailAddress FIELD_MAP.put("email2", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8093, ExtendedFieldURI.PropertyType.String)); // Email2EmailAddress FIELD_MAP.put("email3", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x80A3, ExtendedFieldURI.PropertyType.String)); // Email3EmailAddress FIELD_MAP.put("smtpemail1", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8084, ExtendedFieldURI.PropertyType.String)); // Email1OriginalDisplayName FIELD_MAP.put("smtpemail2", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8094, ExtendedFieldURI.PropertyType.String)); // Email2OriginalDisplayName FIELD_MAP.put("smtpemail3", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x80A4, ExtendedFieldURI.PropertyType.String)); // Email3OriginalDisplayName FIELD_MAP.put("displayemail1", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8080, ExtendedFieldURI.PropertyType.String)); // Email1DisplayName FIELD_MAP.put("displayemail2", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8090, ExtendedFieldURI.PropertyType.String)); // Email2DisplayName FIELD_MAP.put("displayemail3", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x80A0, ExtendedFieldURI.PropertyType.String)); // Email3DisplayName */ FIELD_MAP.put("smtpemail1", new IndexedFieldURI("contacts:EmailAddress", "EmailAddress1", "Contact", "EmailAddresses")); FIELD_MAP.put("smtpemail2", new IndexedFieldURI("contacts:EmailAddress", "EmailAddress2", "Contact", "EmailAddresses")); FIELD_MAP.put("smtpemail3", new IndexedFieldURI("contacts:EmailAddress", "EmailAddress3", "Contact", "EmailAddresses")); FIELD_MAP.put("facsimiletelephonenumber", new ExtendedFieldURI(0x3A24, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("givenName", new ExtendedFieldURI(0x3A06, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homepostofficebox", new ExtendedFieldURI(0x3A5E, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homeCity", new ExtendedFieldURI(0x3A59, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homeCountry", new ExtendedFieldURI(0x3A5A, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homePhone", new ExtendedFieldURI(0x3A09, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homePostalCode", new ExtendedFieldURI(0x3A5B, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homeState", new ExtendedFieldURI(0x3A5C, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homeStreet", new ExtendedFieldURI(0x3A5D, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("l", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8046, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("manager", new ExtendedFieldURI(0x3A4E, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("mobile", new ExtendedFieldURI(0x3A1C, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("namesuffix", new ExtendedFieldURI(0x3A05, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("nickname", new ExtendedFieldURI(0x3A4F, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("o", new ExtendedFieldURI(0x3A16, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("pager", new ExtendedFieldURI(0x3A21, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("personaltitle", new ExtendedFieldURI(0x3A45, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("postalcode", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8048, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("postofficebox", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x804A, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("profession", new ExtendedFieldURI(0x3A46, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("roomnumber", new ExtendedFieldURI(0x3A19, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("secretarycn", new ExtendedFieldURI(0x3A30, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("sn", new ExtendedFieldURI(0x3A11, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("spousecn", new ExtendedFieldURI(0x3A48, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("st", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8047, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("street", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8045, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("telephoneNumber", new ExtendedFieldURI(0x3A08, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("title", new ExtendedFieldURI(0x3A17, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("description", new ExtendedFieldURI(0x1000, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("im", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8062, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("othermobile", new ExtendedFieldURI(0x3A1E, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("internationalisdnnumber", new ExtendedFieldURI(0x3A2D, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("otherTelephone", new ExtendedFieldURI(0x3A21, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("homefax", new ExtendedFieldURI(0x3A25, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("otherstreet", new ExtendedFieldURI(0x3A63, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("otherstate", new ExtendedFieldURI(0x3A62, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("otherpostofficebox", new ExtendedFieldURI(0x3A64, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("otherpostalcode", new ExtendedFieldURI(0x3A61, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("othercountry", new ExtendedFieldURI(0x3A60, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("othercity", new ExtendedFieldURI(0x3A5F, ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("gender", new ExtendedFieldURI(0x3A4D, ExtendedFieldURI.PropertyType.Short)); FIELD_MAP.put("keywords", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "Keywords", ExtendedFieldURI.PropertyType.StringArray)); FIELD_MAP.put("private", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Common, 0x8506, ExtendedFieldURI.PropertyType.Boolean)); FIELD_MAP.put("sensitivity", new ExtendedFieldURI(0x0036, ExtendedFieldURI.PropertyType.Integer)); // TODO: merge with sensitivity ? FIELD_MAP.put("itemsensitivity", new UnindexedFieldURI("item:Sensitivity")); FIELD_MAP.put("haspicture", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x8015, ExtendedFieldURI.PropertyType.Boolean)); FIELD_MAP.put("fburl", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Address, 0x80D8, ExtendedFieldURI.PropertyType.String)); // calendar FIELD_MAP.put("processed", new ExtendedFieldURI(0x65e8, ExtendedFieldURI.PropertyType.Boolean)); FIELD_MAP.put("reminderset", new UnindexedFieldURI("item:ReminderIsSet")); FIELD_MAP.put("reminderminutesbeforestart", new UnindexedFieldURI("item:ReminderMinutesBeforeStart")); FIELD_MAP.put("ismeeting", new UnindexedFieldURI("calendar:IsMeeting")); FIELD_MAP.put("apptstateflags", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Appointment, 0x8217, ExtendedFieldURI.PropertyType.Integer)); // PidLidAppointmentStateFlags 1: Meeting, 2: Received, 4: Cancelled FIELD_MAP.put("appointmentstate", new UnindexedFieldURI("calendar:AppointmentState")); // isorganizer is Exchange 2013 and later only FIELD_MAP.put("isorganizer", new UnindexedFieldURI("calendar:IsOrganizer")); FIELD_MAP.put("calendaruid", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "urn:schemas:calendar:uid", ExtendedFieldURI.PropertyType.String)); FIELD_MAP.put("meetingtimezone", new UnindexedFieldURI("calendar:MeetingTimeZone")); FIELD_MAP.put("starttimezone", new UnindexedFieldURI("calendar:StartTimeZone")); FIELD_MAP.put("endtimezone", new UnindexedFieldURI("calendar:EndTimeZone")); FIELD_MAP.put("busystatus", new UnindexedFieldURI("calendar:LegacyFreeBusyStatus")); FIELD_MAP.put("requiredattendees", new UnindexedFieldURI("calendar:RequiredAttendees")); FIELD_MAP.put("optionalattendees", new UnindexedFieldURI("calendar:OptionalAttendees")); FIELD_MAP.put("modifiedoccurrences", new UnindexedFieldURI("calendar:ModifiedOccurrences")); FIELD_MAP.put("deletedoccurrences", new UnindexedFieldURI("calendar:DeletedOccurrences")); FIELD_MAP.put("recurrence", new UnindexedFieldURI("calendar:Recurrence")); FIELD_MAP.put("isalldayevent", new UnindexedFieldURI("calendar:IsAllDayEvent")); FIELD_MAP.put("myresponsetype", new UnindexedFieldURI("calendar:MyResponseType")); // does not work with Office 365, see https://msdn.microsoft.com/en-us/library/office/bb204271(v=exchg.150).aspx //FIELD_MAP.put("isrecurring", new UnindexedFieldURI("calendar:IsRecurring")); FIELD_MAP.put("isrecurring", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Appointment, 0x8223, ExtendedFieldURI.PropertyType.Boolean)); // PidLidRecurring FIELD_MAP.put("calendaritemtype", new UnindexedFieldURI("calendar:CalendarItemType")); // https://msdn.microsoft.com/en-us/library/cc842017.aspx FIELD_MAP.put("recurringappointment", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Appointment, 0x8216, ExtendedFieldURI.PropertyType.Binary)); FIELD_MAP.put("recurrencestart", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Appointment, 0x8235, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("recurrencetype", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Appointment, 0x8231, ExtendedFieldURI.PropertyType.Integer)); FIELD_MAP.put("location", new UnindexedFieldURI("calendar:Location")); FIELD_MAP.put("xmozlastack", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "xmozlastack")); FIELD_MAP.put("xmozsnoozetime", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "xmozsnoozetime")); FIELD_MAP.put("xmozsendinvitations", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.PublicStrings, "xmozsendinvitations")); // task FIELD_MAP.put("importance", new UnindexedFieldURI("item:Importance")); FIELD_MAP.put("percentcomplete", new UnindexedFieldURI("task:PercentComplete")); FIELD_MAP.put("taskstatus", new UnindexedFieldURI("task:Status")); FIELD_MAP.put("startdate", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Task, 0x8104, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("duedate", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Task, 0x8105, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("datecompleted", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Task, 0x810F, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("iscomplete", new UnindexedFieldURI("task:IsComplete")); FIELD_MAP.put("commonstart", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Task, 0x8516, ExtendedFieldURI.PropertyType.SystemTime)); FIELD_MAP.put("commonend", new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.Task, 0x8517, ExtendedFieldURI.PropertyType.SystemTime)); // attachments FIELD_MAP.put("attachments", new UnindexedFieldURI("item:Attachments")); // user certificate FIELD_MAP.put("msexchangecertificate", new UnindexedFieldURI("contacts:MSExchangeCertificate")); FIELD_MAP.put("usersmimecertificate", new UnindexedFieldURI("contacts:UserSMIMECertificate")); } /** * Get Field by alias. * * @param alias field alias * @return field */ public static FieldURI get(String alias) { FieldURI field = FIELD_MAP.get(alias); if (field == null) { throw new IllegalArgumentException("Unknown field: " + alias); } return field; } /** * Create property update field * * @param alias property alias * @param value property value * @return field update */ public static FieldUpdate createFieldUpdate(String alias, String value) { return new FieldUpdate(Field.get(alias), value); } } davmail-6.3.0/src/java/davmail/exchange/ews/FieldOrder.java0100644 0000000 0000000 00000002726 12564151517 022271 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2013 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Sort order. */ public class FieldOrder { protected enum Order { Descending, Ascending } protected Order order; protected FieldURI fieldURI; public FieldOrder(FieldURI fieldURI, Order order) { this.fieldURI = fieldURI; this.order = order; } /** * Append sort order to buffer. * * @param buffer search buffer */ void appendTo(StringBuilder buffer) { buffer.append(""); fieldURI.appendTo(buffer); buffer.append(""); } } davmail-6.3.0/src/java/davmail/exchange/ews/FieldURI.java0100644 0000000 0000000 00000003036 14754153476 021661 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Field URI. */ public interface FieldURI { /** * Append field to buffer * * @param buffer current buffer */ void appendTo(StringBuilder buffer); /** * Append updated field value to buffer * * @param buffer current buffer * @param itemType item type * @param value field value */ void appendValue(StringBuilder buffer, String itemType, String value); /** * Property name in EWS response. * * @return property name */ String getResponseName(); /** * Get field id for graph requests * @return field id */ String getGraphId(); } davmail-6.3.0/src/java/davmail/exchange/ews/FieldUpdate.java0100644 0000000 0000000 00000005170 12702212011 022411 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; /** * Field update */ public class FieldUpdate { FieldURI fieldURI; String value; /** * Create field update with value. * * @param fieldURI target field * @param value field value */ public FieldUpdate(FieldURI fieldURI, String value) { this.fieldURI = fieldURI; this.value = value; } protected FieldUpdate() { // empty constructor for subclass } /** * Write field to request writer. * * @param itemType item type * @param writer request writer * @throws IOException on error */ public void write(String itemType, Writer writer) throws IOException { String action; //noinspection VariableNotUsedInsideIf if (value == null || value.length() == 0) { action = "Delete"; } else { action = "Set"; } if (itemType != null) { writer.write(""); } // do not try to set empty value on create if (itemType != null || (value != null && value.length() > 0)) { StringBuilder buffer = new StringBuilder(); if (value == null || value.length() == 0) { fieldURI.appendTo(buffer); } else { fieldURI.appendValue(buffer, itemType, value); } writer.write(buffer.toString()); } if (itemType != null) { writer.write(""); } } } davmail-6.3.0/src/java/davmail/exchange/ews/FileAttachment.java0100644 0000000 0000000 00000005367 12564151517 023146 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; /** * File Attachment. */ public class FileAttachment { protected String name; protected String contentType; protected String content; protected String attachmentId; protected boolean isContactPhoto; /** * Default constructor */ public FileAttachment() { // empty constructor } /** * Build file attachment. * * @param name attachment name * @param contentType content type * @param content body as string */ public FileAttachment(String name, String contentType, String content) { this.name = name; this.contentType = contentType; this.content = content; } /** * Write XML content to writer. * * @param writer writer * @throws IOException on error */ public void write(Writer writer) throws IOException { writer.write(""); if (name != null) { writer.write(""); writer.write(name); writer.write(""); } if (contentType != null) { writer.write(""); writer.write(contentType); writer.write(""); } if (isContactPhoto) { writer.write("true"); } if (content != null) { writer.write(""); writer.write(content); writer.write(""); } writer.write(""); } /** * Exchange 2010 only: set contact photo flag on attachment. * * @param isContactPhoto contact photo flag */ public void setIsContactPhoto(boolean isContactPhoto) { this.isContactPhoto = isContactPhoto; } } davmail-6.3.0/src/java/davmail/exchange/ews/FindFolderMethod.java0100644 0000000 0000000 00000005107 12564151517 023423 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.Set; /** * EWS Find Folder. */ public class FindFolderMethod extends EWSMethod { /** * Find Exchange Folder. * * @param traversal traversal type * @param baseShape base shape * @param parentFolderId parent folder id * @param additionalProperties folder properties * @param offset start offset * @param maxCount maximum result count */ public FindFolderMethod(FolderQueryTraversal traversal, BaseShape baseShape, FolderId parentFolderId, Set additionalProperties, int offset, int maxCount) { super("Folder", "FindFolder"); this.traversal = traversal; this.baseShape = baseShape; this.parentFolderId = parentFolderId; this.additionalProperties = additionalProperties; this.offset = offset; this.maxCount = maxCount; } /** * Find Exchange Folder. * * @param traversal traversal type * @param baseShape base shape * @param parentFolderId parent folder id * @param additionalProperties folder properties * @param searchExpression search expression * @param offset start offset * @param maxCount maximum result count */ public FindFolderMethod(FolderQueryTraversal traversal, BaseShape baseShape, FolderId parentFolderId, Set additionalProperties, SearchExpression searchExpression, int offset, int maxCount) { this(traversal, baseShape, parentFolderId, additionalProperties, offset, maxCount); this.searchExpression = searchExpression; } } davmail-6.3.0/src/java/davmail/exchange/ews/FindItemMethod.java0100644 0000000 0000000 00000003122 12564151517 023101 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * EWS Find Item Method. */ public class FindItemMethod extends EWSMethod { /** * Find item method. * * @param traversal folder traversal mode * @param baseShape base item shape * @param parentFolderId parent folder id * @param offset start offset * @param maxCount maximum result count */ public FindItemMethod(FolderQueryTraversal traversal, BaseShape baseShape, FolderId parentFolderId, int offset, int maxCount) { super("Item", "FindItem"); this.traversal = traversal; this.baseShape = baseShape; this.parentFolderId = parentFolderId; this.offset = offset; this.maxCount = maxCount; } } davmail-6.3.0/src/java/davmail/exchange/ews/FolderId.java0100644 0000000 0000000 00000005254 12564151517 021741 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; /** * Folder Id. */ public class FolderId extends Option { protected String changeKey; protected String mailbox; /** * Create FolderId with specified tag name. * * @param name field tag name * @param value id value * @param changeKey folder change key * @param mailbox shared mailbox name */ protected FolderId(String name, String value, String changeKey, String mailbox) { this(name, value, changeKey); this.mailbox = mailbox; } /** * Create FolderId with specified tag name. * * @param name field tag name * @param value id value * @param changeKey folder change key */ protected FolderId(String name, String value, String changeKey) { super(name, value); this.changeKey = changeKey; } /** * Build Folder id from response item. * * @param item response item */ public FolderId(EWSMethod.Item item) { this("t:FolderId", item.get("FolderId"), item.get("ChangeKey")); } /** * @inheritDoc */ @Override public void write(Writer writer) throws IOException { writer.write('<'); writer.write(name); writer.write(" Id=\""); writer.write(value); if (changeKey != null) { writer.write("\" ChangeKey=\""); writer.write(changeKey); } if (mailbox == null) { writer.write("\"/>"); } else { writer.write("\">"); writer.write(mailbox); writer.write("'); } } } davmail-6.3.0/src/java/davmail/exchange/ews/FolderQueryTraversal.java0100644 0000000 0000000 00000002621 12564151517 024371 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Folder folderQueryTraversalType search mode. */ public final class FolderQueryTraversal extends AttributeOption { private FolderQueryTraversal(String value) { super("Traversal", value); } /** * Search only in current folder. */ public static final FolderQueryTraversal SHALLOW = new FolderQueryTraversal("Shallow"); /** * Recursive search. */ @SuppressWarnings({"UnusedDeclaration"}) public static final FolderQueryTraversal DEEP = new FolderQueryTraversal("Deep"); }davmail-6.3.0/src/java/davmail/exchange/ews/GetAttachmentMethod.java0100644 0000000 0000000 00000002305 12564151517 024134 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Get Attachment Method. */ public class GetAttachmentMethod extends EWSMethod { /** * Get Attachment Method. * * @param attachmentId attachment id */ public GetAttachmentMethod(String attachmentId) { super("Attachment", "GetAttachment"); this.attachmentId = attachmentId; } } davmail-6.3.0/src/java/davmail/exchange/ews/GetFolderMethod.java0100644 0000000 0000000 00000002733 12564151517 023264 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.Set; /** * EWS GetFolder method. */ public class GetFolderMethod extends EWSMethod { /** * Get folder method. * * @param baseShape base requested shape * @param folderId folder id * @param additionalProperties additional requested properties */ public GetFolderMethod(BaseShape baseShape, FolderId folderId, Set additionalProperties) { super("Folder", "GetFolder"); this.baseShape = baseShape; this.folderId = folderId; this.additionalProperties = additionalProperties; } } davmail-6.3.0/src/java/davmail/exchange/ews/GetItemMethod.java0100644 0000000 0000000 00000002611 12564151517 022742 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Get Item method. */ public class GetItemMethod extends EWSMethod { /** * Get item method. * * @param baseShape base requested shape * @param itemId item id * @param includeMimeContent return mime content */ public GetItemMethod(BaseShape baseShape, ItemId itemId, boolean includeMimeContent) { super("Item", "GetItem"); this.baseShape = baseShape; this.itemId = itemId; this.includeMimeContent = includeMimeContent; } } davmail-6.3.0/src/java/davmail/exchange/ews/GetUserAvailabilityMethod.java0100644 0000000 0000000 00000010041 13452623365 025313 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.XMLStreamUtil; import javax.xml.stream.XMLStreamReader; import java.io.IOException; import java.io.Writer; /** * GetUserAvailability method. */ public class GetUserAvailabilityMethod extends EWSMethod { protected final String attendee; protected final String start; protected final String end; protected String mergedFreeBusy; protected final int interval; /** * Build EWS method * * @param attendee attendee email address * @param start start date in Exchange zulu format * @param end end date in Exchange zulu format * @param interval freebusy interval in minutes */ public GetUserAvailabilityMethod(String attendee, String start, String end, int interval) { super("FreeBusy", "GetUserAvailabilityRequest"); this.attendee = attendee; this.start = start; this.end = end; this.interval = interval; } @Override protected void writeSoapBody(Writer writer) throws IOException { // write UTC timezone writer.write("" + "0" + "" + "0" + "02:00:00" + "1" + "3" + "Sunday" + "" + "" + "0" + "02:00:00" + "1" + "10" + "Sunday" + "" + ""); // write attendee address writer.write("" + "" + "" + ""); writer.write(attendee); writer.write("" + "" + "Required" + "" + ""); // freebusy range writer.write("" + "" + ""); writer.write(start); writer.write("" + ""); writer.write(end); writer.write("" + "" + "" + interval + "" + "MergedOnly" + ""); } @Override protected void handleCustom(XMLStreamReader reader) { if (XMLStreamUtil.isStartTag(reader, "MergedFreeBusy")) { this.mergedFreeBusy = XMLStreamUtil.getElementText(reader); } } /** * Get merged freebusy string. * * @return freebusy string */ public String getMergedFreeBusy() { return mergedFreeBusy; } } davmail-6.3.0/src/java/davmail/exchange/ews/GetUserConfigurationMethod.java0100644 0000000 0000000 00000006413 12564151517 025516 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.XMLStreamUtil; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.IOException; import java.io.Writer; /** * Get User Configuration method. */ public class GetUserConfigurationMethod extends EWSMethod { /** * Get User Configuration method. */ public GetUserConfigurationMethod() { super("UserConfiguration", "GetUserConfiguration"); folderId = DistinguishedFolderId.getInstance(null, DistinguishedFolderId.Name.root); } @Override protected void writeSoapBody(Writer writer) throws IOException { writer.write(""); folderId.write(writer); writer.write(""); writer.write("All"); } @Override protected void handleCustom(XMLStreamReader reader) throws XMLStreamException { if (XMLStreamUtil.isStartTag(reader, "UserConfiguration")) { responseItems.add(handleUserConfiguration(reader)); } } private Item handleUserConfiguration(XMLStreamReader reader) throws XMLStreamException { Item responseItem = new Item(); while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "UserConfiguration"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("DictionaryEntry".equals(tagLocalName)) { handleDictionaryEntry(reader, responseItem); } } } return responseItem; } private void handleDictionaryEntry(XMLStreamReader reader, Item responseItem) throws XMLStreamException { String key = null; while (reader.hasNext() && !(XMLStreamUtil.isEndTag(reader, "DictionaryEntry"))) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Value".equals(tagLocalName)) { if (key == null) { key = reader.getElementText(); } else { responseItem.put(key, XMLStreamUtil.getElementText(reader)); } } } } } } davmail-6.3.0/src/java/davmail/exchange/ews/GetUserPhotoMethod.java0100644 0000000 0000000 00000005122 13402010624 023755 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.XMLStreamUtil; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.IOException; import java.io.Writer; public class GetUserPhotoMethod extends EWSMethod { public enum SizeRequested { HR48x48, HR64x64, HR96x96, HR120x120, HR240x240, HR360x360, HR432x432, HR504x504, HR648x648 } protected String email; protected SizeRequested sizeRequested; protected String contentType = null; protected String pictureData = null; /** * Get User Configuration method. */ public GetUserPhotoMethod(String email, SizeRequested sizeRequested) { super("GetUserPhoto", "GetUserPhoto"); this.email = email; this.sizeRequested = sizeRequested; } @Override protected void writeSoapBody(Writer writer) throws IOException { writer.write(""); writer.write(email); writer.write(""); writer.write(""); writer.write(sizeRequested.toString()); writer.write(""); } @Override protected void handleCustom(XMLStreamReader reader) throws XMLStreamException { if (XMLStreamUtil.isStartTag(reader, "PictureData")) { pictureData = reader.getElementText(); if (pictureData.isEmpty()) { pictureData = null; } } if (XMLStreamUtil.isStartTag(reader, "ContentType")) { contentType = reader.getElementText(); } } public String getContentType() { return contentType; } public String getPictureData() { return pictureData; } } davmail-6.3.0/src/java/davmail/exchange/ews/IndexedFieldURI.java0100644 0000000 0000000 00000005501 14754153476 023161 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.util.StringUtil; /** * Indexed FieldURI */ public class IndexedFieldURI implements FieldURI { protected final String fieldURI; protected final String fieldIndex; protected final String fieldItemType; protected final String collectionName; /** * Create indexed field uri. * * @param fieldURI base field uri * @param fieldIndex field name * @param fieldItemType field item type * @param collectionName collection name */ public IndexedFieldURI(String fieldURI, String fieldIndex, String fieldItemType, String collectionName) { this.fieldURI = fieldURI; this.fieldIndex = fieldIndex; this.fieldItemType = fieldItemType; this.collectionName = collectionName; } public void appendTo(StringBuilder buffer) { buffer.append(""); } public void appendValue(StringBuilder buffer, String itemType, String value) { if (itemType != null) { // append IndexedFieldURI appendTo(buffer); buffer.append("'); buffer.append("'); } if (value != null && value.length() > 0) { buffer.append(""); buffer.append(StringUtil.xmlEncodeAttribute(value)); buffer.append(""); } if (itemType != null) { buffer.append("'); buffer.append("'); } } public String getResponseName() { return fieldIndex; } @Override public String getGraphId() { throw new UnsupportedOperationException(); } } davmail-6.3.0/src/java/davmail/exchange/ews/IndexedFieldUpdate.java0100644 0000000 0000000 00000006004 13574116520 023727 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; import java.util.HashSet; import java.util.Set; /** * Field update with multiple values. */ public class IndexedFieldUpdate extends FieldUpdate { final Set updates = new HashSet<>(); protected final String collectionName; /** * Create indexed field update object. * * @param collectionName values collection name e.g. EmailAddresses */ public IndexedFieldUpdate(String collectionName) { this.collectionName = collectionName; } /** * Add indexed field value. * * @param fieldUpdate field update object */ public void addFieldValue(FieldUpdate fieldUpdate) { updates.add(fieldUpdate); } /** * Write field to request writer. * * @param itemType item type * @param writer request writer * @throws IOException on error */ @Override public void write(String itemType, Writer writer) throws IOException { if (itemType == null) { // check if at least one non null value boolean hasValue = false; for (FieldUpdate fieldUpdate : updates) { if (fieldUpdate.value != null) { hasValue = true; break; } } if (hasValue) { // use collection name on create writer.write(""); StringBuilder buffer = new StringBuilder(); for (FieldUpdate fieldUpdate : updates) { fieldUpdate.fieldURI.appendValue(buffer, null, fieldUpdate.value); } writer.write(buffer.toString()); writer.write(""); } } else { // on update, write each fieldupdate for (FieldUpdate fieldUpdate : updates) { fieldUpdate.write(itemType, writer); } } } } davmail-6.3.0/src/java/davmail/exchange/ews/ItemId.java0100644 0000000 0000000 00000005532 12564151517 021423 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Serializable; import java.io.Writer; /** * Item id. */ public class ItemId implements Serializable { protected final String name; protected final String id; protected final String changeKey; /** * Build Item id from response item. * * @param item response item */ public ItemId(EWSMethod.Item item) { this("ItemId", item); } /** * Build Item id object from item id. * * @param itemId item id */ public ItemId(String itemId) { this("ItemId", itemId); } /** * Build Item id from response item. * * @param name item name * @param item response item */ public ItemId(String name, EWSMethod.Item item) { this.name = name; this.id = item.get("ItemId"); this.changeKey = item.get("ChangeKey"); } /** * Build Item id object from item id. * * @param name item name * @param itemId item id */ public ItemId(String name, String itemId) { this.name = name; this.id = itemId; this.changeKey = null; } /** * Build Item id object from item id and change key. * * @param name item name * @param itemId item id * @param changeKey change key */ public ItemId(String name, String itemId, String changeKey) { this.name = name; this.id = itemId; this.changeKey = changeKey; } /** * Write item id as XML. * * @param writer request writer * @throws IOException on error */ public void write(Writer writer) throws IOException { writer.write(""); } } davmail-6.3.0/src/java/davmail/exchange/ews/MessageDisposition.java0100644 0000000 0000000 00000002606 13452623365 024062 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * MessageDisposition flag. */ @SuppressWarnings({"UnusedDeclaration"}) public final class MessageDisposition extends AttributeOption { private MessageDisposition(String value) { super("MessageDisposition", value); } public static final MessageDisposition SaveOnly = new MessageDisposition("SaveOnly"); public static final MessageDisposition SendOnly = new MessageDisposition("SendOnly"); public static final MessageDisposition SendAndSaveCopy = new MessageDisposition("SendAndSaveCopy"); } davmail-6.3.0/src/java/davmail/exchange/ews/MoveFolderMethod.java0100644 0000000 0000000 00000002423 12564151517 023447 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Create Folder method. */ public class MoveFolderMethod extends EWSMethod { /** * Move folder to target folder. * * @param folderId folder id * @param toFolderId target folder id */ public MoveFolderMethod(FolderId folderId, FolderId toFolderId) { super("Folder", "MoveFolder"); this.folderId = folderId; this.toFolderId = toFolderId; } } davmail-6.3.0/src/java/davmail/exchange/ews/MoveItemMethod.java0100644 0000000 0000000 00000003143 12564151517 023132 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.List; /** * Move Item method. */ public class MoveItemMethod extends EWSMethod { /** * Move item to target folder. * * @param itemId item id * @param toFolderId target folder id */ public MoveItemMethod(ItemId itemId, FolderId toFolderId) { super("Item", "MoveItem"); this.itemId = itemId; this.toFolderId = toFolderId; } /** * Move items to target folder. * * @param itemIds item id list * @param toFolderId target folder id */ public MoveItemMethod(List itemIds, FolderId toFolderId) { super("Item", "MoveItem"); this.itemIds = itemIds; this.toFolderId = toFolderId; } } davmail-6.3.0/src/java/davmail/exchange/ews/MultiValuedFieldUpdate.java0100644 0000000 0000000 00000005152 13574116520 024605 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; /** * Specific field update class to handle multiple attendee values */ public class MultiValuedFieldUpdate extends FieldUpdate { ArrayList values = new ArrayList<>(); /** * Create field update with value. * * @param fieldURI target field */ public MultiValuedFieldUpdate(FieldURI fieldURI) { this.fieldURI = fieldURI; } /** * Add single value * * @param value value */ public void addValue(String value) { values.add(value); } /** * Write field to request writer. * * @param itemType item type * @param writer request writer * @throws IOException on error */ @Override public void write(String itemType, Writer writer) throws IOException { String action; //noinspection VariableNotUsedInsideIf if (values.isEmpty()) { action = "Delete"; } else { action = "Set"; } if (itemType != null) { writer.write(""); } // do not try to set empty value on create if (itemType != null || (!values.isEmpty())) { StringBuilder buffer = new StringBuilder(); ((UnindexedFieldURI)fieldURI).appendValues(buffer, itemType, values); writer.write(buffer.toString()); } if (itemType != null) { writer.write(""); } } } davmail-6.3.0/src/java/davmail/exchange/ews/OccurrenceItemId.java0100644 0000000 0000000 00000004601 13222725016 023421 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; public class OccurrenceItemId extends ItemId { protected final int instanceIndex; /** * Build Item id object from item id and change key. * * @param recurringMasterId recurring master id * @param instanceIndex occurrence index */ public OccurrenceItemId(String recurringMasterId, int instanceIndex) { super("OccurrenceItemId", recurringMasterId); this.instanceIndex = instanceIndex; } /** * Build Item id object from item id and change key. * * @param recurringMasterId recurring master id * @param changeKey change key * @param instanceIndex occurrence index */ public OccurrenceItemId(String recurringMasterId, String changeKey, int instanceIndex) { super("OccurrenceItemId", recurringMasterId, changeKey); this.instanceIndex = instanceIndex; } /** * Write item id as XML. * * @param writer request writer * @throws IOException on error */ public void write(Writer writer) throws IOException { writer.write(""); } } davmail-6.3.0/src/java/davmail/exchange/ews/Option.java0100644 0000000 0000000 00000002543 12564151517 021517 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.io.IOException; import java.io.Writer; /** * Generic option. */ public abstract class Option { protected final String name; protected final String value; protected Option(String name, String value) { this.name = name; this.value = value; } /** * Write XML content to writer. * * @param writer writer * @throws IOException on error */ public abstract void write(Writer writer) throws IOException; } davmail-6.3.0/src/java/davmail/exchange/ews/RecurrenceFieldUpdate.java0100644 0000000 0000000 00000021574 14757042647 024471 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.ExchangeSession; import org.apache.log4j.Logger; import java.io.IOException; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; /** * Handle calendar item recurrence update */ public class RecurrenceFieldUpdate extends FieldUpdate { public static final Logger LOGGER = Logger.getLogger(RecurrenceFieldUpdate.class); static final HashMap calDayToDayOfWeek = new HashMap<>(); static { calDayToDayOfWeek.put("SU", "Sunday"); calDayToDayOfWeek.put("MO", "Monday"); calDayToDayOfWeek.put("TU", "Tuesday"); calDayToDayOfWeek.put("WE", "Wednesday"); calDayToDayOfWeek.put("TH", "Thursday"); calDayToDayOfWeek.put("FR", "Friday"); calDayToDayOfWeek.put("SA", "Saturday"); } protected Date startDate; protected Date endDate; protected String count; protected HashSet byDays = null; public void setStartDate(Date startDate) { this.startDate = startDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } public void setByDay(String[] days) { byDays = new HashSet<>(); for (String day: days) { String value = calDayToDayOfWeek.get(day); if (value == null) { LOGGER.warn("Invalid day value: "+day); } else { byDays.add(value); } } // fix recurrence for Thunderbird weekday pattern if (recurrencePattern == RecurrencePattern.DailyRecurrence) { recurrencePattern = RecurrencePattern.WeeklyRecurrence; } } public void setCount(String count) { this.count = count; } public enum RecurrencePattern {DailyRecurrence, WeeklyRecurrence, AbsoluteMonthlyRecurrence, AbsoluteYearlyRecurrence} RecurrencePattern recurrencePattern; int recurrenceInterval = 1; /** * Create recurrence field update. */ public RecurrenceFieldUpdate() { } public void setRecurrencePattern(RecurrencePattern recurrencePattern) { this.recurrencePattern = recurrencePattern; } public void setRecurrencePattern(String value) { if ("DAILY".equals(value)) { setRecurrencePattern(RecurrenceFieldUpdate.RecurrencePattern.DailyRecurrence); } else if ("WEEKLY".equals(value)) { setRecurrencePattern(RecurrencePattern.WeeklyRecurrence); } else if ("MONTHLY".equals(value)) { setRecurrencePattern(RecurrencePattern.AbsoluteMonthlyRecurrence); } else if ("YEARLY".equals(value)) { setRecurrencePattern(RecurrencePattern.AbsoluteYearlyRecurrence); } } public void setRecurrenceInterval(String interval) { this.recurrenceInterval = Integer.parseInt(interval); } /** * Write field to request writer. * * @param itemType item type * @param writer request writer * @throws IOException on error */ public void write(String itemType, Writer writer) throws IOException { if (itemType != null) { writer.write(""); } // do not try to set empty value on create if (itemType != null) { writer.write(""); writer.write(""); writer.write(""); writer.write(""); if (recurrencePattern == RecurrencePattern.AbsoluteYearlyRecurrence) { writeDayOfMonth(writer); writeMonth(writer); } else if (recurrencePattern == RecurrencePattern.AbsoluteMonthlyRecurrence) { writeInterval(writer); writeDayOfMonth(writer); } else if (recurrencePattern == RecurrencePattern.WeeklyRecurrence) { writeInterval(writer); writeDaysOfWeek(writer); } else if (recurrencePattern == RecurrencePattern.DailyRecurrence) { writeInterval(writer); } writer.write(""); writeStartEnd(writer); writer.write(""); writer.write(""); } if (itemType != null) { writer.write(""); } } private void writeInterval(Writer writer) throws IOException { writer.write(""); writer.write(String.valueOf(recurrenceInterval)); writer.write(""); } private void writeStartEnd(Writer writer) throws IOException { if (count != null) { writer.write(""); writer.write(""); writer.write(getFormattedDate(startDate)); writer.write(""); writer.write(""); writer.write(count); writer.write(""); writer.write(""); } else if (endDate == null) { writer.write(""); writer.write(getFormattedDate(startDate)); writer.write(""); } else { writer.write(""); writer.write(""); writer.write(getFormattedDate(startDate)); writer.write(""); writer.write(""); writer.write(getFormattedDate(endDate)); writer.write(""); writer.write(""); } } private void writeDaysOfWeek(Writer writer) throws IOException { writer.write(""); if (byDays != null) { boolean first = true; for (String dayOfeek:byDays) { if (first) { first = false; } else { writer.write(' '); } writer.write(dayOfeek); } } else { writer.write(getDayOfWeek()); } writer.write(""); } private void writeDayOfMonth(Writer writer) throws IOException { writer.write(""); writer.write(getDayOfMonth()); writer.write(""); } private void writeMonth(Writer writer) throws IOException { writer.write(""); writer.write(getMonth()); writer.write(""); } private String getDayOfWeek() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE", Locale.ENGLISH); simpleDateFormat.setTimeZone(ExchangeSession.GMT_TIMEZONE); return simpleDateFormat.format(startDate); } private String getMonth() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMMMM", Locale.ENGLISH); simpleDateFormat.setTimeZone(ExchangeSession.GMT_TIMEZONE); return simpleDateFormat.format(startDate); } private String getDayOfMonth() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("d", Locale.ENGLISH); simpleDateFormat.setTimeZone(ExchangeSession.GMT_TIMEZONE); return simpleDateFormat.format(startDate); } private String getFormattedDate(Date date) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); simpleDateFormat.setTimeZone(ExchangeSession.GMT_TIMEZONE); return simpleDateFormat.format(date); } } davmail-6.3.0/src/java/davmail/exchange/ews/ResolveNamesMethod.java0100644 0000000 0000000 00000023110 14754417472 024014 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.XMLStreamUtil; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; /** * Resolve Names method. */ public class ResolveNamesMethod extends EWSMethod { protected static final AttributeOption RETURN_FULL_CONTACT_DATA = new AttributeOption("ReturnFullContactData", "true"); /** * Build Resolve Names method * * @param value search value */ public ResolveNamesMethod(String value) { super("Contact", "ResolveNames", "ResolutionSet"); addMethodOption(SearchScope.ActiveDirectory); addMethodOption(RETURN_FULL_CONTACT_DATA); addMethodOption(ContactDataShape.AllProperties); unresolvedEntry = new ElementOption("m:UnresolvedEntry", value); } @Override protected Item handleItem(XMLStreamReader reader) throws XMLStreamException { Item responseItem = new Item(); responseItem.type = "Contact"; // skip to Contact while (reader.hasNext() && !XMLStreamUtil.isStartTag(reader, "Resolution")) { reader.next(); } while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Resolution")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Mailbox".equals(tagLocalName)) { handleMailbox(reader, responseItem); } else if ("Contact".equals(tagLocalName)) { handleContact(reader, responseItem); } } } return responseItem; } protected void handleMailbox(XMLStreamReader reader, Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Mailbox")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Name".equals(tagLocalName)) { responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader)); } else if ("EmailAddress".equals(tagLocalName)) { responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader)); } } } } protected void handleContact(XMLStreamReader reader, Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Contact")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("EmailAddresses".equals(tagLocalName)) { handleEmailAddresses(reader, responseItem); } else if ("PhysicalAddresses".equals(tagLocalName)) { handlePhysicalAddresses(reader, responseItem); } else if ("PhoneNumbers".equals(tagLocalName)) { handlePhoneNumbers(reader, responseItem); } else if ("MSExchangeCertificate".equals(tagLocalName) || "UserSMIMECertificate".equals(tagLocalName)) { handleUserCertificate(reader, responseItem, tagLocalName); } else if ("ManagerMailbox".equals(tagLocalName) || "Attachments".equals(tagLocalName) || "Photo".equals(tagLocalName) || "Notes".equals(tagLocalName) || "HasPicture".equals(tagLocalName) || "DirectoryId".equals(tagLocalName) || "Alias".equals(tagLocalName) || "Categories".equals(tagLocalName) || "InternetMessageHeaders".equals(tagLocalName) || "ResponseObjects".equals(tagLocalName) || "ExtendedProperty".equals(tagLocalName) || "EffectiveRights".equals(tagLocalName) || "CompleteName".equals(tagLocalName) || "Children".equals(tagLocalName) || "Companies".equals(tagLocalName) || "ImAddresses".equals(tagLocalName) || "DirectReports".equals(tagLocalName)) { skipTag(reader, tagLocalName); } else { responseItem.put(tagLocalName, XMLStreamUtil.getElementText(reader)); } } } } protected void handlePhysicalAddress(XMLStreamReader reader, Item responseItem, String addressType) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "Entry")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); String value = XMLStreamUtil.getElementText(reader); responseItem.put(addressType + tagLocalName, value); } } } protected void handlePhysicalAddresses(XMLStreamReader reader, Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhysicalAddresses")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Entry".equals(tagLocalName)) { String key = getAttributeValue(reader, "Key"); handlePhysicalAddress(reader, responseItem, key); } } } } protected void handlePhoneNumbers(XMLStreamReader reader, Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "PhoneNumbers")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Entry".equals(tagLocalName)) { String key = getAttributeValue(reader, "Key"); String value = XMLStreamUtil.getElementText(reader); responseItem.put(key, value); } } } } protected void handleUserCertificate(XMLStreamReader reader, Item responseItem, String contextTagLocalName) throws XMLStreamException { boolean firstValueRead = false; String certificate = ""; while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, contextTagLocalName)) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Base64Binary".equals(tagLocalName)) { String value = reader.getElementText(); if ((value != null) && !value.isEmpty()) { if (!firstValueRead) { // Only first certificate value will be read certificate = value; firstValueRead = true; } else { LOGGER.debug("ResolveNames multiple certificates found, tagLocaleName=" + contextTagLocalName + " Certificate [" + value + "] ignored"); } } } } } responseItem.put(contextTagLocalName, certificate); } protected void skipTag(XMLStreamReader reader, String tagLocalName) throws XMLStreamException { LOGGER.debug("ResolveNames tag parsing skipped. tagLocalName=" + tagLocalName); while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, tagLocalName)) { reader.next(); } } @Override protected void handleEmailAddresses(XMLStreamReader reader, Item responseItem) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "EmailAddresses")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("Entry".equals(tagLocalName)) { String value = XMLStreamUtil.getElementText(reader); if (value != null) { if (value.startsWith("smtp:") || value.startsWith("SMTP:")) { value = value.substring(5); // get smtp address only if not already available through Mailbox info responseItem.putIfAbsent("EmailAddress", value); } } } } } } } davmail-6.3.0/src/java/davmail/exchange/ews/SearchExpression.java0100644 0000000 0000000 00000002113 12564151517 023525 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * EWS Search Expression. */ public interface SearchExpression { /** * Append search expression to buffer. * * @param buffer search buffer */ void appendTo(StringBuilder buffer); } davmail-6.3.0/src/java/davmail/exchange/ews/SearchScope.java0100644 0000000 0000000 00000002720 13452623365 022445 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * ResolveNames search scope. */ @SuppressWarnings({"UnusedDeclaration"}) public final class SearchScope extends AttributeOption { private SearchScope(String value) { super("SearchScope", value); } public static final SearchScope ActiveDirectory = new SearchScope("ActiveDirectory"); public static final SearchScope ActiveDirectoryContacts = new SearchScope("ActiveDirectoryContacts"); public static final SearchScope Contacts = new SearchScope("Contacts"); public static final SearchScope ContactsActiveDirectory = new SearchScope("ContactsActiveDirectory"); } davmail-6.3.0/src/java/davmail/exchange/ews/SendMeetingCancellations.java0100644 0000000 0000000 00000002715 13452623365 025154 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Item update option. */ @SuppressWarnings({"UnusedDeclaration"}) public final class SendMeetingCancellations extends AttributeOption { private SendMeetingCancellations(String value) { super("SendMeetingCancellations", value); } public static final SendMeetingCancellations SendToNone = new SendMeetingCancellations("SendToNone"); public static final SendMeetingCancellations SendOnlyToAll = new SendMeetingCancellations("SendOnlyToAll"); public static final SendMeetingCancellations SendToAllAndSaveCopy = new SendMeetingCancellations("SendToAllAndSaveCopy"); } davmail-6.3.0/src/java/davmail/exchange/ews/SendMeetingInvitations.java0100644 0000000 0000000 00000002673 13452623365 024707 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Item update option. */ @SuppressWarnings({"UnusedDeclaration"}) public final class SendMeetingInvitations extends AttributeOption { private SendMeetingInvitations(String value) { super("SendMeetingInvitations", value); } public static final SendMeetingInvitations SendToNone = new SendMeetingInvitations("SendToNone"); public static final SendMeetingInvitations SendOnlyToAll = new SendMeetingInvitations("SendOnlyToAll"); public static final SendMeetingInvitations SendToAllAndSaveCopy = new SendMeetingInvitations("SendToAllAndSaveCopy"); } davmail-6.3.0/src/java/davmail/exchange/ews/SendMeetingInvitationsOrCancellations.java0100644 0000000 0000000 00000003102 13452623365 027674 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; /** * Item update option. */ @SuppressWarnings({"UnusedDeclaration"}) public final class SendMeetingInvitationsOrCancellations extends AttributeOption { private SendMeetingInvitationsOrCancellations(String value) { super("SendMeetingInvitationsOrCancellations", value); } public static final SendMeetingInvitationsOrCancellations SendToNone = new SendMeetingInvitationsOrCancellations("SendToNone"); public static final SendMeetingInvitationsOrCancellations SendOnlyToAll = new SendMeetingInvitationsOrCancellations("SendOnlyToAll"); public static final SendMeetingInvitationsOrCancellations SendToAllAndSaveCopy = new SendMeetingInvitationsOrCancellations("SendToAllAndSaveCopy"); } davmail-6.3.0/src/java/davmail/exchange/ews/TwoOperandExpression.java0100644 0000000 0000000 00000004534 12564151517 024413 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.util.StringUtil; /** * Two operand expression. */ public class TwoOperandExpression implements SearchExpression { @SuppressWarnings({"UnusedDeclaration"}) protected enum Operator { IsEqualTo, IsNotEqualTo, IsGreaterThan, IsGreaterThanOrEqualTo, IsLessThan, IsLessThanOrEqualTo } protected final Operator operator; protected final FieldURI fieldURI; protected final String value; /** * Create two operand expression. * * @param operator operator * @param fieldURI field operand * @param value value operand */ public TwoOperandExpression(Operator operator, FieldURI fieldURI, String value) { this.operator = operator; this.fieldURI = fieldURI; this.value = value; } public void appendTo(StringBuilder buffer) { buffer.append("'); fieldURI.appendTo(buffer); buffer.append(""); buffer.append("'); } } davmail-6.3.0/src/java/davmail/exchange/ews/UnindexedFieldURI.java0100644 0000000 0000000 00000014431 14754417472 023525 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.util.StringUtil; import java.util.List; /** * Unindexed Field URI */ public class UnindexedFieldURI implements FieldURI { protected final String fieldURI; protected final String fieldName; /** * Create unindexed field URI. * * @param fieldURI field name */ public UnindexedFieldURI(String fieldURI) { this.fieldURI = fieldURI; int colonIndex = fieldURI.indexOf(':'); if (colonIndex < 0) { fieldName = fieldURI; } else { fieldName = fieldURI.substring(colonIndex + 1); } } public void appendTo(StringBuilder buffer) { buffer.append(""); } public void appendValue(StringBuilder buffer, String itemType, String value) { if (fieldURI.startsWith("message") && itemType != null) { itemType = "Message"; } else if (fieldURI.startsWith("calendar") && itemType != null) { itemType = "CalendarItem"; } else if (fieldURI.startsWith("task") && itemType != null) { itemType = "Task"; } else if (fieldURI.startsWith("contacts") && itemType != null) { itemType = "Contact"; } if (itemType != null) { appendTo(buffer); buffer.append("'); } if ("MeetingTimeZone".equals(fieldName)) { buffer.append(""); } else if ("StartTimeZone".equals(fieldName)) { buffer.append(""); } else if ("EndTimeZone".equals(fieldName)) { buffer.append(""); } else { buffer.append("'); buffer.append(StringUtil.xmlEncodeAttribute(value)); buffer.append("'); } if (itemType != null) { buffer.append("'); } } public void appendValues(StringBuilder buffer, String itemType, List values) { if (fieldURI.startsWith("message") && itemType != null) { itemType = "Message"; } else if (fieldURI.startsWith("calendar") && itemType != null) { itemType = "CalendarItem"; } else if (fieldURI.startsWith("task") && itemType != null) { itemType = "Task"; } else if (fieldURI.startsWith("contacts") && itemType != null) { itemType = "Contact"; } else if (fieldURI.startsWith("distributionlist") && itemType != null) { itemType = "DistributionList"; } if (!values.isEmpty()) { if (itemType != null) { appendTo(buffer); buffer.append("'); } buffer.append("'); for (String value : values) { if ("RequiredAttendees".equals(fieldName) || "OptionalAttendees".equals(fieldName)) { buffer.append(""); buffer.append(StringUtil.xmlEncodeAttribute(value)); buffer.append(""); } else if ("Members".equals(fieldName)) { if (value.toLowerCase().startsWith("mailto:")) { buffer.append(""); buffer.append(StringUtil.xmlEncodeAttribute(value.substring(7))); buffer.append(""); } else if (value.startsWith("urn:uuid:")){ buffer.append("PrivateDL"); } } else { buffer.append(StringUtil.xmlEncodeAttribute(value)); } } buffer.append("'); if (itemType != null) { buffer.append("'); } } else if (itemType != null) { // append field name only to remove values appendTo(buffer); } } public String getResponseName() { return fieldName; } @Override public String getGraphId() { // todo check valid for other fields? return fieldName; } } davmail-6.3.0/src/java/davmail/exchange/ews/UpdateFolderMethod.java0100644 0000000 0000000 00000002457 12564151517 023772 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.List; /** * Update Folder method. */ public class UpdateFolderMethod extends EWSMethod { /** * Update folder options. * * @param folderId folder id * @param updates folder properties updates */ public UpdateFolderMethod(FolderId folderId, List updates) { super("Folder", "UpdateFolder"); this.folderId = folderId; this.updates = updates; } }davmail-6.3.0/src/java/davmail/exchange/ews/UpdateItemMethod.java0100644 0000000 0000000 00000003574 12564151517 023456 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import java.util.List; /** * Update Item method. */ public class UpdateItemMethod extends EWSMethod { /** * Update exchange item. * * @param messageDisposition save or send option * @param conflictResolution overwrite option * @param sendMeetingInvitationsOrCancellations * send invitations option * @param itemId item id with change key * @param updates field updates */ public UpdateItemMethod(MessageDisposition messageDisposition, ConflictResolution conflictResolution, SendMeetingInvitationsOrCancellations sendMeetingInvitationsOrCancellations, ItemId itemId, List updates) { super("Item", "UpdateItem"); this.itemId = itemId; this.updates = updates; addMethodOption(messageDisposition); addMethodOption(conflictResolution); addMethodOption(sendMeetingInvitationsOrCancellations); } }davmail-6.3.0/src/java/davmail/exchange/graph/GraphExchangeSession.java0100644 0000000 0000000 00000066157 14754153477 024647 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.graph; import davmail.exception.HttpNotFoundException; import davmail.exchange.ExchangeSession; import davmail.exchange.auth.O365Token; import davmail.exchange.ews.EwsExchangeSession; import davmail.exchange.ews.ExtendedFieldURI; import davmail.exchange.ews.Field; import davmail.exchange.ews.FieldURI; import davmail.http.HttpClientAdapter; import davmail.util.StringUtil; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpRequestBase; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; /** * Implement ExchangeSession based on Microsoft Graph */ public class GraphExchangeSession extends ExchangeSession { protected class Folder extends ExchangeSession.Folder { public FolderId folderId; } // special folders https://learn.microsoft.com/en-us/graph/api/resources/mailfolder @SuppressWarnings("SpellCheckingInspection") public enum WellKnownFolderName { archive, deleteditems, calendar, contacts, tasks, drafts, inbox, outbox, sentitems, junkemail, msgfolderroot, searchfolders } protected static class FolderId { protected String mailbox; protected String id; protected String folderClass; public FolderId() { } public FolderId(String mailbox, String id) { this.mailbox = mailbox; this.id = id; } public FolderId(String mailbox, WellKnownFolderName wellKnownFolderName) { this.mailbox = mailbox; this.id = wellKnownFolderName.name(); } public FolderId(String mailbox, WellKnownFolderName wellKnownFolderName, String folderClass) { this.mailbox = mailbox; this.id = wellKnownFolderName.name(); this.folderClass = folderClass; } } HttpClientAdapter httpClient; O365Token token; /** * Default folder properties list */ protected static final HashSet FOLDER_PROPERTIES = new HashSet<>(); static { FOLDER_PROPERTIES.add(Field.get("folderDisplayName")); FOLDER_PROPERTIES.add(Field.get("lastmodified")); FOLDER_PROPERTIES.add(Field.get("folderclass")); FOLDER_PROPERTIES.add(Field.get("ctag")); FOLDER_PROPERTIES.add(Field.get("uidNext")); } public GraphExchangeSession(HttpClientAdapter httpClient, O365Token token, String userName) { this.httpClient = httpClient; this.token = token; this.userName = userName; } @Override public void close() { httpClient.close(); } @Override public String formatSearchDate(Date date) { return null; } @Override protected void buildSessionInfo(URI uri) throws IOException { } @Override public Message createMessage(String folderPath, String messageName, HashMap properties, MimeMessage mimeMessage) throws IOException { return null; } @Override public void updateMessage(Message message, Map properties) throws IOException { } @Override public void deleteMessage(Message message) throws IOException { } @Override protected byte[] getContent(Message message) throws IOException { return new byte[0]; } @Override public MessageList searchMessages(String folderName, Set attributes, Condition condition) throws IOException { return null; } static class AttributeCondition extends ExchangeSession.AttributeCondition { protected AttributeCondition(String attributeName, Operator operator, String value) { super(attributeName, operator, value); } protected FieldURI getFieldURI() { FieldURI fieldURI = Field.get(attributeName); // check to detect broken field mapping //noinspection ConstantConditions if (fieldURI == null) { throw new IllegalArgumentException("Unknown field: " + attributeName); } return fieldURI; } private String convertOperator(Operator operator) { if (Operator.IsEqualTo.equals(operator)) { return "eq"; } // TODO other operators return operator.toString(); } @Override public void appendTo(StringBuilder buffer) { FieldURI fieldURI = getFieldURI(); if (Operator.StartsWith.equals(operator)) { buffer.append("startswith(").append(getFieldURI().getGraphId()).append(",'").append(StringUtil.davSearchEncode(value)).append("')"); } else if (fieldURI instanceof ExtendedFieldURI) { buffer.append("singleValueExtendedProperties/Any(ep: ep/id eq '").append(getFieldURI().getGraphId()) .append("' and ep/value ").append(convertOperator(operator)).append(" '").append(StringUtil.davSearchEncode(value)).append("')"); } else { buffer.append(getFieldURI().getGraphId()).append(" ").append(convertOperator(operator)).append(" '").append(StringUtil.davSearchEncode(value)).append("'"); } } @Override public boolean isMatch(Contact contact) { return false; } } @Override public MultiCondition and(Condition... condition) { return null; } @Override public MultiCondition or(Condition... condition) { return null; } @Override public Condition not(Condition condition) { return null; } @Override public Condition isEqualTo(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.IsEqualTo, value); } @Override public Condition isEqualTo(String attributeName, int value) { return null; } @Override public Condition headerIsEqualTo(String headerName, String value) { return null; } @Override public Condition gte(String attributeName, String value) { return null; } @Override public Condition gt(String attributeName, String value) { return null; } @Override public Condition lt(String attributeName, String value) { return null; } @Override public Condition lte(String attributeName, String value) { return null; } @Override public Condition contains(String attributeName, String value) { return null; } @Override public Condition startsWith(String attributeName, String value) { return new AttributeCondition(attributeName, Operator.StartsWith, value); } @Override public Condition isNull(String attributeName) { return new AttributeCondition(attributeName, Operator.IsEqualTo, "null"); } @Override public Condition exists(String attributeName) { return null; } @Override public Condition isTrue(String attributeName) { return null; } @Override public Condition isFalse(String attributeName) { return null; } @Override public List getSubFolders(String folderPath, Condition condition, boolean recursive) throws IOException { String baseFolderPath = folderPath; if (baseFolderPath.startsWith("/users/")) { int index = baseFolderPath.indexOf('/', "/users/".length()); if (index >= 0) { baseFolderPath = baseFolderPath.substring(index + 1); } } List folders = new ArrayList<>(); appendSubFolders(folders, baseFolderPath, getFolderId(folderPath), condition, recursive); return folders; } protected void appendSubFolders(List folders, String parentFolderPath, FolderId parentFolderId, Condition condition, boolean recursive) throws IOException { int resultCount = 0; GraphRequestBuilder httpRequestBuilder = new GraphRequestBuilder() .setMethod("GET") .setObjectType("mailFolders") .setMailbox(parentFolderId.mailbox) .setObjectId(parentFolderId.id) .setChildType("childFolders") .setExpandFields(FOLDER_PROPERTIES); LOGGER.debug("appendSubFolders "+parentFolderId.mailbox+parentFolderPath); if (condition != null && !condition.isEmpty()) { StringBuilder filter = new StringBuilder(); condition.appendTo(filter); LOGGER.debug("search filter "+filter); httpRequestBuilder.setFilter(filter.toString()); } // TODO handle paging GraphIterator graphIterator = executeSearchRequest(httpRequestBuilder); while (graphIterator.hasNext()) { resultCount++; Folder folder = buildFolder(graphIterator.next()); folder.folderId.mailbox = parentFolderId.mailbox; if (!parentFolderPath.isEmpty()) { if (parentFolderPath.endsWith("/")) { folder.folderPath = parentFolderPath + folder.displayName; } else { folder.folderPath = parentFolderPath + '/' + folder.displayName; } // TODO folderIdMap? } else { folder.folderPath = folder.displayName; } folders.add(folder); if (recursive && folder.hasChildren) { appendSubFolders(folders, folder.folderPath, folder.folderId, condition, true); } } } @Override public void sendMessage(MimeMessage mimeMessage) throws IOException, MessagingException { } @Override protected Folder internalGetFolder(String folderPath) throws IOException { FolderId folderId = getFolderId(folderPath); // base folder get https://graph.microsoft.com/v1.0/me/mailFolders/inbox GraphRequestBuilder httpRequestBuilder = new GraphRequestBuilder() .setMethod("GET") .setObjectType("mailFolders") .setMailbox(folderId.mailbox) .setObjectId(folderId.id) .setExpandFields(FOLDER_PROPERTIES); JSONObject jsonResponse = executeJsonRequest(httpRequestBuilder); // todo check missing folder //throw new HttpNotFoundException("Folder " + folderPath + " not found"); Folder folder = buildFolder(jsonResponse); folder.folderPath = folderPath; return folder; } private Folder buildFolder(JSONObject jsonResponse) throws IOException { try { Folder folder = new Folder(); folder.folderId = new FolderId(); folder.folderId.id = jsonResponse.getString("id"); // TODO: reevaluate folder name encoding over graph folder.displayName = EwsExchangeSession.encodeFolderName(jsonResponse.optString("displayName")); folder.count = jsonResponse.getInt("totalItemCount"); folder.unreadCount = jsonResponse.getInt("unreadItemCount"); // fake recent value folder.recent = folder.unreadCount; // hassubs computed from childFolderCount folder.hasChildren = jsonResponse.getInt("childFolderCount") > 0; // retrieve property values JSONArray singleValueExtendedProperties = jsonResponse.optJSONArray("singleValueExtendedProperties"); if (singleValueExtendedProperties != null) { for (int i = 0; i < singleValueExtendedProperties.length(); i++) { JSONObject singleValueProperty = singleValueExtendedProperties.getJSONObject(i); String singleValueId = singleValueProperty.getString("id"); String singleValue = singleValueProperty.getString("value"); if (Field.get("lastmodified").getGraphId().equals(singleValueId)) { folder.etag = singleValue; } else if (Field.get("folderclass").getGraphId().equals(singleValueId)) { folder.folderClass = singleValue; } else if (Field.get("uidNext").getGraphId().equals(singleValueId)) { folder.uidNext = Long.parseLong(singleValue); } else if (Field.get("ctag").getGraphId().equals(singleValueId)) { folder.ctag = singleValue; } } } return folder; } catch (JSONException e) { throw new IOException(e.getMessage(), e); } } /** * Compute folderId from folderName * @param folderPath folder name (path) * @return folder id */ private FolderId getFolderId(String folderPath) throws IOException { FolderId folderId = getFolderIdIfExists(folderPath); if (folderId == null) { throw new HttpNotFoundException("Folder '" + folderPath + "' not found"); } return folderId; } protected static final String USERS_ROOT = "/users/"; protected static final String ARCHIVE_ROOT = "/archive/"; private FolderId getFolderIdIfExists(String folderPath) throws IOException { String lowerCaseFolderPath = folderPath.toLowerCase(); if (lowerCaseFolderPath.equals(currentMailboxPath)) { return getSubFolderIdIfExists(null, ""); } else if (lowerCaseFolderPath.startsWith(currentMailboxPath + '/')) { return getSubFolderIdIfExists(null, folderPath.substring(currentMailboxPath.length() + 1)); } else if (folderPath.startsWith(USERS_ROOT)) { int slashIndex = folderPath.indexOf('/', USERS_ROOT.length()); String mailbox; String subFolderPath; if (slashIndex >= 0) { mailbox = folderPath.substring(USERS_ROOT.length(), slashIndex); subFolderPath = folderPath.substring(slashIndex + 1); } else { mailbox = folderPath.substring(USERS_ROOT.length()); subFolderPath = ""; } return getSubFolderIdIfExists(mailbox, subFolderPath); } else { return getSubFolderIdIfExists(null, folderPath); } } private FolderId getSubFolderIdIfExists(String mailbox, String folderPath) throws IOException { String[] folderNames; FolderId currentFolderId; // TODO test various use cases if ("/public".equals(folderPath)) { throw new UnsupportedOperationException("public folders not supported on Graph"); } else if ("/archive".equals(folderPath)) { return new FolderId(mailbox, WellKnownFolderName.archive); } else if (isSubFolderOf(folderPath, PUBLIC_ROOT)) { throw new UnsupportedOperationException("public folders not supported on Graph"); } else if (isSubFolderOf(folderPath, ARCHIVE_ROOT)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.archive); folderNames = folderPath.substring(ARCHIVE_ROOT.length()).split("/"); } else if (isSubFolderOf(folderPath, INBOX) || isSubFolderOf(folderPath, LOWER_CASE_INBOX) || isSubFolderOf(folderPath, MIXED_CASE_INBOX)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.inbox); folderNames = folderPath.substring(INBOX.length()).split("/"); } else if (isSubFolderOf(folderPath, CALENDAR)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.calendar, "IPF.Appointment"); // TODO subfolders not supported with graph folderNames = folderPath.substring(CALENDAR.length()).split("/"); } else if (isSubFolderOf(folderPath, TASKS)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.tasks, "IPF.Task"); folderNames = folderPath.substring(TASKS.length()).split("/"); } else if (isSubFolderOf(folderPath, CONTACTS)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.contacts, "IPF.Contact"); // TODO subfolders not supported with graph folderNames = folderPath.substring(CONTACTS.length()).split("/"); } else if (isSubFolderOf(folderPath, SENT)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.sentitems); folderNames = folderPath.substring(SENT.length()).split("/"); } else if (isSubFolderOf(folderPath, DRAFTS)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.drafts); folderNames = folderPath.substring(DRAFTS.length()).split("/"); } else if (isSubFolderOf(folderPath, TRASH)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.deleteditems); folderNames = folderPath.substring(TRASH.length()).split("/"); } else if (isSubFolderOf(folderPath, JUNK)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.junkemail); folderNames = folderPath.substring(JUNK.length()).split("/"); } else if (isSubFolderOf(folderPath, UNSENT)) { currentFolderId = new FolderId(mailbox, WellKnownFolderName.outbox); folderNames = folderPath.substring(UNSENT.length()).split("/"); } else { currentFolderId = new FolderId(mailbox, WellKnownFolderName.msgfolderroot); folderNames = folderPath.split("/"); } if (currentFolderId != null) { String folderClass = currentFolderId.folderClass; for (String folderName : folderNames) { if (!folderName.isEmpty()) { currentFolderId = getSubFolderByName(currentFolderId, folderName); if (currentFolderId == null) { break; } currentFolderId.folderClass = folderClass; } } } return currentFolderId; } /** * Search subfolder by name, return null when no folders found * @param currentFolderId parent folder id * @param folderName child folder name * @return child folder id if exists * @throws IOException on error */ protected FolderId getSubFolderByName(FolderId currentFolderId, String folderName) throws IOException { // TODO rename davSearchEncode GraphRequestBuilder httpRequestBuilder = new GraphRequestBuilder() .setMethod("GET") .setObjectType("mailFolders") .setMailbox(currentFolderId.mailbox) .setObjectId(currentFolderId.id) .setChildType("childFolders") .setExpandFields(FOLDER_PROPERTIES) .setFilter("displayName eq '" + StringUtil.davSearchEncode(EwsExchangeSession.decodeFolderName(folderName)) + "'"); JSONObject jsonResponse = executeJsonRequest(httpRequestBuilder); FolderId folderId = null; try { JSONArray values = jsonResponse.getJSONArray("value"); if (values.length() > 0) { folderId = new FolderId(currentFolderId.mailbox, values.getJSONObject(0).getString("id")); } } catch (JSONException e) { throw new IOException(e.getMessage(), e); } return folderId; } private boolean isSubFolderOf(String folderPath, String baseFolder) { if (PUBLIC_ROOT.equals(baseFolder) || ARCHIVE_ROOT.equals(baseFolder)) { return folderPath.startsWith(baseFolder); } else { return folderPath.startsWith(baseFolder) && (folderPath.length() == baseFolder.length() || folderPath.charAt(baseFolder.length()) == '/'); } } @Override public int createFolder(String folderName, String folderClass, Map properties) throws IOException { return 0; } @Override public int updateFolder(String folderName, Map properties) throws IOException { return 0; } @Override public void deleteFolder(String folderName) throws IOException { } @Override public void copyMessage(Message message, String targetFolder) throws IOException { } @Override public void moveMessage(Message message, String targetFolder) throws IOException { } @Override public void moveFolder(String folderName, String targetName) throws IOException { } @Override public void moveItem(String sourcePath, String targetPath) throws IOException { } @Override protected void moveToTrash(Message message) throws IOException { } @Override protected Set getItemProperties() { return null; } @Override public List searchContacts(String folderPath, Set attributes, Condition condition, int maxCount) throws IOException { return null; } @Override public List getEventMessages(String folderPath) throws IOException { return null; } @Override protected Condition getCalendarItemCondition(Condition dateCondition) { return null; } @Override public List searchEvents(String folderPath, Set attributes, Condition condition) throws IOException { return null; } @Override public Item getItem(String folderPath, String itemName) throws IOException { return null; } @Override public ContactPhoto getContactPhoto(Contact contact) throws IOException { return null; } @Override public void deleteItem(String folderPath, String itemName) throws IOException { } @Override public void processItem(String folderPath, String itemName) throws IOException { } @Override public int sendEvent(String icsBody) throws IOException { return 0; } @Override protected Contact buildContact(String folderPath, String itemName, Map properties, String etag, String noneMatch) throws IOException { return null; } @Override protected ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException { return null; } @Override public boolean isSharedFolder(String folderPath) { return false; } @Override public boolean isMainCalendar(String folderPath) throws IOException { return false; } @Override public Map galFind(Condition condition, Set returningAttributes, int sizeLimit) throws IOException { return null; } @Override protected String getFreeBusyData(String attendee, String start, String end, int interval) throws IOException { return null; } @Override protected void loadVtimezone() { } class GraphIterator { private JSONObject jsonObject; private JSONArray values; private String nextLink; private int index; public GraphIterator(JSONObject jsonObject) throws JSONException { this.jsonObject = jsonObject; nextLink = jsonObject.optString("@odata.nextLink", null); values = jsonObject.getJSONArray("value"); } public boolean hasNext() { return nextLink != null || index < values.length(); } public JSONObject next() throws IOException { if (!hasNext()) { throw new NoSuchElementException(); } try { if (index >= values.length() && nextLink != null) { fetchNextPage(); } return values.getJSONObject(index++); } catch (JSONException e) { throw new IOException(e.getMessage(), e); } } private void fetchNextPage() throws IOException, JSONException { HttpGet request = new HttpGet(nextLink); request.setHeader("Authorization", "Bearer " + token.getAccessToken()); try ( CloseableHttpResponse response = httpClient.execute(request) ) { jsonObject = new JsonResponseHandler().handleResponse(response); nextLink = jsonObject.optString("@odata.nextLink", null); values = jsonObject.getJSONArray("value"); index = 0; } } } private GraphIterator executeSearchRequest(GraphRequestBuilder httpRequestBuilder) throws IOException { try { JSONObject jsonResponse = executeJsonRequest(httpRequestBuilder); return new GraphIterator(jsonResponse); } catch (JSONException e) { throw new IOException(e.getMessage(), e); } } private JSONObject executeJsonRequest(GraphRequestBuilder httpRequestBuilder) throws IOException { // TODO handle throttling HttpRequestBase request = httpRequestBuilder .setAccessToken(token.getAccessToken()) .build(); JSONObject jsonResponse; try ( CloseableHttpResponse response = httpClient.execute(request) ) { jsonResponse = new JsonResponseHandler().handleResponse(response); } return jsonResponse; } } davmail-6.3.0/src/java/davmail/exchange/graph/GraphExchangeSessionDraft.java0100644 0000000 0000000 00000113251 14754417473 025613 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.graph; import davmail.Settings; import davmail.exception.HttpNotFoundException; import davmail.exchange.ExchangeSession; import davmail.exchange.auth.O365Token; import davmail.exchange.ews.EwsExchangeSession; import davmail.exchange.ews.ExtendedFieldURI; import davmail.exchange.ews.Field; import davmail.exchange.ews.FieldURI; import davmail.exchange.ews.IndexedFieldURI; import davmail.http.HttpClientAdapter; import davmail.util.IOUtil; import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPatch; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ByteArrayEntity; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import javax.mail.util.SharedByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.zip.GZIPInputStream; public class GraphExchangeSessionDraft extends ExchangeSession { HttpClientAdapter httpClient; O365Token token; /** * API version */ String apiVersion = "beta"; String baseUrl; protected class Folder extends ExchangeSession.Folder { public String lastModified; public String id; } protected static final HashSet FOLDER_PROPERTIES = new HashSet<>(); static { FOLDER_PROPERTIES.add(Field.get("urlcompname")); FOLDER_PROPERTIES.add(Field.get("folderDisplayName")); FOLDER_PROPERTIES.add(Field.get("lastmodified")); FOLDER_PROPERTIES.add(Field.get("folderclass")); FOLDER_PROPERTIES.add(Field.get("ctag")); //FOLDER_PROPERTIES.add(Field.get("count")); //FOLDER_PROPERTIES.add(Field.get("unread")); //FOLDER_PROPERTIES.add(Field.get("hassubs")); FOLDER_PROPERTIES.add(Field.get("uidNext")); FOLDER_PROPERTIES.add(Field.get("highestUid")); } public GraphExchangeSessionDraft(HttpClientAdapter httpClient, O365Token token, String userName) { this.httpClient = httpClient; this.token = token; this.userName = userName; // TODO: build url from settings for .us and other tenants this.baseUrl = Settings.GRAPH_URL; } // get folder id, well known folders // https://learn.microsoft.com/en-us/graph/api/resources/mailfolder?view=graph-rest-1.0 // /me/mailFolders/msgfolderroot public Folder getFolderByName(String folderName) throws URISyntaxException, IOException, JSONException { Folder folder = null; HttpRequestBase httpRequest = new GraphRequestBuilder() .setMethod("GET") .setAccessToken(token.getAccessToken()) .setObjectType("mailFolders") .setObjectId(folderName) .setExpandFields(FOLDER_PROPERTIES).build(); JSONObject jsonResponse = executeRequest(httpRequest); folder = new Folder(); folder.folderPath = folderName; folder.displayName = jsonResponse.optString("displayName"); LOGGER.debug("urlcompname " + Field.get("urlcompname").getGraphId()); LOGGER.debug("folderDisplayName " + jsonResponse.optString("displayName")); LOGGER.debug("lastmodified " + Field.get("lastmodified").getGraphId()); LOGGER.debug("folderclass " + Field.get("folderclass").getGraphId()); LOGGER.debug("ctag " + Field.get("ctag").getGraphId()); LOGGER.debug("count " + Field.get("count").getGraphId()); LOGGER.debug("unread " + Field.get("unread").getGraphId()); LOGGER.debug("hassubs " + Field.get("hassubs").getGraphId()); LOGGER.debug("uidNext " + Field.get("uidNext").getGraphId()); LOGGER.debug("highestUid " + Field.get("highestUid").getGraphId()); // retrieve property values JSONArray singleValueExtendedProperties = jsonResponse.optJSONArray("singleValueExtendedProperties"); if (singleValueExtendedProperties != null) { for (int i = 0; i < singleValueExtendedProperties.length(); i++) { JSONObject singleValueProperty = singleValueExtendedProperties.getJSONObject(i); String singleValueId = singleValueProperty.getString("id"); String singleValue = singleValueProperty.getString("value"); if (Field.get("lastmodified").getGraphId().equals(singleValueId)) { // TODO parse date ? folder.lastModified = singleValue; } else if (Field.get("folderclass").getGraphId().equals(singleValueId)) { folder.folderClass = singleValue; } else if (Field.get("uidNext").getGraphId().equals(singleValueId)) { folder.uidNext = Long.parseLong(singleValue); } else if (Field.get("ctag").getGraphId().equals(singleValueId)) { folder.ctag = singleValue; // replaced with native properties //} else if (Field.get("count").getGraphId().equals(singleValueId)) { // folder.count = Integer.parseInt(singleValue); //} else if (Field.get("hassubs").getGraphId().equals(singleValueId)) { // folder.hasChildren = "true".equals(singleValue); //} else if (Field.get("unread").getGraphId().equals(singleValueId)) { // folder.unreadCount = Integer.parseInt(singleValue); } else { LOGGER.warn("Unknown property " + singleValueId); } } } folder.count = jsonResponse.getInt("totalItemCount"); folder.unreadCount = jsonResponse.getInt("unreadItemCount"); folder.hasChildren = jsonResponse.getInt("childFolderCount") > 0; return folder; } /** * Compute expand parameters from properties * @param fields * @return $expand value */ private String buildExpand(HashSet fields) { ArrayList singleValueProperties = new ArrayList<>(); ArrayList multiValueProperties = new ArrayList<>(); for (FieldURI fieldURI : fields) { if (fieldURI instanceof ExtendedFieldURI) { singleValueProperties.add(fieldURI.getGraphId()); } else if (fieldURI instanceof IndexedFieldURI) { multiValueProperties.add(fieldURI.getGraphId()); } } StringBuilder expand = new StringBuilder(); if (!singleValueProperties.isEmpty()) { expand.append("singleValueExtendedProperties($filter="); appendExpandProperties(expand, singleValueProperties); expand.append(")"); } if (!multiValueProperties.isEmpty()) { if (!singleValueProperties.isEmpty()) { expand.append(","); } expand.append("multiValueExtendedProperties($filter="); appendExpandProperties(expand, multiValueProperties); expand.append(")"); } return expand.toString(); } public void appendExpandProperties(StringBuilder buffer, List properties) { boolean first = true; for (String id : properties) { if (first) { first = false; } else { buffer.append(" or "); } buffer.append("id eq '").append(id).append("'"); } } @Override public void close() { } @Override public String formatSearchDate(Date date) { return null; } @Override protected void buildSessionInfo(URI uri) throws IOException { } @Override public Message createMessage(String folderPath, String messageName, HashMap properties, MimeMessage mimeMessage) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { mimeMessage.writeTo(baos); } catch (MessagingException e) { throw new IOException(e.getMessage()); } baos.close(); byte[] mimeContent = IOUtil.encodeBase64(baos.toByteArray()); // https://learn.microsoft.com/en-us/graph/api/user-post-messages try { String folderId = getFolderIdIfExists(folderPath); String path = "/beta/me/mailFolders/" + folderId + "/messages"; path = "/beta/me/messages"; HttpPost httpPost = new HttpPost(new URIBuilder(baseUrl).setPath(path).build()); httpPost.setHeader("Content-Type", "text/plain"); httpPost.setEntity(new ByteArrayEntity(mimeContent)); JSONObject response = executeRequest(httpPost); //path = "/beta/me/mailFolders/"+response.get("id")+"/messages"; path = "/beta/me/messages/" + response.get("id"); HttpPatch httpPatch = new HttpPatch(new URIBuilder(baseUrl).setPath(path).build()); httpPatch.setHeader("Content-Type", "application/json"); // TODO: map properties response.put("singleValueExtendedProperties", new JSONArray().put( new JSONObject() .put("id", Field.get("messageFlags").getGraphId()) .put("value", "4") )); httpPatch.setEntity(new ByteArrayEntity(response.toString().getBytes(StandardCharsets.UTF_8))); response = executeRequest(httpPatch); response = moveMessage(response.getString("id"), folderId); getMessage(response.getString("id")); /* getMessage(response.getString("id")); response = updateMessage(response.getString("id"), properties); getMessage(response.getString("id")); getMessageBody(response.getString("id")); System.out.println(response.toString(4));*/ } catch (URISyntaxException | JSONException e) { throw new IOException(e); } return null; /* // TODO: fields List fieldUpdates = buildProperties(properties); if (!properties.containsKey("draft")) { // need to force draft flag to false if (properties.containsKey("read")) { fieldUpdates.add(Field.createFieldUpdate("messageFlags", "1")); } else { fieldUpdates.add(Field.createFieldUpdate("messageFlags", "0")); } } fieldUpdates.add(Field.createFieldUpdate("urlcompname", messageName)); item.setFieldUpdates(fieldUpdates); */ /* CreateItemMethod createItemMethod = new CreateItemMethod(MessageDisposition.SaveOnly, getFolderId(folderPath), item); executeMethod(createItemMethod); ItemId newItemId = new ItemId(createItemMethod.getResponseItem()); GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, newItemId, false); for (String attribute : IMAP_MESSAGE_ATTRIBUTES) { getItemMethod.addAdditionalProperty(Field.get(attribute)); } executeMethod(getItemMethod); return buildMessage(getItemMethod.getResponseItem()); */ } private JSONObject updateMessage(String id, HashMap properties) throws IOException { try { String path = "/beta/me/messages/" + id; HttpPatch httpPatch = new HttpPatch(new URIBuilder(baseUrl).setPath(path).build()); httpPatch.setHeader("Content-Type", "application/json"); JSONObject jsonObject = new JSONObject(); // TODO: map properties jsonObject.put("isDraft", false); jsonObject.put("singleValueExtendedProperties", new JSONArray().put( new JSONObject() .put("id", Field.get("messageFlags").getGraphId()) .put("value", "4") )); httpPatch.setEntity(new ByteArrayEntity(jsonObject.toString().getBytes(StandardCharsets.UTF_8))); JSONObject response = executeRequest(httpPatch); return response; } catch (URISyntaxException | JSONException e) { throw new IOException(e); } } private JSONObject moveMessage(String id, String folderId) throws IOException { try { String path = "/beta/me/messages/" + id + "/move/"; HttpPost httpPost = new HttpPost(new URIBuilder(baseUrl).setPath(path).build()); httpPost.setHeader("Content-Type", "application/json"); JSONObject jsonObject = new JSONObject(); jsonObject.put("destinationId", folderId); httpPost.setEntity(new ByteArrayEntity(jsonObject.toString().getBytes(StandardCharsets.UTF_8))); JSONObject response = executeRequest(httpPost); return response; } catch (URISyntaxException | JSONException e) { throw new IOException(e); } } private Message getMessage(String id) throws URISyntaxException, IOException, JSONException { HashSet messageProperties = new HashSet<>(); messageProperties.add(Field.get("messageFlags")); messageProperties.add(Field.get("imapUid")); Message message = null; URIBuilder uriBuilder = new URIBuilder(baseUrl) .setPath("/beta/me/messages/" + id) .addParameter("$expand", buildExpand(messageProperties)); HttpGet httpGet = new HttpGet(uriBuilder.build()); httpGet.setHeader("Authorization", "Bearer " + token.getAccessToken()); try ( CloseableHttpResponse response = httpClient.execute(httpGet); ) { JSONObject jsonResponse = new JsonResponseHandler().handleResponse(response); JSONArray singleValueExtendedProperties = jsonResponse.optJSONArray("singleValueExtendedProperties"); if (singleValueExtendedProperties != null) { for (int i = 0; i < singleValueExtendedProperties.length(); i++) { JSONObject singleValueProperty = singleValueExtendedProperties.getJSONObject(i); String singleValueId = singleValueProperty.getString("id"); String singleValue = singleValueProperty.getString("value"); if (Field.get("messageFlags").getGraphId().equals(singleValueId)) { System.out.println("messageFlags: " + singleValue); } else if (Field.get("imapUid").getGraphId().equals(singleValueId)) { System.out.println("imapUid: " + singleValue); } else { LOGGER.warn("Unknown property " + singleValueId); } } } } return message; } public void getMessageBody(String id) throws URISyntaxException, IOException, MessagingException { MimeMessage mimeMessage = null; URIBuilder uriBuilder = new URIBuilder(baseUrl) .setPath("/beta/me/messages/" + id + "/$value"); HttpGet httpGet = new HttpGet(uriBuilder.build()); httpGet.setHeader("Authorization", "Bearer " + token.getAccessToken()); try ( CloseableHttpResponse response = httpClient.execute(httpGet); ) { try (InputStream inputStream = response.getEntity().getContent()) { if (HttpClientAdapter.isGzipEncoded(response)) { mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(IOUtil.readFully(new GZIPInputStream(inputStream)))); } else { mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(IOUtil.readFully(inputStream))); } } catch (MessagingException e) { throw new IOException(e.getMessage(), e); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); System.out.println(baos.toString("UTF-8")); } } @Override public void updateMessage(Message message, Map properties) throws IOException { } @Override public void deleteMessage(Message message) throws IOException { } @Override protected byte[] getContent(Message message) throws IOException { return new byte[0]; } @Override public MessageList searchMessages(String folderName, Set attributes, Condition condition) throws IOException { return null; } @Override public MultiCondition and(Condition... condition) { return null; } @Override public MultiCondition or(Condition... condition) { return null; } @Override public Condition not(Condition condition) { return null; } @Override public Condition isEqualTo(String attributeName, String value) { return null; } @Override public Condition isEqualTo(String attributeName, int value) { return null; } @Override public Condition headerIsEqualTo(String headerName, String value) { return null; } @Override public Condition gte(String attributeName, String value) { return null; } @Override public Condition gt(String attributeName, String value) { return null; } @Override public Condition lt(String attributeName, String value) { return null; } @Override public Condition lte(String attributeName, String value) { return null; } @Override public Condition contains(String attributeName, String value) { return null; } @Override public Condition startsWith(String attributeName, String value) { return null; } @Override public Condition isNull(String attributeName) { return null; } @Override public Condition exists(String attributeName) { return null; } @Override public Condition isTrue(String attributeName) { return null; } @Override public Condition isFalse(String attributeName) { return null; } @Override public List getSubFolders(String folderName, Condition condition, boolean recursive) throws IOException { // TODO implement conditions and recursive search ArrayList folders = new ArrayList<>(); try { String folderId = getFolderId(folderName); HttpGet httpGet = new HttpGet(new URIBuilder(baseUrl).setPath("/beta/me/mailFolders/" + folderId + "/childFolders") .addParameter("$expand", buildExpand(FOLDER_PROPERTIES)) .build()); JSONObject jsonResponse = executeRequest(httpGet); JSONArray jsonValues = jsonResponse.optJSONArray("value"); for (int i = 0; i < jsonValues.length(); i++) { Folder folder = buildFolder(jsonValues.getJSONObject(i)); folder.folderPath = folderName + '/' + EwsExchangeSession.encodeFolderName(folder.displayName); folders.add(folder); } } catch (JSONException | URISyntaxException e) { throw new IOException(e); } return folders; } @Override public void sendMessage(MimeMessage mimeMessage) throws IOException, MessagingException { } @Override protected Folder internalGetFolder(String folderPath) throws IOException { String folderId = getFolderId(folderPath); JSONObject jsonResponse = null; try { URIBuilder uriBuilder = new URIBuilder(baseUrl) .setPath("/beta/me/mailFolders/" + folderId) .addParameter("$expand", buildExpand(FOLDER_PROPERTIES)); HttpGet httpGet = new HttpGet(uriBuilder.build()); httpGet.setHeader("Authorization", "Bearer " + token.getAccessToken()); try ( CloseableHttpResponse response = httpClient.execute(httpGet); ) { jsonResponse = new JsonResponseHandler().handleResponse(response); } } catch (URISyntaxException e) { throw new IOException(e); } GraphExchangeSessionDraft.Folder folder; if (jsonResponse != null) { folder = buildFolder(jsonResponse); folder.folderPath = folderPath; } else { throw new HttpNotFoundException("Folder " + folderPath + " not found"); } return folder; } private String internalGetFolderId(String folderName) throws IOException { String folderId; try { URIBuilder uriBuilder = new URIBuilder(baseUrl) .setPath("/beta/me/mailFolders/" + folderName) .addParameter("$select", "id"); HttpGet httpGet = new HttpGet(uriBuilder.build()); httpGet.setHeader("Authorization", "Bearer " + token.getAccessToken()); try ( CloseableHttpResponse response = httpClient.execute(httpGet); ) { JSONObject jsonResponse = new JsonResponseHandler().handleResponse(response); folderId = jsonResponse.getString("id"); } } catch (URISyntaxException | JSONException e) { throw new IOException(e); } return folderId; } protected String getFolderIdIfExists(String folderPath) throws IOException { // assume start from root folder // TODO: implement access to shared mailbox String parentFolderId = internalGetFolderId("msgfolderroot"); if ("msgfolderroot".equals(folderPath)) { return parentFolderId; } String folderId = null; String[] pathElements = folderPath.split("/"); for (String pathElement : pathElements) { try { String displayName = EwsExchangeSession.decodeFolderName(pathElement); URIBuilder uriBuilder = new URIBuilder(baseUrl) .setPath("/beta/me/mailFolders/" + parentFolderId + "/childFolders") .addParameter("$select", "id, displayName") // TODO escape quotes .addParameter("$filter", "displayName eq '" + displayName + "'"); HttpGet httpGet = new HttpGet(uriBuilder.build()); httpGet.setHeader("Authorization", "Bearer " + token.getAccessToken()); try ( CloseableHttpResponse response = httpClient.execute(httpGet); ) { JSONObject jsonResponse = new JsonResponseHandler().handleResponse(response); JSONArray jsonFolders = jsonResponse.getJSONArray("value"); String currentFolderId = null; for (int i = 0; i < jsonFolders.length(); i++) { JSONObject jsonFolder = jsonFolders.getJSONObject(i); if (displayName.equals(jsonFolder.optString("displayName"))) { // found folder currentFolderId = jsonFolder.getString("id"); } } parentFolderId = currentFolderId; if (currentFolderId == null) { // not found break; } } } catch (URISyntaxException | JSONException e) { throw new IOException(e); } } return parentFolderId; } protected String getFolderId(String folderPath) throws IOException { String folderId = getFolderIdIfExists(folderPath); if (folderId == null) { throw new HttpNotFoundException("Folder '" + folderPath + "' not found"); } return folderId; } private Folder buildFolder(JSONObject jsonResponse) throws IOException { Folder folder = new Folder(); try { folder.displayName = jsonResponse.optString("displayName"); folder.count = jsonResponse.getInt("totalItemCount"); folder.unreadCount = jsonResponse.getInt("unreadItemCount"); folder.hasChildren = jsonResponse.getInt("childFolderCount") > 0; folder.id = jsonResponse.getString("id"); // retrieve property values JSONArray singleValueExtendedProperties = jsonResponse.optJSONArray("singleValueExtendedProperties"); if (singleValueExtendedProperties != null) { for (int i = 0; i < singleValueExtendedProperties.length(); i++) { JSONObject singleValueProperty = singleValueExtendedProperties.getJSONObject(i); String singleValueId = singleValueProperty.getString("id"); String singleValue = singleValueProperty.getString("value"); if (Field.get("lastmodified").getGraphId().equals(singleValueId)) { // TODO parse date ? folder.lastModified = singleValue; } else if (Field.get("folderclass").getGraphId().equals(singleValueId)) { folder.folderClass = singleValue; } else if (Field.get("uidNext").getGraphId().equals(singleValueId)) { folder.uidNext = Long.parseLong(singleValue); } else if (Field.get("ctag").getGraphId().equals(singleValueId)) { folder.ctag = singleValue; } else { LOGGER.warn("Unknown property " + singleValueId); } } } } catch (JSONException e) { throw new IOException(e); } return folder; } /** * @inheritDoc */ @Override public int createFolder(String folderPath, String folderClass, Map properties) throws IOException { // TODO: handle path, decodeFolderName if ("IPF.Appointment".equals(folderClass) && folderPath.startsWith("calendars")) { // create calendar try { HttpPost httpPost = new HttpPost(new URIBuilder(baseUrl).setPath("/beta/me/calendars").build()); httpPost.setHeader("Content-Type", "application/json"); JSONObject jsonObject = new JSONObject(); jsonObject.put("name", folderPath); httpPost.setEntity(new ByteArrayEntity(jsonObject.toString().getBytes(StandardCharsets.UTF_8))); executeRequest(httpPost); } catch (URISyntaxException | JSONException e) { throw new IOException(e); } } else { String parentFolderId; String folderName; if (folderPath.contains("/")) { String parentFolderPath = folderPath.substring(0, folderPath.lastIndexOf('/')); parentFolderId = getFolderId(parentFolderPath); folderName = EwsExchangeSession.decodeFolderName(folderPath.substring(folderPath.lastIndexOf('/') + 1)); } else { parentFolderId = getFolderId("msgfolderroot"); folderName = EwsExchangeSession.decodeFolderName(folderPath); } try { HttpPost httpPost = new HttpPost(new URIBuilder(baseUrl).setPath("/beta/me/mailFolders/" + parentFolderId + "/childFolders").build()); httpPost.setHeader("Content-Type", "application/json"); JSONObject jsonObject = new JSONObject(); jsonObject.put("displayName", folderName); if (folderClass != null) { JSONArray singleValueExtendedProperties = new JSONArray(); singleValueExtendedProperties.put(new JSONObject().put("id", Field.get("folderclass").getGraphId()).put("value", folderClass)); jsonObject.put("singleValueExtendedProperties", singleValueExtendedProperties); } httpPost.setEntity(new ByteArrayEntity(jsonObject.toString().getBytes(StandardCharsets.UTF_8))); executeRequest(httpPost); } catch (URISyntaxException | JSONException e) { throw new IOException(e); } } return HttpStatus.SC_CREATED; } @Override public int updateFolder(String folderName, Map properties) throws IOException { return 0; } @Override public void deleteFolder(String folderPath) throws IOException { String folderId = getFolderId(folderPath); try { HttpDelete httpDelete = new HttpDelete(new URIBuilder(baseUrl).setPath("/beta/me/mailFolders/" + folderId).build()); executeRequest(httpDelete); } catch (URISyntaxException e) { throw new IOException(e); } } @Override public void copyMessage(Message message, String targetFolder) throws IOException { } @Override public void moveMessage(Message message, String targetFolder) throws IOException { } @Override public void moveFolder(String folderName, String targetName) throws IOException { } @Override public void moveItem(String sourcePath, String targetPath) throws IOException { } @Override protected void moveToTrash(Message message) throws IOException { } @Override protected Set getItemProperties() { return null;/*EwsExchangeSession.ITEM_PROPERTIES;*/ } @Override public List searchContacts(String folderPath, Set attributes, Condition condition, int maxCount) throws IOException { return null; } @Override public List getEventMessages(String folderPath) throws IOException { return null; } @Override protected Condition getCalendarItemCondition(Condition dateCondition) { return null; } @Override public List searchEvents(String folderPath, Set attributes, Condition condition) throws IOException { return null; } @Override public Item getItem(String folderPath, String itemName) throws IOException { return null; } @Override public ContactPhoto getContactPhoto(Contact contact) throws IOException { return null; } @Override public void deleteItem(String folderPath, String itemName) throws IOException { } @Override public void processItem(String folderPath, String itemName) throws IOException { } @Override public int sendEvent(String icsBody) throws IOException { return 0; } @Override protected Contact buildContact(String folderPath, String itemName, Map properties, String etag, String noneMatch) throws IOException { return null; } @Override protected ItemResult internalCreateOrUpdateEvent(String folderPath, String itemName, String contentClass, String icsBody, String etag, String noneMatch) throws IOException { return null; } @Override public boolean isSharedFolder(String folderPath) { return false; } @Override public boolean isMainCalendar(String folderPath) throws IOException { return false; } @Override public Map galFind(Condition condition, Set returningAttributes, int sizeLimit) throws IOException { return null; } @Override protected String getFreeBusyData(String attendee, String start, String end, int interval) throws IOException { return null; } @Override protected void loadVtimezone() { try { String timezoneId = null; // Outlook token does not have access to mailboxSettings, use old EWS call JSONObject mailboxSettings = getMailboxSettings(); if (mailboxSettings != null) { timezoneId = mailboxSettings.optString("timeZone", null); } // failover: use timezone id from settings file if (timezoneId == null) { timezoneId = Settings.getProperty("davmail.timezoneId"); } // last failover: use GMT if (timezoneId == null) { LOGGER.warn("Unable to get user timezone, using GMT Standard Time. Set davmail.timezoneId setting to override this."); timezoneId = "GMT Standard Time"; } // delete existing temp folder first to avoid errors deleteFolder("davmailtemp"); createCalendarFolder("davmailtemp", null); /* createCalendarFolder("davmailtemp", null); EWSMethod.Item item = new EWSMethod.Item(); item.type = "CalendarItem"; if (!"Exchange2007_SP1".equals(serverVersion)) { SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH); dateFormatter.setTimeZone(GMT_TIMEZONE); Calendar cal = Calendar.getInstance(); item.put("Start", dateFormatter.format(cal.getTime())); cal.add(Calendar.DAY_OF_MONTH, 1); item.put("End", dateFormatter.format(cal.getTime())); item.put("StartTimeZone", timezoneId); } else { item.put("MeetingTimeZone", timezoneId); } CreateItemMethod createItemMethod = new CreateItemMethod(MessageDisposition.SaveOnly, SendMeetingInvitations.SendToNone, getFolderId("davmailtemp"), item); executeMethod(createItemMethod); item = createItemMethod.getResponseItem(); if (item == null) { throw new IOException("Empty timezone item"); } VCalendar vCalendar = new VCalendar(getContent(new ItemId(item)), email, null); this.vTimezone = vCalendar.getVTimezone(); // delete temporary folder deleteFolder("davmailtemp");*/ } catch (IOException e) { LOGGER.warn("Unable to get VTIMEZONE info: " + e, e); } catch (URISyntaxException e) { LOGGER.warn("Unable to get VTIMEZONE info: " + e, e); } } public JSONObject getMailboxSettings() throws IOException, URISyntaxException { URIBuilder uriBuilder = new URIBuilder(baseUrl) .setPath("/beta/me/mailboxsettings"); return executeRequest(new HttpGet(uriBuilder.build())); } /** * Return supported timezone list * @param timeZoneStandard Windows or Iana * @return timezone list * @throws IOException on error * @throws URISyntaxException on error */ public JSONArray getSupportedTimeZones(String timeZoneStandard) throws IOException, URISyntaxException, JSONException { if (timeZoneStandard == null) { timeZoneStandard = "Windows"; } URIBuilder uriBuilder = new URIBuilder(baseUrl) .setPath("/beta/me/outlook/supportedTimeZones(TimeZoneStandard=microsoft.graph.timeZoneStandard'" + timeZoneStandard + "')"); JSONObject response = executeRequest(new HttpGet(uriBuilder.build())); return response.getJSONArray("value"); } private JSONObject executeRequest(HttpRequestBase request) throws IOException { JSONObject jsonResponse; request.setHeader("Authorization", "Bearer " + token.getAccessToken()); // disable gzip //httpGet.setHeader("Accept-Encoding", ""); try ( CloseableHttpResponse response = httpClient.execute(request); ) { jsonResponse = new JsonResponseHandler().handleResponse(response); } return jsonResponse; } } davmail-6.3.0/src/java/davmail/exchange/graph/GraphRequestBuilder.java0100644 0000000 0000000 00000016153 14754153477 024507 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.graph; import davmail.Settings; import davmail.exchange.ews.ExtendedFieldURI; import davmail.exchange.ews.FieldURI; import davmail.exchange.ews.IndexedFieldURI; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ByteArrayEntity; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import java.io.IOException; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * Build Microsoft graph request */ public class GraphRequestBuilder { String method = "POST"; String baseUrl = Settings.GRAPH_URL; String version = "beta"; String mailbox; String objectType; String childType; String filter; Set expandFields; String accessToken; JSONObject jsonBody = null; private String objectId; /** * Set property in Json body. * @param name property name * @param value property value * @throws JSONException on error */ public GraphRequestBuilder setProperty(String name, String value) throws JSONException { if (jsonBody == null) { jsonBody = new JSONObject(); } jsonBody.put(name, value); return this; } /** * Set epxand fields (returning attributes). * @param expandFields set of fields to return * @return this */ public GraphRequestBuilder setExpandFields(Set expandFields) { this.expandFields = expandFields; return this; } public GraphRequestBuilder setObjectType(String objectType) { this.objectType = objectType; return this; } public GraphRequestBuilder setChildType(String childType) { this.childType = childType; return this; } public GraphRequestBuilder setFilter(String filter) { this.filter = filter; return this; } public GraphRequestBuilder setAccessToken(String accessToken) { this.accessToken = accessToken; return this; } public GraphRequestBuilder setMethod(String method) { this.method = method; return this; } public GraphRequestBuilder setMailbox(String mailbox) { this.mailbox = mailbox; return this; } public GraphRequestBuilder setObjectId(String objectId) { this.objectId = objectId; return this; } /** * Build request path based on version, username, object type and object id. * @return request path */ protected String buildPath() { StringBuilder buffer = new StringBuilder(); buffer.append("/").append(version); if (mailbox != null) { buffer.append("/users/").append(mailbox); } else { buffer.append("/me"); } if (objectType != null) { buffer.append("/").append(objectType); } if (objectId != null) { buffer.append("/").append(objectId); } if (childType != null) { buffer.append("/").append(childType); } return buffer.toString(); } /** * Compute expand parameters from properties. * @return $expand value */ private String buildExpand() { ArrayList singleValueProperties = new ArrayList<>(); ArrayList multiValueProperties = new ArrayList<>(); for (FieldURI fieldURI : expandFields) { if (fieldURI instanceof ExtendedFieldURI) { singleValueProperties.add(fieldURI.getGraphId()); } else if (fieldURI instanceof IndexedFieldURI) { multiValueProperties.add(fieldURI.getGraphId()); } } StringBuilder expand = new StringBuilder(); if (!singleValueProperties.isEmpty()) { expand.append("singleValueExtendedProperties($filter="); appendExpandProperties(expand, singleValueProperties); expand.append(")"); } if (!multiValueProperties.isEmpty()) { if (!singleValueProperties.isEmpty()) { expand.append(","); } expand.append("multiValueExtendedProperties($filter="); appendExpandProperties(expand, multiValueProperties); expand.append(")"); } return expand.toString(); } protected void appendExpandProperties(StringBuilder buffer, List properties) { boolean first = true; for (String id : properties) { if (first) { first = false; } else { buffer.append(" or "); } buffer.append("id eq '").append(id).append("'"); } } /** * Build http request. * @return Http request * @throws IOException on error */ public HttpRequestBase build() throws IOException { try { URIBuilder uriBuilder = new URIBuilder(baseUrl).setPath(buildPath()); if (expandFields != null) { uriBuilder.addParameter("$expand", buildExpand()); } if (filter != null) { uriBuilder.addParameter("$filter", filter); } HttpRequestBase httpRequest; if ("POST".equals(method)) { httpRequest = new HttpPost(uriBuilder.build()); if (jsonBody != null) { ((HttpPost) httpRequest).setEntity(new ByteArrayEntity(jsonBody.toString().getBytes(StandardCharsets.UTF_8))); } } else { // default to GET request httpRequest = new HttpGet(uriBuilder.build()); } httpRequest.setHeader("Content-Type", "application/json"); httpRequest.setHeader("Authorization", "Bearer " + accessToken); return httpRequest; } catch (URISyntaxException e) { throw new IOException(e.getMessage(), e); } } } davmail-6.3.0/src/java/davmail/exchange/graph/JsonResponseHandler.java0100644 0000000 0000000 00000007170 14754153477 024513 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.graph; import davmail.http.HttpClientAdapter; import davmail.util.IOUtil; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ResponseHandler; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; /** * Generic Json response handler for graph API calls */ public class JsonResponseHandler implements ResponseHandler { @Override public JSONObject handleResponse(HttpResponse response) throws IOException { JSONObject jsonResponse = null; Header contentTypeHeader = response.getFirstHeader("Content-Type"); if (contentTypeHeader != null && contentTypeHeader.getValue().startsWith("application/json")) { try { jsonResponse = new JSONObject(new String(readResponse(response), StandardCharsets.UTF_8)); } catch (JSONException e) { throw new IOException(e.getMessage(), e); } } else { HttpEntity httpEntity = response.getEntity(); if (httpEntity != null) { try { return new JSONObject().put("response", new String(readResponse(response), StandardCharsets.UTF_8)); } catch (JSONException e) { throw new IOException("Invalid response content"); } } } // check http error code if (response.getStatusLine().getStatusCode() >= 400) { String errorMessage = null; if (jsonResponse != null && jsonResponse.optJSONObject("error") != null) { try { JSONObject jsonError = jsonResponse.getJSONObject("error"); errorMessage = jsonError.optString("code") + " " + jsonError.optString("message"); } catch (JSONException e) { // ignore } } if (errorMessage == null) { errorMessage = response.getStatusLine().getReasonPhrase(); } throw new IOException(errorMessage); } return jsonResponse; } protected byte[] readResponse(HttpResponse response) throws IOException { byte[] content; try (InputStream inputStream = response.getEntity().getContent()) { if (HttpClientAdapter.isGzipEncoded(response)) { content = IOUtil.readFully(new GZIPInputStream(inputStream)); } else { content = IOUtil.readFully(inputStream); } } return content; } }davmail-6.3.0/src/java/davmail/http/DavGatewayOTPPrompt.java0100644 0000000 0000000 00000003524 12564151516 022466 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.http; import davmail.BundleMessage; import davmail.ui.PasswordPromptDialog; import java.awt.*; /** * Ask user one time password. */ public final class DavGatewayOTPPrompt { private DavGatewayOTPPrompt() { } /** * Ask user token password * * @return user provided one time password */ public static String getOneTimePassword() { PasswordPromptDialog passwordPromptDialog = new PasswordPromptDialog(BundleMessage.format("UI_OTP_PASSWORD_PROMPT")); return String.valueOf(passwordPromptDialog.getPassword()); } /** * Ask user captcha value * * @param captchaImage captcha image * @return user provided one time password */ public static String getCaptchaValue(Image captchaImage) { PasswordPromptDialog passwordPromptDialog = new PasswordPromptDialog(BundleMessage.format("UI_CAPTCHA_PROMPT"), captchaImage); return String.valueOf(passwordPromptDialog.getPassword()); } } davmail-6.3.0/src/java/davmail/http/DavGatewayProxySelector.java0100644 0000000 0000000 00000007255 14503245214 023443 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import davmail.Settings; import org.apache.log4j.Logger; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Custom proxy selector based on DavMail settings. * Interactive O365 authentication relies on native HttpUrlConnection so we need to override default proxy selector. */ public class DavGatewayProxySelector extends ProxySelector { static final Logger LOGGER = Logger.getLogger(DavGatewayProxySelector.class); static final List DIRECT = Collections.singletonList(Proxy.NO_PROXY); ProxySelector proxySelector; public DavGatewayProxySelector(ProxySelector proxySelector) { this.proxySelector = proxySelector; } @Override public List select(URI uri) { boolean useSystemProxies = Settings.getBooleanProperty("davmail.useSystemProxies", Boolean.FALSE); boolean enableProxy = Settings.getBooleanProperty("davmail.enableProxy"); String proxyHost = Settings.getProperty("davmail.proxyHost"); int proxyPort = Settings.getIntProperty("davmail.proxyPort"); String scheme = uri.getScheme(); if ("socket".equals(scheme)) { return DIRECT; } else if (useSystemProxies) { List proxyes = proxySelector.select(uri); LOGGER.debug("Selected " + proxyes + " proxy for " + uri); return proxyes; } else if (enableProxy && proxyHost != null && proxyHost.length() > 0 && proxyPort > 0 && !isNoProxyFor(uri) && ("http".equals(scheme) || "https".equals(scheme))) { // DavMail defined proxies ArrayList proxies = new ArrayList<>(); proxies.add(new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved(proxyHost, proxyPort))); return proxies; } else { return DIRECT; } } private boolean isNoProxyFor(URI uri) { final String noProxyFor = Settings.getProperty("davmail.noProxyFor"); if (noProxyFor != null) { final String urihost = uri.getHost().toLowerCase(); final String[] domains = noProxyFor.toLowerCase().split(",\\s*"); for (String domain : domains) { if (urihost.endsWith(domain)) { return true; //break; } } } return false; } @Override public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { LOGGER.debug("Connection to " + uri + " failed, socket address " + sa + " " + ioe); proxySelector.connectFailed(uri, sa, ioe); } } davmail-6.3.0/src/java/davmail/http/DavGatewaySSLSocketFactory.java0100644 0000000 0000000 00000025266 14545543571 024002 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import davmail.Settings; import davmail.ui.PasswordPromptDialog; import org.apache.log4j.Logger; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.KeyStoreBuilderParameters; import javax.net.ssl.ManagerFactoryParameters; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509KeyManager; import javax.security.auth.callback.PasswordCallback; import java.awt.*; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket; import java.security.InvalidAlgorithmParameterException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; /** * SSLSocketFactory implementation. * Wrapper for DavGatewaySSLProtocolSocketFactory used by HttpClient 4 */ public class DavGatewaySSLSocketFactory extends SSLSocketFactory { static final Logger LOGGER = Logger.getLogger(DavGatewaySSLSocketFactory.class); private SSLContext sslcontext; private SSLContext getSSLContext() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, InvalidAlgorithmParameterException { if (this.sslcontext == null) { this.sslcontext = createSSLContext(); } return this.sslcontext; } private SSLContext createSSLContext() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyManagementException, KeyStoreException { // PKCS11 client certificate settings String pkcs11Library = Settings.getProperty("davmail.ssl.pkcs11Library"); String clientKeystoreType = Settings.getProperty("davmail.ssl.clientKeystoreType"); // set default keystore type if (clientKeystoreType == null || clientKeystoreType.isEmpty()) { clientKeystoreType = "PKCS11"; } if (pkcs11Library != null && !pkcs11Library.isEmpty() && "PKCS11".equals(clientKeystoreType)) { StringBuilder pkcs11Buffer = new StringBuilder(); pkcs11Buffer.append("name=DavMail\n"); pkcs11Buffer.append("library=").append(pkcs11Library).append('\n'); String pkcs11Config = Settings.getProperty("davmail.ssl.pkcs11Config"); if (pkcs11Config != null && !pkcs11Config.isEmpty()) { pkcs11Buffer.append(pkcs11Config).append('\n'); } SunPKCS11ProviderHandler.registerProvider(pkcs11Buffer.toString()); } String algorithm = KeyManagerFactory.getDefaultAlgorithm(); if ("SunX509".equals(algorithm)) { algorithm = "NewSunX509"; } else if ("IbmX509".equals(algorithm)) { algorithm = "NewIbmX509"; } KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm); ArrayList keyStoreBuilders = new ArrayList<>(); // PKCS11 (smartcard) keystore with password callback KeyStore.Builder scBuilder = KeyStore.Builder.newInstance("PKCS11", null, getProtectionParameter(null)); keyStoreBuilders.add(scBuilder); String clientKeystoreFile = Settings.getProperty("davmail.ssl.clientKeystoreFile"); String clientKeystorePass = Settings.getProperty("davmail.ssl.clientKeystorePass"); if (clientKeystoreFile != null && !clientKeystoreFile.isEmpty() && ("PKCS12".equals(clientKeystoreType) || "JKS".equals(clientKeystoreType))) { // PKCS12 file based keystore KeyStore.Builder fsBuilder = KeyStore.Builder.newInstance(clientKeystoreType, null, new File(clientKeystoreFile), getProtectionParameter(clientKeystorePass)); keyStoreBuilders.add(fsBuilder); } // Enable native Windows SmartCard access through MSCAPI (no PKCS11 config required) if ("MSCAPI".equals(clientKeystoreType)) { try { //Provider provider = (Provider) Class.forName("sun.security.mscapi.SunMSCAPI").getDeclaredConstructor().newInstance(); //KeyStore keyStore = KeyStore.getInstance("Windows-MY", provider); KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null); keyStoreBuilders.add(KeyStore.Builder.newInstance(keyStore, new KeyStore.PasswordProtection(null))); } catch (Exception e) { // ignore } } ManagerFactoryParameters keyStoreBuilderParameters = new KeyStoreBuilderParameters(keyStoreBuilders); keyManagerFactory.init(keyStoreBuilderParameters); // Get a list of key managers KeyManager[] keyManagers = keyManagerFactory.getKeyManagers(); // Walk through the key managers and replace all X509 Key Managers with // a specialized wrapped DavMail X509 Key Manager for (int i = 0; i < keyManagers.length; i++) { KeyManager keyManager = keyManagers[i]; if (keyManager instanceof X509KeyManager) { keyManagers[i] = new DavMailX509KeyManager((X509KeyManager) keyManager); } } SSLContext context = SSLContext.getInstance("TLS"); context.init(keyManagers, new TrustManager[]{new DavGatewayX509TrustManager()}, null); return context; } private KeyStore.ProtectionParameter getProtectionParameter(String password) { if (password != null && !password.isEmpty()) { // password provided: create a PasswordProtection return new KeyStore.PasswordProtection(password.toCharArray()); } else { // request password at runtime through a callback return new KeyStore.CallbackHandlerProtection(callbacks -> { if (callbacks.length > 0 && callbacks[0] instanceof PasswordCallback) { if (Settings.getBooleanProperty("davmail.server") || GraphicsEnvironment.isHeadless()) { // headless or server mode System.out.print(((PasswordCallback) callbacks[0]).getPrompt() + ": "); String password1 = new BufferedReader(new InputStreamReader(System.in)).readLine(); ((PasswordCallback) callbacks[0]).setPassword(password1.toCharArray()); } else { PasswordPromptDialog passwordPromptDialog = new PasswordPromptDialog(((PasswordCallback) callbacks[0]).getPrompt()); ((PasswordCallback) callbacks[0]).setPassword(passwordPromptDialog.getPassword()); } } }); } } @Override public String[] getDefaultCipherSuites() { try { return getSSLContext().getSocketFactory().getDefaultCipherSuites(); } catch (Exception e) { // ignore } return new String[]{}; } @Override public String[] getSupportedCipherSuites() { try { return getSSLContext().getSocketFactory().getSupportedCipherSuites(); } catch (Exception e) { // ignore } return new String[]{}; } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException { LOGGER.debug("createSocket " + host + " " + port); try { return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose); } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | InvalidAlgorithmParameterException e) { throw new IOException(e + " " + e.getMessage()); } } @Override public Socket createSocket(String host, int port) throws IOException { LOGGER.debug("createSocket " + host + " " + port); try { return getSSLContext().getSocketFactory().createSocket(host, port); } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | InvalidAlgorithmParameterException e) { throw new IOException(e + " " + e.getMessage()); } } @Override public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException { LOGGER.debug("createSocket " + host + " " + port + " " + clientHost + " " + clientPort); try { return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort); } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | InvalidAlgorithmParameterException e) { throw new IOException(e + " " + e.getMessage()); } } @Override public Socket createSocket(InetAddress host, int port) throws IOException { LOGGER.debug("createSocket " + host + " " + port); try { return getSSLContext().getSocketFactory().createSocket(host, port); } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | InvalidAlgorithmParameterException e) { throw new IOException(e + " " + e.getMessage()); } } @Override public Socket createSocket(InetAddress host, int port, InetAddress clientHost, int clientPort) throws IOException { LOGGER.debug("createSocket " + host + " " + port + " " + clientHost + " " + clientPort); try { return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort); } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException | InvalidAlgorithmParameterException e) { throw new IOException(e + " " + e.getMessage()); } } } davmail-6.3.0/src/java/davmail/http/DavGatewayX509TrustManager.java0100644 0000000 0000000 00000021424 14575630005 023622 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.http; import davmail.BundleMessage; import davmail.Settings; import davmail.ui.AcceptCertificateDialog; import davmail.ui.tray.DavGatewayTray; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.security.*; import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; /** * Custom Trust Manager, let user accept or deny. */ public class DavGatewayX509TrustManager implements X509TrustManager { private final X509TrustManager standardTrustManager; /** * Create a new custom X509 trust manager. * * @throws NoSuchAlgorithmException on error * @throws KeyStoreException on error */ public DavGatewayX509TrustManager() throws NoSuchAlgorithmException, KeyStoreException { TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); factory.init((KeyStore) null); TrustManager[] trustManagers = factory.getTrustManagers(); if (trustManagers.length == 0) { throw new NoSuchAlgorithmException("No trust manager found"); } this.standardTrustManager = (X509TrustManager) trustManagers[0]; } public void checkServerTrusted(X509Certificate[] x509Certificates, String authType) throws CertificateException { try { // first try standard Trust Manager this.standardTrustManager.checkServerTrusted(x509Certificates, authType); } catch (CertificateException e) { if ((x509Certificates != null) && (x509Certificates.length > 0)) { userCheckServerTrusted(x509Certificates); } else { throw e; } } } public void checkClientTrusted(X509Certificate[] x509Certificates, String authType) throws CertificateException { this.standardTrustManager.checkClientTrusted(x509Certificates, authType); } public X509Certificate[] getAcceptedIssuers() { return this.standardTrustManager.getAcceptedIssuers(); } protected void userCheckServerTrusted(final X509Certificate[] x509Certificates) throws CertificateException { String acceptedCertificateHash = Settings.getProperty("davmail.server.certificate.hash"); String certificateHash = getFormattedHash(x509Certificates[0]); // if user already accepted a certificate, if (acceptedCertificateHash != null && !acceptedCertificateHash.isEmpty() && acceptedCertificateHash.equalsIgnoreCase(certificateHash)) { DavGatewayTray.debug(new BundleMessage("LOG_FOUND_ACCEPTED_CERTIFICATE", acceptedCertificateHash)); } else { boolean isCertificateTrusted; if (Settings.getBooleanProperty("davmail.server") || GraphicsEnvironment.isHeadless()) { // headless or server mode isCertificateTrusted = isCertificateTrusted(x509Certificates[0]); } else { isCertificateTrusted = AcceptCertificateDialog.isCertificateTrusted(x509Certificates[0]); } if (!isCertificateTrusted) { throw new CertificateException("User rejected certificate"); } // certificate accepted, store in settings Settings.saveProperty("davmail.server.certificate.hash", certificateHash); } } @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) protected boolean isCertificateTrusted(X509Certificate certificate) { BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in)); String answer = null; String yes = BundleMessage.format("UI_ANSWER_YES"); String no = BundleMessage.format("UI_ANSWER_NO"); StringBuilder buffer = new StringBuilder(); buffer.append(BundleMessage.format("UI_SERVER_CERTIFICATE")).append(":\n"); buffer.append(BundleMessage.format("UI_ISSUED_TO")).append(": ") .append(DavGatewayX509TrustManager.getRDN(certificate.getSubjectX500Principal())).append('\n'); buffer.append(BundleMessage.format("UI_ISSUED_BY")).append(": ") .append(getRDN(certificate.getIssuerX500Principal())).append('\n'); SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); String notBefore = formatter.format(certificate.getNotBefore()); buffer.append(BundleMessage.format("UI_VALID_FROM")).append(": ").append(notBefore).append('\n'); String notAfter = formatter.format(certificate.getNotAfter()); buffer.append(BundleMessage.format("UI_VALID_UNTIL")).append(": ").append(notAfter).append('\n'); buffer.append(BundleMessage.format("UI_SERIAL")).append(": ").append(getFormattedSerial(certificate)).append('\n'); String sha1Hash = DavGatewayX509TrustManager.getFormattedHash(certificate); buffer.append(BundleMessage.format("UI_FINGERPRINT")).append(": ").append(sha1Hash).append('\n'); buffer.append('\n'); buffer.append(BundleMessage.format("UI_UNTRUSTED_CERTIFICATE")).append('\n'); try { while (!yes.equals(answer) && !no.equals(answer)) { System.out.println(buffer); answer = inReader.readLine(); if (answer == null) { answer = no; } answer = answer.toLowerCase(); } } catch (IOException e) { System.err.println(e+" "+e.getMessage()); } return yes.equals(answer); } /** * Get rdn value from principal dn. * * @param principal security principal * @return rdn */ public static String getRDN(Principal principal) { String dn = principal.getName(); int start = dn.indexOf('='); int end = dn.indexOf(','); if (start >= 0 && end >= 0) { return dn.substring(start + 1, end); } else { return dn; } } /** * Build a formatted certificate serial string. * * @param certificate X509 certificate * @return formatted serial */ public static String getFormattedSerial(X509Certificate certificate) { StringBuilder builder = new StringBuilder(); String serial = certificate.getSerialNumber().toString(16); for (int i = 0; i < serial.length(); i++) { if (i > 0 && i % 2 == 0) { builder.append(' '); } builder.append(serial.charAt(i)); } return builder.toString().toUpperCase(); } /** * Build a formatted hash string. * * @param certificate X509 certificate * @return formatted hash */ public static String getFormattedHash(X509Certificate certificate) { String sha1Hash; try { MessageDigest md = MessageDigest.getInstance("SHA1"); byte[] digest = md.digest(certificate.getEncoded()); sha1Hash = formatHash(digest); } catch (NoSuchAlgorithmException | CertificateEncodingException nsa) { sha1Hash = nsa.getMessage(); } return sha1Hash; } /** * Format byte buffer to a hexadecimal hash string. * * @param buffer byte array * @return hexadecimal hash string */ protected static String formatHash(byte[] buffer) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < buffer.length; i++) { if (i > 0) { builder.append(':'); } builder.append(String.format("%02x", buffer[i] & 0xFF)); } return builder.toString().toUpperCase(); } } davmail-6.3.0/src/java/davmail/http/DavMailIdleConnectionEvictor.java0100644 0000000 0000000 00000010110 14503245213 024312 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.log4j.Logger; import java.util.HashSet; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; /** * Single thread for all connection managers. * close idle connections */ public class DavMailIdleConnectionEvictor { static final Logger LOGGER = Logger.getLogger(DavMailIdleConnectionEvictor.class); // connection manager set private static final HashSet connectionManagers = new HashSet<>(); private static final long sleepTimeMs = 1000L * 60; private static final long maxIdleTimeMs = 1000L * 60 * 5; private static ScheduledExecutorService scheduler = null; private static void initEvictorThread() { synchronized (connectionManagers) { if (scheduler == null) { scheduler = Executors.newScheduledThreadPool(1, new ThreadFactory() { int count = 0; @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r, "PoolEvictor-" + count++); thread.setDaemon(true); thread.setUncaughtExceptionHandler((t, e) -> LOGGER.error(e.getMessage(), e)); return thread; } }); scheduler.scheduleAtFixedRate(() -> { synchronized (connectionManagers) { // iterate over connection managers for (HttpClientConnectionManager connectionManager : connectionManagers) { connectionManager.closeExpiredConnections(); if (maxIdleTimeMs > 0) { connectionManager.closeIdleConnections(maxIdleTimeMs, TimeUnit.MILLISECONDS); } } } }, sleepTimeMs, sleepTimeMs, TimeUnit.MILLISECONDS); } } } public static void shutdown() throws InterruptedException { synchronized (connectionManagers) { scheduler.shutdown(); if (!scheduler.awaitTermination(sleepTimeMs, TimeUnit.MILLISECONDS)) { LOGGER.warn("Timed out waiting for tasks to complete"); } scheduler = null; } } /** * Add connection manager to evictor thread. * * @param connectionManager connection manager */ public static void addConnectionManager(HttpClientConnectionManager connectionManager) { synchronized (connectionManagers) { initEvictorThread(); connectionManagers.add(connectionManager); } } /** * Remove connection manager from evictor thread. * * @param connectionManager connection manager */ public static void removeConnectionManager(HttpClientConnectionManager connectionManager) { synchronized (connectionManagers) { connectionManagers.remove(connectionManager); } } } davmail-6.3.0/src/java/davmail/http/DavMailNTLMEngineImpl.java0100644 0000000 0000000 00000230634 14754153500 022627 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import org.apache.commons.codec.binary.Base64; import org.apache.http.Consts; import org.apache.http.impl.auth.NTLMEngine; import org.apache.http.impl.auth.NTLMEngineException; import org.apache.log4j.Logger; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.Key; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; import java.util.Arrays; import java.util.Locale; /** * Provides an implementation for NTLMv1, NTLMv2, and NTLM2 Session forms of the NTLM * authentication protocol. * Duplicate code from NTLMEngineImpl to implement channel binding */ final class DavMailNTLMEngineImpl implements NTLMEngine { static final Logger LOGGER = Logger.getLogger("davmail.http.DavMailNTLMEngineImpl"); /** Unicode encoding */ private static final Charset UNICODE_LITTLE_UNMARKED = StandardCharsets.UTF_16LE; /** Character encoding */ private static final Charset DEFAULT_CHARSET = Consts.ASCII; // Flags we use; descriptions according to: // http://davenport.sourceforge.net/ntlm.html // and // http://msdn.microsoft.com/en-us/library/cc236650%28v=prot.20%29.aspx // [MS-NLMP] section 2.2.2.5 static final int FLAG_REQUEST_UNICODE_ENCODING = 0x00000001; // Unicode string encoding requested static final int FLAG_REQUEST_OEM_ENCODING = 0x00000002; // OEM string encoding requested static final int FLAG_REQUEST_TARGET = 0x00000004; // Requests target field static final int FLAG_REQUEST_SIGN = 0x00000010; // Requests all messages have a signature attached, in NEGOTIATE message. static final int FLAG_REQUEST_SEAL = 0x00000020; // Request key exchange for message confidentiality in NEGOTIATE message. MUST be used in conjunction with 56BIT. static final int FLAG_REQUEST_LAN_MANAGER_KEY = 0x00000080; // Request Lan Manager key instead of user session key static final int FLAG_REQUEST_NTLMv1 = 0x00000200; // Request NTLMv1 security. MUST be set in NEGOTIATE and CHALLENGE both static final int FLAG_DOMAIN_PRESENT = 0x00001000; // Domain is present in message static final int FLAG_WORKSTATION_PRESENT = 0x00002000; // Workstation is present in message static final int FLAG_REQUEST_ALWAYS_SIGN = 0x00008000; // Requests a signature block on all messages. Overridden by REQUEST_SIGN and REQUEST_SEAL. static final int FLAG_REQUEST_NTLM2_SESSION = 0x00080000; // From server in challenge, requesting NTLM2 session security static final int FLAG_REQUEST_VERSION = 0x02000000; // Request protocol version static final int FLAG_TARGETINFO_PRESENT = 0x00800000; // From server in challenge message, indicating targetinfo is present static final int FLAG_REQUEST_128BIT_KEY_EXCH = 0x20000000; // Request explicit 128-bit key exchange static final int FLAG_REQUEST_EXPLICIT_KEY_EXCH = 0x40000000; // Request explicit key exchange static final int FLAG_REQUEST_56BIT_ENCRYPTION = 0x80000000; // Must be used in conjunction with SEAL // Attribute-value identifiers (AvId) // according to [MS-NLMP] section 2.2.2.1 static final int MSV_AV_EOL = 0x0000; // Indicates that this is the last AV_PAIR in the list. static final int MSV_AV_NB_COMPUTER_NAME = 0x0001; // The server's NetBIOS computer name. static final int MSV_AV_NB_DOMAIN_NAME = 0x0002; // The server's NetBIOS domain name. static final int MSV_AV_DNS_COMPUTER_NAME = 0x0003; // The fully qualified domain name (FQDN) of the computer. static final int MSV_AV_DNS_DOMAIN_NAME = 0x0004; // The FQDN of the domain. static final int MSV_AV_DNS_TREE_NAME = 0x0005; // The FQDN of the forest. static final int MSV_AV_FLAGS = 0x0006; // A 32-bit value indicating server or client configuration. static final int MSV_AV_TIMESTAMP = 0x0007; // server local time static final int MSV_AV_SINGLE_HOST = 0x0008; // A Single_Host_Data structure. static final int MSV_AV_TARGET_NAME = 0x0009; // The SPN of the target server. static final int MSV_AV_CHANNEL_BINDINGS = 0x000A; // A channel bindings hash. static final int MSV_AV_FLAGS_ACCOUNT_AUTH_CONSTAINED = 0x00000001; // Indicates to the client that the account authentication is constrained. static final int MSV_AV_FLAGS_MIC = 0x00000002; // Indicates that the client is providing message integrity in the MIC field in the AUTHENTICATE_MESSAGE. static final int MSV_AV_FLAGS_UNTRUSTED_TARGET_SPN = 0x00000004; // Indicates that the client is providing a target SPN generated from an untrusted source. private static final SecureRandom RNG; static { try { RNG = java.security.SecureRandom.getInstance("SHA1PRNG"); } catch (final NoSuchAlgorithmException e) { throw new RuntimeException(e.getMessage(), e); } } /** The signature string as bytes in the default encoding */ private static final byte[] SIGNATURE = getNullTerminatedAsciiString("NTLMSSP"); // prefix for GSS API channel binding private static final byte[] MAGIC_TLS_SERVER_ENDPOINT = "tls-server-end-point:".getBytes(Consts.ASCII); private static byte[] getNullTerminatedAsciiString(final String source) { final byte[] bytesWithoutNull = source.getBytes(Consts.ASCII); final byte[] target = new byte[bytesWithoutNull.length + 1]; System.arraycopy(bytesWithoutNull, 0, target, 0, bytesWithoutNull.length); target[bytesWithoutNull.length] = (byte) 0x00; return target; } private static final String TYPE_1_MESSAGE = new DavMailNTLMEngineImpl.Type1Message().getResponse(); Certificate peerServerCertificate = null; DavMailNTLMEngineImpl() { } /** * Store connection certificate for channel binding implementation. * @param peerServerCertificate certificate */ public void setPeerServerCertificate(Certificate peerServerCertificate) { this.peerServerCertificate = peerServerCertificate; } /** * Creates the first message (type 1 message) in the NTLM authentication * sequence. This message includes the user name, domain and host for the * authentication session. * * @param host * the computer name of the host requesting authentication. * @param domain * The domain to authenticate with. * @return String the message to add to the HTTP request header. */ static String getType1Message(final String host, final String domain) { // For compatibility reason do not include domain and host in type 1 message //return new Type1Message(domain, host).getResponse(); return TYPE_1_MESSAGE; } /** * Creates the type 3 message using the given server nonce. The type 3 * message includes all the information for authentication, host, domain, * username and the result of encrypting the nonce sent by the server using * the user's password as the key. * * @param user * The user name. This should not include the domain name. * @param password * The password. * @param host * The host that is originating the authentication request. * @param domain * The domain to authenticate within. * @param nonce * the 8 byte array the server sent. * @return The type 3 message. * @throws NTLMEngineException * If {link #Type3Message(String, String, String, String, byte[], int, String, byte[])} fails. */ static String getType3Message(final String user, final String password, final String host, final String domain, final byte[] nonce, final int type2Flags, final String target, final byte[] targetInformation) throws NTLMEngineException { return new DavMailNTLMEngineImpl.Type3Message(domain, host, user, password, nonce, type2Flags, target, targetInformation).getResponse(); } /** * Creates the type 3 message using the given server nonce. The type 3 * message includes all the information for authentication, host, domain, * username and the result of encrypting the nonce sent by the server using * the user's password as the key. * * @param user * The user name. This should not include the domain name. * @param password * The password. * @param host * The host that is originating the authentication request. * @param domain * The domain to authenticate within. * @param nonce * the 8 byte array the server sent. * @return The type 3 message. * @throws NTLMEngineException * If {link #Type3Message(String, String, String, String, byte[], int, String, byte[], Certificate, byte[], byte[])} fails. */ static String getType3Message(final String user, final String password, final String host, final String domain, final byte[] nonce, final int type2Flags, final String target, final byte[] targetInformation, final Certificate peerServerCertificate, final byte[] type1Message, final byte[] type2Message) throws NTLMEngineException { return new Type3Message(domain, host, user, password, nonce, type2Flags, target, targetInformation, peerServerCertificate, type1Message, type2Message).getResponse(); } private static int readULong(final byte[] src, final int index) { if (src.length < index + 4) { return 0; } return (src[index] & 0xff) | ((src[index + 1] & 0xff) << 8) | ((src[index + 2] & 0xff) << 16) | ((src[index + 3] & 0xff) << 24); } private static int readUShort(final byte[] src, final int index) { if (src.length < index + 2) { return 0; } return (src[index] & 0xff) | ((src[index + 1] & 0xff) << 8); } private static byte[] readSecurityBuffer(final byte[] src, final int index) { final int length = readUShort(src, index); final int offset = readULong(src, index + 4); if (src.length < offset + length) { return new byte[length]; } final byte[] buffer = new byte[length]; System.arraycopy(src, offset, buffer, 0, length); return buffer; } /** Calculate a challenge block */ private static byte[] makeRandomChallenge() { final byte[] rval = new byte[8]; RNG.nextBytes(rval); return rval; } /** Calculate a 16-byte secondary key */ private static byte[] makeSecondaryKey() { final byte[] rval = new byte[16]; RNG.nextBytes(rval); return rval; } protected static class CipherGen { protected final long currentTime; protected final String domain; protected final String user; protected final String password; protected final byte[] challenge; protected final String target; protected final byte[] targetInformation; // Information we can generate but may be passed in (for testing) protected byte[] clientChallenge; protected byte[] clientChallenge2; protected byte[] secondaryKey; protected byte[] timestamp; // Stuff we always generate protected byte[] lmHash = null; protected byte[] lmResponse = null; protected byte[] ntlmHash = null; protected byte[] ntlmResponse = null; protected byte[] ntlmv2Hash = null; protected byte[] lmv2Hash = null; protected byte[] lmv2Response = null; protected byte[] ntlmv2Blob = null; protected byte[] ntlmv2Response = null; protected byte[] ntlm2SessionResponse = null; protected byte[] lm2SessionResponse = null; protected byte[] lmUserSessionKey = null; protected byte[] ntlmUserSessionKey = null; protected byte[] ntlmv2UserSessionKey = null; protected byte[] ntlm2SessionResponseUserSessionKey = null; protected byte[] lanManagerSessionKey = null; public CipherGen(final long currentTime, final String domain, final String user, final String password, final byte[] challenge, final String target, final byte[] targetInformation, final byte[] clientChallenge, final byte[] clientChallenge2, final byte[] secondaryKey, final byte[] timestamp) { this.currentTime = currentTime; this.domain = domain; this.target = target; this.user = user; this.password = password; this.challenge = challenge; this.targetInformation = targetInformation; this.clientChallenge = clientChallenge; this.clientChallenge2 = clientChallenge2; this.secondaryKey = secondaryKey; this.timestamp = timestamp; } public CipherGen(final long currentTime, final String domain, final String user, final String password, final byte[] challenge, final String target, final byte[] targetInformation) { this(currentTime, domain, user, password, challenge, target, targetInformation, null, null, null, null); } /** Calculate and return client challenge */ public byte[] getClientChallenge() { if (clientChallenge == null) { clientChallenge = makeRandomChallenge(); } return clientChallenge; } /** Calculate and return second client challenge */ public byte[] getClientChallenge2() { if (clientChallenge2 == null) { clientChallenge2 = makeRandomChallenge(); } return clientChallenge2; } /** Calculate and return random secondary key */ public byte[] getSecondaryKey() { if (secondaryKey == null) { secondaryKey = makeSecondaryKey(); } return secondaryKey; } /** Calculate and return the LMHash */ public byte[] getLMHash() throws NTLMEngineException { if (lmHash == null) { lmHash = lmHash(password); } return lmHash; } /** Calculate and return the LMResponse */ public byte[] getLMResponse() throws NTLMEngineException { if (lmResponse == null) { lmResponse = lmResponse(getLMHash(), challenge); } return lmResponse; } /** Calculate and return the NTLMHash */ public byte[] getNTLMHash() { if (ntlmHash == null) { ntlmHash = ntlmHash(password); } return ntlmHash; } /** Calculate and return the NTLMResponse */ public byte[] getNTLMResponse() throws NTLMEngineException { if (ntlmResponse == null) { ntlmResponse = lmResponse(getNTLMHash(), challenge); } return ntlmResponse; } /** Calculate the LMv2 hash */ public byte[] getLMv2Hash() throws NTLMEngineException { if (lmv2Hash == null) { lmv2Hash = lmv2Hash(domain, user, getNTLMHash()); } return lmv2Hash; } /** Calculate the NTLMv2 hash */ public byte[] getNTLMv2Hash() throws NTLMEngineException { if (ntlmv2Hash == null) { ntlmv2Hash = ntlmv2Hash(domain, user, getNTLMHash()); } return ntlmv2Hash; } /** Calculate a timestamp */ public byte[] getTimestamp() { if (timestamp == null) { long time = this.currentTime; time += 11644473600000L; // milliseconds from January 1, 1601 -> epoch. time *= 10000; // tenths of a microsecond. // convert to little-endian byte array. timestamp = new byte[8]; for (int i = 0; i < 8; i++) { timestamp[i] = (byte) time; time >>>= 8; } } return timestamp; } /** Calculate the NTLMv2Blob */ public byte[] getNTLMv2Blob() { if (ntlmv2Blob == null) { ntlmv2Blob = createBlob(getClientChallenge2(), targetInformation, getTimestamp()); } return ntlmv2Blob; } /** Calculate the NTLMv2Response */ public byte[] getNTLMv2Response() throws NTLMEngineException { if (ntlmv2Response == null) { ntlmv2Response = lmv2Response(getNTLMv2Hash(), challenge, getNTLMv2Blob()); } return ntlmv2Response; } /** Calculate the LMv2Response */ public byte[] getLMv2Response() throws NTLMEngineException { if (lmv2Response == null) { lmv2Response = lmv2Response(getLMv2Hash(), challenge, getClientChallenge()); } return lmv2Response; } /** Get NTLM2SessionResponse */ public byte[] getNTLM2SessionResponse() throws NTLMEngineException { if (ntlm2SessionResponse == null) { ntlm2SessionResponse = ntlm2SessionResponse(getNTLMHash(), challenge, getClientChallenge()); } return ntlm2SessionResponse; } /** Calculate and return LM2 session response */ public byte[] getLM2SessionResponse() { if (lm2SessionResponse == null) { final byte[] clntChallenge = getClientChallenge(); lm2SessionResponse = new byte[24]; System.arraycopy(clntChallenge, 0, lm2SessionResponse, 0, clntChallenge.length); Arrays.fill(lm2SessionResponse, clntChallenge.length, lm2SessionResponse.length, (byte) 0x00); } return lm2SessionResponse; } /** Get LMUserSessionKey */ public byte[] getLMUserSessionKey() throws NTLMEngineException { if (lmUserSessionKey == null) { lmUserSessionKey = new byte[16]; System.arraycopy(getLMHash(), 0, lmUserSessionKey, 0, 8); Arrays.fill(lmUserSessionKey, 8, 16, (byte) 0x00); } return lmUserSessionKey; } /** Get NTLMUserSessionKey */ public byte[] getNTLMUserSessionKey() throws NTLMEngineException { if (ntlmUserSessionKey == null) { final DavMailNTLMEngineImpl.MD4 md4 = new DavMailNTLMEngineImpl.MD4(); md4.update(getNTLMHash()); ntlmUserSessionKey = md4.getOutput(); } return ntlmUserSessionKey; } /** GetNTLMv2UserSessionKey */ public byte[] getNTLMv2UserSessionKey() throws NTLMEngineException { if (ntlmv2UserSessionKey == null) { final byte[] ntlmv2hash = getNTLMv2Hash(); final byte[] truncatedResponse = new byte[16]; System.arraycopy(getNTLMv2Response(), 0, truncatedResponse, 0, 16); ntlmv2UserSessionKey = hmacMD5(truncatedResponse, ntlmv2hash); } return ntlmv2UserSessionKey; } /** Get NTLM2SessionResponseUserSessionKey */ public byte[] getNTLM2SessionResponseUserSessionKey() throws NTLMEngineException { if (ntlm2SessionResponseUserSessionKey == null) { final byte[] ntlm2SessionResponseNonce = getLM2SessionResponse(); final byte[] sessionNonce = new byte[challenge.length + ntlm2SessionResponseNonce.length]; System.arraycopy(challenge, 0, sessionNonce, 0, challenge.length); System.arraycopy(ntlm2SessionResponseNonce, 0, sessionNonce, challenge.length, ntlm2SessionResponseNonce.length); ntlm2SessionResponseUserSessionKey = hmacMD5(sessionNonce, getNTLMUserSessionKey()); } return ntlm2SessionResponseUserSessionKey; } /** Get LAN Manager session key */ public byte[] getLanManagerSessionKey() throws NTLMEngineException { if (lanManagerSessionKey == null) { try { final byte[] keyBytes = new byte[14]; System.arraycopy(getLMHash(), 0, keyBytes, 0, 8); Arrays.fill(keyBytes, 8, keyBytes.length, (byte) 0xbd); final Key lowKey = createDESKey(keyBytes, 0); final Key highKey = createDESKey(keyBytes, 7); final byte[] truncatedResponse = new byte[8]; System.arraycopy(getLMResponse(), 0, truncatedResponse, 0, truncatedResponse.length); Cipher des = Cipher.getInstance("DES/ECB/NoPadding"); des.init(Cipher.ENCRYPT_MODE, lowKey); final byte[] lowPart = des.doFinal(truncatedResponse); des = Cipher.getInstance("DES/ECB/NoPadding"); des.init(Cipher.ENCRYPT_MODE, highKey); final byte[] highPart = des.doFinal(truncatedResponse); lanManagerSessionKey = new byte[16]; System.arraycopy(lowPart, 0, lanManagerSessionKey, 0, lowPart.length); System.arraycopy(highPart, 0, lanManagerSessionKey, lowPart.length, highPart.length); } catch (final Exception e) { throw new NTLMEngineException(e.getMessage(), e); } } return lanManagerSessionKey; } } /** Calculates HMAC-MD5 */ static byte[] hmacMD5(final byte[] value, final byte[] key) { final DavMailNTLMEngineImpl.HMACMD5 hmacMD5 = new DavMailNTLMEngineImpl.HMACMD5(key); hmacMD5.update(value); return hmacMD5.getOutput(); } /** Calculates RC4 */ static byte[] RC4(final byte[] value, final byte[] key) throws NTLMEngineException { try { final Cipher rc4 = Cipher.getInstance("RC4"); rc4.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "RC4")); return rc4.doFinal(value); } catch (final Exception e) { throw new NTLMEngineException(e.getMessage(), e); } } /** * Calculates the NTLM2 Session Response for the given challenge, using the * specified password and client challenge. * * @return The NTLM2 Session Response. This is placed in the NTLM response * field of the Type 3 message; the LM response field contains the * client challenge, null-padded to 24 bytes. */ static byte[] ntlm2SessionResponse(final byte[] ntlmHash, final byte[] challenge, final byte[] clientChallenge) throws NTLMEngineException { try { final MessageDigest md5 = getMD5(); md5.update(challenge); md5.update(clientChallenge); final byte[] digest = md5.digest(); final byte[] sessionHash = new byte[8]; System.arraycopy(digest, 0, sessionHash, 0, 8); return lmResponse(ntlmHash, sessionHash); } catch (final NTLMEngineException e) { throw e; } catch (final Exception e) { throw new NTLMEngineException(e.getMessage(), e); } } /** * Creates the LM Hash of the user's password. * * @param password * The password. * * @return The LM Hash of the given password, used in the calculation of the * LM Response. */ private static byte[] lmHash(final String password) throws NTLMEngineException { try { final byte[] oemPassword = password.toUpperCase(Locale.ROOT).getBytes(Consts.ASCII); final int length = Math.min(oemPassword.length, 14); final byte[] keyBytes = new byte[14]; System.arraycopy(oemPassword, 0, keyBytes, 0, length); final Key lowKey = createDESKey(keyBytes, 0); final Key highKey = createDESKey(keyBytes, 7); final byte[] magicConstant = "KGS!@#$%".getBytes(Consts.ASCII); final Cipher des = Cipher.getInstance("DES/ECB/NoPadding"); des.init(Cipher.ENCRYPT_MODE, lowKey); final byte[] lowHash = des.doFinal(magicConstant); des.init(Cipher.ENCRYPT_MODE, highKey); final byte[] highHash = des.doFinal(magicConstant); final byte[] lmHash = new byte[16]; System.arraycopy(lowHash, 0, lmHash, 0, 8); System.arraycopy(highHash, 0, lmHash, 8, 8); return lmHash; } catch (final Exception e) { throw new NTLMEngineException(e.getMessage(), e); } } /** * Creates the NTLM Hash of the user's password. * * @param password * The password. * * @return The NTLM Hash of the given password, used in the calculation of * the NTLM Response and the NTLMv2 and LMv2 Hashes. */ private static byte[] ntlmHash(final String password) { final byte[] unicodePassword = password.getBytes(UNICODE_LITTLE_UNMARKED); final DavMailNTLMEngineImpl.MD4 md4 = new DavMailNTLMEngineImpl.MD4(); md4.update(unicodePassword); return md4.getOutput(); } /** * Creates the LMv2 Hash of the user's password. * * @return The LMv2 Hash, used in the calculation of the NTLMv2 and LMv2 * Responses. */ private static byte[] lmv2Hash(final String domain, final String user, final byte[] ntlmHash) throws NTLMEngineException { final DavMailNTLMEngineImpl.HMACMD5 hmacMD5 = new DavMailNTLMEngineImpl.HMACMD5(ntlmHash); // Upper case username, upper case domain! hmacMD5.update(user.toUpperCase(Locale.ROOT).getBytes(UNICODE_LITTLE_UNMARKED)); if (domain != null) { hmacMD5.update(domain.toUpperCase(Locale.ROOT).getBytes(UNICODE_LITTLE_UNMARKED)); } return hmacMD5.getOutput(); } /** * Creates the NTLMv2 Hash of the user's password. * * @return The NTLMv2 Hash, used in the calculation of the NTLMv2 and LMv2 * Responses. */ private static byte[] ntlmv2Hash(final String domain, final String user, final byte[] ntlmHash) { final DavMailNTLMEngineImpl.HMACMD5 hmacMD5 = new DavMailNTLMEngineImpl.HMACMD5(ntlmHash); // Upper case username, mixed case target!! hmacMD5.update(user.toUpperCase(Locale.ROOT).getBytes(UNICODE_LITTLE_UNMARKED)); if (domain != null) { hmacMD5.update(domain.getBytes(UNICODE_LITTLE_UNMARKED)); } return hmacMD5.getOutput(); } /** * Creates the LM Response from the given hash and Type 2 challenge. * * @param hash * The LM or NTLM Hash. * @param challenge * The server challenge from the Type 2 message. * * @return The response (either LM or NTLM, depending on the provided hash). */ private static byte[] lmResponse(final byte[] hash, final byte[] challenge) throws NTLMEngineException { try { final byte[] keyBytes = new byte[21]; System.arraycopy(hash, 0, keyBytes, 0, 16); final Key lowKey = createDESKey(keyBytes, 0); final Key middleKey = createDESKey(keyBytes, 7); final Key highKey = createDESKey(keyBytes, 14); final Cipher des = Cipher.getInstance("DES/ECB/NoPadding"); des.init(Cipher.ENCRYPT_MODE, lowKey); final byte[] lowResponse = des.doFinal(challenge); des.init(Cipher.ENCRYPT_MODE, middleKey); final byte[] middleResponse = des.doFinal(challenge); des.init(Cipher.ENCRYPT_MODE, highKey); final byte[] highResponse = des.doFinal(challenge); final byte[] lmResponse = new byte[24]; System.arraycopy(lowResponse, 0, lmResponse, 0, 8); System.arraycopy(middleResponse, 0, lmResponse, 8, 8); System.arraycopy(highResponse, 0, lmResponse, 16, 8); return lmResponse; } catch (final Exception e) { throw new NTLMEngineException(e.getMessage(), e); } } /** * Creates the LMv2 Response from the given hash, client data, and Type 2 * challenge. * * @param hash * The NTLMv2 Hash. * @param clientData * The client data (blob or client challenge). * @param challenge * The server challenge from the Type 2 message. * * @return The response (either NTLMv2 or LMv2, depending on the client * data). */ private static byte[] lmv2Response(final byte[] hash, final byte[] challenge, final byte[] clientData) { final DavMailNTLMEngineImpl.HMACMD5 hmacMD5 = new DavMailNTLMEngineImpl.HMACMD5(hash); hmacMD5.update(challenge); hmacMD5.update(clientData); final byte[] mac = hmacMD5.getOutput(); final byte[] lmv2Response = new byte[mac.length + clientData.length]; System.arraycopy(mac, 0, lmv2Response, 0, mac.length); System.arraycopy(clientData, 0, lmv2Response, mac.length, clientData.length); return lmv2Response; } private static byte[] encodeLong(final int value) { final byte[] enc = new byte[4]; encodeLong(enc, 0, value); return enc; } private static void encodeLong(final byte[] buf, final int offset, final int value) { buf[offset ] = (byte) (value & 0xff); buf[offset + 1] = (byte) (value >> 8 & 0xff); buf[offset + 2] = (byte) (value >> 16 & 0xff); buf[offset + 3] = (byte) (value >> 24 & 0xff); } /** * Creates the NTLMv2 blob from the given target information block and * client challenge. * * @param targetInformation * The target information block from the Type 2 message. * @param clientChallenge * The random 8-byte client challenge. * * @return The blob, used in the calculation of the NTLMv2 Response. */ private static byte[] createBlob(final byte[] clientChallenge, final byte[] targetInformation, final byte[] timestamp) { final byte[] blobSignature = new byte[]{(byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00}; final byte[] reserved = new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}; final byte[] unknown1 = new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}; final byte[] unknown2 = new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00}; final byte[] blob = new byte[blobSignature.length + reserved.length + timestamp.length + 8 + unknown1.length + targetInformation.length + unknown2.length]; int offset = 0; System.arraycopy(blobSignature, 0, blob, offset, blobSignature.length); offset += blobSignature.length; System.arraycopy(reserved, 0, blob, offset, reserved.length); offset += reserved.length; System.arraycopy(timestamp, 0, blob, offset, timestamp.length); offset += timestamp.length; System.arraycopy(clientChallenge, 0, blob, offset, 8); offset += 8; System.arraycopy(unknown1, 0, blob, offset, unknown1.length); offset += unknown1.length; System.arraycopy(targetInformation, 0, blob, offset, targetInformation.length); offset += targetInformation.length; System.arraycopy(unknown2, 0, blob, offset, unknown2.length); offset += unknown2.length; return blob; } /** * Creates a DES encryption key from the given key material. * * @param bytes * A byte array containing the DES key material. * @param offset * The offset in the given byte array at which the 7-byte key * material starts. * * @return A DES encryption key created from the key material starting at * the specified offset in the given byte array. */ private static Key createDESKey(final byte[] bytes, final int offset) { final byte[] keyBytes = new byte[7]; System.arraycopy(bytes, offset, keyBytes, 0, 7); final byte[] material = new byte[8]; material[0] = keyBytes[0]; material[1] = (byte) (keyBytes[0] << 7 | (keyBytes[1] & 0xff) >>> 1); material[2] = (byte) (keyBytes[1] << 6 | (keyBytes[2] & 0xff) >>> 2); material[3] = (byte) (keyBytes[2] << 5 | (keyBytes[3] & 0xff) >>> 3); material[4] = (byte) (keyBytes[3] << 4 | (keyBytes[4] & 0xff) >>> 4); material[5] = (byte) (keyBytes[4] << 3 | (keyBytes[5] & 0xff) >>> 5); material[6] = (byte) (keyBytes[5] << 2 | (keyBytes[6] & 0xff) >>> 6); material[7] = (byte) (keyBytes[6] << 1); oddParity(material); return new SecretKeySpec(material, "DES"); } /** * Applies odd parity to the given byte array. * * @param bytes * The data whose parity bits are to be adjusted for odd parity. */ private static void oddParity(final byte[] bytes) { for (int i = 0; i < bytes.length; i++) { final byte b = bytes[i]; final boolean needsParity = (((b >>> 7) ^ (b >>> 6) ^ (b >>> 5) ^ (b >>> 4) ^ (b >>> 3) ^ (b >>> 2) ^ (b >>> 1)) & 0x01) == 0; if (needsParity) { bytes[i] |= (byte) 0x01; } else { bytes[i] &= (byte) 0xfe; } } } /** * Find the character set based on the flags. * @param flags is the flags. * @return the character set. */ private static Charset getCharset(final int flags) { if ((flags & FLAG_REQUEST_UNICODE_ENCODING) == 0) { return DEFAULT_CHARSET; } return UNICODE_LITTLE_UNMARKED; } /** Strip dot suffix from a name */ private static String stripDotSuffix(final String value) { if (value == null) { return null; } final int index = value.indexOf('.'); if (index != -1) { return value.substring(0, index); } return value; } /** Convert host to standard form */ private static String convertHost(final String host) { return stripDotSuffix(host); } /** Convert domain to standard form */ private static String convertDomain(final String domain) { return stripDotSuffix(domain); } /** NTLM message generation, base class */ static class NTLMMessage { /** The current response */ protected byte[] messageContents = null; /** The current output position */ protected int currentOutputPosition = 0; /** Constructor to use when message contents are not yet known */ NTLMMessage() { } /** Constructor taking a string */ NTLMMessage(final String messageBody, final int expectedType) throws NTLMEngineException { this(Base64.decodeBase64(messageBody.getBytes(DEFAULT_CHARSET)), expectedType); } /** Constructor to use when message bytes are known */ NTLMMessage(final byte[] message, final int expectedType) throws NTLMEngineException { messageContents = message; // Look for NTLM message if (messageContents.length < SIGNATURE.length) { throw new NTLMEngineException("NTLM message decoding error - packet too short"); } int i = 0; while (i < SIGNATURE.length) { if (messageContents[i] != SIGNATURE[i]) { throw new NTLMEngineException( "NTLM message expected - instead got unrecognized bytes"); } i++; } // Check to be sure there's a type 2 message indicator next final int type = readULong(SIGNATURE.length); if (type != expectedType) { throw new NTLMEngineException("NTLM type " + expectedType + " message expected - instead got type " + type); } currentOutputPosition = messageContents.length; } /** * Get the length of the signature and flags, so calculations can adjust * offsets accordingly. */ protected int getPreambleLength() { return SIGNATURE.length + 4; } /** Get the message length */ protected int getMessageLength() { return currentOutputPosition; } /** Read a byte from a position within the message buffer */ protected byte readByte(final int position) throws NTLMEngineException { if (messageContents.length < position + 1) { throw new NTLMEngineException("NTLM: Message too short"); } return messageContents[position]; } /** Read a bunch of bytes from a position in the message buffer */ protected void readBytes(final byte[] buffer, final int position) throws NTLMEngineException { if (messageContents.length < position + buffer.length) { throw new NTLMEngineException("NTLM: Message too short"); } System.arraycopy(messageContents, position, buffer, 0, buffer.length); } /** Read a ushort from a position within the message buffer */ protected int readUShort(final int position) { return DavMailNTLMEngineImpl.readUShort(messageContents, position); } /** Read a ulong from a position within the message buffer */ protected int readULong(final int position) { return DavMailNTLMEngineImpl.readULong(messageContents, position); } /** Read a security buffer from a position within the message buffer */ protected byte[] readSecurityBuffer(final int position) { return DavMailNTLMEngineImpl.readSecurityBuffer(messageContents, position); } /** * Prepares the object to create a response of the given length. * * @param maxlength * the maximum length of the response to prepare, * including the type and the signature (which this method * adds). */ protected void prepareResponse(final int maxlength, final int messageType) { messageContents = new byte[maxlength]; currentOutputPosition = 0; addBytes(SIGNATURE); addULong(messageType); } /** * Adds the given byte to the response. * * @param b * the byte to add. */ protected void addByte(final byte b) { messageContents[currentOutputPosition] = b; currentOutputPosition++; } /** * Adds the given bytes to the response. * * @param bytes * the bytes to add. */ protected void addBytes(final byte[] bytes) { if (bytes == null) { return; } for (final byte b : bytes) { messageContents[currentOutputPosition] = b; currentOutputPosition++; } } /** Adds a USHORT to the response */ protected void addUShort(final int value) { addByte((byte) (value & 0xff)); addByte((byte) (value >> 8 & 0xff)); } /** Adds a ULong to the response */ protected void addULong(final int value) { addByte((byte) (value & 0xff)); addByte((byte) (value >> 8 & 0xff)); addByte((byte) (value >> 16 & 0xff)); addByte((byte) (value >> 24 & 0xff)); } /** * Returns the response that has been generated after shrinking the * array if required and base64 encodes the response. * * @return The response as above. */ public String getResponse() { return new String(Base64.encodeBase64(getBytes()), Consts.ASCII); } public byte[] getBytes() { if (messageContents == null) { buildMessage(); } if (messageContents.length > currentOutputPosition) { final byte[] tmp = new byte[currentOutputPosition]; System.arraycopy(messageContents, 0, tmp, 0, currentOutputPosition); messageContents = tmp; } return messageContents; } protected void buildMessage() { throw new RuntimeException("Message builder not implemented for " + getClass().getName()); } } /** Type 1 message assembly class */ static class Type1Message extends DavMailNTLMEngineImpl.NTLMMessage { private final byte[] hostBytes; private final byte[] domainBytes; private final int flags; Type1Message(final String domain, final String host) { this(domain, host, null); } Type1Message(final String domain, final String host, final Integer flags) { super(); this.flags = ((flags == null) ? getDefaultFlags() : flags); // Strip off domain name from the host! final String unqualifiedHost = convertHost(host); // Use only the base domain name! final String unqualifiedDomain = convertDomain(domain); hostBytes = unqualifiedHost != null ? unqualifiedHost.getBytes(UNICODE_LITTLE_UNMARKED) : null; domainBytes = unqualifiedDomain != null ? unqualifiedDomain.toUpperCase(Locale.ROOT).getBytes(UNICODE_LITTLE_UNMARKED) : null; } Type1Message() { super(); hostBytes = null; domainBytes = null; flags = getDefaultFlags(); } private int getDefaultFlags() { return //FLAG_WORKSTATION_PRESENT | //FLAG_DOMAIN_PRESENT | // Required flags //FLAG_REQUEST_LAN_MANAGER_KEY | FLAG_REQUEST_NTLMv1 | FLAG_REQUEST_NTLM2_SESSION | // Protocol version request FLAG_REQUEST_VERSION | // Recommended privacy settings FLAG_REQUEST_ALWAYS_SIGN | //FLAG_REQUEST_SEAL | FLAG_REQUEST_SIGN | // for channel binding // These must be set according to documentation, based on use of SEAL above FLAG_REQUEST_128BIT_KEY_EXCH | FLAG_REQUEST_56BIT_ENCRYPTION | //FLAG_REQUEST_EXPLICIT_KEY_EXCH | FLAG_REQUEST_UNICODE_ENCODING; } /** * Getting the response involves building the message before returning * it */ @Override protected void buildMessage() { int domainBytesLength = 0; if (domainBytes != null) { domainBytesLength = domainBytes.length; } int hostBytesLength = 0; if (hostBytes != null) { hostBytesLength = hostBytes.length; } // Now, build the message. Calculate its length first, including // signature or type. final int finalLength = 32 + 8 + hostBytesLength + domainBytesLength; // Set up the response. This will initialize the signature, message // type, and flags. prepareResponse(finalLength, 1); // Flags. These are the complete set of flags we support. addULong(flags); // Domain length (two times). addUShort(domainBytesLength); addUShort(domainBytesLength); // Domain offset. addULong(hostBytesLength + 32 + 8); // Host length (two times). addUShort(hostBytesLength); addUShort(hostBytesLength); // Host offset (always 32 + 8). addULong(32 + 8); // Version addUShort(0x0105); // Build addULong(2600); // NTLM revision addUShort(0x0f00); // Host (workstation) String. if (hostBytes != null) { addBytes(hostBytes); } // Domain String. if (domainBytes != null) { addBytes(domainBytes); } } } /** Type 2 message class */ static class Type2Message extends NTLMMessage { protected final byte[] challenge; protected String target; protected byte[] targetInfo; protected final int flags; Type2Message(final String messageBody) throws NTLMEngineException { this(Base64.decodeBase64(messageBody.getBytes(DEFAULT_CHARSET))); } Type2Message(final byte[] message) throws NTLMEngineException { super(message, 2); // Type 2 message is laid out as follows: // First 8 bytes: NTLMSSP[0] // Next 4 bytes: Ulong, value 2 // Next 8 bytes, starting at offset 12: target field (2 ushort lengths, 1 ulong offset) // Next 4 bytes, starting at offset 20: Flags, e.g. 0x22890235 // Next 8 bytes, starting at offset 24: Challenge // Next 8 bytes, starting at offset 32: ??? (8 bytes of zeros) // Next 8 bytes, starting at offset 40: targetinfo field (2 ushort lengths, 1 ulong offset) // Next 2 bytes, major/minor version number (e.g. 0x05 0x02) // Next 8 bytes, build number // Next 2 bytes, protocol version number (e.g. 0x00 0x0f) // Next, various text fields, and a ushort of value 0 at the end // Parse out the rest of the info we need from the message // The nonce is the 8 bytes starting from the byte in position 24. challenge = new byte[8]; readBytes(challenge, 24); flags = super.readULong(20); // Do the target! target = null; // The TARGET_DESIRED flag is said to not have understood semantics // in Type2 messages, so use the length of the packet to decide // how to proceed instead if (getMessageLength() >= 12 + 8) { final byte[] bytes = super.readSecurityBuffer(12); if (bytes.length != 0) { target = new String(bytes, getCharset(flags)); } } // Do the target info! targetInfo = null; // TARGET_DESIRED flag cannot be relied on, so use packet length if (getMessageLength() >= 40 + 8) { final byte[] bytes = super.readSecurityBuffer(40); if (bytes.length != 0) { targetInfo = bytes; } } } /** Retrieve the challenge */ byte[] getChallenge() { return challenge; } /** Retrieve the target */ String getTarget() { return target; } /** Retrieve the target info */ byte[] getTargetInfo() { return targetInfo; } /** Retrieve the response flags */ int getFlags() { return flags; } } /** Type 3 message assembly class */ static class Type3Message extends DavMailNTLMEngineImpl.NTLMMessage { // For mic computation protected final byte[] type1Message; protected final byte[] type2Message; // Response flags from the type2 message protected final int type2Flags; protected final byte[] domainBytes; protected final byte[] hostBytes; protected final byte[] userBytes; protected byte[] lmResp; protected byte[] ntResp; protected final byte[] sessionKey; protected final byte[] exportedSessionKey; protected final boolean computeMic; /** More primitive constructor: don't include cert or previous messages. */ Type3Message(final String domain, final String host, final String user, final String password, final byte[] nonce, final int type2Flags, final String target, final byte[] targetInformation) throws NTLMEngineException { this(domain, host, user, password, nonce, type2Flags, target, targetInformation, null, null, null); } /** More primitive constructor: don't include cert or previous messages. */ Type3Message(final long currentTime, final String domain, final String host, final String user, final String password, final byte[] nonce, final int type2Flags, final String target, final byte[] targetInformation) throws NTLMEngineException { this(currentTime, domain, host, user, password, nonce, type2Flags, target, targetInformation, null, null, null); } /** Constructor. Pass the arguments we will need */ Type3Message(final String domain, final String host, final String user, final String password, final byte[] nonce, final int type2Flags, final String target, final byte[] targetInformation, final Certificate peerServerCertificate, final byte[] type1Message, final byte[] type2Message) throws NTLMEngineException { this(System.currentTimeMillis(), domain, host, user, password, nonce, type2Flags, target, targetInformation, peerServerCertificate, type1Message, type2Message); } /** Constructor. Pass the arguments we will need */ Type3Message(final long currentTime, final String domain, final String host, final String user, final String password, final byte[] nonce, final int type2Flags, final String target, final byte[] targetInformation, final Certificate peerServerCertificate, final byte[] type1Message, final byte[] type2Message) throws NTLMEngineException { // Save the flags this.type2Flags = type2Flags; this.type1Message = type1Message; this.type2Message = type2Message; // Strip off domain name from the host! final String unqualifiedHost = convertHost(host); // Use only the base domain name! final String unqualifiedDomain = convertDomain(domain); byte[] responseTargetInformation = targetInformation; if (peerServerCertificate != null) { responseTargetInformation = addGssMicAvsToTargetInfo(targetInformation, peerServerCertificate); computeMic = true; } else { computeMic = false; } // Create a cipher generator class. Use domain BEFORE it gets modified! final DavMailNTLMEngineImpl.CipherGen gen = new DavMailNTLMEngineImpl.CipherGen(currentTime, unqualifiedDomain, user, password, nonce, target, responseTargetInformation); // Use the new code to calculate the responses, including v2 if that // seems warranted. byte[] userSessionKey; try { // This conditional may not work on Windows Server 2008 R2 and above, where it has not yet // been tested if (((type2Flags & FLAG_TARGETINFO_PRESENT) != 0) && targetInformation != null && target != null) { // NTLMv2 ntResp = gen.getNTLMv2Response(); lmResp = gen.getLMv2Response(); if ((type2Flags & FLAG_REQUEST_LAN_MANAGER_KEY) != 0) { userSessionKey = gen.getLanManagerSessionKey(); } else { userSessionKey = gen.getNTLMv2UserSessionKey(); } } else { // NTLMv1 if ((type2Flags & FLAG_REQUEST_NTLM2_SESSION) != 0) { // NTLM2 session stuff is requested ntResp = gen.getNTLM2SessionResponse(); lmResp = gen.getLM2SessionResponse(); if ((type2Flags & FLAG_REQUEST_LAN_MANAGER_KEY) != 0) { userSessionKey = gen.getLanManagerSessionKey(); } else { userSessionKey = gen.getNTLM2SessionResponseUserSessionKey(); } } else { ntResp = gen.getNTLMResponse(); lmResp = gen.getLMResponse(); if ((type2Flags & FLAG_REQUEST_LAN_MANAGER_KEY) != 0) { userSessionKey = gen.getLanManagerSessionKey(); } else { userSessionKey = gen.getNTLMUserSessionKey(); } } } } catch (final NTLMEngineException e) { // This likely means we couldn't find the MD4 hash algorithm - // fail back to just using LM ntResp = new byte[0]; lmResp = gen.getLMResponse(); if ((type2Flags & FLAG_REQUEST_LAN_MANAGER_KEY) != 0) { userSessionKey = gen.getLanManagerSessionKey(); } else { userSessionKey = gen.getLMUserSessionKey(); } } if ((type2Flags & FLAG_REQUEST_SIGN) != 0) { if ((type2Flags & FLAG_REQUEST_EXPLICIT_KEY_EXCH) != 0) { exportedSessionKey = gen.getSecondaryKey(); sessionKey = RC4(exportedSessionKey, userSessionKey); } else { sessionKey = userSessionKey; exportedSessionKey = sessionKey; } } else { if (computeMic) { throw new NTLMEngineException("Cannot sign/seal: no exported session key"); } sessionKey = null; exportedSessionKey = null; } final Charset charset = getCharset(type2Flags); hostBytes = unqualifiedHost != null ? unqualifiedHost.getBytes(charset) : null; domainBytes = unqualifiedDomain != null ? unqualifiedDomain .toUpperCase(Locale.ROOT).getBytes(charset) : null; userBytes = user.getBytes(charset); } public byte[] getEncryptedRandomSessionKey() { return sessionKey; } public byte[] getExportedSessionKey() { return exportedSessionKey; } /** Assemble the response */ @Override protected void buildMessage() { final int ntRespLen = ntResp.length; final int lmRespLen = lmResp.length; final int domainLen = domainBytes != null ? domainBytes.length : 0; final int hostLen = hostBytes != null ? hostBytes.length : 0; final int userLen = userBytes.length; final int sessionKeyLen; if (sessionKey != null) { sessionKeyLen = sessionKey.length; } else { sessionKeyLen = 0; } // Calculate the layout within the packet final int lmRespOffset = 72 + // allocate space for the version (computeMic ? 16 : 0); // and MIC final int ntRespOffset = lmRespOffset + lmRespLen; final int domainOffset = ntRespOffset + ntRespLen; final int userOffset = domainOffset + domainLen; final int hostOffset = userOffset + userLen; final int sessionKeyOffset = hostOffset + hostLen; final int finalLength = sessionKeyOffset + sessionKeyLen; // Start the response. Length includes signature and type prepareResponse(finalLength, 3); // LM Resp Length (twice) addUShort(lmRespLen); addUShort(lmRespLen); // LM Resp Offset addULong(lmRespOffset); // NT Resp Length (twice) addUShort(ntRespLen); addUShort(ntRespLen); // NT Resp Offset addULong(ntRespOffset); // Domain length (twice) addUShort(domainLen); addUShort(domainLen); // Domain offset. addULong(domainOffset); // User Length (twice) addUShort(userLen); addUShort(userLen); // User offset addULong(userOffset); // Host length (twice) addUShort(hostLen); addUShort(hostLen); // Host offset addULong(hostOffset); // Session key length (twice) addUShort(sessionKeyLen); addUShort(sessionKeyLen); // Session key offset addULong(sessionKeyOffset); // Flags. addULong( /* //FLAG_WORKSTATION_PRESENT | //FLAG_DOMAIN_PRESENT | // Required flags (type2Flags & FLAG_REQUEST_LAN_MANAGER_KEY) | (type2Flags & FLAG_REQUEST_NTLMv1) | (type2Flags & FLAG_REQUEST_NTLM2_SESSION) | // Protocol version request FLAG_REQUEST_VERSION | // Recommended privacy settings (type2Flags & FLAG_REQUEST_ALWAYS_SIGN) | (type2Flags & FLAG_REQUEST_SEAL) | (type2Flags & FLAG_REQUEST_SIGN) | // These must be set according to documentation, based on use of SEAL above (type2Flags & FLAG_REQUEST_128BIT_KEY_EXCH) | (type2Flags & FLAG_REQUEST_56BIT_ENCRYPTION) | (type2Flags & FLAG_REQUEST_EXPLICIT_KEY_EXCH) | (type2Flags & FLAG_TARGETINFO_PRESENT) | (type2Flags & FLAG_REQUEST_UNICODE_ENCODING) | (type2Flags & FLAG_REQUEST_TARGET) */ type2Flags ); // Version addUShort(0x0105); // Build addULong(2600); // NTLM revision addUShort(0x0f00); int micPosition = -1; if (computeMic) { micPosition = currentOutputPosition; currentOutputPosition += 16; } // Add the actual data addBytes(lmResp); addBytes(ntResp); addBytes(domainBytes); addBytes(userBytes); addBytes(hostBytes); if (sessionKey != null) { addBytes(sessionKey); } // Write the mic back into its slot in the message if (computeMic) { // Computation of message integrity code (MIC) as specified in [MS-NLMP] section 3.2.5.1.2. final DavMailNTLMEngineImpl.HMACMD5 hmacMD5 = new HMACMD5(exportedSessionKey); hmacMD5.update(type1Message); hmacMD5.update(type2Message); hmacMD5.update(messageContents); final byte[] mic = hmacMD5.getOutput(); System.arraycopy(mic, 0, messageContents, micPosition, mic.length); } } /** * Add GSS channel binding hash and MIC flag to the targetInfo. * Looks like this is needed if we want to use exported session key for GSS wrapping. */ private byte[] addGssMicAvsToTargetInfo(final byte[] originalTargetInfo, final Certificate peerServerCertificate) throws NTLMEngineException { final byte[] newTargetInfo = new byte[originalTargetInfo.length + 8 + 20]; final int appendLength = originalTargetInfo.length - 4; // last tag is MSV_AV_EOL, do not copy that System.arraycopy(originalTargetInfo, 0, newTargetInfo, 0, appendLength); writeUShort(newTargetInfo, MSV_AV_FLAGS, appendLength); writeUShort(newTargetInfo, 4, appendLength + 2); writeULong(newTargetInfo, MSV_AV_FLAGS_MIC, appendLength + 4); writeUShort(newTargetInfo, MSV_AV_CHANNEL_BINDINGS, appendLength + 8); writeUShort(newTargetInfo, 16, appendLength + 10); final byte[] channelBindingsHash; try { final byte[] certBytes = peerServerCertificate.getEncoded(); final MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); final byte[] certHashBytes = sha256.digest(certBytes); final byte[] channelBindingStruct = new byte[16 + 4 + MAGIC_TLS_SERVER_ENDPOINT.length + certHashBytes.length]; writeULong(channelBindingStruct, 0x00000035, 16); System.arraycopy(MAGIC_TLS_SERVER_ENDPOINT, 0, channelBindingStruct, 20, MAGIC_TLS_SERVER_ENDPOINT.length); System.arraycopy(certHashBytes, 0, channelBindingStruct, 20 + MAGIC_TLS_SERVER_ENDPOINT.length, certHashBytes.length); final MessageDigest md5 = getMD5(); channelBindingsHash = md5.digest(channelBindingStruct); } catch (CertificateEncodingException | NoSuchAlgorithmException e) { throw new NTLMEngineException(e.getMessage(), e); } System.arraycopy(channelBindingsHash, 0, newTargetInfo, appendLength + 12, 16); return newTargetInfo; } } static void writeUShort(final byte[] buffer, final int value, final int offset) { buffer[offset] = (byte) (value & 0xff); buffer[offset + 1] = (byte) (value >> 8 & 0xff); } static void writeULong(final byte[] buffer, final int value, final int offset) { buffer[offset] = (byte) (value & 0xff); buffer[offset + 1] = (byte) (value >> 8 & 0xff); buffer[offset + 2] = (byte) (value >> 16 & 0xff); buffer[offset + 3] = (byte) (value >> 24 & 0xff); } static int F(final int x, final int y, final int z) { return ((x & y) | (~x & z)); } static int G(final int x, final int y, final int z) { return ((x & y) | (x & z) | (y & z)); } static int H(final int x, final int y, final int z) { return (x ^ y ^ z); } static int rotintlft(final int val, final int numbits) { return ((val << numbits) | (val >>> (32 - numbits))); } static MessageDigest getMD5() { try { return MessageDigest.getInstance("MD5"); } catch (final NoSuchAlgorithmException ex) { throw new RuntimeException("MD5 message digest doesn't seem to exist - fatal error: " + ex.getMessage(), ex); } } /** * Cryptography support - MD4. The following class was based loosely on the * RFC and on code found at http://www.cs.umd.edu/~harry/jotp/src/md.java. * Code correctness was verified by looking at MD4.java from the jcifs * library (http://jcifs.samba.org). It was massaged extensively to the * final form found here by Karl Wright (kwright@metacarta.com). */ static class MD4 { protected int A = 0x67452301; protected int B = 0xefcdab89; protected int C = 0x98badcfe; protected int D = 0x10325476; protected long count = 0L; protected final byte[] dataBuffer = new byte[64]; MD4() { } void update(final byte[] input) { // We always deal with 512 bits at a time. Correspondingly, there is // a buffer 64 bytes long that we write data into until it gets // full. int curBufferPos = (int) (count & 63L); int inputIndex = 0; while (input.length - inputIndex + curBufferPos >= dataBuffer.length) { // We have enough data to do the next step. Do a partial copy // and a transform, updating inputIndex and curBufferPos // accordingly final int transferAmt = dataBuffer.length - curBufferPos; System.arraycopy(input, inputIndex, dataBuffer, curBufferPos, transferAmt); count += transferAmt; curBufferPos = 0; inputIndex += transferAmt; processBuffer(); } // If there's anything left, copy it into the buffer and leave it. // We know there's not enough left to process. if (inputIndex < input.length) { final int transferAmt = input.length - inputIndex; System.arraycopy(input, inputIndex, dataBuffer, curBufferPos, transferAmt); count += transferAmt; } } byte[] getOutput() { // Feed pad/length data into engine. This must round out the input // to a multiple of 512 bits. final int bufferIndex = (int) (count & 63L); final int padLen = (bufferIndex < 56) ? (56 - bufferIndex) : (120 - bufferIndex); final byte[] postBytes = new byte[padLen + 8]; // Leading 0x80, specified amount of zero padding, then length in // bits. postBytes[0] = (byte) 0x80; // Fill out the last 8 bytes with the length for (int i = 0; i < 8; i++) { postBytes[padLen + i] = (byte) ((count * 8) >>> (8 * i)); } // Update the engine update(postBytes); // Calculate final result final byte[] result = new byte[16]; writeULong(result, A, 0); writeULong(result, B, 4); writeULong(result, C, 8); writeULong(result, D, 12); return result; } protected void processBuffer() { // Convert current buffer to 16 ulongs final int[] d = new int[16]; for (int i = 0; i < 16; i++) { d[i] = (dataBuffer[i * 4] & 0xff) + ((dataBuffer[i * 4 + 1] & 0xff) << 8) + ((dataBuffer[i * 4 + 2] & 0xff) << 16) + ((dataBuffer[i * 4 + 3] & 0xff) << 24); } // Do a round of processing final int AA = A; final int BB = B; final int CC = C; final int DD = D; round1(d); round2(d); round3(d); A += AA; B += BB; C += CC; D += DD; } protected void round1(final int[] d) { A = rotintlft((A + F(B, C, D) + d[0]), 3); D = rotintlft((D + F(A, B, C) + d[1]), 7); C = rotintlft((C + F(D, A, B) + d[2]), 11); B = rotintlft((B + F(C, D, A) + d[3]), 19); A = rotintlft((A + F(B, C, D) + d[4]), 3); D = rotintlft((D + F(A, B, C) + d[5]), 7); C = rotintlft((C + F(D, A, B) + d[6]), 11); B = rotintlft((B + F(C, D, A) + d[7]), 19); A = rotintlft((A + F(B, C, D) + d[8]), 3); D = rotintlft((D + F(A, B, C) + d[9]), 7); C = rotintlft((C + F(D, A, B) + d[10]), 11); B = rotintlft((B + F(C, D, A) + d[11]), 19); A = rotintlft((A + F(B, C, D) + d[12]), 3); D = rotintlft((D + F(A, B, C) + d[13]), 7); C = rotintlft((C + F(D, A, B) + d[14]), 11); B = rotintlft((B + F(C, D, A) + d[15]), 19); } protected void round2(final int[] d) { A = rotintlft((A + G(B, C, D) + d[0] + 0x5a827999), 3); D = rotintlft((D + G(A, B, C) + d[4] + 0x5a827999), 5); C = rotintlft((C + G(D, A, B) + d[8] + 0x5a827999), 9); B = rotintlft((B + G(C, D, A) + d[12] + 0x5a827999), 13); A = rotintlft((A + G(B, C, D) + d[1] + 0x5a827999), 3); D = rotintlft((D + G(A, B, C) + d[5] + 0x5a827999), 5); C = rotintlft((C + G(D, A, B) + d[9] + 0x5a827999), 9); B = rotintlft((B + G(C, D, A) + d[13] + 0x5a827999), 13); A = rotintlft((A + G(B, C, D) + d[2] + 0x5a827999), 3); D = rotintlft((D + G(A, B, C) + d[6] + 0x5a827999), 5); C = rotintlft((C + G(D, A, B) + d[10] + 0x5a827999), 9); B = rotintlft((B + G(C, D, A) + d[14] + 0x5a827999), 13); A = rotintlft((A + G(B, C, D) + d[3] + 0x5a827999), 3); D = rotintlft((D + G(A, B, C) + d[7] + 0x5a827999), 5); C = rotintlft((C + G(D, A, B) + d[11] + 0x5a827999), 9); B = rotintlft((B + G(C, D, A) + d[15] + 0x5a827999), 13); } protected void round3(final int[] d) { A = rotintlft((A + H(B, C, D) + d[0] + 0x6ed9eba1), 3); D = rotintlft((D + H(A, B, C) + d[8] + 0x6ed9eba1), 9); C = rotintlft((C + H(D, A, B) + d[4] + 0x6ed9eba1), 11); B = rotintlft((B + H(C, D, A) + d[12] + 0x6ed9eba1), 15); A = rotintlft((A + H(B, C, D) + d[2] + 0x6ed9eba1), 3); D = rotintlft((D + H(A, B, C) + d[10] + 0x6ed9eba1), 9); C = rotintlft((C + H(D, A, B) + d[6] + 0x6ed9eba1), 11); B = rotintlft((B + H(C, D, A) + d[14] + 0x6ed9eba1), 15); A = rotintlft((A + H(B, C, D) + d[1] + 0x6ed9eba1), 3); D = rotintlft((D + H(A, B, C) + d[9] + 0x6ed9eba1), 9); C = rotintlft((C + H(D, A, B) + d[5] + 0x6ed9eba1), 11); B = rotintlft((B + H(C, D, A) + d[13] + 0x6ed9eba1), 15); A = rotintlft((A + H(B, C, D) + d[3] + 0x6ed9eba1), 3); D = rotintlft((D + H(A, B, C) + d[11] + 0x6ed9eba1), 9); C = rotintlft((C + H(D, A, B) + d[7] + 0x6ed9eba1), 11); B = rotintlft((B + H(C, D, A) + d[15] + 0x6ed9eba1), 15); } } /** * Cryptography support - HMACMD5 - algorithmically based on various web * resources by Karl Wright */ static class HMACMD5 { protected final byte[] ipad; protected final byte[] opad; protected final MessageDigest md5; HMACMD5(final byte[] input) { byte[] key = input; md5 = getMD5(); // Initialize the pad buffers with the key ipad = new byte[64]; opad = new byte[64]; int keyLength = key.length; if (keyLength > 64) { // Use MD5 of the key instead, as described in RFC 2104 md5.update(key); key = md5.digest(); keyLength = key.length; } int i = 0; while (i < keyLength) { ipad[i] = (byte) (key[i] ^ (byte) 0x36); opad[i] = (byte) (key[i] ^ (byte) 0x5c); i++; } while (i < 64) { ipad[i] = (byte) 0x36; opad[i] = (byte) 0x5c; i++; } // Very important: processChallenge the digest with the ipad buffer md5.reset(); md5.update(ipad); } /** Grab the current digest. This is the "answer". */ byte[] getOutput() { final byte[] digest = md5.digest(); md5.update(opad); return md5.digest(digest); } /** Update by adding a complete array */ void update(final byte[] input) { md5.update(input); } /** Update the algorithm */ void update(final byte[] input, final int offset, final int length) { md5.update(input, offset, length); } } @Override public String generateType1Msg( final String domain, final String workstation) { LOGGER.debug("generateType1Msg domain='" + domain + "' workstation='" + workstation + "'"); return getType1Message(workstation, domain); } @Override public String generateType3Msg( final String username, final String password, final String domain, final String workstation, final String challenge) throws NTLMEngineException { // need to retrieve raw type 1 and 2 message and connection certificate for channel binding implementation byte[] type1MessageBytes = new Type1Message().getBytes(); byte[] type2MessageBytes = Base64.decodeBase64(challenge.getBytes(DEFAULT_CHARSET)); final DavMailNTLMEngineImpl.Type2Message t2m = new DavMailNTLMEngineImpl.Type2Message(challenge); LOGGER.debug("generateType3Msg type2Flags " + t2m.getFlags() + " target='" + t2m.getTarget() + " username='" + username + "'"); return getType3Message( username, password, workstation, domain, t2m.getChallenge(), t2m.getFlags(), t2m.getTarget(), t2m.getTargetInfo(), peerServerCertificate, type1MessageBytes, type2MessageBytes); } } davmail-6.3.0/src/java/davmail/http/DavMailNTLMScheme.java0100644 0000000 0000000 00000014054 14754153476 022014 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import org.apache.http.Header; import org.apache.http.HttpRequest; import org.apache.http.auth.*; import org.apache.http.conn.ManagedHttpClientConnection; import org.apache.http.impl.auth.AuthSchemeBase; import org.apache.http.impl.auth.NTLMEngineException; import org.apache.http.message.BufferedHeader; import org.apache.http.protocol.ExecutionContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.Args; import org.apache.http.util.CharArrayBuffer; import javax.net.ssl.SSLPeerUnverifiedException; import java.security.cert.Certificate; /** * Duplicate of NTLMScheme from HttpClient to implement channel binding. */ public class DavMailNTLMScheme extends AuthSchemeBase { enum State { UNINITIATED, CHALLENGE_RECEIVED, MSG_TYPE1_GENERATED, MSG_TYPE2_RECEVIED, MSG_TYPE3_GENERATED, FAILED, } private State state; private final DavMailNTLMEngineImpl engine; private HttpContext httpContext; private String challenge; public DavMailNTLMScheme() { this.engine = new DavMailNTLMEngineImpl(); this.state = State.UNINITIATED; this.challenge = null; } @Override protected void parseChallenge(CharArrayBuffer buffer, int beginIndex, int endIndex) throws MalformedChallengeException { this.challenge = buffer.substringTrimmed(beginIndex, endIndex); if (this.challenge.isEmpty()) { if (this.state == State.UNINITIATED) { this.state = State.CHALLENGE_RECEIVED; } else { this.state = State.FAILED; } } else { if (this.state.compareTo(State.MSG_TYPE1_GENERATED) < 0) { this.state = State.FAILED; throw new MalformedChallengeException("Out of sequence NTLM response message"); } else if (this.state == State.MSG_TYPE1_GENERATED) { this.state = State.MSG_TYPE2_RECEVIED; } } } @Override public String getSchemeName() { return "ntlm"; } @Override public String getParameter(String name) { // String parameters not supported return null; } @Override public String getRealm() { // NTLM does not support the concept of an authentication realm return null; } @Override public boolean isConnectionBased() { return true; } @Override public boolean isComplete() { return this.state == State.MSG_TYPE3_GENERATED || this.state == State.FAILED; } @Override public Header authenticate( final Credentials credentials, final HttpRequest request, final HttpContext httpContext) throws AuthenticationException { this.httpContext = httpContext; return authenticate(credentials, request); } @Override public Header authenticate(Credentials credentials, HttpRequest request) throws AuthenticationException { NTCredentials ntcredentials = null; try { ntcredentials = (NTCredentials) credentials; } catch (final ClassCastException e) { throw new InvalidCredentialsException( "Credentials cannot be used for NTLM authentication: " + credentials.getClass().getName()); } String response = null; if (this.state == State.FAILED) { throw new AuthenticationException("NTLM authentication failed"); } else if (this.state == State.CHALLENGE_RECEIVED) { response = this.engine.generateType1Msg( ntcredentials.getDomain(), ntcredentials.getWorkstation()); this.state = State.MSG_TYPE1_GENERATED; } else if (this.state == State.MSG_TYPE2_RECEVIED) { // retrieve certificate from connection and pass it to NTLM engine ManagedHttpClientConnection routedConnection = (ManagedHttpClientConnection) httpContext.getAttribute(ExecutionContext.HTTP_CONNECTION); try { Certificate[] certificates = routedConnection.getSSLSession().getPeerCertificates(); this.engine.setPeerServerCertificate(certificates[0]); } catch (SSLPeerUnverifiedException e) { throw new NTLMEngineException(e.getMessage(), e); } response = this.engine.generateType3Msg( ntcredentials.getUserName(), ntcredentials.getPassword(), ntcredentials.getDomain(), ntcredentials.getWorkstation(), this.challenge); this.state = State.MSG_TYPE3_GENERATED; } else { throw new AuthenticationException("Unexpected state: " + this.state); } final CharArrayBuffer buffer = new CharArrayBuffer(32); if (isProxy()) { buffer.append(AUTH.PROXY_AUTH_RESP); } else { buffer.append(AUTH.WWW_AUTH_RESP); } buffer.append(": NTLM "); buffer.append(response); return new BufferedHeader(buffer); } } davmail-6.3.0/src/java/davmail/http/DavMailNTLMSchemeFactory.java0100644 0000000 0000000 00000002220 14754153500 023320 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import org.apache.http.auth.AuthScheme; import org.apache.http.protocol.HttpContext; public class DavMailNTLMSchemeFactory implements org.apache.http.auth.AuthSchemeProvider { @Override public AuthScheme create(HttpContext context) { return new DavMailNTLMScheme(); } } davmail-6.3.0/src/java/davmail/http/DavMailSPNegoScheme.java0100644 0000000 0000000 00000014021 14545543571 022364 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import org.apache.http.auth.Credentials; import org.apache.http.impl.auth.SPNegoScheme; import org.apache.log4j.Logger; import org.ietf.jgss.*; import javax.security.auth.RefreshFailedException; import javax.security.auth.Subject; import javax.security.auth.kerberos.KerberosTicket; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import java.security.PrivilegedAction; import java.security.Security; /** * Override native SPNegoScheme to handle Kerberos. * Try to get Kerberos ticket from session, if this fails use callbacks to get credentials from user. */ public class DavMailSPNegoScheme extends SPNegoScheme { protected static final Logger LOGGER = Logger.getLogger(DavMailSPNegoScheme.class); protected static final Object LOCK = new Object(); protected static final KerberosHelper.KerberosCallbackHandler KERBEROS_CALLBACK_HANDLER; private static LoginContext clientLoginContext; static { // Load Jaas configuration from class Security.setProperty("login.configuration.provider", "davmail.http.KerberosLoginConfiguration"); // Kerberos callback handler singleton KERBEROS_CALLBACK_HANDLER = new KerberosHelper.KerberosCallbackHandler(); } public DavMailSPNegoScheme(final boolean stripPort, final boolean useCanonicalHostname) { super(stripPort, useCanonicalHostname); } public DavMailSPNegoScheme(final boolean stripPort) { super(stripPort); } public DavMailSPNegoScheme() { super(); } @Override protected byte[] generateGSSToken(final byte[] input, final Oid oid, final String authServer, final Credentials credentials) throws GSSException { String protocol = "HTTP"; LOGGER.debug("KerberosHelper.initSecurityContext " + protocol + '@' + authServer + ' ' + input.length + " bytes token"); synchronized (LOCK) { // check cached TGT if (clientLoginContext != null) { for (Object ticket : clientLoginContext.getSubject().getPrivateCredentials(KerberosTicket.class)) { KerberosTicket kerberosTicket = (KerberosTicket) ticket; if (kerberosTicket.getServer().getName().startsWith("krbtgt") && !kerberosTicket.isCurrent()) { LOGGER.debug("KerberosHelper.clientLogin cached TGT expired, try to relogin"); clientLoginContext = null; } } } // create client login context if (clientLoginContext == null) { final LoginContext localLoginContext; try { localLoginContext = new LoginContext("spnego-client", KERBEROS_CALLBACK_HANDLER); localLoginContext.login(); clientLoginContext = localLoginContext; } catch (LoginException e) { LOGGER.error(e.getMessage(), e); throw new GSSException(GSSException.FAILURE); } } // try to renew almost expired tickets for (Object ticket : clientLoginContext.getSubject().getPrivateCredentials(KerberosTicket.class)) { KerberosTicket kerberosTicket = (KerberosTicket) ticket; LOGGER.debug("KerberosHelper.clientLogin ticket for " + kerberosTicket.getServer().getName() + " expires at " + kerberosTicket.getEndTime()); if (kerberosTicket.getEndTime().getTime() < System.currentTimeMillis() + 10000) { if (kerberosTicket.isRenewable()) { try { kerberosTicket.refresh(); } catch (RefreshFailedException e) { LOGGER.debug("KerberosHelper.clientLogin failed to renew ticket " + kerberosTicket); } } else { LOGGER.debug("KerberosHelper.clientLogin ticket is not renewable"); } } } Object result = internalGenerateGSSToken(input, oid, authServer, credentials); if (result instanceof GSSException) { LOGGER.info("KerberosHelper.initSecurityContext exception code " + ((GSSException) result).getMajor() + " minor code " + ((GSSException) result).getMinor() + " message " + ((Throwable) result).getMessage()); throw (GSSException) result; } LOGGER.debug("KerberosHelper.initSecurityContext return " + ((byte[]) result).length + " bytes token"); return (byte[]) result; } } protected Object internalGenerateGSSToken(final byte[] input, final Oid oid, final String authServer, final Credentials credentials) { return Subject.doAs(clientLoginContext.getSubject(), (PrivilegedAction) () -> { Object result; try { result = super.generateGSSToken(input, oid, authServer, credentials); } catch (GSSException e) { result = e; } return result; }); } } davmail-6.3.0/src/java/davmail/http/DavMailSPNegoSchemeFactory.java0100644 0000000 0000000 00000004532 14503245213 023704 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import org.apache.http.auth.AuthScheme; import org.apache.http.auth.AuthSchemeFactory; import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; /** * Override native SPNegoSchemeFactory to load DavMail specific Kerberos settings. */ public class DavMailSPNegoSchemeFactory implements AuthSchemeFactory, AuthSchemeProvider { private final boolean stripPort; private final boolean useCanonicalHostname; /** * @since 4.4 */ public DavMailSPNegoSchemeFactory(final boolean stripPort, final boolean useCanonicalHostname) { super(); this.stripPort = stripPort; this.useCanonicalHostname = useCanonicalHostname; } public DavMailSPNegoSchemeFactory(final boolean stripPort) { super(); this.stripPort = stripPort; this.useCanonicalHostname = true; } public DavMailSPNegoSchemeFactory() { this(true, true); } public boolean isStripPort() { return stripPort; } public boolean isUseCanonicalHostname() { return useCanonicalHostname; } @Override public AuthScheme newInstance(final HttpParams params) { return new DavMailSPNegoScheme(this.stripPort, this.useCanonicalHostname); } @Override public AuthScheme create(final HttpContext context) { return new DavMailSPNegoScheme(this.stripPort, this.useCanonicalHostname); } } davmail-6.3.0/src/java/davmail/http/DavMailX509KeyManager.java0100644 0000000 0000000 00000021121 14575630005 022504 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2011 Mickael Guessant * * 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. */ package davmail.http; import davmail.Settings; import davmail.ui.SelectCertificateDialog; import org.apache.log4j.Logger; import javax.net.ssl.X509KeyManager; import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.security.Principal; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Special X509 Key Manager that handles cases where more than one private key * is sufficient to establish the HTTPs connection by asking the user to * select one. */ public class DavMailX509KeyManager implements X509KeyManager { protected static final Logger LOGGER = Logger.getLogger(DavMailX509KeyManager.class); // Wrap an existing key manager to handle most of the interface as a pass through private final X509KeyManager keyManager; // Remember selected alias so we don't continually bug the user private String cachedAlias; /** * Build the specialized key manager wrapping the default one * * @param keyManager original key manager */ public DavMailX509KeyManager(X509KeyManager keyManager) { this.keyManager = keyManager; } /** * Get the client aliases, simply pass this through to wrapped key manager */ public String[] getClientAliases(String string, Principal[] principals) { return keyManager.getClientAliases(string, principals); } /** * Select a client alias. Some servers are misconfigured and claim to accept * any client certificate during the SSL handshake, however OWA only authenticates * using a single certificate. *

* This method allows the user to select the right client certificate */ public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { LOGGER.debug("Find client certificates issued by: " + Arrays.asList(issuers)); // Build a list of all aliases ArrayList aliases = new ArrayList<>(); for (String keyTypeValue : keyType) { String[] keyAliases = keyManager.getClientAliases(keyTypeValue, issuers); if (keyAliases != null) { aliases.addAll(Arrays.asList(keyAliases)); } } // If there are more than one show a dialog and return the selected alias if (aliases.size() > 1) { //If there's a saved pattern try to match it if (cachedAlias != null) { for (String alias : aliases) { if (cachedAlias.equals(stripAlias(alias))) { LOGGER.debug(alias + " matched cached alias: " + cachedAlias); return alias; } } // pattern didn't match, clear the pattern and ask user to select an alias cachedAlias = null; } String[] aliasesArray = aliases.toArray(new String[0]); String[] descriptionsArray = new String[aliasesArray.length]; int i = 0; for (String alias : aliasesArray) { X509Certificate certificate = getCertificateChain(alias)[0]; String subject = certificate.getSubjectX500Principal().getName(); if (subject.contains("=")) { subject = subject.substring(subject.indexOf("=")+1); } if (subject.contains(",")) { subject = subject.substring(0, subject.indexOf(",")); } try { for (List subjectAltName:certificate.getSubjectAlternativeNames()) { if (subjectAltName.get(1) instanceof String) { subject = " " + subjectAltName.get(1); } } } catch (Exception e) { // ignore } String issuer = certificate.getIssuerX500Principal().getName(); if (issuer.contains("=")) { issuer = issuer.substring(issuer.indexOf("=")+1); } if (issuer.contains(",")) { issuer = issuer.substring(0, issuer.indexOf(",")); } descriptionsArray[i++] = subject + " [" + issuer + "]"; } String selectedAlias; if (Settings.getBooleanProperty("davmail.server") || GraphicsEnvironment.isHeadless()) { // headless or server mode selectedAlias = chooseClientAlias(aliasesArray, descriptionsArray); } else { SelectCertificateDialog selectCertificateDialog = new SelectCertificateDialog(aliasesArray, descriptionsArray); selectedAlias = selectCertificateDialog.getSelectedAlias(); LOGGER.debug("User selected Key Alias: " + selectedAlias); } cachedAlias = stripAlias(selectedAlias); LOGGER.debug("Stored Key Alias Pattern: " + cachedAlias); return selectedAlias; // exactly one, simply return that and don't bother the user } else if (aliases.size() == 1) { LOGGER.debug("One Private Key found, returning that"); return aliases.get(0); // none, return null } else { LOGGER.debug("No Private Keys found"); return null; } } private String chooseClientAlias(String[] aliasesArray, String[] descriptionsArray) { System.out.println("Choose client alias:"); int i = 1; for (String aliasDescription:descriptionsArray) { System.out.println(i+++": "+aliasDescription); } BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in)); int chosenIndex = 0; while (chosenIndex == 0 || chosenIndex > descriptionsArray.length) { try { System.out.print("Alias: "); chosenIndex = Integer.parseInt(inReader.readLine()); } catch (NumberFormatException | IOException e) { System.out.println("Invalid"); } } return aliasesArray[chosenIndex - 1]; } /** * PKCS11 aliases are in the format: dd.0, dd is incremented * every time the SSL connection is re-negotiated * * @param alias original alias * @return alias without prefix */ protected String stripAlias(String alias) { String value = alias; if (value != null && value.length() > 1) { char firstChar = value.charAt(0); int dotIndex = value.indexOf('.'); if (firstChar >= '0' && firstChar <= '9' && dotIndex >= 0) { value = value.substring(dotIndex+1); } } return value; } /** * Passthrough to wrapped keymanager */ public String[] getServerAliases(String string, Principal[] prncpls) { return keyManager.getServerAliases(string, prncpls); } /** * Passthrough to wrapped keymanager */ public String chooseServerAlias(String string, Principal[] prncpls, Socket socket) { return keyManager.chooseServerAlias(string, prncpls, socket); } /** * Passthrough to wrapped keymanager */ public X509Certificate[] getCertificateChain(String string) { X509Certificate[] certificates = keyManager.getCertificateChain(string); for (X509Certificate certificate: certificates) { LOGGER.debug("Certificate chain: " + certificate.getSubjectX500Principal()); } return certificates; } /** * Passthrough to wrapped keymanager */ public PrivateKey getPrivateKey(String string) { return keyManager.getPrivateKey(string); } } davmail-6.3.0/src/java/davmail/http/HttpClientAdapter.java0100644 0000000 0000000 00000062013 14754153500 022220 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import davmail.Settings; import davmail.exception.*; import davmail.http.request.*; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.StatusLine; import org.apache.http.auth.AuthSchemeProvider; import org.apache.http.auth.AuthScope; import org.apache.http.auth.NTCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.HttpResponseException; import org.apache.http.client.config.AuthSchemes; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.client.utils.URIUtils; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.cookie.Cookie; import org.apache.http.impl.auth.BasicSchemeFactory; import org.apache.http.impl.auth.DigestSchemeFactory; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.BasicHttpClientConnectionManager; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.impl.conn.SystemDefaultRoutePlanner; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest; import org.apache.jackrabbit.webdav.client.methods.HttpCopy; import org.apache.jackrabbit.webdav.client.methods.HttpMove; import org.apache.log4j.Logger; import org.codehaus.jettison.json.JSONObject; import java.io.Closeable; import java.io.IOException; import java.net.*; import java.security.Security; import java.util.HashSet; import java.util.List; public class HttpClientAdapter implements Closeable { static final Logger LOGGER = Logger.getLogger("davmail.http.HttpClientAdapter"); static final String[] SUPPORTED_PROTOCOLS = new String[]{"TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3"}; static final Registry SCHEME_REGISTRY; static String WORKSTATION_NAME = "UNKNOWN"; static final int MAX_REDIRECTS = 10; static { // disable Client-initiated TLS renegotiation System.setProperty("jdk.tls.rejectClientInitiatedRenegotiation", "true"); // force strong ephemeral Diffie-Hellman parameter System.setProperty("jdk.tls.ephemeralDHKeySize", "2048"); Security.setProperty("ssl.SocketFactory.provider", "davmail.http.DavGatewaySSLSocketFactory"); // DavMail is Kerberos configuration provider Security.setProperty("login.configuration.provider", "davmail.http.KerberosLoginConfiguration"); // reenable basic proxy authentication on Java >= 1.8.111 System.setProperty("jdk.http.auth.tunneling.disabledSchemes", ""); RegistryBuilder schemeRegistry = RegistryBuilder.create(); schemeRegistry.register("http", new PlainConnectionSocketFactory()); schemeRegistry.register("https", new SSLConnectionSocketFactory(new DavGatewaySSLSocketFactory(), SUPPORTED_PROTOCOLS, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier())); SCHEME_REGISTRY = schemeRegistry.build(); try { WORKSTATION_NAME = InetAddress.getLocalHost().getHostName(); } catch (Exception e) { // ignore } // set system property *before* calling ProxySelector.getDefault() if (Settings.getBooleanProperty("davmail.useSystemProxies", Boolean.FALSE)) { System.setProperty("java.net.useSystemProxies", "true"); } ProxySelector.setDefault(new DavGatewayProxySelector(ProxySelector.getDefault())); } /** * Test if the response is gzip encoded * * @param response http response * @return true if response is gzip encoded */ public static boolean isGzipEncoded(HttpResponse response) { Header header = response.getFirstHeader("Content-Encoding"); return header != null && "gzip".equals(header.getValue()); } HttpClientConnectionManager connectionManager; CloseableHttpClient httpClient; CredentialsProvider provider = new BasicCredentialsProvider(); BasicCookieStore cookieStore = new BasicCookieStore() { @Override public void addCookie(final Cookie cookie) { //LOGGER.debug("Add cookie " + cookie); super.addCookie(cookie); } }; // current URI URI uri; String domain; String userid; String userEmail; public HttpClientAdapter(String url) { this(URI.create(url)); } public HttpClientAdapter(String url, String username, String password) { this(URI.create(url), username, password, false); } public HttpClientAdapter(String url, boolean enablePool) { this(URI.create(url), null, null, enablePool); } public HttpClientAdapter(String url, String username, String password, boolean enablePool) { this(URI.create(url), username, password, enablePool); } public HttpClientAdapter(URI uri) { this(uri, null, null, false); } public HttpClientAdapter(URI uri, boolean enablePool) { this(uri, null, null, enablePool); } public HttpClientAdapter(URI uri, String username, String password) { this(uri, username, password, false); } public HttpClientAdapter(URI uri, String username, String password, boolean enablePool) { // init current uri this.uri = uri; if (enablePool) { connectionManager = new PoolingHttpClientConnectionManager(SCHEME_REGISTRY); ((PoolingHttpClientConnectionManager) connectionManager).setDefaultMaxPerRoute(5); startEvictorThread(); } else { connectionManager = new BasicHttpClientConnectionManager(SCHEME_REGISTRY); } HttpClientBuilder clientBuilder = HttpClientBuilder.create() .disableRedirectHandling() .setDefaultRequestConfig(getRequestConfig()) .setUserAgent(getUserAgent()) .setDefaultAuthSchemeRegistry(getAuthSchemeRegistry()) // httpClient is not shared between clients, do not track connection state .disableConnectionState() .setConnectionManager(connectionManager); SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(ProxySelector.getDefault()); clientBuilder.setRoutePlanner(routePlanner); clientBuilder.setDefaultCookieStore(cookieStore); setCredentials(username, password); boolean enableProxy = Settings.getBooleanProperty("davmail.enableProxy"); boolean useSystemProxies = Settings.getBooleanProperty("davmail.useSystemProxies", Boolean.FALSE); String proxyHost = null; int proxyPort = 0; String proxyUser = null; String proxyPassword = null; if (useSystemProxies) { // get proxy for url from system settings System.setProperty("java.net.useSystemProxies", "true"); List proxyList = getProxyForURI(uri); if (!proxyList.isEmpty() && proxyList.get(0).address() != null) { InetSocketAddress inetSocketAddress = (InetSocketAddress) proxyList.get(0).address(); proxyHost = inetSocketAddress.getHostName(); proxyPort = inetSocketAddress.getPort(); // we may still need authentication credentials proxyUser = Settings.getProperty("davmail.proxyUser"); proxyPassword = Settings.getProperty("davmail.proxyPassword"); } } else if (isNoProxyFor(uri)) { LOGGER.debug("no proxy for " + uri.getHost()); } else if (enableProxy) { proxyHost = Settings.getProperty("davmail.proxyHost"); proxyPort = Settings.getIntProperty("davmail.proxyPort"); proxyUser = Settings.getProperty("davmail.proxyUser"); proxyPassword = Settings.getProperty("davmail.proxyPassword"); } if (proxyHost != null && !proxyHost.isEmpty() && (proxyUser != null && !proxyUser.isEmpty())) { AuthScope authScope = new AuthScope(proxyHost, proxyPort, AuthScope.ANY_REALM); if (provider == null) { provider = new BasicCredentialsProvider(); } // detect ntlm authentication (windows domain name in username) int backslashIndex = proxyUser.indexOf('\\'); if (backslashIndex > 0) { provider.setCredentials(authScope, new NTCredentials(proxyUser.substring(backslashIndex + 1), proxyPassword, WORKSTATION_NAME, proxyUser.substring(0, backslashIndex))); } else { provider.setCredentials(authScope, new NTCredentials(proxyUser, proxyPassword, WORKSTATION_NAME, "")); } } clientBuilder.setDefaultCredentialsProvider(provider); httpClient = clientBuilder.build(); } /** * Get current uri host * * @return current host */ public String getHost() { return uri.getHost(); } /** * Force current uri. * * @param uri new uri */ public void setUri(URI uri) { this.uri = uri; } /** * Current uri. * * @return current uri */ public URI getUri() { return uri; } private Registry getAuthSchemeRegistry() { final RegistryBuilder registryBuilder = RegistryBuilder.create(); registryBuilder.register(AuthSchemes.NTLM, new DavMailNTLMSchemeFactory()) .register(AuthSchemes.BASIC, new BasicSchemeFactory()) .register(AuthSchemes.DIGEST, new DigestSchemeFactory()); if (Settings.getBooleanProperty("davmail.enableKerberos")) { registryBuilder.register(AuthSchemes.SPNEGO, new DavMailSPNegoSchemeFactory()); } return registryBuilder.build(); } private RequestConfig getRequestConfig() { HashSet authSchemes = new HashSet<>(); if (Settings.getBooleanProperty("davmail.enableKerberos")) { authSchemes.add(AuthSchemes.SPNEGO); authSchemes.add(AuthSchemes.KERBEROS); } else { authSchemes.add(AuthSchemes.NTLM); authSchemes.add(AuthSchemes.BASIC); authSchemes.add(AuthSchemes.DIGEST); } return RequestConfig.custom() // socket connect timeout .setConnectTimeout(Settings.getIntProperty("davmail.exchange.connectionTimeout", 10) * 1000) // inactivity timeout .setSocketTimeout(Settings.getIntProperty("davmail.exchange.soTimeout", 120) * 1000) .setTargetPreferredAuthSchemes(authSchemes) .build(); } private void parseUserName(String username) { if (username != null) { int pipeIndex = username.indexOf("|"); if (pipeIndex >= 0) { userid = username.substring(0, pipeIndex); userEmail = username.substring(pipeIndex + 1); } else { userid = username; userEmail = username; } // separate domain name int backSlashIndex = userid.indexOf('\\'); if (backSlashIndex >= 0) { // separate domain from username in credentials domain = userid.substring(0, backSlashIndex); userid = userid.substring(backSlashIndex + 1); } else { domain = Settings.getProperty("davmail.defaultDomain", ""); } } } /** * Retrieve Proxy Selector * * @param uri target uri * @return proxy selector */ private static List getProxyForURI(java.net.URI uri) { LOGGER.debug("get Default proxy selector"); ProxySelector proxySelector = ProxySelector.getDefault(); LOGGER.debug("getProxyForURI(" + uri + ')'); List proxies = proxySelector.select(uri); LOGGER.debug("got system proxies:" + proxies); return proxies; } protected static boolean isNoProxyFor(java.net.URI uri) { final String noProxyFor = Settings.getProperty("davmail.noProxyFor"); if (noProxyFor != null) { final String uriHost = uri.getHost().toLowerCase(); final String[] domains = noProxyFor.toLowerCase().split(",\\s*"); for (String domain : domains) { if (uriHost.endsWith(domain)) { return true; } } } return false; } public void startEvictorThread() { DavMailIdleConnectionEvictor.addConnectionManager(connectionManager); } @Override public void close() { DavMailIdleConnectionEvictor.removeConnectionManager(connectionManager); try { httpClient.close(); } catch (IOException e) { LOGGER.warn("Exception closing http client", e); } } public static void close(HttpClientAdapter httpClientAdapter) { if (httpClientAdapter != null) { httpClientAdapter.close(); } } /** * Execute request, do not follow redirects. * if request is an instance of ResponseHandler, process and close response * * @param request Http request * @return Http response * @throws IOException on error */ public CloseableHttpResponse execute(HttpRequestBase request) throws IOException { return execute(request, null); } /** * Execute request, do not follow redirects. * if request is an instance of ResponseHandler, process and close response * * @param request Http request * @param context Http request context * @return Http response * @throws IOException on error */ public CloseableHttpResponse execute(HttpRequestBase request, HttpClientContext context) throws IOException { // make sure request path is absolute handleURI(request); // execute request and return response return httpClient.execute(request, context); } /** * fix relative uri and update current uri. * * @param request http request */ private void handleURI(HttpRequestBase request) { URI requestURI = request.getURI(); if (!requestURI.isAbsolute()) { request.setURI(URIUtils.resolve(uri, requestURI)); } uri = request.getURI(); } public ResponseWrapper executeFollowRedirect(PostRequest request) throws IOException { ResponseWrapper responseWrapper = request; LOGGER.debug(request.getMethod() + " " + request.getURI().toString()); LOGGER.debug(request.getParameters()); int count = 0; int maxRedirect = Settings.getIntProperty("davmail.httpMaxRedirects", MAX_REDIRECTS); executePostRequest(request); URI redirectLocation = request.getRedirectLocation(); while (count++ < maxRedirect && redirectLocation != null) { LOGGER.debug("Redirect " + request.getURI() + " to " + redirectLocation); // replace uri with target location responseWrapper = new GetRequest(redirectLocation); executeGetRequest((GetRequest) responseWrapper); redirectLocation = ((GetRequest) responseWrapper).getRedirectLocation(); } return responseWrapper; } public GetRequest executeFollowRedirect(GetRequest request) throws IOException { GetRequest result = request; LOGGER.debug(request.getMethod() + " " + request.getURI().toString()); int count = 0; int maxRedirect = Settings.getIntProperty("davmail.httpMaxRedirects", MAX_REDIRECTS); executeGetRequest(request); URI redirectLocation = request.getRedirectLocation(); while (count++ < maxRedirect && redirectLocation != null) { LOGGER.debug("Redirect " + request.getURI() + " to " + redirectLocation); // replace uri with target location result = new GetRequest(redirectLocation); executeGetRequest(result); redirectLocation = result.getRedirectLocation(); } return result; } /** * Execute get request and return response body as string. * * @param getRequest get request * @return response body * @throws IOException on error */ public String executeGetRequest(GetRequest getRequest) throws IOException { handleURI(getRequest); String responseBodyAsString; try (CloseableHttpResponse response = execute(getRequest)) { responseBodyAsString = getRequest.handleResponse(response); } return responseBodyAsString; } /** * Execute post request and return response body as string. * * @param postRequest post request * @return response body * @throws IOException on error */ public String executePostRequest(PostRequest postRequest) throws IOException { handleURI(postRequest); String responseBodyAsString; try (CloseableHttpResponse response = execute(postRequest)) { responseBodyAsString = postRequest.handleResponse(response); } return responseBodyAsString; } public JSONObject executeRestRequest(RestRequest restRequest) throws IOException { handleURI(restRequest); JSONObject responseBody; try (CloseableHttpResponse response = execute(restRequest)) { responseBody = restRequest.handleResponse(response); } return responseBody; } /** * Execute WebDav request * * @param request WebDav request * @return multistatus response * @throws IOException on error */ public MultiStatus executeDavRequest(BaseDavRequest request) throws IOException { handleURI(request); MultiStatus multiStatus = null; try (CloseableHttpResponse response = execute(request)) { request.checkSuccess(response); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_MULTI_STATUS) { multiStatus = request.getResponseBodyAsMultiStatus(response); } } catch (DavException e) { LOGGER.error(e.getMessage(), e); throw new IOException(e.getErrorCode() + " " + e.getStatusPhrase(), e); } return multiStatus; } /** * Execute Exchange WebDav request * * @param request WebDav request * @return multistatus response * @throws IOException on error */ public MultiStatusResponse[] executeDavRequest(ExchangeDavRequest request) throws IOException { handleURI(request); MultiStatusResponse[] responses; try (CloseableHttpResponse response = execute(request)) { List responseList = request.handleResponse(response); // TODO check error handling //request.checkSuccess(response); responses = responseList.toArray(new MultiStatusResponse[0]); } return responses; } /** * Execute webdav search method. * * @param path encoded searched folder path * @param searchStatement (SQL like) search statement * @param maxCount max item count * @return Responses enumeration * @throws IOException on error */ public MultiStatusResponse[] executeSearchRequest(String path, String searchStatement, int maxCount) throws IOException { ExchangeSearchRequest searchRequest = new ExchangeSearchRequest(path, searchStatement); if (maxCount > 0) { searchRequest.setHeader("Range", "rows=0-" + (maxCount - 1)); } return executeDavRequest(searchRequest); } public static boolean isRedirect(HttpResponse response) { return isRedirect(response.getStatusLine().getStatusCode()); } /** * Check if status is a redirect (various 30x values). * * @param status Http status * @return true if status is a redirect */ public static boolean isRedirect(int status) { return status == HttpStatus.SC_MOVED_PERMANENTLY || status == HttpStatus.SC_MOVED_TEMPORARILY || status == HttpStatus.SC_SEE_OTHER || status == HttpStatus.SC_TEMPORARY_REDIRECT; } /** * Get redirect location from header. * * @param response Http response * @return URI target location */ public static URI getRedirectLocation(HttpResponse response) { Header location = response.getFirstHeader("Location"); if (isRedirect(response.getStatusLine().getStatusCode()) && location != null) { return URI.create(location.getValue()); } return null; } public void setCredentials(String username, String password) { parseUserName(username); if (userid != null && password != null) { LOGGER.debug("Creating NTCredentials for user " + userid + " workstation " + WORKSTATION_NAME + " domain " + domain); NTCredentials credentials = new NTCredentials(userid, password, WORKSTATION_NAME, domain); provider.setCredentials(AuthScope.ANY, credentials); } } public List getCookies() { return cookieStore.getCookies(); } public void addCookie(Cookie cookie) { cookieStore.addCookie(cookie); } public String getUserAgent() { return Settings.getUserAgent(); } public static HttpResponseException buildHttpResponseException(HttpRequestBase request, HttpResponse response) { return buildHttpResponseException(request, response.getStatusLine()); } /** * Build Http Exception from method status * * @param method Http Method * @return Http Exception */ public static HttpResponseException buildHttpResponseException(HttpRequestBase method, StatusLine statusLine) { int status = statusLine.getStatusCode(); StringBuilder message = new StringBuilder(); message.append(status).append(' ').append(statusLine.getReasonPhrase()); message.append(" at ").append(method.getURI()); if (method instanceof HttpCopy || method instanceof HttpMove) { message.append(" to ").append(method.getFirstHeader("Destination")); } // 440 means forbidden on Exchange if (status == 440) { return new LoginTimeoutException(message.toString()); } else if (status == HttpStatus.SC_FORBIDDEN) { return new HttpForbiddenException(message.toString()); } else if (status == HttpStatus.SC_NOT_FOUND) { return new HttpNotFoundException(message.toString()); } else if (status == HttpStatus.SC_PRECONDITION_FAILED) { return new HttpPreconditionFailedException(message.toString()); } else if (status == HttpStatus.SC_INTERNAL_SERVER_ERROR) { return new HttpServerErrorException(message.toString()); } else { return new HttpResponseException(status, message.toString()); } } } davmail-6.3.0/src/java/davmail/http/KerberosHelper.java0100644 0000000 0000000 00000035714 14545543571 021576 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2012 Mickael Guessant * * 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. */ package davmail.http; import davmail.Settings; import davmail.ui.CredentialPromptDialog; import org.apache.log4j.Logger; import org.ietf.jgss.*; import javax.security.auth.RefreshFailedException; import javax.security.auth.Subject; import javax.security.auth.callback.*; import javax.security.auth.kerberos.KerberosTicket; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.security.PrivilegedAction; import java.security.Security; /** * Kerberos helper class. */ public class KerberosHelper { protected static final Logger LOGGER = Logger.getLogger(KerberosHelper.class); protected static final Object LOCK = new Object(); protected static final KerberosCallbackHandler KERBEROS_CALLBACK_HANDLER; private static LoginContext clientLoginContext; static { // Load Jaas configuration from class Security.setProperty("login.configuration.provider", "davmail.http.KerberosLoginConfiguration"); // Kerberos callback handler singleton KERBEROS_CALLBACK_HANDLER = new KerberosCallbackHandler(); } private KerberosHelper() { } @SuppressWarnings("UseOfSystemOutOrSystemErr") protected static class KerberosCallbackHandler implements CallbackHandler { String principal; String password; public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (Callback callback : callbacks) { if (callback instanceof NameCallback) { if (principal == null) { // if we get there kerberos token is missing or invalid if (Settings.getBooleanProperty("davmail.server") || GraphicsEnvironment.isHeadless()) { // headless or server mode System.out.print(((NameCallback) callback).getPrompt()); BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in)); principal = inReader.readLine(); } else { CredentialPromptDialog credentialPromptDialog = new CredentialPromptDialog(((NameCallback) callback).getPrompt()); principal = credentialPromptDialog.getPrincipal(); password = String.valueOf(credentialPromptDialog.getPassword()); } } if (principal == null) { throw new IOException("KerberosCallbackHandler: failed to retrieve principal"); } ((NameCallback) callback).setName(principal); } else if (callback instanceof PasswordCallback) { if (password == null) { // if we get there kerberos token is missing or invalid if (Settings.getBooleanProperty("davmail.server") || GraphicsEnvironment.isHeadless()) { // headless or server mode System.out.print(((PasswordCallback) callback).getPrompt()); BufferedReader inReader = new BufferedReader(new InputStreamReader(System.in)); password = inReader.readLine(); } } if (password == null) { throw new IOException("KerberosCallbackHandler: failed to retrieve password"); } ((PasswordCallback) callback).setPassword(password.toCharArray()); } else { throw new UnsupportedCallbackException(callback); } } } } /** * Force client principal in callback handler * * @param principal client principal */ public static void setClientPrincipal(String principal) { KERBEROS_CALLBACK_HANDLER.principal = principal; } /** * Force client password in callback handler * * @param password client password */ public static void setClientPassword(String password) { KERBEROS_CALLBACK_HANDLER.password = password; } /** * Get response Kerberos token for host with provided token. * * @param protocol target protocol * @param host target host * @param token input token * @return response token * @throws GSSException on error * @throws LoginException on error */ public static byte[] initSecurityContext(final String protocol, final String host, final byte[] token) throws GSSException, LoginException { return initSecurityContext(protocol, host, null, token); } /** * Get response Kerberos token for host with provided token, use client provided delegation credentials. * Used to authenticate with target host on a gateway server with client credentials, * gateway must have its own principal authorized for delegation * * @param protocol target protocol * @param host target host * @param delegatedCredentials client delegated credentials * @param token input token * @return response token * @throws GSSException on error * @throws LoginException on error */ public static byte[] initSecurityContext(final String protocol, final String host, final GSSCredential delegatedCredentials, final byte[] token) throws GSSException, LoginException { LOGGER.debug("KerberosHelper.initSecurityContext " + protocol + '@' + host + ' ' + token.length + " bytes token"); synchronized (LOCK) { // check cached TGT if (clientLoginContext != null) { for (Object ticket : clientLoginContext.getSubject().getPrivateCredentials(KerberosTicket.class)) { KerberosTicket kerberosTicket = (KerberosTicket) ticket; if (kerberosTicket.getServer().getName().startsWith("krbtgt") && !kerberosTicket.isCurrent()) { LOGGER.debug("KerberosHelper.clientLogin cached TGT expired, try to relogin"); clientLoginContext = null; } } } // create client login context if (clientLoginContext == null) { final LoginContext localLoginContext = new LoginContext("spnego-client", KERBEROS_CALLBACK_HANDLER); localLoginContext.login(); clientLoginContext = localLoginContext; } // try to renew almost expired tickets for (Object ticket : clientLoginContext.getSubject().getPrivateCredentials(KerberosTicket.class)) { KerberosTicket kerberosTicket = (KerberosTicket) ticket; LOGGER.debug("KerberosHelper.clientLogin ticket for " + kerberosTicket.getServer().getName() + " expires at " + kerberosTicket.getEndTime()); if (kerberosTicket.getEndTime().getTime() < System.currentTimeMillis() + 10000) { if (kerberosTicket.isRenewable()) { try { kerberosTicket.refresh(); } catch (RefreshFailedException e) { LOGGER.debug("KerberosHelper.clientLogin failed to renew ticket " + kerberosTicket); } } else { LOGGER.debug("KerberosHelper.clientLogin ticket is not renewable"); } } } Object result = internalInitSecContext(protocol, host, delegatedCredentials, token); if (result instanceof GSSException) { LOGGER.info("KerberosHelper.initSecurityContext exception code " + ((GSSException) result).getMajor() + " minor code " + ((GSSException) result).getMinor() + " message " + ((Throwable) result).getMessage()); throw (GSSException) result; } LOGGER.debug("KerberosHelper.initSecurityContext return " + ((byte[]) result).length + " bytes token"); return (byte[]) result; } } protected static Object internalInitSecContext(final String protocol, final String host, final GSSCredential delegatedCredentials, final byte[] token) { return Subject.doAs(clientLoginContext.getSubject(), (PrivilegedAction) () -> { Object result; GSSContext context = null; try { GSSManager manager = GSSManager.getInstance(); GSSName serverName = manager.createName(protocol + '@' + host, GSSName.NT_HOSTBASED_SERVICE); // Kerberos v5 OID Oid krb5Oid = new Oid("1.2.840.113554.1.2.2"); context = manager.createContext(serverName, krb5Oid, delegatedCredentials, GSSContext.DEFAULT_LIFETIME); //context.requestMutualAuth(true); // TODO: used by IIS to pass token to Exchange ? context.requestCredDeleg(true); result = context.initSecContext(token, 0, token.length); } catch (GSSException e) { result = e; } finally { if (context != null) { try { context.dispose(); } catch (GSSException e) { LOGGER.debug("KerberosHelper.internalInitSecContext " + e + ' ' + e.getMessage()); } } } return result; }); } /** * Create server side Kerberos login context for provided credentials. * * @param serverPrincipal server principal * @param serverPassword server passsword * @return LoginContext server login context * @throws LoginException on error */ public static LoginContext serverLogin(final String serverPrincipal, final String serverPassword) throws LoginException { LoginContext serverLoginContext = new LoginContext("spnego-server", callbacks -> { for (Callback callback : callbacks) { if (callback instanceof NameCallback) { final NameCallback nameCallback = (NameCallback) callback; nameCallback.setName(serverPrincipal); } else if (callback instanceof PasswordCallback) { final PasswordCallback passCallback = (PasswordCallback) callback; passCallback.setPassword(serverPassword.toCharArray()); } else { throw new UnsupportedCallbackException(callback); } } }); serverLoginContext.login(); return serverLoginContext; } /** * Contains server Kerberos context information in server mode. */ public static class SecurityContext { /** * response token */ public byte[] token; /** * authenticated principal */ public String principal; /** * client delegated credential */ public GSSCredential clientCredential; } /** * Check client provided Kerberos token in server login context * * @param serverLoginContext server login context * @param token Kerberos client token * @return result with client principal and optional returned Kerberos token * @throws GSSException on error */ public static SecurityContext acceptSecurityContext(LoginContext serverLoginContext, final byte[] token) throws GSSException { Object result = Subject.doAs(serverLoginContext.getSubject(), (PrivilegedAction) () -> { Object innerResult; SecurityContext securityContext = new SecurityContext(); GSSContext context = null; try { GSSManager manager = GSSManager.getInstance(); // get server credentials from context Oid krb5oid = new Oid("1.2.840.113554.1.2.2"); GSSCredential serverCreds = manager.createCredential(null/* use name from login context*/, GSSCredential.DEFAULT_LIFETIME, krb5oid, GSSCredential.ACCEPT_ONLY/* server mode */); context = manager.createContext(serverCreds); securityContext.token = context.acceptSecContext(token, 0, token.length); if (context.isEstablished()) { securityContext.principal = context.getSrcName().toString(); LOGGER.debug("Authenticated user: " + securityContext.principal); if (!context.getCredDelegState()) { LOGGER.debug("Credentials can not be delegated"); } else { // Get client delegated credentials from context (gateway mode) securityContext.clientCredential = context.getDelegCred(); } } innerResult = securityContext; } catch (GSSException e) { innerResult = e; } finally { if (context != null) { try { context.dispose(); } catch (GSSException e) { LOGGER.debug("KerberosHelper.acceptSecurityContext " + e + ' ' + e.getMessage()); } } } return innerResult; }); if (result instanceof GSSException) { LOGGER.info("KerberosHelper.acceptSecurityContext exception code " + ((GSSException) result).getMajor() + " minor code " + ((GSSException) result).getMinor() + " message " + ((Throwable) result).getMessage()); throw (GSSException) result; } return (SecurityContext) result; } } davmail-6.3.0/src/java/davmail/http/KerberosLoginConfiguration.java0100644 0000000 0000000 00000007600 14545543571 024150 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2012 Mickael Guessant * * 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. */ package davmail.http; import org.apache.log4j.Logger; import javax.security.auth.login.AppConfigurationEntry; import javax.security.auth.login.Configuration; import java.util.HashMap; /** * Custom JAAS login configuration. * Equivalent to the following configuration: * spnego-client { * com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true renewTGT=true; * }; * spnego-server { * com.sun.security.auth.module.Krb5LoginModule required isInitiator=false useKeyTab=false storeKey=true; * }; *

*/ public class KerberosLoginConfiguration extends Configuration { protected static final Logger LOGGER = Logger.getLogger(KerberosLoginConfiguration.class); protected static final AppConfigurationEntry[] CLIENT_LOGIN_MODULE; protected static final AppConfigurationEntry[] SERVER_LOGIN_MODULE; static { HashMap clientLoginModuleOptions = new HashMap<>(); if (LOGGER.isDebugEnabled()) { clientLoginModuleOptions.put("debug", "true"); } clientLoginModuleOptions.put("useTicketCache", "true"); clientLoginModuleOptions.put("renewTGT", "true"); //clientLoginModuleOptions.put("doNotPrompt", "true"); String krb5ccName = System.getenv().get("KRB5CCNAME"); if (krb5ccName != null && !krb5ccName.isEmpty()) { clientLoginModuleOptions.put("ticketCache", krb5ccName); } //clientLoginModuleOptions.put("ticketCache", FileCredentialsCache.getDefaultCacheName()); //clientLoginModuleOptions.put("refreshKrb5Config", "true"); //clientLoginModuleOptions.put("storeKey", "true"); CLIENT_LOGIN_MODULE = new AppConfigurationEntry[]{new AppConfigurationEntry( "com.sun.security.auth.module.Krb5LoginModule", AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, clientLoginModuleOptions)}; HashMap serverLoginModuleOptions = new HashMap<>(); if (LOGGER.isDebugEnabled()) { serverLoginModuleOptions.put("debug", "true"); } serverLoginModuleOptions.put("isInitiator", "false"); // acceptor (server) mode serverLoginModuleOptions.put("useKeyTab", "false"); // do not use credentials stored in keytab file serverLoginModuleOptions.put("storeKey", "true"); // store credentials in subject SERVER_LOGIN_MODULE = new AppConfigurationEntry[]{new AppConfigurationEntry( "com.sun.security.auth.module.Krb5LoginModule", AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, serverLoginModuleOptions)}; } @Override public AppConfigurationEntry[] getAppConfigurationEntry(String name) { if ("spnego-client".equals(name)) { return CLIENT_LOGIN_MODULE; } else if ("spnego-server".equals(name)) { return SERVER_LOGIN_MODULE; } else { return null; } } @Override public void refresh() { // nothing to do } }davmail-6.3.0/src/java/davmail/http/SunPKCS11ProviderHandler.java0100644 0000000 0000000 00000006334 14754153500 023246 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.http; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.security.AuthProvider; import java.security.Provider; import java.security.Security; /** * Add the SunPKCS11 Provider. */ public final class SunPKCS11ProviderHandler { private SunPKCS11ProviderHandler() { } /** * Register PKCS11 provider. * * @param pkcs11Config PKCS11 config string */ public static void registerProvider(String pkcs11Config) { Provider p; try { @SuppressWarnings("unchecked") Class sunPkcs11Class = (Class) Class.forName("sun.security.pkcs11.SunPKCS11"); Constructor sunPkcs11Constructor = sunPkcs11Class.getDeclaredConstructor(InputStream.class); p = sunPkcs11Constructor.newInstance(new ByteArrayInputStream(pkcs11Config.getBytes(StandardCharsets.UTF_8))); } catch (NoSuchMethodException e) { // try java 9 configuration p = configurePkcs11Provider(pkcs11Config); } catch (Exception e) { throw new PKCS11ProviderException(buildErrorMessage(e)); } Security.addProvider(p); } private static Provider configurePkcs11Provider(String pkcs11Config) { Provider p; try { p = Security.getProvider("SunPKCS11"); // new Java 9 configure method Method configureMethod = Provider.class.getDeclaredMethod("configure", String.class); configureMethod.invoke(p, "--"+pkcs11Config); } catch (Exception e) { throw new PKCS11ProviderException(buildErrorMessage(e)); } return p; } private static String buildErrorMessage(Exception e) { StringBuilder errorMessage = new StringBuilder("Unable to configure SunPKCS11 provider"); Throwable cause = e.getCause(); while (cause != null) { errorMessage.append(" ").append(cause.getMessage()); cause = cause.getCause(); } return errorMessage.toString(); } static final class PKCS11ProviderException extends RuntimeException { public PKCS11ProviderException(String message) { super(message); } } } davmail-6.3.0/src/java/davmail/http/URIUtil.java0100644 0000000 0000000 00000026174 13445460612 020147 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.net.URLCodec; import org.apache.http.Consts; import java.io.IOException; import java.util.BitSet; /** * Implement encode/decode logic to replace HttpClient 3 URIUtil */ public class URIUtil { /** * The percent "%" character always has the reserved purpose of being the * escape indicator, it must be escaped as "%25" in order to be used as * data within a URI. */ protected static final BitSet percent = new BitSet(256); // Static initializer for percent static { percent.set('%'); } /** * BitSet for digit. *

     * digit    = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
     *            "8" | "9"
     * 

*/ protected static final BitSet digit = new BitSet(256); // Static initializer for digit static { for (int i = '0'; i <= '9'; i++) { digit.set(i); } } /** * BitSet for alpha. *

     * alpha         = lowalpha | upalpha
     * 

*/ protected static final BitSet alpha = new BitSet(256); // Static initializer for alpha static { for (int i = 'a'; i <= 'z'; i++) { alpha.set(i); } for (int i = 'A'; i <= 'Z'; i++) { alpha.set(i); } } /** * BitSet for alphanum (join of alpha & digit). *

     *  alphanum      = alpha | digit
     * 

*/ protected static final BitSet alphanum = new BitSet(256); // Static initializer for alphanum static { alphanum.or(alpha); alphanum.or(digit); } /** * BitSet for hex. *

     * hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" |
     *                         "a" | "b" | "c" | "d" | "e" | "f"
     * 

*/ protected static final BitSet hex = new BitSet(256); // Static initializer for hex static { hex.or(digit); for (int i = 'a'; i <= 'f'; i++) { hex.set(i); } for (int i = 'A'; i <= 'F'; i++) { hex.set(i); } } /** * BitSet for escaped. *

     * escaped       = "%" hex hex
     * 

*/ protected static final BitSet escaped = new BitSet(256); // Static initializer for escaped static { escaped.or(percent); escaped.or(hex); } /** * BitSet for mark. *

     * mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
     *                 "(" | ")"
     * 

*/ protected static final BitSet mark = new BitSet(256); // Static initializer for mark static { mark.set('-'); mark.set('_'); mark.set('.'); mark.set('!'); mark.set('~'); mark.set('*'); mark.set('\''); mark.set('('); mark.set(')'); } /** * Data characters that are allowed in a URI but do not have a reserved * purpose are called unreserved. *

     * unreserved    = alphanum | mark
     * 

*/ protected static final BitSet unreserved = new BitSet(256); // Static initializer for unreserved static { unreserved.or(alphanum); unreserved.or(mark); } /** * BitSet for reserved. *

     * reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
     *                 "$" | ","
     * 

*/ protected static final BitSet reserved = new BitSet(256); // Static initializer for reserved static { reserved.set(';'); reserved.set('/'); reserved.set('?'); reserved.set(':'); reserved.set('@'); reserved.set('&'); reserved.set('='); reserved.set('+'); reserved.set('$'); reserved.set(','); } /** * BitSet for uric. *

     * uric          = reserved | unreserved | escaped
     * 

*/ protected static final BitSet uric = new BitSet(256); // Static initializer for uric static { uric.or(reserved); uric.or(unreserved); uric.or(escaped); } /** * BitSet for pchar. *

     * pchar         = unreserved | escaped |
     *                 ":" | "@" | "&" | "=" | "+" | "$" | ","
     * 

*/ protected static final BitSet pchar = new BitSet(256); // Static initializer for pchar static { pchar.or(unreserved); pchar.or(escaped); pchar.set(':'); pchar.set('@'); pchar.set('&'); pchar.set('='); pchar.set('+'); pchar.set('$'); pchar.set(','); } /** * BitSet for param (alias for pchar). *

     * param         = *pchar
     * 

*/ protected static final BitSet param = pchar; /** * BitSet for segment. *

     * segment       = *pchar *( ";" param )
     * 

*/ protected static final BitSet segment = new BitSet(256); // Static initializer for segment static { segment.or(pchar); segment.set(';'); segment.or(param); } /** * BitSet for path segments. *

     * path_segments = segment *( "/" segment )
     * 

*/ protected static final BitSet path_segments = new BitSet(256); // Static initializer for path_segments static { path_segments.set('/'); path_segments.or(segment); } /** * URI absolute path. *

     * abs_path      = "/"  path_segments
     * 

*/ protected static final BitSet abs_path = new BitSet(256); // Static initializer for abs_path static { abs_path.set('/'); abs_path.or(path_segments); } /** * Those characters that are allowed for the abs_path. */ public static final BitSet allowed_abs_path = new BitSet(256); static { allowed_abs_path.or(abs_path); // allowed_abs_path.set('/'); // aleady included allowed_abs_path.andNot(percent); allowed_abs_path.clear('+'); } /** * Those characters that are allowed for the query component. */ public static final BitSet allowed_query = new BitSet(256); // Static initializer for allowed_query static { allowed_query.or(uric); allowed_query.clear('%'); } /** * Those characters that are allowed within the query component. */ public static final BitSet allowed_within_query = new BitSet(256); // Static initializer for allowed_within_query static { allowed_within_query.or(allowed_query); allowed_within_query.andNot(reserved); // excluded 'reserved' } /** * Decode url encoded string. * @param escaped encoded string * @return decoded string * @throws IOException on error */ public static String decode(String escaped) throws IOException { try { return getString(URLCodec.decodeUrl(getAsciiBytes(escaped))); } catch (DecoderException e) { throw new IOException(e.getMessage()); } } /** * Encode url path. * @param unescaped unencoded path * @return escaped path */ public static String encodePath(String unescaped) { return encode(unescaped, allowed_abs_path); } /** * URL encode string. * @param unescaped unencoded string * @param allowed allowed characters bitset * @return encoded string */ public static String encode(String unescaped, BitSet allowed) { return getAsciiString(URLCodec.encodeUrl(allowed, getBytes(unescaped))); } /** * URL encode query string. * @param unescaped unencoded query string * @return encoded string query string */ public static String encodeWithinQuery(String unescaped) { return encode(unescaped, allowed_within_query); } /** * URL encode path and query string. * @param unescaped unencoded path and query string * @return encoded string path and query string */ public static String encodePathQuery(String unescaped){ int at = unescaped.indexOf('?'); if (at < 0) { return encode(unescaped, allowed_abs_path); } else { return encode(unescaped.substring(0, at), allowed_abs_path) + '?' + encode(unescaped.substring(at + 1), allowed_query); } } public static byte[] getBytes(final String value) { if (value == null) { throw new IllegalArgumentException("Parameter may not be null"); } return value.getBytes(Consts.UTF_8); } public static byte[] getAsciiBytes(final String value) { if (value == null) { throw new IllegalArgumentException("Parameter may not be null"); } return value.getBytes(Consts.ASCII); } /** * Convert byte array to an ASCII string value. * @param bytes byte array * @return ASCII string */ public static String getAsciiString(final byte[] bytes) { if (bytes == null) { throw new IllegalArgumentException("Parameter may not be null"); } return new String(bytes, Consts.ASCII); } /** * Convert byte array to a UTF-8 string value. * @param bytes byte array * @return ASCII string */ public static String getString(final byte[] bytes) { if (bytes == null) { throw new IllegalArgumentException("Parameter may not be null"); } return new String(bytes, Consts.UTF_8); } } davmail-6.3.0/src/java/davmail/http/request/ExchangeDavRequest.java0100644 0000000 0000000 00000026630 14503245213 024057 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import davmail.exchange.XMLStreamUtil; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.AbstractHttpEntity; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.property.DefaultDavProperty; import org.apache.jackrabbit.webdav.xml.Namespace; import org.apache.log4j.Logger; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; public abstract class ExchangeDavRequest extends HttpPost implements ResponseHandler> { protected static final Logger LOGGER = Logger.getLogger(ExchangeDavRequest.class); private static final String XML_CONTENT_TYPE = "text/xml; charset=UTF-8"; private HttpResponse response; private List responses; /** * Create PROPPATCH method. * * @param path path */ public ExchangeDavRequest(String path) { super(path); AbstractHttpEntity httpEntity = new AbstractHttpEntity() { byte[] content; @Override public boolean isRepeatable() { return true; } @Override public long getContentLength() { if (content == null) { content = generateRequestContent(); } return content.length; } @Override public InputStream getContent() throws UnsupportedOperationException { if (content == null) { content = generateRequestContent(); } return new ByteArrayInputStream(content); } @Override public void writeTo(OutputStream outputStream) throws IOException { if (content == null) { content = generateRequestContent(); } outputStream.write(content); } @Override public boolean isStreaming() { return false; } }; httpEntity.setContentType(XML_CONTENT_TYPE); setEntity(httpEntity); } /** * Generate request content from property values. * * @return request content as byte array */ protected abstract byte[] generateRequestContent(); @Override public List handleResponse(HttpResponse response) { this.response = response; Header contentTypeHeader = response.getFirstHeader("Content-Type"); if (contentTypeHeader != null && "text/xml".equals(contentTypeHeader.getValue())) { responses = new ArrayList<>(); XMLStreamReader reader; try { reader = XMLStreamUtil.createXMLStreamReader(new FilterInputStream(response.getEntity().getContent()) { final byte[] lastbytes = new byte[3]; @Override public int read(byte[] bytes, int off, int len) throws IOException { int count = in.read(bytes, off, len); // patch invalid element name for (int i = 0; i < count; i++) { byte currentByte = bytes[off + i]; if ((lastbytes[0] == '<') && (currentByte >= '0' && currentByte <= '9')) { // move invalid first tag char to valid range bytes[off + i] = (byte) (currentByte + 49); } lastbytes[0] = lastbytes[1]; lastbytes[1] = lastbytes[2]; lastbytes[2] = currentByte; } return count; } }); while (reader.hasNext()) { reader.next(); if (XMLStreamUtil.isStartTag(reader, "response")) { handleResponse(reader); } } } catch (IOException | XMLStreamException e) { LOGGER.error("Error while parsing soap response: " + e, e); } } return responses; } protected void handleResponse(XMLStreamReader reader) throws XMLStreamException { MultiStatusResponse multiStatusResponse = null; String href = null; String responseStatus = ""; while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "response")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("href".equals(tagLocalName)) { href = reader.getElementText(); } else if ("status".equals(tagLocalName)) { responseStatus = reader.getElementText(); } else if ("propstat".equals(tagLocalName)) { if (multiStatusResponse == null) { multiStatusResponse = new MultiStatusResponse(href, responseStatus); } handlePropstat(reader, multiStatusResponse); } } } if (multiStatusResponse != null) { responses.add(multiStatusResponse); } } protected void handlePropstat(XMLStreamReader reader, MultiStatusResponse multiStatusResponse) throws XMLStreamException { int propstatStatus = 0; while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "propstat")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagLocalName = reader.getLocalName(); if ("status".equals(tagLocalName)) { if ("HTTP/1.1 200 OK".equals(reader.getElementText())) { propstatStatus = HttpStatus.SC_OK; } else { propstatStatus = 0; } } else if ("prop".equals(tagLocalName) && propstatStatus == HttpStatus.SC_OK) { handleProperty(reader, multiStatusResponse); } } } } protected void handleProperty(XMLStreamReader reader, MultiStatusResponse multiStatusResponse) throws XMLStreamException { while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, "prop")) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { Namespace namespace = Namespace.getNamespace(reader.getNamespaceURI()); String tagLocalName = reader.getLocalName(); if (reader.getAttributeCount() > 0 && "mv.string".equals(reader.getAttributeValue(0))) { handleMultiValuedProperty(reader, multiStatusResponse); } else { String tagContent = getTagContent(reader); if (tagContent != null) { multiStatusResponse.add(new DefaultDavProperty<>(tagLocalName, tagContent, namespace)); } } } } } protected void handleMultiValuedProperty(XMLStreamReader reader, MultiStatusResponse multiStatusResponse) throws XMLStreamException { String tagLocalName = reader.getLocalName(); Namespace namespace = Namespace.getNamespace(reader.getNamespaceURI()); ArrayList values = new ArrayList<>(); while (reader.hasNext() && !XMLStreamUtil.isEndTag(reader, tagLocalName)) { reader.next(); if (XMLStreamUtil.isStartTag(reader)) { String tagContent = getTagContent(reader); if (tagContent != null) { values.add(tagContent); } } } multiStatusResponse.add(new DefaultDavProperty<>(tagLocalName, values, namespace)); } protected String getTagContent(XMLStreamReader reader) throws XMLStreamException { String value = null; String tagLocalName = reader.getLocalName(); while (reader.hasNext() && !((reader.getEventType() == XMLStreamConstants.END_ELEMENT) && tagLocalName.equals(reader.getLocalName()))) { reader.next(); if (reader.getEventType() == XMLStreamConstants.CHARACTERS) { value = reader.getText(); } } // empty tag if (!reader.hasNext()) { throw new XMLStreamException("End element for " + tagLocalName + " not found"); } return value; } /** * Get Multistatus responses. * * @return responses * @throws HttpResponseException on error */ public MultiStatusResponse[] getResponses() throws HttpResponseException { if (responses == null) { // TODO: compare with native HttpClient error handling throw new HttpResponseException(response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase()); } return responses.toArray(new MultiStatusResponse[0]); } /** * Get single Multistatus response. * * @return response * @throws HttpResponseException on error */ public MultiStatusResponse getResponse() throws HttpResponseException { if (responses == null || responses.size() != 1) { throw new HttpResponseException(response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase()); } return responses.get(0); } /** * Return method http status code. * * @return http status code * @throws HttpResponseException on error */ public int getResponseStatusCode() throws HttpResponseException { String responseDescription = getResponse().getResponseDescription(); if ("HTTP/1.1 201 Created".equals(responseDescription)) { return HttpStatus.SC_CREATED; } else { return HttpStatus.SC_OK; } } } davmail-6.3.0/src/java/davmail/http/request/ExchangePropFindRequest.java0100644 0000000 0000000 00000011471 13574116514 025073 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import org.apache.jackrabbit.webdav.header.DepthHeader; import org.apache.jackrabbit.webdav.property.DavPropertyName; import org.apache.jackrabbit.webdav.property.DavPropertyNameIterator; import org.apache.jackrabbit.webdav.property.DavPropertyNameSet; import org.apache.log4j.Logger; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; /** * Custom Exchange PROPFIND method. * Does not load full DOM in memory. */ public class ExchangePropFindRequest extends ExchangeDavRequest { protected static final Logger LOGGER = Logger.getLogger(ExchangePropFindRequest.class); protected final DavPropertyNameSet propertyNameSet; public ExchangePropFindRequest(String uri) { this(uri, null, DepthHeader.DEPTH_INFINITY); } public ExchangePropFindRequest(String uri, DavPropertyNameSet propertyNameSet, int depth) { super(uri); this.propertyNameSet = propertyNameSet; DepthHeader dh = new DepthHeader(depth); setHeader(dh.getHeaderName(), dh.getHeaderValue()); } protected byte[] generateRequestContent() { try { // build namespace map int currentChar = 'e'; final Map nameSpaceMap = new HashMap<>(); nameSpaceMap.put("DAV:", (int) 'D'); if (propertyNameSet != null) { DavPropertyNameIterator propertyNameIterator = propertyNameSet.iterator(); while (propertyNameIterator.hasNext()) { DavPropertyName davPropertyName = propertyNameIterator.nextPropertyName(); davPropertyName.getName(); // property namespace String namespaceUri = davPropertyName.getNamespace().getURI(); if (!nameSpaceMap.containsKey(namespaceUri)) { nameSpaceMap.put(namespaceUri, currentChar++); } } } // ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (OutputStreamWriter writer = new OutputStreamWriter(baos, StandardCharsets.UTF_8)) { writer.write(" mapEntry : nameSpaceMap.entrySet()) { writer.write(" xmlns:"); writer.write((char) mapEntry.getValue().intValue()); writer.write("=\""); writer.write(mapEntry.getKey()); writer.write("\""); } writer.write(">"); if (propertyNameSet == null || propertyNameSet.isEmpty()) { writer.write(""); } else { writer.write(""); DavPropertyNameIterator propertyNameIterator = propertyNameSet.iterator(); while (propertyNameIterator.hasNext()) { DavPropertyName davPropertyName = propertyNameIterator.nextPropertyName(); char nameSpaceChar = (char) nameSpaceMap.get(davPropertyName.getNamespace().getURI()).intValue(); writer.write('<'); writer.write(nameSpaceChar); writer.write(':'); writer.write(davPropertyName.getName()); writer.write("/>"); } writer.write(""); } writer.write(""); } return baos.toByteArray(); } catch (IOException e) { throw new RuntimeException(e); } } @Override public String getMethod() { return "PROPFIND"; } } davmail-6.3.0/src/java/davmail/http/request/ExchangePropPatchRequest.java0100644 0000000 0000000 00000014713 13574116514 025254 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import davmail.exchange.dav.PropertyValue; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.log4j.Logger; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Custom Exchange PROPPATCH method. * Supports extended property update with type. */ public class ExchangePropPatchRequest extends ExchangeDavRequest { protected static final Logger LOGGER = Logger.getLogger(ExchangePropPatchRequest.class); static final String TYPE_NAMESPACE = "urn:schemas-microsoft-com:datatypes"; final Set propertyValues; private StatusLine statusLine; /** * Create PROPPATCH method. * * @param path path * @param propertyValues property values */ public ExchangePropPatchRequest(String path, Set propertyValues) { super(path); this.propertyValues = propertyValues; } @Override protected byte[] generateRequestContent() { try { // build namespace map int currentChar = 'e'; final Map nameSpaceMap = new HashMap<>(); final Set setPropertyValues = new HashSet<>(); final Set deletePropertyValues = new HashSet<>(); for (PropertyValue propertyValue : propertyValues) { // data type namespace if (!nameSpaceMap.containsKey(TYPE_NAMESPACE) && propertyValue.getTypeString() != null) { nameSpaceMap.put(TYPE_NAMESPACE, currentChar++); } // property namespace String namespaceUri = propertyValue.getNamespaceUri(); if (!nameSpaceMap.containsKey(namespaceUri)) { nameSpaceMap.put(namespaceUri, currentChar++); } if (propertyValue.getXmlEncodedValue() == null) { deletePropertyValues.add(propertyValue); } else { setPropertyValues.add(propertyValue); } } ByteArrayOutputStream baos = new ByteArrayOutputStream(); try ( OutputStreamWriter writer = new OutputStreamWriter(baos, StandardCharsets.UTF_8) ) { writer.write(" mapEntry : nameSpaceMap.entrySet()) { writer.write(" xmlns:"); writer.write((char) mapEntry.getValue().intValue()); writer.write("=\""); writer.write(mapEntry.getKey()); writer.write("\""); } writer.write(">"); if (!setPropertyValues.isEmpty()) { writer.write(""); for (PropertyValue propertyValue : setPropertyValues) { String typeString = propertyValue.getTypeString(); char nameSpaceChar = (char) nameSpaceMap.get(propertyValue.getNamespaceUri()).intValue(); writer.write('<'); writer.write(nameSpaceChar); writer.write(':'); writer.write(propertyValue.getName()); if (typeString != null) { writer.write(' '); writer.write(nameSpaceMap.get(TYPE_NAMESPACE)); writer.write(":dt=\""); writer.write(typeString); writer.write("\""); } writer.write('>'); writer.write(propertyValue.getXmlEncodedValue()); writer.write("'); } writer.write(""); } if (!deletePropertyValues.isEmpty()) { writer.write(""); for (PropertyValue propertyValue : deletePropertyValues) { char nameSpaceChar = (char) nameSpaceMap.get(propertyValue.getNamespaceUri()).intValue(); writer.write('<'); writer.write(nameSpaceChar); writer.write(':'); writer.write(propertyValue.getName()); writer.write("/>"); } writer.write(""); } writer.write(""); } return baos.toByteArray(); } catch (IOException e) { throw new RuntimeException(e); } } @Override public String getMethod() { return "PROPPATCH"; } @Override public List handleResponse(HttpResponse response) { this.statusLine = response.getStatusLine(); return super.handleResponse(response); } public StatusLine getStatusLine() { return statusLine; } } davmail-6.3.0/src/java/davmail/http/request/ExchangeSearchRequest.java0100644 0000000 0000000 00000004703 13574116514 024557 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import davmail.util.StringUtil; import org.apache.log4j.Logger; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; /** * Custom Exchange SEARCH method. * Does not load full DOM in memory. */ public class ExchangeSearchRequest extends ExchangeDavRequest { protected static final Logger LOGGER = Logger.getLogger(ExchangeSearchRequest.class); protected final String searchRequest; /** * Create search method. * * @param uri method uri * @param searchRequest Exchange search request */ public ExchangeSearchRequest(String uri, String searchRequest) { super(uri); this.searchRequest = searchRequest; } protected byte[] generateRequestContent() { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (OutputStreamWriter writer = new OutputStreamWriter(baos, StandardCharsets.UTF_8)) { writer.write("\n"); writer.write("\n"); writer.write(" "); writer.write(StringUtil.xmlEncode(searchRequest)); writer.write("\n"); writer.write(""); } return baos.toByteArray(); } catch (IOException e) { throw new RuntimeException(e); } } @Override public String getMethod() { return "SEARCH"; } }davmail-6.3.0/src/java/davmail/http/request/GetRequest.java0100644 0000000 0000000 00000006763 13645663670 022447 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import davmail.http.HttpClientAdapter; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicResponseHandler; import java.io.IOException; import java.net.URI; /** * Http get request with a string response handler. */ public class GetRequest extends HttpGet implements ResponseHandler, ResponseWrapper { private HttpResponse response; private String responseBodyAsString; public GetRequest(final URI uri) { super(uri); } /** * @throws IllegalArgumentException if the uri is invalid. */ public GetRequest(final String uri) { super(uri); } /** * Handle request response and return response as string. * response body is null on redirect * * @param response response object * @return response body as string * @throws IOException on error */ @Override public String handleResponse(HttpResponse response) throws IOException { this.response = response; if (HttpClientAdapter.isRedirect(response)) { return null; } else { responseBodyAsString = new BasicResponseHandler().handleResponse(response); return responseBodyAsString; } } public String getResponseBodyAsString() throws IOException { checkResponse(); if (responseBodyAsString == null) { throw new IOException("No response body available"); } return responseBodyAsString; } public Header getResponseHeader(String name) { checkResponse(); return response.getFirstHeader(name); } /** * Get status code from response. * @return Http status code */ public int getStatusCode() { checkResponse(); return response.getStatusLine().getStatusCode(); } /** * Get reason phrase from response. * @return reason phrase */ public String getReasonPhrase() { checkResponse(); return response.getStatusLine().getReasonPhrase(); } public URI getRedirectLocation() { checkResponse(); return HttpClientAdapter.getRedirectLocation(response); } public HttpResponse getHttpResponse() { return response; } /** * Check if response is available. */ private void checkResponse() { if (response == null) { throw new IllegalStateException("Should execute request first"); } } } davmail-6.3.0/src/java/davmail/http/request/PostRequest.java0100644 0000000 0000000 00000010402 13645663670 022636 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import davmail.http.HttpClientAdapter; import org.apache.http.Consts; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.message.BasicNameValuePair; import java.io.IOException; import java.net.URI; import java.util.ArrayList; /** * Http post request with a string response handler. */ public class PostRequest extends HttpPost implements ResponseHandler, ResponseWrapper { private ArrayList parameters = new ArrayList<>(); private String responseBodyAsString = null; private HttpResponse response; public PostRequest(final URI uri) { super(uri); } public PostRequest(final String url) { super(URI.create(url)); } public void setRequestHeader(String name, String value) { setHeader(name, value); } @Override public HttpEntity getEntity() { return new UrlEncodedFormEntity(parameters, Consts.UTF_8); } @Override public String handleResponse(HttpResponse response) throws IOException { this.response = response; if (HttpClientAdapter.isRedirect(response)) { return null; } else { responseBodyAsString = new BasicResponseHandler().handleResponse(response); return responseBodyAsString; } } public void setParameter(final String name, final String value) { parameters.add(new BasicNameValuePair(name, value)); } public void removeParameter(final String name) { ArrayList toDelete = new ArrayList<>(); for (NameValuePair param: parameters) { if (param.getName().equals(name)) { toDelete.add(param); } } parameters.removeAll(toDelete); } public ArrayList getParameters() { return parameters; } public String getResponseBodyAsString() throws IOException { if (responseBodyAsString == null) { throw new IOException("No response body available"); } return responseBodyAsString; } public Header getResponseHeader(String name) { checkResponse(); return response.getFirstHeader(name); } /** * Get status code from response. * @return Http status code */ public int getStatusCode() { checkResponse(); return response.getStatusLine().getStatusCode(); } /** * Get reason phrase from response. * @return reason phrase */ public String getReasonPhrase() { checkResponse(); return response.getStatusLine().getReasonPhrase(); } public URI getRedirectLocation() { checkResponse(); return HttpClientAdapter.getRedirectLocation(response); } public HttpResponse getHttpResponse() { return response; } /** * Check if response is available. */ private void checkResponse() { if (response == null) { throw new IllegalStateException("Should execute request first"); } } } davmail-6.3.0/src/java/davmail/http/request/ResponseWrapper.java0100644 0000000 0000000 00000002241 13645663670 023501 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import org.apache.http.HttpResponse; import java.io.IOException; import java.net.URI; /** * Http response wrapper. */ public interface ResponseWrapper { URI getURI(); int getStatusCode(); HttpResponse getHttpResponse(); String getResponseBodyAsString() throws IOException; } davmail-6.3.0/src/java/davmail/http/request/RestRequest.java0100644 0000000 0000000 00000011540 13645663670 022632 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http.request; import davmail.http.HttpClientAdapter; import davmail.util.IOUtil; import org.apache.http.Consts; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.AbstractHttpEntity; import org.apache.log4j.Logger; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; /** * Generic Rest request. */ public class RestRequest extends HttpPost implements ResponseHandler { private static final String JSON_CONTENT_TYPE = "application/json; charset=utf-8"; private static final Logger LOGGER = Logger.getLogger(RestRequest.class); private HttpResponse response; private JSONObject jsonBody; public RestRequest(String uri) { super(uri); AbstractHttpEntity httpEntity = new AbstractHttpEntity() { byte[] content; @Override public boolean isRepeatable() { return true; } @Override public long getContentLength() { if (content == null) { content = getJsonContent(); } return content.length; } @Override public InputStream getContent() throws UnsupportedOperationException { if (content == null) { content = getJsonContent(); } return new ByteArrayInputStream(content); } @Override public void writeTo(OutputStream outputStream) throws IOException { if (content == null) { content = getJsonContent(); } outputStream.write(content); } @Override public boolean isStreaming() { return false; } }; httpEntity.setContentType(JSON_CONTENT_TYPE); setEntity(httpEntity); } public RestRequest(String uri, HttpEntity entity) { super(uri); setEntity(entity); } protected byte[] getJsonContent() { return jsonBody.toString().getBytes(Consts.UTF_8); } public void setJsonBody(JSONObject jsonBody) { this.jsonBody = jsonBody; } public void setRequestHeader(String name, String value) { setHeader(name, value); } @Override public JSONObject handleResponse(HttpResponse response) throws IOException { this.response = response; JSONObject jsonResponse; Header contentTypeHeader = response.getFirstHeader("Content-Type"); if (contentTypeHeader != null && JSON_CONTENT_TYPE.equals(contentTypeHeader.getValue())) { try (InputStream inputStream = response.getEntity().getContent()){ if (HttpClientAdapter.isGzipEncoded(response)) { jsonResponse = processResponseStream(new GZIPInputStream(inputStream)); } else { jsonResponse = processResponseStream(inputStream); } } catch (JSONException e) { LOGGER.error("Error while parsing json response: " + e, e); throw new IOException(e.getMessage(), e); } } else { throw new IOException("Invalid response content"); } return jsonResponse; } private JSONObject processResponseStream(InputStream responseBodyAsStream) throws IOException, JSONException { // quick non streaming implementation return new JSONObject(new String(IOUtil.readFully(responseBodyAsStream), StandardCharsets.UTF_8)); } } davmail-6.3.0/src/java/davmail/imap/ImapConnection.java0100644 0000000 0000000 00000332506 14754153500 021525 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.imap; import com.sun.mail.imap.protocol.BASE64MailboxDecoder; import com.sun.mail.imap.protocol.BASE64MailboxEncoder; import davmail.AbstractConnection; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.exception.DavMailException; import davmail.exception.HttpForbiddenException; import davmail.exception.HttpNotFoundException; import davmail.exception.InsufficientStorageException; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.FolderLoadThread; import davmail.exchange.MessageCreateThread; import davmail.exchange.MessageLoadThread; import davmail.ui.tray.DavGatewayTray; import davmail.util.IOUtil; import davmail.util.StringUtil; import org.apache.http.client.HttpResponseException; import org.apache.log4j.Logger; import javax.mail.MessagingException; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimePart; import javax.mail.internet.MimeUtility; import javax.mail.util.SharedByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FilterOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * Dav Gateway IMAP connection implementation. */ public class ImapConnection extends AbstractConnection { private static final Logger LOGGER = Logger.getLogger(ImapConnection.class); protected String baseMailboxPath; ExchangeSession.Folder currentFolder; /** * Initialize the streams and start the thread. * * @param clientSocket IMAP client socket */ public ImapConnection(Socket clientSocket) { super(ImapConnection.class.getSimpleName(), clientSocket, "UTF-8"); } @Override public void run() { final String capabilities; int imapIdleDelay = Settings.getIntProperty("davmail.imapIdleDelay") * 60; if (imapIdleDelay > 0) { capabilities = "CAPABILITY IMAP4REV1 AUTH=LOGIN IDLE MOVE SPECIAL-USE UIDPLUS"; } else { capabilities = "CAPABILITY IMAP4REV1 AUTH=LOGIN MOVE SPECIAL-USE UIDPLUS"; } String line; String commandId = null; ImapTokenizer tokens; try { ExchangeSessionFactory.checkConfig(); sendClient("* OK [" + capabilities + "] IMAP4rev1 DavMail " + DavGateway.getCurrentVersion() + " server ready"); for (; ; ) { line = readClient(); // unable to read line, connection closed ? if (line == null) { break; } tokens = new ImapTokenizer(line); if (tokens.hasMoreTokens()) { commandId = tokens.nextToken(); checkInfiniteLoop(line); if (tokens.hasMoreTokens()) { String command = tokens.nextToken(); if ("LOGOUT".equalsIgnoreCase(command)) { sendClient("* BYE Closing connection"); sendClient(commandId + " OK LOGOUT completed"); break; } if ("capability".equalsIgnoreCase(command)) { sendClient("* " + capabilities); sendClient(commandId + " OK CAPABILITY completed"); } else if ("login".equalsIgnoreCase(command)) { parseCredentials(tokens); // detect shared mailbox access splitUserName(); try { session = ExchangeSessionFactory.getInstance(userName, password); logConnection("LOGON", userName); sendClient(commandId + " OK Authenticated"); state = State.AUTHENTICATED; } catch (Exception e) { logConnection("FAILED", userName); DavGatewayTray.error(e); if (Settings.getBooleanProperty("davmail.enableKerberos")) { sendClient(commandId + " NO LOGIN Kerberos authentication failed"); } else { sendClient(commandId + " NO LOGIN failed"); } state = State.INITIAL; } } else if ("AUTHENTICATE".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { String authenticationMethod = tokens.nextToken(); if ("LOGIN".equalsIgnoreCase(authenticationMethod)) { try { sendClient("+ " + IOUtil.encodeBase64AsString("Username:")); state = State.LOGIN; userName = IOUtil.decodeBase64AsString(readClient()); // detect shared mailbox access splitUserName(); sendClient("+ " + IOUtil.encodeBase64AsString("Password:")); state = State.PASSWORD; password = IOUtil.decodeBase64AsString(readClient()); session = ExchangeSessionFactory.getInstance(userName, password); logConnection("LOGON", userName); sendClient(commandId + " OK Authenticated"); state = State.AUTHENTICATED; } catch (Exception e) { logConnection("FAILED", userName); DavGatewayTray.error(e); sendClient(commandId + " NO LOGIN failed"); state = State.INITIAL; } } else { sendClient(commandId + " NO unsupported authentication method"); } } else { sendClient(commandId + " BAD authentication method required"); } } else { if (state != State.AUTHENTICATED) { sendClient(commandId + " BAD command authentication required"); } else { // check for expired session session = ExchangeSessionFactory.getInstance(session, userName, password); if ("lsub".equalsIgnoreCase(command) || "list".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { String folderContext = buildFolderContext(tokens.nextToken()); if (tokens.hasMoreTokens()) { String folderQuery = folderContext + decodeFolderPath(tokens.nextToken()); String returnOption = getReturnOption(tokens); boolean specialOnly = "SPECIAL-USE".equalsIgnoreCase(returnOption); if (folderQuery.endsWith("%/%") && !"/%/%".equals(folderQuery)) { List folders = session.getSubFolders(folderQuery.substring(0, folderQuery.length() - 3), false, false); for (ExchangeSession.Folder folder : folders) { sendClient("* " + command + " (" + folder.getFlags() + ") \"/\" \"" + encodeFolderPath(folder.folderPath) + '\"'); sendSubFolders(command, folder.folderPath, false, false, specialOnly); } sendClient(commandId + " OK " + command + " completed"); } else if (folderQuery.endsWith("%") || folderQuery.endsWith("*")) { if ("/*".equals(folderQuery) || "/%".equals(folderQuery) || "/%/%".equals(folderQuery)) { folderQuery = folderQuery.substring(1); if ("%/%".equals(folderQuery)) { folderQuery = folderQuery.substring(0, folderQuery.length() - 2); } sendClient("* " + command + " (\\HasChildren) \"/\" \"/public\""); } if ("*%".equals(folderQuery)) { folderQuery = "*"; } boolean wildcard = folderQuery.endsWith("%") && !folderQuery.contains("/") && !folderQuery.equals("%"); boolean recursive = folderQuery.endsWith("*"); sendSubFolders(command, folderQuery.substring(0, folderQuery.length() - 1), recursive, wildcard, specialOnly && !folderQuery.equals("%")); sendClient(commandId + " OK " + command + " completed"); } else { ExchangeSession.Folder folder = null; try { folder = session.getFolder(folderQuery); } catch (HttpForbiddenException e) { // access forbidden, ignore DavGatewayTray.debug(new BundleMessage("LOG_FOLDER_ACCESS_FORBIDDEN", folderQuery)); } catch (HttpNotFoundException e) { // not found, ignore DavGatewayTray.debug(new BundleMessage("LOG_FOLDER_NOT_FOUND", folderQuery)); } catch (HttpResponseException e) { // other errors, ignore DavGatewayTray.debug(new BundleMessage("LOG_FOLDER_ACCESS_ERROR", folderQuery, e.getMessage())); } if (folder != null) { sendClient("* " + command + " (" + folder.getFlags() + ") \"/\" \"" + encodeFolderPath(folder.folderPath) + '\"'); sendClient(commandId + " OK " + command + " completed"); } else { sendClient(commandId + " NO Folder not found"); } } } else { sendClient(commandId + " BAD missing folder argument"); } } else { sendClient(commandId + " BAD missing folder argument"); } } else if ("select".equalsIgnoreCase(command) || "examine".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { @SuppressWarnings({"NonConstantStringShouldBeStringBuffer"}) String folderName = decodeFolderPath(tokens.nextToken()); if (baseMailboxPath != null && !folderName.startsWith("/")) { folderName = baseMailboxPath + folderName; } try { currentFolder = session.getFolder(folderName); if (currentFolder.count() <= 500) { // simple folder load currentFolder.loadMessages(); sendClient("* " + currentFolder.count() + " EXISTS"); } else { // load folder in a separate thread LOGGER.debug("*"); os.write('*'); FolderLoadThread.loadFolder(currentFolder, os); sendClient(" " + currentFolder.count() + " EXISTS"); } sendClient("* " + currentFolder.recent + " RECENT"); sendClient("* OK [UIDVALIDITY 1]"); if (currentFolder.count() == 0) { sendClient("* OK [UIDNEXT 1]"); } else { sendClient("* OK [UIDNEXT " + currentFolder.getUidNext() + ']'); } sendClient("* FLAGS (\\Answered \\Deleted \\Draft \\Flagged \\Seen $Forwarded Junk)"); sendClient("* OK [PERMANENTFLAGS (\\Answered \\Deleted \\Draft \\Flagged \\Seen $Forwarded Junk \\*)]"); if ("select".equalsIgnoreCase(command)) { sendClient(commandId + " OK [READ-WRITE] " + command + " completed"); } else { sendClient(commandId + " OK [READ-ONLY] " + command + " completed"); } } catch (HttpNotFoundException e) { sendClient(commandId + " NO Not found"); } catch (HttpForbiddenException e) { sendClient(commandId + " NO Forbidden"); } } else { sendClient(commandId + " BAD command unrecognized"); } } else if ("expunge".equalsIgnoreCase(command)) { if (expunge(false)) { // need to refresh folder to avoid 404 errors session.refreshFolder(currentFolder); } sendClient(commandId + " OK " + command + " completed"); } else if ("close".equalsIgnoreCase(command)) { expunge(true); // deselect folder currentFolder = null; sendClient(commandId + " OK " + command + " completed"); } else if ("create".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { session.createMessageFolder(decodeFolderPath(tokens.nextToken())); sendClient(commandId + " OK folder created"); } else { sendClient(commandId + " BAD missing create argument"); } } else if ("rename".equalsIgnoreCase(command)) { String folderName = decodeFolderPath(tokens.nextToken()); String targetName = decodeFolderPath(tokens.nextToken()); try { session.moveFolder(folderName, targetName); sendClient(commandId + " OK rename completed"); } catch (HttpResponseException e) { sendClient(commandId + " NO " + e.getMessage()); } } else if ("delete".equalsIgnoreCase(command)) { String folderName = decodeFolderPath(tokens.nextToken()); try { session.deleteFolder(folderName); sendClient(commandId + " OK folder deleted"); } catch (HttpResponseException e) { sendClient(commandId + " NO " + e.getMessage()); } } else if ("uid".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { String subcommand = tokens.nextToken(); if ("fetch".equalsIgnoreCase(subcommand)) { if (currentFolder == null) { sendClient(commandId + " NO no folder selected"); } else { String ranges = tokens.nextToken(); if (ranges == null) { sendClient(commandId + " BAD missing range parameter"); } else { String parameters = null; if (tokens.hasMoreTokens()) { parameters = tokens.nextToken(); } UIDRangeIterator uidRangeIterator = new UIDRangeIterator(currentFolder.messages, ranges); while (uidRangeIterator.hasNext()) { DavGatewayTray.switchIcon(); ExchangeSession.Message message = uidRangeIterator.next(); try { handleFetch(message, uidRangeIterator.currentIndex, parameters); } catch (HttpNotFoundException e) { LOGGER.warn("Ignore missing message " + uidRangeIterator.currentIndex); } catch (SocketException e) { // client closed connection throw e; } catch (IOException e) { DavGatewayTray.log(e); LOGGER.warn("Ignore broken message " + uidRangeIterator.currentIndex + ' ' + e.getMessage()); } } sendClient(commandId + " OK UID FETCH completed"); } } } else if ("search".equalsIgnoreCase(subcommand)) { List uidList = handleSearch(tokens); StringBuilder buffer = new StringBuilder("* SEARCH"); for (long uid : uidList) { buffer.append(' '); buffer.append(uid); } sendClient(buffer.toString()); sendClient(commandId + " OK SEARCH completed"); } else if ("store".equalsIgnoreCase(subcommand)) { UIDRangeIterator uidRangeIterator = new UIDRangeIterator(currentFolder.messages, tokens.nextToken()); String action = tokens.nextToken(); String flags = tokens.nextToken(); handleStore(commandId, uidRangeIterator, action, flags); } else if ("copy".equalsIgnoreCase(subcommand) || "move".equalsIgnoreCase(subcommand)) { try { UIDRangeIterator uidRangeIterator = new UIDRangeIterator(currentFolder.messages, tokens.nextToken()); String targetName = buildFolderContext(tokens.nextToken()); if (!uidRangeIterator.hasNext()) { sendClient(commandId + " NO " + "No message found"); } else { ArrayList messages = new ArrayList<>(); while (uidRangeIterator.hasNext()) { messages.add(uidRangeIterator.next()); } if ("copy".equalsIgnoreCase(subcommand)) { session.copyMessages(messages, targetName); } else { session.moveMessages(messages, targetName); } sendClient(commandId + " OK " + subcommand + " completed"); } } catch (HttpNotFoundException e) { sendClient(commandId + " NO [TRYCREATE] " + e.getMessage()); } catch (HttpResponseException e) { sendClient(commandId + " NO " + e.getMessage()); } } } else { sendClient(commandId + " BAD command unrecognized"); } } else if ("search".equalsIgnoreCase(command)) { if (currentFolder == null) { sendClient(commandId + " NO no folder selected"); } else { List uidList = handleSearch(tokens); if (uidList.isEmpty()) { sendClient("* SEARCH"); } else { int currentIndex = 0; StringBuilder buffer = new StringBuilder("* SEARCH"); for (ExchangeSession.Message message : currentFolder.messages) { currentIndex++; if (uidList.contains(message.getImapUid())) { buffer.append(' '); buffer.append(currentIndex); } } sendClient(buffer.toString()); } sendClient(commandId + " OK SEARCH completed"); } } else if ("fetch".equalsIgnoreCase(command)) { if (currentFolder == null) { sendClient(commandId + " NO no folder selected"); } else { RangeIterator rangeIterator = new RangeIterator(currentFolder.messages, tokens.nextToken()); String parameters = null; if (tokens.hasMoreTokens()) { parameters = tokens.nextToken(); } while (rangeIterator.hasNext()) { DavGatewayTray.switchIcon(); ExchangeSession.Message message = rangeIterator.next(); try { handleFetch(message, rangeIterator.currentIndex, parameters); } catch (HttpNotFoundException e) { LOGGER.warn("Ignore missing message " + rangeIterator.currentIndex); } catch (SocketException e) { // client closed connection, rethrow exception throw e; } catch (IOException e) { DavGatewayTray.log(e); LOGGER.warn("Ignore broken message " + rangeIterator.currentIndex + ' ' + e.getMessage()); } } sendClient(commandId + " OK FETCH completed"); } } else if ("store".equalsIgnoreCase(command)) { RangeIterator rangeIterator = new RangeIterator(currentFolder.messages, tokens.nextToken()); String action = tokens.nextToken(); String flags = tokens.nextToken(); handleStore(commandId, rangeIterator, action, flags); } else if ("copy".equalsIgnoreCase(command) || "move".equalsIgnoreCase(command)) { try { RangeIterator rangeIterator = new RangeIterator(currentFolder.messages, tokens.nextToken()); String targetName = decodeFolderPath(tokens.nextToken()); if (!rangeIterator.hasNext()) { sendClient(commandId + " NO " + "No message found"); } else { while (rangeIterator.hasNext()) { DavGatewayTray.switchIcon(); ExchangeSession.Message message = rangeIterator.next(); if ("copy".equalsIgnoreCase(command)) { session.copyMessage(message, targetName); } else { session.moveMessage(message, targetName); } } sendClient(commandId + " OK " + command + " completed"); } } catch (HttpResponseException e) { sendClient(commandId + " NO " + e.getMessage()); } } else if ("append".equalsIgnoreCase(command)) { String folderName = decodeFolderPath(tokens.nextToken()); HashMap properties = new HashMap<>(); String flags = null; String date = null; // handle optional flags String nextToken = tokens.nextQuotedToken(); if (nextToken.startsWith("(")) { flags = StringUtil.removeQuotes(nextToken); if (tokens.hasMoreTokens()) { nextToken = tokens.nextToken(); if (tokens.hasMoreTokens()) { date = nextToken; nextToken = tokens.nextToken(); } } } else if (tokens.hasMoreTokens()) { date = StringUtil.removeQuotes(nextToken); nextToken = tokens.nextToken(); } if (flags != null) { HashSet keywords = null; // parse flags, on create read and draft flags are on the // same messageFlags property, 8 means draft and 1 means read ImapTokenizer flagtokenizer = new ImapTokenizer(flags); while (flagtokenizer.hasMoreTokens()) { String flag = flagtokenizer.nextToken(); if ("\\Seen".equalsIgnoreCase(flag)) { if (properties.containsKey("draft")) { // draft message, add read flag properties.put("draft", "9"); } else { // not (yet) draft, set read flag properties.put("draft", "1"); } } else if ("\\Flagged".equalsIgnoreCase(flag)) { properties.put("flagged", "2"); } else if ("\\Answered".equalsIgnoreCase(flag)) { properties.put("answered", "102"); } else if ("$Forwarded".equalsIgnoreCase(flag)) { properties.put("forwarded", "104"); } else if ("\\Draft".equalsIgnoreCase(flag)) { if (properties.containsKey("draft")) { // read message, add draft flag properties.put("draft", "9"); } else { // not (yet) read, set draft flag properties.put("draft", "8"); } } else if ("Junk".equalsIgnoreCase(flag)) { properties.put("junk", "1"); } else { if (keywords == null) { keywords = new HashSet<>(); } keywords.add(flag); } } if (keywords != null) { properties.put("keywords", session.convertFlagsToKeywords(keywords)); } } else { // no flags, force not draft and unread properties.put("draft", "0"); } // handle optional date if (date != null) { SimpleDateFormat dateParser = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss Z", Locale.ENGLISH); Date dateReceived = dateParser.parse(date); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); dateFormatter.setTimeZone(ExchangeSession.GMT_TIMEZONE); properties.put("datereceived", dateFormatter.format(dateReceived)); } int size = Integer.parseInt(StringUtil.removeQuotes(nextToken)); sendClient("+ send literal data"); byte[] buffer = in.readContent(size); // empty line readClient(); MimeMessage mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(buffer)); String messageName = UUID.randomUUID().toString() + ".EML"; try { ExchangeSession.Message createdMessage = MessageCreateThread.createMessage(session, folderName, messageName, properties, mimeMessage, os, capabilities); if (createdMessage != null) { long uid = createdMessage.getImapUid(); sendClient(commandId + " OK [APPENDUID 1 "+uid+"] APPEND completed"); } else { sendClient(commandId + " OK APPEND completed"); } } catch (InsufficientStorageException e) { sendClient(commandId + " NO " + e.getMessage()); } } else if ("idle".equalsIgnoreCase(command) && imapIdleDelay > 0) { if (currentFolder != null) { sendClient("+ idling "); // clear cache before going to idle mode currentFolder.clearCache(); DavGatewayTray.resetIcon(); int originalTimeout = client.getSoTimeout(); try { int count = 0; client.setSoTimeout(1000); while (in.available() == 0) { if (++count >= imapIdleDelay) { count = 0; TreeMap previousImapFlagMap = currentFolder.getImapFlagMap(); if (session.refreshFolder(currentFolder)) { handleRefresh(previousImapFlagMap, currentFolder.getImapFlagMap()); } } // wait for input 1 second try { byte[] byteBuffer = new byte[1]; if (in.read(byteBuffer) > 0) { in.unread(byteBuffer); } } catch (SocketTimeoutException e) { // ignore, read timed out } } // read DONE line line = readClient(); if ("DONE".equals(line)) { sendClient(commandId + " OK " + command + " terminated"); } else { sendClient(commandId + " BAD command unrecognized"); } } catch (IOException e) { // client connection closed throw new SocketException(e.getMessage()); } finally { client.setSoTimeout(originalTimeout); } } else { sendClient(commandId + " NO no folder selected"); } } else if ("noop".equalsIgnoreCase(command) || "check".equalsIgnoreCase(command)) { if (currentFolder != null) { DavGatewayTray.debug(new BundleMessage("LOG_IMAP_COMMAND", command, currentFolder.folderPath)); TreeMap previousImapFlagMap = currentFolder.getImapFlagMap(); if (session.refreshFolder(currentFolder)) { handleRefresh(previousImapFlagMap, currentFolder.getImapFlagMap()); } } sendClient(commandId + " OK " + command + " completed"); } else if ("subscribe".equalsIgnoreCase(command) || "unsubscribe".equalsIgnoreCase(command)) { sendClient(commandId + " OK " + command + " completed"); } else if ("status".equalsIgnoreCase(command)) { try { String encodedFolderName = tokens.nextToken(); String folderName = decodeFolderPath(encodedFolderName); ExchangeSession.Folder folder = session.getFolder(folderName); // must retrieve messages // use folder.loadMessages() for small folders only LOGGER.debug("*"); os.write('*'); if (folder.count() <= 500) { // simple folder load folder.loadMessages(); } else { // load folder in a separate thread FolderLoadThread.loadFolder(folder, os); } String parameters = tokens.nextToken(); StringBuilder answer = new StringBuilder(); ImapTokenizer parametersTokens = new ImapTokenizer(parameters); while (parametersTokens.hasMoreTokens()) { String token = parametersTokens.nextToken(); if ("MESSAGES".equalsIgnoreCase(token)) { answer.append("MESSAGES ").append(folder.count()).append(' '); } if ("RECENT".equalsIgnoreCase(token)) { answer.append("RECENT ").append(folder.recent).append(' '); } if ("UIDNEXT".equalsIgnoreCase(token)) { if (folder.count() == 0) { answer.append("UIDNEXT 1 "); } else { if (folder.count() == 0) { answer.append("UIDNEXT 1 "); } else { answer.append("UIDNEXT ").append(folder.getUidNext()).append(' '); } } } if ("UIDVALIDITY".equalsIgnoreCase(token)) { answer.append("UIDVALIDITY 1 "); } if ("UNSEEN".equalsIgnoreCase(token)) { answer.append("UNSEEN ").append(folder.unreadCount).append(' '); } } sendClient(" STATUS \"" + encodedFolderName + "\" (" + answer.toString().trim() + ')'); sendClient(commandId + " OK " + command + " completed"); } catch (HttpResponseException e) { sendClient(commandId + " NO folder not found"); } } else { sendClient(commandId + " BAD command unrecognized"); } } } } else { sendClient(commandId + " BAD missing command"); } } else { sendClient("BAD Null command"); } DavGatewayTray.resetIcon(); } os.flush(); } catch (SocketTimeoutException e) { DavGatewayTray.debug(new BundleMessage("LOG_CLOSE_CONNECTION_ON_TIMEOUT")); try { sendClient("* BYE Closing connection"); } catch (IOException e1) { DavGatewayTray.debug(new BundleMessage("LOG_EXCEPTION_CLOSING_CONNECTION_ON_TIMEOUT")); } } catch (SocketException e) { LOGGER.warn(BundleMessage.formatLog("LOG_CLIENT_CLOSED_CONNECTION")); } catch (Exception e) { DavGatewayTray.log(e); try { String message = ((e.getMessage() == null) ? e.toString() : e.getMessage()).replaceAll("\\n", " "); if (commandId != null) { sendClient(commandId + " BAD unable to handle request: " + message); } else { sendClient("* BAD unable to handle request: " + message); } } catch (IOException e2) { DavGatewayTray.warn(new BundleMessage("LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT"), e2); } } finally { close(); } DavGatewayTray.resetIcon(); } private String getReturnOption(ImapTokenizer tokens) { if (tokens.hasMoreTokens()) { if ("RETURN".equalsIgnoreCase(tokens.nextToken()) && tokens.hasMoreTokens()) { return tokens.nextToken(); } } return null; } protected String lastCommand; protected int lastCommandCount; /** * Detect infinite loop on the client side. * * @param line IMAP command line * @throws IOException on infinite loop */ protected void checkInfiniteLoop(String line) throws IOException { int spaceIndex = line.indexOf(' '); if (spaceIndex < 0) { // invalid command line, reset lastCommand = null; lastCommandCount = 0; } else { String command = line.substring(spaceIndex + 1); if (command.equals(lastCommand)) { lastCommandCount++; if (lastCommandCount > 100 && !"NOOP".equalsIgnoreCase(lastCommand) && !"IDLE".equalsIgnoreCase(lastCommand)) { // more than a hundred times the same command => this is a client infinite loop, close connection throw new IOException("Infinite loop on command " + command + " detected"); } } else { // new command, reset lastCommand = command; lastCommandCount = 0; } } } /** * Detect shared mailbox access. * see Connecting to a Microsoft Exchange Server with Thunderbird */ protected void splitUserName() { String[] tokens = null; if (userName.indexOf('/') >= 0) { tokens = userName.split("/"); } else if (userName.indexOf('\\') >= 0) { tokens = userName.split("\\\\"); } if (tokens != null && tokens.length == 3) { userName = tokens[0] + '\\' + tokens[1]; baseMailboxPath = "/users/" + tokens[2] + '/'; } else if (tokens != null && tokens.length == 2 && tokens[1].contains("@")) { userName = tokens[0]; baseMailboxPath = "/users/" + tokens[1] + '/'; } } protected String encodeFolderPath(String folderPath) { return BASE64MailboxEncoder.encode(folderPath).replaceAll("\"", "\\\\\""); } protected String decodeFolderPath(String folderPath) { return BASE64MailboxDecoder.decode(folderPath) //unescape quotes inside value .replaceAll("\\\\", ""); } protected String buildFolderContext(String folderToken) { if (baseMailboxPath == null) { return decodeFolderPath(folderToken); } else { return baseMailboxPath + decodeFolderPath(folderToken); } } /** * Send expunge untagged response for removed IMAP message uids. * * @param previousImapFlagMap uid map before refresh * @param imapFlagMap uid map after refresh * @throws IOException on error */ private void handleRefresh(TreeMap previousImapFlagMap, TreeMap imapFlagMap) throws IOException { // send deleted message expunge notification int index = 1; for (long previousImapUid : previousImapFlagMap.keySet()) { if (!imapFlagMap.containsKey(previousImapUid)) { sendClient("* " + index + " EXPUNGE"); } else { // send updated flags if (!previousImapFlagMap.get(previousImapUid).equals(imapFlagMap.get(previousImapUid))) { sendClient("* " + index + " FETCH (UID " + previousImapUid + " FLAGS (" + imapFlagMap.get(previousImapUid) + "))"); } index++; } } sendClient("* " + currentFolder.count() + " EXISTS"); sendClient("* " + currentFolder.recent + " RECENT"); } static protected class MessageWrapper { protected OutputStream os; protected StringBuilder buffer; protected ExchangeSession.Message message; protected MessageWrapper(OutputStream os, StringBuilder buffer, ExchangeSession.Message message) { this.os = os; this.buffer = buffer; this.message = message; } public int getMimeMessageSize() throws IOException, MessagingException { loadMessage(); return message.getMimeMessageSize(); } /** * Monitor full message download */ protected void loadMessage() throws IOException, MessagingException { if (!message.isLoaded()) { // flush current buffer String flushString = buffer.toString(); LOGGER.debug(flushString); os.write(flushString.getBytes(StandardCharsets.UTF_8)); buffer.setLength(0); MessageLoadThread.loadMimeMessage(message, os); } } public MimeMessage getMimeMessage() throws IOException, MessagingException { loadMessage(); return message.getMimeMessage(); } public InputStream getRawInputStream() throws IOException, MessagingException { loadMessage(); return message.getRawInputStream(); } public Enumeration getMatchingHeaderLines(String[] requestedHeaders) throws IOException, MessagingException { Enumeration result = message.getMatchingHeaderLinesFromHeaders(requestedHeaders); if (result == null) { loadMessage(); result = message.getMatchingHeaderLines(requestedHeaders); } return result; } } private void handleFetch(ExchangeSession.Message message, int currentIndex, String parameters) throws IOException, MessagingException { StringBuilder buffer = new StringBuilder(); MessageWrapper messageWrapper = new MessageWrapper(os, buffer, message); buffer.append("* ").append(currentIndex).append(" FETCH (UID ").append(message.getImapUid()); if (parameters != null) { parameters = handleFetchMacro(parameters); ImapTokenizer paramTokens = new ImapTokenizer(parameters); while (paramTokens.hasMoreTokens()) { @SuppressWarnings({"NonConstantStringShouldBeStringBuffer"}) String param = paramTokens.nextToken().toUpperCase(); if ("FLAGS".equals(param)) { buffer.append(" FLAGS (").append(message.getImapFlags()).append(')'); } else if ("RFC822.SIZE".equals(param)) { int size; if ((parameters.contains("BODY.PEEK[HEADER.FIELDS (") // exclude mutt header request && !parameters.contains("X-LABEL")) || parameters.equals("RFC822.SIZE RFC822.HEADER FLAGS") // icedove || Settings.getBooleanProperty("davmail.imapAlwaysApproxMsgSize")) { // Send approximate size size = message.size; LOGGER.debug(String.format("Message %s sent approximate size %d bytes", message.getImapUid(), size)); } else { size = messageWrapper.getMimeMessageSize(); } buffer.append(" RFC822.SIZE ").append(size); } else if ("ENVELOPE".equals(param)) { appendEnvelope(buffer, messageWrapper); } else if ("BODYSTRUCTURE".equals(param)) { appendBodyStructure(buffer, messageWrapper); } else if ("INTERNALDATE".equals(param) && message.date != null && !message.date.isEmpty()) { try { SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); dateParser.setTimeZone(ExchangeSession.GMT_TIMEZONE); Date date = ExchangeSession.getZuluDateFormat().parse(message.date); SimpleDateFormat dateFormatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss Z", Locale.ENGLISH); buffer.append(" INTERNALDATE \"").append(dateFormatter.format(date)).append('\"'); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_DATE", message.date); } } else if ("RFC822".equals(param) || param.startsWith("BODY[") || param.startsWith("BODY.PEEK[") || "RFC822.HEADER".equals(param) || "RFC822.TEXT".equals(param)) { if (param.startsWith("BODY[") && !message.read) { // According to IMAP RFC: The \Seen flag is implicitly set updateFlags(message, "FLAGS", "\\Seen"); message.read = true; } // get full param if (param.indexOf('[') >= 0) { StringBuilder paramBuffer = new StringBuilder(param); while (paramTokens.hasMoreTokens() && paramBuffer.indexOf("]") < 0) { paramBuffer.append(' ').append(paramTokens.nextToken()); } param = paramBuffer.toString(); } // parse buffer size int startIndex = 0; int maxSize = Integer.MAX_VALUE; int ltIndex = param.indexOf('<'); if (ltIndex >= 0) { int dotIndex = param.indexOf('.', ltIndex); if (dotIndex >= 0) { startIndex = Integer.parseInt(param.substring(ltIndex + 1, dotIndex)); maxSize = Integer.parseInt(param.substring(dotIndex + 1, param.indexOf('>'))); } } ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream partInputStream = null; OutputStream partOutputStream = null; // try to parse message part index String partIndexString = StringUtil.getToken(param, "[", "]"); if ((partIndexString == null || partIndexString.isEmpty()) && !"RFC822.HEADER".equals(param)) { // write message with headers partOutputStream = new PartialOutputStream(baos, startIndex, maxSize); partInputStream = messageWrapper.getRawInputStream(); } else if ("TEXT".equals(partIndexString)) { // write message without headers partOutputStream = new PartOutputStream(baos, false, true, startIndex, maxSize); partInputStream = messageWrapper.getRawInputStream(); } else if ("RFC822.HEADER".equals(param) || (partIndexString != null && partIndexString.startsWith("HEADER"))) { // Header requested fetch headers String[] requestedHeaders = getRequestedHeaders(partIndexString); // OSX Lion special flags request if (requestedHeaders != null && requestedHeaders.length == 1 && "content-class".equals(requestedHeaders[0]) && message.contentClass != null) { baos.write("Content-class: ".getBytes(StandardCharsets.UTF_8)); baos.write(message.contentClass.getBytes(StandardCharsets.UTF_8)); baos.write(13); baos.write(10); } else if (requestedHeaders == null) { // load message and write all headers partOutputStream = new PartOutputStream(baos, true, false, startIndex, maxSize); partInputStream = messageWrapper.getRawInputStream(); } else { Enumeration headerEnumeration = messageWrapper.getMatchingHeaderLines(requestedHeaders); while (headerEnumeration.hasMoreElements()) { baos.write(((String) headerEnumeration.nextElement()).getBytes(StandardCharsets.UTF_8)); baos.write(13); baos.write(10); } } } else if (partIndexString != null) { MimePart bodyPart = messageWrapper.getMimeMessage(); String[] partIndexStrings = partIndexString.split("\\."); for (String subPartIndexString : partIndexStrings) { // ignore MIME subpart index, will return full part if ("MIME".equals(subPartIndexString)) { break; } int subPartIndex; // try to parse part index try { subPartIndex = Integer.parseInt(subPartIndexString); } catch (NumberFormatException e) { throw new DavMailException("EXCEPTION_INVALID_PARAMETER", param); } Object mimeBody = bodyPart.getContent(); if (mimeBody instanceof MimeMultipart) { MimeMultipart multiPart = (MimeMultipart) mimeBody; if (subPartIndex - 1 < multiPart.getCount()) { bodyPart = (MimePart) multiPart.getBodyPart(subPartIndex - 1); } else { throw new DavMailException("EXCEPTION_INVALID_PARAMETER", param); } } else if (subPartIndex != 1) { throw new DavMailException("EXCEPTION_INVALID_PARAMETER", param); } } // write selected part, without headers partOutputStream = new PartialOutputStream(baos, startIndex, maxSize); if (bodyPart instanceof MimeMessage) { partInputStream = ((MimeMessage) bodyPart).getRawInputStream(); } else { partInputStream = ((MimeBodyPart) bodyPart).getRawInputStream(); } } // copy selected content to baos if (partInputStream != null && partOutputStream != null) { IOUtil.write(partInputStream, partOutputStream); partInputStream.close(); partOutputStream.close(); } baos.close(); if ("RFC822".equals(param)) { buffer.append(" RFC822"); } else if ("RFC822.HEADER".equals(param)) { buffer.append(" RFC822.HEADER"); } else if ("RFC822.TEXT".equals(param)) { buffer.append(" RFC822.TEXT"); } else { buffer.append(" BODY["); if (partIndexString != null) { buffer.append(partIndexString); } buffer.append(']'); } // partial if (startIndex > 0 || maxSize != Integer.MAX_VALUE) { buffer.append('<').append(startIndex).append('>'); } buffer.append(" {").append(baos.size()).append('}'); sendClient(buffer.toString()); // log content if less than 2K if (LOGGER.isDebugEnabled() && baos.size() < 2048) { LOGGER.debug(new String(baos.toByteArray(), StandardCharsets.UTF_8)); } os.write(baos.toByteArray()); os.flush(); buffer.setLength(0); } } } buffer.append(')'); sendClient(buffer.toString()); // do not keep message content in memory message.dropMimeMessage(); } /** * Handle flags macro in fetch requests * @param parameters input fetch flags * @return transformed fetch flags */ private String handleFetchMacro(String parameters) { if ("ALL".equals(parameters)) { return "FLAGS INTERNALDATE RFC822.SIZE ENVELOPE"; } else if ("FAST".equals(parameters)) { return "FLAGS INTERNALDATE RFC822.SIZE"; } else if ("FULL".equals(parameters)) { return "FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODY"; } else { return parameters; } } protected String[] getRequestedHeaders(String partIndexString) { if (partIndexString == null) { return null; } else { int startIndex = partIndexString.indexOf('('); int endIndex = partIndexString.indexOf(')'); if (startIndex >= 0 && endIndex >= 0) { return partIndexString.substring(startIndex + 1, endIndex).split(" "); } else { return null; } } } protected void handleStore(String commandId, AbstractRangeIterator rangeIterator, String action, String flags) throws IOException { while (rangeIterator.hasNext()) { DavGatewayTray.switchIcon(); ExchangeSession.Message message = rangeIterator.next(); updateFlags(message, action, flags); sendClient("* " + (rangeIterator.getCurrentIndex()) + " FETCH (UID " + message.getImapUid() + " FLAGS (" + (message.getImapFlags()) + "))"); } // auto expunge if (Settings.getBooleanProperty("davmail.imapAutoExpunge")) { if (expunge(false)) { session.refreshFolder(currentFolder); } } sendClient(commandId + " OK STORE completed"); } protected ExchangeSession.Condition buildConditions(SearchConditions conditions, ImapTokenizer tokens) throws IOException { ExchangeSession.MultiCondition condition = null; while (tokens.hasMoreTokens()) { String token = tokens.nextQuotedToken().toUpperCase(); if (token.startsWith("(") && token.endsWith(")")) { // quoted search param if (condition == null) { condition = session.and(); } condition.add(buildConditions(conditions, new ImapTokenizer(token.substring(1, token.length() - 1)))); } else if ("OR".equals(token)) { condition = session.or(); } else if (token.startsWith("OR ")) { condition = appendOrSearchParams(token, conditions); } else if ("CHARSET".equals(token)) { String charset = tokens.nextToken().toUpperCase(); if (!("ASCII".equals(charset) || "UTF-8".equals(charset) || "US-ASCII".equals(charset))) { throw new IOException("Unsupported charset " + charset); } } else { if (condition == null) { condition = session.and(); } condition.add(appendSearchParam(tokens, token, conditions)); } } return condition; } protected List handleSearch(ImapTokenizer tokens) throws IOException { List uidList = new ArrayList<>(); List localMessagesUidList = null; SearchConditions conditions = new SearchConditions(); ExchangeSession.Condition condition = buildConditions(conditions, tokens); session.refreshFolder(currentFolder); ExchangeSession.MessageList localMessages = currentFolder.searchMessages(condition); Iterator iterator; if (conditions.uidRange != null) { iterator = new UIDRangeIterator(localMessages, conditions.uidRange); } else if (conditions.indexRange != null) { // range iterator is on folder messages, not messages returned from search iterator = new RangeIterator(currentFolder.messages, conditions.indexRange); localMessagesUidList = new ArrayList<>(); // build search result uid list for (ExchangeSession.Message message : localMessages) { localMessagesUidList.add(message.getImapUid()); } } else { iterator = localMessages.iterator(); } while (iterator.hasNext()) { ExchangeSession.Message message = iterator.next(); if ((conditions.flagged == null || message.flagged == conditions.flagged) && (conditions.answered == null || message.answered == conditions.answered) && (conditions.draft == null || message.draft == conditions.draft) // range iterator: include messages available in search result && (localMessagesUidList == null || localMessagesUidList.contains(message.getImapUid())) && isNotExcluded(conditions.notUidRange, message.getImapUid())) { uidList.add(message.getImapUid()); } } return uidList; } /** * Check NOT UID condition. * * @param notUidRange excluded uid range * @param imapUid current message imap uid * @return true if not excluded */ private boolean isNotExcluded(String notUidRange, long imapUid) { if (notUidRange == null) { return true; } String imapUidAsString = String.valueOf(imapUid); for (String rangeValue : notUidRange.split(",")) { if (imapUidAsString.equals(rangeValue)) { return false; } } return true; } protected void appendEnvelope(StringBuilder buffer, MessageWrapper message) throws IOException { try { MimeMessage mimeMessage = message.getMimeMessage(); buffer.append(" ENVELOPE "); appendEnvelope(buffer, mimeMessage); } catch (MessagingException me) { DavGatewayTray.warn(me); // send fake envelope buffer.append(" ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)"); } } private void appendEnvelope(StringBuilder buffer, MimePart mimePart) throws UnsupportedEncodingException, MessagingException { buffer.append('('); // Envelope for date, subject, from, sender, reply-to, to, cc, bcc,in-reply-to, message-id appendEnvelopeHeader(buffer, mimePart.getHeader("Date")); appendEnvelopeHeader(buffer, mimePart.getHeader("Subject")); appendMailEnvelopeHeader(buffer, mimePart.getHeader("From")); appendMailEnvelopeHeader(buffer, mimePart.getHeader("Sender")); appendMailEnvelopeHeader(buffer, mimePart.getHeader("Reply-To")); appendMailEnvelopeHeader(buffer, mimePart.getHeader("To")); appendMailEnvelopeHeader(buffer, mimePart.getHeader("CC")); appendMailEnvelopeHeader(buffer, mimePart.getHeader("BCC")); appendEnvelopeHeader(buffer, mimePart.getHeader("In-Reply-To")); appendEnvelopeHeader(buffer, mimePart.getHeader("Message-Id")); buffer.append(')'); } protected void appendEnvelopeHeader(StringBuilder buffer, String[] value) throws UnsupportedEncodingException { if (buffer.charAt(buffer.length() - 1) != '(') { buffer.append(' '); } if (value != null && value.length > 0) { appendEnvelopeHeaderValue(buffer, MimeUtility.unfold(value[0])); } else { buffer.append("NIL"); } } protected void appendMailEnvelopeHeader(StringBuilder buffer, String[] value) { buffer.append(' '); if (value != null && value.length > 0) { try { String unfoldedValue = MimeUtility.unfold(value[0]); InternetAddress[] addresses = InternetAddress.parseHeader(unfoldedValue, false); if (addresses.length > 0) { buffer.append('('); for (InternetAddress address : addresses) { buffer.append('('); String personal = address.getPersonal(); if (personal != null) { appendEnvelopeHeaderValue(buffer, personal); } else { buffer.append("NIL"); } buffer.append(" NIL "); String mail = address.getAddress(); int atIndex = mail.indexOf('@'); if (atIndex >= 0) { buffer.append('"').append(mail, 0, atIndex).append('"'); buffer.append(' '); buffer.append('"').append(mail.substring(atIndex + 1)).append('"'); } else { buffer.append("NIL NIL"); } buffer.append(')'); } buffer.append(')'); } else { buffer.append("NIL"); } } catch (AddressException | UnsupportedEncodingException e) { DavGatewayTray.warn(e); buffer.append("NIL"); } } else { buffer.append("NIL"); } } protected void appendEnvelopeHeaderValue(StringBuilder buffer, String value) throws UnsupportedEncodingException { if (value.indexOf('"') >= 0 || value.indexOf('\\') >= 0) { buffer.append('{'); buffer.append(value.length()); buffer.append("}\r\n"); buffer.append(value); } else { buffer.append('"'); buffer.append(MimeUtility.encodeText(value, "UTF-8", null)); buffer.append('"'); } } protected void appendBodyStructure(StringBuilder buffer, MessageWrapper message) throws IOException { buffer.append(" BODYSTRUCTURE "); try { MimeMessage mimeMessage = message.getMimeMessage(); Object mimeBody = mimeMessage.getContent(); if (mimeBody instanceof MimeMultipart) { appendBodyStructure(buffer, (MimeMultipart) mimeBody); } else { // no multipart, single body appendBodyStructure(buffer, mimeMessage); } } catch (UnsupportedEncodingException | MessagingException e) { DavGatewayTray.warn(e); // failover: send default bodystructure buffer.append("(\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 0 0)"); } } protected void appendBodyStructure(StringBuilder buffer, MimeMultipart multiPart) throws IOException, MessagingException { buffer.append('('); for (int i = 0; i < multiPart.getCount(); i++) { MimeBodyPart bodyPart = (MimeBodyPart) multiPart.getBodyPart(i); try { Object mimeBody = bodyPart.getContent(); if (mimeBody instanceof MimeMultipart) { appendBodyStructure(buffer, (MimeMultipart) mimeBody); } else { // no multipart, single body appendBodyStructure(buffer, bodyPart); } } catch (UnsupportedEncodingException e) { LOGGER.warn(e); // failover: send default bodystructure buffer.append("(\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 0 0)"); } catch (MessagingException me) { DavGatewayTray.warn(me); // failover: send default bodystructure buffer.append("(\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 0 0)"); } } int slashIndex = multiPart.getContentType().indexOf('/'); if (slashIndex < 0) { throw new DavMailException("EXCEPTION_INVALID_CONTENT_TYPE", multiPart.getContentType()); } int semiColonIndex = multiPart.getContentType().indexOf(';'); if (semiColonIndex < 0) { buffer.append(" \"").append(multiPart.getContentType().substring(slashIndex + 1).toUpperCase()).append("\")"); } else { buffer.append(" \"").append(multiPart.getContentType().substring(slashIndex + 1, semiColonIndex).trim().toUpperCase()).append("\")"); } } protected void appendBodyStructure(StringBuilder buffer, MimePart bodyPart) throws IOException, MessagingException { String contentType = MimeUtility.unfold(bodyPart.getContentType()); int slashIndex = contentType.indexOf('/'); if (slashIndex < 0) { throw new DavMailException("EXCEPTION_INVALID_CONTENT_TYPE", contentType); } String type = contentType.substring(0, slashIndex).toUpperCase(); buffer.append("(\"").append(type).append("\" \""); int semiColonIndex = contentType.indexOf(';'); if (semiColonIndex < 0) { buffer.append(contentType.substring(slashIndex + 1).toUpperCase()).append("\" NIL"); } else { // extended content type buffer.append(contentType.substring(slashIndex + 1, semiColonIndex).trim().toUpperCase()).append('\"'); int charsetindex = contentType.indexOf("charset="); int nameindex = contentType.indexOf("name="); if (charsetindex >= 0 || nameindex >= 0) { buffer.append(" ("); if (charsetindex >= 0) { buffer.append("\"CHARSET\" "); int charsetSemiColonIndex = contentType.indexOf(';', charsetindex); int charsetEndIndex; if (charsetSemiColonIndex > 0) { charsetEndIndex = charsetSemiColonIndex; } else { charsetEndIndex = contentType.length(); } String charSet = contentType.substring(charsetindex + "charset=".length(), charsetEndIndex); if (!charSet.startsWith("\"")) { buffer.append('"'); } buffer.append(charSet.trim().toUpperCase()); if (!charSet.endsWith("\"")) { buffer.append('"'); } } if (nameindex >= 0) { if (charsetindex >= 0) { buffer.append(' '); } buffer.append("\"NAME\" "); int nameSemiColonIndex = contentType.indexOf(';', nameindex); int nameEndIndex; if (nameSemiColonIndex > 0) { nameEndIndex = nameSemiColonIndex; } else { nameEndIndex = contentType.length(); } String name = contentType.substring(nameindex + "name=".length(), nameEndIndex).trim(); if (!name.startsWith("\"")) { buffer.append('"'); } buffer.append(name.trim()); if (!name.endsWith("\"")) { buffer.append('"'); } } buffer.append(')'); } else { buffer.append(" NIL"); } } int bodySize = getBodyPartSize(bodyPart); appendBodyStructureValue(buffer, bodyPart.getContentID()); appendBodyStructureValue(buffer, bodyPart.getDescription()); appendBodyStructureValue(buffer, bodyPart.getEncoding()); appendBodyStructureValue(buffer, bodySize); // line count not implemented in JavaMail, return fake line count int lineCount = bodySize / 80; if ("TEXT".equals(type)) { appendBodyStructureValue(buffer, lineCount); } else if ("MESSAGE".equals(type)) { Object bodyPartContent = bodyPart.getContent(); if (bodyPartContent instanceof MimeMessage) { MimeMessage innerMessage = (MimeMessage) bodyPartContent; appendEnvelope(buffer, innerMessage); appendBodyStructure(buffer, innerMessage); appendBodyStructureValue(buffer, lineCount); } else { // failover malformed message appendBodyStructureValue(buffer, lineCount); } } buffer.append(')'); } /** * Compute body part size with failover. * @param bodyPart MIME body part * @return body part size or 0 on error */ private int getBodyPartSize(MimePart bodyPart) { int bodySize = 0; try { bodySize = bodyPart.getSize(); if (bodySize == -1) { // failover, try to get size ByteArrayOutputStream baos = new ByteArrayOutputStream(); bodyPart.writeTo(baos); bodySize = baos.size(); } } catch (IOException | MessagingException e) { LOGGER.warn("Unable to get body part size " + e.getMessage(), e); } return bodySize; } protected void appendBodyStructureValue(StringBuilder buffer, String value) { if (value == null) { buffer.append(" NIL"); } else { buffer.append(" \"").append(value.toUpperCase()).append('\"'); } } protected void appendBodyStructureValue(StringBuilder buffer, int value) { if (value < 0) { // use 0 if we don't have a valid number buffer.append(" 0"); } else { buffer.append(' ').append(value); } } protected void sendSubFolders(String command, String folderPath, boolean recursive, boolean wildcard, boolean specialOnly) throws IOException { try { List folders = session.getSubFolders(folderPath, recursive, wildcard); for (ExchangeSession.Folder folder : folders) { if (!specialOnly || folder.isSpecial()) { sendClient("* " + command + " (" + folder.getFlags() + ") \"/\" \"" + encodeFolderPath(folder.folderPath) + '\"'); } } } catch (HttpForbiddenException e) { // access forbidden, ignore DavGatewayTray.debug(new BundleMessage("LOG_SUBFOLDER_ACCESS_FORBIDDEN", folderPath)); } catch (HttpNotFoundException e) { // not found, ignore DavGatewayTray.debug(new BundleMessage("LOG_FOLDER_NOT_FOUND", folderPath)); } catch (HttpResponseException e) { // other errors, ignore DavGatewayTray.debug(new BundleMessage("LOG_FOLDER_ACCESS_ERROR", folderPath, e.getMessage())); } } /** * client side search conditions */ static final protected class SearchConditions { Boolean flagged; Boolean answered; Boolean draft; String indexRange; String uidRange; String notUidRange; } protected ExchangeSession.MultiCondition appendOrSearchParams(String token, SearchConditions conditions) throws IOException { ExchangeSession.MultiCondition orCondition = session.or(); ImapTokenizer innerTokens = new ImapTokenizer(token); innerTokens.nextToken(); while (innerTokens.hasMoreTokens()) { String innerToken = innerTokens.nextToken(); orCondition.add(appendSearchParam(innerTokens, innerToken, conditions)); } return orCondition; } protected ExchangeSession.Condition appendNotSearchParams(String token, SearchConditions conditions) throws IOException { ImapTokenizer innerTokens = new ImapTokenizer(token); ExchangeSession.Condition cond = buildConditions(conditions, innerTokens); if (cond == null || cond.isEmpty()) { return null; } return session.not(cond); } protected ExchangeSession.Condition appendSearchParam(ImapTokenizer tokens, String token, SearchConditions conditions) throws IOException { if ("NOT".equals(token)) { String nextToken = tokens.nextToken(); if ("DELETED".equals(nextToken)) { // conditions.deleted = Boolean.FALSE; return session.isNull("deleted"); } else if ("KEYWORD".equals(nextToken)) { return appendNotSearchParams(nextToken + " " + tokens.nextToken(), conditions); } else if ("UID".equals(nextToken)) { conditions.notUidRange = tokens.nextToken(); } else { return appendNotSearchParams(nextToken, conditions); } } else if (token.startsWith("OR ")) { return appendOrSearchParams(token, conditions); } else if ("SUBJECT".equals(token)) { return session.contains("subject", tokens.nextToken()); } else if ("BODY".equals(token)) { return session.contains("body", tokens.nextToken()); } else if ("TEXT".equals(token)) { String value = tokens.nextToken(); return session.or(session.contains("body", value), session.contains("subject", value), session.contains("from", value), session.contains("to", value), session.contains("cc", value)); } else if ("KEYWORD".equals(token)) { return session.isEqualTo("keywords", session.convertFlagToKeyword(tokens.nextToken())); } else if ("FROM".equals(token)) { return session.contains("from", tokens.nextToken()); } else if ("TO".equals(token)) { return session.contains("to", tokens.nextToken()); } else if ("CC".equals(token)) { return session.contains("cc", tokens.nextToken()); } else if ("LARGER".equals(token)) { return session.gte("messageSize", tokens.nextToken()); } else if ("SMALLER".equals(token)) { return session.lt("messageSize", tokens.nextToken()); } else if (token.startsWith("SENT") || "SINCE".equals(token) || "BEFORE".equals(token) || "ON".equals(token)) { return appendDateSearchParam(tokens, token); } else if ("SEEN".equals(token)) { return session.isTrue("read"); } else if ("UNSEEN".equals(token) || "NEW".equals(token)) { return session.isFalse("read"); } else if ("DRAFT".equals(token)) { conditions.draft = Boolean.TRUE; } else if ("UNDRAFT".equals(token)) { conditions.draft = Boolean.FALSE; } else if ("DELETED".equals(token)) { // conditions.deleted = Boolean.TRUE; return session.isEqualTo("deleted", "1"); } else if ("UNDELETED".equals(token) || "NOT DELETED".equals(token)) { // conditions.deleted = Boolean.FALSE; return session.isNull("deleted"); } else if ("FLAGGED".equals(token)) { conditions.flagged = Boolean.TRUE; } else if ("UNFLAGGED".equals(token)) { conditions.flagged = Boolean.FALSE; } else if ("ANSWERED".equals(token)) { conditions.answered = Boolean.TRUE; } else if ("UNANSWERED".equals(token)) { conditions.answered = Boolean.FALSE; } else if ("HEADER".equals(token)) { String headerName = tokens.nextToken().toLowerCase(); String value = tokens.nextToken(); if ("message-id".equals(headerName) && !value.startsWith("<")) { value = '<' + value + '>'; } return session.headerIsEqualTo(headerName, value); } else if ("UID".equals(token)) { String range = tokens.nextToken(); // ignore 1:* noop filter if (!"1:*".equals(range)) { conditions.uidRange = range; } } else //noinspection StatementWithEmptyBody if ("OLD".equals(token) || "RECENT".equals(token) || "ALL".equals(token)) { // ignore } else if (token.indexOf(':') >= 0 || token.matches("\\d+")) { // range search conditions.indexRange = token; } else { throw new DavMailException("EXCEPTION_INVALID_SEARCH_PARAMETERS", token); } // client side search token return null; } protected ExchangeSession.Condition appendDateSearchParam(ImapTokenizer tokens, String token) throws IOException { Date startDate; Date endDate; SimpleDateFormat parser = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); parser.setTimeZone(ExchangeSession.GMT_TIMEZONE); String dateToken = tokens.nextToken(); try { startDate = parser.parse(dateToken); Calendar calendar = Calendar.getInstance(); calendar.setTime(startDate); calendar.add(Calendar.DAY_OF_MONTH, 1); endDate = calendar.getTime(); } catch (ParseException e) { throw new DavMailException("EXCEPTION_INVALID_SEARCH_PARAMETERS", dateToken); } String searchAttribute; if (token.startsWith("SENT")) { searchAttribute = "date"; } else { searchAttribute = "lastmodified"; } if (token.endsWith("ON")) { return session.and(session.gt(searchAttribute, session.formatSearchDate(startDate)), session.lt(searchAttribute, session.formatSearchDate(endDate))); } else if (token.endsWith("BEFORE")) { return session.lt(searchAttribute, session.formatSearchDate(startDate)); } else if (token.endsWith("SINCE")) { return session.gte(searchAttribute, session.formatSearchDate(startDate)); } else { throw new DavMailException("EXCEPTION_INVALID_SEARCH_PARAMETERS", dateToken); } } protected boolean expunge(boolean silent) throws IOException { boolean hasDeleted = false; if (currentFolder.messages != null) { int index = 1; for (ExchangeSession.Message message : currentFolder.messages) { if (message.deleted) { message.delete(); hasDeleted = true; if (!silent) { sendClient("* " + index + " EXPUNGE"); } } else { index++; } } } return hasDeleted; } protected void updateFlags(ExchangeSession.Message message, String action, String flags) throws IOException { HashMap properties = new HashMap<>(); if ("-Flags".equalsIgnoreCase(action) || "-FLAGS.SILENT".equalsIgnoreCase(action)) { ImapTokenizer flagtokenizer = new ImapTokenizer(flags); while (flagtokenizer.hasMoreTokens()) { String flag = flagtokenizer.nextToken(); if ("\\Seen".equalsIgnoreCase(flag)) { if (message.read) { properties.put("read", "0"); message.read = false; } } else if ("\\Flagged".equalsIgnoreCase(flag)) { if (message.flagged) { properties.put("flagged", "0"); message.flagged = false; } } else if ("\\Deleted".equalsIgnoreCase(flag)) { if (message.deleted) { properties.put("deleted", null); message.deleted = false; } } else if ("Junk".equalsIgnoreCase(flag)) { if (message.junk) { properties.put("junk", "0"); message.junk = false; } } else if ("$Forwarded".equalsIgnoreCase(flag)) { if (message.forwarded) { properties.put("forwarded", null); message.forwarded = false; } } else if ("\\Answered".equalsIgnoreCase(flag)) { if (message.answered) { properties.put("answered", null); message.answered = false; } } else //noinspection StatementWithEmptyBody if ("\\Draft".equalsIgnoreCase(flag)) { // ignore, draft is readonly after create } else if (message.keywords != null) { properties.put("keywords", message.removeFlag(flag)); } } } else if ("+Flags".equalsIgnoreCase(action) || "+FLAGS.SILENT".equalsIgnoreCase(action)) { ImapTokenizer flagtokenizer = new ImapTokenizer(flags); while (flagtokenizer.hasMoreTokens()) { String flag = flagtokenizer.nextToken(); if ("\\Seen".equalsIgnoreCase(flag)) { if (!message.read) { properties.put("read", "1"); message.read = true; } } else if ("\\Deleted".equalsIgnoreCase(flag)) { if (!message.deleted) { message.deleted = true; properties.put("deleted", "1"); } } else if ("\\Flagged".equalsIgnoreCase(flag)) { if (!message.flagged) { properties.put("flagged", "2"); message.flagged = true; } } else if ("\\Answered".equalsIgnoreCase(flag)) { if (!message.answered) { properties.put("answered", "102"); message.answered = true; } } else if ("$Forwarded".equalsIgnoreCase(flag)) { if (!message.forwarded) { properties.put("forwarded", "104"); message.forwarded = true; } } else if ("Junk".equalsIgnoreCase(flag)) { if (!message.junk) { properties.put("junk", "1"); message.junk = true; } } else //noinspection StatementWithEmptyBody if ("\\Draft".equalsIgnoreCase(flag)) { // ignore, draft is readonly after create } else { properties.put("keywords", message.addFlag(flag)); } } } else if ("FLAGS".equalsIgnoreCase(action) || "FLAGS.SILENT".equalsIgnoreCase(action)) { // flag list with default values boolean read = false; boolean deleted = false; boolean junk = false; boolean flagged = false; boolean answered = false; boolean forwarded = false; HashSet keywords = null; // set flags from new flag list ImapTokenizer flagtokenizer = new ImapTokenizer(flags); while (flagtokenizer.hasMoreTokens()) { String flag = flagtokenizer.nextToken(); if ("\\Seen".equalsIgnoreCase(flag)) { read = true; } else if ("\\Deleted".equalsIgnoreCase(flag)) { deleted = true; } else if ("\\Flagged".equalsIgnoreCase(flag)) { flagged = true; } else if ("\\Answered".equalsIgnoreCase(flag)) { answered = true; } else if ("$Forwarded".equalsIgnoreCase(flag)) { forwarded = true; } else if ("Junk".equalsIgnoreCase(flag)) { junk = true; } else //noinspection StatementWithEmptyBody if ("\\Draft".equalsIgnoreCase(flag)) { // ignore, draft is readonly after create } else { if (keywords == null) { keywords = new HashSet<>(); } keywords.add(flag); } } if (keywords != null) { properties.put("keywords", message.setFlags(keywords)); } if (read != message.read) { message.read = read; if (message.read) { properties.put("read", "1"); } else { properties.put("read", "0"); } } if (deleted != message.deleted) { message.deleted = deleted; if (message.deleted) { properties.put("deleted", "1"); } else { properties.put("deleted", null); } } if (flagged != message.flagged) { message.flagged = flagged; if (message.flagged) { properties.put("flagged", "2"); } else { properties.put("flagged", "0"); } } if (answered != message.answered) { message.answered = answered; if (message.answered) { properties.put("answered", "102"); } else if (!forwarded) { // remove property only if not forwarded properties.put("answered", null); } } if (forwarded != message.forwarded) { message.forwarded = forwarded; if (message.forwarded) { properties.put("forwarded", "104"); } else if (!answered) { // remove property only if not answered properties.put("forwarded", null); } } if (junk != message.junk) { message.junk = junk; if (message.junk) { properties.put("junk", "1"); } else { properties.put("junk", "0"); } } } if (!properties.isEmpty()) { session.updateMessage(message, properties); // message is no longer recent message.recent = false; } } /** * Decode IMAP credentials * * @param tokens tokens * @throws IOException on error */ protected void parseCredentials(ImapTokenizer tokens) throws IOException { if (tokens.hasMoreTokens()) { userName = tokens.nextToken(); } else { throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } if (tokens.hasMoreTokens()) { password = tokens.nextToken(); } else { throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } /** * Filter to output only headers, also count full size */ private static final class PartOutputStream extends FilterOutputStream { protected enum State { START, CR, CRLF, CRLFCR, BODY } private State state = State.START; private int size; private int bufferSize; private final boolean writeHeaders; private final boolean writeBody; private final int startIndex; private final int maxSize; private PartOutputStream(OutputStream os, boolean writeHeaders, boolean writeBody, int startIndex, int maxSize) { super(os); this.writeHeaders = writeHeaders; this.writeBody = writeBody; this.startIndex = startIndex; this.maxSize = maxSize; } @Override public void write(int b) throws IOException { size++; if (((state != State.BODY && writeHeaders) || (state == State.BODY && writeBody)) && (size > startIndex) && (bufferSize < maxSize) ) { super.write(b); bufferSize++; } if (state == State.START) { if (b == '\r') { state = State.CR; } } else if (state == State.CR) { if (b == '\n') { state = State.CRLF; } else { state = State.START; } } else if (state == State.CRLF) { if (b == '\r') { state = State.CRLFCR; } else { state = State.START; } } else if (state == State.CRLFCR) { if (b == '\n') { state = State.BODY; } else { state = State.START; } } } } /** * Partial output stream, start at startIndex and write maxSize bytes. */ private static final class PartialOutputStream extends FilterOutputStream { private int size; private int bufferSize; private final int startIndex; private final int maxSize; private PartialOutputStream(OutputStream os, int startIndex, int maxSize) { super(os); this.startIndex = startIndex; this.maxSize = maxSize; } @Override public void write(int b) throws IOException { size++; if ((size > startIndex) && (bufferSize < maxSize)) { super.write(b); bufferSize++; } } } protected abstract static class AbstractRangeIterator implements Iterator { ExchangeSession.MessageList messages; int currentIndex; protected int getCurrentIndex() { return currentIndex; } } protected static class UIDRangeIterator extends AbstractRangeIterator { final String[] ranges; int currentRangeIndex; long startUid; long endUid; protected UIDRangeIterator(ExchangeSession.MessageList messages, String value) { this.messages = messages; ranges = value.split(","); } protected long convertToLong(String value) { if ("*".equals(value)) { return Long.MAX_VALUE; } else { return Long.parseLong(value); } } protected void skipToNextRangeStartUid() { if (currentRangeIndex < ranges.length) { String currentRange = ranges[currentRangeIndex++]; int colonIndex = currentRange.indexOf(':'); if (colonIndex > 0) { startUid = convertToLong(currentRange.substring(0, colonIndex)); endUid = convertToLong(currentRange.substring(colonIndex + 1)); if (endUid < startUid) { long swap = endUid; endUid = startUid; startUid = swap; } } else if ("*".equals(currentRange)) { startUid = endUid = messages.get(messages.size() - 1).getImapUid(); } else { startUid = endUid = convertToLong(currentRange); } while (currentIndex < messages.size() && messages.get(currentIndex).getImapUid() < startUid) { currentIndex++; } } else { currentIndex = messages.size(); } } protected boolean hasNextInRange() { return hasNextIndex() && messages.get(currentIndex).getImapUid() <= endUid; } protected boolean hasNextIndex() { return currentIndex < messages.size(); } protected boolean hasNextRange() { return currentRangeIndex < ranges.length; } public boolean hasNext() { boolean hasNextInRange = hasNextInRange(); // if has next range and current index after current range end, reset index if (hasNextRange() && !hasNextInRange) { currentIndex = 0; } while (hasNextIndex() && !hasNextInRange) { skipToNextRangeStartUid(); hasNextInRange = hasNextInRange(); } return hasNextIndex(); } public ExchangeSession.Message next() { ExchangeSession.Message message = messages.get(currentIndex++); long uid = message.getImapUid(); if (uid < startUid || uid > endUid) { throw new NoSuchElementException("Message uid " + uid + " not in range " + startUid + ':' + endUid); } return message; } public void remove() { throw new UnsupportedOperationException(); } } protected static class RangeIterator extends AbstractRangeIterator { final String[] ranges; int currentRangeIndex; long startUid; long endUid; protected RangeIterator(ExchangeSession.MessageList messages, String value) { this.messages = messages; ranges = value.split(","); } protected long convertToLong(String value) { if ("*".equals(value)) { return Long.MAX_VALUE; } else { return Long.parseLong(value); } } protected void skipToNextRangeStart() { if (currentRangeIndex < ranges.length) { String currentRange = ranges[currentRangeIndex++]; int colonIndex = currentRange.indexOf(':'); if (colonIndex > 0) { startUid = convertToLong(currentRange.substring(0, colonIndex)); endUid = convertToLong(currentRange.substring(colonIndex + 1)); if (endUid < startUid) { long swap = endUid; endUid = startUid; startUid = swap; } } else if ("*".equals(currentRange)) { startUid = endUid = messages.size(); } else { startUid = endUid = convertToLong(currentRange); } while (currentIndex < messages.size() && (currentIndex + 1) < startUid) { currentIndex++; } } else { currentIndex = messages.size(); } } protected boolean hasNextInRange() { return hasNextIndex() && currentIndex < endUid; } protected boolean hasNextIndex() { return currentIndex < messages.size(); } protected boolean hasNextRange() { return currentRangeIndex < ranges.length; } public boolean hasNext() { boolean hasNextInRange = hasNextInRange(); // if has next range and current index after current range end, reset index if (hasNextRange() && !hasNextInRange) { currentIndex = 0; } while (hasNextIndex() && !hasNextInRange) { skipToNextRangeStart(); hasNextInRange = hasNextInRange(); } return hasNextIndex(); } public ExchangeSession.Message next() { if (currentIndex >= messages.size()) { throw new NoSuchElementException(); } return messages.get(currentIndex++); } public void remove() { throw new UnsupportedOperationException(); } } static protected class ImapTokenizer { char[] value; int startIndex; Stack quotes = new Stack<>(); ImapTokenizer(String value) { this.value = value.toCharArray(); } public String nextToken() { // Get next token without removing quotes ", {} or () String token = nextQuotedToken(); // note: literal strings not handled here. if( !token.isEmpty() && '"' == token.charAt(0) ) { // token is quoted string. try { token = StringUtil.parseQuotedImapString(token); } catch (ParseException e) { LOGGER.warn("Invalid quoted token: "+token); token = StringUtil.removeQuotes(token); } } else { // use the general method previously also used; // for example unquotes a list. I guess naming could be made better in the future. token = StringUtil.removeQuotes(token); } return token; } protected boolean isQuote(char character) { return character == '"' || character == '(' || character == ')' || character == '[' || character == ']' || character == '\\'; } public boolean hasMoreTokens() { return startIndex < value.length; } public String nextQuotedToken() { int currentIndex = startIndex; while (currentIndex < value.length) { char currentChar = value[currentIndex]; if (currentChar == ' ' && quotes.isEmpty()) { break; } else if (!quotes.isEmpty() && quotes.peek() == '\\') { // just skip quotes.pop(); } else if (isQuote(currentChar)) { if (quotes.isEmpty()) { quotes.push(currentChar); } else { char currentQuote = quotes.peek(); if (currentChar == '\\') { quotes.push(currentChar); } else if (currentQuote == '"' && currentChar == '"' || currentQuote == '(' && currentChar == ')' || currentQuote == '[' && currentChar == ']' ) { // end quote quotes.pop(); } else { quotes.push(currentChar); } } } currentIndex++; } String result = new String(value, startIndex, currentIndex - startIndex); startIndex = currentIndex + 1; return result; } } } davmail-6.3.0/src/java/davmail/imap/ImapServer.java0100644 0000000 0000000 00000003261 12564151517 020670 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.imap; import davmail.AbstractConnection; import davmail.AbstractServer; import davmail.Settings; import java.net.Socket; /** * Pop3 server */ public class ImapServer extends AbstractServer { /** * Default IMAP port */ public static final int DEFAULT_PORT = 143; /** * Create a ServerSocket to listen for connections. * Start the thread. * * @param port imap listen port, 143 if not defined (0) */ public ImapServer(int port) { super(ImapServer.class.getName(), port, ImapServer.DEFAULT_PORT); nosslFlag = Settings.getBooleanProperty("davmail.ssl.nosecureimap"); } @Override public String getProtocolName() { return "IMAP"; } @Override public AbstractConnection createConnectionHandler(Socket clientSocket) { return new ImapConnection(clientSocket); } } davmail-6.3.0/src/java/davmail/ldap/Ber.java0100644 0000000 0000000 00000007634 13574116520 017322 0ustar000000000 0000000 /* * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package davmail.ldap; import java.io.OutputStream; import java.io.IOException; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; /** * Base class that defines common fields, constants, and debug method. * * @author Jagane Sundar */ @SuppressWarnings("unused") public abstract class Ber { protected byte[] buf; protected int offset; protected int bufsize; protected Ber() { } public static void dumpBER(OutputStream outStream, String tag, byte[] bytes, int from, int to) { try { outStream.write('\n'); outStream.write(tag.getBytes(StandardCharsets.UTF_8)); new HexDumpEncoder().encodeBuffer( new ByteArrayInputStream(bytes, from, to), outStream); outStream.write('\n'); } catch (IOException e) { try { outStream.write( "Ber.dumpBER(): error encountered\n".getBytes(StandardCharsets.UTF_8)); } catch (IOException e2) { // ignore } } } //////////////////////////////////////////////////////////////////////////// // // some ASN defines // //////////////////////////////////////////////////////////////////////////// public static final int ASN_BOOLEAN = 0x01; public static final int ASN_INTEGER = 0x02; public static final int ASN_BIT_STRING = 0x03; public static final int ASN_SIMPLE_STRING = 0x04; public static final int ASN_OCTET_STR = 0x04; public static final int ASN_NULL = 0x05; public static final int ASN_OBJECT_ID = 0x06; public static final int ASN_SEQUENCE = 0x10; public static final int ASN_SET = 0x11; public static final int ASN_PRIMITIVE = 0x00; public static final int ASN_UNIVERSAL = 0x00; public static final int ASN_CONSTRUCTOR = 0x20; public static final int ASN_APPLICATION = 0x40; public static final int ASN_CONTEXT = 0x80; public static final int ASN_PRIVATE = 0xC0; public static final int ASN_ENUMERATED = 0x0a; final static class EncodeException extends IOException { private static final long serialVersionUID = -5247359637775781768L; EncodeException(String msg) { super(msg); } } final static class DecodeException extends IOException { private static final long serialVersionUID = 8735036969244425583L; DecodeException(String msg) { super(msg); } } } davmail-6.3.0/src/java/davmail/ldap/BerDecoder.java0100644 0000000 0000000 00000024153 13574116520 020603 0ustar000000000 0000000 /* * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package davmail.ldap; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; /** * A BER decoder. Contains methods to parse a BER buffer. * * @author Jagane Sundar * @author Vincent Ryan */ public final class BerDecoder extends Ber { private int origOffset; // The start point in buf to decode /** * Creates a BER decoder that reads bytes from the specified buffer. */ public BerDecoder(byte[] buf, int offset, int bufsize) { this.buf = buf; // shared buffer, be careful to use this class this.bufsize = bufsize; this.origOffset = offset; reset(); } /** * Resets this decode to start parsing from the initial offset * (ie., same state as after calling the constructor). */ public void reset() { offset = origOffset; } /** * Returns the current parse position. * It points to the byte that will be parsed next. * Useful for parsing sequences. */ public int getParsePosition() { return offset; } /** * Parses a possibly variable length field. */ public int parseLength() throws DecodeException { int lengthbyte = parseByte(); if ((lengthbyte & 0x80) == 0x80) { lengthbyte &= 0x7f; if (lengthbyte == 0) { throw new DecodeException( "Indefinite length not supported"); } if (lengthbyte > 4) { throw new DecodeException("encoding too long"); } if (bufsize - offset < lengthbyte) { throw new DecodeException("Insufficient data"); } int retval = 0; for( int i = 0; i < lengthbyte; i++) { retval = (retval << 8) + (buf[offset++] & 0xff); } if (retval < 0) { throw new DecodeException("Invalid length bytes"); } return retval; } else { return lengthbyte; } } /** * Parses the next sequence in this BER buffer. * @param rlen An array for returning size of the sequence in bytes. If null, * the size is not returned. * @return The sequence's tag. */ public int parseSeq(int[] rlen) throws DecodeException { int seq = parseByte(); int len = parseLength(); if (rlen != null) { rlen[0] = len; } return seq; } /** * Used to skip bytes. Usually used when trying to recover from parse error. * Don't need to be public right now? * @param i The number of bytes to skip */ @SuppressWarnings("unused") void seek(int i) throws DecodeException { if (offset + i > bufsize || offset + i < 0) { throw new DecodeException("array index out of bounds"); } offset += i; } /** * Parses the next byte in this BER buffer. * @return The byte parsed. */ public int parseByte() throws DecodeException { if (bufsize - offset < 1) { throw new DecodeException("Insufficient data"); } return buf[offset++] & 0xff; } /** * Returns the next byte in this BER buffer without consuming it. * @return The next byte. */ public int peekByte() throws DecodeException { if (bufsize - offset < 1) { throw new DecodeException("Insufficient data"); } return buf[offset] & 0xff; } /** * Parses an ASN_BOOLEAN tagged integer from this BER buffer. * @return true if the tagged integer is 0; false otherwise. */ @SuppressWarnings("UnusedReturnValue") public boolean parseBoolean() throws DecodeException { return (parseIntWithTag(ASN_BOOLEAN) != 0x00); } /** * Parses an ASN_ENUMERATED tagged integer from this BER buffer. * @return The tag of enumeration. */ public int parseEnumeration() throws DecodeException { return parseIntWithTag(ASN_ENUMERATED); } /** * Parses an ASN_INTEGER tagged integer from this BER buffer. * @return The value of the integer. */ public int parseInt() throws DecodeException { return parseIntWithTag(ASN_INTEGER); } /** * Parses an integer that's preceded by a tag. *

     * BER integer ::= tag length byte {byte}*
     *
*/ protected int parseIntWithTag(int tag) throws DecodeException { if (parseByte() != tag) { throw new DecodeException("Encountered ASN.1 tag " + (buf[offset - 1] & 0xff) + " (expected tag " + tag + ")"); } int len = parseLength(); if (len > 4) { throw new DecodeException("INTEGER too long"); } else if (len > bufsize - offset) { throw new DecodeException("Insufficient data"); } byte fb = buf[offset++]; int value; value = fb & 0x7F; for( int i = 1 /* first byte already read */ ; i < len; i++) { value <<= 8; value |= (buf[offset++] & 0xff); } if ((fb & 0x80) == 0x80) { value = -value; } return value; } /** * Parses a string. */ public String parseString(boolean decodeUTF8) throws DecodeException { return parseStringWithTag(ASN_SIMPLE_STRING, decodeUTF8, null); } /** * Parses a string of a given tag from this BER buffer. *
     *BER simple string ::= tag length {byte}*
     *
* @param rlen An array for holding the relative parsed offset; if null * offset not set. * @param decodeUTF8 If true, use UTF-8 when decoding the string; otherwise * use ISO-Latin-1 (8859_1). Use true for LDAPv3; false for LDAPv2. * @param tag The tag that precedes the string. * @return The non-null parsed string. */ public String parseStringWithTag(int tag, boolean decodeUTF8, int[] rlen) throws DecodeException { int st; int origOffset = offset; if ((st = parseByte()) != tag) { throw new DecodeException("Encountered ASN.1 tag " + Integer.toString((byte)st) + " (expected tag " + tag + ")"); } int len = parseLength(); if (len > bufsize - offset) { throw new DecodeException("Insufficient data"); } String retstr; if (len == 0) { retstr = ""; } else { byte[] buf2 = new byte[len]; System.arraycopy(buf, offset, buf2, 0, len); if (decodeUTF8) { retstr = new String(buf2, StandardCharsets.UTF_8); } else { try { retstr = new String(buf2, "8859_1"); } catch (UnsupportedEncodingException e) { throw new DecodeException("8859_1 not available on platform"); } } offset += len; } if (rlen != null) { rlen[0] = offset - origOffset; } return retstr; } /** * Parses an octet string of a given type(tag) from this BER buffer. *
     * BER Binary Data of type "tag" ::= tag length {byte}*
     *
* * @param tag The tag to look for. * @param rlen An array for returning the relative parsed position. If null, * the relative parsed position is not returned. * @return A non-null array containing the octet string. * @throws DecodeException If the next byte in the BER buffer is not * {@code tag}, or if length specified in the BER buffer exceeds the * number of bytes left in the buffer. */ public byte[] parseOctetString(int tag, int[] rlen) throws DecodeException { int origOffset = offset; int st; if ((st = parseByte()) != tag) { throw new DecodeException("Encountered ASN.1 tag " + st + " (expected tag " + tag + ")"); } int len = parseLength(); if (len > bufsize - offset) { throw new DecodeException("Insufficient data"); } byte[] retarr = new byte[len]; if (len > 0) { System.arraycopy(buf, offset, retarr, 0, len); offset += len; } if (rlen != null) { rlen[0] = offset - origOffset; } return retarr; } /** * Returns the number of unparsed bytes in this BER buffer. */ public int bytesLeft() { return bufsize - offset; } } davmail-6.3.0/src/java/davmail/ldap/BerEncoder.java0100644 0000000 0000000 00000031067 13574116520 020617 0ustar000000000 0000000 /* * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package davmail.ldap; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; /** * A BER encoder. * * @author Jagane Sundar * @author Scott Seligman * @author Vincent Ryan */ public final class BerEncoder extends Ber { private int curSeqIndex; private int[] seqOffset; private static final int INITIAL_SEQUENCES = 16; private static final int DEFAULT_BUFSIZE = 1024; // When buf is full, expand its size by the following factor. private static final int BUF_GROWTH_FACTOR = 8; /** * Creates a BER buffer for encoding. */ public BerEncoder() { this(DEFAULT_BUFSIZE); } /** * Creates a BER buffer of a specified size for encoding. * Specify the initial bufsize. Buffer will be expanded as needed. * @param bufsize The number of bytes for the buffer. */ public BerEncoder(int bufsize) { buf = new byte[bufsize]; this.bufsize = bufsize; offset = 0; seqOffset = new int[INITIAL_SEQUENCES]; curSeqIndex = 0; } /** * Resets encoder to state when newly constructed. Zeros out * internal data structures. */ public void reset() { while (offset > 0) { buf[--offset] = 0; } while (curSeqIndex > 0) { seqOffset[--curSeqIndex] = 0; } } // ------------------ Accessor methods ------------ /** * Gets the number of encoded bytes in this BER buffer. */ public int getDataLen() { return offset; } /** * Gets the buffer that contains the BER encoding. Throws an * exception if unmatched beginSeq() and endSeq() pairs were * encountered. Not entire buffer contains encoded bytes. * Use getDataLen() to determine number of encoded bytes. * Use getBuffer(true) to get rid of excess bytes in array. * @throws IllegalStateException If buffer contains unbalanced sequence. */ public byte[] getBuf() { if (curSeqIndex != 0) { throw new IllegalStateException("BER encode error: Unbalanced SEQUENCEs."); } return buf; // shared buffer, be careful to use this method. } /** * Gets the buffer that contains the BER encoding, trimming unused bytes. * * @throws IllegalStateException If buffer contains unbalanced sequence. */ @SuppressWarnings("unused") public byte[] getTrimmedBuf() { int len = getDataLen(); byte[] trimBuf = new byte[len]; System.arraycopy(getBuf(), 0, trimBuf, 0, len); return trimBuf; } // -------------- encoding methods ------------- /** * Begin encoding a sequence with a tag. */ public void beginSeq(int tag) { // Double the size of the SEQUENCE array if it overflows if (curSeqIndex >= seqOffset.length) { int[] seqOffsetTmp = new int[seqOffset.length * 2]; System.arraycopy(seqOffset, 0, seqOffsetTmp, 0, seqOffset.length); seqOffset = seqOffsetTmp; } encodeByte(tag); seqOffset[curSeqIndex] = offset; // Save space for sequence length. // %%% Currently we save enough space for sequences up to 64k. // For larger sequences we'll need to shift the data to the right // in endSeq(). If we could instead pad the length field with // zeros, it would be a big win. ensureFreeBytes(3); offset += 3; curSeqIndex++; } /** * Terminate a BER sequence. */ public void endSeq() throws EncodeException { curSeqIndex--; if (curSeqIndex < 0) { throw new IllegalStateException("BER encode error: Unbalanced SEQUENCEs."); } int start = seqOffset[curSeqIndex] + 3; // index beyond length field int len = offset - start; if (len <= 0x7f) { shiftSeqData(start, len, -2); buf[seqOffset[curSeqIndex]] = (byte) len; } else if (len <= 0xff) { shiftSeqData(start, len, -1); buf[seqOffset[curSeqIndex]] = (byte) 0x81; buf[seqOffset[curSeqIndex] + 1] = (byte) len; } else if (len <= 0xffff) { buf[seqOffset[curSeqIndex]] = (byte) 0x82; buf[seqOffset[curSeqIndex] + 1] = (byte) (len >> 8); buf[seqOffset[curSeqIndex] + 2] = (byte) len; } else if (len <= 0xffffff) { shiftSeqData(start, len, 1); buf[seqOffset[curSeqIndex]] = (byte) 0x83; buf[seqOffset[curSeqIndex] + 1] = (byte) (len >> 16); buf[seqOffset[curSeqIndex] + 2] = (byte) (len >> 8); buf[seqOffset[curSeqIndex] + 3] = (byte) len; } else { throw new EncodeException("SEQUENCE too long"); } } /** * Shifts contents of buf in the range [start,start+len) a specified amount. * Positive shift value means shift to the right. */ private void shiftSeqData(int start, int len, int shift) { if (shift > 0) { ensureFreeBytes(shift); } System.arraycopy(buf, start, buf, start + shift, len); offset += shift; } /** * Encode a single byte. */ public void encodeByte(int b) { ensureFreeBytes(1); buf[offset++] = (byte) b; } /* private void deleteByte() { offset--; } */ /* * Encodes an int. *
     * BER integer ::= 0x02 berlength byte {byte}*
     *
*/ public void encodeInt(int i) { encodeInt(i, 0x02); } /** * Encodes an int and a tag. *
     * BER integer w tag ::= tag berlength byte {byte}*
     *
*/ public void encodeInt(int i, int tag) { int mask = 0xff800000; int intsize = 4; while( (((i & mask) == 0) || ((i & mask) == mask)) && (intsize > 1) ) { intsize--; i <<= 8; } encodeInt(i, tag, intsize); } // // encodes an int using numbytes for the actual encoding. // private void encodeInt(int i, int tag, int intsize) { // // integer ::= 0x02 asnlength byte {byte}* // if (intsize > 4) { throw new IllegalArgumentException("BER encode error: INTEGER too long."); } ensureFreeBytes(2 + intsize); buf[offset++] = (byte) tag; buf[offset++] = (byte) intsize; int mask = 0xff000000; while (intsize-- > 0) { buf[offset++] = (byte) ((i & mask) >> 24); i <<= 8; } } /** * Encodes a boolean. *
     * BER boolean ::= 0x01 0x01 {0xff|0x00}
     *
*/ @SuppressWarnings("unused") public void encodeBoolean(boolean b) { encodeBoolean(b, ASN_BOOLEAN); } /** * Encodes a boolean and a tag *
     * BER boolean w TAG ::= tag 0x01 {0xff|0x00}
     *
*/ public void encodeBoolean(boolean b, int tag) { ensureFreeBytes(3); buf[offset++] = (byte) tag; buf[offset++] = 0x01; buf[offset++] = b ? (byte) 0xff : (byte) 0x00; } /** * Encodes a string. *
     * BER string ::= 0x04 strlen byte1 byte2...
     *
* The string is converted into bytes using UTF-8 or ISO-Latin-1. */ public void encodeString(String str, boolean encodeUTF8) throws EncodeException { encodeString(str, ASN_OCTET_STR, encodeUTF8); } /** * Encodes a string and a tag. *
     * BER string w TAG ::= tag strlen byte1 byte2...
     *
*/ public void encodeString(String str, int tag, boolean encodeUTF8) throws EncodeException { encodeByte(tag); int i = 0; int count; byte[] bytes = null; if (str == null) { count = 0; } else if (encodeUTF8) { bytes = str.getBytes(StandardCharsets.UTF_8); count = bytes.length; } else { try { bytes = str.getBytes("8859_1"); count = bytes.length; } catch (UnsupportedEncodingException e) { throw new EncodeException("8859_1 not available on platform"); } } encodeLength(count); ensureFreeBytes(count); while (i < count) { buf[offset++] = bytes[i++]; } } /** * Encodes a portion of an octet string and a tag. */ public void encodeOctetString(byte[] tb, int tag, int tboffset, int length) throws EncodeException { encodeByte(tag); encodeLength(length); if (length > 0) { ensureFreeBytes(length); System.arraycopy(tb, tboffset, buf, offset, length); offset += length; } } /** * Encodes an octet string and a tag. */ public void encodeOctetString(byte[] tb, int tag) throws EncodeException { encodeOctetString(tb, tag, 0, tb.length); } private void encodeLength(int len) throws EncodeException { ensureFreeBytes(4); // worst case if (len < 128) { buf[offset++] = (byte) len; } else if (len <= 0xff) { buf[offset++] = (byte) 0x81; buf[offset++] = (byte) len; } else if (len <= 0xffff) { buf[offset++] = (byte) 0x82; buf[offset++] = (byte) (len >> 8); buf[offset++] = (byte) (len & 0xff); } else if (len <= 0xffffff) { buf[offset++] = (byte) 0x83; buf[offset++] = (byte) (len >> 16); buf[offset++] = (byte) (len >> 8); buf[offset++] = (byte) (len & 0xff); } else { throw new EncodeException("string too long"); } } /** * Encodes an array of strings. */ @SuppressWarnings("unused") public void encodeStringArray(String[] strs, boolean encodeUTF8) throws EncodeException { if (strs == null) return; for (String str : strs) { encodeString(str, encodeUTF8); } } /* private void encodeNull() { // // NULL ::= 0x05 0x00 // encodeByte(0x05); encodeByte(0x00); } */ /** * Ensures that there are at least "len" unused bytes in "buf". * When more space is needed "buf" is expanded by a factor of * BUF_GROWTH_FACTOR, then "len" bytes are added if "buf" still * isn't large enough. */ private void ensureFreeBytes(int len) { if (bufsize - offset < len) { int newsize = bufsize * BUF_GROWTH_FACTOR; if (newsize - offset < len) { newsize += len; } byte[] newbuf = new byte[newsize]; // Only copy bytes in the range [0, offset) System.arraycopy(buf, 0, newbuf, 0, offset); buf = newbuf; bufsize = newsize; } } } davmail-6.3.0/src/java/davmail/ldap/HexDumpEncoder.java0100644 0000000 0000000 00000024622 13574116520 021460 0ustar000000000 0000000 /* * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package davmail.ldap; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.PrintStream; import java.io.OutputStream; import java.io.IOException; import java.nio.ByteBuffer; /** * This class encodes a buffer into the classic: "Hexadecimal Dump" format of * the past. It is useful for analyzing the contents of binary buffers. * The format produced is as follows: *
 * xxxx: 00 11 22 33 44 55 66 77   88 99 aa bb cc dd ee ff ................
 * 
* Where xxxx is the offset into the buffer in 16 byte chunks, followed * by ascii coded hexadecimal bytes followed by the ASCII representation of * the bytes or '.' if they are not valid bytes. * * @author Chuck McManis */ public class HexDumpEncoder { private int offset; private int thisLineLength; private int currentByte; private byte[] thisLine = new byte[16]; static void hexDigit(PrintStream p, byte x) { char c; c = (char) ((x >> 4) & 0xf); if (c > 9) c = (char) ((c-10) + 'A'); else c = (char)(c + '0'); p.write(c); c = (char) (x & 0xf); if (c > 9) c = (char)((c-10) + 'A'); else c = (char)(c + '0'); p.write(c); } protected int bytesPerAtom() { return (1); } protected int bytesPerLine() { return (16); } protected void encodeBufferPrefix(OutputStream o) { offset = 0; pStream = new PrintStream(o); } protected void encodeLinePrefix(int len) { hexDigit(pStream, (byte)((offset >>> 8) & 0xff)); hexDigit(pStream, (byte)(offset & 0xff)); pStream.print(": "); currentByte = 0; thisLineLength = len; } protected void encodeAtom(byte[] buf, int off) { thisLine[currentByte] = buf[off]; hexDigit(pStream, buf[off]); pStream.print(" "); currentByte++; if (currentByte == 8) pStream.print(" "); } protected void encodeLineSuffix() { if (thisLineLength < 16) { for (int i = thisLineLength; i < 16; i++) { pStream.print(" "); if (i == 7) pStream.print(" "); } } pStream.print(" "); for (int i = 0; i < thisLineLength; i++) { if ((thisLine[i] < ' ') || (thisLine[i] > 'z')) { pStream.print("."); } else { pStream.write(thisLine[i]); } } pStream.println(); offset += thisLineLength; } /** Stream that understands "printing" */ protected PrintStream pStream; /** * This method works around the bizarre semantics of BufferedInputStream's * read method. */ protected int readFully(InputStream in, byte[] buffer) throws java.io.IOException { for (int i = 0; i < buffer.length; i++) { int q = in.read(); if (q == -1) return i; buffer[i] = (byte)q; } return buffer.length; } /** * Encode bytes from the input stream, and write them as text characters * to the output stream. This method will run until it exhausts the * input stream, but does not print the line suffix for a final * line that is shorter than bytesPerLine(). */ public void encode(InputStream inStream, OutputStream outStream) throws IOException { int j; int numBytes; byte[] tmpbuffer = new byte[bytesPerLine()]; encodeBufferPrefix(outStream); while (true) { numBytes = readFully(inStream, tmpbuffer); if (numBytes == 0) { break; } encodeLinePrefix(numBytes); for (j = 0; j < numBytes; j += bytesPerAtom()) { encodeAtom(tmpbuffer, j); } if (numBytes < bytesPerLine()) { break; } else { encodeLineSuffix(); } } } /** * A 'streamless' version of encode that simply takes a buffer of * bytes and returns a string containing the encoded buffer. */ public String encode(byte[] aBuffer) { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); String retVal; try { encode(inStream, outStream); // explicit ascii->unicode conversion retVal = outStream.toString("ISO-8859-1"); } catch (Exception IOException) { // This should never happen. throw new Error("CharacterEncoder.encode internal error"); } return (retVal); } /** * Return a byte array from the remaining bytes in this ByteBuffer. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. *

* To avoid an extra copy, the implementation will attempt to return the * byte array backing the ByteBuffer. If this is not possible, a * new byte array will be created. */ private byte [] getBytes(ByteBuffer bb) { /* * This should never return a BufferOverflowException, as we're * careful to allocate just the right amount. */ byte [] buf = null; /* * If it has a usable backing byte buffer, use it. Use only * if the array exactly represents the current ByteBuffer. */ if (bb.hasArray()) { byte [] tmp = bb.array(); if ((tmp.length == bb.capacity()) && (tmp.length == bb.remaining())) { buf = tmp; bb.position(bb.limit()); } } if (buf == null) { /* * This class doesn't have a concept of encode(buf, len, off), * so if we have a partial buffer, we must reallocate * space. */ buf = new byte[bb.remaining()]; /* * position() automatically updated */ bb.get(buf); } return buf; } /** * A 'streamless' version of encode that simply takes a ByteBuffer * and returns a string containing the encoded buffer. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. */ public String encode(ByteBuffer aBuffer) { byte [] buf = getBytes(aBuffer); return encode(buf); } /** * Encode bytes from the input stream, and write them as text characters * to the output stream. This method will run until it exhausts the * input stream. It differs from encode in that it will add the * line at the end of a final line that is shorter than bytesPerLine(). */ public void encodeBuffer(InputStream inStream, OutputStream outStream) throws IOException { int j; int numBytes; byte[] tmpbuffer = new byte[bytesPerLine()]; encodeBufferPrefix(outStream); while (true) { numBytes = readFully(inStream, tmpbuffer); if (numBytes == 0) { break; } encodeLinePrefix(numBytes); for (j = 0; j < numBytes; j += bytesPerAtom()) { encodeAtom(tmpbuffer, j); } encodeLineSuffix(); if (numBytes < bytesPerLine()) { break; } } } /** * Encode the buffer in aBuffer and write the encoded * result to the OutputStream aStream. */ public void encodeBuffer(byte[] aBuffer, OutputStream aStream) throws IOException { ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); encodeBuffer(inStream, aStream); } /** * A 'streamless' version of encode that simply takes a buffer of * bytes and returns a string containing the encoded buffer. */ @SuppressWarnings("unused") public String encodeBuffer(byte[] aBuffer) { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ByteArrayInputStream inStream = new ByteArrayInputStream(aBuffer); try { encodeBuffer(inStream, outStream); } catch (Exception IOException) { // This should never happen. throw new Error("CharacterEncoder.encodeBuffer internal error"); } return (outStream.toString()); } /** * Encode the aBuffer ByteBuffer and write the encoded * result to the OutputStream aStream. *

* The ByteBuffer's position will be advanced to ByteBuffer's limit. */ @SuppressWarnings("unused") public void encodeBuffer(ByteBuffer aBuffer, OutputStream aStream) throws IOException { byte [] buf = getBytes(aBuffer); encodeBuffer(buf, aStream); } } davmail-6.3.0/src/java/davmail/ldap/LdapConnection.java0100644 0000000 0000000 00000226356 14754417473 021532 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ldap; import davmail.AbstractConnection; import davmail.BundleMessage; import davmail.Settings; import davmail.exception.DavMailException; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.dav.DavExchangeSession; import davmail.ui.tray.DavGatewayTray; import davmail.util.IOUtil; import org.apache.log4j.Logger; import javax.naming.InvalidNameException; import javax.naming.ldap.Rdn; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.sasl.AuthorizeCallback; import javax.security.sasl.Sasl; import javax.security.sasl.SaslServer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Handle a caldav connection. */ public class LdapConnection extends AbstractConnection { private static final Logger LOGGER = Logger.getLogger(LdapConnection.class); /** * Davmail base context */ static final String BASE_CONTEXT = "ou=people"; /** * OSX server (OpenDirectory) base context */ static final String OD_BASE_CONTEXT = "o=od"; static final String OD_USER_CONTEXT = "cn=users, o=od"; static final String OD_CONFIG_CONTEXT = "cn=config, o=od"; static final String COMPUTER_CONTEXT = "cn=computers, o=od"; static final String OD_GROUP_CONTEXT = "cn=groups, o=od"; // TODO: adjust Directory Utility settings static final String COMPUTER_CONTEXT_LION = "cn=computers,o=od"; static final String OD_USER_CONTEXT_LION = "cn=users, ou=people"; /** * Root DSE naming contexts (default and OpenDirectory) */ static final List NAMING_CONTEXTS = new ArrayList<>(); static { NAMING_CONTEXTS.add(BASE_CONTEXT); NAMING_CONTEXTS.add(OD_BASE_CONTEXT); } static final List PERSON_OBJECT_CLASSES = new ArrayList<>(); static { PERSON_OBJECT_CLASSES.add("top"); PERSON_OBJECT_CLASSES.add("person"); PERSON_OBJECT_CLASSES.add("organizationalPerson"); PERSON_OBJECT_CLASSES.add("inetOrgPerson"); // OpenDirectory class for iCal PERSON_OBJECT_CLASSES.add("apple-user"); } /** * Map Exchange contact attribute names to LDAP attributes. * Used only when returningAttributes is empty in LDAP request (return all available attributes) */ static final HashMap CONTACT_TO_LDAP_ATTRIBUTE_MAP = new HashMap<>(); static { CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("imapUid", "uid"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("co", "countryname"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("extensionattribute1", "custom1"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("extensionattribute2", "custom2"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("extensionattribute3", "custom3"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("extensionattribute4", "custom4"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("smtpemail1", "mail"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("smtpemail2", "xmozillasecondemail"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("homeCountry", "mozillahomecountryname"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("homeCity", "mozillahomelocalityname"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("homePostalCode", "mozillahomepostalcode"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("homeState", "mozillahomestate"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("homeStreet", "mozillahomestreet"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("businesshomepage", "mozillaworkurl"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("nickname", "mozillanickname"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("msexchangecertificate", "msexchangecertificate;binary"); CONTACT_TO_LDAP_ATTRIBUTE_MAP.put("usersmimecertificate", "usersmimecertificate;binary"); } /** * OSX constant computer guid (used by iCal attendee completion) */ static final String COMPUTER_GUID = "52486C30-F0AB-48E3-9C37-37E9B28CDD7B"; /** * OSX constant virtual host guid (used by iCal attendee completion) */ static final String VIRTUALHOST_GUID = "D6DD8A10-1098-11DE-8C30-0800200C9A66"; /** * OSX constant value for attribute apple-serviceslocator */ static final HashMap STATIC_ATTRIBUTE_MAP = new HashMap<>(); static { STATIC_ATTRIBUTE_MAP.put("apple-serviceslocator", COMPUTER_GUID + ':' + VIRTUALHOST_GUID + ":calendar"); } /** * LDAP to Exchange Criteria Map */ // TODO: remove static final HashMap CRITERIA_MAP = new HashMap<>(); static { // assume mail starts with firstname CRITERIA_MAP.put("uid", "AN"); CRITERIA_MAP.put("mail", "FN"); CRITERIA_MAP.put("displayname", "DN"); CRITERIA_MAP.put("cn", "DN"); CRITERIA_MAP.put("givenname", "FN"); CRITERIA_MAP.put("sn", "LN"); CRITERIA_MAP.put("title", "TL"); CRITERIA_MAP.put("company", "CP"); CRITERIA_MAP.put("o", "CP"); CRITERIA_MAP.put("l", "OF"); CRITERIA_MAP.put("department", "DP"); CRITERIA_MAP.put("apple-group-realname", "DP"); } /** * LDAP to Exchange contact attribute map. */ static final HashMap LDAP_TO_CONTACT_ATTRIBUTE_MAP = new HashMap<>(); static { LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("uid", "imapUid"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mail", "smtpemail1"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("displayname", "cn"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("commonname", "cn"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("givenname", "givenName"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("surname", "sn"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("company", "o"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-group-realname", "department"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillahomelocalityname", "homeCity"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("c", "co"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("countryname", "co"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("custom1", "extensionattribute1"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("custom2", "extensionattribute2"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("custom3", "extensionattribute3"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("custom4", "extensionattribute4"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillacustom1", "extensionattribute1"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillacustom2", "extensionattribute2"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillacustom3", "extensionattribute3"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillacustom4", "extensionattribute4"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("telephonenumber", "telephoneNumber"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("orgunit", "department"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("departmentnumber", "department"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("ou", "department"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillaworkstreet2", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillahomestreet", "homeStreet"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("xmozillanickname", "nickname"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillanickname", "nickname"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("cellphone", "mobile"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("homeurl", "personalHomePage"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillahomeurl", "personalHomePage"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-user-homeurl", "personalHomePage"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillahomepostalcode", "homePostalCode"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("fax", "facsimiletelephonenumber"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillahomecountryname", "homeCountry"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("streetaddress", "street"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillaworkurl", "businesshomepage"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("workurl", "businesshomepage"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("region", "st"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("birthmonth", "bday"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("birthday", "bday"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("birthyear", "bday"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("carphone", "othermobile"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("nsaimid", "im"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("nscpaimscreenname", "im"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-imhandle", "im"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("imhandle", "im"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("xmozillasecondemail", "smtpemail2"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("notes", "description"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("pagerphone", "pager"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("pager", "pager"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("locality", "l"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("homephone", "homePhone"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillasecondemail", "smtpemail2"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("zip", "postalcode"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillahomestate", "homeState"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("modifytimestamp", "lastmodified"); // ignore attribute LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("objectclass", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillausehtmlmail", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("xmozillausehtmlmail", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("mozillahomestreet2", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("labeleduri", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-generateduid", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("uidnumber", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("gidnumber", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("jpegphoto", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-emailcontacts", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-user-picture", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_writers_usercertificate", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_writers_realname", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_writers_jpegphoto", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_guest", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_writers_linkedidentity", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_defaultlanguage", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_writers_hint", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_writers__defaultlanguage", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("_writers_picture", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-user-authenticationhint", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("external", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("userpassword", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("linkedidentity", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("homedirectory", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("authauthority", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("applefloor", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("buildingname", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("destinationindicator", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("postaladdress", null); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("homepostaladdress", null); // iCal search attribute LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("apple-serviceslocator", "apple-serviceslocator"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("msexchangecertificate;binary", "msexchangecertificate"); LDAP_TO_CONTACT_ATTRIBUTE_MAP.put("usersmimecertificate;binary", "usersmimecertificate"); } /** * LDAP filter attributes ignore map */ // TODO remove static final HashSet IGNORE_MAP = new HashSet<>(); static { IGNORE_MAP.add("objectclass"); IGNORE_MAP.add("apple-generateduid"); IGNORE_MAP.add("augmentconfiguration"); IGNORE_MAP.add("ou"); IGNORE_MAP.add("apple-realname"); IGNORE_MAP.add("apple-group-nestedgroup"); IGNORE_MAP.add("apple-group-memberguid"); IGNORE_MAP.add("macaddress"); IGNORE_MAP.add("memberuid"); } // LDAP version // static final int LDAP_VERSION2 = 0x02; static final int LDAP_VERSION3 = 0x03; // LDAP request operations static final int LDAP_REQ_BIND = 0x60; static final int LDAP_REQ_SEARCH = 0x63; static final int LDAP_REQ_UNBIND = 0x42; static final int LDAP_REQ_ABANDON = 0x50; // LDAP response operations static final int LDAP_REP_BIND = 0x61; static final int LDAP_REP_SEARCH = 0x64; static final int LDAP_REP_RESULT = 0x65; static final int LDAP_SASL_BIND_IN_PROGRESS = 0x0E; // LDAP return codes static final int LDAP_OTHER = 80; static final int LDAP_SUCCESS = 0; static final int LDAP_SIZE_LIMIT_EXCEEDED = 4; static final int LDAP_INVALID_CREDENTIALS = 49; // LDAP filter code static final int LDAP_FILTER_AND = 0xa0; static final int LDAP_FILTER_OR = 0xa1; static final int LDAP_FILTER_NOT = 0xa2; // LDAP filter operators static final int LDAP_FILTER_SUBSTRINGS = 0xa4; //static final int LDAP_FILTER_GE = 0xa5; //static final int LDAP_FILTER_LE = 0xa6; static final int LDAP_FILTER_PRESENT = 0x87; //static final int LDAP_FILTER_APPROX = 0xa8; static final int LDAP_FILTER_EQUALITY = 0xa3; // LDAP filter mode static final int LDAP_SUBSTRING_INITIAL = 0x80; static final int LDAP_SUBSTRING_ANY = 0x81; static final int LDAP_SUBSTRING_FINAL = 0x82; // BER data types static final int LBER_ENUMERATED = 0x0a; static final int LBER_SET = 0x31; static final int LBER_SEQUENCE = 0x30; // LDAP search scope static final int SCOPE_BASE_OBJECT = 0; //static final int SCOPE_ONE_LEVEL = 1; //static final int SCOPE_SUBTREE = 2; /** * Sasl server for DIGEST-MD5 authentication */ protected SaslServer saslServer; /** * raw connection inputStream */ protected BufferedInputStream is; /** * reusable BER encoder */ protected final BerEncoder responseBer = new BerEncoder(); /** * Current LDAP version (used for String encoding) */ int ldapVersion = LDAP_VERSION3; /** * Search threads map */ protected final HashMap searchThreadMap = new HashMap<>(); /** * Initialize the streams and start the thread. * * @param clientSocket LDAP client socket */ public LdapConnection(Socket clientSocket) { super(LdapConnection.class.getSimpleName(), clientSocket); try { is = new BufferedInputStream(client.getInputStream()); os = new BufferedOutputStream(client.getOutputStream()); } catch (IOException e) { close(); DavGatewayTray.error(new BundleMessage("LOG_EXCEPTION_GETTING_SOCKET_STREAMS"), e); } } protected boolean isLdapV3() { return ldapVersion == LDAP_VERSION3; } @Override public void run() { byte[] inbuf = new byte[2048]; // Buffer for reading incoming bytes int bytesread; // Number of bytes in inbuf int bytesleft; // Number of bytes that need to read for completing resp int br; // Temp; number of bytes read from stream int offset; // Offset of where to store bytes in inbuf boolean eos; // End of stream try { ExchangeSessionFactory.checkConfig(); while (true) { offset = 0; // check that it is the beginning of a sequence bytesread = is.read(inbuf, offset, 1); if (bytesread < 0) { break; // EOF } if (inbuf[offset++] != (Ber.ASN_SEQUENCE | Ber.ASN_CONSTRUCTOR)) { continue; } // get length of sequence bytesread = is.read(inbuf, offset, 1); if (bytesread < 0) { break; // EOF } int seqlen = inbuf[offset++]; // Length of ASN sequence // if high bit is on, length is encoded in the // subsequent length bytes and the number of length bytes // is equal to & 0x80 (i.e. length byte with high bit off). if ((seqlen & 0x80) == 0x80) { int seqlenlen = seqlen & 0x7f; // number of length bytes bytesread = 0; eos = false; // Read all length bytes while (bytesread < seqlenlen) { br = is.read(inbuf, offset + bytesread, seqlenlen - bytesread); if (br < 0) { eos = true; break; // EOF } bytesread += br; } // end-of-stream reached before length bytes are read if (eos) { break; // EOF } // Add contents of length bytes to determine length seqlen = 0; for (int i = 0; i < seqlenlen; i++) { seqlen = (seqlen << 8) + (inbuf[offset + i] & 0xff); } offset += bytesread; } // read in seqlen bytes bytesleft = seqlen; if ((offset + bytesleft) > inbuf.length) { byte[] nbuf = new byte[offset + bytesleft]; System.arraycopy(inbuf, 0, nbuf, 0, offset); inbuf = nbuf; } while (bytesleft > 0) { bytesread = is.read(inbuf, offset, bytesleft); if (bytesread < 0) { break; // EOF } offset += bytesread; bytesleft -= bytesread; } DavGatewayTray.switchIcon(); handleRequest(inbuf, offset); } } catch (SocketException e) { DavGatewayTray.debug(new BundleMessage("LOG_CONNECTION_CLOSED")); } catch (SocketTimeoutException e) { DavGatewayTray.debug(new BundleMessage("LOG_CLOSE_CONNECTION_ON_TIMEOUT")); } catch (Exception e) { DavGatewayTray.log(e); try { sendErr(0, LDAP_REP_BIND, e); } catch (IOException e2) { DavGatewayTray.warn(new BundleMessage("LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT"), e2); } } finally { // cancel all search threads synchronized (searchThreadMap) { for (SearchRunnable searchRunnable : searchThreadMap.values()) { searchRunnable.abandon(); } } close(); } DavGatewayTray.resetIcon(); } protected static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; protected void handleRequest(byte[] inbuf, int offset) throws IOException { //dumpBer(inbuf, offset); BerDecoder reqBer = new BerDecoder(inbuf, 0, offset); int currentMessageId = 0; try { reqBer.parseSeq(null); currentMessageId = reqBer.parseInt(); int requestOperation = reqBer.peekByte(); if (requestOperation == LDAP_REQ_BIND) { reqBer.parseSeq(null); ldapVersion = reqBer.parseInt(); // check for dn authentication userName = extractRdnValue(reqBer.parseString(isLdapV3())); if (reqBer.peekByte() == (Ber.ASN_CONTEXT | Ber.ASN_CONSTRUCTOR | 3)) { // SASL authentication reqBer.parseSeq(null); // Get mechanism, usually DIGEST-MD5 String mechanism = reqBer.parseString(isLdapV3()); byte[] serverResponse; CallbackHandler callbackHandler = callbacks -> { // look for username in callbacks for (Callback callback : callbacks) { if (callback instanceof NameCallback) { userName = extractRdnValue(((NameCallback) callback).getDefaultName()); // get password from session pool password = ExchangeSessionFactory.getUserPassword(userName); } } // handle other callbacks for (Callback callback : callbacks) { if (callback instanceof AuthorizeCallback) { ((AuthorizeCallback) callback).setAuthorized(true); } else if (callback instanceof PasswordCallback) { if (password != null) { ((PasswordCallback) callback).setPassword(password.toCharArray()); } } } }; int status; if (reqBer.bytesLeft() > 0 && saslServer != null) { byte[] clientResponse = reqBer.parseOctetString(Ber.ASN_OCTET_STR, null); serverResponse = saslServer.evaluateResponse(clientResponse); status = LDAP_SUCCESS; DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_BIND_USER", currentMessageId, userName)); try { session = ExchangeSessionFactory.getInstance(userName, password); logConnection("LOGON", userName); DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_BIND_SUCCESS")); } catch (IOException e) { logConnection("FAILED", userName); serverResponse = EMPTY_BYTE_ARRAY; status = LDAP_INVALID_CREDENTIALS; DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_BIND_INVALID_CREDENTIALS")); } } else { Map properties = new HashMap<>(); properties.put("javax.security.sasl.qop", "auth,auth-int"); saslServer = Sasl.createSaslServer(mechanism, "ldap", client.getLocalAddress().getHostAddress(), properties, callbackHandler); if (saslServer == null) { throw new IOException("Unable to create SASL server for mechanism " + mechanism); } serverResponse = saslServer.evaluateResponse(EMPTY_BYTE_ARRAY); status = LDAP_SASL_BIND_IN_PROGRESS; } responseBer.beginSeq(Ber.ASN_SEQUENCE | Ber.ASN_CONSTRUCTOR); responseBer.encodeInt(currentMessageId); responseBer.beginSeq(LDAP_REP_BIND); responseBer.encodeInt(status, LBER_ENUMERATED); // server credentials responseBer.encodeString("", isLdapV3()); responseBer.encodeString("", isLdapV3()); // challenge or response if (serverResponse != null) { responseBer.encodeOctetString(serverResponse, 0x87); } responseBer.endSeq(); responseBer.endSeq(); sendResponse(); } else { password = reqBer.parseStringWithTag(Ber.ASN_CONTEXT, isLdapV3(), null); if (userName.length() > 0 && password.length() > 0) { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_BIND_USER", currentMessageId, userName)); try { session = ExchangeSessionFactory.getInstance(userName, password); logConnection("LOGON", userName); DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_BIND_SUCCESS")); sendClient(currentMessageId, LDAP_REP_BIND, LDAP_SUCCESS, ""); } catch (IOException e) { logConnection("FAILED", userName); DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_BIND_INVALID_CREDENTIALS")); sendClient(currentMessageId, LDAP_REP_BIND, LDAP_INVALID_CREDENTIALS, ""); } } else { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_BIND_ANONYMOUS", currentMessageId)); // anonymous bind sendClient(currentMessageId, LDAP_REP_BIND, LDAP_SUCCESS, ""); } } } else if (requestOperation == LDAP_REQ_UNBIND) { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_UNBIND", currentMessageId)); if (session != null) { session = null; } } else if (requestOperation == LDAP_REQ_SEARCH) { reqBer.parseSeq(null); String dn = reqBer.parseString(isLdapV3()); int scope = reqBer.parseEnumeration(); /*int derefAliases =*/ reqBer.parseEnumeration(); int sizeLimit = reqBer.parseInt(); if (sizeLimit > 100 || sizeLimit == 0) { sizeLimit = 100; } int timelimit = reqBer.parseInt(); /*boolean typesOnly =*/ reqBer.parseBoolean(); LdapFilter ldapFilter = parseFilter(reqBer); Set returningAttributes = parseReturningAttributes(reqBer); SearchRunnable searchRunnable = new SearchRunnable(currentMessageId, dn, scope, sizeLimit, timelimit, ldapFilter, returningAttributes); if (BASE_CONTEXT.equalsIgnoreCase(dn) || OD_USER_CONTEXT.equalsIgnoreCase(dn) || OD_USER_CONTEXT_LION.equalsIgnoreCase(dn)) { // launch search in a separate thread synchronized (searchThreadMap) { searchThreadMap.put(currentMessageId, searchRunnable); } Thread searchThread = new Thread(searchRunnable); searchThread.setName(getName() + "-Search-" + currentMessageId); searchThread.start(); } else { // no need to create a separate thread, just run searchRunnable.run(); } } else if (requestOperation == LDAP_REQ_ABANDON) { int abandonMessageId; abandonMessageId = reqBer.parseIntWithTag(LDAP_REQ_ABANDON); synchronized (searchThreadMap) { SearchRunnable searchRunnable = searchThreadMap.get(abandonMessageId); if (searchRunnable != null) { searchRunnable.abandon(); searchThreadMap.remove(currentMessageId); } } DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_ABANDON_SEARCH", currentMessageId, abandonMessageId)); } else { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_UNSUPPORTED_OPERATION", requestOperation)); sendClient(currentMessageId, LDAP_REP_RESULT, LDAP_OTHER, "Unsupported operation"); } } catch (IOException e) { dumpBer(inbuf, offset); try { sendErr(currentMessageId, LDAP_REP_RESULT, e); } catch (IOException e2) { DavGatewayTray.debug(new BundleMessage("LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT"), e2); } throw e; } } /** * Extract rdn value from username * @param dn distinguished name or username * @return username */ private String extractRdnValue(String dn) throws IOException { if (dn.startsWith("uid=")) { String rdn = dn; if (rdn.indexOf(',') > 0) { rdn = rdn.substring(0, rdn.indexOf(',')); } try { return (String) new Rdn(rdn).getValue(); } catch (InvalidNameException e) { throw new IOException(e); } } else { return dn; } } protected void dumpBer(byte[] inbuf, int offset) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); Ber.dumpBER(baos, "LDAP request buffer\n", inbuf, 0, offset); LOGGER.debug(new String(baos.toByteArray(), StandardCharsets.UTF_8)); } protected LdapFilter parseFilter(BerDecoder reqBer) throws IOException { LdapFilter ldapFilter; if (reqBer.peekByte() == LDAP_FILTER_PRESENT) { String attributeName = reqBer.parseStringWithTag(LDAP_FILTER_PRESENT, isLdapV3(), null).toLowerCase(); ldapFilter = new SimpleFilter(attributeName); } else { int[] seqSize = new int[1]; int ldapFilterType = reqBer.parseSeq(seqSize); int end = reqBer.getParsePosition() + seqSize[0]; ldapFilter = parseNestedFilter(reqBer, ldapFilterType, end); } return ldapFilter; } protected LdapFilter parseNestedFilter(BerDecoder reqBer, int ldapFilterType, int end) throws IOException { LdapFilter nestedFilter; if ((ldapFilterType == LDAP_FILTER_OR) || (ldapFilterType == LDAP_FILTER_AND) || ldapFilterType == LDAP_FILTER_NOT) { nestedFilter = new CompoundFilter(ldapFilterType); while (reqBer.getParsePosition() < end && reqBer.bytesLeft() > 0) { if (reqBer.peekByte() == LDAP_FILTER_PRESENT) { String attributeName = reqBer.parseStringWithTag(LDAP_FILTER_PRESENT, isLdapV3(), null).toLowerCase(); nestedFilter.add(new SimpleFilter(attributeName)); } else { int[] seqSize = new int[1]; int ldapFilterOperator = reqBer.parseSeq(seqSize); int subEnd = reqBer.getParsePosition() + seqSize[0]; nestedFilter.add(parseNestedFilter(reqBer, ldapFilterOperator, subEnd)); } } } else { // simple filter nestedFilter = parseSimpleFilter(reqBer, ldapFilterType); } return nestedFilter; } protected LdapFilter parseSimpleFilter(BerDecoder reqBer, int ldapFilterOperator) throws IOException { String attributeName = reqBer.parseString(isLdapV3()).toLowerCase(); int ldapFilterMode = 0; StringBuilder value = new StringBuilder(); if (ldapFilterOperator == LDAP_FILTER_SUBSTRINGS) { // Thunderbird sends values with space as separate strings, rebuild value int[] seqSize = new int[1]; /*LBER_SEQUENCE*/ reqBer.parseSeq(seqSize); int end = reqBer.getParsePosition() + seqSize[0]; while (reqBer.getParsePosition() < end && reqBer.bytesLeft() > 0) { ldapFilterMode = reqBer.peekByte(); if (value.length() > 0) { value.append(' '); } value.append(reqBer.parseStringWithTag(ldapFilterMode, isLdapV3(), null)); } } else if (ldapFilterOperator == LDAP_FILTER_EQUALITY) { value.append(reqBer.parseString(isLdapV3())); } else { DavGatewayTray.warn(new BundleMessage("LOG_LDAP_UNSUPPORTED_FILTER_VALUE")); } String sValue = value.toString(); if ("uid".equalsIgnoreCase(attributeName) && sValue.equals(userName)) { // replace with actual alias instead of login name search, only in Dav mode if (session instanceof DavExchangeSession) { sValue = session.getAlias(); DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REPLACED_UID_FILTER", userName, sValue)); } } return new SimpleFilter(attributeName, sValue, ldapFilterOperator, ldapFilterMode); } protected Set parseReturningAttributes(BerDecoder reqBer) throws IOException { Set returningAttributes = new HashSet<>(); int[] seqSize = new int[1]; reqBer.parseSeq(seqSize); int end = reqBer.getParsePosition() + seqSize[0]; while (reqBer.getParsePosition() < end && reqBer.bytesLeft() > 0) { returningAttributes.add(reqBer.parseString(isLdapV3()).toLowerCase()); } return returningAttributes; } /** * Send Root DSE * * @param currentMessageId current message id * @throws IOException on error */ protected void sendRootDSE(int currentMessageId) throws IOException { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_SEND_ROOT_DSE")); Map attributes = new HashMap<>(); attributes.put("objectClass", "top"); attributes.put("namingContexts", NAMING_CONTEXTS); //attributes.put("supportedsaslmechanisms", "PLAIN"); sendEntry(currentMessageId, "Root DSE", attributes); } protected void addIf(Map attributes, Set returningAttributes, String name, Object value) { if ((returningAttributes.isEmpty()) || returningAttributes.contains(name)) { attributes.put(name, value); } } protected String currentHostName; protected String getCurrentHostName() throws UnknownHostException { if (currentHostName == null) { InetAddress clientInetAddress = client.getInetAddress(); if (clientInetAddress != null && clientInetAddress.isLoopbackAddress()) { // local address, probably using localhost in iCal URL currentHostName = "localhost"; } else { // remote address, send fully qualified domain name currentHostName = InetAddress.getLocalHost().getCanonicalHostName(); } } return currentHostName; } /** * Cache serviceInfo string value */ protected String serviceInfo; protected String getServiceInfo() throws UnknownHostException { if (serviceInfo == null) { serviceInfo = ("" + "" + "" + "" + "com.apple.macosxserver.host" + "" + "localhost" + // NOTE: Will be replaced by real hostname "" + "com.apple.macosxserver.virtualhosts" + "" + "" + VIRTUALHOST_GUID + "" + "" + "hostDetails" + "" + "http" + "" + "enabled" + "" + "port" + "") + Settings.getProperty("davmail.caldavPort") + "" + "" + "https" + "" + "disabled" + "" + "port" + "0" + "" + "" + "hostname" + "" + getCurrentHostName() + "" + "serviceInfo" + "" + "calendar" + "" + "enabled" + "" + "templates" + "" + "calendarUserAddresses" + "" + "%(principaluri)s" + "mailto:%(email)s" + "urn:uuid:%(guid)s" + "" + "principalPath" + "/principals/__uuids__/%(guid)s/" + "" + "" + "" + "serviceType" + "" + "calendar" + "" + "" + "" + "" + ""; } return serviceInfo; } /** * Send ComputerContext * * @param currentMessageId current message id * @param returningAttributes attributes to return * @throws IOException on error */ protected void sendComputerContext(int currentMessageId, Set returningAttributes) throws IOException { List objectClasses = new ArrayList<>(); objectClasses.add("top"); objectClasses.add("apple-computer"); Map attributes = new HashMap<>(); addIf(attributes, returningAttributes, "objectClass", objectClasses); addIf(attributes, returningAttributes, "apple-generateduid", COMPUTER_GUID); addIf(attributes, returningAttributes, "apple-serviceinfo", getServiceInfo()); // TODO: remove ? addIf(attributes, returningAttributes, "apple-xmlplist", getServiceInfo()); addIf(attributes, returningAttributes, "apple-serviceslocator", "::anyService"); addIf(attributes, returningAttributes, "cn", getCurrentHostName()); String dn = "cn=" + getCurrentHostName() + ", " + COMPUTER_CONTEXT; DavGatewayTray.debug(new BundleMessage("LOG_LDAP_SEND_COMPUTER_CONTEXT", dn, attributes)); sendEntry(currentMessageId, dn, attributes); } /** * Send Base Context * * @param currentMessageId current message id * @throws IOException on error */ protected void sendBaseContext(int currentMessageId) throws IOException { List objectClasses = new ArrayList<>(); objectClasses.add("top"); objectClasses.add("organizationalUnit"); Map attributes = new HashMap<>(); attributes.put("objectClass", objectClasses); attributes.put("description", "DavMail Gateway LDAP for " + Settings.getProperty("davmail.url", Settings.getO365Url())); sendEntry(currentMessageId, BASE_CONTEXT, attributes); } protected void sendEntry(int currentMessageId, String dn, Map attributes) throws IOException { // synchronize on responseBer synchronized (responseBer) { responseBer.reset(); responseBer.beginSeq(Ber.ASN_SEQUENCE | Ber.ASN_CONSTRUCTOR); responseBer.encodeInt(currentMessageId); responseBer.beginSeq(LDAP_REP_SEARCH); responseBer.encodeString(dn, isLdapV3()); responseBer.beginSeq(LBER_SEQUENCE); for (Map.Entry entry : attributes.entrySet()) { responseBer.beginSeq(LBER_SEQUENCE); responseBer.encodeString(entry.getKey(), isLdapV3()); responseBer.beginSeq(LBER_SET); Object values = entry.getValue(); if (values instanceof String) { responseBer.encodeString((String) values, isLdapV3()); } else if (values instanceof List) { for (Object value : (Iterable) values) { responseBer.encodeString((String) value, isLdapV3()); } } else if (values instanceof byte[]) { responseBer.encodeOctetString((byte[])values, BerEncoder.ASN_OCTET_STR); } else { throw new DavMailException("EXCEPTION_UNSUPPORTED_VALUE", values); } responseBer.endSeq(); responseBer.endSeq(); } responseBer.endSeq(); responseBer.endSeq(); responseBer.endSeq(); sendResponse(); } } protected void sendErr(int currentMessageId, int responseOperation, Exception e) throws IOException { String message = e.getMessage(); if (message == null) { message = e.toString(); } sendClient(currentMessageId, responseOperation, LDAP_OTHER, message); } protected void sendClient(int currentMessageId, int responseOperation, int status, String message) throws IOException { responseBer.reset(); responseBer.beginSeq(Ber.ASN_SEQUENCE | Ber.ASN_CONSTRUCTOR); responseBer.encodeInt(currentMessageId); responseBer.beginSeq(responseOperation); responseBer.encodeInt(status, LBER_ENUMERATED); // dn responseBer.encodeString("", isLdapV3()); // error message responseBer.encodeString(message, isLdapV3()); responseBer.endSeq(); responseBer.endSeq(); sendResponse(); } protected void sendResponse() throws IOException { //Ber.dumpBER(System.out, ">\n", responseBer.getBuf(), 0, responseBer.getDataLen()); os.write(responseBer.getBuf(), 0, responseBer.getDataLen()); os.flush(); } interface LdapFilter { ExchangeSession.Condition getContactSearchFilter(); Map findInGAL(ExchangeSession session, Set returningAttributes, int sizeLimit) throws IOException; void add(LdapFilter filter); boolean isFullSearch(); boolean isMatch(ExchangeSession.Contact person); } class CompoundFilter implements LdapFilter { final Set criteria = new HashSet<>(); final int type; CompoundFilter(int filterType) { type = filterType; } @Override public String toString() { StringBuilder buffer = new StringBuilder(); if (type == LDAP_FILTER_OR) { buffer.append("(|"); } else if (type == LDAP_FILTER_AND) { buffer.append("(&"); } else { buffer.append("(!"); } for (LdapFilter child : criteria) { buffer.append(child.toString()); } buffer.append(')'); return buffer.toString(); } /** * Add child filter * * @param filter inner filter */ public void add(LdapFilter filter) { criteria.add(filter); } /** * This is only a full search if every child * is also a full search * * @return true if full search filter */ public boolean isFullSearch() { for (LdapFilter child : criteria) { if (!child.isFullSearch()) { return false; } } return true; } /** * Build search filter for Contacts folder search. * Use Exchange SEARCH syntax * * @return contact search filter */ public ExchangeSession.Condition getContactSearchFilter() { ExchangeSession.MultiCondition condition; if (type == LDAP_FILTER_OR) { condition = session.or(); } else { condition = session.and(); } for (LdapFilter child : criteria) { condition.add(child.getContactSearchFilter()); } return condition; } /** * Test if person matches the current filter. * * @param person person attributes map * @return true if filter match */ public boolean isMatch(ExchangeSession.Contact person) { if (type == LDAP_FILTER_OR) { for (LdapFilter child : criteria) { if (!child.isFullSearch()) { if (child.isMatch(person)) { // We've found a match return true; } } } // No subconditions are met return false; } else if (type == LDAP_FILTER_AND) { for (LdapFilter child : criteria) { if (!child.isFullSearch()) { if (!child.isMatch(person)) { // We've found a miss return false; } } } // All subconditions are met return true; } return false; } /** * Find persons in Exchange GAL matching filter. * Iterate over child filters to build results. * * @param session Exchange session * @return persons map * @throws IOException on error */ public Map findInGAL(ExchangeSession session, Set returningAttributes, int sizeLimit) throws IOException { Map persons = null; for (LdapFilter child : criteria) { int currentSizeLimit = sizeLimit; if (persons != null) { currentSizeLimit -= persons.size(); } Map childFind = child.findInGAL(session, returningAttributes, currentSizeLimit); if (childFind != null) { if (persons == null) { persons = childFind; } else if (type == LDAP_FILTER_OR) { // Create the union of the existing results and the child found results persons.putAll(childFind); } else if (type == LDAP_FILTER_AND) { // Append current child filter results that match all child filters to persons. // The hard part is that, due to the 100-item-returned galFind limit // we may catch new items that match all child filters in each child search. // Thus, instead of building the intersection, we check each result against // all filters. for (ExchangeSession.Contact result : childFind.values()) { if (isMatch(result)) { // This item from the child result set matches all sub-criteria, add it persons.put(result.get("uid"), result); } } } } } if ((persons == null) && !isFullSearch()) { // return an empty map (indicating no results were found) return new HashMap<>(); } return persons; } } class SimpleFilter implements LdapFilter { static final String STAR = "*"; final String attributeName; final String value; final int mode; final int operator; final boolean canIgnore; SimpleFilter(String attributeName) { this.attributeName = attributeName; this.value = SimpleFilter.STAR; this.operator = LDAP_FILTER_SUBSTRINGS; this.mode = 0; this.canIgnore = checkIgnore(); } SimpleFilter(String attributeName, String value, int ldapFilterOperator, int ldapFilterMode) { this.attributeName = attributeName; this.value = value; this.operator = ldapFilterOperator; this.mode = ldapFilterMode; this.canIgnore = checkIgnore(); } private boolean checkIgnore() { if ("objectclass".equals(attributeName) && STAR.equals(value)) { // ignore cases where any object class can match return true; } else if (IGNORE_MAP.contains(attributeName)) { // Ignore this specific attribute return true; } else if (CRITERIA_MAP.get(attributeName) == null && getContactAttributeName(attributeName) == null) { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_UNSUPPORTED_FILTER_ATTRIBUTE", attributeName, value)); return true; } return false; } public boolean isFullSearch() { // only (objectclass=*) is a full search return "objectclass".equals(attributeName) && STAR.equals(value); } @Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append('('); buffer.append(attributeName); buffer.append('='); if (SimpleFilter.STAR.equals(value)) { buffer.append(SimpleFilter.STAR); } else if (operator == LDAP_FILTER_SUBSTRINGS) { if (mode == LDAP_SUBSTRING_FINAL || mode == LDAP_SUBSTRING_ANY) { buffer.append(SimpleFilter.STAR); } buffer.append(value); if (mode == LDAP_SUBSTRING_INITIAL || mode == LDAP_SUBSTRING_ANY) { buffer.append(SimpleFilter.STAR); } } else { buffer.append(value); } buffer.append(')'); return buffer.toString(); } public ExchangeSession.Condition getContactSearchFilter() { String contactAttributeName = getContactAttributeName(attributeName); if (canIgnore || (contactAttributeName == null)) { return null; } ExchangeSession.Condition condition = null; if (operator == LDAP_FILTER_EQUALITY) { condition = session.isEqualTo(contactAttributeName, value); } else if ("*".equals(value)) { condition = session.not(session.isNull(contactAttributeName)); // do not allow substring search on integer field imapUid } else if (!"imapUid".equals(contactAttributeName)) { // endsWith not supported by exchange, convert to contains if (mode == LDAP_SUBSTRING_FINAL || mode == LDAP_SUBSTRING_ANY) { condition = session.contains(contactAttributeName, value); } else { condition = session.startsWith(contactAttributeName, value); } } return condition; } public boolean isMatch(ExchangeSession.Contact person) { if (canIgnore) { // Ignore this filter return true; } String contactAttributeName = getContactAttributeName(attributeName); String personAttributeValue = person.get(contactAttributeName); if (personAttributeValue == null) { // No value to allow for filter match return false; } else if (value == null) { // This is a presence filter: found return true; } else if ((operator == LDAP_FILTER_EQUALITY) && personAttributeValue.equalsIgnoreCase(value)) { // Found an exact match return true; } else //noinspection RedundantIfStatement if ((operator == LDAP_FILTER_SUBSTRINGS) && (personAttributeValue.toLowerCase().contains(value.toLowerCase()))) { // Found a substring match return true; } return false; } public Map findInGAL(ExchangeSession session, Set returningAttributes, int sizeLimit) throws IOException { if (canIgnore) { return null; } String contactAttributeName = getContactAttributeName(attributeName); if (contactAttributeName != null) { // quick fix for cn=* filter Map galPersons = session.galFind(session.startsWith(contactAttributeName, "*".equals(value) ? "A" : value), convertLdapToContactReturningAttributes(returningAttributes), sizeLimit); if (operator == LDAP_FILTER_EQUALITY) { // Make sure only exact matches are returned Map results = new HashMap<>(); for (ExchangeSession.Contact person : galPersons.values()) { if (isMatch(person)) { // Found an exact match results.put(person.get("uid"), person); } } return results; } else { return galPersons; } } return null; } public void add(LdapFilter filter) { // Should never be called DavGatewayTray.error(new BundleMessage("LOG_LDAP_UNSUPPORTED_FILTER", "nested simple filters")); } } /** * Convert contact attribute name to LDAP attribute name. * * @param ldapAttributeName ldap attribute name * @return contact attribute name */ protected static String getContactAttributeName(String ldapAttributeName) { String contactAttributeName = null; // first look in contact attributes if (ExchangeSession.CONTACT_ATTRIBUTES.contains(ldapAttributeName)) { contactAttributeName = ldapAttributeName; } else if (LDAP_TO_CONTACT_ATTRIBUTE_MAP.containsKey(ldapAttributeName)) { String mappedAttribute = LDAP_TO_CONTACT_ATTRIBUTE_MAP.get(ldapAttributeName); if (mappedAttribute != null) { contactAttributeName = mappedAttribute; } } else if (!"hassubordinates".equals(ldapAttributeName)){ DavGatewayTray.debug(new BundleMessage("UNKNOWN_ATTRIBUTE", ldapAttributeName)); } return contactAttributeName; } /** * Convert LDAP attribute name to contact attribute name. * * @param contactAttributeName ldap attribute name * @return contact attribute name */ protected static String getLdapAttributeName(String contactAttributeName) { String mappedAttributeName = CONTACT_TO_LDAP_ATTRIBUTE_MAP.get(contactAttributeName); if (mappedAttributeName != null) { return mappedAttributeName; } else { return contactAttributeName; } } protected Set convertLdapToContactReturningAttributes(Set returningAttributes) { Set contactReturningAttributes; if (returningAttributes != null && !returningAttributes.isEmpty()) { contactReturningAttributes = new HashSet<>(); // always return uid contactReturningAttributes.add("imapUid"); for (String attribute : returningAttributes) { String contactAttributeName = getContactAttributeName(attribute); if (contactAttributeName != null) { contactReturningAttributes.add(contactAttributeName); } } } else { contactReturningAttributes = ExchangeSession.CONTACT_ATTRIBUTES; } return contactReturningAttributes; } protected class SearchRunnable implements Runnable { private final int currentMessageId; private final String dn; private final int scope; private final int sizeLimit; private final int timelimit; private final LdapFilter ldapFilter; private final Set returningAttributes; private boolean abandon; protected SearchRunnable(int currentMessageId, String dn, int scope, int sizeLimit, int timelimit, LdapFilter ldapFilter, Set returningAttributes) { this.currentMessageId = currentMessageId; this.dn = dn; this.scope = scope; this.sizeLimit = sizeLimit; this.timelimit = timelimit; this.ldapFilter = ldapFilter; this.returningAttributes = returningAttributes; } /** * Abandon search. */ protected void abandon() { abandon = true; } public void run() { try { int size = 0; DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH", currentMessageId, dn, scope, sizeLimit, timelimit, ldapFilter.toString(), returningAttributes)); if (scope == SCOPE_BASE_OBJECT) { if (dn != null && dn.length() == 0) { size = 1; sendRootDSE(currentMessageId); } else if (BASE_CONTEXT.equals(dn)) { size = 1; // root sendBaseContext(currentMessageId); } else if (dn != null && dn.startsWith("uid=") && dn.indexOf(',') > 0) { if (session != null) { // single user request String uid = dn.substring("uid=".length(), dn.indexOf(',')); Map persons = null; // first search in contact try { // check if this is a contact uid Integer.parseInt(uid); persons = contactFind(session.isEqualTo("imapUid", uid), returningAttributes, sizeLimit); } catch (NumberFormatException e) { // ignore, this is not a contact uid } // then in GAL if (persons == null || persons.isEmpty()) { persons = session.galFind(session.isEqualTo("imapUid", uid), convertLdapToContactReturningAttributes(returningAttributes), sizeLimit); ExchangeSession.Contact person = persons.get(uid.toLowerCase()); // filter out non exact results if (persons.size() > 1 || person == null) { persons = new HashMap<>(); if (person != null) { persons.put(uid.toLowerCase(), person); } } } size = persons.size(); sendPersons(currentMessageId, dn.substring(dn.indexOf(',')), persons, returningAttributes); } else { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_ANONYMOUS_ACCESS_FORBIDDEN", currentMessageId, dn)); } } else { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_INVALID_DN", currentMessageId, dn)); } } else if (COMPUTER_CONTEXT.equals(dn) || COMPUTER_CONTEXT_LION.equals(dn)) { size = 1; // computer context for iCal sendComputerContext(currentMessageId, returningAttributes); } else if ((BASE_CONTEXT.equalsIgnoreCase(dn) || OD_USER_CONTEXT.equalsIgnoreCase(dn)) || OD_USER_CONTEXT_LION.equalsIgnoreCase(dn)) { if (session != null) { Map persons = new HashMap<>(); if (ldapFilter.isFullSearch()) { // append personal contacts first for (ExchangeSession.Contact person : contactFind(null, returningAttributes, sizeLimit).values()) { persons.put(person.get("imapUid"), person); if (persons.size() == sizeLimit) { break; } } // full search for (char c = 'A'; c <= 'Z'; c++) { if (!abandon && persons.size() < sizeLimit) { for (ExchangeSession.Contact person : session.galFind(session.startsWith("cn", String.valueOf(c)), convertLdapToContactReturningAttributes(returningAttributes), sizeLimit).values()) { persons.put(person.get("uid"), person); if (persons.size() == sizeLimit) { break; } } } if (persons.size() == sizeLimit) { break; } } } else { // append personal contacts first ExchangeSession.Condition filter = ldapFilter.getContactSearchFilter(); // if ldapfilter is not a full search and filter is null, // ignored all attribute filters => return empty results if (ldapFilter.isFullSearch() || filter != null) { for (ExchangeSession.Contact person : contactFind(filter, returningAttributes, sizeLimit).values()) { persons.put(person.get("imapUid"), person); if (persons.size() == sizeLimit) { break; } } if (!abandon && persons.size() < sizeLimit) { for (ExchangeSession.Contact person : ldapFilter.findInGAL(session, returningAttributes, sizeLimit - persons.size()).values()) { if (persons.size() == sizeLimit) { break; } persons.put(person.get("uid"), person); } } } } size = persons.size(); DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_FOUND_RESULTS", currentMessageId, size)); sendPersons(currentMessageId, ", " + dn, persons, returningAttributes); DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_END", currentMessageId)); } else { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_ANONYMOUS_ACCESS_FORBIDDEN", currentMessageId, dn)); } } else if (dn != null && dn.length() > 0 && !OD_CONFIG_CONTEXT.equals(dn) && !OD_GROUP_CONTEXT.equals(dn)) { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_INVALID_DN", currentMessageId, dn)); } // iCal: do not send LDAP_SIZE_LIMIT_EXCEEDED on apple-computer search by cn with sizelimit 1 if (size > 1 && size == sizeLimit) { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_SIZE_LIMIT_EXCEEDED", currentMessageId)); sendClient(currentMessageId, LDAP_REP_RESULT, LDAP_SIZE_LIMIT_EXCEEDED, ""); } else { DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_SUCCESS", currentMessageId)); sendClient(currentMessageId, LDAP_REP_RESULT, LDAP_SUCCESS, ""); } } catch (SocketException e) { // client closed connection LOGGER.warn(BundleMessage.formatLog("LOG_CLIENT_CLOSED_CONNECTION")); } catch (IOException e) { DavGatewayTray.log(e); try { sendErr(currentMessageId, LDAP_REP_RESULT, e); } catch (IOException e2) { DavGatewayTray.debug(new BundleMessage("LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT"), e2); } } finally { synchronized (searchThreadMap) { searchThreadMap.remove(currentMessageId); } } DavGatewayTray.resetIcon(); } /** * Search users in contacts folder * * @param condition search filter * @param returningAttributes requested attributes * @param maxCount maximum item count * @return List of users * @throws IOException on error */ public Map contactFind(ExchangeSession.Condition condition, Set returningAttributes, int maxCount) throws IOException { Map results = new HashMap<>(); Set contactReturningAttributes = convertLdapToContactReturningAttributes(returningAttributes); contactReturningAttributes.remove("apple-serviceslocator"); List contacts = session.searchContacts(ExchangeSession.CONTACTS, contactReturningAttributes, condition, maxCount); for (ExchangeSession.Contact contact : contacts) { // use imapUid as uid String imapUid = contact.get("imapUid"); if (imapUid != null) { results.put(imapUid, contact); } } return results; } /** * Convert to LDAP attributes and send entry * * @param currentMessageId current Message Id * @param baseContext request base context (BASE_CONTEXT or OD_BASE_CONTEXT) * @param persons persons Map * @param returningAttributes returning attributes * @throws IOException on error */ protected void sendPersons(int currentMessageId, String baseContext, Map persons, Set returningAttributes) throws IOException { boolean needObjectClasses = returningAttributes.contains("objectclass") || returningAttributes.isEmpty(); boolean returnAllAttributes = returningAttributes.isEmpty(); for (ExchangeSession.Contact person : persons.values()) { if (abandon) { break; } Map ldapPerson = new HashMap<>(); // convert Contact entries if (returnAllAttributes) { // just convert contact attributes to default ldap names for (Map.Entry entry : person.entrySet()) { String ldapAttribute = getLdapAttributeName(entry.getKey()); String value = entry.getValue(); if (value != null) { ldapPerson.put(ldapAttribute, value); } } } else { // always map uid ldapPerson.put("uid", person.get("imapUid")); // iterate over requested attributes for (String ldapAttribute : returningAttributes) { String contactAttribute = getContactAttributeName(ldapAttribute); String value = person.get(contactAttribute); if (value != null) { if (ldapAttribute.startsWith("birth")) { SimpleDateFormat parser = ExchangeSession.getZuluDateFormat(); Calendar calendar = Calendar.getInstance(); try { calendar.setTime(parser.parse(value)); } catch (ParseException e) { throw new IOException(e + " " + e.getMessage()); } switch (ldapAttribute) { case "birthday": value = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)); break; case "birthmonth": value = String.valueOf(calendar.get(Calendar.MONTH) + 1); break; case "birthyear": value = String.valueOf(calendar.get(Calendar.YEAR)); break; } } ldapPerson.put(ldapAttribute, value); } else if ("hassubordinates".equals(ldapAttribute)) { ldapPerson.put(ldapAttribute, "false"); } } } // Process all attributes which have static mappings for (Map.Entry entry : STATIC_ATTRIBUTE_MAP.entrySet()) { String ldapAttribute = entry.getKey(); String value = entry.getValue(); if (value != null && (returnAllAttributes || returningAttributes.contains(ldapAttribute))) { ldapPerson.put(ldapAttribute, value); } } if (needObjectClasses) { ldapPerson.put("objectClass", PERSON_OBJECT_CLASSES); } // iCal: copy email to apple-generateduid, encode @ if (returnAllAttributes || returningAttributes.contains("apple-generateduid")) { String mail = (String) ldapPerson.get("mail"); if (mail != null) { ldapPerson.put("apple-generateduid", mail.replaceAll("@", "__AT__")); } else { // failover, should not happen ldapPerson.put("apple-generateduid", ldapPerson.get("uid")); } } if (ldapPerson.containsKey("msexchangecertificate;binary")) { String certificate = (String) ldapPerson.get("msexchangecertificate;binary"); ldapPerson.put("msexchangecertificate;binary", IOUtil.decodeBase64(certificate)); } if (ldapPerson.containsKey("usersmimecertificate;binary")) { String certificate = (String) ldapPerson.get("usersmimecertificate;binary"); ldapPerson.put("usersmimecertificate;binary", IOUtil.decodeBase64(certificate)); } // iCal: replace current user alias with login name if (session.getAlias().equals(ldapPerson.get("uid"))) { if (returningAttributes.contains("uidnumber")) { ldapPerson.put("uidnumber", userName); } } DavGatewayTray.debug(new BundleMessage("LOG_LDAP_REQ_SEARCH_SEND_PERSON", currentMessageId, ldapPerson.get("uid"), baseContext, ldapPerson)); try { sendEntry(currentMessageId, new Rdn("uid", ldapPerson.get("uid")) + baseContext, ldapPerson); } catch (InvalidNameException e) { throw new IOException(e); } } } } } davmail-6.3.0/src/java/davmail/ldap/LdapServer.java0100644 0000000 0000000 00000003316 12564151516 020654 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ldap; import davmail.AbstractConnection; import davmail.AbstractServer; import davmail.Settings; import java.net.Socket; /** * LDAP server, handle LDAP directory requests. */ public class LdapServer extends AbstractServer { /** * Default LDAP port */ public static final int DEFAULT_PORT = 389; /** * Create a ServerSocket to listen for connections. * Start the thread. * * @param port pop listen port, 389 if not defined (0) */ public LdapServer(int port) { super(LdapServer.class.getName(), port, LdapServer.DEFAULT_PORT); nosslFlag = Settings.getBooleanProperty("davmail.ssl.nosecureldap"); } @Override public String getProtocolName() { return "LDAP"; } @Override public AbstractConnection createConnectionHandler(Socket clientSocket) { return new LdapConnection(clientSocket); } }davmail-6.3.0/src/java/davmail/pop/PopConnection.java0100644 0000000 0000000 00000035740 13574116520 021245 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.pop; import davmail.AbstractConnection; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.exchange.DoubleDotOutputStream; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.MessageLoadThread; import davmail.ui.tray.DavGatewayTray; import davmail.util.IOUtil; import org.apache.log4j.Logger; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.List; import java.util.StringTokenizer; /** * Dav Gateway pop connection implementation */ public class PopConnection extends AbstractConnection { private static final Logger LOGGER = Logger.getLogger(PopConnection.class); private List messages; /** * Initialize the streams and start the thread. * * @param clientSocket POP client socket */ public PopConnection(Socket clientSocket) { super(PopConnection.class.getSimpleName(), clientSocket, null); } protected long getTotalMessagesLength() { int result = 0; for (ExchangeSession.Message message : messages) { result += message.size; } return result; } protected void printCapabilities() throws IOException { sendClient("TOP"); sendClient("USER"); sendClient("UIDL"); sendClient("."); } protected void printList() throws IOException { int i = 1; for (ExchangeSession.Message message : messages) { sendClient(i++ + " " + message.size); } sendClient("."); } protected void printUidList() throws IOException { int i = 1; for (ExchangeSession.Message message : messages) { sendClient(i++ + " " + message.getUid()); } sendClient("."); } @Override public void run() { String line; StringTokenizer tokens; try { ExchangeSessionFactory.checkConfig(); sendOK("DavMail " + DavGateway.getCurrentVersion() + " POP ready at " + new Date()); for (; ;) { line = readClient(); // unable to read line, connection closed ? if (line == null) { break; } tokens = new StringTokenizer(line); if (tokens.hasMoreTokens()) { String command = tokens.nextToken(); if ("QUIT".equalsIgnoreCase(command)) { // delete messages before quit if (session != null) { session.purgeOldestTrashAndSentMessages(); } sendOK("Bye"); break; } else if ("USER".equalsIgnoreCase(command)) { userName = null; password = null; session = null; if (tokens.hasMoreTokens()) { userName = line.substring("USER ".length()); sendOK("USER : " + userName); state = State.USER; } else { sendERR("invalid syntax"); state = State.INITIAL; } } else if ("PASS".equalsIgnoreCase(command)) { if (state != State.USER) { sendERR("invalid state"); state = State.INITIAL; } else if (!tokens.hasMoreTokens()) { sendERR("invalid syntax"); } else { // bug 2194492 : allow space in password password = line.substring("PASS".length() + 1); try { session = ExchangeSessionFactory.getInstance(userName, password); logConnection("LOGON", userName); sendOK("PASS"); state = State.AUTHENTICATED; } catch (SocketException e) { logConnection("FAILED", userName); // can not send error to client after a socket exception LOGGER.warn(BundleMessage.formatLog("LOG_CLIENT_CLOSED_CONNECTION")); } catch (Exception e) { DavGatewayTray.error(e); sendERR(e); } } } else if ("CAPA".equalsIgnoreCase(command)) { sendOK("Capability list follows"); printCapabilities(); } else if (state != State.AUTHENTICATED) { sendERR("Invalid state not authenticated"); } else { // load messages (once) if (messages == null) { messages = session.getAllMessageUidAndSize("INBOX"); } if ("STAT".equalsIgnoreCase(command)) { sendOK(messages.size() + " " + getTotalMessagesLength()); } else if ("NOOP".equalsIgnoreCase(command)) { sendOK(""); } else if ("LIST".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { String token = tokens.nextToken(); try { int messageNumber = Integer.parseInt(token); ExchangeSession.Message message = messages.get(messageNumber - 1); sendOK("" + messageNumber + ' ' + message.size); } catch (NumberFormatException | IndexOutOfBoundsException e) { sendERR("Invalid message index: " + token); } } else { sendOK(messages.size() + " messages (" + getTotalMessagesLength() + " octets)"); printList(); } } else if ("UIDL".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { String token = tokens.nextToken(); try { int messageNumber = Integer.parseInt(token); sendOK(messageNumber + " " + messages.get(messageNumber - 1).getUid()); } catch (NumberFormatException | IndexOutOfBoundsException e) { sendERR("Invalid message index: " + token); } } else { sendOK(messages.size() + " messages (" + getTotalMessagesLength() + " octets)"); printUidList(); } } else if ("RETR".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { try { int messageNumber = Integer.parseInt(tokens.nextToken()) - 1; ExchangeSession.Message message = messages.get(messageNumber); // load big messages in a separate thread os.write("+OK ".getBytes(StandardCharsets.US_ASCII)); os.flush(); MessageLoadThread.loadMimeMessage(message, os); sendClient(""); DoubleDotOutputStream doubleDotOutputStream = new DoubleDotOutputStream(os); IOUtil.write(message.getRawInputStream(), doubleDotOutputStream); doubleDotOutputStream.close(); if (Settings.getBooleanProperty("davmail.popMarkReadOnRetr")) { message.markRead(); } } catch (SocketException e) { // can not send error to client after a socket exception LOGGER.warn(BundleMessage.formatLog("LOG_CLIENT_CLOSED_CONNECTION")); } catch (Exception e) { DavGatewayTray.error(new BundleMessage("LOG_ERROR_RETRIEVING_MESSAGE"), e); sendERR("error retrieving message " + e + ' ' + e.getMessage()); } } else { sendERR("invalid message index"); } } else if ("DELE".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { ExchangeSession.Message message; try { int messageNumber = Integer.parseInt(tokens.nextToken()) - 1; message = messages.get(messageNumber); message.moveToTrash(); sendOK("DELETE"); } catch (NumberFormatException | IndexOutOfBoundsException e) { sendERR("invalid message index"); } } else { sendERR("invalid message index"); } } else if ("TOP".equalsIgnoreCase(command)) { int message = 0; try { message = Integer.parseInt(tokens.nextToken()); int lines = Integer.parseInt(tokens.nextToken()); ExchangeSession.Message m = messages.get(message - 1); sendOK(""); DoubleDotOutputStream doubleDotOutputStream = new DoubleDotOutputStream(os); IOUtil.write(m.getRawInputStream(), new TopOutputStream(doubleDotOutputStream, lines)); doubleDotOutputStream.close(); } catch (NumberFormatException e) { sendERR("invalid command"); } catch (IndexOutOfBoundsException e) { sendERR("invalid message index: " + message); } catch (Exception e) { sendERR("error retreiving top of messages"); DavGatewayTray.error(e); } } else if ("RSET".equalsIgnoreCase(command)) { sendOK("RSET"); } else { sendERR("unknown command"); } } } else { sendERR("unknown command"); } os.flush(); } } catch (SocketException e) { DavGatewayTray.debug(new BundleMessage("LOG_CONNECTION_CLOSED")); } catch (Exception e) { DavGatewayTray.log(e); try { sendERR(e.getMessage()); } catch (IOException e2) { DavGatewayTray.debug(new BundleMessage("LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT"), e2); } } finally { close(); } DavGatewayTray.resetIcon(); } protected void sendOK(String message) throws IOException { sendClient("+OK ", message); } protected void sendERR(Exception e) throws IOException { String message = e.getMessage(); if (message == null) { message = e.toString(); } sendERR(message); } protected void sendERR(String message) throws IOException { sendClient("-ERR ", message.replaceAll("\\n", " ")); } /** * Filter to limit output lines to max body lines after header */ private static final class TopOutputStream extends FilterOutputStream { protected enum State { START, CR, CRLF, CRLFCR, BODY } private int maxLines; private State state = State.START; private TopOutputStream(OutputStream os, int maxLines) { super(os); this.maxLines = maxLines; } @Override public void write(int b) throws IOException { if (state != State.BODY || maxLines > 0) { super.write(b); } if (state == State.BODY) { if (b == '\n') { maxLines--; } } else if (state == State.START) { if (b == '\r') { state = State.CR; } } else if (state == State.CR) { if (b == '\n') { state = State.CRLF; } else { state = State.START; } } else if (state == State.CRLF) { if (b == '\r') { state = State.CRLFCR; } else { state = State.START; } } else if (state == State.CRLFCR) { if (b == '\n') { state = State.BODY; } else { state = State.START; } } } } } davmail-6.3.0/src/java/davmail/pop/PopServer.java0100644 0000000 0000000 00000003247 12564151517 020414 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.pop; import davmail.AbstractConnection; import davmail.AbstractServer; import davmail.Settings; import java.net.Socket; /** * Pop3 server */ public class PopServer extends AbstractServer { /** * Default POP port */ public static final int DEFAULT_PORT = 110; /** * Create a ServerSocket to listen for connections. * Start the thread. * * @param port pop listen port, 110 if not defined (0) */ public PopServer(int port) { super(PopServer.class.getName(), port, PopServer.DEFAULT_PORT); nosslFlag = Settings.getBooleanProperty("davmail.ssl.nosecurepop"); } @Override public String getProtocolName() { return "POP"; } @Override public AbstractConnection createConnectionHandler(Socket clientSocket) { return new PopConnection(clientSocket); } } davmail-6.3.0/src/java/davmail/service/DavService.java0100644 0000000 0000000 00000005115 14503245214 021351 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.service; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.ui.tray.DavGatewayTray; import org.boris.winrun4j.AbstractService; /** * WinRun4J DavMail service. */ public class DavService extends AbstractService { private final Object LOCK = new Object(); /** * Perform a service request. * * @param control service control. * @return return code. */ @Override public int serviceRequest(int control) { switch (control) { case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: DavGatewayTray.debug(new BundleMessage("LOG_STOPPING_DAVMAIL")); DavGateway.stop(); synchronized (LOCK) { LOCK.notifyAll(); } } return 0; } /** * Run the service. * * @param args command line arguments * @return return code */ public int serviceMain(String[] args) { if (args.length >= 1) { Settings.setConfigFilePath(args[0]); } Settings.load(); if (!Settings.getBooleanProperty("davmail.server")) { Settings.setProperty("davmail.server", "true"); Settings.updateLoggingConfig(); } DavGateway.start(); DavGatewayTray.debug(new BundleMessage("LOG_DAVMAIL_STARTED")); synchronized (LOCK) { try { LOCK.wait(); } catch (InterruptedException e) { DavGatewayTray.debug(new BundleMessage("LOG_GATEWAY_INTERRUPTED")); Thread.currentThread().interrupt(); } } return 0; } } davmail-6.3.0/src/java/davmail/smtp/SmtpConnection.java0100644 0000000 0000000 00000030045 14757042647 021624 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.smtp; import davmail.AbstractConnection; import davmail.BundleMessage; import davmail.DavGateway; import davmail.exception.DavMailException; import davmail.exchange.DoubleDotInputStream; import davmail.exchange.ExchangeSessionFactory; import davmail.ui.tray.DavGatewayTray; import davmail.util.IOUtil; import javax.mail.MessagingException; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.util.SharedByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.Socket; import java.net.SocketException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.StringTokenizer; /** * Dav Gateway smtp connection implementation */ public class SmtpConnection extends AbstractConnection { /** * Initialize the streams and start the thread. * * @param clientSocket SMTP client socket */ public SmtpConnection(Socket clientSocket) { super(SmtpConnection.class.getSimpleName(), clientSocket, null); } @Override public void run() { String line; StringTokenizer tokens; List recipients = new ArrayList<>(); try { ExchangeSessionFactory.checkConfig(); sendClient("220 DavMail " + DavGateway.getCurrentVersion() + " SMTP ready at " + new Date()); for (; ; ) { line = readClient(); // unable to read line, connection closed ? if (line == null) { break; } tokens = new StringTokenizer(line); if (tokens.hasMoreTokens()) { String command = tokens.nextToken(); if (state == State.LOGIN) { // AUTH LOGIN, read userName userName = IOUtil.decodeBase64AsString(line); sendClient("334 " + IOUtil.encodeBase64AsString("Password:")); state = State.PASSWORD; } else if (state == State.PASSWORD) { // AUTH LOGIN, read password password = IOUtil.decodeBase64AsString(line); authenticate(); } else if ("QUIT".equalsIgnoreCase(command)) { sendClient("221 Closing connection"); break; } else if ("NOOP".equalsIgnoreCase(command)) { sendClient("250 OK"); } else if ("EHLO".equalsIgnoreCase(command)) { sendClient("250-davmail"); // inform server that AUTH is supported // actually it is mandatory (only way to get credentials) sendClient("250-AUTH LOGIN PLAIN"); sendClient("250-8BITMIME"); sendClient("250 Hello"); } else if ("HELO".equalsIgnoreCase(command)) { sendClient("250 Hello"); } else if ("AUTH".equalsIgnoreCase(command)) { if (tokens.hasMoreElements()) { String authType = tokens.nextToken(); if ("PLAIN".equalsIgnoreCase(authType) && tokens.hasMoreElements()) { decodeCredentials(tokens.nextToken()); authenticate(); } else if ("LOGIN".equalsIgnoreCase(authType)) { if (tokens.hasMoreTokens()) { // username sent on auth line userName = IOUtil.decodeBase64AsString(tokens.nextToken()); sendClient("334 " + IOUtil.encodeBase64AsString("Password:")); state = State.PASSWORD; } else { sendClient("334 " + IOUtil.encodeBase64AsString("Username:")); state = State.LOGIN; } } else { sendClient("451 Error : unknown authentication type"); } } else { sendClient("451 Error : authentication type not specified"); } } else if ("MAIL".equalsIgnoreCase(command)) { if (state == State.AUTHENTICATED) { state = State.STARTMAIL; recipients.clear(); sendClient("250 Sender OK"); } else if (state == State.INITIAL) { sendClient("530 Authentication required"); } else { state = State.INITIAL; sendClient("503 Bad sequence of commands"); } } else if ("RCPT".equalsIgnoreCase(command)) { if (state == State.STARTMAIL || state == State.RECIPIENT) { if (line.toUpperCase().startsWith("RCPT TO:")) { state = State.RECIPIENT; try { InternetAddress internetAddress = new InternetAddress(line.substring("RCPT TO:".length())); recipients.add(internetAddress.getAddress()); } catch (AddressException e) { throw new DavMailException("EXCEPTION_INVALID_RECIPIENT", line); } sendClient("250 Recipient OK"); } else { sendClient("500 Unrecognized command"); } } else { state = State.AUTHENTICATED; sendClient("503 Bad sequence of commands"); } } else if ("DATA".equalsIgnoreCase(command)) { if (state == State.RECIPIENT) { state = State.MAILDATA; sendClient("354 Start mail input; end with ."); try { // read message in buffer MimeMessage mimeMessage = getMimeMessage(); session.sendMessage(recipients, mimeMessage); state = State.AUTHENTICATED; sendClient("250 Queued mail for delivery"); } catch (Exception e) { DavGatewayTray.error(e); state = State.AUTHENTICATED; String error = e.getMessage(); if (error == null) { error = e.toString(); } sendClient("451 Error : " + error.replaceAll("[\\r\\n]", "")); } } else { state = State.AUTHENTICATED; sendClient("503 Bad sequence of commands"); } } else if ("RSET".equalsIgnoreCase(command)) { recipients.clear(); if (state == State.STARTMAIL || state == State.RECIPIENT || state == State.MAILDATA || state == State.AUTHENTICATED) { state = State.AUTHENTICATED; } else { state = State.INITIAL; } sendClient("250 OK Reset"); } else { sendClient("500 Unrecognized command"); } } else { sendClient("500 Unrecognized command"); } os.flush(); } } catch (SocketException e) { DavGatewayTray.debug(new BundleMessage("LOG_CONNECTION_CLOSED")); } catch (Exception e) { DavGatewayTray.log(e); try { // append a line feed to avoid thunderbird message drop sendClient("421 " + ((e.getMessage() == null) ? e : e.getMessage()) + "\n"); } catch (IOException e2) { DavGatewayTray.debug(new BundleMessage("LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT"), e2); } } finally { close(); } DavGatewayTray.resetIcon(); } private MimeMessage getMimeMessage() throws IOException, MessagingException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DoubleDotInputStream doubleDotInputStream = new DoubleDotInputStream(in); int b; while ((b = doubleDotInputStream.read()) >= 0) { baos.write(b); } return new MimeMessage(null, new SharedByteArrayInputStream(baos.toByteArray())); } /** * Create authenticated session with Exchange server * * @throws IOException on error */ protected void authenticate() throws IOException { try { session = ExchangeSessionFactory.getInstance(userName, password); logConnection("LOGON", userName); sendClient("235 OK Authenticated"); state = State.AUTHENTICATED; } catch (Exception e) { logConnection("FAILED", userName); DavGatewayTray.error(e); String message = e.getMessage(); if (message == null) { message = e.toString(); } message = message.replaceAll("\\n", " "); sendClient("535 Authentication failed " + message); state = State.INITIAL; } } /** * Decode SMTP credentials * * @param encodedCredentials smtp encoded credentials * @throws IOException if invalid credentials */ protected void decodeCredentials(String encodedCredentials) throws IOException { String decodedCredentials = IOUtil.decodeBase64AsString(encodedCredentials); int startIndex = decodedCredentials.indexOf((char) 0); if (startIndex >= 0) { int endIndex = decodedCredentials.indexOf((char) 0, startIndex + 1); if (endIndex >= 0) { userName = decodedCredentials.substring(startIndex + 1, endIndex); password = decodedCredentials.substring(endIndex + 1); } else { throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } else { throw new DavMailException("EXCEPTION_INVALID_CREDENTIALS"); } } } davmail-6.3.0/src/java/davmail/smtp/SmtpServer.java0100644 0000000 0000000 00000003266 12564151517 020767 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.smtp; import davmail.AbstractConnection; import davmail.AbstractServer; import davmail.Settings; import java.net.Socket; /** * SMTP server, handle message send requests. */ public class SmtpServer extends AbstractServer { /** * Default SMTP Caldav port */ public static final int DEFAULT_PORT = 25; /** * Create a ServerSocket to listen for connections. * Start the thread. * * @param port smtp port */ public SmtpServer(int port) { super(SmtpServer.class.getName(), port, SmtpServer.DEFAULT_PORT); nosslFlag = Settings.getBooleanProperty("davmail.ssl.nosecuresmtp"); } @Override public String getProtocolName() { return "SMTP"; } @Override public AbstractConnection createConnectionHandler(Socket clientSocket) { return new SmtpConnection(clientSocket); } } davmail-6.3.0/src/java/davmail/ui/AboutFrame.java0100644 0000000 0000000 00000012364 13574116517 020336 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui; import davmail.BundleMessage; import davmail.DavGateway; import davmail.ui.browser.DesktopBrowser; import davmail.ui.tray.DavGatewayTray; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.event.HyperlinkEvent; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.StyleSheet; import java.awt.*; import java.awt.event.ActionListener; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; /** * About frame */ public class AboutFrame extends JFrame { private final JEditorPane jEditorPane; /** * About frame. */ public AboutFrame() { setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); setTitle(BundleMessage.format("UI_ABOUT_DAVMAIL")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } try { JLabel imageLabel = new JLabel(); ClassLoader classloader = this.getClass().getClassLoader(); URL imageUrl = classloader.getResource("tray32.png"); if (imageUrl != null) { Image iconImage = ImageIO.read(imageUrl); ImageIcon icon = new ImageIcon(iconImage); imageLabel.setIcon(icon); JPanel imagePanel = new JPanel(); imagePanel.add(imageLabel); add(BorderLayout.WEST, imagePanel); } } catch (IOException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_CREATE_ICON"), e); } jEditorPane = new JEditorPane(); HTMLEditorKit htmlEditorKit = new HTMLEditorKit(); StyleSheet stylesheet = htmlEditorKit.getStyleSheet(); Font font = jEditorPane.getFont(); stylesheet.addRule("body { font-size:small;font-family: " + ((font == null) ? "Arial" : font.getFamily()) + '}'); jEditorPane.setEditorKit(htmlEditorKit); jEditorPane.setContentType("text/html"); jEditorPane.setText(getContent(null)); jEditorPane.setEditable(false); jEditorPane.setOpaque(false); jEditorPane.addHyperlinkListener(hle -> { if (HyperlinkEvent.EventType.ACTIVATED.equals(hle.getEventType())) { try { DesktopBrowser.browse(hle.getURL().toURI()); } catch (URISyntaxException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e); } setVisible(false); } }); JPanel mainPanel = new JPanel(); mainPanel.add(jEditorPane); add(BorderLayout.CENTER, mainPanel); JPanel buttonPanel = new JPanel(); JButton ok = new JButton(BundleMessage.format("UI_BUTTON_OK")); ActionListener close = evt -> setVisible(false); ok.addActionListener(close); buttonPanel.add(ok); add(BorderLayout.SOUTH, buttonPanel); pack(); setResizable(false); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); } String getContent(String releasedVersion) { Package davmailPackage = DavGateway.class.getPackage(); StringBuilder buffer = new StringBuilder(); buffer.append(BundleMessage.format("UI_ABOUT_DAVMAIL_AUTHOR")); String currentVersion = davmailPackage.getImplementationVersion(); if (currentVersion != null) { buffer.append(BundleMessage.format("UI_CURRENT_VERSION", currentVersion)); } if ((currentVersion != null && releasedVersion != null && currentVersion.compareTo(releasedVersion) != 0) || (currentVersion == null && releasedVersion != null)) { buffer.append(BundleMessage.format("UI_LATEST_VERSION", releasedVersion)); } buffer.append(BundleMessage.format("UI_HELP_INSTRUCTIONS")); return buffer.toString(); } /** * Update about frame content with current released version. */ public void update() { jEditorPane.setText(getContent(DavGateway.getReleasedVersion())); pack(); } } davmail-6.3.0/src/java/davmail/ui/AcceptCertificateDialog.java0100644 0000000 0000000 00000014512 14575630005 022763 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui; import davmail.BundleMessage; import davmail.http.DavGatewayX509TrustManager; import davmail.ui.tray.DavGatewayTray; import javax.swing.*; import java.awt.*; import java.lang.reflect.InvocationTargetException; import java.security.cert.X509Certificate; import java.text.DateFormat; import java.util.Date; /** * Accept certificate dialog */ public class AcceptCertificateDialog extends JDialog { protected boolean accepted; /** * Accept status. * * @return true if user accepted certificate */ public boolean isAccepted() { return accepted; } /** * Add a new JLabel to panel with label: value text. * * @param panel certificate details panel * @param label certificate attribute label * @param value certificate attribute value */ protected void addFieldValue(JPanel panel, String label, String value) { JPanel fieldPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); fieldPanel.add(new JLabel("" + label + ":")); fieldPanel.add(new JLabel(value)); panel.add(fieldPanel); } /** * Accept certificate dialog. * * @param certificate certificate sent by server */ public AcceptCertificateDialog(X509Certificate certificate) { setAlwaysOnTop(true); String sha1Hash = DavGatewayX509TrustManager.getFormattedHash(certificate); DateFormat formatter = DateFormat.getDateInstance(DateFormat.MEDIUM); setTitle(BundleMessage.format("UI_ACCEPT_CERTIFICATE")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel subjectPanel = new JPanel(); subjectPanel.setLayout(new BoxLayout(subjectPanel, BoxLayout.Y_AXIS)); subjectPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_SERVER_CERTIFICATE"))); addFieldValue(subjectPanel, BundleMessage.format("UI_ISSUED_TO"), DavGatewayX509TrustManager.getRDN(certificate.getSubjectX500Principal())); addFieldValue(subjectPanel, BundleMessage.format("UI_ISSUED_BY"), DavGatewayX509TrustManager.getRDN(certificate.getIssuerX500Principal())); Date now = new Date(); String notBefore = formatter.format(certificate.getNotBefore()); if (now.before(certificate.getNotBefore())) { notBefore = "" + notBefore + ""; } addFieldValue(subjectPanel, BundleMessage.format("UI_VALID_FROM"), notBefore); String notAfter = formatter.format(certificate.getNotAfter()); if (now.after(certificate.getNotAfter())) { notAfter = "" + notAfter + ""; } addFieldValue(subjectPanel, BundleMessage.format("UI_VALID_UNTIL"), notAfter); addFieldValue(subjectPanel, BundleMessage.format("UI_SERIAL"), DavGatewayX509TrustManager.getFormattedSerial(certificate)); addFieldValue(subjectPanel, BundleMessage.format("UI_FINGERPRINT"), sha1Hash); JPanel warningPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JLabel imageLabel = new JLabel(); imageLabel.setIcon(UIManager.getIcon("OptionPane.warningIcon")); imageLabel.setText(BundleMessage.format("UI_UNTRUSTED_CERTIFICATE_HTML")); warningPanel.add(imageLabel); add(warningPanel, BorderLayout.NORTH); add(subjectPanel, BorderLayout.CENTER); add(getButtonPanel(), BorderLayout.SOUTH); setModal(true); pack(); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); setAlwaysOnTop(true); setVisible(true); } protected JPanel getButtonPanel() { JPanel buttonPanel = new JPanel(); JButton accept = new JButton(BundleMessage.format("UI_BUTTON_ACCEPT")); JButton deny = new JButton(BundleMessage.format("UI_BUTTON_DENY")); accept.addActionListener(evt -> { accepted = true; setVisible(false); }); deny.addActionListener(evt -> { accepted = false; setVisible(false); }); buttonPanel.add(accept); buttonPanel.add(deny); return buttonPanel; } /** * Display certificate accept dialog and get user answer. * * @param certificate certificate sent by server * @return true if user accepted certificate */ public static boolean isCertificateTrusted(final X509Certificate certificate) { final boolean[] answer = new boolean[1]; try { SwingUtilities.invokeAndWait(() -> { AcceptCertificateDialog certificateDialog = new AcceptCertificateDialog(certificate); answer[0] = certificateDialog.isAccepted(); }); } catch (InterruptedException ie) { DavGatewayTray.error(new BundleMessage("UI_ERROR_WAITING_FOR_CERTIFICATE_CHECK"), ie); Thread.currentThread().interrupt(); } catch (InvocationTargetException ite) { DavGatewayTray.error(new BundleMessage("UI_ERROR_WAITING_FOR_CERTIFICATE_CHECK"), ite); } return answer[0]; } } davmail-6.3.0/src/java/davmail/ui/CredentialPromptDialog.java0100644 0000000 0000000 00000007620 13574116520 022676 0ustar000000000 0000000 package davmail.ui; import davmail.BundleMessage; import davmail.ui.tray.DavGatewayTray; import javax.swing.*; import java.awt.*; /** * Prompt for Exchange credential and password. */ public class CredentialPromptDialog extends JDialog { final JTextField principalField = new JTextField(15); final JPasswordField passwordField = new JPasswordField(15); protected String principal; protected char[] password; /** * Get user password. * * @return user password as char array */ public char[] getPassword() { if (password != null) { return password.clone(); } else { return "".toCharArray(); } } /** * Get user principal. * * @return user principal */ public String getPrincipal() { return principal; } /** * Get credentials. * * @param prompt Kerberos prompt from callback handler */ public CredentialPromptDialog(String prompt) { setAlwaysOnTop(true); setTitle(BundleMessage.format("UI_KERBEROS_CREDENTIAL_PROMPT")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel questionPanel = new JPanel(); questionPanel.setLayout(new BoxLayout(questionPanel, BoxLayout.Y_AXIS)); JLabel imageLabel = new JLabel(); imageLabel.setIcon(UIManager.getIcon("OptionPane.questionIcon")); questionPanel.add(imageLabel); passwordField.setMaximumSize(passwordField.getPreferredSize()); passwordField.addActionListener(e -> { principal = principalField.getText(); password = passwordField.getPassword(); setVisible(false); }); JPanel credentialPanel = new JPanel(new GridLayout(2, 2)); JLabel promptLabel = new JLabel(' ' +prompt.trim()); promptLabel.setHorizontalAlignment(SwingConstants.RIGHT); promptLabel.setVerticalAlignment(SwingConstants.CENTER); credentialPanel.add(promptLabel); principalField.setMaximumSize(principalField.getPreferredSize()); credentialPanel.add(principalField); JLabel passwordLabel = new JLabel(BundleMessage.format("UI_KERBEROS_PASSWORD_PROMPT")); passwordLabel.setHorizontalAlignment(SwingConstants.RIGHT); passwordLabel.setVerticalAlignment(SwingConstants.CENTER); credentialPanel.add(passwordLabel); passwordField.setMaximumSize(passwordField.getPreferredSize()); credentialPanel.add(passwordField); add(questionPanel, BorderLayout.WEST); add(credentialPanel, BorderLayout.CENTER); add(getButtonPanel(), BorderLayout.SOUTH); setModal(true); pack(); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); setAlwaysOnTop(true); setVisible(true); } protected JPanel getButtonPanel() { JPanel buttonPanel = new JPanel(); JButton okButton = new JButton(BundleMessage.format("UI_BUTTON_OK")); JButton cancelButton = new JButton(BundleMessage.format("UI_BUTTON_CANCEL")); okButton.addActionListener(evt -> { principal = principalField.getText(); password = passwordField.getPassword(); setVisible(false); }); cancelButton.addActionListener(evt -> { principal = null; password = null; setVisible(false); }); buttonPanel.add(okButton); buttonPanel.add(cancelButton); return buttonPanel; } } davmail-6.3.0/src/java/davmail/ui/NotificationDialog.java0100644 0000000 0000000 00000017473 14545543571 022070 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.ui; import davmail.BundleMessage; import davmail.ui.browser.DesktopBrowser; import davmail.ui.tray.DavGatewayTray; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; /** * Edit Caldav scheduling notifications. */ public class NotificationDialog extends JDialog { protected boolean sendNotification; protected boolean hasRecipients; protected JTextField toField; protected JTextField ccField; protected JTextField subjectField; protected JEditorPane bodyField; protected void addRecipientComponent(JPanel panel, String label, JTextField textField, String toolTipText) { JLabel fieldLabel = new JLabel(label); fieldLabel.setHorizontalAlignment(SwingConstants.RIGHT); fieldLabel.setVerticalAlignment(SwingConstants.CENTER); JPanel innerPanel = new JPanel(); innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS)); innerPanel.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); innerPanel.setAlignmentX(Component.RIGHT_ALIGNMENT); innerPanel.add(fieldLabel); innerPanel.add(textField); panel.add(innerPanel); if (toolTipText != null) { fieldLabel.setToolTipText(toolTipText); textField.setToolTipText(toolTipText); } } /** * Notification dialog to let user edit message body or cancel notification. * Called from EWS => no recipients information * * @param subject notification subject * @param description notification description */ public NotificationDialog(String subject, String description) { this(null, null, subject, description); } /** * Notification dialog to let user edit message body or cancel notification. * * @param to main recipients * @param cc copy recipients * @param subject notification subject * @param description notification description */ public NotificationDialog(String to, String cc, String subject, String description) { hasRecipients = to != null || cc != null; setModal(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setTitle(BundleMessage.format("UI_CALDAV_NOTIFICATION")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel mainPanel = new JPanel(); // add help (F1 handler) mainPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F1"), "help"); mainPanel.getActionMap().put("help", new AbstractAction() { public void actionPerformed(ActionEvent e) { DesktopBrowser.browse("https://davmail.sourceforge.net"); } }); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); mainPanel.add(getRecipientsPanel()); mainPanel.add(getBodyPanel(description)); JPanel recipientsPanel = getRecipientsPanel(); if (to != null) { toField.setText(to); } if (cc != null) { ccField.setText(cc); } if (subject != null) { subjectField.setText(subject); } add(BorderLayout.NORTH, recipientsPanel); JPanel bodyPanel = getBodyPanel(description); add(BorderLayout.CENTER, bodyPanel); bodyField.setPreferredSize(recipientsPanel.getPreferredSize()); JPanel buttonPanel = new JPanel(); JButton cancel = new JButton(BundleMessage.format("UI_BUTTON_CANCEL")); JButton send = new JButton(BundleMessage.format("UI_BUTTON_SEND")); send.addActionListener(evt -> { sendNotification = true; setVisible(false); }); cancel.addActionListener(evt -> { // nothing to do, just hide setVisible(false); }); buttonPanel.add(send); buttonPanel.add(cancel); add(BorderLayout.SOUTH, buttonPanel); pack(); setResizable(true); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); setAlwaysOnTop(true); setVisible(true); } protected JPanel getRecipientsPanel() { JPanel recipientsPanel = new JPanel(); recipientsPanel.setLayout(new BoxLayout(recipientsPanel, BoxLayout.Y_AXIS)); recipientsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); if (hasRecipients) { toField = new JTextField("", 40); addRecipientComponent(recipientsPanel, BundleMessage.format("UI_TO"), toField, BundleMessage.format("UI_TO_HELP")); ccField = new JTextField("", 40); addRecipientComponent(recipientsPanel, BundleMessage.format("UI_CC"), ccField, BundleMessage.format("UI_CC_HELP")); } subjectField = new JTextField("", 40); if (!hasRecipients) { subjectField.setEditable(false); } addRecipientComponent(recipientsPanel, BundleMessage.format("UI_SUBJECT"), subjectField, BundleMessage.format("UI_SUBJECT_HELP")); return recipientsPanel; } protected JPanel getBodyPanel(String description) { JPanel bodyPanel = new JPanel(); bodyPanel.setLayout(new BoxLayout(bodyPanel, BoxLayout.Y_AXIS)); bodyPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_NOTIFICATION_BODY"))); bodyField = new JTextPane(); bodyField.setText(description); //HTMLEditorKit htmlEditorKit = new HTMLEditorKit(); //bodyField.setEditorKit(htmlEditorKit); //bodyField.setContentType("text/html"); bodyPanel.add(new JScrollPane(bodyField)); return bodyPanel; } /** * Cancel notification flag. * * @return false if user chose to cancel notification */ public boolean getSendNotification() { return sendNotification; } /** * Get edited recipients. * * @return recipients string */ public String getTo() { return toField.getText(); } /** * Get edited copy recipients. * * @return copy recipients string */ public String getCc() { return ccField.getText(); } /** * Get edited subject. * * @return subject */ public String getSubject() { return subjectField.getText(); } /** * Get edited body. * * @return edited notification body */ public String getBody() { return bodyField.getText(); } } davmail-6.3.0/src/java/davmail/ui/NumberMatchingFrame.java0100644 0000000 0000000 00000005573 14545543571 022176 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.ui; import davmail.BundleMessage; import davmail.ui.tray.DavGatewayTray; import javax.swing.*; import java.awt.*; /** * Display number matching value during O365 MFA process. */ public class NumberMatchingFrame extends JFrame { /** * Number matching dialog. * * @param entropy number matching value from Azure AD */ public NumberMatchingFrame(String entropy) { setAlwaysOnTop(true); setTitle(BundleMessage.format("UI_O365_MFA_NUMBER_MATCHING")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel infoPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JLabel imageLabel = new JLabel(); imageLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon")); imageLabel.setText(BundleMessage.format("UI_O365_MFA_NUMBER_MATCHING_PROMPT", entropy)); infoPanel.add(imageLabel); add(infoPanel, BorderLayout.NORTH); add(getButtonPanel(), BorderLayout.SOUTH); pack(); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); setAlwaysOnTop(true); // auto close after 1 minute Timer timer = new Timer(60000, evt -> { NumberMatchingFrame.this.setVisible(false); NumberMatchingFrame.this.dispose(); }); timer.start(); setVisible(true); } protected JPanel getButtonPanel() { JPanel buttonPanel = new JPanel(); JButton okButton = new JButton(BundleMessage.format("UI_BUTTON_OK")); okButton.addActionListener(evt -> { setVisible(false); dispose(); }); buttonPanel.add(okButton); return buttonPanel; } } davmail-6.3.0/src/java/davmail/ui/OSXInfoPlist.java0100644 0000000 0000000 00000006733 13574116517 020615 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2012 Mickael Guessant * * 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. */ package davmail.ui; import davmail.util.IOUtil; import org.apache.log4j.Logger; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; /** * Handle OSX Info.plist file access */ public class OSXInfoPlist { protected static final Logger LOGGER = Logger.getLogger(OSXInfoPlist.class); protected static final String INFO_PLIST_PATH = "../Info.plist"; private OSXInfoPlist() { } protected static boolean isOSX() { return System.getProperty("os.name").toLowerCase().startsWith("mac os x"); } protected static String getInfoPlistContent() throws IOException { try (FileInputStream fileInputStream = new FileInputStream(getInfoPlistPath())) { return new String(IOUtil.readFully(fileInputStream), StandardCharsets.UTF_8); } } /** * Test current LSUIElement (hide from dock) value * * @return true if application is hidden from dock */ public static boolean isHideFromDock() { boolean result = false; try { result = isOSX() && getInfoPlistContent().contains("LSUIElement1"); } catch (IOException e) { LOGGER.warn("Unable to update Info.plist", e); } return result; } /** * Update LSUIElement (hide from dock) value * * @param hideFromDock new hide from dock value */ public static void setOSXHideFromDock(boolean hideFromDock) { try { if (isOSX()) { boolean currentHideFromDock = isHideFromDock(); if (currentHideFromDock != hideFromDock) { String content = getInfoPlistContent(); try (FileOutputStream fileOutputStream = new FileOutputStream(getInfoPlistPath())) { fileOutputStream.write(content.replaceFirst( "LSUIElement" + (currentHideFromDock ? "1" : "0") + "", "LSUIElement" + (hideFromDock ? "1" : "0") + "").getBytes(StandardCharsets.UTF_8)); } } } } catch (IOException e) { LOGGER.warn("Unable to update Info.plist", e); } } private static String getInfoPlistPath() throws IOException { File file = new File(INFO_PLIST_PATH); if (file.exists()) { return INFO_PLIST_PATH; } throw new IOException("Info.plist file not found"); } } davmail-6.3.0/src/java/davmail/ui/PasswordPromptDialog.java0100644 0000000 0000000 00000010633 14754153500 022424 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui; import davmail.BundleMessage; import davmail.ui.tray.DavGatewayTray; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; /** * Get smartcard password */ public class PasswordPromptDialog extends JDialog { final JPasswordField passwordField = new JPasswordField(20); protected char[] password; /** * Get user password. * * @return user password as char array */ public char[] getPassword() { if (password != null) { return password.clone(); } else { return "".toCharArray(); } } /** * Get smartcard password. * * @param prompt password prompt from PKCS11 module */ public PasswordPromptDialog(String prompt) { this(prompt, null); } /** * Get smartcard password. * * @param prompt password prompt from PKCS11 module * @param captchaImage ISA filter pinsafe image */ public PasswordPromptDialog(String prompt, Image captchaImage) { setAlwaysOnTop(true); setTitle(BundleMessage.format("UI_PASSWORD_PROMPT")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel questionPanel = new JPanel(); questionPanel.setLayout(new BoxLayout(questionPanel, BoxLayout.Y_AXIS)); JLabel imageLabel = new JLabel(); imageLabel.setIcon(UIManager.getIcon("OptionPane.questionIcon")); imageLabel.setText(prompt); questionPanel.add(imageLabel); passwordField.addActionListener(e -> { password = passwordField.getPassword(); setVisible(false); }); JPanel passwordPanel = new JPanel(); passwordPanel.setLayout(new BoxLayout(passwordPanel, BoxLayout.Y_AXIS)); if (captchaImage != null) { JLabel captchaLabel = new JLabel(new ImageIcon(captchaImage)); captchaLabel.setAlignmentX(Component.CENTER_ALIGNMENT); captchaLabel.setBorder(new EmptyBorder(10, 10, 10, 10)); passwordPanel.add(captchaLabel); } passwordPanel.add(passwordField); add(questionPanel, BorderLayout.NORTH); add(passwordPanel, BorderLayout.CENTER); add(getButtonPanel(), BorderLayout.SOUTH); questionPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); passwordPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); setModal(true); pack(); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); setAlwaysOnTop(true); setVisible(true); } protected JPanel getButtonPanel() { JPanel buttonPanel = new JPanel(); JButton okButton = new JButton(BundleMessage.format("UI_BUTTON_OK")); JButton cancelButton = new JButton(BundleMessage.format("UI_BUTTON_CANCEL")); okButton.addActionListener(evt -> { password = passwordField.getPassword(); setVisible(false); }); cancelButton.addActionListener(evt -> { password = null; setVisible(false); }); buttonPanel.add(okButton); buttonPanel.add(cancelButton); return buttonPanel; } } davmail-6.3.0/src/java/davmail/ui/SelectCertificateDialog.java0100644 0000000 0000000 00000007123 13574116517 023010 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2011 Mickael Guessant * * 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. */ package davmail.ui; import davmail.BundleMessage; import davmail.ui.tray.DavGatewayTray; import javax.swing.*; import java.awt.*; /** * Let user select a client certificate */ public class SelectCertificateDialog extends JDialog { protected final JList aliasListBox; protected final String[] aliases; protected String selectedAlias; /** * Gets user selected alias. * * @return user selected alias */ public String getSelectedAlias() { return this.selectedAlias; } /** * Select a client certificate * * @param aliases An array of certificate aliases for the user to pick from */ public SelectCertificateDialog(String[] aliases, String[] descriptions) { setAlwaysOnTop(true); this.aliases = aliases; setTitle(BundleMessage.format("UI_CERTIFICATE_ALIAS_PROMPT")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JPanel questionPanel = new JPanel(); questionPanel.setLayout(new BoxLayout(questionPanel, BoxLayout.Y_AXIS)); JLabel imageLabel = new JLabel(); imageLabel.setIcon(UIManager.getIcon("OptionPane.questionIcon")); imageLabel.setText(BundleMessage.format("UI_CERTIFICATE_ALIAS_PROMPT")); questionPanel.add(imageLabel); aliasListBox = new JList<>(descriptions); aliasListBox.setMaximumSize(aliasListBox.getPreferredSize()); JPanel aliasPanel = new JPanel(); aliasPanel.setLayout(new BoxLayout(aliasPanel, BoxLayout.Y_AXIS)); aliasPanel.add(aliasListBox); add(questionPanel, BorderLayout.NORTH); add(aliasPanel, BorderLayout.CENTER); add(getButtonPanel(), BorderLayout.SOUTH); setModal(true); pack(); // center frame setLocation(getToolkit().getScreenSize().width / 2 - getSize().width / 2, getToolkit().getScreenSize().height / 2 - getSize().height / 2); setAlwaysOnTop(true); setVisible(true); } protected JPanel getButtonPanel() { JPanel buttonPanel = new JPanel(); JButton okButton = new JButton(BundleMessage.format("UI_BUTTON_OK")); JButton cancelButton = new JButton(BundleMessage.format("UI_BUTTON_CANCEL")); okButton.addActionListener(evt -> { selectedAlias = aliases[aliasListBox.getSelectedIndex()]; setVisible(false); }); cancelButton.addActionListener(evt -> { selectedAlias = null; setVisible(false); }); buttonPanel.add(okButton); buttonPanel.add(cancelButton); return buttonPanel; } } davmail-6.3.0/src/java/davmail/ui/SettingsFrame.java0100644 0000000 0000000 00000146511 14754417473 021074 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.ui.browser.DesktopBrowser; import davmail.ui.tray.DavGatewayTray; import org.apache.log4j.Level; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * DavMail settings frame */ public class SettingsFrame extends JFrame { static final Level[] LOG_LEVELS = {Level.OFF, Level.FATAL, Level.ERROR, Level.WARN, Level.INFO, Level.DEBUG, Level.ALL}; protected JTextField urlField; protected JTextField popPortField; protected JCheckBox popPortCheckBox; protected JCheckBox popNoSSLCheckBox; protected JTextField imapPortField; protected JCheckBox imapPortCheckBox; protected JCheckBox imapNoSSLCheckBox; protected JTextField smtpPortField; protected JCheckBox smtpPortCheckBox; protected JCheckBox smtpNoSSLCheckBox; protected JTextField caldavPortField; protected JCheckBox caldavPortCheckBox; protected JCheckBox caldavNoSSLCheckBox; protected JTextField ldapPortField; protected JCheckBox ldapPortCheckBox; protected JCheckBox ldapNoSSLCheckBox; protected JTextField keepDelayField; protected JTextField sentKeepDelayField; protected JTextField caldavPastDelayField; protected JCheckBox caldavAutoScheduleCheckBox; protected JTextField imapIdleDelayField; protected JCheckBox useSystemProxiesField; protected JCheckBox enableProxyField; protected JTextField httpProxyField; protected JTextField httpProxyPortField; protected JTextField httpProxyUserField; protected JTextField httpProxyPasswordField; protected JTextField noProxyForField; protected JCheckBox allowRemoteField; protected JTextField bindAddressField; protected JTextField clientSoTimeoutField; protected JTextField certHashField; protected JCheckBox disableUpdateCheck; protected JComboBox keystoreTypeCombo; protected JTextField keystoreFileField; protected JPasswordField keystorePassField; protected JPasswordField keyPassField; protected JComboBox clientKeystoreTypeCombo; protected JTextField clientKeystoreFileField; protected JPasswordField clientKeystorePassField; protected JTextField pkcs11LibraryField; protected JTextArea pkcs11ConfigField; protected JComboBox rootLoggingLevelField; protected JComboBox davmailLoggingLevelField; protected JComboBox httpclientLoggingLevelField; protected JComboBox wireLoggingLevelField; protected JTextField logFilePathField; protected JTextField logFileSizeField; protected JCheckBox caldavEditNotificationsField; protected JTextField caldavAlarmSoundField; protected JCheckBox forceActiveSyncUpdateCheckBox; protected JTextField defaultDomainField; protected JCheckBox showStartupBannerCheckBox; protected JCheckBox disableGuiNotificationsCheckBox; protected JCheckBox disableTrayActivitySwitchCheckBox; protected JCheckBox imapAutoExpungeCheckBox; protected JCheckBox enableKeepAliveCheckBox; protected JCheckBox popMarkReadOnRetrCheckBox; protected JComboBox modeComboBox; protected JCheckBox enableKerberosCheckBox; protected JTextField folderSizeLimitField; protected JCheckBox smtpSaveInSentCheckBox; protected JCheckBox imapAlwaysApproxMsgSizeCheckBox; protected JTextField oauthTenantIdField; protected JTextField oauthClientIdField; protected JTextField oauthRedirectUriField; JCheckBox osxHideFromDockCheckBox; protected void addSettingComponent(JPanel panel, String label, JComponent component) { addSettingComponent(panel, label, component, null); } protected JLabel buildFieldLabel(String label, String toolTipText) { JLabel fieldLabel = new JLabel(label); fieldLabel.setHorizontalAlignment(SwingConstants.RIGHT); fieldLabel.setVerticalAlignment(SwingConstants.CENTER); if (toolTipText != null) { fieldLabel.setToolTipText(toolTipText); } return fieldLabel; } protected void addSettingComponent(JPanel panel, String label, JComponent component, String toolTipText) { panel.add(buildFieldLabel(label, toolTipText)); component.setMaximumSize(component.getPreferredSize()); JPanel innerPanel = new JPanel(); innerPanel.setBorder(BorderFactory.createEmptyBorder(1,0,0,0)); innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS)); innerPanel.add(component); panel.add(innerPanel); if (toolTipText != null) { component.setToolTipText(toolTipText); } } protected void addPortSettingComponent(JPanel panel, String label, JComponent component, JComponent checkboxComponent, JComponent checkboxSSLComponent, String toolTipText) { panel.add(buildFieldLabel(label, toolTipText)); component.setMaximumSize(component.getPreferredSize()); JPanel innerPanel = new JPanel(); innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS)); innerPanel.add(checkboxComponent); innerPanel.add(component); innerPanel.add(checkboxSSLComponent); panel.add(innerPanel); if (toolTipText != null) { component.setToolTipText(toolTipText); } } protected JPanel getSettingsPanel() { JPanel settingsPanel = new JPanel(new GridLayout(7, 2)); settingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_GATEWAY"))); modeComboBox = new JComboBox<>(); modeComboBox.addItem(Settings.EWS); modeComboBox.addItem(Settings.O365); modeComboBox.addItem(Settings.O365_MODERN); modeComboBox.addItem(Settings.O365_INTERACTIVE); modeComboBox.addItem(Settings.O365_MANUAL); modeComboBox.addItem(Settings.WEBDAV); modeComboBox.addItem(Settings.AUTO); modeComboBox.setSelectedItem(Settings.getProperty("davmail.mode", Settings.EWS)); modeComboBox.addActionListener(evt -> { String selectedItem = (String)modeComboBox.getSelectedItem(); modeComboBox.setToolTipText(BundleMessage.format("UI_"+selectedItem+"_HELP")); if (selectedItem != null && selectedItem.startsWith("O365")) { urlField.setEnabled(false); urlField.setText(Settings.getO365Url()); } else { urlField.setEnabled(true); } }); urlField = new JTextField(Settings.getProperty("davmail.url", Settings.getO365Url()), 20); popPortField = new JTextField(Settings.getProperty("davmail.popPort"), 4); popPortCheckBox = new JCheckBox(); popNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecurepop")); popPortCheckBox.setSelected(Settings.getProperty("davmail.popPort") != null && !Settings.getProperty("davmail.popPort").isEmpty()); popPortField.setEnabled(popPortCheckBox.isSelected()); popNoSSLCheckBox.setEnabled(popPortCheckBox.isSelected() && isSslEnabled()); popPortCheckBox.addActionListener(evt -> { popPortField.setEnabled(popPortCheckBox.isSelected()); popNoSSLCheckBox.setEnabled(popPortCheckBox.isSelected() && isSslEnabled()); }); imapPortField = new JTextField(Settings.getProperty("davmail.imapPort"), 4); imapPortCheckBox = new JCheckBox(); imapNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecureimap")); imapPortCheckBox.setSelected(Settings.getProperty("davmail.imapPort") != null && !Settings.getProperty("davmail.imapPort").isEmpty()); imapPortField.setEnabled(imapPortCheckBox.isSelected()); imapNoSSLCheckBox.setEnabled(imapPortCheckBox.isSelected() && isSslEnabled()); imapPortCheckBox.addActionListener(evt -> { imapPortField.setEnabled(imapPortCheckBox.isSelected()); imapNoSSLCheckBox.setEnabled(imapPortCheckBox.isSelected() && isSslEnabled()); }); smtpPortField = new JTextField(Settings.getProperty("davmail.smtpPort"), 4); smtpPortCheckBox = new JCheckBox(); smtpNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecuresmtp")); smtpPortCheckBox.setSelected(Settings.getProperty("davmail.smtpPort") != null && !Settings.getProperty("davmail.smtpPort").isEmpty()); smtpPortField.setEnabled(smtpPortCheckBox.isSelected()); smtpNoSSLCheckBox.setEnabled(smtpPortCheckBox.isSelected() && isSslEnabled()); smtpPortCheckBox.addActionListener(evt -> { smtpPortField.setEnabled(smtpPortCheckBox.isSelected()); smtpNoSSLCheckBox.setEnabled(smtpPortCheckBox.isSelected() && isSslEnabled()); }); caldavPortField = new JTextField(Settings.getProperty("davmail.caldavPort"), 4); caldavPortCheckBox = new JCheckBox(); caldavNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecurecaldav")); caldavPortCheckBox.setSelected(Settings.getProperty("davmail.caldavPort") != null && !Settings.getProperty("davmail.caldavPort").isEmpty()); caldavPortField.setEnabled(caldavPortCheckBox.isSelected()); caldavNoSSLCheckBox.setEnabled(caldavPortCheckBox.isSelected() && isSslEnabled()); caldavPortCheckBox.addActionListener(evt -> { caldavPortField.setEnabled(caldavPortCheckBox.isSelected()); caldavNoSSLCheckBox.setEnabled(caldavPortCheckBox.isSelected() && isSslEnabled()); }); ldapPortField = new JTextField(Settings.getProperty("davmail.ldapPort"), 4); ldapPortCheckBox = new JCheckBox(); ldapNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecureldap")); ldapPortCheckBox.setSelected(Settings.getProperty("davmail.ldapPort") != null && !Settings.getProperty("davmail.ldapPort").isEmpty()); ldapPortField.setEnabled(ldapPortCheckBox.isSelected()); ldapNoSSLCheckBox.setEnabled(ldapPortCheckBox.isSelected() && isSslEnabled()); ldapPortCheckBox.addActionListener(evt -> { ldapPortField.setEnabled(ldapPortCheckBox.isSelected()); ldapNoSSLCheckBox.setEnabled(ldapPortCheckBox.isSelected() && isSslEnabled()); }); addSettingComponent(settingsPanel, BundleMessage.format("UI_ENABLE_EWS"), modeComboBox, BundleMessage.format("UI_ENABLE_EWS_HELP")); addSettingComponent(settingsPanel, BundleMessage.format("UI_OWA_URL"), urlField, BundleMessage.format("UI_OWA_URL_HELP")); addPortSettingComponent(settingsPanel, BundleMessage.format("UI_POP_PORT"), popPortField, popPortCheckBox, popNoSSLCheckBox, BundleMessage.format("UI_POP_PORT_HELP")); addPortSettingComponent(settingsPanel, BundleMessage.format("UI_IMAP_PORT"), imapPortField, imapPortCheckBox, imapNoSSLCheckBox, BundleMessage.format("UI_IMAP_PORT_HELP")); addPortSettingComponent(settingsPanel, BundleMessage.format("UI_SMTP_PORT"), smtpPortField, smtpPortCheckBox, smtpNoSSLCheckBox, BundleMessage.format("UI_SMTP_PORT_HELP")); addPortSettingComponent(settingsPanel, BundleMessage.format("UI_CALDAV_PORT"), caldavPortField, caldavPortCheckBox, caldavNoSSLCheckBox, BundleMessage.format("UI_CALDAV_PORT_HELP")); addPortSettingComponent(settingsPanel, BundleMessage.format("UI_LDAP_PORT"), ldapPortField, ldapPortCheckBox, ldapNoSSLCheckBox, BundleMessage.format("UI_LDAP_PORT_HELP")); return settingsPanel; } protected JPanel getDelaysPanel() { JPanel delaysPanel = new JPanel(new GridLayout(4, 2)); delaysPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_DELAYS"))); keepDelayField = new JTextField(Settings.getProperty("davmail.keepDelay"), 4); sentKeepDelayField = new JTextField(Settings.getProperty("davmail.sentKeepDelay"), 4); caldavPastDelayField = new JTextField(Settings.getProperty("davmail.caldavPastDelay"), 4); imapIdleDelayField = new JTextField(Settings.getProperty("davmail.imapIdleDelay"), 4); addSettingComponent(delaysPanel, BundleMessage.format("UI_KEEP_DELAY"), keepDelayField, BundleMessage.format("UI_KEEP_DELAY_HELP")); addSettingComponent(delaysPanel, BundleMessage.format("UI_SENT_KEEP_DELAY"), sentKeepDelayField, BundleMessage.format("UI_SENT_KEEP_DELAY_HELP")); addSettingComponent(delaysPanel, BundleMessage.format("UI_CALENDAR_PAST_EVENTS"), caldavPastDelayField, BundleMessage.format("UI_CALENDAR_PAST_EVENTS_HELP")); addSettingComponent(delaysPanel, BundleMessage.format("UI_IMAP_IDLE_DELAY"), imapIdleDelayField, BundleMessage.format("UI_IMAP_IDLE_DELAY_HELP")); return delaysPanel; } protected JPanel getProxyPanel() { JPanel proxyPanel = new JPanel(new GridLayout(7, 2)); proxyPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_PROXY"))); boolean useSystemProxies = Settings.getBooleanProperty("davmail.useSystemProxies", Boolean.FALSE); boolean enableProxy = Settings.getBooleanProperty("davmail.enableProxy"); useSystemProxiesField = new JCheckBox(); useSystemProxiesField.setSelected(useSystemProxies); enableProxyField = new JCheckBox(); enableProxyField.setSelected(enableProxy); httpProxyField = new JTextField(Settings.getProperty("davmail.proxyHost"), 15); httpProxyPortField = new JTextField(Settings.getProperty("davmail.proxyPort"), 4); httpProxyUserField = new JTextField(Settings.getProperty("davmail.proxyUser"), 10); httpProxyPasswordField = new JPasswordField(Settings.getProperty("davmail.proxyPassword"), 10); noProxyForField = new JTextField(Settings.getProperty("davmail.noProxyFor"), 15); enableProxyField.setEnabled(!useSystemProxies); httpProxyField.setEnabled(enableProxy); httpProxyPortField.setEnabled(enableProxy); httpProxyUserField.setEnabled(enableProxy || useSystemProxies); httpProxyPasswordField.setEnabled(enableProxy || useSystemProxies); noProxyForField.setEnabled(enableProxy); useSystemProxiesField.addActionListener(evt -> { boolean newUseSystemProxies = useSystemProxiesField.isSelected(); if (newUseSystemProxies) { enableProxyField.setSelected(false); enableProxyField.setEnabled(false); httpProxyField.setEnabled(false); httpProxyPortField.setEnabled(false); httpProxyUserField.setEnabled(true); httpProxyPasswordField.setEnabled(true); noProxyForField.setEnabled(false); } else { enableProxyField.setEnabled(true); httpProxyUserField.setEnabled(false); httpProxyPasswordField.setEnabled(false); } }); enableProxyField.addActionListener(evt -> { boolean newEnableProxy = enableProxyField.isSelected(); httpProxyField.setEnabled(newEnableProxy); httpProxyPortField.setEnabled(newEnableProxy); httpProxyUserField.setEnabled(newEnableProxy); httpProxyPasswordField.setEnabled(newEnableProxy); noProxyForField.setEnabled(newEnableProxy); }); addSettingComponent(proxyPanel, BundleMessage.format("UI_USE_SYSTEM_PROXIES"), useSystemProxiesField); addSettingComponent(proxyPanel, BundleMessage.format("UI_ENABLE_PROXY"), enableProxyField); addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_SERVER"), httpProxyField); addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_PORT"), httpProxyPortField); addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_USER"), httpProxyUserField); addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_PASSWORD"), httpProxyPasswordField); addSettingComponent(proxyPanel, BundleMessage.format("UI_NO_PROXY"), noProxyForField); updateMaximumSize(proxyPanel); return proxyPanel; } protected JPanel getKeystorePanel() { JPanel keyStorePanel = new JPanel(new GridLayout(4, 2)); keyStorePanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_DAVMAIL_SERVER_CERTIFICATE"))); keystoreTypeCombo = new JComboBox<>(new String[]{"JKS", "PKCS12"}); keystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.keystoreType")); keystoreFileField = new JTextField(Settings.getProperty("davmail.ssl.keystoreFile"), 20); keystorePassField = new JPasswordField(Settings.getProperty("davmail.ssl.keystorePass"), 20); keyPassField = new JPasswordField(Settings.getProperty("davmail.ssl.keyPass"), 20); addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_STORE_TYPE"), keystoreTypeCombo, BundleMessage.format("UI_KEY_STORE_TYPE_HELP")); addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_STORE"), keystoreFileField, BundleMessage.format("UI_KEY_STORE_HELP")); addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_STORE_PASSWORD"), keystorePassField, BundleMessage.format("UI_KEY_STORE_PASSWORD_HELP")); addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_PASSWORD"), keyPassField, BundleMessage.format("UI_KEY_PASSWORD_HELP")); updateMaximumSize(keyStorePanel); return keyStorePanel; } protected JPanel getSmartCardPanel() { JPanel clientKeystorePanel = new JPanel(new GridLayout(2, 1)); clientKeystorePanel.setLayout(new BoxLayout(clientKeystorePanel, BoxLayout.Y_AXIS)); clientKeystorePanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_CLIENT_CERTIFICATE"))); if (System.getProperty("os.name").toLowerCase().startsWith("windows")) { clientKeystoreTypeCombo = new JComboBox<>(new String[]{"MSCAPI", "PKCS11", "JKS", "PKCS12"}); } else { clientKeystoreTypeCombo = new JComboBox<>(new String[]{"PKCS11", "JKS", "PKCS12"}); } clientKeystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.clientKeystoreType")); clientKeystoreFileField = new JTextField(Settings.getProperty("davmail.ssl.clientKeystoreFile"), 20); clientKeystorePassField = new JPasswordField(Settings.getProperty("davmail.ssl.clientKeystorePass"), 20); pkcs11LibraryField = new JTextField(Settings.getProperty("davmail.ssl.pkcs11Library"), 20); pkcs11ConfigField = new JTextArea(2, 20); pkcs11ConfigField.setText(Settings.getProperty("davmail.ssl.pkcs11Config")); pkcs11ConfigField.setBorder(pkcs11LibraryField.getBorder()); pkcs11ConfigField.setFont(pkcs11LibraryField.getFont()); JPanel clientKeystoreTypePanel = new JPanel(new GridLayout(1, 2)); addSettingComponent(clientKeystoreTypePanel, BundleMessage.format("UI_CLIENT_KEY_STORE_TYPE"), clientKeystoreTypeCombo, BundleMessage.format("UI_CLIENT_KEY_STORE_TYPE_HELP")); clientKeystorePanel.add(clientKeystoreTypePanel); final JPanel cardPanel = new JPanel(new CardLayout()); clientKeystorePanel.add(cardPanel); JPanel clientKeystoreFilePanel = new JPanel(new GridLayout(2, 2)); addSettingComponent(clientKeystoreFilePanel, BundleMessage.format("UI_CLIENT_KEY_STORE"), clientKeystoreFileField, BundleMessage.format("UI_CLIENT_KEY_STORE_HELP")); addSettingComponent(clientKeystoreFilePanel, BundleMessage.format("UI_CLIENT_KEY_STORE_PASSWORD"), clientKeystorePassField, BundleMessage.format("UI_CLIENT_KEY_STORE_PASSWORD_HELP")); JPanel wrapperPanel = new JPanel(); wrapperPanel.add(clientKeystoreFilePanel); cardPanel.add(wrapperPanel, "FILE"); JPanel pkcs11Panel = new JPanel(new GridLayout(2, 2)); addSettingComponent(pkcs11Panel, BundleMessage.format("UI_PKCS11_LIBRARY"), pkcs11LibraryField, BundleMessage.format("UI_PKCS11_LIBRARY_HELP")); addSettingComponent(pkcs11Panel, BundleMessage.format("UI_PKCS11_CONFIG"), pkcs11ConfigField, BundleMessage.format("UI_PKCS11_CONFIG_HELP")); cardPanel.add(pkcs11Panel, "PKCS11"); ((CardLayout) cardPanel.getLayout()).show(cardPanel, (String) clientKeystoreTypeCombo.getSelectedItem()); clientKeystoreTypeCombo.addItemListener(event -> { CardLayout cardLayout = (CardLayout) (cardPanel.getLayout()); if ("PKCS11".equals(event.getItem())) { cardLayout.show(cardPanel, "PKCS11"); } else { cardLayout.show(cardPanel, "FILE"); } }); updateMaximumSize(clientKeystorePanel); return clientKeystorePanel; } protected JPanel getOauthPanel() { JPanel oAuthPanel = new JPanel(new GridLayout(3, 2)); oAuthPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OAUTH"))); oauthTenantIdField = new JTextField(Settings.getProperty("davmail.oauth.tenantId"), 20); oauthClientIdField = new JTextField(Settings.getProperty("davmail.oauth.clientId"), 20); oauthRedirectUriField = new JTextField(Settings.getProperty("davmail.oauth.redirectUri"), 20); addSettingComponent(oAuthPanel, BundleMessage.format("UI_OAUTH_TENANTID"), oauthTenantIdField, BundleMessage.format("UI_OAUTH_TENANTID_HELP")); addSettingComponent(oAuthPanel, BundleMessage.format("UI_OAUTH_CLIENTID"), oauthClientIdField, BundleMessage.format("UI_OAUTH_CLIENTID_HELP")); addSettingComponent(oAuthPanel, BundleMessage.format("UI_OAUTH_REDIRECTURI"), oauthRedirectUriField, BundleMessage.format("UI_OAUTH_REDIRECTURI_HELP")); updateMaximumSize(oAuthPanel); return oAuthPanel; } protected JPanel getNetworkSettingsPanel() { JPanel networkSettingsPanel = new JPanel(new GridLayout(4, 2)); networkSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_NETWORK"))); allowRemoteField = new JCheckBox(); allowRemoteField.setSelected(Settings.getBooleanProperty("davmail.allowRemote")); bindAddressField = new JTextField(Settings.getProperty("davmail.bindAddress"), 15); clientSoTimeoutField = new JTextField(Settings.getProperty("davmail.clientSoTimeout"), 15); certHashField = new JTextField(Settings.getProperty("davmail.server.certificate.hash"), 15); addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_BIND_ADDRESS"), bindAddressField, BundleMessage.format("UI_BIND_ADDRESS_HELP")); addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_CLIENT_SO_TIMEOUT"), clientSoTimeoutField, BundleMessage.format("UI_CLIENT_SO_TIMEOUT_HELP")); addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_ALLOW_REMOTE_CONNECTION"), allowRemoteField, BundleMessage.format("UI_ALLOW_REMOTE_CONNECTION_HELP")); addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_SERVER_CERTIFICATE_HASH"), certHashField, BundleMessage.format("UI_SERVER_CERTIFICATE_HASH_HELP")); updateMaximumSize(networkSettingsPanel); return networkSettingsPanel; } protected JPanel getOtherSettingsPanel() { JPanel otherSettingsPanel = new JPanel(new GridLayout(16, 2)); otherSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OTHER"))); folderSizeLimitField = new JTextField(Settings.getProperty("davmail.folderSizeLimit"), 6); enableKerberosCheckBox = new JCheckBox(); enableKerberosCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKerberos")); caldavEditNotificationsField = new JCheckBox(); caldavEditNotificationsField.setSelected(Settings.getBooleanProperty("davmail.caldavEditNotifications")); caldavAlarmSoundField = new JTextField(Settings.getProperty("davmail.caldavAlarmSound"), 15); forceActiveSyncUpdateCheckBox = new JCheckBox(); forceActiveSyncUpdateCheckBox.setSelected(Settings.getBooleanProperty("davmail.forceActiveSyncUpdate")); defaultDomainField = new JTextField(Settings.getProperty("davmail.defaultDomain"), 15); showStartupBannerCheckBox = new JCheckBox(); showStartupBannerCheckBox.setSelected(Settings.getBooleanProperty("davmail.showStartupBanner", true)); disableGuiNotificationsCheckBox = new JCheckBox(); disableGuiNotificationsCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableGuiNotifications", false)); disableTrayActivitySwitchCheckBox = new JCheckBox(); disableTrayActivitySwitchCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableTrayActivitySwitch", false)); imapAutoExpungeCheckBox = new JCheckBox(); imapAutoExpungeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAutoExpunge", true)); imapAlwaysApproxMsgSizeCheckBox = new JCheckBox(); imapAlwaysApproxMsgSizeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAlwaysApproxMsgSize", false)); enableKeepAliveCheckBox = new JCheckBox(); enableKeepAliveCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKeepAlive", false)); popMarkReadOnRetrCheckBox = new JCheckBox(); popMarkReadOnRetrCheckBox.setSelected(Settings.getBooleanProperty("davmail.popMarkReadOnRetr", false)); smtpSaveInSentCheckBox = new JCheckBox(); smtpSaveInSentCheckBox.setSelected(Settings.getBooleanProperty("davmail.smtpSaveInSent", true)); disableUpdateCheck = new JCheckBox(); disableUpdateCheck.setSelected(Settings.getBooleanProperty("davmail.disableUpdateCheck")); caldavAutoScheduleCheckBox = new JCheckBox(); caldavAutoScheduleCheckBox.setSelected(Settings.getBooleanProperty("davmail.caldavAutoSchedule")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_FOLDER_SIZE_LIMIT"), folderSizeLimitField, BundleMessage.format("UI_FOLDER_SIZE_LIMIT_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_ENABLE_KERBEROS"), enableKerberosCheckBox, BundleMessage.format("UI_ENABLE_KERBEROS_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_CALDAV_EDIT_NOTIFICATIONS"), caldavEditNotificationsField, BundleMessage.format("UI_CALDAV_EDIT_NOTIFICATIONS_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_CALDAV_ALARM_SOUND"), caldavAlarmSoundField, BundleMessage.format("UI_CALDAV_ALARM_SOUND_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_FORCE_ACTIVESYNC_UPDATE"), forceActiveSyncUpdateCheckBox, BundleMessage.format("UI_FORCE_ACTIVESYNC_UPDATE_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DEFAULT_DOMAIN"), defaultDomainField, BundleMessage.format("UI_DEFAULT_DOMAIN_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_SHOW_STARTUP_BANNER"), showStartupBannerCheckBox, BundleMessage.format("UI_SHOW_STARTUP_BANNER_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DISABLE_GUI_NOTIFICATIONS"), disableGuiNotificationsCheckBox, BundleMessage.format("UI_DISABLE_GUI_NOTIFICATIONS_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DISABLE_TRAY_ACTIVITY_SWITCH"), disableTrayActivitySwitchCheckBox, BundleMessage.format("UI_DISABLE_TRAY_ACTIVITY_SWITCH_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_IMAP_AUTO_EXPUNGE"), imapAutoExpungeCheckBox, BundleMessage.format("UI_IMAP_AUTO_EXPUNGE_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_ALWAYS_APPROXIMATE_MSG_SIZE"), imapAlwaysApproxMsgSizeCheckBox, BundleMessage.format("UI_ALWAYS_APPROXIMATE_MSG_SIZE_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_ENABLE_KEEPALIVE"), enableKeepAliveCheckBox, BundleMessage.format("UI_ENABLE_KEEPALIVE_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_POP_MARK_READ"), popMarkReadOnRetrCheckBox, BundleMessage.format("UI_POP_MARK_READ_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_SAVE_IN_SENT"), smtpSaveInSentCheckBox, BundleMessage.format("UI_SAVE_IN_SENT_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DISABLE_UPDATE_CHECK"), disableUpdateCheck, BundleMessage.format("UI_DISABLE_UPDATE_CHECK_HELP")); addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_CALDAV_AUTO_SCHEDULE"), caldavAutoScheduleCheckBox, BundleMessage.format("UI_CALDAV_AUTO_SCHEDULE_HELP")); updateMaximumSize(otherSettingsPanel); return otherSettingsPanel; } protected JPanel getOSXPanel() { JPanel osxSettingsPanel = new JPanel(new GridLayout(1, 2)); osxSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OSX"))); osxHideFromDockCheckBox = new JCheckBox(); osxHideFromDockCheckBox.setSelected(OSXInfoPlist.isHideFromDock()); addSettingComponent(osxSettingsPanel, BundleMessage.format("UI_OSX_HIDE_FROM_DOCK"), osxHideFromDockCheckBox, BundleMessage.format("UI_OSX_HIDE_FROM_DOCK_HELP")); updateMaximumSize(osxSettingsPanel); return osxSettingsPanel; } protected JPanel getLoggingSettingsPanel() { JPanel loggingLevelPanel = new JPanel(); JPanel leftLoggingPanel = new JPanel(new GridLayout(2, 2)); JPanel rightLoggingPanel = new JPanel(new GridLayout(2, 2)); loggingLevelPanel.add(leftLoggingPanel); loggingLevelPanel.add(rightLoggingPanel); rootLoggingLevelField = new JComboBox<>(LOG_LEVELS); davmailLoggingLevelField = new JComboBox<>(LOG_LEVELS); httpclientLoggingLevelField = new JComboBox<>(LOG_LEVELS); wireLoggingLevelField = new JComboBox<>(LOG_LEVELS); logFilePathField = new JTextField(Settings.getProperty("davmail.logFilePath"), 15); logFileSizeField = new JTextField(Settings.getProperty("davmail.logFileSize"), 15); rootLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("rootLogger")); davmailLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("davmail")); httpclientLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient")); wireLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient.wire")); addSettingComponent(leftLoggingPanel, BundleMessage.format("UI_LOG_DEFAULT"), rootLoggingLevelField); addSettingComponent(leftLoggingPanel, BundleMessage.format("UI_LOG_DAVMAIL"), davmailLoggingLevelField); addSettingComponent(rightLoggingPanel, BundleMessage.format("UI_LOG_HTTPCLIENT"), httpclientLoggingLevelField); addSettingComponent(rightLoggingPanel, BundleMessage.format("UI_LOG_WIRE"), wireLoggingLevelField); JPanel logFilePathPanel = new JPanel(new GridLayout(2, 2)); addSettingComponent(logFilePathPanel, BundleMessage.format("UI_LOG_FILE_PATH"), logFilePathField); addSettingComponent(logFilePathPanel, BundleMessage.format("UI_LOG_FILE_SIZE"), logFileSizeField, BundleMessage.format("UI_LOG_FILE_SIZE_HELP")); JButton defaultButton = new JButton(BundleMessage.format("UI_BUTTON_DEFAULT")); defaultButton.setToolTipText(BundleMessage.format("UI_BUTTON_DEFAULT_HELP")); defaultButton.addActionListener(e -> { rootLoggingLevelField.setSelectedItem(Level.WARN); davmailLoggingLevelField.setSelectedItem(Level.DEBUG); httpclientLoggingLevelField.setSelectedItem(Level.WARN); wireLoggingLevelField.setSelectedItem(Level.WARN); }); JPanel loggingPanel = new JPanel(); loggingPanel.setLayout(new BoxLayout(loggingPanel, BoxLayout.Y_AXIS)); loggingPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_LOGGING_LEVELS"))); loggingPanel.add(logFilePathPanel); loggingPanel.add(loggingLevelPanel); loggingPanel.add(defaultButton); updateMaximumSize(loggingPanel); return loggingPanel; } protected void updateMaximumSize(JPanel panel) { Dimension preferredSize = panel.getPreferredSize(); preferredSize.width = Integer.MAX_VALUE; panel.setMaximumSize(preferredSize); } /** * Reload settings from properties. */ public void reload() { // reload settings in form urlField.setText(Settings.getProperty("davmail.url", Settings.getO365Url())); popPortField.setText(Settings.getProperty("davmail.popPort")); popPortCheckBox.setSelected(Settings.getProperty("davmail.popPort") != null && !Settings.getProperty("davmail.popPort").isEmpty()); popNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecurepop")); imapPortField.setText(Settings.getProperty("davmail.imapPort")); imapPortCheckBox.setSelected(Settings.getProperty("davmail.imapPort") != null && !Settings.getProperty("davmail.imapPort").isEmpty()); imapNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecureimap")); smtpPortField.setText(Settings.getProperty("davmail.smtpPort")); smtpPortCheckBox.setSelected(Settings.getProperty("davmail.smtpPort") != null && !Settings.getProperty("davmail.smtpPort").isEmpty()); smtpNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecuresmtp")); caldavPortField.setText(Settings.getProperty("davmail.caldavPort")); caldavPortCheckBox.setSelected(Settings.getProperty("davmail.caldavPort") != null && !Settings.getProperty("davmail.caldavPort").isEmpty()); caldavNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecurecaldav")); ldapPortField.setText(Settings.getProperty("davmail.ldapPort")); ldapPortCheckBox.setSelected(Settings.getProperty("davmail.ldapPort") != null && !Settings.getProperty("davmail.ldapPort").isEmpty()); ldapNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecureldap")); keepDelayField.setText(Settings.getProperty("davmail.keepDelay")); sentKeepDelayField.setText(Settings.getProperty("davmail.sentKeepDelay")); caldavPastDelayField.setText(Settings.getProperty("davmail.caldavPastDelay")); imapIdleDelayField.setText(Settings.getProperty("davmail.imapIdleDelay")); boolean useSystemProxies = Settings.getBooleanProperty("davmail.useSystemProxies", Boolean.FALSE); useSystemProxiesField.setSelected(useSystemProxies); boolean enableProxy = Settings.getBooleanProperty("davmail.enableProxy"); enableProxyField.setSelected(enableProxy); enableProxyField.setEnabled(!useSystemProxies); httpProxyField.setEnabled(enableProxy); httpProxyPortField.setEnabled(enableProxy); httpProxyUserField.setEnabled(useSystemProxies || enableProxy); httpProxyPasswordField.setEnabled(useSystemProxies || enableProxy); noProxyForField.setEnabled(enableProxy); httpProxyField.setText(Settings.getProperty("davmail.proxyHost")); httpProxyPortField.setText(Settings.getProperty("davmail.proxyPort")); httpProxyUserField.setText(Settings.getProperty("davmail.proxyUser")); httpProxyPasswordField.setText(Settings.getProperty("davmail.proxyPassword")); noProxyForField.setText(Settings.getProperty("davmail.noProxyFor")); bindAddressField.setText(Settings.getProperty("davmail.bindAddress")); allowRemoteField.setSelected(Settings.getBooleanProperty(("davmail.allowRemote"))); certHashField.setText(Settings.getProperty("davmail.server.certificate.hash")); disableUpdateCheck.setSelected(Settings.getBooleanProperty(("davmail.disableUpdateCheck"))); caldavEditNotificationsField.setSelected(Settings.getBooleanProperty("davmail.caldavEditNotifications")); clientSoTimeoutField.setText(Settings.getProperty("davmail.clientSoTimeout")); caldavAlarmSoundField.setText(Settings.getProperty("davmail.caldavAlarmSound")); forceActiveSyncUpdateCheckBox.setSelected(Settings.getBooleanProperty("davmail.forceActiveSyncUpdate")); defaultDomainField.setText(Settings.getProperty("davmail.defaultDomain")); showStartupBannerCheckBox.setSelected(Settings.getBooleanProperty("davmail.showStartupBanner", true)); disableGuiNotificationsCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableGuiNotifications", false)); disableTrayActivitySwitchCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableTrayActivitySwitch", false)); imapAutoExpungeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAutoExpunge", true)); imapAlwaysApproxMsgSizeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAlwaysApproxMsgSize", false)); enableKeepAliveCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKeepAlive", false)); popMarkReadOnRetrCheckBox.setSelected(Settings.getBooleanProperty("davmail.popMarkReadOnRetr", false)); modeComboBox.setSelectedItem(Settings.getProperty("davmail.mode", Settings.EWS)); smtpSaveInSentCheckBox.setSelected(Settings.getBooleanProperty("davmail.smtpSaveInSent", true)); enableKerberosCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKerberos", false)); folderSizeLimitField.setText(Settings.getProperty("davmail.folderSizeLimit")); keystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.keystoreType")); keystoreFileField.setText(Settings.getProperty("davmail.ssl.keystoreFile")); keystorePassField.setText(Settings.getProperty("davmail.ssl.keystorePass")); keyPassField.setText(Settings.getProperty("davmail.ssl.keyPass")); clientKeystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.clientKeystoreType")); pkcs11LibraryField.setText(Settings.getProperty("davmail.ssl.pkcs11Library")); pkcs11ConfigField.setText(Settings.getProperty("davmail.ssl.pkcs11Config")); oauthTenantIdField.setText(Settings.getProperty("davmail.oauth.tenantId")); oauthClientIdField.setText(Settings.getProperty("davmail.oauth.clientId")); oauthRedirectUriField.setText(Settings.getProperty("davmail.oauth.redirectUri")); rootLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("rootLogger")); davmailLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("davmail")); httpclientLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient")); wireLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient.wire")); logFilePathField.setText(Settings.getProperty("davmail.logFilePath")); logFileSizeField.setText(Settings.getProperty("davmail.logFileSize")); if (osxHideFromDockCheckBox != null) { osxHideFromDockCheckBox.setSelected(OSXInfoPlist.isHideFromDock()); } } protected boolean isSslEnabled() { if (keystoreFileField != null) { return !keystoreFileField.getText().isEmpty(); } else { return Settings.getProperty("davmail.ssl.keystoreFile") != null && (!Settings.getProperty("davmail.ssl.keystoreFile").isEmpty()); } } /** * DavMail settings frame. */ public SettingsFrame() { setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); setTitle(BundleMessage.format("UI_DAVMAIL_SETTINGS")); try { setIconImages(DavGatewayTray.getFrameIcons()); } catch (NoSuchMethodError error) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE")); } JTabbedPane tabbedPane = new JTabbedPane(); // add help (F1 handler) tabbedPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F1"), "help"); tabbedPane.getActionMap().put("help", new AbstractAction() { public void actionPerformed(ActionEvent e) { DesktopBrowser.browse("https://davmail.sourceforge.net"); } }); tabbedPane.addChangeListener(e -> { boolean isSslEnabled = isSslEnabled(); popNoSSLCheckBox.setEnabled(Settings.getProperty("davmail.popPort") != null && isSslEnabled); imapNoSSLCheckBox.setEnabled(imapPortCheckBox.isSelected() && isSslEnabled); smtpNoSSLCheckBox.setEnabled(smtpPortCheckBox.isSelected() && isSslEnabled); caldavNoSSLCheckBox.setEnabled(caldavPortCheckBox.isSelected() && isSslEnabled); ldapNoSSLCheckBox.setEnabled(ldapPortCheckBox.isSelected() && isSslEnabled); }); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); mainPanel.add(getSettingsPanel()); mainPanel.add(getDelaysPanel()); mainPanel.add(Box.createVerticalGlue()); tabbedPane.add(BundleMessage.format("UI_TAB_MAIN"), mainPanel); JPanel proxyPanel = new JPanel(); proxyPanel.setLayout(new BoxLayout(proxyPanel, BoxLayout.Y_AXIS)); proxyPanel.add(getProxyPanel()); proxyPanel.add(getNetworkSettingsPanel()); tabbedPane.add(BundleMessage.format("UI_TAB_NETWORK"), proxyPanel); JPanel encryptionPanel = new JPanel(); encryptionPanel.setLayout(new BoxLayout(encryptionPanel, BoxLayout.Y_AXIS)); encryptionPanel.add(getKeystorePanel()); encryptionPanel.add(getSmartCardPanel()); encryptionPanel.add(getOauthPanel()); // empty panel encryptionPanel.add(new JPanel()); tabbedPane.add(BundleMessage.format("UI_TAB_ENCRYPTION"), encryptionPanel); JPanel loggingPanel = new JPanel(); loggingPanel.setLayout(new BoxLayout(loggingPanel, BoxLayout.Y_AXIS)); loggingPanel.add(getLoggingSettingsPanel()); // empty panel loggingPanel.add(new JPanel()); tabbedPane.add(BundleMessage.format("UI_TAB_LOGGING"), loggingPanel); JPanel advancedPanel = new JPanel(); advancedPanel.setLayout(new BoxLayout(advancedPanel, BoxLayout.Y_AXIS)); advancedPanel.add(getOtherSettingsPanel()); // empty panel advancedPanel.add(new JPanel()); tabbedPane.add(BundleMessage.format("UI_TAB_ADVANCED"), advancedPanel); if (OSXInfoPlist.isOSX()) { JPanel osxPanel = new JPanel(); osxPanel.setLayout(new BoxLayout(osxPanel, BoxLayout.Y_AXIS)); osxPanel.add(getOSXPanel()); // empty panel osxPanel.add(new JPanel()); tabbedPane.add(BundleMessage.format("UI_TAB_OSX"), osxPanel); } add(BorderLayout.CENTER, tabbedPane); JPanel buttonPanel = new JPanel(); JButton cancel = new JButton(BundleMessage.format("UI_BUTTON_CANCEL")); JButton ok = new JButton(BundleMessage.format("UI_BUTTON_SAVE")); JButton help = new JButton(BundleMessage.format("UI_BUTTON_HELP")); ActionListener save = evt -> { // save options Settings.setProperty("davmail.url", urlField.getText().trim()); Settings.setProperty("davmail.popPort", popPortCheckBox.isSelected() ? popPortField.getText() : ""); Settings.setProperty("davmail.ssl.nosecurepop", String.valueOf(popNoSSLCheckBox.isSelected())); Settings.setProperty("davmail.imapPort", imapPortCheckBox.isSelected() ? imapPortField.getText() : ""); Settings.setProperty("davmail.ssl.nosecureimap", String.valueOf(imapNoSSLCheckBox.isSelected())); Settings.setProperty("davmail.smtpPort", smtpPortCheckBox.isSelected() ? smtpPortField.getText() : ""); Settings.setProperty("davmail.ssl.nosecuresmtp", String.valueOf(smtpNoSSLCheckBox.isSelected())); Settings.setProperty("davmail.caldavPort", caldavPortCheckBox.isSelected() ? caldavPortField.getText() : ""); Settings.setProperty("davmail.ssl.nosecurecaldav", String.valueOf(caldavNoSSLCheckBox.isSelected())); Settings.setProperty("davmail.ldapPort", ldapPortCheckBox.isSelected() ? ldapPortField.getText() : ""); Settings.setProperty("davmail.ssl.nosecureldap", String.valueOf(ldapNoSSLCheckBox.isSelected())); Settings.setProperty("davmail.keepDelay", keepDelayField.getText()); Settings.setProperty("davmail.sentKeepDelay", sentKeepDelayField.getText()); Settings.setProperty("davmail.caldavPastDelay", caldavPastDelayField.getText()); Settings.setProperty("davmail.imapIdleDelay", imapIdleDelayField.getText()); Settings.setProperty("davmail.useSystemProxies", String.valueOf(useSystemProxiesField.isSelected())); Settings.setProperty("davmail.enableProxy", String.valueOf(enableProxyField.isSelected())); Settings.setProperty("davmail.proxyHost", httpProxyField.getText()); Settings.setProperty("davmail.proxyPort", httpProxyPortField.getText()); Settings.setProperty("davmail.proxyUser", httpProxyUserField.getText()); Settings.setProperty("davmail.proxyPassword", httpProxyPasswordField.getText()); Settings.setProperty("davmail.noProxyFor", noProxyForField.getText()); Settings.setProperty("davmail.bindAddress", bindAddressField.getText()); Settings.setProperty("davmail.clientSoTimeout", String.valueOf(clientSoTimeoutField.getText())); Settings.setProperty("davmail.allowRemote", String.valueOf(allowRemoteField.isSelected())); Settings.setProperty("davmail.server.certificate.hash", certHashField.getText()); Settings.setProperty("davmail.disableUpdateCheck", String.valueOf(disableUpdateCheck.isSelected())); Settings.setProperty("davmail.caldavAutoSchedule", String.valueOf(caldavAutoScheduleCheckBox.isSelected())); Settings.setProperty("davmail.caldavEditNotifications", String.valueOf(caldavEditNotificationsField.isSelected())); Settings.setProperty("davmail.caldavAlarmSound", String.valueOf(caldavAlarmSoundField.getText())); Settings.setProperty("davmail.forceActiveSyncUpdate", String.valueOf(forceActiveSyncUpdateCheckBox.isSelected())); Settings.setProperty("davmail.defaultDomain", String.valueOf(defaultDomainField.getText())); Settings.setProperty("davmail.showStartupBanner", String.valueOf(showStartupBannerCheckBox.isSelected())); Settings.setProperty("davmail.disableGuiNotifications", String.valueOf(disableGuiNotificationsCheckBox.isSelected())); Settings.setProperty("davmail.disableTrayActivitySwitch", String.valueOf(disableTrayActivitySwitchCheckBox.isSelected())); Settings.setProperty("davmail.imapAutoExpunge", String.valueOf(imapAutoExpungeCheckBox.isSelected())); Settings.setProperty("davmail.imapAlwaysApproxMsgSize", String.valueOf(imapAlwaysApproxMsgSizeCheckBox.isSelected())); Settings.setProperty("davmail.enableKeepAlive", String.valueOf(enableKeepAliveCheckBox.isSelected())); Settings.setProperty("davmail.popMarkReadOnRetr", String.valueOf(popMarkReadOnRetrCheckBox.isSelected())); Settings.setProperty("davmail.mode", (String) modeComboBox.getSelectedItem()); Settings.setProperty("davmail.enableKerberos", String.valueOf(enableKerberosCheckBox.isSelected())); Settings.setProperty("davmail.folderSizeLimit", folderSizeLimitField.getText()); Settings.setProperty("davmail.smtpSaveInSent", String.valueOf(smtpSaveInSentCheckBox.isSelected())); Settings.setProperty("davmail.ssl.keystoreType", (String) keystoreTypeCombo.getSelectedItem()); Settings.setProperty("davmail.ssl.keystoreFile", keystoreFileField.getText()); Settings.setProperty("davmail.ssl.keystorePass", String.valueOf(keystorePassField.getPassword())); Settings.setProperty("davmail.ssl.keyPass", String.valueOf(keyPassField.getPassword())); Settings.setProperty("davmail.ssl.clientKeystoreType", (String) clientKeystoreTypeCombo.getSelectedItem()); Settings.setProperty("davmail.ssl.clientKeystoreFile", clientKeystoreFileField.getText()); Settings.setProperty("davmail.ssl.clientKeystorePass", String.valueOf(clientKeystorePassField.getPassword())); Settings.setProperty("davmail.ssl.pkcs11Library", pkcs11LibraryField.getText()); Settings.setProperty("davmail.ssl.pkcs11Config", pkcs11ConfigField.getText()); Settings.setProperty("davmail.oauth.tenantId", oauthTenantIdField.getText()); Settings.setProperty("davmail.oauth.clientId", oauthClientIdField.getText()); Settings.setProperty("davmail.oauth.redirectUri", oauthRedirectUriField.getText()); Settings.setLoggingLevel("rootLogger", (Level) rootLoggingLevelField.getSelectedItem()); Settings.setLoggingLevel("davmail", (Level) davmailLoggingLevelField.getSelectedItem()); Settings.setLoggingLevel("httpclient", (Level) httpclientLoggingLevelField.getSelectedItem()); Settings.setLoggingLevel("httpclient.wire", (Level) wireLoggingLevelField.getSelectedItem()); Settings.setProperty("davmail.logFilePath", logFilePathField.getText()); Settings.setProperty("davmail.logFileSize", logFileSizeField.getText()); setVisible(false); Settings.save(); if (osxHideFromDockCheckBox != null) { OSXInfoPlist.setOSXHideFromDock(osxHideFromDockCheckBox.isSelected()); } // restart listeners with new config DavGateway.restart(); }; ok.addActionListener(save); cancel.addActionListener(evt -> { reload(); setVisible(false); }); help.addActionListener(e -> DesktopBrowser.browse("https://davmail.sourceforge.net")); buttonPanel.add(ok); buttonPanel.add(cancel); buttonPanel.add(help); add(BorderLayout.SOUTH, buttonPanel); pack(); //setResizable(false); // center frame setLocationRelativeTo(null); urlField.requestFocus(); } } davmail-6.3.0/src/java/davmail/ui/browser/AwtDesktopBrowser.java0100644 0000000 0000000 00000002656 12564151517 023425 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.browser; import java.awt.*; import java.io.IOException; import java.net.URI; /** * Wrapper class to call Java6 Desktop class to launch default browser. */ public final class AwtDesktopBrowser { private AwtDesktopBrowser() { } /** * Open default browser at location URI. * User Java 6 Desktop class * * @param location location URI * @throws IOException on error */ public static void browse(URI location) throws IOException { Desktop desktop = Desktop.getDesktop(); desktop.browse(location); } } davmail-6.3.0/src/java/davmail/ui/browser/DesktopBrowser.java0100644 0000000 0000000 00000007503 13574116520 022742 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.browser; import davmail.BundleMessage; import davmail.Settings; import davmail.ui.AboutFrame; import davmail.ui.tray.DavGatewayTray; import java.net.URI; import java.net.URISyntaxException; /** * Open default browser. */ public final class DesktopBrowser { private DesktopBrowser() { } /** * Open default browser at location URI. * User Java 6 Desktop class, OSX open command or SWT program launch * * @param location location URI */ public static void browse(URI location) { try { // trigger ClassNotFoundException ClassLoader classloader = AboutFrame.class.getClassLoader(); classloader.loadClass("java.awt.Desktop"); // Open link in default browser AwtDesktopBrowser.browse(location); } catch (ClassNotFoundException e) { DavGatewayTray.debug(new BundleMessage("LOG_JAVA6_DESKTOP_UNAVAILABLE")); // failover for MacOSX if (System.getProperty("os.name").toLowerCase().startsWith("mac os x")) { try { OSXDesktopBrowser.browse(location); } catch (Exception e2) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e2); } } else { // failover : try SWT try { // trigger ClassNotFoundException ClassLoader classloader = AboutFrame.class.getClassLoader(); classloader.loadClass("org.eclipse.swt.program.Program"); SwtDesktopBrowser.browse(location); } catch (ClassNotFoundException e2) { DavGatewayTray.error(new BundleMessage("LOG_OPEN_LINK_NOT_SUPPORTED")); } catch (Exception e2) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e2); } } } catch (java.lang.UnsupportedOperationException e) { if (Settings.isUnix()) { try { XdgDesktopBrowser.browse(location); } catch (Exception e2) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e2); } } else { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e); } } catch (Exception e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e); } } /** * Open default browser at location. * User Java 6 Desktop class, OSX open command or SWT program launch * * @param location target location */ public static void browse(String location) { try { DesktopBrowser.browse(new URI(location)); } catch (URISyntaxException e) { DavGatewayTray.error(new BundleMessage("LOG_UNABLE_TO_OPEN_LINK"), e); } } } davmail-6.3.0/src/java/davmail/ui/browser/OSXDesktopBrowser.java0100644 0000000 0000000 00000002552 14575630005 023334 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.browser; import java.io.IOException; import java.net.URI; /** * Failover: Runtime.exec open URL */ public final class OSXDesktopBrowser { private OSXDesktopBrowser() { } /** * Open default browser at location URI. * User OSX open command * * @param location location URI * @throws IOException on error */ public static void browse(URI location) throws IOException { Runtime.getRuntime().exec(new String[]{"open", location.toString()}); } } davmail-6.3.0/src/java/davmail/ui/browser/SwtDesktopBrowser.java0100644 0000000 0000000 00000002506 12564151517 023441 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.browser; import org.eclipse.swt.program.Program; import java.net.URI; /** * Wrapper class to call SWT Program class to launch default browser. */ public final class SwtDesktopBrowser { private SwtDesktopBrowser() { } /** * Open default browser at location URI. * User SWT program launch * * @param location location URI */ public static void browse(URI location) { Program.launch(location.toString()); } } davmail-6.3.0/src/java/davmail/ui/browser/XdgDesktopBrowser.java0100644 0000000 0000000 00000002571 14575630005 023406 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.browser; import java.io.IOException; import java.net.URI; /** * Failover: Runtime.exec open URL */ public final class XdgDesktopBrowser { private XdgDesktopBrowser() { } /** * Open default browser at location URI. * Use xdg-open to open browser url * * @param location location URI * @throws IOException on error */ public static void browse(URI location) throws IOException { Runtime.getRuntime().exec(new String[]{"xdg-open", location.toString()}); } } davmail-6.3.0/src/java/davmail/ui/tray/AwtGatewayTray.java0100644 0000000 0000000 00000020657 14545543571 022214 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.tray; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.ui.AboutFrame; import davmail.ui.SettingsFrame; import org.apache.log4j.Level; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.util.ArrayList; /** * Tray icon handler based on java 1.6 */ public class AwtGatewayTray implements DavGatewayTrayInterface { protected static final String TRAY_PNG = "tray.png"; protected static final String TRAY_ACTIVE_PNG = "tray2.png"; protected static final String TRAY_INACTIVE_PNG = "trayinactive.png"; protected static final String TRAY128_PNG = "tray128.png"; protected static final String TRAY128_ACTIVE_PNG = "tray128active.png"; protected static final String TRAY128_INACTIVE_PNG = "tray128inactive.png"; protected AwtGatewayTray() { } static AboutFrame aboutFrame; static SettingsFrame settingsFrame; ActionListener settingsListener; static TrayIcon trayIcon; protected static ArrayList frameIcons; protected static BufferedImage image; protected static BufferedImage activeImage; protected static BufferedImage inactiveImage; private boolean isActive = true; /** * Return AWT Image icon for frame title. * * @return frame icon */ @Override public java.util.List getFrameIcons() { return frameIcons; } /** * Switch tray icon between active and standby icon. */ public void switchIcon() { isActive = true; SwingUtilities.invokeLater(() -> { if (trayIcon.getImage().equals(image)) { trayIcon.setImage(activeImage); } else { trayIcon.setImage(image); } }); } /** * Set tray icon to inactive (network down) */ public void resetIcon() { SwingUtilities.invokeLater(() -> trayIcon.setImage(image)); } /** * Set tray icon to inactive (network down) */ public void inactiveIcon() { isActive = false; SwingUtilities.invokeLater(() -> trayIcon.setImage(inactiveImage)); } /** * Check if current tray status is inactive (network down). * * @return true if inactive */ public boolean isActive() { return isActive; } /** * Display balloon message for log level. * * @param message text message * @param level log level */ public void displayMessage(final String message, final Level level) { SwingUtilities.invokeLater(() -> { if (trayIcon != null) { TrayIcon.MessageType messageType = null; if (level.equals(Level.INFO)) { messageType = TrayIcon.MessageType.INFO; } else if (level.equals(Level.WARN)) { messageType = TrayIcon.MessageType.WARNING; } else if (level.equals(Level.ERROR)) { messageType = TrayIcon.MessageType.ERROR; } if (messageType != null) { trayIcon.displayMessage(BundleMessage.format("UI_DAVMAIL_GATEWAY"), message, messageType); } trayIcon.setToolTip(BundleMessage.format("UI_DAVMAIL_GATEWAY") + '\n' + message); } }); } /** * Open about window */ public void about() { SwingUtilities.invokeLater(() -> { aboutFrame.update(); aboutFrame.setVisible(true); aboutFrame.toFront(); aboutFrame.requestFocus(); }); } /** * Open settings window */ public void preferences() { SwingUtilities.invokeLater(() -> { settingsFrame.reload(); settingsFrame.setVisible(true); settingsFrame.toFront(); settingsFrame.repaint(); settingsFrame.requestFocus(); }); } /** * Create tray icon and register frame listeners. */ public void init() { SwingUtilities.invokeLater(this::createAndShowGUI); } public void dispose() { SystemTray.getSystemTray().remove(trayIcon); // dispose frames settingsFrame.dispose(); aboutFrame.dispose(); } protected void loadIcons() { image = DavGatewayTray.adjustTrayIcon(DavGatewayTray.loadImage(AwtGatewayTray.TRAY_PNG)); activeImage = DavGatewayTray.adjustTrayIcon(DavGatewayTray.loadImage(AwtGatewayTray.TRAY_ACTIVE_PNG)); inactiveImage = DavGatewayTray.adjustTrayIcon(DavGatewayTray.loadImage(AwtGatewayTray.TRAY_INACTIVE_PNG)); frameIcons = new ArrayList<>(); frameIcons.add(DavGatewayTray.loadImage(AwtGatewayTray.TRAY128_PNG)); frameIcons.add(DavGatewayTray.loadImage(AwtGatewayTray.TRAY_PNG)); } protected void createAndShowGUI() { System.setProperty("swing.defaultlaf", UIManager.getSystemLookAndFeelClassName()); // get the SystemTray instance SystemTray tray = SystemTray.getSystemTray(); loadIcons(); // create a popup menu PopupMenu popup = new PopupMenu(); aboutFrame = new AboutFrame(); // create an action settingsListener to listen for settings action executed on the tray icon ActionListener aboutListener = e -> about(); // create menu item for the default action MenuItem aboutItem = new MenuItem(BundleMessage.format("UI_ABOUT")); aboutItem.addActionListener(aboutListener); popup.add(aboutItem); settingsFrame = new SettingsFrame(); // create an action settingsListener to listen for settings action executed on the tray icon settingsListener = e -> preferences(); // create menu item for the default action MenuItem defaultItem = new MenuItem(BundleMessage.format("UI_SETTINGS")); defaultItem.addActionListener(settingsListener); popup.add(defaultItem); MenuItem logItem = new MenuItem(BundleMessage.format("UI_SHOW_LOGS")); logItem.addActionListener(e -> DavGatewayTray.showLogs()); popup.add(logItem); // create an action exitListener to listen for exit action executed on the tray icon ActionListener exitListener = e -> { try { DavGateway.stop(); } catch (Exception exc) { DavGatewayTray.error(exc); } // make sure we do exit System.exit(0); }; // create menu item for the exit action MenuItem exitItem = new MenuItem(BundleMessage.format("UI_EXIT")); exitItem.addActionListener(exitListener); popup.add(exitItem); /// ... add other items // construct a TrayIcon trayIcon = new TrayIcon(image, BundleMessage.format("UI_DAVMAIL_GATEWAY"), popup); // set the TrayIcon properties trayIcon.addActionListener(settingsListener); // ... // add the tray image try { tray.add(trayIcon); } catch (AWTException e) { DavGatewayTray.warn(new BundleMessage("LOG_UNABLE_TO_CREATE_TRAY"), e); } // display settings frame on first start if (Settings.isFirstStart()) { settingsFrame.setVisible(true); settingsFrame.toFront(); settingsFrame.repaint(); settingsFrame.requestFocus(); } } } davmail-6.3.0/src/java/davmail/ui/tray/DavGatewayTray.java0100644 0000000 0000000 00000036452 14754417473 022176 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.tray; import davmail.BundleMessage; import davmail.Settings; import davmail.exchange.NetworkDownException; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.lf5.LF5Appender; import org.apache.log4j.lf5.LogLevel; import org.apache.log4j.lf5.viewer.LogBrokerMonitor; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; /** * Tray icon handler */ public final class DavGatewayTray { private static final Logger LOGGER = Logger.getLogger("davmail"); private static final long ICON_SWITCH_MINIMUM_DELAY = 250; private static long lastIconSwitch; private DavGatewayTray() { } static DavGatewayTrayInterface davGatewayTray; /** * Return AWT Image icon for frame title. * * @return frame icon */ public static java.util.List getFrameIcons() { java.util.List icons = null; if (davGatewayTray != null) { icons = davGatewayTray.getFrameIcons(); } return icons; } /** * Switch tray icon between active and standby icon. */ public static void switchIcon() { if (davGatewayTray != null && !Settings.getBooleanProperty("davmail.disableTrayActivitySwitch")) { if (System.currentTimeMillis() - lastIconSwitch > ICON_SWITCH_MINIMUM_DELAY) { davGatewayTray.switchIcon(); lastIconSwitch = System.currentTimeMillis(); } } } /** * Set tray icon to inactive (network down) */ public static void resetIcon() { if (davGatewayTray != null && isActive()) { davGatewayTray.resetIcon(); } } /** * Check if current tray status is inactive (network down). * * @return true if inactive */ public static boolean isActive() { return davGatewayTray == null || davGatewayTray.isActive(); } /** * Log and display balloon message according to log level. * * @param message text message * @param level log level */ private static void displayMessage(BundleMessage message, Level level) { LOGGER.log(level, message.formatLog()); if (davGatewayTray != null && !Settings.getBooleanProperty("davmail.disableGuiNotifications")) { davGatewayTray.displayMessage(message.format(), level); } } /** * Log and display balloon message and exception according to log level. * * @param message text message * @param e exception * @param level log level */ private static void displayMessage(BundleMessage message, Exception e, Level level) { if (e instanceof NetworkDownException) { LOGGER.log(level, BundleMessage.getExceptionLogMessage(message, e)); } else { LOGGER.log(level, BundleMessage.getExceptionLogMessage(message, e), e); } if (davGatewayTray != null && !Settings.getBooleanProperty("davmail.disableGuiNotifications") && (!(e instanceof NetworkDownException))) { davGatewayTray.displayMessage(BundleMessage.getExceptionMessage(message, e), level); } if (davGatewayTray != null && e instanceof NetworkDownException) { davGatewayTray.inactiveIcon(); } } /** * Log message at level DEBUG. * * @param message bundle message */ public static void debug(BundleMessage message) { displayMessage(message, Level.DEBUG); } /** * Log message at level INFO. * * @param message bundle message */ public static void info(BundleMessage message) { displayMessage(message, Level.INFO); } /** * Log message at level WARN. * * @param message bundle message */ public static void warn(BundleMessage message) { displayMessage(message, Level.WARN); } /** * Log exception at level WARN. * * @param e exception */ public static void warn(Exception e) { displayMessage(null, e, Level.WARN); } /** * Log message at level ERROR. * * @param message bundle message */ public static void error(BundleMessage message) { displayMessage(message, Level.ERROR); } /** * Log exception at level WARN for NetworkDownException, * ERROR for other exceptions. * * @param e exception */ public static void log(Exception e) { // only warn on network down if (e instanceof NetworkDownException) { warn(e); } else { error(e); } } /** * Log exception at level ERROR. * * @param e exception */ public static void error(Exception e) { displayMessage(null, e, Level.ERROR); } /** * Log message and exception at level DEBUG. * * @param message bundle message * @param e exception */ public static void debug(BundleMessage message, Exception e) { displayMessage(message, e, Level.DEBUG); } /** * Log message and exception at level WARN. * * @param message bundle message * @param e exception */ public static void warn(BundleMessage message, Exception e) { displayMessage(message, e, Level.WARN); } /** * Log message and exception at level ERROR. * * @param message bundle message * @param e exception */ public static void error(BundleMessage message, Exception e) { displayMessage(message, e, Level.ERROR); } /** * Create tray icon and register frame listeners. */ public static void init(boolean notray) { String currentDesktop = System.getenv("XDG_CURRENT_DESKTOP"); String javaVersion = System.getProperty("java.version"); String arch = System.getProperty("sun.arch.data.model"); LOGGER.debug("OS Name: " + System.getProperty("os.name") + " Java version: " + javaVersion + ((arch != null) ? ' ' + arch : "") + " System tray " + (SystemTray.isSupported() ? "" : "not ") + "supported " + ((currentDesktop == null) ? "" : "Current Desktop: " + currentDesktop) ); if (Settings.isLinux()) { // enable anti aliasing on linux System.setProperty("awt.useSystemAAFontSettings", "on"); System.setProperty("swing.aatext", "true"); } if (!Settings.getBooleanProperty("davmail.server")) { if (!notray) { if ("Unity".equals(currentDesktop)) { LOGGER.info("Detected Unity desktop, please follow instructions at " + "https://davmail.sourceforge.net/linuxsetup.html to restore normal systray " + "or run DavMail in server mode"); } else if (currentDesktop != null && currentDesktop.contains("GNOME")) { LOGGER.info("Detected Gnome desktop, please follow instructions at " + "https://davmail.sourceforge.net/linuxsetup.html or " + "https://extensions.gnome.org/extension/1503/tray-icons/ " + "to restore normal systray or run DavMail in server mode"); } if (Settings.isWindows()) { LOGGER.info("Do not try to create SWT tray on windows"); } else if (Settings.O365_INTERACTIVE.equals(Settings.getProperty("davmail.mode"))) { LOGGER.info("O365Interactive is not compatible with SWT, do not try to create SWT tray"); } else { // first try to load SWT before with Java AWT ClassLoader classloader = DavGatewayTray.class.getClassLoader(); try { // trigger ClassNotFoundException classloader.loadClass("org.eclipse.swt.SWT"); // SWT available, create tray davGatewayTray = new SwtGatewayTray(); davGatewayTray.init(); } catch (ClassNotFoundException e) { DavGatewayTray.info(new BundleMessage("LOG_SWT_NOT_AVAILABLE")); } catch (Throwable e) { DavGatewayTray.info(new BundleMessage("LOG_SWT_NOT_AVAILABLE")); davGatewayTray = null; } } // try java6 tray support, except on Linux if (davGatewayTray == null /*&& !isLinux()*/) { try { if (SystemTray.isSupported()) { if (isOSX()) { davGatewayTray = new OSXAwtGatewayTray(); } else { davGatewayTray = new AwtGatewayTray(); } davGatewayTray.init(); } } catch (NoClassDefFoundError e) { DavGatewayTray.info(new BundleMessage("LOG_SYSTEM_TRAY_NOT_AVAILABLE")); } } } if (davGatewayTray == null) { if (isOSX()) { // MacOS davGatewayTray = new OSXFrameGatewayTray(); } else { davGatewayTray = new FrameGatewayTray(); } davGatewayTray.init(); } } } /** * Test if running on OSX * * @return true on Mac OS X */ public static boolean isOSX() { return System.getProperty("os.name").toLowerCase().startsWith("mac os x"); } /** * Test if running on Windows * * @return true on Windows */ public static boolean isWindows() { return System.getProperty("os.name").toLowerCase().startsWith("windows"); } /** * Test if running on Linux * * @return true on Linux */ public static boolean isLinux() { return System.getProperty("os.name").toLowerCase().startsWith("linux"); } /** * Load image with current class loader. * * @param fileName image resource file name * @return image */ public static BufferedImage loadImage(String fileName) { BufferedImage result = null; try { ClassLoader classloader = DavGatewayTray.class.getClassLoader(); URL imageUrl = classloader.getResource(fileName); if (imageUrl == null) { throw new IOException("Missing resource: " + fileName); } result = ImageIO.read(imageUrl); } catch (IOException e) { DavGatewayTray.warn(new BundleMessage("LOG_UNABLE_TO_LOAD_IMAGE"), e); } return result; } public static BufferedImage adjustTrayIcon(BufferedImage image) { Color backgroundColor = null; String backgroundColorString = Settings.getProperty("davmail.trayBackgroundColor"); String xdgCurrentDesktop = System.getenv("XDG_CURRENT_DESKTOP"); boolean isKDE = "KDE".equals(xdgCurrentDesktop); boolean isXFCE = "XFCE".equals(xdgCurrentDesktop); boolean isUnity = "Unity".equals(xdgCurrentDesktop); boolean isCinnamon = "X-Cinnamon".equals(xdgCurrentDesktop); boolean isGnome = xdgCurrentDesktop != null && xdgCurrentDesktop.contains("GNOME"); if (backgroundColorString == null || backgroundColorString.isEmpty()) { // define color for default theme if (isKDE) { backgroundColorString = "#DDF6E8"; } if (isUnity) { backgroundColorString = "#4D4B45"; } if (isXFCE) { backgroundColorString = "#E8E8E7"; } if (isCinnamon) { backgroundColorString = "#2E2E2E"; } if (isGnome) { backgroundColorString = "#000000"; } } int imageType = BufferedImage.TYPE_INT_ARGB; if (backgroundColorString != null && backgroundColorString.length() == 7 && backgroundColorString.startsWith("#")) { int red = Integer.parseInt(backgroundColorString.substring(1, 3), 16); int green = Integer.parseInt(backgroundColorString.substring(3, 5), 16); int blue = Integer.parseInt(backgroundColorString.substring(5, 7), 16); backgroundColor = new Color(red, green, blue); imageType = BufferedImage.TYPE_INT_RGB; } if (backgroundColor != null || isKDE || isUnity || isXFCE || isGnome) { int width = image.getWidth(); int height = image.getHeight(); int x = 0; int y = 0; if (isKDE || isXFCE) { width = 22; height = 22; x = 3; y = 3; } else if (isUnity) { width = 22; height = 24; x = 4; y = 4; } else if (isCinnamon || isGnome) { width = 24; height = 24; x = 4; y = 4; } BufferedImage bufferedImage = new BufferedImage(width, height, imageType); Graphics2D graphics = bufferedImage.createGraphics(); graphics.setColor(backgroundColor); graphics.fillRect(0, 0, width, height); graphics.drawImage(image, x, y, null); graphics.dispose(); return bufferedImage; } else { return image; } } /** * Dispose application tray icon */ public static void dispose() { if (davGatewayTray != null) { davGatewayTray.dispose(); } } /** * Open logging window. */ public static void showLogs() { Logger rootLogger = Logger.getRootLogger(); LF5Appender lf5Appender = (LF5Appender) rootLogger.getAppender("LF5Appender"); if (lf5Appender == null) { LogBrokerMonitor logBrokerMonitor = new LogBrokerMonitor(LogLevel.getLog4JLevels()) { @Override protected void closeAfterConfirm() { hide(); } }; lf5Appender = new LF5Appender(logBrokerMonitor); lf5Appender.setName("LF5Appender"); rootLogger.addAppender(lf5Appender); } lf5Appender.getLogBrokerMonitor().show(); } } davmail-6.3.0/src/java/davmail/ui/tray/DavGatewayTrayInterface.java0100644 0000000 0000000 00000003673 13263220043 023771 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.tray; import org.apache.log4j.Level; import java.awt.*; /** * Gateway tray interface common to SWT and pure java implementations */ public interface DavGatewayTrayInterface { /** * Switch tray icon between active and standby icon. */ void switchIcon(); /** * Reset tray icon to standby */ void resetIcon(); /** * Set tray icon to inactive (network down) */ void inactiveIcon(); /** * Check if current tray status is inactive (network down). * * @return true if inactive */ boolean isActive(); /** * Return AWT Image icon for frame title. * * @return frame icon */ java.util.List getFrameIcons(); /** * Display balloon message for log level. * * @param message text message * @param level log level */ void displayMessage(String message, Level level); /** * Create tray icon and register frame listeners. */ void init(); /** * destroy frames */ void dispose(); } davmail-6.3.0/src/java/davmail/ui/tray/FrameGatewayTray.java0100644 0000000 0000000 00000024410 13574116517 022477 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.tray; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.ui.AboutFrame; import davmail.ui.SettingsFrame; import org.apache.log4j.Level; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.util.ArrayList; /** * Failover GUI for Java 1.5 without SWT */ public class FrameGatewayTray implements DavGatewayTrayInterface { protected FrameGatewayTray() { } static JFrame mainFrame; static AboutFrame aboutFrame; static SettingsFrame settingsFrame; private static JEditorPane errorArea; private static JLabel errorLabel; private static JEditorPane messageArea; private static ArrayList frameIcons; private static Image image; private static Image activeImage; private static Image inactiveImage; private boolean isActive = true; /** * Return AWT Image icon for frame title. * * @return frame icon */ @Override public java.util.List getFrameIcons() { return frameIcons; } /** * Switch tray icon between active and standby icon. */ public void switchIcon() { isActive = true; SwingUtilities.invokeLater(() -> { Image currentImage = mainFrame.getIconImage(); if (currentImage != null && currentImage.equals(image)) { mainFrame.setIconImage(activeImage); } else { mainFrame.setIconImage(image); } }); } /** * Set tray icon to inactive (network down) */ public void resetIcon() { SwingUtilities.invokeLater(() -> mainFrame.setIconImage(image)); } /** * Set tray icon to inactive (network down) */ public void inactiveIcon() { isActive = false; SwingUtilities.invokeLater(() -> mainFrame.setIconImage(inactiveImage)); } /** * Check if current tray status is inactive (network down). * * @return true if inactive */ public boolean isActive() { return isActive; } /** * Log and display balloon message according to log level. * * @param message text message * @param level log level */ public void displayMessage(final String message, final Level level) { SwingUtilities.invokeLater(() -> { if (errorArea != null && messageArea != null) { if (level.equals(Level.INFO)) { errorLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon")); errorArea.setText(message); } else if (level.equals(Level.WARN)) { errorLabel.setIcon(UIManager.getIcon("OptionPane.warningIcon")); errorArea.setText(message); } else if (level.equals(Level.ERROR)) { errorLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon")); errorArea.setText(message); } messageArea.setText(message); } }); } /** * Open about window */ public void about() { SwingUtilities.invokeLater(() -> { aboutFrame.update(); aboutFrame.setVisible(true); aboutFrame.toFront(); aboutFrame.requestFocus(); }); } /** * Open settings window */ public void preferences() { SwingUtilities.invokeLater(() -> { settingsFrame.reload(); settingsFrame.setVisible(true); settingsFrame.toFront(); settingsFrame.repaint(); settingsFrame.requestFocus(); }); } /** * Create tray icon and register frame listeners. */ public void init() { SwingUtilities.invokeLater(this::createAndShowGUI); } public void dispose() { // dispose frames settingsFrame.dispose(); aboutFrame.dispose(); } protected void buildMenu() { // create a popup menu JMenu menu = new JMenu(BundleMessage.format("UI_DAVMAIL_GATEWAY")); JMenuBar menuBar = new JMenuBar(); menuBar.add(menu); mainFrame.setJMenuBar(menuBar); // create an action settingsListener to listen for settings action executed on the tray icon ActionListener aboutListener = e -> about(); // create menu item for the default action JMenuItem aboutItem = new JMenuItem(BundleMessage.format("UI_ABOUT")); aboutItem.addActionListener(aboutListener); menu.add(aboutItem); // create an action settingsListener to listen for settings action executed on the tray icon ActionListener settingsListener = e -> preferences(); // create menu item for the default action JMenuItem defaultItem = new JMenuItem(BundleMessage.format("UI_SETTINGS")); defaultItem.addActionListener(settingsListener); menu.add(defaultItem); JMenuItem logItem = new JMenuItem(BundleMessage.format("UI_SHOW_LOGS")); logItem.addActionListener(e -> DavGatewayTray.showLogs()); menu.add(logItem); // create an action exitListener to listen for exit action executed on the tray icon ActionListener exitListener = e -> { try { DavGateway.stop(); } catch (Exception exc) { DavGatewayTray.error(exc); } // make sure we do exit System.exit(0); }; // create menu item for the exit action JMenuItem exitItem = new JMenuItem(BundleMessage.format("UI_EXIT")); exitItem.addActionListener(exitListener); menu.add(exitItem); } protected void createAndShowGUI() { // set cross platform look and feel on Linux, except is swing.defaultlaf is set if (Settings.isLinux() && System.getProperty("swing.defaultlaf") == null) { System.setProperty("swing.defaultlaf", UIManager.getCrossPlatformLookAndFeelClassName()); } else { System.setProperty("swing.defaultlaf", UIManager.getSystemLookAndFeelClassName()); } String imageName = AwtGatewayTray.TRAY_PNG; String activeImageName = AwtGatewayTray.TRAY_ACTIVE_PNG; String inactiveImageName = AwtGatewayTray.TRAY_INACTIVE_PNG; // use hi res icons on Linux if (Settings.isLinux()) { imageName = AwtGatewayTray.TRAY128_PNG; activeImageName = AwtGatewayTray.TRAY128_ACTIVE_PNG; inactiveImageName = AwtGatewayTray.TRAY128_INACTIVE_PNG; } image = DavGatewayTray.loadImage(imageName); activeImage = DavGatewayTray.loadImage(activeImageName); inactiveImage = DavGatewayTray.loadImage(inactiveImageName); frameIcons = new ArrayList<>(); frameIcons.add(image); frameIcons.add(DavGatewayTray.loadImage(AwtGatewayTray.TRAY128_PNG)); mainFrame = new JFrame(); mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); mainFrame.setTitle(BundleMessage.format("UI_DAVMAIL_GATEWAY")); mainFrame.setIconImages(frameIcons); JPanel errorPanel = new JPanel(); errorPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_LAST_MESSAGE"))); errorPanel.setLayout(new BoxLayout(errorPanel, BoxLayout.X_AXIS)); errorArea = new JTextPane(); errorArea.setEditable(false); errorArea.setBackground(mainFrame.getBackground()); errorLabel = new JLabel(); errorPanel.add(errorLabel); errorPanel.add(errorArea); JPanel messagePanel = new JPanel(); messagePanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_LAST_LOG"))); messagePanel.setLayout(new BoxLayout(messagePanel, BoxLayout.X_AXIS)); messageArea = new JTextPane(); messageArea.setText(BundleMessage.format("LOG_STARTING_DAVMAIL")); messageArea.setEditable(false); messageArea.setBackground(mainFrame.getBackground()); messagePanel.add(messageArea); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); mainPanel.add(errorPanel); mainPanel.add(messagePanel); mainFrame.add(mainPanel); aboutFrame = new AboutFrame(); settingsFrame = new SettingsFrame(); buildMenu(); mainFrame.setMinimumSize(new Dimension(400, 250)); mainFrame.pack(); // workaround MacOSX if (mainFrame.getSize().width < 400 || mainFrame.getSize().height < 180) { mainFrame.setSize(Math.max(mainFrame.getSize().width, 400), Math.max(mainFrame.getSize().height, 180)); } // center frame mainFrame.setLocation(mainFrame.getToolkit().getScreenSize().width / 2 - mainFrame.getSize().width / 2, mainFrame.getToolkit().getScreenSize().height / 2 - mainFrame.getSize().height / 2); mainFrame.setVisible(true); // display settings frame on first start if (Settings.isFirstStart()) { settingsFrame.setVisible(true); settingsFrame.toFront(); settingsFrame.repaint(); settingsFrame.requestFocus(); } } } davmail-6.3.0/src/java/davmail/ui/tray/OSXAwtGatewayTray.java0100644 0000000 0000000 00000005436 13575531320 022573 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.tray; import davmail.BundleMessage; import org.apache.log4j.Level; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; /** * Extended Awt tray with OSX extensions. */ public class OSXAwtGatewayTray extends AwtGatewayTray implements OSXTrayInterface { protected static final String OSX_TRAY_ACTIVE_PNG = "osxtray2.png"; protected static final String OSX_TRAY_PNG = "osxtray.png"; protected static final String OSX_TRAY_INACTIVE_PNG = "osxtrayinactive.png"; @Override protected void loadIcons() { image = DavGatewayTray.adjustTrayIcon(DavGatewayTray.loadImage(OSX_TRAY_PNG)); activeImage = DavGatewayTray.adjustTrayIcon(DavGatewayTray.loadImage(OSX_TRAY_ACTIVE_PNG)); inactiveImage = DavGatewayTray.adjustTrayIcon(DavGatewayTray.loadImage(OSX_TRAY_INACTIVE_PNG)); frameIcons = new ArrayList<>(); frameIcons.add(DavGatewayTray.loadImage(AwtGatewayTray.TRAY128_PNG)); frameIcons.add(DavGatewayTray.loadImage(AwtGatewayTray.TRAY_PNG)); } @Override protected void createAndShowGUI() { System.setProperty("apple.laf.useScreenMenuBar", "true"); super.createAndShowGUI(); trayIcon.removeActionListener(settingsListener); try { new OSXHandler(this); } catch (Exception e) { DavGatewayTray.error(new BundleMessage("LOG_ERROR_LOADING_OSXADAPTER"), e); } } @Override public void displayMessage(final String message, final Level level) { super.displayMessage(message, level); } protected Image getImageForIcon(Icon icon) { BufferedImage bufferedimage = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); Graphics g = bufferedimage.getGraphics(); icon.paintIcon(null, g, 0, 0); g.dispose(); return bufferedimage; } } davmail-6.3.0/src/java/davmail/ui/tray/OSXFrameGatewayTray.java0100644 0000000 0000000 00000003711 13574116517 023072 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.tray; import davmail.BundleMessage; import org.apache.log4j.Logger; import javax.swing.*; /** * MacOSX specific frame to handle menu */ public class OSXFrameGatewayTray extends FrameGatewayTray implements OSXTrayInterface { protected static final Logger LOGGER = Logger.getLogger(OSXFrameGatewayTray.class); @Override protected void buildMenu() { // create a popup menu JMenu menu = new JMenu(BundleMessage.format("UI_LOGS")); JMenuBar menuBar = new JMenuBar(); menuBar.add(menu); mainFrame.setJMenuBar(menuBar); JMenuItem logItem = new JMenuItem(BundleMessage.format("UI_SHOW_LOGS")); logItem.addActionListener(e -> DavGatewayTray.showLogs()); menu.add(logItem); } @Override protected void createAndShowGUI() { System.setProperty("apple.laf.useScreenMenuBar", "true"); super.createAndShowGUI(); try { new OSXHandler(this); } catch (Exception e) { DavGatewayTray.error(new BundleMessage("LOG_ERROR_LOADING_OSXADAPTER"), e); } } } davmail-6.3.0/src/java/davmail/ui/tray/OSXHandler.java0100644 0000000 0000000 00000006302 13524353416 021226 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.ui.tray; import java.awt.*; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class OSXHandler implements InvocationHandler { private final OSXTrayInterface davGatewayTray; public OSXHandler(OSXTrayInterface davGatewayTray) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { this.davGatewayTray = davGatewayTray; addEventHandlers(); } public static final boolean IS_JAVA9 = Double.parseDouble(System.getProperty("java.specification.version")) >= 1.9; public void addEventHandlers() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Class applicationClass; Class aboutHandlerClass; Class preferencesHandlerClass; Object application; if (IS_JAVA9) { applicationClass = Class.forName("java.awt.Desktop"); application = Desktop.getDesktop(); aboutHandlerClass = Class.forName("java.awt.desktop.AboutHandler"); preferencesHandlerClass = Class.forName("java.awt.desktop.PreferencesHandler"); } else { applicationClass = Class.forName("com.apple.eawt.Application"); application = applicationClass.getMethod("getApplication").invoke(null); aboutHandlerClass = Class.forName("com.apple.eawt.AboutHandler"); preferencesHandlerClass = Class.forName("com.apple.eawt.PreferencesHandler"); } Object proxy = Proxy.newProxyInstance(OSXHandler.class.getClassLoader(), new Class[]{ aboutHandlerClass, preferencesHandlerClass}, this); applicationClass.getDeclaredMethod("setAboutHandler", aboutHandlerClass).invoke(application, proxy); applicationClass.getDeclaredMethod("setPreferencesHandler", preferencesHandlerClass).invoke(application, proxy); } @Override public Object invoke(Object proxy, Method method, Object[] args) { if ("handleAbout".equals(method.getName())) { davGatewayTray.about(); } else if ("handlePreferences".equals(method.getName())) { davGatewayTray.preferences(); } return null; } } davmail-6.3.0/src/java/davmail/ui/tray/OSXTrayInterface.java0100644 0000000 0000000 00000001675 13524353416 022421 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.ui.tray; public interface OSXTrayInterface { void about(); void preferences(); } davmail-6.3.0/src/java/davmail/ui/tray/SwtGatewayTray.java0100644 0000000 0000000 00000034570 13574116517 022232 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.ui.tray; import davmail.BundleMessage; import davmail.DavGateway; import davmail.Settings; import davmail.ui.AboutFrame; import davmail.ui.SettingsFrame; import davmail.util.IOUtil; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.DeviceData; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.internal.gtk.OS; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolTip; import org.eclipse.swt.widgets.Tray; import org.eclipse.swt.widgets.TrayItem; import javax.swing.*; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.URL; import java.util.ArrayList; /** * Tray icon handler based on SWT */ public class SwtGatewayTray implements DavGatewayTrayInterface { private static final Logger LOGGER = Logger.getLogger(SwtGatewayTray.class); private static final Object LOCK = new Object(); protected SwtGatewayTray() { } SettingsFrame settingsFrame; AboutFrame aboutFrame; private static TrayItem trayItem; private static ArrayList frameIcons; private static Image image; private static Image image2; private static Image inactiveImage; private static Display display; private static Shell shell; private boolean isActive = true; private boolean isReady; private Error error; private boolean firstMessage = true; /** * Return AWT Image icon for frame title. * * @return frame icon */ @Override public java.util.List getFrameIcons() { return frameIcons; } /** * Switch tray icon between active and standby icon. */ public void switchIcon() { isActive = true; display.syncExec(() -> { Image currentImage = trayItem.getImage(); if (currentImage != null && currentImage.equals(image)) { trayItem.setImage(image2); } else { trayItem.setImage(image); } }); } /** * Set tray icon to inactive (network down) */ public void resetIcon() { display.syncExec(() -> trayItem.setImage(image)); } /** * Set tray icon to inactive (network down) */ public void inactiveIcon() { isActive = false; display.syncExec(() -> trayItem.setImage(inactiveImage)); } /** * Check if current tray status is inactive (network down). * * @return true if inactive */ public boolean isActive() { return isActive; } /** * Log and display balloon message according to log level. * * @param message text message * @param level log level */ public void displayMessage(final String message, final Level level) { if (trayItem != null) { display.asyncExec(() -> { int messageType = 0; if (level.equals(Level.INFO)) { messageType = SWT.ICON_INFORMATION; } else if (level.equals(Level.WARN)) { messageType = SWT.ICON_WARNING; } else if (level.equals(Level.ERROR)) { messageType = SWT.ICON_ERROR; } if (messageType != 0) { final ToolTip toolTip = new ToolTip(shell, SWT.BALLOON | messageType); toolTip.setText(BundleMessage.format("UI_DAVMAIL_GATEWAY")); toolTip.setMessage(message); trayItem.setToolTip(toolTip); // Wait for tray init 1 second on first message if (firstMessage) { firstMessage = false; try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } toolTip.setVisible(true); } trayItem.setToolTipText(BundleMessage.format("UI_DAVMAIL_GATEWAY") + '\n' + message); }); } } /** * Load image with current class loader. * * @param fileName image resource file name * @return image */ public static Image loadSwtImage(String fileName) { Image result = null; try { ClassLoader classloader = DavGatewayTray.class.getClassLoader(); URL imageUrl = classloader.getResource(fileName); if (imageUrl == null) { throw new IOException(fileName); } byte[] imageContent = IOUtil.readFully(imageUrl.openStream()); Image tempImage = new Image(display, new ByteArrayInputStream(imageContent)); Image backgroundImage = new Image(null, 24, 24); ImageData imageData = backgroundImage.getImageData(); imageData.transparentPixel = imageData.getPixel(0, 0); backgroundImage.dispose(); result = new Image(null, imageData); GC gc = new GC(result); gc.drawImage(tempImage, 4, 4); tempImage.dispose(); } catch (IOException e) { DavGatewayTray.warn(new BundleMessage("LOG_UNABLE_TO_LOAD_IMAGE"), e); } return result; } /** * Create tray icon and register frame listeners. */ public void init() { boolean isGTK3; // SWT 4.9 and later try { Class gtk = Class.forName("org.eclipse.swt.internal.gtk.GTK"); isGTK3 = (Boolean) gtk.getDeclaredField("GTK3").get(null); LOGGER.debug("org.eclipse.swt.internal.gtk.GTK.GTK3="+isGTK3); if (isGTK3) { LOGGER.warn("GTK 3 not supported, please set SWT_GTK3=0"); } } catch (Throwable e) { // ignore } try { Class gdk = Class.forName("org.eclipse.swt.internal.gtk.GDK"); //noinspection unchecked gdk.getDeclaredMethod("gdk_error_trap_push").invoke(null); LOGGER.debug("Called org.eclipse.swt.internal.gtk.GDK.gdk_error_trap_push"); } catch (Throwable e) { // ignore } try { //noinspection JavaReflectionMemberAccess OS.class.getDeclaredMethod("gdk_error_trap_push").invoke(null); LOGGER.debug("Called org.eclipse.swt.internal.gtk.OS.gdk_error_trap_push"); } catch (Exception e) { // ignore } try { // workaround for bug when SWT and AWT both try to access Gtk UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { DavGatewayTray.warn(new BundleMessage("LOG_UNABLE_TO_SET_LOOK_AND_FEEL")); } new Thread("SWT") { @Override public void run() { try { DeviceData data = new DeviceData(); data.debug = true; display = new Display(data); shell = new Shell(display); final Tray tray = display.getSystemTray(); if (tray != null) { trayItem = new TrayItem(tray, SWT.NONE); trayItem.setToolTipText(BundleMessage.format("UI_DAVMAIL_GATEWAY")); frameIcons = new ArrayList<>(); frameIcons.add(DavGatewayTray.loadImage(AwtGatewayTray.TRAY128_PNG)); frameIcons.add(DavGatewayTray.loadImage(AwtGatewayTray.TRAY_PNG)); image = loadSwtImage(AwtGatewayTray.TRAY_PNG); image2 = loadSwtImage(AwtGatewayTray.TRAY_ACTIVE_PNG); inactiveImage = loadSwtImage(AwtGatewayTray.TRAY_INACTIVE_PNG); trayItem.setImage(image); trayItem.addDisposeListener(e -> { if (image != null && !image.isDisposed()) { image.dispose(); } if (image2 != null && !image2.isDisposed()) { image2.dispose(); } if (inactiveImage != null && !inactiveImage.isDisposed()) { inactiveImage.dispose(); } }); // create a popup menu final Menu popup = new Menu(shell, SWT.POP_UP); trayItem.addListener(SWT.MenuDetect, event -> display.asyncExec( () -> popup.setVisible(true))); MenuItem aboutItem = new MenuItem(popup, SWT.PUSH); aboutItem.setText(BundleMessage.format("UI_ABOUT")); aboutItem.addListener(SWT.Selection, event -> SwingUtilities.invokeLater( () -> { if (aboutFrame == null) { aboutFrame = new AboutFrame(); } aboutFrame.update(); aboutFrame.setVisible(true); aboutFrame.toFront(); aboutFrame.requestFocus(); })); // create menu item for the default action trayItem.addListener(SWT.DefaultSelection, event -> SwingUtilities.invokeLater( () -> openSettingsFrame())); MenuItem defaultItem = new MenuItem(popup, SWT.PUSH); defaultItem.setText(BundleMessage.format("UI_SETTINGS")); defaultItem.addListener(SWT.Selection, event -> SwingUtilities.invokeLater( () -> openSettingsFrame())); MenuItem logItem = new MenuItem(popup, SWT.PUSH); logItem.setText(BundleMessage.format("UI_SHOW_LOGS")); logItem.addListener(SWT.Selection, event -> SwingUtilities.invokeLater(DavGatewayTray::showLogs)); MenuItem exitItem = new MenuItem(popup, SWT.PUSH); exitItem.setText(BundleMessage.format("UI_EXIT")); exitItem.addListener(SWT.Selection, event -> DavGateway.stop()); // display settings frame on first start if (Settings.isFirstStart()) { SwingUtilities.invokeLater(() -> { // create frame on first call if (settingsFrame == null) { settingsFrame = new SettingsFrame(); } settingsFrame.setVisible(true); settingsFrame.toFront(); settingsFrame.requestFocus(); }); } synchronized (LOCK) { // ready isReady = true; LOCK.notifyAll(); } while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } // dispose AWT frames if (settingsFrame != null) { settingsFrame.dispose(); } if (aboutFrame != null) { aboutFrame.dispose(); } } catch (Exception exc) { DavGatewayTray.error(exc); } catch (Error exc) { error = exc; throw exc; } // make sure we do exit System.exit(0); } }.start(); while (true) { // wait for SWT init try { synchronized (LOCK) { if (error != null) { throw error; } if (isReady) { break; } LOCK.wait(1000); } } catch (InterruptedException e) { DavGatewayTray.error(new BundleMessage("LOG_ERROR_WAITING_FOR_SWT_INIT"), e); Thread.currentThread().interrupt(); } } } private void openSettingsFrame() { // create frame on first call if (settingsFrame == null) { settingsFrame = new SettingsFrame(); } settingsFrame.reload(); settingsFrame.setVisible(true); settingsFrame.toFront(); settingsFrame.requestFocus(); } public void dispose() { shell.dispose(); } } davmail-6.3.0/src/java/davmail/util/IOUtil.java0100644 0000000 0000000 00000012777 14545543571 020031 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.util; import org.apache.commons.codec.binary.Base64; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.nio.charset.StandardCharsets; /** * Input output functions. */ public final class IOUtil { private IOUtil() { } /** * Write all inputstream content to outputstream. * * @param inputStream input stream * @param outputStream output stream * @throws IOException on error */ public static void write(InputStream inputStream, OutputStream outputStream) throws IOException { byte[] bytes = new byte[8192]; int length; while ((length = inputStream.read(bytes)) > 0) { outputStream.write(bytes, 0, length); } } /** * Decode base64 input string, return byte array. * * @param encoded Base64 encoded string * @return decoded content as byte array */ public static byte[] decodeBase64(String encoded) { return Base64.decodeBase64(encoded.getBytes(StandardCharsets.US_ASCII)); } /** * Decode base64 input string, return content as UTF-8 String. * * @param encoded Base64 encoded string * @return decoded content as byte array */ public static String decodeBase64AsString(String encoded) { return new String(decodeBase64(encoded), StandardCharsets.UTF_8); } /** * Base64 encode value. * * @param value input value * @return base64 value */ public static String encodeBase64AsString(String value) { return new String(Base64.encodeBase64(value.getBytes(StandardCharsets.UTF_8)), StandardCharsets.US_ASCII); } /** * Base64 encode value. * * @param value input value * @return base64 value */ public static String encodeBase64AsString(byte[] value) { return new String(Base64.encodeBase64(value), StandardCharsets.US_ASCII); } /** * Base64 encode value. * * @param value input value * @return base64 value */ public static byte[] encodeBase64(String value) { return Base64.encodeBase64(value.getBytes(StandardCharsets.UTF_8)); } /** * Base64 encode value. * * @param value input value * @return base64 value */ public static byte[] encodeBase64(byte[] value) { return Base64.encodeBase64(value); } /** * Resize image bytes to a max width or height image size. * * @param inputBytes input image bytes * @param max max size * @return scaled image bytes * @throws IOException on error */ public static byte[] resizeImage(byte[] inputBytes, int max) throws IOException { BufferedImage inputImage = ImageIO.read(new ByteArrayInputStream(inputBytes)); if (inputImage == null) { throw new IOException("Unable to decode image data"); } BufferedImage outputImage = resizeImage(inputImage, max); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(outputImage, "jpg", baos); return baos.toByteArray(); } /** * Resize image to a max width or height image size. * * @param inputImage input image * @param max max size * @return scaled image */ public static BufferedImage resizeImage(BufferedImage inputImage, int max) { int width = inputImage.getWidth(); int height = inputImage.getHeight(); int targetWidth; int targetHeight; if (width <= max && height <= max) { return inputImage; } else if (width > height) { targetWidth = max; targetHeight = targetWidth * height / width; } else { targetHeight = max; targetWidth = targetHeight * width / height; } Image scaledImage = inputImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH); BufferedImage targetImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); targetImage.getGraphics().drawImage(scaledImage, 0, 0, null); return targetImage; } /** * Read all inputStream content to a byte array. * * @param inputStream input stream * @return content as byte array * @throws IOException on error */ public static byte[] readFully(InputStream inputStream) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); write(inputStream, baos); return baos.toByteArray(); } } davmail-6.3.0/src/java/davmail/util/StringEncryptor.java0100644 0000000 0000000 00000006757 13574116520 022030 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.util; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import java.io.IOException; import java.net.InetAddress; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; /** * Encrypt string with user password. * Simple implementation based on AES */ public class StringEncryptor { static final String ALGO = "PBEWithHmacSHA256AndAES_128"; static String fingerprint; static { try { fingerprint = InetAddress.getLocalHost().getCanonicalHostName().substring(0, 16); } catch (Throwable t) { fingerprint = "davmailgateway!&"; } } private final String password; public StringEncryptor(String password) { this.password = password; } public String encryptString(String value) throws IOException { try { byte[] plaintext = value.getBytes(StandardCharsets.UTF_8); // Encrypt Cipher enc = Cipher.getInstance(ALGO); enc.init(Cipher.ENCRYPT_MODE, getSecretKey(), getPBEParameterSpec()); byte[] encrypted = enc.doFinal(plaintext); return "{AES}" + IOUtil.encodeBase64AsString(encrypted); } catch (Exception e) { throw new IOException(e); } } public String decryptString(String value) throws IOException { if (value != null && value.startsWith("{AES}")) { try { byte[] encrypted = IOUtil.decodeBase64(value.substring(5)); Cipher dec = Cipher.getInstance(ALGO); dec.init(Cipher.DECRYPT_MODE, getSecretKey(), getPBEParameterSpec()); byte[] decrypted = dec.doFinal(encrypted); return new String(decrypted, StandardCharsets.UTF_8); } catch (Exception e) { throw new IOException(e); } } else { return value; } } private SecretKey getSecretKey() throws InvalidKeySpecException, NoSuchAlgorithmException { PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); SecretKeyFactory kf = SecretKeyFactory.getInstance(ALGO); return kf.generateSecret(keySpec); } private PBEParameterSpec getPBEParameterSpec() { byte[] bytes = fingerprint.getBytes(StandardCharsets.UTF_8); return new PBEParameterSpec(bytes, 10000, new IvParameterSpec(bytes)); } } davmail-6.3.0/src/java/davmail/util/StringUtil.java0100644 0000000 0000000 00000045470 14754153500 020753 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.util; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Hex; import java.nio.charset.StandardCharsets; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Set; import java.util.regex.Pattern; /** * Various string handling methods */ public final class StringUtil { private StringUtil() { } /** * Return the sub string between startDelimiter and endDelimiter or null. * * @param value String value * @param startDelimiter start delimiter * @param endDelimiter end delimiter * @return token value */ public static String getToken(String value, String startDelimiter, String endDelimiter) { String token = null; if (value != null) { int startIndex = value.indexOf(startDelimiter); if (startIndex >= 0) { startIndex += startDelimiter.length(); int endIndex = value.indexOf(endDelimiter, startIndex); if (endIndex >= 0) { token = value.substring(startIndex, endIndex); } } } return token; } /** * Return the sub string between startDelimiter and endDelimiter or null, * look for last token in string. * * @param value String value * @param startDelimiter start delimiter * @param endDelimiter end delimiter * @return token value */ public static String getLastToken(String value, String startDelimiter, String endDelimiter) { String token = null; if (value != null) { int startIndex = value.lastIndexOf(startDelimiter); if (startIndex >= 0) { startIndex += startDelimiter.length(); int endIndex = value.indexOf(endDelimiter, startIndex); if (endIndex >= 0) { token = value.substring(startIndex, endIndex); } } } return token; } /** * Return the sub string between startDelimiter and endDelimiter with newToken. * * @param value String value * @param startDelimiter start delimiter * @param endDelimiter end delimiter * @param newToken new token value * @return token value */ public static String replaceToken(String value, String startDelimiter, String endDelimiter, String newToken) { String result = null; if (value != null) { int startIndex = value.indexOf(startDelimiter); if (startIndex >= 0) { startIndex += startDelimiter.length(); int endIndex = value.indexOf(endDelimiter, startIndex); if (endIndex >= 0) { result = value.substring(0, startIndex) + newToken + value.substring(endIndex); } } } return result; } /** * Join values with given separator. * * @param values value set * @param separator separator * @return joined values */ public static String join(Set values, String separator) { if (values != null && !values.isEmpty()) { StringBuilder result = new StringBuilder(); for (String value : values) { if (result.length() > 0) { result.append(separator); } result.append(value); } return result.toString(); } else { return null; } } static class PatternMap { protected String match; protected String value; protected Pattern pattern; protected PatternMap(String match, String value) { this.match = match; this.value = value; pattern = Pattern.compile(match); } protected PatternMap(String match, String escapedMatch, String value) { this.match = match; this.value = value; pattern = Pattern.compile(escapedMatch); } protected PatternMap(String match, Pattern pattern, String value) { this.match = match; this.value = value; this.pattern = pattern; } protected String replaceAll(String string) { if (string != null && string.contains(match)) { return pattern.matcher(string).replaceAll(value); } else { return string; } } } private static final Pattern AMP_PATTERN = Pattern.compile("&"); private static final Pattern PLUS_PATTERN = Pattern.compile("\\+"); private static final Pattern QUOTE_PATTERN = Pattern.compile("\""); private static final Pattern CR_PATTERN = Pattern.compile("\r"); private static final Pattern LF_PATTERN = Pattern.compile("\n"); private static final List URLENCODED_PATTERNS = new ArrayList<>(); static { URLENCODED_PATTERNS.add(new PatternMap(String.valueOf((char) 0xF8FF), "_xF8FF_")); URLENCODED_PATTERNS.add(new PatternMap("%26", "&")); URLENCODED_PATTERNS.add(new PatternMap("%2B", "+")); URLENCODED_PATTERNS.add(new PatternMap("%3A", ":")); URLENCODED_PATTERNS.add(new PatternMap("%3B", ";")); URLENCODED_PATTERNS.add(new PatternMap("%3C", "<")); URLENCODED_PATTERNS.add(new PatternMap("%3E", ">")); URLENCODED_PATTERNS.add(new PatternMap("%22", "\"")); URLENCODED_PATTERNS.add(new PatternMap("%23", "#")); URLENCODED_PATTERNS.add(new PatternMap("%2A", "*")); URLENCODED_PATTERNS.add(new PatternMap("%7C", "|")); URLENCODED_PATTERNS.add(new PatternMap("%3F", "?")); URLENCODED_PATTERNS.add(new PatternMap("%7E", "~")); // CRLF is replaced with LF in response URLENCODED_PATTERNS.add(new PatternMap("\n", "_x000D__x000A_")); // last replace % URLENCODED_PATTERNS.add(new PatternMap("%25", "%")); } private static final List URLENCODE_PATTERNS = new ArrayList<>(); static { // first replace % URLENCODE_PATTERNS.add(new PatternMap("%", "%25")); URLENCODE_PATTERNS.add(new PatternMap("_xF8FF_", String.valueOf((char) 0xF8FF))); URLENCODE_PATTERNS.add(new PatternMap("&", AMP_PATTERN, "%26")); URLENCODE_PATTERNS.add(new PatternMap("+", PLUS_PATTERN, "%2B")); URLENCODE_PATTERNS.add(new PatternMap(":", "%3A")); URLENCODE_PATTERNS.add(new PatternMap(";", "%3B")); URLENCODE_PATTERNS.add(new PatternMap("<", "%3C")); URLENCODE_PATTERNS.add(new PatternMap(">", "%3E")); URLENCODE_PATTERNS.add(new PatternMap("\"", "%22")); URLENCODE_PATTERNS.add(new PatternMap("#", "%23")); URLENCODE_PATTERNS.add(new PatternMap("~", "%7E")); URLENCODE_PATTERNS.add(new PatternMap("*", "\\*", "%2A")); URLENCODE_PATTERNS.add(new PatternMap("|", "\\|", "%7C")); URLENCODE_PATTERNS.add(new PatternMap("?", "\\?", "%3F")); URLENCODE_PATTERNS.add(new PatternMap("_x000D__x000A_", "\r\n")); } private static final List XML_DECODE_PATTERNS = new ArrayList<>(); static { XML_DECODE_PATTERNS.add(new PatternMap("&", "&")); XML_DECODE_PATTERNS.add(new PatternMap("<", "<")); XML_DECODE_PATTERNS.add(new PatternMap(">", ">")); } private static final List XML_ENCODE_PATTERNS = new ArrayList<>(); static { XML_ENCODE_PATTERNS.add(new PatternMap("&", AMP_PATTERN, "&")); XML_ENCODE_PATTERNS.add(new PatternMap("<", "<")); XML_ENCODE_PATTERNS.add(new PatternMap(">", ">")); } private static final Pattern SLASH_PATTERN = Pattern.compile("/"); private static final Pattern UNDERSCORE_PATTERN = Pattern.compile("_"); private static final Pattern DASH_PATTERN = Pattern.compile("-"); // WebDav search parameter encode private static final Pattern APOS_PATTERN = Pattern.compile("'"); /** * Xml encode content. * * @param name decoded name * @return name encoded name */ public static String xmlEncode(String name) { String result = name; if (result != null) { for (PatternMap patternMap : XML_ENCODE_PATTERNS) { result = patternMap.replaceAll(result); } } return result; } /** * Xml encode inside attribute. * * @param name decoded name * @return name encoded name */ public static String xmlEncodeAttribute(String name) { String result = xmlEncode(name); if (result != null) { if (result.indexOf('"') >= 0) { result = QUOTE_PATTERN.matcher(result).replaceAll("""); } if (result.indexOf('\r') >= 0) { result = CR_PATTERN.matcher(result).replaceAll(" "); } if (result.indexOf('\n') >= 0) { result = LF_PATTERN.matcher(result).replaceAll(" "); } } return result; } /** * Need to decode xml for iCal * * @param name encoded name * @return name decoded name */ public static String xmlDecode(String name) { String result = name; if (result != null) { for (PatternMap patternMap : XML_DECODE_PATTERNS) { result = patternMap.replaceAll(result); } } return result; } /** * Convert base64 value to hex. * * @param value base64 value * @return hex value */ @SuppressWarnings("unused") public static String base64ToHex(String value) { String hexValue = null; if (value != null) { hexValue = new String(Hex.encodeHex(Base64.decodeBase64(value.getBytes(StandardCharsets.UTF_8)))); } return hexValue; } /** * Convert hex value to base64. * * @param value hex value * @return base64 value * @throws DecoderException on error */ @SuppressWarnings("unused") public static String hexToBase64(String value) throws DecoderException { String base64Value = null; if (value != null) { base64Value = new String(Base64.encodeBase64(Hex.decodeHex(value.toCharArray())), StandardCharsets.UTF_8); } return base64Value; } /** * Encode item name to get actual value stored in urlcompname MAPI property. * * @param value decoded value * @return urlcompname encoded value */ public static String encodeUrlcompname(String value) { String result = value; if (result != null) { for (PatternMap patternMap : URLENCODE_PATTERNS) { result = patternMap.replaceAll(result); } } return result; } /** * Decode urlcompname to get item name. * * @param urlcompname encoded value * @return decoded value */ public static String decodeUrlcompname(String urlcompname) { String result = urlcompname; if (result != null) { for (PatternMap patternMap : URLENCODED_PATTERNS) { result = patternMap.replaceAll(result); } } return result; } /** * Urlencode plus sign in encoded href. * '+' is decoded as ' ' by URIUtil.decode, the workaround is to force urlencoding to '%2B' first * * @param value encoded href * @return encoded href */ public static String encodePlusSign(String value) { String result = value; if (result.indexOf('+') >= 0) { result = PLUS_PATTERN.matcher(result).replaceAll("%2B"); } return result; } /** * Encode EWS base64 itemId to url compatible value. * * @param value base64 value * @return url compatible value */ public static String base64ToUrl(String value) { String result = value; if (result != null) { if (result.indexOf('+') >= 0) { result = PLUS_PATTERN.matcher(result).replaceAll("-"); } if (result.indexOf('/') >= 0) { result = SLASH_PATTERN.matcher(result).replaceAll("_"); } } return result; } /** * Encode EWS url compatible itemId back to base64 value. * * @param value url compatible value * @return base64 value */ public static String urlToBase64(String value) { String result = value; if (result.indexOf('-') >= 0) { result = DASH_PATTERN.matcher(result).replaceAll("+"); } if (result.indexOf('_') >= 0) { result = UNDERSCORE_PATTERN.matcher(result).replaceAll("/"); } return result; } /** * Encode quotes in Dav search parameter. * * @param value search parameter * @return escaped value */ public static String davSearchEncode(String value) { String result = value; if (result.indexOf('\'') >= 0) { result = APOS_PATTERN.matcher(result).replaceAll("''"); } return result; } /** * Get allday date value from zulu timestamp. * * @param value zulu datetime * @return yyyyMMdd allday date value */ public static String convertZuluDateTimeToAllDay(String value) { String result = value; if (value != null && value.length() != 8) { // try to convert datetime value to date value try { Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateParser = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); calendar.setTime(dateParser.parse(value)); calendar.add(Calendar.HOUR_OF_DAY, 12); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd"); result = dateFormatter.format(calendar.getTime()); } catch (ParseException e) { // ignore } } return result; } /** * Takes a quoted string according to IMAP rfc 3501 and returns its intrinsic (unquoted) string value. * *

RFC 3501 defines a quoted string in its ABNF as follows:

*
     *     quoted          = DQUOTE *QUOTED-CHAR DQUOTE
     *     DQUOTE          = %x22
     *                       ; " (Double Quote)
     *     QUOTED-CHAR     = <any TEXT-CHAR except quoted-specials> /
     *                       "\" quoted-specials / UTF8-2 / UTF8-3 / UTF8-4
     *     TEXT-CHAR       = <any CHAR except CR and LF>
     *     quoted-specials = DQUOTE / "\"
     * 
* * @param quoted the quoted string or null * @return the unquoted string, or null if-and-only-if `quoted` was null * @throws IllegalArgumentException when the given quoted string is not valid */ public static String parseQuotedImapString(String quoted) throws ParseException { if (null == quoted) { return null; } char[] quotedChars = quoted.toCharArray(); if (quotedChars.length < 2) { // not a quoted string. even the empty string is, in it's quoted form, represented as: "\"\"" // (two double quotes) throw new ParseException("Not a valid imap quoted string (too short): " + quoted, 0); } if ('"' != quotedChars[0]) { throw new ParseException("Not a valid imap quoted string (does not start with double quote): " + quoted, 0); } // the result length is at least by 2 chars shorter than the input length, as at least the two enclosing // double quotes are removed. char[] resultChars = new char[quotedChars.length - 2]; // 0 is the index of the first char in resultChars that is the actual result // resultPos is the index of the last byte in resultChars that is the actual result // resultChars MAY have additional bytes (when resultPos + 1 < resultChars.length), that are not part of the result. int resultPos = 0; // a very mechanical approach, looking at one character at a time boolean backslashMode = false; // iterate ignoring starting and ending quotes for (int i = 1; i < quotedChars.length - 1; i++) { if (backslashMode) { if ('\\' == quotedChars[i] || '"' == quotedChars[i]) { resultChars[resultPos++] = quotedChars[i]; backslashMode = false; } else { throw new ParseException("Not a valid imap quoted string " + "(only '\"' and '\\' allowed after '\\') at index " + i + ": " + quoted, i); } } else { if ('\\' == quotedChars[i]) { backslashMode = true; } else { resultChars[resultPos++] = quotedChars[i]; } } } if (backslashMode) { throw new ParseException("Not a valid imap quoted string " + "(outer ending quote is backslashed): " + quoted, quotedChars.length - 1); } if ('"' != quotedChars[quotedChars.length - 1]) { throw new ParseException("Not a valid imap quoted string " + "(does not end with double quotes): " + quoted, quotedChars.length - 1); } return new String(resultChars, 0, resultPos); } /** * Remove quotes if present on value. * * @param value input value * @return unquoted string */ public static String removeQuotes(String value) { String result = value; if (result != null) { if (result.startsWith("\"") || result.startsWith("{") || result.startsWith("(")) { result = result.substring(1); } if (result.endsWith("\"") || result.endsWith("}") || result.endsWith(")")) { result = result.substring(0, result.length() - 1); } } return result; } } davmail-6.3.0/src/java/davmailmessages.properties0100644 0000000 0000000 00000045154 14754153500 020674 0ustar000000000 0000000 EXCEPTION_AUTHENTICATION_FAILED=Authentication failed: invalid user or password EXCEPTION_AUTHENTICATION_FAILED_REASON=Authentication failed {0} EXCEPTION_AUTHENTICATION_FAILED_PASSWORD_EXPIRED=Authentication failed: password expired ? EXCEPTION_AUTHENTICATION_FAILED_RETRY=Authentication failed: invalid user or password, retry with domain\\user or use default domain setting EXCEPTION_CONNECTION_FAILED=Unable to connect to OWA at {0}, status code {1}, check configuration EXCEPTION_DAVMAIL_CONFIGURATION=DavMail configuration exception:\n{0} EXCEPTION_END_OF_STREAM=End of stream reached reading content EXCEPTION_ITEM_NOT_FOUND=Item not found EXCEPTION_EXCHANGE_LOGIN_FAILED=Exchange login exception: {0} EXCEPTION_SESSION_EXPIRED=Exchange session expired EXCEPTION_INVALID_CALDAV_REQUEST=Invalid Caldav request: {0} EXCEPTION_INVALID_CONTENT_LENGTH=Invalid content length: {0} EXCEPTION_INVALID_CONTENT_TYPE=Invalid content type: {0} EXCEPTION_INVALID_CREDENTIALS=Invalid credentials EXCEPTION_INVALID_DATE=Invalid date: {0} EXCEPTION_INVALID_DATES=Invalid dates: {0} EXCEPTION_INVALID_FOLDER_URL=Invalid folder URL: {0} EXCEPTION_INVALID_HEADER=Invalid header, HTTPS connection to an HTTP listener ? EXCEPTION_INVALID_KEEPALIVE=Invalid Keep-Alive: {0} EXCEPTION_INVALID_MAIL_PATH=Invalid mail path: {0} EXCEPTION_INVALID_MESSAGE_CONTENT=Invalid message content: {0} EXCEPTION_INVALID_MESSAGE_URL=Invalid message URL: {0} EXCEPTION_INVALID_RECIPIENT=Invalid recipient: {0} EXCEPTION_INVALID_REQUEST=Invalid request: {0} EXCEPTION_INVALID_SEARCH_PARAMETERS=Invalid search parameters: {0} EXCEPTION_UNSUPPORTED_PARAMETER=Unsupported parameter: {0} EXCEPTION_INVALID_PARAMETER=Invalid parameter: {0} EXCEPTION_NETWORK_DOWN=All network interfaces down or host unreachable ! EXCEPTION_UNABLE_TO_CREATE_MESSAGE=Unable to create message {0}: {1}{2}{3} EXCEPTION_UNABLE_TO_GET_FOLDER=Unable to get folder at {0} EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER=Unable to get mail folder at {0}, Webdav not available on Exchange server EXCEPTION_UNABLE_TO_MOVE_FOLDER=Unable to move folder, target already exists EXCEPTION_UNABLE_TO_MOVE_MESSAGE=Unable to move message, target already exists EXCEPTION_UNABLE_TO_COPY_MESSAGE=Unable to copy message, target already exists EXCEPTION_UNABLE_TO_PATCH_MESSAGE=Unable to patch message {0}: {1}{2}{3} EXCEPTION_UNABLE_TO_UPDATE_MESSAGE=Unable to update message properties EXCEPTION_CONNECT=Connect exception: {0} {1} EXCEPTION_UNSUPPORTED_AUTHORIZATION_MODE=Unsupported authorization mode: {0} EXCEPTION_UNSUPPORTED_VALUE=Unsupported value: {0} LOG_CLIENT_CLOSED_CONNECTION=Client closed connection LOG_CLOSE_CONNECTION_ON_TIMEOUT=Closing connection on timeout LOG_CONNECTION_CLOSED=Connection closed LOG_CONNECTION_FROM=Connection from {0} on port {1,number,#} LOG_DAVMAIL_GATEWAY_LISTENING=DavMail Gateway {0} listening on {1} LOG_DAVMAIL_STARTED=DavMail Gateway started LOG_ERROR_CLOSING_CONFIG_FILE=Error closing configuration file LOG_ERROR_LOADING_OSXADAPTER=Error while loading the OSXAdapter LOG_ERROR_LOADING_SETTINGS=Error loading settings LOG_ERROR_RETRIEVING_MESSAGE=Error retreiving message LOG_ERROR_WAITING_FOR_SWT_INIT=Error waiting for SWT init LOG_ITEM_NOT_AVAILABLE=Item {0} not available: {1} LOG_EXCEPTION_CLOSING_CLIENT_SOCKET=Exception closing client socket LOG_EXCEPTION_CLOSING_CONNECTION_ON_TIMEOUT=Exception closing connection on timeout LOG_EXCEPTION_CLOSING_SERVER_SOCKET=Exception closing server socket LOG_EXCEPTION_CREATING_SERVER_SOCKET=Exception creating server socket LOG_EXCEPTION_CREATING_SSL_SERVER_SOCKET=Unable to bind server socket for {0} on port {1,number,#}: Exception creating secured server socket : {2} LOG_EXCEPTION_GETTING_SOCKET_STREAMS=Exception while getting socket streams LOG_EXCEPTION_LISTENING_FOR_CONNECTIONS=Exception while listening for connections LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT=Exception sending error to client LOG_EXCEPTION_WAITING_SERVER_THREAD_DIE=Exception waiting for server thread to die LOG_EXECUTE_FOLLOW_REDIRECTS=executeFollowRedirects({0}) LOG_EXECUTE_FOLLOW_REDIRECTS_COUNT=executeFollowRedirects: {0} redirectCount:{1} LOG_EXTERNAL_CONNECTION_REFUSED=Connection from external client refused LOG_FOUND_ACCEPTED_CERTIFICATE=Found permanently accepted certificate, hash {0} LOG_FOUND_CALENDAR_MESSAGES=Found {0} calendar messages LOG_IMAP_COMMAND={0} on {1} LOG_INVALID_DEPTH=Invalid depth value: {0} LOG_INVALID_SETTING_VALUE=Invalid setting value in {0} LOG_INVALID_URL=Invalid URL: {0} LOG_JAVA6_DESKTOP_UNAVAILABLE=Java 6 Desktop class not available LOG_LDAP_IGNORE_FILTER_ATTRIBUTE=Ignoring filter attribute: {0}= {1} LOG_LDAP_REPLACED_UID_FILTER=Replaced {0} with {1} in uid filter LOG_LDAP_REQ_ABANDON_SEARCH=LDAP_REQ_ABANDON {0} for search {1} LOG_LDAP_REQ_UNBIND=LDAP_REQ_UNBIND {0} LOG_LDAP_REQ_BIND_ANONYMOUS=LDAP_REQ_BIND {0} anonymous LOG_LDAP_REQ_BIND_USER=LDAP_REQ_BIND {0} {1} LOG_LDAP_REQ_BIND_SUCCESS=LOG_LDAP_REQ_BIND Success LOG_LDAP_REQ_BIND_INVALID_CREDENTIALS=LDAP_REQ_BIND Invalid credentials LOG_LDAP_REQ_SEARCH=LDAP_REQ_SEARCH {0} base={1} scope: {2} sizelimit: {3} timelimit: {4} filter: {5} returning attributes: {6} LOG_LDAP_REQ_SEARCH_ANONYMOUS_ACCESS_FORBIDDEN=LDAP_REQ_SEARCH {0} Anonymous access to {1} forbidden LOG_LDAP_REQ_SEARCH_END=LDAP_REQ_SEARCH {0} end LOG_LDAP_REQ_SEARCH_FOUND_RESULTS=LDAP_REQ_SEARCH {0} found {1} results LOG_LDAP_REQ_SEARCH_INVALID_DN=LDAP_REQ_SEARCH {0} unrecognized dn {1}, use base context ou=people or o=od LOG_LDAP_REQ_SEARCH_SEND_PERSON=LDAP_REQ_SEARCH {0} send uid={1}{2} {3} LOG_LDAP_REQ_SEARCH_SIZE_LIMIT_EXCEEDED=LDAP_REQ_SEARCH {0} size limit exceeded LOG_LDAP_REQ_SEARCH_SUCCESS=LDAP_REQ_SEARCH {0} success LOG_LDAP_SEND_COMPUTER_CONTEXT=Sending computer context {0} {1} LOG_LDAP_SEND_ROOT_DSE=Sending root DSE LOG_LDAP_UNSUPPORTED_FILTER=Unsupported filter: {0} LOG_LDAP_UNSUPPORTED_FILTER_ATTRIBUTE=Unsupported filter attribute: {0}= {1} LOG_LDAP_UNSUPPORTED_FILTER_VALUE=Unsupported filter value LOG_LDAP_UNSUPPORTED_OPERATION=Unsupported operation: {0} LOG_LISTING_ITEM=Listing item {0}/{1} LOG_MESSAGE={0} LOG_NEW_VERSION_AVAILABLE=A new version ({0}) of DavMail Gateway is available ! LOG_OPEN_LINK_NOT_SUPPORTED=Open link not supported (tried AWT Desktop and SWT Program) LOG_PROTOCOL_PORT={0} port {1,number,# } LOG_READ_CLIENT_AUTHORIZATION=< Authorization: ******** LOG_READ_CLIENT_AUTH_PLAIN=< AUTH PLAIN ******** LOG_READ_CLIENT_AUTH_LOGIN=< AUTH LOGIN ******** LOG_READ_CLIENT_LINE=< {0} LOG_READ_CLIENT_LOGIN=< LOGIN ******** LOG_READ_CLIENT_PASS=< PASS ******** LOG_READ_CLIENT_PASSWORD=< ******** LOG_REPORT_ITEM=Report item {0}/{1} LOG_GATEWAY_INTERRUPTED=Stopping DavMail gateway LOG_GATEWAY_STOP=DavMail gateway stopped LOG_SEARCHING_CALENDAR_MESSAGES=Searching calendar messages... LOG_SEARCH_QUERY=Search: {0} LOG_SEND_CLIENT_MESSAGE=> {0} LOG_SEND_CLIENT_PREFIX_MESSAGE=> {0}{1} LOG_SET_SOCKET_TIMEOUT=Set socket timeout to {0} seconds LOG_SOCKET_BIND_FAILED=Unable to bind server socket for {0} on port {1,number,#}: port not allowed or in use by another process\n LOG_STARTING_DAVMAIL=Starting DavMail Gateway... LOG_STOPPING_DAVMAIL=Stopping DavMail Gateway... LOG_SWT_NOT_AVAILABLE=SWT not available, using native system tray support LOG_SYSTEM_TRAY_NOT_AVAILABLE=JDK 1.6 needed for system tray support LOG_UNABLE_TO_CREATE_ICON=Unable to create icon LOG_UNABLE_TO_CREATE_LOG_FILE_DIR=Unable to create log file directory LOG_UNABLE_TO_CREATE_TRAY=Unable to create tray LOG_UNABLE_TO_GET_PARSEINTWITHTAG=Unable to get BerDecoder.parseIntWithTag method LOG_UNABLE_TO_GET_RELEASED_VERSION=Unable to get released version LOG_UNABLE_TO_LOAD_IMAGE=Unable to load image LOG_UNABLE_TO_LOAD_SETTINGS=Unable to load settings: LOG_UNABLE_TO_OPEN_LINK=Unable to open link LOG_UNABLE_TO_SET_ICON_IMAGE=Unable to set JDialog icon image (not available under Java 1.5) LOG_UNABLE_TO_SET_LOG_FILE_PATH=Unable to set log file path LOG_UNABLE_TO_SET_LOOK_AND_FEEL=Unable to set look and feel LOG_UNABLE_TO_SET_SYSTEM_LOOK_AND_FEEL=Unable to set system look and feel LOG_UNABLE_TO_STORE_SETTINGS=Unable to store settings: LOG_UNSUPPORTED_REQUEST=Unsupported request: {0} LOG_INVALID_TIMEZONE=Invalid timezone: {0} LOG_ACCESS_FORBIDDEN=Access to {0} forbidden: {1} LOG_DOWNLOAD_PROGRESS=Downloaded {0} KBytes from {1} LOG_UPLOAD_PROGRESS=Uploaded {0} KBytes ({1}%) LOG_WEBDAV_NOT_AVAILABLE=WebDav not available, retry with EWS mode UI_ABOUT=About... UI_ABOUT_DAVMAIL=About DavMail Gateway UI_ABOUT_DAVMAIL_AUTHOR=DavMail Gateway
By Mickal Guessant

UI_ACCEPT_CERTIFICATE=DavMail: Accept certificate ? UI_ALLOW_REMOTE_CONNECTION=Allow Remote Connections: UI_ALLOW_REMOTE_CONNECTION_HELP=Allow remote connections to the gateway (server mode) UI_PASSWORD_PROMPT=DavMail: Enter password UI_KERBEROS_CREDENTIAL_PROMPT=DavMail: Kerberos credentials UI_KERBEROS_PASSWORD_PROMPT=Kerberos password: UI_O365_MFA_NUMBER_MATCHING=DavMail: Number matching value UI_O365_MFA_NUMBER_MATCHING_PROMPT=Enter value {0} in Microsoft Authenticator application UI_ANSWER_NO=n UI_ANSWER_YES=y UI_BIND_ADDRESS=Bind address: UI_BIND_ADDRESS_HELP=Bind only to the specified network address UI_BUTTON_ACCEPT=Accept UI_BUTTON_CANCEL=Cancel UI_BUTTON_DENY=Deny UI_BUTTON_HELP=Help UI_BUTTON_OK=OK UI_BUTTON_SAVE=Save UI_BUTTON_COPY=Copy to clipboard UI_BUTTON_OPEN=Open UI_BUTTON_DEFAULT=Default UI_BUTTON_DEFAULT_HELP=Reset default logging levels UI_CALDAV_PORT=Caldav HTTP port: UI_CALDAV_PORT_HELP=Local Caldav server port to configure in Caldav (calendar) client UI_CALENDAR_PAST_EVENTS=Calendar past events (Caldav): UI_CALENDAR_PAST_EVENTS_HELP=Get events in the past not older than specified days count, leave empty for no limits UI_CURRENT_VERSION=Current version: {0}
UI_DAVMAIL_GATEWAY=DavMail Gateway UI_DAVMAIL_SETTINGS=DavMail Gateway Settings UI_DELAYS=Delays UI_DISABLE_UPDATE_CHECK=Disable update check: UI_DISABLE_UPDATE_CHECK_HELP=Disable DavMail check for new version UI_ENABLE_PROXY=Enable proxy: UI_ERROR_WAITING_FOR_CERTIFICATE_CHECK=Error waiting for certificate check UI_EXIT=Exit UI_FINGERPRINT=FingerPrint UI_GATEWAY=Gateway UI_HELP_INSTRUCTIONS=
Help and setup instructions available at:
http://davmail.sourceforge.net

To send comments or report bugs,
use DavMail Sourceforge trackers
or contact me at mguessan@free.fr UI_IMAP_PORT=Local IMAP port: UI_IMAP_PORT_HELP=Local IMAP server port to configure in mail client UI_ISSUED_BY=Issued by UI_ISSUED_TO=Issued to UI_KEEP_DELAY=Trash keep delay (POP): UI_KEEP_DELAY_HELP=Number of days to keep messages in trash UI_KEY_PASSWORD=Key password: UI_KEY_PASSWORD_HELP=SSL key password inside key store UI_KEY_STORE=Key store: UI_KEY_STORE_HELP=SSL certificate key store file path UI_KEY_STORE_PASSWORD=Key store password: UI_KEY_STORE_PASSWORD_HELP=Key store password UI_KEY_STORE_TYPE=Key store type: UI_KEY_STORE_TYPE_HELP=Choose key store type UI_CLIENT_SO_TIMEOUT=Client connection timeout: UI_CLIENT_SO_TIMEOUT_HELP=Client connection timeout in seconds, 0 to disable timeout, empty for 5 minutes UI_CLIENT_KEY_STORE=Client key store: UI_CLIENT_KEY_STORE_HELP=SSL client certificate key store file path UI_CLIENT_KEY_STORE_PASSWORD=Client key store password: UI_CLIENT_KEY_STORE_PASSWORD_HELP=Client key store password, leave empty for runtime prompt UI_CLIENT_KEY_STORE_TYPE=Client key store type: UI_CLIENT_KEY_STORE_TYPE_HELP=Choose client certificate key store type, choose PKCS11 for smartcard UI_CLIENT_CERTIFICATE=Client Certificate (DavMail to Exchange) UI_PKCS11_LIBRARY=PKCS11 library: UI_PKCS11_LIBRARY_HELP=PKCS11 (smartcard) library path (.so or .dll) UI_PKCS11_CONFIG=PKCS11 config: UI_PKCS11_CONFIG_HELP=Optional additional PKCS11 settings (slot, nssArgs, ...) UI_LAST_LOG=Last log UI_LAST_MESSAGE=Last message UI_LATEST_VERSION=Latest version available: {0}
A new version of DavMail Gateway is available.
Download latest version
UI_LDAP_PORT=Local LDAP port: UI_LDAP_PORT_HELP=Local LDAP server port to configure in directory (addresse book) client UI_LOGGING_LEVELS=Logging levels UI_LOGS=Logs UI_LOG_DAVMAIL=DavMail: UI_LOG_DEFAULT=Default: UI_LOG_HTTPCLIENT=HttpClient: UI_LOG_WIRE=Wire: UI_LOG_FILE_PATH=Log file path: UI_OAUTH=Oauth authentication UI_OAUTH_TENANTID=TenantId: UI_OAUTH_TENANTID_HELP=O365 tenant id, leave empty to use common UI_OAUTH_CLIENTID=ClientId: UI_OAUTH_CLIENTID_HELP=Application client_id, leave empty to use default value UI_OAUTH_REDIRECTURI=RedirectUri: UI_OAUTH_REDIRECTURI_HELP=Application redirect_uri, leave empty to use default value UI_NETWORK=Network UI_NO_SSL=No SSL UI_OWA_URL=OWA or EWS (Exchange) URL: UI_OWA_URL_HELP=Base Outlook Web Access or EWS URL UI_EWS_HELP=Exchange Web Service URL, ends with /EWS/Exchange.asmx UI_O365_HELP=Office 365 with classic username/password authentication or application password UI_O365Modern_HELP=Office 365 modern authentication (Oauth2) UI_O365Interactive_HELP=Office 365 interactive authentication UI_O365Manual_HELP=Office 365 manual authentication UI_O365_MANUAL_PROMPT=Office 365 - Manual authentication UI_0365_AUTHENTICATION_CODE=Authentication code: UI_0365_AUTHENTICATION_PROMPT=Please open the following link: Office 365 login, and proceed through Office 365 authentication steps. UI_0365_AUTHENTICATION_CODE_PROMPT=After successful authentication with default clientId you will get a blank page.
\ The url of this blank page contains the authentication code, paste it below and click send.

\ With Office clientId you may get a "Are you trying to sign in to Microsoft Office?" prompt.
\ Use F12 key to open dev tools, confirm prompt and check console for a urn: url,
\ \ if not available switch to network and check Location header on last redirect request,
\ \ then paste urn: url below. UI_0365_AUTHENTICATION_PROMPT_CONSOLE=Please open the following link: \n{0}\n proceed through authentication steps and paste back the final url that contains authentication code (blank page) UI_WebDav_HELP=Exchange 2007 or earlier endpoint UI_Auto_HELP=Automatic mode UI_POP_PORT=Local POP port: UI_POP_PORT_HELP=Local POP server port to configure in mail client UI_PROXY=Proxy UI_PROXY_PASSWORD=Proxy password: UI_PROXY_PORT=Proxy port: UI_PROXY_SERVER=Proxy server: UI_PROXY_USER=Proxy user: UI_NO_PROXY=No proxy for: UI_SENT_KEEP_DELAY=Sent keep delay (POP): UI_SENT_KEEP_DELAY_HELP=Number of days to keep messages in sent folder UI_SERIAL=Serial UI_DAVMAIL_SERVER_CERTIFICATE=Server Certificate (Client to DavMail) UI_SERVER_CERTIFICATE=Exchange Server Certificate UI_SERVER_CERTIFICATE_HASH=Server certificate hash: UI_SERVER_CERTIFICATE_HASH_HELP=Manually accepted server certificate hash UI_SETTINGS=Settings... UI_SHOW_LOGS=Show logs... UI_SMTP_PORT=Local SMTP port: UI_SMTP_PORT_HELP=Local SMTP server port to configure in mail client UI_TAB_ADVANCED=Advanced UI_TAB_OSX=OSX UI_OSX=OSX UI_OSX_HIDE_FROM_DOCK=Hide from Dock UI_OSX_HIDE_FROM_DOCK_HELP=Hide application from Dock (restart needed) UI_TAB_ENCRYPTION=Encryption UI_TAB_MAIN=Main UI_TAB_NETWORK=Network UI_UNTRUSTED_CERTIFICATE=Server provided an untrusted certificate,\n you can choose to accept or deny access.\n Accept certificate (y/n)? UI_UNTRUSTED_CERTIFICATE_HTML=Server provided an untrusted certificate,
you can choose to accept or deny access
UI_VALID_FROM=Valid from UI_VALID_UNTIL=Valid until MEETING_REQUEST=Meeting request LOG_SUBFOLDER_ACCESS_FORBIDDEN=Subfolder access forbidden to {0} LOG_FOLDER_NOT_FOUND=Folder {0} not found LOG_FOLDER_ACCESS_FORBIDDEN=Folder access to {0} forbidden LOG_FOLDER_ACCESS_ERROR=Folder access to {0} error: {1} UI_OTP_PASSWORD_PROMPT=One Time (token) Password: UI_SMS_PHONE_CODE=Verification code sent to {0}: UI_CAPTCHA_PROMPT=Enter pin value: UI_TAB_LOGGING=Logging UI_OTHER=Other UI_CALDAV_ALARM_SOUND=Caldav alarm sound: UI_CALDAV_ALARM_SOUND_HELP=Convert Caldav alarm to sound alarm supported by iCal, e.g. Basso UI_FORCE_ACTIVESYNC_UPDATE=Force ActiveSync update: UI_FORCE_ACTIVESYNC_UPDATE_HELP=Force update of Caldav events for ActiveSync connected devices UI_DEFAULT_DOMAIN=Default windows domain: UI_DEFAULT_DOMAIN_HELP=Default windows domain name UI_USE_SYSTEM_PROXIES=Use system proxy settings: UI_SHOW_STARTUP_BANNER=Display startup banner UI_SHOW_STARTUP_BANNER_HELP=Whether to show the initial startup notification window or not UI_DISABLE_GUI_NOTIFICATIONS=Disable balloon notifications UI_DISABLE_GUI_NOTIFICATIONS_HELP=Disable all graphical notifications UI_DISABLE_TRAY_ACTIVITY_SWITCH=Disable tray icon activity UI_DISABLE_TRAY_ACTIVITY_SWITCH_HELP=Do not switch icons when davmail is being used UI_IMAP_AUTO_EXPUNGE=IMAP auto expunge: UI_IMAP_AUTO_EXPUNGE_HELP=Delete messages immediately on the server over IMAP UI_ENABLE_KEEPALIVE=Enable KeepAlive: UI_ENABLE_KEEPALIVE_HELP=Send KeepAlive character during large folder and messages download UI_POP_MARK_READ=POP mark read: UI_POP_MARK_READ_HELP=Mark messages read on server immediately after retrieval UI_IMAP_IDLE_DELAY=IDLE folder monitor delay (IMAP): UI_IMAP_IDLE_DELAY_HELP=IMAP folder idle monitor delay in minutes, leave empty to disable IDLE support EXCEPTION_EWS_NOT_AVAILABLE=EWS end point not available EXCEPTION_FOLDER_NOT_FOUND=Folder {0} not found UNKNOWN_ATTRIBUTE=Unknown attribute: {0} NEEDS-ACTION= ACCEPTED=Accepted: TENTATIVE=Tentative: DECLINED=Declined: CANCELLED=Canceled: UI_ENABLE_EWS=Exchange Protocol: UI_ENABLE_EWS_HELP=Choose EWS on Exchange 2010 or Exchange 2007 with Webdav disabled UI_ENABLE_KERBEROS=Enable Kerberos: UI_ENABLE_KERBEROS_HELP=Enable windows single sign on (Kerberos) UI_FOLDER_SIZE_LIMIT=Folder size limit: UI_FOLDER_SIZE_LIMIT_HELP=Message count limit on folder retrieval UI_CALDAV_NOTIFICATION=DavMail: Caldav scheduling notification UI_CALDAV_AUTO_SCHEDULE=Caldav automatic scheduling UI_CALDAV_AUTO_SCHEDULE_HELP=Enable server managed meeting notifications UI_BUTTON_SEND=Send UI_TO=To: UI_TO_HELP=Recipients UI_CC=Cc: UI_CC_HELP=Copy recipients UI_SUBJECT=Subject: UI_SUBJECT_HELP=Caldav notification subject UI_NOTIFICATION_BODY=Caldav notification comment UI_CALDAV_EDIT_NOTIFICATIONS=Edit Caldav notifications: UI_CALDAV_EDIT_NOTIFICATIONS_HELP=Enable interactive Caldav edit notification window LOG_SEARCH_RESULT=Found {0} item(s) UI_LOG_FILE_SIZE=Log file size: UI_LOG_FILE_SIZE_HELP=Use Log4J syntax or set to 0 to use an external rotation mechanism UI_SAVE_IN_SENT=SMTP save in sent: UI_SAVE_IN_SENT_HELP=Save messages sent over SMTP in server Sent folder UI_CERTIFICATE_ALIAS_PROMPT=Select a certificate UI_ALWAYS_APPROXIMATE_MSG_SIZE=Use Exchange message size in IMAP: UI_ALWAYS_APPROXIMATE_MSG_SIZE_HELP=Always reply to IMAP RFC822.SIZE requests with Exchange approximate message size for performance reasonsdavmail-6.3.0/src/java/davmailmessages_fr.properties0100644 0000000 0000000 00000050026 14754153477 021372 0ustar000000000 0000000 EXCEPTION_AUTHENTICATION_FAILED=Echec d''authentification : identifiant ou mot de passe invalide EXCEPTION_AUTHENTICATION_FAILED_PASSWORD_EXPIRED=Echec d''authentification : mot de passe expir ? EXCEPTION_AUTHENTICATION_FAILED_RETRY=Echec d''authentification : identifiant ou mot de passe invalide, ressayer avec domaine\\utilisateur ou utiliser le paramtre domaine par dfaut EXCEPTION_CONNECTION_FAILED=Connection OWA {0} impossible, code retour {1}, vrifier la configuration EXCEPTION_DAVMAIL_CONFIGURATION=Erreur de configuration DavMail :\n{0} EXCEPTION_END_OF_STREAM=Fin de flux atteint pendant la lecture du contenu EXCEPTION_ITEM_NOT_FOUND=Elment non trouv EXCEPTION_EXCHANGE_LOGIN_FAILED=Exception lors de la connexion Exchange : {0} EXCEPTION_INVALID_CALDAV_REQUEST=Reuqte Caldav invalide : {0} EXCEPTION_INVALID_CONTENT_LENGTH=Longueur du contenu invalide : {0} EXCEPTION_INVALID_CONTENT_TYPE=Type de contenu invalide : {0} EXCEPTION_INVALID_CREDENTIALS=Identifiant ou mot de passe invalide EXCEPTION_INVALID_DATE=Date invalide {0} EXCEPTION_INVALID_DATES=Dates invalides : {0} EXCEPTION_INVALID_FOLDER_URL=URL du dossier invalide : {0} EXCEPTION_INVALID_HEADER=Entte invalide, connexion HTTPS sur le service HTTP ? EXCEPTION_INVALID_KEEPALIVE=Keep-Alive invalide : {0} EXCEPTION_INVALID_MAIL_PATH=Chemin de messagerie invalide : {0} EXCEPTION_INVALID_MESSAGE_CONTENT=Contenu du message invalide : {0} EXCEPTION_INVALID_MESSAGE_URL=URL de message invalide : {0} EXCEPTION_INVALID_RECIPIENT=Destinataire invalide : {0} EXCEPTION_INVALID_REQUEST=Requte invalide {0} EXCEPTION_INVALID_SEARCH_PARAMETERS=Paramtres de recherche invalides : {0} EXCEPTION_NETWORK_DOWN=Toutes les interfaces rseaux sont indisponibles ou serveur non joignable ! EXCEPTION_UNABLE_TO_CREATE_MESSAGE=Impossible de crer le message {0} : {1}{2}{3} EXCEPTION_UNABLE_TO_GET_FOLDER=Impossible d''obtenir le dossier {0} EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER=Impossible d''obtenir le dossier de messagerie l''adresse {0}, Webdav non disponible sur le serveur Exchange EXCEPTION_UNABLE_TO_MOVE_FOLDER=Impossible de dplacer le dossier, la cible existe EXCEPTION_UNABLE_TO_MOVE_MESSAGE=Impossible de dplacer le message, la cible existe EXCEPTION_UNABLE_TO_COPY_MESSAGE=Impossible de copier le message, la cible existe EXCEPTION_UNABLE_TO_PATCH_MESSAGE=Impossible de mettre ) jour le message {0} : {1}{2}{3} EXCEPTION_UNABLE_TO_UPDATE_MESSAGE=Impossible de mettre jour les proprits du message EXCEPTION_CONNECT=Exception lors de la connexion : {0} {1} EXCEPTION_UNSUPPORTED_AUTHORIZATION_MODE=Mode d'authentification invalide : {0} EXCEPTION_UNSUPPORTED_VALUE=Valeur non supporte : {0} LOG_CLIENT_CLOSED_CONNECTION=Connection ferme par le client LOG_CLOSE_CONNECTION_ON_TIMEOUT=Connection ferme sur expiration LOG_CONNECTION_CLOSED=Connection ferme LOG_CONNECTION_FROM=Connection de {0} sur le port {1,number,#} LOG_DAVMAIL_GATEWAY_LISTENING=Passerelle DavMail {0} en coute sur {1} LOG_DAVMAIL_STARTED=Passerelle DavMail dmarre LOG_ERROR_CLOSING_CONFIG_FILE=Erreur la fermeture du fichier de configuration LOG_ERROR_LOADING_OSXADAPTER=Erreur au chargement de OSXAdapter LOG_ERROR_LOADING_SETTINGS=Erreur de chargement de la configuration LOG_ERROR_RETRIEVING_MESSAGE=Erreur lors la rcupration du message LOG_ERROR_WAITING_FOR_SWT_INIT=Erreur d''initialisation SWT LOG_ITEM_NOT_AVAILABLE=Evnement {0} non disponible : {1} LOG_EXCEPTION_CLOSING_CLIENT_SOCKET=Erreur la fermeture de la connection client LOG_EXCEPTION_CLOSING_CONNECTION_ON_TIMEOUT=Erreur la fermeture de la connexion sur expiration LOG_EXCEPTION_CLOSING_SERVER_SOCKET=Erreur la fermeture du port d''coute serveur LOG_EXCEPTION_CREATING_SERVER_SOCKET=Erreur lors de la cration du port d''coute serveur LOG_EXCEPTION_CREATING_SSL_SERVER_SOCKET=Impossible d''ouvrir le port d''coute {1,number,#} pour {0} : Erreur lors de la cration du port d''coute serveur scuris : {2} LOG_EXCEPTION_GETTING_SOCKET_STREAMS=Erreur lors de l''tablissement des flux de la connexion LOG_EXCEPTION_LISTENING_FOR_CONNECTIONS=Erreur pendant l''attente des connexion entrantes LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT=Erreur d''envoi du message d''erreur au client LOG_EXCEPTION_WAITING_SERVER_THREAD_DIE=Erreur pendant l''attente de fin du processus serveur LOG_EXECUTE_FOLLOW_REDIRECTS=executeFollowRedirects({0}) LOG_EXECUTE_FOLLOW_REDIRECTS_COUNT=executeFollowRedirects: {0} redirectCount: {1} LOG_EXTERNAL_CONNECTION_REFUSED=Connexion du client distant refuse LOG_FOUND_ACCEPTED_CERTIFICATE=Certificat dfinitivement accept trouv, hash {0} LOG_FOUND_CALENDAR_MESSAGES={0} messages trouvs dans le calendrier LOG_IMAP_COMMAND={0} sur {1} LOG_INVALID_DEPTH=Profondeur invalide : {0} LOG_INVALID_SETTING_VALUE=Paramtre de configuration {0} invalide LOG_INVALID_URL=URL invalide : {0} LOG_JAVA6_DESKTOP_UNAVAILABLE=Classe Java 6 Desktop non disponible LOG_LDAP_IGNORE_FILTER_ATTRIBUTE=Filtre d''attribut ignor : {0}= {1} LOG_LDAP_REPLACED_UID_FILTER=Remplac {0} par {1} dans le filtre uid LOG_LDAP_REQ_ABANDON_SEARCH=LDAP_REQ_ABANDON {0} pour la recherche {1} LOG_LDAP_REQ_UNBIND=LDAP_REQ_UNBIND {0} LOG_LDAP_REQ_BIND_ANONYMOUS=LDAP_REQ_BIND {0} anonyme LOG_LDAP_REQ_BIND_USER=LOG_LDAP_REQ_BIND_USER LOG_LDAP_REQ_SEARCH=LDAP_REQ_SEARCH {0} base={1} scope: {2} sizelimit: {3} timelimit: {4} filter: {5} returning attributes: {6} LOG_LDAP_REQ_SEARCH_ANONYMOUS_ACCESS_FORBIDDEN=LDAP_REQ_SEARCH {0} Accs anonyme {1} interdit LOG_LDAP_REQ_SEARCH_END=LDAP_REQ_SEARCH {0} fin LOG_LDAP_REQ_SEARCH_FOUND_RESULTS=LDAP_REQ_SEARCH {0} retourne {1} rsultats LOG_LDAP_REQ_SEARCH_INVALID_DN=LDAP_REQ_SEARCH {0} dn non reconnu {1}, utiliser le contexte ou=people ou o=od LOG_LDAP_REQ_SEARCH_SEND_PERSON=LDAP_REQ_SEARCH {0} envoi uid={1}{2} {3} LOG_LDAP_REQ_SEARCH_SIZE_LIMIT_EXCEEDED=LDAP_REQ_SEARCH {0} limite de taille dpasse LOG_LDAP_REQ_SEARCH_SUCCESS=LDAP_REQ_SEARCH {0} succs LOG_LDAP_SEND_COMPUTER_CONTEXT=Envoi contexte computer {0} {1} LOG_LDAP_SEND_ROOT_DSE=Envoi racine DSE LOG_LDAP_UNSUPPORTED_FILTER=Filtre non support : {0} LOG_LDAP_UNSUPPORTED_FILTER_ATTRIBUTE=Attribut de filtre non support : {0}= {1} LOG_LDAP_UNSUPPORTED_FILTER_VALUE=Valeur de filtre non supporte LOG_LDAP_UNSUPPORTED_OPERATION=Opration non supporte : {0} LOG_LISTING_ITEM=Liste lment {0}/{1} LOG_MESSAGE={0} LOG_NEW_VERSION_AVAILABLE=Une nouvelle version ({0}) de la Passerelle DavMail est disponible ! LOG_OPEN_LINK_NOT_SUPPORTED=Ouverture de lien impossible (avec AWT Desktop et SWT Program) LOG_PROTOCOL_PORT=port {0} : {1,number,# } LOG_READ_CLIENT_AUTHORIZATION=< Authorization: ******** LOG_READ_CLIENT_AUTH_PLAIN=< AUTH PLAIN ******** LOG_READ_CLIENT_LINE=< {0} LOG_READ_CLIENT_LOGIN=< LOGIN ******** LOG_READ_CLIENT_PASS=< PASS ******** LOG_READ_CLIENT_PASSWORD=< ******** LOG_REPORT_ITEM=Envoi lment {0}/{1} LOG_SEARCHING_CALENDAR_MESSAGES=Recherche des messages de calendrier... LOG_SEARCH_QUERY=Recherche : {0} LOG_SEND_CLIENT_MESSAGE=> {0} LOG_SEND_CLIENT_PREFIX_MESSAGE=> {0}{1} LOG_SET_SOCKET_TIMEOUT=Expiration de lecture de la connection positionne {0} secondes LOG_SOCKET_BIND_FAILED=Impossible d''ouvrir le port d''coute {1,number,#} pour {0} : port non autoris ou utilis par un autre processus\n LOG_STARTING_DAVMAIL=Dmarrage de la passerelle DavMail... LOG_STOPPING_DAVMAIL=Arrt de la passerelle DavMail... LOG_SWT_NOT_AVAILABLE=SWT non disponible, bascule vers le support icne de notification natif LOG_SYSTEM_TRAY_NOT_AVAILABLE=JDK 1.6 ncessaire pour le support de l''icne de notification LOG_UNABLE_TO_CREATE_ICON=Impossible de crer l''icne LOG_UNABLE_TO_CREATE_LOG_FILE_DIR=Impossible de crer le rpertoire de traces LOG_UNABLE_TO_CREATE_TRAY=Impossible de crer l''icne de notification LOG_UNABLE_TO_GET_PARSEINTWITHTAG=Erreur d''accs la mthode BerDecoder.parseIntWithTag LOG_UNABLE_TO_GET_RELEASED_VERSION=Impossible de rcuprer le numro de dernire version LOG_UNABLE_TO_LOAD_IMAGE=Impossible de charger l''image LOG_UNABLE_TO_LOAD_SETTINGS=Impossible de charger la configuration : LOG_UNABLE_TO_OPEN_LINK=Impossible d''ouvrir le lien LOG_UNABLE_TO_SET_ICON_IMAGE=Impossible de positionner l''icne de JDialog (non disponible en Java 1.5) LOG_UNABLE_TO_SET_LOG_FILE_PATH=Echec la mise jour du chemin du fichier de traces LOG_UNABLE_TO_SET_LOOK_AND_FEEL=Impossible de dfinir le style de l''interface LOG_UNABLE_TO_SET_SYSTEM_LOOK_AND_FEEL=Impossible de dfinir le style natif sur l''interface LOG_UNABLE_TO_STORE_SETTINGS=Impossible d''enregistrer la configuration LOG_UNSUPPORTED_REQUEST=Requte non supporte : {0} LOG_DOWNLOAD_PROGRESS={0} KOctets tlchargs de {1} LOG_WEBDAV_NOT_AVAILABLE=WebDav non disponible, ressayer en activant EWS UI_ABOUT=A propos... UI_ABOUT_DAVMAIL=A propos de la Passerelle DavMail UI_ABOUT_DAVMAIL_AUTHOR=Passerelle DavMail
Par Mickal Guessant

UI_ACCEPT_CERTIFICATE=DavMail : Accepter le certificat ? UI_ALLOW_REMOTE_CONNECTION=Autoriser connexions distantes : UI_ALLOW_REMOTE_CONNECTION_HELP=Autoriser les connexions distantes la passerelle (mode serveur) UI_ANSWER_NO=n UI_ANSWER_YES=o UI_BIND_ADDRESS=Adresse d''coute : UI_BIND_ADDRESS_HELP=Ecouter seulement sur l''adresse dfinie UI_BUTTON_ACCEPT=Accepter UI_BUTTON_CANCEL=Annuler UI_BUTTON_DENY=Refuser UI_BUTTON_HELP=Aide UI_BUTTON_OK=OK UI_BUTTON_OPEN=Ouvrir UI_BUTTON_SAVE=Enregistrer UI_BUTTON_COPY=Copier dans le presse-papier UI_BUTTON_DEFAULT=Dfaut UI_BUTTON_DEFAULT_HELP=Rinitialiser les niveaux de trace par dfaut UI_CALDAV_PORT=Port HTTP Caldav : UI_CALDAV_PORT_HELP=Port local Caldav configurer dans le client Caldav (agenda) UI_CALENDAR_PAST_EVENTS=Jours passs du calendrier (Caldav) : UI_CALENDAR_PAST_EVENTS_HELP=Limiter les vnements remonts UI_CURRENT_VERSION=Version actuelle : {0}
UI_DAVMAIL_GATEWAY=Passerelle DavMail UI_DAVMAIL_SETTINGS=Configuration Passerelle DavMail UI_DELAYS=Dlais UI_DISABLE_UPDATE_CHECK=Dsactivation contrle version : UI_DISABLE_UPDATE_CHECK_HELP=Dsactiver le contrle de nouvelle version disponible UI_ENABLE_PROXY=Activer proxy : UI_ERROR_WAITING_FOR_CERTIFICATE_CHECK=Erreur lors de l''attente de validation du certificat UI_EXIT=Quitter UI_FINGERPRINT=Empreinte UI_GATEWAY=Passerelle UI_HELP_INSTRUCTIONS=
Aide et instructions disponibles sur :
http://davmail.sourceforge.net

Pour envoyer des commentaires ou signaler des anomalies,
utiliser DavMail Sourceforge trackers
ou me contacter l''adresse mguessan@free.fr UI_IMAP_PORT=Port IMAP local : UI_IMAP_PORT_HELP=Port IMAP local configurer dans le client de messagerie UI_ISSUED_BY=Emis par UI_ISSUED_TO=Emis pour UI_KEEP_DELAY=Dlai de rtention corbeille (POP) : UI_KEEP_DELAY_HELP=Nombre de jours de conservation des messages dans la corbeille UI_KEY_PASSWORD=Mot de passe cl : UI_KEY_PASSWORD_HELP=Mot de passe cl SSL contenue dans le fichier des cls UI_KEY_STORE=Fichier cls : UI_KEY_STORE_HELP=Chemin du fichier contenant les cls et certificats SSL UI_KEY_STORE_PASSWORD=Mot de passe fichier cls : UI_KEY_STORE_PASSWORD_HELP=Mot de passe du fichier des cls UI_KEY_STORE_TYPE=Type de fichier cls : UI_KEY_STORE_TYPE_HELP=Choix du type de fichier de cls UI_LAST_LOG=Dernire trace UI_LAST_MESSAGE=Dernier message UI_LATEST_VERSION=Dernire version disponible : {0}
Une nouvelle version de la Passerelle DavMail est disponible.
Tlcharcher la dernire version
UI_LDAP_PORT=Port LDAP local : UI_LDAP_PORT_HELP=Port LDAP local configurer dans le client annuaire (carnet d''adresse) UI_LOGGING_LEVELS=Niveaux de traces UI_LOGS=Traces UI_LOG_DAVMAIL=DavMail : UI_LOG_DEFAULT=Dfaut : UI_LOG_HTTPCLIENT=HttpClient : UI_LOG_WIRE=Rseau : UI_OAUTH=Authentification Oauth UI_OAUTH_TENANTID=TenantId : UI_OAUTH_TENANTID_HELP=O365 tenant id, laisser vide pour utiliser common UI_OAUTH_CLIENTID=ClientId : UI_OAUTH_CLIENTID_HELP=client_id de l'application, laisser vide pour utiliser la valeur par dfaut UI_OAUTH_REDIRECTURI=RedirectUri : UI_OAUTH_REDIRECTURI_HELP=redirect_uri de l'application, laisser vide pour utiliser la valeur par dfaut UI_NETWORK=Rseau UI_NO_SSL=Pas de SSL UI_OWA_URL=URL OWA (Exchange) : UI_OWA_URL_HELP=URL de connexion Outlook Web Access UI_EWS_HELP=URL Exchange Web Service, termine par /EWS/Exchange.asmx UI_O365_HELP=Office 365 avec authentification classique utilisateur/mot de passe ou mot de passe applicatif UI_O365Modern_HELP=Office 365 authentification moderne (Oauth2) UI_O365Interactive_HELP=Office 365 authentification interactive UI_O365Manual_HELP=Office 365 authentification manuelle UI_O365_MANUAL_PROMPT=Office 365 - Authentification manuelle UI_0365_AUTHENTICATION_CODE=Code d''authentification : UI_0365_AUTHENTICATION_PROMPT=Veuillez ouvrir le lien suivant : Connexion Office 365,
suivre les tapes d''authentification et
coller l''url finale qui contient le code d''autorisation (page blanche) UI_0365_AUTHENTICATION_PROMPT_CONSOLE=Veuillez ouvrir le lien suivant :\n{0}\nsuivre les tapes d''authentification et coller l''url finale qui contient le code d''autorisation (page blanche) UI_WebDav_HELP=Exchange 2007 ou moins UI_Auto_HELP=Automatique UI_POP_PORT=Port POP local : UI_POP_PORT_HELP=Port POP local configurer dans le client de messagerie UI_PROXY=Proxy UI_PROXY_PASSWORD=Mot de passe proxy : UI_PROXY_PORT=Port du serveur proxy : UI_PROXY_SERVER=Serveur proxy : UI_PROXY_USER=Identifiant proxy : UI_NO_PROXY=Pas de proxy pour : UI_SENT_KEEP_DELAY=Dlai de rtention envoys (POP) : UI_SENT_KEEP_DELAY_HELP=Nombre de jours de conservation des messages dans le dossier des messages envoys UI_SERIAL=Numro de srie UI_DAVMAIL_SERVER_CERTIFICATE=Certificat Serveur (Client vers DavMail) UI_SERVER_CERTIFICATE=Certificat Serveur Exchange UI_SERVER_CERTIFICATE_HASH=Hash du certificat serveur : UI_SERVER_CERTIFICATE_HASH_HELP=Hash du certificat accept manuellement UI_SETTINGS=Configuration... UI_SHOW_LOGS=Afficher les traces... UI_SMTP_PORT=Port SMTP local : UI_SMTP_PORT_HELP=Port SMTP local configurer dans le client de messagerie UI_TAB_ADVANCED=Avanc UI_TAB_ENCRYPTION=Chiffrement UI_TAB_MAIN=Gnral UI_TAB_NETWORK=Rseau UI_UNTRUSTED_CERTIFICATE=Le certificat fourni par le serveur n''est certifi par aucune autorit de confiance,\n vous pouvez choisir d''accepter ou de rejeter l''accs\n Accepter le certificat (o/n) ? UI_UNTRUSTED_CERTIFICATE_HTML=Le certificat fourni par le serveur n''est certifi par aucune autorit de confiance,
vous pouvez choisir d''accepter ou de rejeter l''accs
UI_VALID_FROM=Emis le UI_VALID_UNTIL=Expire le UI_PASSWORD_PROMPT=DavMail : Entrer le mot de passe UI_KERBEROS_CREDENTIAL_PROMPT=DavMail : Identifiants Kerberos UI_KERBEROS_PASSWORD_PROMPT=Mot de passe Kerberos : UI_PKCS11_LIBRARY_HELP=Chemin de la librarie PKCS11 (carte puce) (.so or .dll) UI_PKCS11_LIBRARY=Librairie PKCS11 : UI_PKCS11_CONFIG_HELP=Configuration PKCS11 complmentaire optionnelle (slot, nssArgs, ...) UI_PKCS11_CONFIG=Configuration PKCS11 : UI_CLIENT_SO_TIMEOUT=Dlai d'attente client: UI_CLIENT_SO_TIMEOUT_HELP=Dlai d'attente client en secondes, 0 pour dsactiver, vide pour 5 minutes UI_CLIENT_CERTIFICATE=Certificat client (DavMail vers Exchange) UI_LOG_FILE_PATH=Chemin du fichier de traces : UI_LOG_FILE_SIZE=Taille du fichier de traces : UI_LOG_FILE_SIZE_HELP=Syntaxe Log4J ou 0 pour utiliser un mcanisme externe de rotation LOG_GATEWAY_INTERRUPTED=Arrt de la passerelle DavMail en cours LOG_GATEWAY_STOP=Passerelle DavMail arrte LOG_INVALID_TIMEZONE=Fuseau horaire invalide : {0} MEETING_REQUEST=Invitation LOG_ACCESS_FORBIDDEN=Accs {0} non autoris: {1} LOG_LDAP_REQ_BIND_INVALID_CREDENTIALS=LDAP_REQ_BIND Utilisateur ou mot de passe invalide LOG_LDAP_REQ_BIND_SUCCESS=LOG_LDAP_REQ_BIND Authentification russie LOG_SUBFOLDER_ACCESS_FORBIDDEN=Accs interdit au sous dossiers de {0} LOG_FOLDER_ACCESS_FORBIDDEN=Accs interdit au dossier {0} LOG_FOLDER_NOT_FOUND=Dossier {0} introuvable LOG_FOLDER_ACCESS_ERROR=Erreur lors de l''accs au dossier {0} : {1} UI_OTP_PASSWORD_PROMPT=Mot de passe du jeton : UI_CAPTCHA_PROMPT=Code PIN : EXCEPTION_SESSION_EXPIRED=Session Exchange expire UI_CLIENT_KEY_STORE_TYPE=Type de stockage : UI_CLIENT_KEY_STORE_TYPE_HELP=Choisir le type de stockage du certificat client, PKCS11 pour une carte puce UI_CLIENT_KEY_STORE=Fichier certificat client : UI_CLIENT_KEY_STORE_HELP=Chemin du fichier contenant le certificat client SSL UI_CLIENT_KEY_STORE_PASSWORD=Mot de passe certificat client : UI_CLIENT_KEY_STORE_PASSWORD_HELP=Mot de passe du certificat client, laisser vide pour fournir le mot de passe mode interactif UI_TAB_LOGGING=Traces UI_TAB_OSX=OSX UI_OSX=OSX UI_OSX_HIDE_FROM_DOCK=Supprimer du Dock UI_OSX_HIDE_FROM_DOCK_HELP=Supprimer l''application du Dock (redmarrage ncessaire) UI_OTHER=Autres UI_CALDAV_ALARM_SOUND=Son des alarmes Caldav : UI_CALDAV_ALARM_SOUND_HELP=Convertir les alarmes Caldav en alarmes sonores supportes par iCal, par exemple Basso UI_FORCE_ACTIVESYNC_UPDATE=Forcer ActiveSync : UI_FORCE_ACTIVESYNC_UPDATE_HELP=Forcer la mise jour des vnements Caldav pour les appareils connects via ActiveSync UI_DEFAULT_DOMAIN=Domaine windows par dfaut : UI_DEFAULT_DOMAIN_HELP=Nom du domaine windows par dfaut EXCEPTION_UNSUPPORTED_PARAMETER=Paramtre non support : {0} EXCEPTION_INVALID_PARAMETER=Paramtre invalide : {0} UI_USE_SYSTEM_PROXIES=Utiliser la configuration systme : UI_SHOW_STARTUP_BANNER=Notification au lancement : UI_SHOW_STARTUP_BANNER_HELP=Afficher ou non la fentre de notification au dmarrage UI_DISABLE_GUI_NOTIFICATIONS=Dsactiver notifications graphiques : UI_DISABLE_GUI_NOTIFICATIONS_HELP=Supprimer toutes les notifications graphiques UI_DISABLE_TRAY_ACTIVITY_SWITCH=Dsactiver icne dynamique UI_DISABLE_TRAY_ACTIVITY_SWITCH_HELP=Ne pas modifier l'icne dans la barre des tches sur activit LOG_READ_CLIENT_AUTH_LOGIN=< AUTH LOGIN ******** UI_IMAP_IDLE_DELAY=Dlai de surveillance dossier (IMAP) : UI_IMAP_IDLE_DELAY_HELP=Dlai de surveillance du dossier IMAP en minutes, laisser vide pour dsactiver le support IDLE UI_IMAP_AUTO_EXPUNGE=IMAP suppression immdiate : UI_IMAP_AUTO_EXPUNGE_HELP=Supprimer immdiatement les messages du serveur via IMAP UI_ENABLE_KEEPALIVE=Activer KeepAlive : UI_ENABLE_KEEPALIVE_HELP=Envoyer caractre KeepAlive pendant le chargement des dossiers et messages de taille importante UI_POP_MARK_READ=POP marquer lu : UI_POP_MARK_READ_HELP=Marquer les messages lus sur le serveur immdiatement aprs chargement EXCEPTION_EWS_NOT_AVAILABLE=Point d''accs EWS non disponible EXCEPTION_FOLDER_NOT_FOUND=Dossier {0} non trouv UNKNOWN_ATTRIBUTE=Attribut inconnu: {0} ACCEPTED=Accept : TENTATIVE=Provisoire : DECLINED=Refus : CANCELLED=Annul : UI_ENABLE_EWS=Protocole Exchange : UI_ENABLE_EWS_HELP=Activer EWS sur Exchange 2010 ou Exchange 2007 sans support Webdav UI_ENABLE_KERBEROS=Activer Kerberos : UI_ENABLE_KERBEROS_HELP=Activer l''authentification Kerberos Windows UI_FOLDER_SIZE_LIMIT=Limite taille dossier : UI_FOLDER_SIZE_LIMIT_HELP=Nombre maximum de message charg par dossier UI_CALDAV_NOTIFICATION=DavMail : Notification Caldav UI_CALDAV_AUTO_SCHEDULE=Caldav notifications serveur UI_CALDAV_AUTO_SCHEDULE_HELP=Action la gestion des notifications de runion par le serveur UI_BUTTON_SEND=Envoyer UI_SUBJECT=Sujet : UI_SUBJECT_HELP=Sujet notification Caldav UI_TO=Pour : UI_TO_HELP=Destinataires UI_NOTIFICATION_BODY=Commentaire notification Caldav UI_CC=Copie : UI_CC_HELP=Destinataires en copie UI_CALDAV_EDIT_NOTIFICATIONS=Edition notifications Caldav : UI_CALDAV_EDIT_NOTIFICATIONS_HELP=Activer la fentre d'dition interactive des notifications LOG_SEARCH_RESULT={0} lment(s) trouv(s) UI_SAVE_IN_SENT=SMTP copie dans Envoys : UI_SAVE_IN_SENT_HELP=Crer une copie des messages envoys via SMTP dans le dossier serveur "Envoys" UI_CERTIFICATE_ALIAS_PROMPT=Choisir un certificat UI_ALWAYS_APPROXIMATE_MSG_SIZE=Taille Exchange des messages : UI_ALWAYS_APPROXIMATE_MSG_SIZE_HELP=Toujours utiliser la taille approche des messages IMAP comme valeur pour RFC822.SIZE pour amliorer les performances EXCEPTION_AUTHENTICATION_FAILED_REASON=Echec authentification {0} UI_SMS_PHONE_CODE=Code de vrification envoy {0} :davmail-6.3.0/src/java/davmailmessages_it.properties0100644 0000000 0000000 00000046421 14754153500 021366 0ustar000000000 0000000 # tradotto da gil EXCEPTION_AUTHENTICATION_FAILED=Autenticazione non riuscita: Utente o password errate EXCEPTION_AUTHENTICATION_FAILED_PASSWORD_EXPIRED=Autenticazione non riuscita: password scaduta ? EXCEPTION_AUTHENTICATION_FAILED_RETRY=Autenticazione non riuscita: utente o password errate, riprovare con dominio\\utente o l'utilizzo impostazione dominio predefinito EXCEPTION_CONNECTION_FAILED=Impossibile connettersi a OWA a {0}, codice di stato {1}, controllare la configurazione EXCEPTION_DAVMAIL_CONFIGURATION=DavMail errore di configurazione:\n{0} EXCEPTION_END_OF_STREAM=Fine del flusso raggiunta contenuti lettura EXCEPTION_ITEM_NOT_FOUND=Elemento non trovato EXCEPTION_EXCHANGE_LOGIN_FAILED=Exchange errore di accesso: {0} EXCEPTION_SESSION_EXPIRED=Exchange sessione scaduta EXCEPTION_INVALID_CALDAV_REQUEST=Richiesta Caldav non valida: {0} EXCEPTION_INVALID_CONTENT_LENGTH=Lunghezza del contenuto non valida: {0} EXCEPTION_INVALID_CONTENT_TYPE=Contenuto non valido: {0} EXCEPTION_INVALID_CREDENTIALS=Credenziali non valide EXCEPTION_INVALID_DATE=Data non valida: {0} EXCEPTION_INVALID_DATES=Date non valide: {0} EXCEPTION_INVALID_FOLDER_URL=Percorso cartella non valido: {0} EXCEPTION_INVALID_HEADER=Intestazione non valida, connessione HTTPS a un listener HTTP? EXCEPTION_INVALID_KEEPALIVE=Keep-Alive non valido: {0} EXCEPTION_INVALID_MAIL_PATH=Percorso mail non valido: {0} EXCEPTION_INVALID_MESSAGE_CONTENT=Contenuto messaggio non valido: {0} EXCEPTION_INVALID_MESSAGE_URL=URL messaggio non valido: {0} EXCEPTION_INVALID_RECIPIENT=Destinatario non valido: {0} EXCEPTION_INVALID_REQUEST=Richiesta non valida: {0} EXCEPTION_INVALID_SEARCH_PARAMETERS=Parametri di ricerca non validi: {0} EXCEPTION_UNSUPPORTED_PARAMETER=Parametro non supportato: {0} EXCEPTION_INVALID_PARAMETER=Parametro non valido: {0} EXCEPTION_NETWORK_DOWN=Tutte le interfacce di rete non sono disponibili o il server non raggiungibile! EXCEPTION_UNABLE_TO_CREATE_MESSAGE=Impossibile creare il messaggio {0}: {1}{2}{3} EXCEPTION_UNABLE_TO_GET_FOLDER=Impossibile ottenere il file {0} EXCEPTION_UNABLE_TO_GET_MAIL_FOLDER=Impossibile ottenere la cartella di posta {0}, WebDAV non disponibile sul server di Exchange EXCEPTION_UNABLE_TO_MOVE_FOLDER=Impossibile spostare la cartella, la cartella esiste gi EXCEPTION_UNABLE_TO_MOVE_MESSAGE=Impossibile spostare il messaggio, il messaggio esiste gi EXCEPTION_UNABLE_TO_COPY_MESSAGE=Impossibile copiare il messaggio, il messaggio esiste gi EXCEPTION_UNABLE_TO_PATCH_MESSAGE=Impossibile aggiornare il messaggio {0}: {1}{2}{3} EXCEPTION_UNABLE_TO_UPDATE_MESSAGE=Impossibile aggiornare le propriet dei messaggi EXCEPTION_CONNECT=Errore durante il collegamento: {0} {1} EXCEPTION_UNSUPPORTED_AUTHORIZATION_MODE=Autenticazione utente non valido: {0} EXCEPTION_UNSUPPORTED_VALUE=Valore non supportato: {0} LOG_CLIENT_CLOSED_CONNECTION=Connessione chiusa dal client LOG_CLOSE_CONNECTION_ON_TIMEOUT=Si verificato un timeout di connessione LOG_CONNECTION_CLOSED=Connessione chiusa LOG_CONNECTION_FROM=Collegamento {0} sulla porta {1,number,#} LOG_DAVMAIL_GATEWAY_LISTENING=Gateway DavMail {0} in ascolto su {1} LOG_DAVMAIL_STARTED=Gateway DavMail avviato LOG_ERROR_CLOSING_CONFIG_FILE=Errore durante la chiusura del file di configurazione LOG_ERROR_LOADING_OSXADAPTER=Errore durante il caricamento di OSXAdapter LOG_ERROR_LOADING_SETTINGS=Errore durante il caricamento della configurazione LOG_ERROR_RETRIEVING_MESSAGE=Errore durante il recupero dell messaggio LOG_ERROR_WAITING_FOR_SWT_INIT=Errore di inizializzazione SWT LOG_ITEM_NOT_AVAILABLE=Elemento {0} non disponibile: {1} LOG_EXCEPTION_CLOSING_CLIENT_SOCKET=Errore durante la connessione del client LOG_EXCEPTION_CLOSING_CONNECTION_ON_TIMEOUT=Errore Timeout durante la chiusura LOG_EXCEPTION_CLOSING_SERVER_SOCKET=Errore durante la chiusura della porta di ascolto del server LOG_EXCEPTION_CREATING_SERVER_SOCKET=Errore durante la creazione della porta di ascolto del server LOG_EXCEPTION_CREATING_SSL_SERVER_SOCKET=Non possibile aprire la porta di ascolto {0} di {1,number,#}: Errore durante la creazione del : {2} LOG_EXCEPTION_GETTING_SOCKET_STREAMS=Errore connessione persa, fine del flusso di dati LOG_EXCEPTION_LISTENING_FOR_CONNECTIONS=Errore durante l'attesa per le connessioni in entrata LOG_EXCEPTION_SENDING_ERROR_TO_CLIENT=Errore di trasmissione del messaggio, errore del client LOG_EXCEPTION_WAITING_SERVER_THREAD_DIE=Errore tempo esaurito per l'operazione in attesa di una risposta dal server LOG_EXECUTE_FOLLOW_REDIRECTS=executeFollowRedirects({0}) LOG_EXECUTE_FOLLOW_REDIRECTS_COUNT=executeFollowRedirects: {0} redirectCount:{1} LOG_EXTERNAL_CONNECTION_REFUSED=Connessione rifiutata dal client remoto LOG_FOUND_ACCEPTED_CERTIFICATE=Certificato trovato accettato definitivamente, hash {0} LOG_FOUND_CALENDAR_MESSAGES=Trovati {0} messaggi nel calendario LOG_IMAP_COMMAND={0} circa {1} LOG_INVALID_DEPTH=Valore profondit non valido: {0} LOG_INVALID_SETTING_VALUE=Parametro di configurazione {0} non valido LOG_INVALID_URL=URL non valida: {0} LOG_JAVA6_DESKTOP_UNAVAILABLE=Java 6 Desktop class non disponibile LOG_LDAP_IGNORE_FILTER_ATTRIBUTE=Attributo del filtro ignorato: {0}= {1} LOG_LDAP_REPLACED_UID_FILTER=Sostituito {0} con {1} nel filtro del uid LOG_LDAP_REQ_ABANDON_SEARCH=LDAP_REQ_ABANDON {0} per la ricerca {1} LOG_LDAP_REQ_UNBIND=LDAP_REQ_UNBIND {0} LOG_LDAP_REQ_BIND_ANONYMOUS=LDAP_REQ_BIND {0} anonimo LOG_LDAP_REQ_BIND_USER=LDAP_REQ_BIND {0} {1} LOG_LDAP_REQ_BIND_SUCCESS=LOG_LDAP_REQ_BIND Autenticazione effettuata con successo LOG_LDAP_REQ_BIND_INVALID_CREDENTIALS=LDAP_REQ_BIND Utente o password non validi LOG_LDAP_REQ_SEARCH=LDAP_REQ_SEARCH {0} base={1} scope: {2} sizelimit: {3} timelimit: {4} filter: {5} returning attributes: {6} LOG_LDAP_REQ_SEARCH_ANONYMOUS_ACCESS_FORBIDDEN=LDAP_REQ_SEARCH {0} Accesso anonimo a {1} proibito LOG_LDAP_REQ_SEARCH_END=LDAP_REQ_SEARCH {0} fine LOG_LDAP_REQ_SEARCH_FOUND_RESULTS=LDAP_REQ_SEARCH {0} trovata/e {1} occorrenza/e LOG_LDAP_REQ_SEARCH_INVALID_DN=LDAP_REQ_SEARCH {0} dn non riconosciuto {1}, utilizzare il contesto ou=people o o=od LOG_LDAP_REQ_SEARCH_SEND_PERSON=LDAP_REQ_SEARCH {0} invio uid={1}{2} {3} LOG_LDAP_REQ_SEARCH_SIZE_LIMIT_EXCEEDED=LDAP_REQ_SEARCH {0} la dimensione ha superato il limite LOG_LDAP_REQ_SEARCH_SUCCESS=LDAP_REQ_SEARCH {0} successo LOG_LDAP_SEND_COMPUTER_CONTEXT=Invio contesto informatico {0} {1} LOG_LDAP_SEND_ROOT_DSE=Invio root DSE LOG_LDAP_UNSUPPORTED_FILTER=Filtro non supportato: {0} LOG_LDAP_UNSUPPORTED_FILTER_ATTRIBUTE=Attributo di filtro non supportato: {0}= {1} LOG_LDAP_UNSUPPORTED_FILTER_VALUE=Valore del filtro non supportato LOG_LDAP_UNSUPPORTED_OPERATION=Operazione non supportata: {0} LOG_LISTING_ITEM=Elemento della lista {0}/{1} LOG_MESSAGE={0} LOG_NEW_VERSION_AVAILABLE=Una nuova versione ({0}) di DavMail Gateway disponibile ! LOG_OPEN_LINK_NOT_SUPPORTED=Apertura collegamento impedito (con AWT e SWT Desktop Program) LOG_PROTOCOL_PORT={0} port {1,number,# } LOG_READ_CLIENT_AUTHORIZATION=< Autorizzazione: ******** LOG_READ_CLIENT_AUTH_PLAIN=< AUTH PLAIN ******** LOG_READ_CLIENT_AUTH_LOGIN=< AUTH LOGIN ******** LOG_READ_CLIENT_LINE=< {0} LOG_READ_CLIENT_LOGIN=< LOGIN ******** LOG_READ_CLIENT_PASS=< PASS ******** LOG_READ_CLIENT_PASSWORD=< ******** LOG_REPORT_ITEM=Elementi Inviati {0}/{1} LOG_GATEWAY_INTERRUPTED=Arresto DavMail gateway LOG_GATEWAY_STOP=DavMail gateway fermato LOG_SEARCHING_CALENDAR_MESSAGES=Cerca messaggi del calendario... LOG_SEARCH_QUERY=Cerca: {0} LOG_SEND_CLIENT_MESSAGE=> {0} LOG_SEND_CLIENT_PREFIX_MESSAGE=> {0}{1} LOG_SET_SOCKET_TIMEOUT=Impostare collegamento timeout per {0} secondi LOG_SOCKET_BIND_FAILED=Non possibile aprire la porta di ascolto {0} di {1,number,#}: accesso non autorizzato o uso di un altro processo della porta\n LOG_STARTING_DAVMAIL=Avvio DavMail Gateway... LOG_STOPPING_DAVMAIL=Arresto DavMail Gateway... LOG_SWT_NOT_AVAILABLE=SWT not available, using native system tray support LOG_SYSTEM_TRAY_NOT_AVAILABLE=JDK 1.6 necessario per il supporto vassoio di sistema LOG_UNABLE_TO_CREATE_ICON=Impossibile creare l'icona LOG_UNABLE_TO_CREATE_LOG_FILE_DIR=Impossibile creare la directory del file di registro LOG_UNABLE_TO_CREATE_TRAY=Impossibile creare l'icona del vassoio di sistema LOG_UNABLE_TO_GET_PARSEINTWITHTAG=Errore metodo di accesso BerDecoder.parseIntWithTag non trovato LOG_UNABLE_TO_GET_RELEASED_VERSION=Impossibile recuperare il numero di versione LOG_UNABLE_TO_LOAD_IMAGE=Impossibile caricare l'immagine LOG_UNABLE_TO_LOAD_SETTINGS=Impossibile caricare le impostazioni: LOG_UNABLE_TO_OPEN_LINK=Impossibile aprire il link LOG_UNABLE_TO_SET_ICON_IMAGE=Impossibile individuare l'icona JDialog (non disponibile in Java 1.5) LOG_UNABLE_TO_SET_LOG_FILE_PATH=Impossibile aggiornare il percorso del file di registro LOG_UNABLE_TO_SET_LOOK_AND_FEEL=Impossibile impostare lo stile dell'interfaccia LOG_UNABLE_TO_SET_SYSTEM_LOOK_AND_FEEL=Impossibile impostare l'aspetto dell'interfaccia LOG_UNABLE_TO_STORE_SETTINGS=Impossibile memorizzare le impostazioni: LOG_UNSUPPORTED_REQUEST=Richiesta non supportata: {0} LOG_INVALID_TIMEZONE=Fuso orario non valido: {0} LOG_ACCESS_FORBIDDEN=L'accesso a {0} proibito: {1} LOG_DOWNLOAD_PROGRESS=Scaricato {0} KBytes da {1} LOG_WEBDAV_NOT_AVAILABLE=WebDav non disponibile, riprovare con modalit EWS UI_ABOUT=A proposito di... UI_ABOUT_DAVMAIL=Informazioni su DavMail Gateway UI_ABOUT_DAVMAIL_AUTHOR=DavMail Gateway
By Mickal Guessant

UI_ACCEPT_CERTIFICATE=DavMail: Accettare il certificato ? UI_ALLOW_REMOTE_CONNECTION=Consenti connessioni remote: UI_ALLOW_REMOTE_CONNECTION_HELP=Consenti connessioni remote al gateway (modalit server) UI_PASSWORD_PROMPT=DavMail: Immettere la password UI_KERBEROS_CREDENTIAL_PROMPT=DavMail: Credenziali di Kerberos UI_KERBEROS_PASSWORD_PROMPT=Password Kerberos: UI_ANSWER_NO=n UI_ANSWER_YES=s UI_BIND_ADDRESS=Indirizzo di rete specificato: UI_BIND_ADDRESS_HELP=Associare solo per l'indirizzo di rete specificato UI_BUTTON_ACCEPT=Accetta UI_BUTTON_CANCEL=Annulla UI_BUTTON_DENY=Nega UI_BUTTON_HELP=Aiuto UI_BUTTON_OK=OK UI_BUTTON_OPEN=Aperto UI_BUTTON_SAVE=Salva UI_BUTTON_COPY=Copia negli appunti UI_BUTTON_DEFAULT=Predefinito UI_BUTTON_DEFAULT_HELP=Ripristinare i livelli di registrazione predefinita UI_CALDAV_PORT=Porta HTTP CalDAV: UI_CALDAV_PORT_HELP=Porta del server CalDAV locale per configurare in client CalDAV (calendario) UI_CALENDAR_PAST_EVENTS=Calendario eventi passati (CalDAV): UI_CALENDAR_PAST_EVENTS_HELP=Prendi eventi del passato non pi vecchi del giorni specificato, lasciare vuoto per nessun limite UI_CURRENT_VERSION=Versione corrente: {0}
UI_DAVMAIL_GATEWAY=DavMail Gateway UI_DAVMAIL_SETTINGS=DavMail Gateway Impostazioni UI_DELAYS=Ritardi UI_DISABLE_UPDATE_CHECK=Disattivazione del controllo della versione: UI_DISABLE_UPDATE_CHECK_HELP=Disabilitare il controllo della nuova versione disponibile UI_ENABLE_PROXY=Abilitare proxy: UI_ERROR_WAITING_FOR_CERTIFICATE_CHECK=Errore durante l'attesa di convalida del certificato UI_EXIT=Esci UI_FINGERPRINT=Impronta UI_GATEWAY=Gateway UI_HELP_INSTRUCTIONS=
Guida e istruzioni disponibili su:
http://davmail.sourceforge.net

Per inviare commenti o segnalare i bug,
utilizzare DavMail Sourceforge trackers
o contattarmi all'indirizzo mguessan@free.fr UI_IMAP_PORT=Porta locale IMAP: UI_IMAP_PORT_HELP=Porta locale per configurare il client di posta IMAP UI_ISSUED_BY=Rilasciato da UI_ISSUED_TO=Rilasciato per UI_KEEP_DELAY=Periodo di conservazione dati cestinati (POP): UI_KEEP_DELAY_HELP=Numero di giorni per conservare i messaggi nel Cestino UI_KEY_PASSWORD=Password della chiave: UI_KEY_PASSWORD_HELP=Password SSL della chiave all'interno dell'archivio dei certificati UI_KEY_STORE=Password del file di chiave: UI_KEY_STORE_HELP=Percorso del file contenente il certificato SSL UI_KEY_STORE_PASSWORD=Certificato password: UI_KEY_STORE_PASSWORD_HELP=Certificato password UI_KEY_STORE_TYPE=Tipo del certificato: UI_KEY_STORE_TYPE_HELP=Selezionare il tipo di certificato UI_CLIENT_SO_TIMEOUT=Timeout di connessione del client: UI_CLIENT_SO_TIMEOUT_HELP=Connessione client di timeout in secondi, 0 per disabilitare il timeout, vuoto per 5 minuti UI_CLIENT_KEY_STORE=File del certificato client: UI_CLIENT_KEY_STORE_HELP=Percorso del file contenente il certificato client SSL UI_CLIENT_KEY_STORE_PASSWORD=Certificato client password: UI_CLIENT_KEY_STORE_PASSWORD_HELP=Certificato client password, leave empty for runtime prompt UI_CLIENT_KEY_STORE_TYPE=Certificato Client estensione: UI_CLIENT_KEY_STORE_TYPE_HELP=Scegli il tipo di estensione, PKCS11 certificato per una smart card UI_CLIENT_CERTIFICATE=Certificato del client (DavMail a Exchange) UI_PKCS11_LIBRARY=Libreria PKCS11: UI_PKCS11_LIBRARY_HELP=Libreria PKCS11 (smartcard) percorso (.so or .dll) UI_PKCS11_CONFIG=Configurazione PKCS11: UI_PKCS11_CONFIG_HELP=PKCS11 ulteriore configurazione opzionale (slot, nssArgs ...) UI_LAST_LOG=Ultimo log UI_LAST_MESSAGE=Ultimo messaggio UI_LATEST_VERSION=Ultima versione disponibile: {0}
Una nuova versione del DavMail Gateway disponibile.
Scaricare l'ultima versione
UI_LDAP_PORT=Porta LDAP locale: UI_LDAP_PORT_HELP=Directory locale per configurare in porta LDAP del cliente (rubrica) UI_LOGGING_LEVELS=Livelli di registro UI_LOGS=Registri UI_LOG_DAVMAIL=DavMail: UI_LOG_DEFAULT=Predefinito: UI_LOG_HTTPCLIENT=HttpClient: UI_LOG_WIRE=Rete: UI_LOG_FILE_PATH=File di registro percorso: UI_NETWORK=Rete UI_NO_SSL=No SSL UI_OWA_URL=URL OWA (Exchange): UI_OWA_URL_HELP=Base Outlook Web Access URL UI_POP_PORT=Porta locale POP: UI_POP_PORT_HELP=Porta locale per configurare il client di posta elettronica POP UI_PROXY=Proxy UI_PROXY_PASSWORD=Password proxy: UI_PROXY_PORT=Porta server proxy: UI_PROXY_SERVER=Proxy server: UI_PROXY_USER=Nome utente proxy: UI_NO_PROXY=Nessun proxy per: UI_SENT_KEEP_DELAY=Tempo di ritenzione inviato (POP): UI_SENT_KEEP_DELAY_HELP=Numero di giorni per cui conservare i messaggi nella cartella Posta inviata UI_SERIAL=Numero di serie UI_DAVMAIL_SERVER_CERTIFICATE=Certificato Server (Cliente di DavMail) UI_SERVER_CERTIFICATE=Certificato Server Exchange UI_SERVER_CERTIFICATE_HASH=Certificato Server Hash: UI_SERVER_CERTIFICATE_HASH_HELP=Hash del certificato accettato manualmente UI_SETTINGS=Impostazioni... UI_SHOW_LOGS=Mostra i file di registro... UI_SMTP_PORT=Porta SMTP locale: UI_SMTP_PORT_HELP=Porta SMTP locale per configurare il client di posta elettronica UI_TAB_ADVANCED=Avanzato UI_TAB_OSX=OSX UI_OSX=OSX UI_OSX_HIDE_FROM_DOCK=Nascondi dal Dock UI_OSX_HIDE_FROM_DOCK_HELP=Nascondi Dock dell'applicazione ( necessario riavviare) UI_TAB_ENCRYPTION=Crittografia UI_TAB_MAIN=Principale UI_TAB_NETWORK=Rete UI_UNTRUSTED_CERTIFICATE=Fornito un certificato non attendibile dal Server,\n si pu scegliere di accettare o rifiutare l'accesso.\n Accetta certificato (y/n)? UI_UNTRUSTED_CERTIFICATE_HTML=Fornito un certificato non attendibile dal Server,
si pu scegliere di accettare o rifiutare l'accesso
UI_VALID_FROM=Rilasciato il UI_VALID_UNTIL=Scade il MEETING_REQUEST=Chiamare LOG_SUBFOLDER_ACCESS_FORBIDDEN=Nessun accesso alle sottocartelle di {0} LOG_FOLDER_NOT_FOUND=File {0} non trovato LOG_FOLDER_ACCESS_FORBIDDEN=Nessun accesso al file {0} LOG_FOLDER_ACCESS_ERROR=Errore di accesso al file {0}: {1} UI_OTP_PASSWORD_PROMPT=Password dell'elemento: UI_CAPTCHA_PROMPT=PIN: UI_TAB_LOGGING=Registri Attivita UI_OTHER=Altro UI_CALDAV_ALARM_SOUND=Allarmi CalDAV suono: UI_CALDAV_ALARM_SOUND_HELP=Convertire gli allarmi acustici di CalDAV in allarmi supportati da iCal, per esempio Basso UI_FORCE_ACTIVESYNC_UPDATE=Forza aggiornamenti ActiveSync: UI_FORCE_ACTIVESYNC_UPDATE_HELP=Forza eventi di aggiornamento CalDAV per i dispositivi collegati tramite ActiveSync UI_DEFAULT_DOMAIN=Dominio di default di Windows: UI_DEFAULT_DOMAIN_HELP=Domain Name di default di Windows UI_USE_SYSTEM_PROXIES=Utilizza le impostazioni proxy del sistema: UI_SHOW_STARTUP_BANNER=Visualizzazione del messaggio di avvio UI_SHOW_STARTUP_BANNER_HELP=Mostra o meno la finestra di notifica all'avvio UI_DISABLE_GUI_NOTIFICATIONS=Disattivare notifiche grafiche : UI_DISABLE_GUI_NOTIFICATIONS_HELP=Disattivare tutte le notifiche grafiche UI_IMAP_AUTO_EXPUNGE=IMAP rimozione automatica: UI_IMAP_AUTO_EXPUNGE_HELP=Eliminare immediatamente i messaggi dal server tramite IMAP UI_ENABLE_KEEPALIVE=Abilita KeepAlive: UI_ENABLE_KEEPALIVE_HELP=Invia un carattere KeepAlive durante il caricamento dei file e messaggi di grandi dimensioni UI_POP_MARK_READ=Da leggere (POP): UI_POP_MARK_READ_HELP=Segna i messaggi letti sul server immediatamente dopo il caricamento UI_IMAP_IDLE_DELAY=Cartella di sorveglianza IDLE (IMAP): UI_IMAP_IDLE_DELAY_HELP=Monitoraggio della cartella IMAP. Ritardo di inattivit in minuti, lasciare vuoto per disabilitare il supporto IDLE EXCEPTION_EWS_NOT_AVAILABLE=Punto di accesso EWS non disponibile EXCEPTION_FOLDER_NOT_FOUND=File {0} non trovato UNKNOWN_ATTRIBUTE=Attributo sconosciuto: {0} NEEDS-ACTION= ACCEPTED=Accettato: TENTATIVE=Provvisorio: DECLINED=Negato: UI_ENABLE_EWS=Protocollo Exchange UI_ENABLE_EWS_HELP=Abilitare EWS su Exchange 2010 o Exchange 2007 senza il supporto WebDAV UI_ENABLE_KERBEROS=Abilita Kerberos UI_ENABLE_KERBEROS_HELP=Abilitare l'autenticazione Kerberos di Windows UI_CALDAV_NOTIFICATION=DavMail: CalDAV Notifica UI_BUTTON_SEND=Inoltrare UI_TO=A: UI_TO_HELP=Destinatari UI_CC=Cc: UI_CC_HELP=Copia contenitori UI_SUBJECT=Soggetto: UI_SUBJECT_HELP=Oggetto notifica CalDAV UI_NOTIFICATION_BODY=Commento notifica CalDAV UI_CALDAV_EDIT_NOTIFICATIONS=Modifica notifiche CalDAV: UI_CALDAV_EDIT_NOTIFICATIONS_HELP=Abilitare la modifica interattiva della finestra notifiche LOG_SEARCH_RESULT=Trovato {0} elemento(s) UI_LOG_FILE_SIZE=Dimensione file di registro: UI_LOG_FILE_SIZE_HELP=Utilizzare la sintassi Log4J o impostato su 0 per utilizzare un meccanismo di rotazione esterna UI_SAVE_IN_SENT=SMTP salvato in "Inviati": UI_SAVE_IN_SENT_HELP=Creare una copia dei messaggi inviati attraverso il server SMTP nella cartella "Posta inviata" UI_CERTIFICATE_ALIAS_PROMPT=Selezionare un certificato UI_ALWAYS_APPROXIMATE_MSG_SIZE=Scambia dimensioni dei messaggi: UI_ALWAYS_APPROXIMATE_MSG_SIZE_HELP=Rispondere sempre alle richieste IMAP RFC822.SIZE con la dimensione approssimativa del messaggio di Exchange per motivi di prestazioni CANCELLED=Annullato: UI_FOLDER_SIZE_LIMIT=Limite dimensioni cartella: UI_FOLDER_SIZE_LIMIT_HELP=Limite del conteggio messaggi sul recupero della cartella UI_CALDAV_AUTO_SCHEDULE=Pianificazione automatica di Caldav UI_CALDAV_AUTO_SCHEDULE_HELP=Abilita le notifiche della riunione gestita dal server UI_EWS_HELP=URL del servizio Web di Exchange, termina con /EWS/Exchange.asmx UI_O365_HELP=Office 365 con l'autenticazione classica nome utente / password o password dell'applicazione UI_O365Modern_HELP=Autenticazione moderna di Office 365 (Oauth2) UI_O365Interactive_HELP=Autenticazione interattiva di Office 365 UI_Auto_HELP=Modalit automatica UI_WebDav_HELP=Exchange 2007 o precedente EXCEPTION_AUTHENTICATION_FAILED_REASON=Autenticazione fallita {0} UI_SMS_PHONE_CODE=Codice di verifica inviato a {0} :davmail-6.3.0/src/java/exchtimezones.properties0100644 0000000 0000000 00000007370 14602052450 020404 0ustar000000000 0000000 # suppress inspection "UnusedProperty" for whole file # Timezone table to replace TZID with Exchange values Africa/Algiers=W. Central Africa Standard Time Africa/Cairo=Egypt Standard Time Africa/Casablanca=Morocco Standard Time Africa/Harare=South Africa Standard Time Africa/Nairobi=E. Africa Standard Time Africa/Windhoek=Namibia Standard Time America/Anchorage=Alaskan Standard Time America/Argentina/Buenos_Aires=Argentina Standard Time America/Asuncion=Paraguay Standard Time America/Caracas=Venezuela Standard Time America/Cayenne=SA Eastern Standard Time America/Chicago=Central Standard Time America/Winnipeg=Central Standard Time America/Chihuahua=Mountain Standard Time (Mexico) America/Cuiaba=Central Brazilian Standard Time America/Denver=Mountain Standard Time America/El_Salvador=Bahia Standard Time America/Godthab=Greenland Standard Time America/Halifax=Atlantic Standard Time America/Indiana/Knox=US Eastern Standard Time America/Lima=SA Pacific Standard Time America/Los_Angeles=Pacific Standard Time America/Manaus=SA Western Standard Time America/Mexico_City=Central Standard Time (Mexico) America/Montevideo=Montevideo Standard Time America/New_York=Eastern Standard Time America/Phoenix=US Mountain Standard Time America/Regina=Canada Central Standard Time America/Santiago=Pacific SA Standard Time America/Sao_Paulo=E. South America Standard Time America/St_Johns=Newfoundland Standard Time Asia/Amman=Jordan Standard Time Asia/Baghdad=Arabic Standard Time Asia/Baku=Azerbaijan Standard Time Asia/Bangkok=SE Asia Standard Time Asia/Beijing=China Standard Time Asia/Damascus=Syria Standard Time Asia/Dhaka=Bangladesh Standard Time Asia/Dubai=Arabian Standard Time Asia/Irkutsk=North Asia East Standard Time Asia/Istanbul=Turkey Standard Time Asia/Jerusalem=Israel Standard Time Asia/Kabul=Afghanistan Standard Time Asia/Kamchatka=Kamchatka Standard Time Asia/Karachi=Pakistan Standard Time Asia/Katmandu=Nepal Standard Time Asia/Kolkata=India Standard Time Asia/Krasnoyarsk=North Asia Standard Time Asia/Kuala_Lumpur=Singapore Standard Time Asia/Kuwait=Arab Standard Time Asia/Magadan=Magadan Standard Time Asia/Nicosia=E. Europe Standard Time Asia/Novosibirsk=N. Central Asia Standard Time Asia/Rangoon=Myanmar Standard Time Asia/Seoul=Korea Standard Time Asia/Taipei=Taipei Standard Time Asia/Tashkent=West Asia Standard Time Asia/Tbilisi=Georgian Standard Time Asia/Tehran=Iran Standard Time Asia/Tokyo=Tokyo Standard Time Asia/Ulaanbaatar=Ulaanbaatar Standard Time Asia/Vladivostok=Vladivostok Standard Time Asia/Yakutsk=Yakutsk Standard Time Asia/Yekaterinburg=Ekaterinburg Standard Time Asia/Yerevan=Armenian Standard Time Atlantic/Azores=Azores Standard Time Atlantic/Cape_Verde=Cape Verde Standard Time Atlantic/South_Georgia=Mid-Atlantic Standard Time Australia/Adelaide=Cen. Australia Standard Time Australia/Brisbane=E. Australia Standard Time Australia/Darwin=AUS Central Standard Time Australia/Hobart=Tasmania Standard Time Australia/Melbourne=AUS Eastern Standard Time Australia/Perth=W. Australia Standard Time Europe/Athens=GTB Standard Time Europe/Berlin=W. Europe Standard Time Europe/Helsinki=FLE Standard Time Europe/Kaliningrad=Kaliningrad Standard Time Europe/London=GMT Standard Time Europe/Moscow=Russian Standard Time Europe/Paris=Romance Standard Time Europe/Prague=Central Europe Standard Time Europe/Sarajevo=Central European Standard Time Greenwich=Greenwich Standard Time Pacific/Auckland=New Zealand Standard Time Pacific/Fiji=Fiji Standard Time Pacific/Guam=West Pacific Standard Time Pacific/Honolulu=Hawaiian Standard Time Pacific/Kwajalein=Dateline Standard Time Pacific/Noumea=Central Pacific Standard Time Pacific/Samoa=Samoa Standard Time Pacific/Tongatapu=Tonga Standard Time davmail-6.3.0/src/java/imapflags.properties0100644 0000000 0000000 00000001607 12564151516 017467 0ustar000000000 0000000 # # DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway # Copyright (C) 2012 Mickael Guessant # # 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. # $label1=Important $label2=Work $label3=Personal $label4=To Do $label5=Later davmail-6.3.0/src/java/imapflags_fr.properties0100644 0000000 0000000 00000001622 12564151516 020153 0ustar000000000 0000000 # # DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway # Copyright (C) 2012 Mickael Guessant # # 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. # $label1=Important $label2=Travail $label3=Personnel $label4= faire $label5=En attente davmail-6.3.0/src/java/imapflags_it.properties0100644 0000000 0000000 00000001714 12564151516 020162 0ustar000000000 0000000 # # DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway # Copyright (C) 2013 Mickael Guessant # # 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. # # # File created by gil for Fedora # $label1=Importante $label2=Lavoro $label3=Personale $label4=Da fare $label5=In attesadavmail-6.3.0/src/java/log4j.properties0100644 0000000 0000000 00000002613 14503245214 016533 0ustar000000000 0000000 # Warning : actual log levels set in davmail.properties log4j.rootLogger=WARN, ConsoleAppender log4j.logger.davmail=DEBUG log4j.logger.org.apache.http=WARN # ConsoleAppender is set to be a ConsoleAppender. log4j.appender.ConsoleAppender=org.apache.log4j.ConsoleAppender # ConsoleAppender uses PatternLayout. log4j.appender.ConsoleAppender.layout=org.apache.log4j.PatternLayout log4j.appender.ConsoleAppender.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c %x - %m%n # Sample config to log connections in a separate log #log4j.logger.davmail.connection=DEBUG, ConnectionAppender # #log4j.appender.ConnectionAppender=org.apache.log4j.FileAppender #log4j.appender.ConnectionAppender.file=davmailconnection.log #log4j.appender.ConnectionAppender.layout=org.apache.log4j.PatternLayout #log4j.appender.ConnectionAppender.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c %x - %m%n #log4j.appender.defaultSocketAppender=org.apache.log4j.net.SocketAppender #log4j.appender.defaultSocketAppender.RemoteHost=localhost #log4j.appender.defaultSocketAppender.port=4560 #log4j.appender.Syslog=org.apache.log4j.net.SyslogAppender #log4j.appender.Syslog.layout=org.apache.log4j.PatternLayout #log4j.appender.Syslog.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c %x - %m%n #log4j.appender.Syslog.syslogHost=localhost #log4j.appender.Syslog.facility=LOCAL1 #log4j.appender.Syslog.threshold=debug davmail-6.3.0/src/java/osxtray.png0100644 0000000 0000000 00000001400 12564151516 015614 0ustar000000000 0000000 PNG  IHDRĴl;IDATxU_hQ?N\`lֆ 825أd 4Xf2|a>V>TʠZ=Ȗ&1$qPD:C?w;\%Br/ n NtfN&_kZ߿@|[3mөPj?Okd].%[0ht:GZ+װl_<pzzՙL&h4rlRT`0Xc@/P#h4Z;<<&^O|"H{wbbxj(t:oRzajj^Аvwwi||W\.):q8l6*f뵤RHr^O&ّ̽v8a.vE\?x`0H nɥR)"bp7=+%&''eJJZMSA\o4rVÀP($x<.Ynsw0  ^<۔H$(ɈbVEVWW9 ;5YcCṼ2??O>O{^|U|Dx Trp<@鴌2( h#hS.ȇy 777@Y-.b. կ7.r@yX9|i8'V] @K&IENDB`davmail-6.3.0/src/java/osxtrayinactive.png0100644 0000000 0000000 00000001362 12564151516 017346 0ustar000000000 0000000 PNG  IHDRĴl;IDATxTAhas0dsc Cd!2X viHF%< Bʄ@[!1l!2m,Y%d 1` L/c/#ء{{EG×Lf?72P(JjJ@ <%xZVJ%bX,RWW{2L?NC4 %LF422"6j%IR"ORd4_by "֮|kgRt:M:NA9BPp\}+gT** 466Fr, T*|>/~tffVk7KCۏkkkP\NhzԔ=ODbPl݇5:Θ,:nF>&'' P9W-..W(cnpw|غ-eC3vX;NZXXG]ihhĀR 㣯rg4X,FKKK"fRg`\_b6xmooZpvvo1WFbkkKlMxpE',3v~u^縀I<G{ytCO뗁^߹IV04I< qVh 4Tggo &&+bIENDB`davmail-6.3.0/src/java/stdtimezones.properties0100644 0000000 0000000 00000007612 13216310201 020235 0ustar000000000 0000000 # Timezone table to replace Exchange timezones with standard values Afghanistan\ Standard\ Time=Asia/Kabul Alaskan\ Standard\ Time=America/Anchorage Arab\ Standard\ Time=Asia/Kuwait Arabian\ Standard\ Time=Asia/Dubai Arabic\ Standard\ Time=Asia/Baghdad Argentina\ Standard\ Time=America/Argentina/Buenos_Aires Armenian\ Standard\ Time=Asia/Yerevan Atlantic\ Standard\ Time=America/Halifax AUS\ Central\ Standard\ Time=Australia/Darwin AUS\ Eastern\ Standard\ Time=Australia/Melbourne Azerbaijan\ Standard\ Time=Asia/Baku Azores\ Standard\ Time=Atlantic/Azores Bahia\ Standard\ Time=America/El_Salvador Bangladesh\ Standard\ Time=Asia/Dhaka Canada\ Central\ Standard\ Time=America/Regina Cape\ Verde\ Standard\ Time=Atlantic/Cape_Verde Cen.\ Australia\ Standard\ Time=Australia/Adelaide Central\ America\ Standard\ Time=America/Chicago Central\ Brazilian\ Standard\ Time=America/Cuiaba Central\ Europe\ Standard\ Time=Europe/Prague Central\ European\ Standard\ Time=Europe/Sarajevo Central\ Pacific\ Standard\ Time=Pacific/Noumea Central\ Standard\ Time\ (Mexico)=America/Mexico_City China\ Standard\ Time=Asia/Beijing Dateline\ Standard\ Time=Pacific/Kwajalein E.\ Africa\ Standard\ Time=Africa/Nairobi E.\ Australia\ Standard\ Time=Australia/Brisbane E.\ Europe\ Standard\ Time=Asia/Nicosia E.\ South\ America\ Standard\ Time=America/Sao_Paulo Eastern\ Standard\ Time=America/New_York Egypt\ Standard\ Time=Africa/Cairo Ekaterinburg\ Standard\ Time=Asia/Yekaterinburg Fiji\ Standard\ Time=Pacific/Fiji FLE\ Standard\ Time=Europe/Helsinki Georgian\ Standard\ Time=Asia/Tbilisi GMT\ Standard\ Time=Europe/London Greenland\ Standard\ Time=America/Godthab Greenwich\ Standard\ Time=Greenwich GTB\ Standard\ Time=Europe/Athens Hawaiian\ Standard\ Time=Pacific/Honolulu India\ Standard\ Time=Asia/Kolkata Iran\ Standard\ Time=Asia/Tehran Israel\ Standard\ Time=Asia/Jerusalem Jordan\ Standard\ Time=Asia/Amman Kaliningrad\ Standard\ Time=Europe/Kaliningrad Kamchatka\ Standard\ Time=Asia/Kamchatka Korea\ Standard\ Time=Asia/Seoul Magadan\ Standard\ Time=Asia/Magadan Mid-Atlantic\ Standard\ Time=Atlantic/South_Georgia Montevideo\ Standard\ Time=America/Montevideo Morocco\ Standard\ Time=Africa/Casablanca Mountain\ Standard\ Time=America/Denver Mountain\ Standard\ Time\ (Mexico)=America/Chihuahua Myanmar\ Standard\ Time=Asia/Rangoon N.\ Central\ Asia\ Standard\ Time=Asia/Novosibirsk Namibia\ Standard\ Time=Africa/Windhoek Nepal\ Standard\ Time=Asia/Katmandu New\ Zealand\ Standard\ Time=Pacific/Auckland Newfoundland\ Standard\ Time=America/St_Johns North\ Asia\ East\ Standard\ Time=Asia/Irkutsk North\ Asia\ Standard\ Time=Asia/Krasnoyarsk Pacific\ SA\ Standard\ Time=America/Santiago Pacific\ Standard\ Time=America/Los_Angeles Pakistan\ Standard\ Time=Asia/Karachi Paraguay\ Standard\ Time=America/Asuncion Romance\ Standard\ Time=Europe/Paris Russian\ Standard\ Time=Europe/Moscow SA\ Eastern\ Standard\ Time=America/Cayenne SA\ Pacific\ Standard\ Time=America/Lima SA\ Western\ Standard\ Time=America/Manaus Samoa\ Standard\ Time=Pacific/Samoa SE\ Asia\ Standard\ Time=Asia/Bangkok Singapore\ Standard\ Time=Asia/Kuala_Lumpur South\ Africa\ Standard\ Time=Africa/Harare Syria\ Standard\ Time=Asia/Damascus Taipei\ Standard\ Time=Asia/Taipei Tasmania\ Standard\ Time=Australia/Hobart Tokyo\ Standard\ Time=Asia/Tokyo Tonga\ Standard\ Time=Pacific/Tongatapu Turkey\ Standard\ Time=Asia/Istanbul Ulaanbaatar\ Standard\ Time=Asia/Ulaanbaatar US\ Eastern\ Standard\ Time=America/Indiana/Knox US\ Mountain\ Standard\ Time=America/Phoenix Venezuela\ Standard\ Time=America/Caracas Vladivostok\ Standard\ Time=Asia/Vladivostok W.\ Australia\ Standard\ Time=Australia/Perth W.\ Central\ Africa\ Standard\ Time=Africa/Algiers W.\ Europe\ Standard\ Time=Europe/Berlin West\ Asia\ Standard\ Time=Asia/Tashkent West\ Pacific\ Standard\ Time=Pacific/Guam Yakutsk\ Standard\ Time=Asia/Yakutsk davmail-6.3.0/src/java/timezoneids.properties0100644 0000000 0000000 00000006213 13216310201 020033 0ustar000000000 0000000 # Timezone name to id table, used for Exchange 2007 over Webdav Morocco\ Standard\ Time=88 GMT\ Standard\ Time=1 Greenwich\ Standard\ Time=31 W.\ Europe\ Standard\ Time=4 Romance\ Standard\ Time=3 Central\ Europe\ Standard\ Time=6 Central\ European\ Standard\ Time=2 W.\ Central\ Africa\ Standard\ Time=69 Jordan\ Standard\ Time=83 GTB\ Standard\ Time=7 Egypt\ Standard\ Time=49 South\ Africa\ Standard\ Time=50 FLE\ Standard\ Time=59 Israel\ Standard\ Time=27 E.\ Europe\ Standard\ Time=5 Arabic\ Standard\ Time=26 E.\ Africa\ Standard\ Time=56 Arab\ Standard\ Time=74 Russian\ Standard\ Time=51 Iran\ Standard\ Time=25 Arabian\ Standard\ Time=24 Azerbaijan\ Standard\ Time=84 Caucasus\ Standard\ Time=54 Mauritius\ Standard\ Time=91 Georgian\ Standard\ Time=86 Armenian\ Standard\ Time=85 Afghanistan\ Standard\ Time=48 Ekaterinburg\ Standard\ Time=58 Pakistan\ Standard\ Time=89 West\ Asia\ Standard\ Time=47 India\ Standard\ Time=23 Sri\ Lanka\ Standard\ Time=66 Nepal\ Standard\ Time=62 N.\ Central\ Asia\ Standard\ Time=46 Central\ Asia\ Standard\ Time=71 Myanmar\ Standard\ Time=61 SE\ Asia\ Standard\ Time=22 North\ Asia\ Standard\ Time=64 China\ Standard\ Time=45 North\ Asia\ East\ Standard\ Time=63 Singapore\ Standard\ Time=21 W.\ Australia\ Standard\ Time=73 Taipei\ Standard\ Time=75 Korea\ Standard\ Time=72 Tokyo\ Standard\ Time=20 Yakutsk\ Standard\ Time=70 Cen.\ Australia\ Standard\ Time=19 AUS\ Central\ Standard\ Time=44 E.\ Australia\ Standard\ Time=18 AUS\ Eastern\ Standard\ Time=78 West\ Pacific\ Standard\ Time=43 Tasmania\ Standard\ Time=42 Vladivostok\ Standard\ Time=68 Central\ Pacific\ Standard\ Time=41 Fiji\ Standard\ Time=40 New\ Zealand\ Standard\ Time=17 Tonga\ Standard\ Time=67 Azores\ Standard\ Time=29 Cape\ Verde\ Standard\ Time=53 Mid-Atlantic\ Standard\ Time=30 E.\ South\ America\ Standard\ Time=8 Argentina\ Standard\ Time=87 SA\ Eastern\ Standard\ Time=32 Greenland\ Standard\ Time=60 Montevideo\ Standard\ Time=92 Newfoundland\ Standard\ Time=28 Atlantic\ Standard\ Time=9 SA\ Western\ Standard\ Time=33 Central\ Brazilian\ Standard\ Time=90 Pacific\ SA\ Standard\ Time=65 Venezuela\ Standard\ Time=82 SA\ Pacific\ Standard\ Time=35 Eastern\ Standard\ Time=10 US\ Eastern\ Standard\ Time=34 Central\ America\ Standard\ Time=55 Central\ Standard\ Time=11 Central\ Standard\ Time\ (Mexico)=37 Canada\ Central\ Standard\ Time=36 US\ Mountain\ Standard\ Time=38 Mountain\ Standard\ Time\ (Mexico)=77 Mountain\ Standard\ Time=12 Pacific\ Standard\ Time=13 Pacific\ Standard\ Time\ (Mexico)=81 Alaskan\ Standard\ Time=14 Hawaiian\ Standard\ Time=15 Samoa\ Standard\ Time=16 Dateline\ Standard\ Time=39 # Additional Middle\ East\ Standard\ Time=7 Mexico\ Standard\ Time=37 Mexico\ Standard\ Time\ 2=77 # 2007 #AUS\ Eastern\ Standard\ Time=57 Kamchatka\ Standard\ Time=93 Paraguay\ Standard\ Time=94 UTC=95 Ulaanbaatar\ Standard\ Time=96 Bangladesh\ Standard\ Time=97 Syria\ Standard\ Time=98 UTC-02=99 UTC+12=100 UTC-11=101 Namibia\ Standard\ Time=102 Magadan\ Standard\ Time=103 Kaliningrad\ Standard\ Time=104 Turkey\ Standard\ Time=105 Bahia\ Standard\ Time=106davmail-6.3.0/src/java/timezones.properties0100644 0000000 0000000 00000030340 13263235463 017536 0ustar000000000 0000000 # suppress inspection "UnusedProperty" for whole file # Timezone rename table to help iCal find the correct timezone (GMT)\ Monrovia/Casablanca=Africa/Casablanca (GMT)\ Monrovia/Reykjavik=Africa/Casablanca (GMT)\ Casablanca=Africa/Casablanca (GMT)\ Greenwich\ Mean\ Time/Dublin/Edinburgh/London=Europe/London (GMT+01.00)\ Berlin/Stockholm/Rome/Bern/Vienna=Europe/Berlin (GMT+01.00)\ Paris/Madrid/Brussels/Copenhagen=Europe/Paris (GMT+01\:00)\ Brussels,\ Copenhagen,\ Madrid,\ Paris=Europe/Paris (UTC+01\:00)\ Brussels,\ Copenhagen,\ Madrid,\ Paris=Europe/Paris (UTC+01\:00)\ Bruxelles,\ Copenhague,\ Madrid,\ Paris=Europe/Paris (GMT+01.00)\ Prague/Central\ Europe=Europe/Prague (GMT+01.00)\ Sarajevo/Warsaw/Zagreb=Europe/Sarajevo (GMT+01.00)\ West\ Central\ Africa=Africa/Algiers (GMT+01.00)\ Windhoek=Africa/Windhoek (GMT+02.00)\ Athens/Istanbul/Minsk=Europe/Athens (GMT+02.00)\ Athens/Bucharest/Istanbul=Europe/Athens (GMT+02.00)\ Bucharest/Eastern\ Europe=Europe/Bucharest (GMT+02.00)\ Minsk/Eastern\ Europe=Europe/Bucharest (GMT+02.00)\ Nicosia=Asia/Nicosia (GMT+02.00)\ Cairo=Africa/Cairo (GMT+02.00)\ Harare/Pretoria=Africa/Harare (GMT+02.00)\ Helsinki/Riga/Tallinn=Europe/Helsinki (GMT+02.00)\ Israel/Jerusalem\ Standard\ Time=Asia/Jerusalem (GMT+02.00)\ Amman=Asia/Amman (GMT+02.00)\ Athens/Bucharest=Europe/Athens (GMT+02.00)\ Damascus=Asia/Damascus (GMT+02.00)\ Istanbul=Asia/Istanbul (GMT+02.00)\ Windhoek=Africa/Windhoek (GMT+03.00)\ Baghdad=Asia/Baghdad (GMT+03.00)\ Arab/Kuwait/Riyadh=Asia/Kuwait (GMT+03.00)\ Moscow/St.\ Petersburg/Volgograd=Europe/Moscow (GMT+03.00)\ East\ Africa/Nairobi=Africa/Nairobi (GMT+03.00)\ Kaliningrad=Europe/Kaliningrad (GMT+03.00)\ Kaliningrad,\ Minsk=Europe/Kaliningrad (GMT+03.00)\ Kuwait/Riyadh=Asia/Kuwait (GMT+03.00)\ Tbilisi=Asia/Tbilisi (GMT+03.30)\ Tehran=Asia/Tehran (GMT+04.00)\ Tbilisi=Asia/Tbilisi (GMT+04.00)\ Abu\ Dhabi/Muscat=Asia/Dubai (GMT+04.00)\ Caucasus/Baku/Tbilisi/Yerevan=Asia/Tbilisi (GMT+04.00)\ Baku=Asia/Baku (GMT+04.00)\ Caucasus\ Standard\ Time=Asia/Baku (GMT+04.00)\ Port\ Louis=Asia/Baku (GMT+04.00)\ Yerevan=Asia/Yerevan (GMT+04.00)\ Moscow/St.\ Petersburg/Volgograd=Europe/Moscow (GMT+04.30)\ Kabul=Asia/Kabul (GMT+05.00)\ Ekaterinburg=Asia/Yekaterinburg (GMT+05.00)\ Islamabad/Karachi/Sverdlovsk/Tashkent=Asia/Tashkent (GMT+05.00)\ Islamabad/Karachi=Asia/Karachi (GMT+05.00)\ Sverdlovsk/Tashkent=Asia/Tashkent (GMT+05.30)\ Calcutta/Chennai/Mumbai/New\ Delhi/India\ Standard\ Time=Asia/Kolkata (GMT+05.30)\ Kolkata/Chennai/Mumbai/New\ Delhi/India\ Standard\ Time=Asia/Kolkata (GMT+05.30)\ Sri\ Jayawardenepura/Sri\ Lanka=Asia/Kolkata (GMT+05.45)\ Kathmandu/Nepal=Asia/Katmandu (GMT+06.00)\ Ekaterinburg=Asia/Yekaterinburg (GMT+06.00)\ Almaty/North\ Central\ Asia/Novosibirsk=Asia/Almaty (GMT+06.00)\ Astana/Dhaka=Asia/Dhaka (GMT+06.00)\ Sri\ Jayawardenepura/Sri\ Lanka=Asia/Kolkata (GMT+06.00)\ Astana=Asia/Dhaka (GMT+06.00)\ Dhaka=Asia/Dhaka (GMT+06.00)\ Novosibirsk=Asia/Novosibirsk (GMT+06.30)\ Rangoon=Asia/Rangoon (GMT+07.00)\ Bangkok/Jakarta/Hanoi=Asia/Bangkok (GMT+07.00)\ Krasnoyarsk/North\ Asia=Asia/Krasnoyarsk (GMT+07.00)\ Novosibirsk=Asia/Novosibirsk (GMT+08.00)\ Krasnoyarsk/North\ Asia=Asia/Krasnoyarsk (GMT+08.00)\ Beijing/Chongqing/Hong\ Kong/Urumqi=Asia/Hong_Kong (GMT+08.00)\ Irkutsk/Ulaan\ Bataar=Asia/Irkutsk (GMT+08.00)\ Kuala\ Lumpur/Singapore=Asia/Kuala_Lumpur (GMT+08.00)\ Perth/Western\ Australia=Australia/Perth (GMT+08.00)\ Taipei=Asia/Taipei (GMT+08.00)\ Beijing/Chongqing/Hong\ Kong\ SAR/Urumqi=Asia/Beijing (GMT+08.00)\ Irkutsk=Asia/Irkutsk (GMT+08.00)\ Ulaanbaatar=Asia/Ulaanbaatar (GMT+09.00)\ Irkutsk=Asia/Irkutsk (GMT+09.00)\ Tokyo/Osaka/Sapporo=Asia/Tokyo (GMT+09.00)\ Seoul/Korea\ Standard\ Time=Asia/Seoul (GMT+09.00)\ Yakutsk=Asia/Yakutsk (GMT+09.30)\ Adelaide/Central\ Australia=Australia/Adelaide (GMT+09.30)\ Darwin=Australia/Darwin (GMT+09.30)\ Adelaide\ (Commonwealth\ Games)=Australia/Adelaide (GMT+10.00)\ Yakutsk=Asia/Yakutsk (GMT+10.00)\ Canberra,\ Melbourne,\ Sydney,\ Hobart\ (Year\ 2000\ only)=Australia/Melbourne (GMT+10.00)\ Canberra,\ Melbourne,\ Sydney\ (Commonwealth\ Games)=Australia/Melbourne (GMT+10.00)\ Hobart\ (Commonwealth\ Games)=Australia/Melbourne (GMT+10.00)\ Brisbane/East\ Australia=Australia/Brisbane (GMT+10.00)\ Canberra/Melbourne/Sydney/Hobart\ (Year\ 2000\ only)=Australia/Melbourne (GMT+10.00)\ Guam/Port\ Moresby=Pacific/Guam (GMT+10.00)\ Hobart/Tasmania=Australia/Hobart (GMT+10.00)\ Vladivostok=Asia/Vladivostok (GMT+10.00)\ Melbourne/Sydney=Australia/Melbourne (GMT+11.00)\ Vladivostok=Asia/Vladivostok (GMT+11.00)\ Magadan/Solomon\ Is./New\ Caledonia=Asia/Magadan (GMT+11.00)\ Solomon\ Is./New\ Caledonia=Pacific/Noumea (GMT+12.00)\ Wellington/Auckland=Pacific/Auckland (GMT+12.00)\ Fiji/Kamchatka/Marshall\ Is.=Pacific/Fiji (GMT+12.00)\ Coordinated\ Universal\ Time+12=Pacific/Fiji (GMT+12.00)\ Fiji=Pacific/Fiji (GMT+12.00)\ Magadan=Asia/Magadan (GMT+12.00)\ Petropavlovsk-Kamchatsky\ -\ Old= (GMT+13.00)\ Tonga/Nuku'alofa=Pacific/Tongatapu (GMT+13.00)\ Nuku'alofa=Pacific/Tongatapu (GMT+13.00)\ Samoa=Pacific/Samoa (GMT-01.00)\ Azores=Atlantic/Azores (GMT-01.00)\ Cape\ Verde\ Is.=Atlantic/Cape_Verde (GMT-02.00)\ Mid-Atlantic=Atlantic/South_Georgia (GMT-02.00)\ Coordinated\ Universal\ Time-02=Atlantic/South_Georgia (GMT-03.00)\ Brasilia=America/Sao_Paulo (GMT-03.00)\ Georgetown=America/Argentina/Buenos_Aires (GMT-03.00)\ Buenos\ Aires/Georgetown=America/Argentina/Buenos_Aires (GMT-03.00)\ Greenland=America/Godthab (GMT-03.00)\ Buenos\ Aires=America/Argentina/Buenos_Aires (GMT-03.00)\ Cayenne/Fortaleza=America/Cayenne (GMT-03.00)\ Montevideo=America/Montevideo (GMT-03.00)\ Salvador=America/El_Salvador (GMT-03.30)\ Newfoundland=America/St_Johns (GMT-04.00)\ Atlantic\ Time\ (Canada)=America/Halifax (GMT-04.00)\ Caracas/La\ Paz=America/Caracas (GMT-04.00)\ Santiago=America/Santiago (GMT-04.00)\ Asuncion=America/Asuncion (GMT-04.00)\ Cuiaba=America/Cuiaba (GMT-04.00)\ Georgetown/La\ Paz/Manaus/San\ Juan=America/Manaus (GMT-04.30)\ Caracas=America/Caracas (GMT-05.00)\ Bogota/Lima=America/Lima (GMT-05.00)\ Bogota/Lima/Quito=America/Lima (GMT-05.00)\ Eastern\ Time\ (US\ &\ Canada)=America/New_York (GMT-05.00)\ Indiana\ (East)=America/Indiana/Knox (GMT-06.00)\ Central\ America=America/Chicago (GMT-06.00)\ Central\ Time\ (US\ &\ Canada)=America/Chicago (GMT-06.00)\ Mexico\ City/Tegucigalpa=America/Mexico_City (GMT-06.00)\ Saskatchewan=America/Regina (GMT-07.00)\ Arizona=America/Phoenix (GMT-07.00)\ Mountain\ Time\ (US\ &\ Canada)=America/Denver (GMT-07.00)\ Chihuahua/La\ Paza/Mazatlan=America/Chihuahua (GMT-08.00)\ Pacific\ Time\ (US\ &\ Canada)/Tijuana=America/Los_Angeles (GMT-08.00)\ Pacific\ Time\ (US\ &\ Canada)=America/Los_Angeles (GMT-08.00)\ Baja\ California=America/Los_Angeles (GMT-0800)\ Pacific\ Standard\ Time=America/Los_Angeles (GMT-09.00)\ Alaska=America/Anchorage (GMT-10.00)\ Hawaii=Pacific/Honolulu (GMT-11.00)\ Midway\ Island/Samoa=Pacific/Pago_Pago (GMT-11.00)\ Coordinated\ Universal\ Time-11=Pacific/Samoa (GMT-11.00)\ Samoa=Pacific/Samoa (GMT-12.00)\ Eniwetok/Kwajalein/Dateline\ Time=Pacific/Kwajalein GMT\ -0000\ (Standard)\ /\ GMT\ -0000\ (Daylight)=Africa/Casablanca GMT\ -0000\ (Standard)\ /\ GMT\ +0100\ (Daylight)=Europe/London GMT\ +0100\ (Standard)\ /\ GMT\ +0200\ (Daylight)=Europe/Paris GMT\ +0200\ (Standard)\ /\ GMT\ +0200\ (Daylight)=Africa/Harare GMT\ +0200\ (Standard)\ /\ GMT\ +0300\ (Daylight)=Europe/Bucharest GMT\ +0400\ (Standard)\ /\ GMT\ +0400\ (Daylight)=Asia/Dubai GMT\ +0800\ (Standard)\ /\ GMT\ +0900\ (Daylight)=Asia/Kuala_Lumpur GMT\ +1000\ (Standard)\ /\ GMT\ +1100\ (Daylight)=Australia/Melbourne GMT\ -0300\ (Standard)\ /\ GMT\ -0200\ (Daylight)=America/Sao_Paulo GMT\ -0500\ (Standard)\ /\ GMT\ -0400\ (Daylight)=America/New_York GMT\ -0600\ (Standard)\ /\ GMT\ -0500\ (Daylight)=America/Chicago GMT\ -0700\ (Standard)\ /\ GMT\ -0600\ (Daylight)=America/Denver GMT\ -0800\ (Standard)\ /\ GMT\ -0700\ (Daylight)=America/Los_Angeles Mexico\ Standard\ Time=America/Mexico_City (GMT)\ Coordinated\ Universal\ Time=Greenwich Standard Time # Exchange 2010 GMT\ Standard\ Time=Europe/London Central\ European\ Standard\ Time=Europe/Sarajevo Romance\ Standard\ Time=Europe/Paris W.\ Europe\ Standard\ Time=Europe/Berlin E.\ Europe\ Standard\ Time=Asia/Nicosia Central\ Europe\ Standard\ Time=Europe/Prague GTB\ Standard\ Time=Europe/Athens E.\ South\ America\ Standard\ Time=America/Sao_Paulo Atlantic\ Standard\ Time=America/Halifax Eastern\ Standard\ Time=America/New_York Central\ Standard\ Time=America/Chicago Mountain\ Standard\ Time=America/Denver Pacific\ Standard\ Time=America/Los_Angeles Alaskan\ Standard\ Time=America/Anchorage Hawaiian\ Standard\ Time=Pacific/Honolulu Samoa\ Standard\ Time=Pacific/Samoa New\ Zealand\ Standard\ Time=Pacific/Auckland E.\ Australia\ Standard\ Time=Australia/Brisbane Cen.\ Australia\ Standard\ Time=Australia/Adelaide Tokyo\ Standard\ Time=Asia/Tokyo Singapore\ Standard\ Time=Asia/Kuala_Lumpur SE\ Asia\ Standard\ Time=Asia/Bangkok India\ Standard\ Time=Asia/Kolkata Arabian\ Standard\ Time=Asia/Dubai Iran\ Standard\ Time=Asia/Tehran Arabic\ Standard\ Time=Asia/Baghdad Israel\ Standard\ Time=Asia/Jerusalem Newfoundland\ Standard\ Time=America/St_Johns Azores\ Standard\ Time=Atlantic/Azores Mid-Atlantic\ Standard\ Time=Atlantic/South_Georgia Greenwich\ Standard\ Time=Greenwich SA\ Eastern\ Standard\ Time=America/Cayenne SA\ Western\ Standard\ Time=America/Manaus US\ Eastern\ Standard\ Time=America/Indiana/Knox SA\ Pacific\ Standard\ Time=America/Lima Canada\ Central\ Standard\ Time=America/Regina Central\ Standard\ Time\ (Mexico)=America/Mexico_City US\ Mountain\ Standard\ Time=America/Phoenix Dateline\ Standard\ Time=Pacific/Kwajalein Fiji\ Standard\ Time=Pacific/Fiji Central\ Pacific\ Standard\ Time=Pacific/Noumea Tasmania\ Standard\ Time=Australia/Hobart West\ Pacific\ Standard\ Time=Pacific/Guam AUS\ Central\ Standard\ Time=Australia/Darwin China\ Standard\ Time=Asia/Beijing N.\ Central\ Asia\ Standard\ Time=Asia/Novosibirsk West\ Asia\ Standard\ Time=Asia/Tashkent Afghanistan\ Standard\ Time=Asia/Kabul Egypt\ Standard\ Time=Africa/Cairo South\ Africa\ Standard\ Time=Africa/Harare Russian\ Standard\ Time=Europe/Moscow Cape\ Verde\ Standard\ Time=Atlantic/Cape_Verde Caucasus\ Standard\ Time=Asia/Baku Central\ America\ Standard\ Time=America/Chicago E.\ Africa\ Standard\ Time=Africa/Nairobi Ekaterinburg\ Standard\ Time=Asia/Yekaterinburg FLE\ Standard\ Time=Europe/Helsinki Greenland\ Standard\ Time=America/Godthab Myanmar\ Standard\ Time=Asia/Rangoon Nepal\ Standard\ Time=Asia/Katmandu North\ Asia\ East\ Standard\ Time=Asia/Irkutsk North\ Asia\ Standard\ Time=Asia/Krasnoyarsk Pacific\ SA\ Standard\ Time=America/Santiago Sri\ Lanka\ Standard\ Time=Asia/Kolkata Tonga\ Standard\ Time=Pacific/Tongatapu Vladivostok\ Standard\ Time=Asia/Vladivostok W.\ Central\ Africa\ Standard\ Time=Africa/Algiers Yakutsk\ Standard\ Time=Asia/Yakutsk Central\ Asia\ Standard\ Time=Asia/Dhaka Korea\ Standard\ Time=Asia/Seoul W.\ Australia\ Standard\ Time=Australia/Perth Arab\ Standard\ Time=Asia/Kuwait Taipei\ Standard\ Time=Asia/Taipei Mountain\ Standard\ Time\ (Mexico)=America/Chihuahua AUS\ Eastern\ Standard\ Time=Australia/Melbourne Pacific\ Standard\ Time\ (Mexico)=America/Los_Angeles Venezuela\ Standard\ Time=America/Caracas Jordan\ Standard\ Time=Asia/Amman Azerbaijan\ Standard\ Time=Asia/Baku Armenian\ Standard\ Time=Asia/Yerevan Georgian\ Standard\ Time=Asia/Tbilisi Argentina\ Standard\ Time=America/Argentina/Buenos_Aires Morocco\ Standard\ Time=Africa/Casablanca Pakistan\ Standard\ Time=Asia/Karachi Central\ Brazilian\ Standard\ Time=America/Cuiaba Mauritius\ Standard\ Time=Asia/Baku Montevideo\ Standard\ Time=America/Montevideo Kamchatka\ Standard\ Time=Asia/Kamchatka Paraguay\ Standard\ Time=America/Asuncion UTC=Greenwich Standard Time Ulaanbaatar\ Standard\ Time=Asia/Ulaanbaatar Bangladesh\ Standard\ Time=Asia/Dhaka Syria\ Standard\ Time=Asia/Damascus UTC-02=Atlantic/South_Georgia UTC+12=Pacific/Fiji UTC-11=Pacific/Samoa Namibia\ Standard\ Time=Africa/Windhoek Magadan\ Standard\ Time=Asia/Magadan Kaliningrad\ Standard\ Time=Europe/Kaliningrad Turkey\ Standard\ Time=Asia/Istanbul Bahia\ Standard\ Time=America/El_Salvador davmail-6.3.0/src/java/tray.png0100644 0000000 0000000 00000001467 12564151516 015077 0ustar000000000 0000000 PNG  IHDRagAMA7IDATxeMlTucN;CZ qZ56bdcI )!w$qA  qִ41 VqSm 4$K-NN7o޼0'9{ν99W s^ZZY ~W?1:7*~ I(ʈQm\~w7)h1Ȩ(uOʅ*/KP[ɊYB>J?kp0zSD.ȄWSDȜW_]D&EdXʋ;FgߦXu^`St(ě]44ۭt/8sAcI zH؄an,4̈́6"V@r@;u'C} :A(E6-]ēD*A$PLeu 62f_9$ӗ э4.^1Aj9hMn8!ClZ.[lj9`E0{pä2EjWyJY>Xi47?C'1h -# P:, /W5 G5b( 87/}fT..ջ\D@zj!G@~w2:לp>nUŠEq 5:Pv~NS^!b4cz\\}A~%~ĝVC%1Գqaqg>|"~ܵ׶ғnb$C&姇_vM%ZIENDB`davmail-6.3.0/src/java/tray128.png0100644 0000000 0000000 00000020105 13263220044 015306 0ustar000000000 0000000 PNG  IHDR>agAMA7IDATxxT**`.' " UB`B[H =BzJBz!8̽sw7nvsi3gΔ;ixix7zM~:ۂGtH DoLO)1ySϠ-&ifx@+ EJJk?P`zu 86~pM =Q9DYtG'asՑv~Me %\Xhx ;b,DW?n#4g )B~$FH\|%@DpvO6i0(hDW }HibkKE\O pؘ `?Ϗv ÄO#3GKCG)*OtM^"o,F@񲁂`% A[ŏY $<.NC 5lZ71~: `-D^? (]8LXanuC y_o4 .s‡2+ra29ÈF2&#{+u*X!g Izh8&xBw?φKE0d%rI3>d!P0P$WəoC6wxOx {mNx&~z*,b";: 637 JYu~(w05ף 2#2bYF@80[Bnk@7i7#!5"$b'@~z7 Kײ_@:kmrl6f q/"GX?I|OanDѨ(U:!ke8E$ ɟgF`0LJ<,u'^oB [ߺEa mx(/ECE~J(/%?PN@n }5bQ#0[qv5s{x!ىAP^II 3t5]r#p AGb(~sC/H(dŻ(w쉷E?G*䥺nmZ,5 s$8o:ħ|oA\F+J#}0҇ʲ(.?JRQʶͼŋO0Pپ񏢻O8T]'nAzUB- ?LmU qI>CB.!*~Ue4 :~F:fʎCn>l`a#o[X'obOS$)f9Zm.JQ)W;k}Y.^;D`?OװB$؅AF/ {\ifZ/>gyp@^go5һa(d9)y]^;;/0&JL|Y#G> O)hi?=G&&?_bRpiR2ʹyͪU#7eo 9 D^;lER%;x)ƓMyA+f)35/7B"JL/~C1ְBZ$G`!,ZB?C* B\d3w~7ZT3) v*xe8+d!hfnoVdoGCIraovu&y]͋} C %tU'pyX dBvKj`LPl_D?q~N#*/&~ uZdVu%w],^|egUiQf^@&39فvہ'/.GoYmg( ;`[-f(Z.2 dhIGX&*g]@7/ ' "~^l0EzmIWM֦N@[tHׁNXYwhů*/!}diJy#_|&:1&Pt$Y\j. ? 9KO\X;Gkc[`=:Ӓ<[dI9xo> wH,_g: %$:kAſlϧ $Aj ,FU,e6, +rS XQ;Ai0/>eioqk>@H} +4\N|6$G.>7M2a:J7P2zOyF}G&wPj 2=0͙fҦ?HŽ&GqS B Pb[0Xŧؽ 4?`:{!$H9,zj2Ax/=_]H6- q0ָ@!9$H@CHSG'Ly$Ⳏ'./L{R> h/Um ]n =-r.P $ޤc5Ak&ߵ<ˊI6aqt*;yWߞ.xNNY.lBbE"CKĺV"X5$?͓MXVw=cb'OI; Ř0 abU'+Z3梇4di'RYjPS'Eo[rmD_#5 l`k1h{ )p̴(gI7X v5иO7pi$UHš,70N}c4i j;T0^vqhXn*vqE.$(ⷊ[o|riQ֏O?5Gw5~i^~L&^(#_Hs=Y um= m ˋڅ[J۷])xP{[2=eiި?mp+^|J6Zm?d/B~߆qv\:r; 7PѲo[ 7 <$a[$-rzG0Kt #(w7EWtn9"\u3& YHņAM^7tWbuV$Y}?mPw$KCV I'WȾ}KR_ 8ͯM0aM J hܝē|jK%3zU.ڭf@tW0 i[J1_mސtf `lٰma$(? 5ylmf:̯^23w=1B/q9]jp\%)ta|[P29hś$!y߅/1zirY߄6q`Fǥrzy̟dڎ{r% S]Y 7M 0 (˪͛@,y$O6S]Hts dF}7P ХB g1kz"mQTm 9KpWGtg*7 ൖ']ˡf㺀ߛM)騸ϘwWoEn [h>[M\h/ Amֲ7 `uV8 sl=troOenF[S2ӖOe>p P ]`8oK:]m6?p5of~K6adu߻ dGؙgkz=w,{ P&Ai,-^+ĭu4e՗JyݙU`C4~K~*] U,x5(X<ko.G-YZ#ꧮߎ-jO`aC  eMCEV"@JW>CB/V\i`۽cgn "=X2# |SJשs/xe3$=ilU,'L{txf^ 1ta|aȪ/O~#Q2ԭr)wlܟ|ĢFb@#H_6|oku<ݙFn[z>6_ڇg;?ՅEN|E#xVLְi8$ˌ`<`L[id$t%+J3wg^Ox/lh?.x AAXɿ3H\`2~Yu°7e|)gPk_"Fuj`[ߎ yO6!vGF3@WnVo!tP%2½\SQ5tNς3a;[_vhorSe=Ax=f -YkA,~Է>1H~'G@|A&eQ/ | x N_La,{Ms-7ipYþȌn~ȦSA|ͶPTk%9LHule3_Xc0> STW% wUkU6CdQ 38aBzl6CX כub^? Ⅷ-Y/|M+db˄tmcz̰:1ޖylhjpflMِтk̰*y ts~VIENDB`davmail-6.3.0/src/java/tray128active.png0100644 0000000 0000000 00000017645 13407015637 016533 0ustar000000000 0000000 PNG  IHDR>a pHYs  ~WIDATx xMW߈GD$"oMiUTV*)7 brF1ro݌LR3.cRa#OGH"8}}߽>||}f=F72g·G k~b'2 A @$; 1B4An ^wAx%{"3 ID -Ѷ*6MؽWM(~rwDoLAN[xQw s#au 1yG]' [M] _5r1n Gc^#dD*U@2TkЈ!%# w10M%qH*#wh(;tGCyٞsilPd8]dJlT$~Ywb|vmj1ݡC3%>|̺|X Mq\`-]Y{91V}L>*Y>v{G_x\_yܕ2jM*7Ag!Dشt U@Dҽ6;sHgk3C~͹tLF}G!{|B=l}e6l.ݲ'Bn¦6&8"qW45({~Ч[q?;i6 \2"a"O'4&>Yz}C}Nő;i$s<'ifO4;3TYſ{f\6Wqlr 7`0;Pp(Z<3_i\Uͮ^Y IhN+QW `\Nj<-fJ&~yvᙚكJ׋oo?ќv7}z"_(~|4*od%[6bO,է҄g5gS/}#w θLF%if K RFQ|Zs<蛌 ͎V)7^-k&wI??~)EO1>tkYNm<I'>=Ndzb1-w4(%JEy;>G5 X;*~݅4ӳt_7L浟J ZIૄ[ =D{˂6}1+X,3>k13S??xZ2A2ְ A8?S~!inW婛sl޿$7 <^O˗dA?XƩ7sM)%O\#98i`;JG^y{? d*#/3lX&<`E~y:g p:T-q_, G)EڂxOZ`M>p/ʮ'Meڴ3^Q"cmt#v¡ b!CG C/dl_Գ99IwGkL哳]ltAԏJF `a/%aNoN<կ{J'o0}+m˹9CQǁp) eG|K0+mJQx5i6.RZkTypP6B.o0}>Ǹm.tP.bmbAuN5|;: T.̴VTGCGʊ5NE5HYcr e5Clt?$ }lr /޶]YQMQ9rNlZh*Q6KVpr_ht +^nƊgeG=Y9&T}5ohCm(GI0 {YNͱL=}(SM tL#˟=e2vцU:Y2 94zF_3 3)BC!`(NvzMy>|2S5Gi m*e4H`+[g[ %6 $HL=m3TP}1!Otu@`W..dwpDm:ECwYQԝT8w>}BqBꩃYCJ\|Pb0k pQw5+ \|"58|[ip+skj. 1G3CEkRQ0` @8xGPR8͍ Lb,S eSų '^Q׬8] C_7rPz04_]|L/_]]Xvol/STN4\n4vECACmwfa[ɯ.I &_~[q%/J0`+8 (8*S踟9ӛ,DLhvYNC~q_aϾ<>?r \y0m'jK_ k<M2#``q1c2A r&a(%ӢصglfgӲ8||yL6P&A$>U4AcDpsV$Su΍q=C\My͍[6 ΐ7.so O*jy l='y3;0)/i13B@?午@!S⣸卌, '#L1qCPnGm9:Bm'ɩ` !O3;@{%3kͪ7v`d[43;0Ӝ<=AWʊ&'g:dd/h3  LPן9R˄zt%Ps$SXvL=$MOz]y#VN?Qӵ? dtS0ÃMXoyw."(_7W;O`'jyN4F<%@,G1ORӥ.`91ttk[0q&!h{xo`S1EƐ0S˔;T&I_kpr.MhВ\]1-<Db@܁**}"P1 t?R@}|O"~f]0mJ3}~uq}$aA~ Gwa#Q1PgtZ85[j F~% ߐ|}ܥ ^ş֍m݁vgjڿpw7:B[fuq:IS5 ^}/-F}g'PwE/sM+(g+7DԻz4g:)_O('~,@?ƃ_ 1ƍ6#_O^a3߷ *׌v}t Q.rw$>rmwF/0G4;$~ Q]ʼn!OV# 8Zѵ4WD/@G[Nc E>a(_O(+#[?|@3/@Kfup\&d'm(KKiKxn pr!J2 |B||P 3wa2N 4ez_9V5ۜo6\=!|~_~;Bj7|`c 6*㜻1,娝;4O~eW$jB@ҦE/@n+?"T\xfeЍ@#Aܭη+'%,7-tS CgOeL{&ÊpO4{yIOmtwd;v2e8oF5ⅾ.マJm{H+5Ƃn%(hoN}jAalF_>9J`TF{8h7F#A 5Ȏ @;:;v|?2~Dtgܤ’v|gL)B2%Apx |wo聴H/y͉{XC?G2эv~ SԿ{pM|'L ͍4Vl15X~roo%𝾇a/xbd=QhMF0+K'qIhkk669<ߟT?\Ƕ7d"A9}GDVHF4\4\:GK7\$uܧ)rP>RB/@V>}`Al A> r6qfboHډ _'ƓWc1vOʮ{YqgsB?e])-&-v`ZNCxZ8rM7%{v!ϒi%P_7Ļr>'zuvOL1^?Y:08ony=ѕe<ۿ (2+7+~Ҳ;tc)=t[MB|s#!H尿 zleS7Q2qW˜ S b,O  <7zї>;4E͍Z&bSa9w˿CW-HVGR8\ >ҧm7E'zi}eS_LTx]4) -bPKv$z(n̽O3%%J@s;%1`$Zz>]^'yEi;<4rcґl-Q8,lEOB;Đd_x3H 2YƎ"˶I.p/m<QDI `c.[y.o7 zK;Ƀ~:\5q>O+y(|OӻS{|͝Lo,Q#<(G2z块~=2OCtJe494֨| 4>e[NWШ>e<;+h)y=-׉ z-{!@B}Ï ->K {pnYRԗV."3h8P>>-␛Q8gxBޏ~m Atڕ.9őGZ匶p˞|glso( ,ٓcGnSn>1z{Ha HQ/5sz#I?`J0 }_adChePMKA1Ӽװ7DÓh`G/g45dd{YjX󖌁H`$Mh *M|3ӒFa- $"S"iJyaDcD7/ZWwkYN!vLuXdBA-sy%j4OMnrZ=ysx5.s $ !hZI'I,Zl!hi'oWwoa)^ {@&(H $ G t0 m1/ѭ7 ޜSsCk4IENDB`davmail-6.3.0/src/java/tray128inactive.png0100644 0000000 0000000 00000032330 13407015637 017046 0ustar000000000 0000000 PNG  IHDR>a pHYs  ~4IDATx]xU۽)H/JD!UzUQDP EDHGt{oLBH!R!M=sgf7d_<ٙ;s}-#H(/p1010qi1\<9B>\4||3`q ⛳EeBKEAPa7Pe{1i+@HA`@zV;k7T8W;;,%AxiL[L-Cҍo +L?y-P1;>#!ŸĎBQX~>`s*1U!}>JoHBAA;="(ދ_:΂Y$>MM#Eb֎B 1T8J <쌠85+1\c;Aֳ `z`1%&\T'o~XGrs3$`HAojez}ĢUTPP'ktS`wN8$ ‰)D,pњ[/77MXalz!\U(.lB0?)N#M%>񋜺c4cc OFh6pV=~{Z 3.:, x @1#TQ>~+sC|)F{liFP>1*ǂЄ4F @N{G5Y.b7P^Y!^%795 }$c#p1f DGԚ6 A_^^%᜜cï c*̬#._"$q(SAboď}|w<Ɍ 1fy_p ~$T'<uy+/oK$ '[~C|}(ԧ`C 1Z{0dyOnp8:MvDԼDp y~k;HTLbw3;?p"gYdBYfE^|(et1ɿg%y=}@>k>G,I ķ k{S;= x)Ms/L_"7G/l'M'nFb=tϟ 1t?;m3ytI `7qDŽA94ĕ\%An+J?HZ>"6WJ|bs 3:;sM< \|Ӷamh%f2+&w9{=_fl'8uNtD{!1;r{%Nib2_"(S=U^dg w G ȿW}C3)S|1Sjv`].mhcZ"5FnNf%Ir]iH^OG^)toˢ)?XcE?AfqB^׮P؃fAB=@{^S4.\Zj0Ol7L45]yqq)yI>k6\Sm>5,ssFUUzoySL~SV&^<]=sQ D}I7Lc] @-30?$c-\y\Ћ|Hw˜TlthߟE2$ş%4\.^3>:- VK$~ok0rLM2=7dy7$9+{?~x#za{o3F4#&2"ȵo50#/=s蒼^s_G@F `]qof٪ ~+Nk0 jm6?L{$cdvt߹bOi8fͽݛsO993>2HljL@#2LgfLaRR1֚ QkiD#O>kTj\(67קf)_ ,7*0:C狯6+:f Ԟqfln>ҽÒsY 'i{ Ҭp?o]I8ن{QijBZ CF@eZl~2;""?ÚiJOrپTۤ60\&&=Jh{"  }8&%0iFx̳0ݪ 2yf + 7bZf#pL&i&9mǽ۳FlrNXc:MW$ &63aT6]DWM!b~(WI:<9@ `W$\c`5SG΢G:D f0+Bߑe |l @SߣQDKWWo&.Ɂ! )"*˜^h:WHy}ſ0"CY9-{4g 3$MۊL<6cj8[^IE_JlwV =fƹ O'?5g*'P y&?#m M0 $bct#h_(BV~.k^?'bcDŽ# ,k.@ `y1P{}zșFxG]HrZ:HsAXY>nGRrHuDOc?6s$>s*^e_}Vx+)E9sӛYfצ+xBbx#prX av4qxNK.X+%l88K6a_!REt‚OllS|z' *>Ɨqh|/TvJP gqN@w;ZXG @Gx&, #y]Prm(9J>GH}r} PݟiL_+TLԭѬYDE@9p ozj(υs:VtyX,̟{YI>0-q:J 2ȿ1\] BzsؾLgaf'?nA伴39I7-T!5Jxn!I(fME ւtĚR> C %˱!;OPE@B`CN5 1/qf'?6rSӺҩ5ȅ{cKKJiтhJ"D}\׆oze,G1[hoqT~?ӛ`t6#ǟ%=2ߏK>=m=bn4/n%jڔ¸ 7l5t":MY@zX`(!m&ᴥQːޙcCorۛ9O˾U˒K}=DΙΎh)SdL=8ڵ%sgV/\9a`_cl <_dnf9#sA>?*i;l0zf֞tb,[;ɳ{wVI³5kkW%%߾=ɓ̝K:>"'y[K˞Ym d hw]^9|޽t#}ItlF"p1ĻqΊ E.!qqpp)%J (c cm1.Mٛ4ؾ_U` i⮤?mʝRɛ˔O88u*#`4s۾|1Jኂ7_Z8E-!7_cp챊Vsߪ[ ](q%!z,W8S}$`r >]':~!Ue?s]X}OEQОz69ꠠG$q̵wZA[~!;))2D6d*i&Gpkkk[h͚ qb&P ퟁ[3js//_N\α8p@v#kğ,Žܫ/dϤzT߂ Jrm7 "+q|qH6 ~d wm? 1{pٲ6 q@7p럁˃I^&ҕEO7G Grvxqx;KA ZŦ* `۞"RR) ⑱6bfu:t0=vBD&뇫V4*Uxݫ{ {M+еp#TVXI tjW Z:WiXP~ר}-s`p hlo)iSۮsfѮE4|0Q Do 2\/~!1[) Ib [ n܏ A} ,\ܘ`X, 4.P-UR\T<,?pGItY,}@Jb.Wr_f+PEml,M BW~"±VW򅊷1әc,~۶@ hF!x9A;p^申6G]H ˂|0aR!`xhGjxEw !`iicTzn6b-΅WHێUlŜ§7|XgޖyQvRn䠽|cE)['0R/H3v]cO!3w0H9V7)  E7P@j0[ة!W$"^'tbD5TD-kGOg}]o_~3zqښY@ЮR홮W~Z!si)tA6 O b``vZVAKr=$.2 i|_4K2[LᙀGoMbcӟp9mdA3ZұRA ~QK&؇_P|UkAj*@д&">b B{L @+/+>;g$` ;Lf I͖ߏ?6V~s-w8(3дs6{+< +[Xw8ݤ )Wn"ʰ4.USAZVPJle!@wӉ*Y B}sZ|__+\,w5UlBA^c!ea61^]Y=|6v8t+Ć =_1`jXfÖ_)*J7*Җ"v.n.!^{y`FX/#?M4N[3!Ҷ}0PfT'.6>kO;9ya( L+g7"MPwg`m>nzN?WW Rb9j0\ӯfGZFЧ׹ɝ;ӣ*U> /KTN@Nbz¢A'!{a2\گGLlͩ`Bꌶ{@AcAoʱ@^}w P$((DHHMIz۶2 \#~}Rl] EE=(MCD0Ʉs;$@b/^"Ev N1Lbr)ĂȑTXcb؏EsυBn)8ịsiSC|?c֠ (|%EwzM|7ߔkdc x5mx 0au||6pñi䫦>c lmm˱ ]qV\BÂȱBu 祜N=?)xhWÿq=r7ɧҟ ;z)3GρГ9woEgoS8YgMI-^&y>,F:*w'g .$Oq@"05CfZM[Y\н˔)=fv Ű24//gq|du+hG{Yy b-[ ٔL=.nwr PҬDL@#ôx,JP1&,NXSJr>8p  4hdϞ/5aCXWi=Frs;ڋEF~10M2[6-NԩQ:rJ+JkHj#蹂u]A׌R񸈠 8(g+82:gU?*yнň5lַh񃲲`h;Q0P!P>Pgca󎯊W^?aq;q.IM+Mե\˜;=#u3ücx "K 1(eJ`ZXƣbVts{߿bu_!_ŕ-W1Qʤh#H?r1tI$m[[Y̕ v5OT4Ak~9s=?:~e%i'dbDB|<~]HT̡q(DNeIUҮ.KOzQR NâGZenjLˁP E@LD}`q 7+(0BU ";I ڐKR%sp'ށR(t"ȇOEj A~E _0>id _}u&G,_9ͅ7?匯sA_a-VXD~&PqGh b#ra2 @Jא@gXv,[ٿ>GD pZن~)csΨ}kϗy7o!3WÔ꓏ȇGoCz=X={JaV(R)b*O`Az'5R1]Wq,t\İa땅#XH q"ˀ0!P)C'6Q.,,ʦ1KT"/E„`#zc@GF?+t8JZF$G߃||zxZ[_A&8H)Uv}lI{؊y= ۀIF|r>n%ТeF^:5ve:pmB !LB[\oZX3A[{Gf^ʾ{ zHCK +sq^,r+%R, 2A0=_# A̢reJZ6v#)nŬ8W>3J>|jmWtS[jd2gVc@ )5 v )?s&Ν˼T D^0cel}Ye(*2h^-sSD6jP5A6O Y0;] R D%bZ#aΕuA:So`)x|U>,@σ/}Scq 0Mfkc)}={q"[߮]+ @7X8S U(p w%5~¿/X1%^ Q }3ٖ,o"T]Byu8yQ ]D& Gqt˼q)*N  y S40׃L#GS0 ny 3;Bە6Rİ**~\/9%Mz.ZU קԦoG4'5![m2g  {NzvOԹu@R=DN^N ߃lO8@ V؀MJa+V's{$Fj*B.Lg| HXFM͘Ѿصe ! ؝"8&1R:+-g`C$B#doܐ$D*܈ܑ{xwxyݿO+X~xoO" X8a+2?,|~ 6(rVoB-+VMl$wpY(.yN1ZV#cGw) A:+o࢟E}A;jzueUBx Pj ++ SzlKij ^"&UqsYH8I_g Gm5PTɏ3W[H\)A \׏pe"S9U1&mAmTt@fWA?/;~J-!aXP8PC 8Ax($!Di& i_N"yK6 $]t1jf0/:V=T򞯉c3 mD1 !SȄE±Kb 361v:4jU[-[>V(ɢ`ʶؼ )#G20`Hcp)l.M,-cS_M-* QG.z}3^_VkMԱj|:IrQJb7ąie~Z:&>OD(0mqstIUqlQ a!rY˷q!հt}c:w6ztT:/w}`I7ߌT%7=èėxXk= `|EH11* *z/_ա䊕`z,~3_֏*Y8&DD1}U۪ZyyV:ށ Pr*Ubb*jͣj5-{D͊ꕭ/REXΕxJB)5|E퉯d5R{WE],X^UU TRuMvd^_[M JV-eRUEmlʼUKodIΥJiO@Q]FIUeZ.(*,XfExNЦF vի[Zբ]*ҫ _+Kܘ IENDB`davmail-6.3.0/src/java/tray2.png0100644 0000000 0000000 00000001543 12616753354 015162 0ustar000000000 0000000 PNG  IHDRagAMA7 pHYsodtEXtSoftwarepaint.net 4.0.6cIDAT8OumLuƯnm[Y9lM>!UĦ 9L%hc5Gs$RVSq:m&::Ayx |A9kպߗu]<ѿ,Z8+0G}u(]fy$/Us8yg1NC%/Wد œ-OOhlD;EĽh3NdPO =q0CVKJMG<8oTjaFܶϘw zMx1,KwVؖq*Vn"y wǠu՛lnn-CUHŇT^j#xe`DԯYM<׎_{^F\܎:B{!2W٨Ӡ.'jg t ;ɇ$\˽KP$2\}SpWT 2BOEAUD? ((ObyDBAQ턲Ɇ)5D+)";(6409"#TOŽXmbv2c_ɛ+t/cv: o(6TmZ<^Yl̽bD.=E\R)iY< e{&TНFzjTX8Z-uVjl1rD Km~Ջ&=ޞ**˝)ڗKDF%*< lIENDB`davmail-6.3.0/src/java/tray32.png0100644 0000000 0000000 00000003545 12564151516 015243 0ustar000000000 0000000 PNG  IHDR szz,IDATxڭyT?FY$R"4QShbl0ƥTjԓs&cbsҴ$&D=*i&-&KA2.â 3LobwΝ޻z?h!OjllljTڔL:ɢpPxEZFheY=ߋnG$)8?Jaߏ#H%=E(8_Xx{<^wO i ]:&#px7Y'X~ĝ O_FdXp~-*fSyh] shTzpn<~~|,A|yShdZq!7nW4gqgZKKE6RS zxM~8leѠ!8*ŅYh#`xgYhs䬦hY6?1Y0+u 3;q yw ބPnW$l9-ZP:w )Yg>wQ-42]#kp{([x8>>=ƌFkVQb[ Iucl}:å q?D5^D} p48O 7Q^㋢61+ y>$4 Re~f6%1 &֬p^\pk,cz.nosˆzh\7^O`Y*GR?E}S`kI9_|KofrҀe"Vӟ|vy±(ql(: N%9uWھ[-bI%̹q"mYNsHNr& =/V~V!`J<;+s O'[v7}Tǯa]"V+DEUm6 9oTFۇr Ƿ`½䯦t_(n,_CȤL~T>"7\-EC)N?ޠ)y;9=ţ]4ɉD'set\nr67r75#Uޒ.s?@$וI|fKݽ\H]naԔ4tC>UWdb=Dd>k(6ި.+'!ZeV{v?#f* WxlصYyo(t4)G=M~gX*]2ʇk1Ǎ@^2\_G]4qΪrK~"gEst^}/vÙYInSv<T|:55Usn#1k81J2.EcȀ6A[vh+60+wF hg wq\度)W1lE=w߾c=?y vӹRUߔb.?){2! )\М5fv >Zi]nڻ \ŭ&HmpwM~6;.ԑ)}M"؞8OcAjLGg4xx*:KTSyY9-bOlɶ3oc\Rp{d+t|N\Lfr[k!^^11cil w#1Z?_{66 y^$i$fh]0I/4`)0:a1ڗ=Ni{ DxHC=! [)lt/֫S?tjx?'j=Pt?/?IENDB`davmail-6.3.0/src/java/tray48.png0100644 0000000 0000000 00000006360 12564151520 015243 0ustar000000000 0000000 PNG  IHDR00W IDATxZ XUǢ웠Ēb 2&cV95KS&ccZ}eL.iZJ i. *Ⱦ >cy =f9ww{{ιsr?q:'ςa(a ŽZ5 M*Jոw״Z\άB,4\ '<v(~=[O@mV )T2 fAUR;qJ :xE5} x:S &c3m$ @y:rq|X;Qi$zD3=u$ !NJ@N*&$FJ*#Q_I@Aj~'rw5)őxDZ&&`t;*ˤH4 2Kq7<mD86*$YNOGvPJ8&L|lG>f3Q?!z,'o&0V^|֞CSFiQJH\mM2JMpaf 2Tߤ؅ڸ_,s/#?WBt0+((%niX֢^-\4ڴ}bd=ij(Lа1  };iˡXK{'gG7\xp&H͙c})]oU*O{C)p2oi4ȹ zm-Nw7"4,kq.을yboh6|%aA;ۛ}\"5%$(8ρ=ixZ8` NEINpUS8=+F(]4Rq_QTJ*#@ۆt-NFޫ xFI0FZ9 㭦f;V OT`ͲQ hWaJiw@T oBff;4vϙßiͨ pwԕ?@arB'j@5u=Mtb};Ԫ4š%şB:x:JYDz8󟞮np1 @R!)xG>iLH:?P q71Z"VO/ˡV /4n+Ih7 F2TujGB)C^Ka ) \t$\1|D<.nPsEH\ j ƪ ;vqp1Vȋu8*g& Zwq&nF@؏~h_EDy]Rj";QPZJYwO\L|G&άB)m~L &ti'^A˨>6!=~tuU&4*jYDf eȟwEX%$-`t9k?ȵ-6h]'C3M! U3 MPנaZ[ǧ"1z1FKBB'1Z4&r@”>f QN@ Vqx^UEо=.*@ǭBeQd! !eBMměp ޱ88JLpZiK,l!gELz+c݊;촺ʄhrλob}£QxT٥X|:+:vuG.YVtjAYY>iK?VE{c8:Ėр ߅6Jo;RnKE+Od'EwPpb Q-LHKyWCQmD'%$^v?>Sg:o,YgG+AVd_cU76M GEP%~ՒSؐ_hOMj86zGvI% vN^aԮӪsĢC+CPy,gp틅[Ǟݟ %x~ eʭq}E?[o^l I83bb֡>ߜ~,dmЩtxe﷣iI"U6 H°ndtn5eځ[4 ոm߄Ħ?>+e`Xh;BxFN(3fpyz~ZXb7?lqE$C j8p)ޛOJƨԝ{]aI#{6F+͟V s[`x"3b34V}=P1ji> Dw&YَFƫؤ(  "?gE5BC]=p_Bi38j޹+ͽgnEs,⇌GHxݸC9HOm:}YTʈ 2G:Il8`h w2dGx Eq*} ^CED.&~5IS eGwb1y0l5Ī[It<Cp *_XuGd=2T587Y SBD9'bx߁"nC%̓Xun}MI81;na0| H៌xa 7`~@ =p|j,t@RG.z}YpǩH3 bM Ĝ)}N~$T9tf%i5xQL!grv2?ɔ^jX˯EXM@ u1>9N=EbX@HEDķ\Lv9ʒvWjUÉee",ϰk>"`?x8@"b,BSrViv5 3ըWS,ݰig\&vLʪIs[،x1HH@\`n=d&X{?^J?zfu㏟'؂gލ@mҬhE+5BxCG(4UVDb:dxc#[?q#.>ؼaMS07}?Ivԉ눜ԩ)$1MZ?/\.ViʕF; G"XoO/v}Ə5. ;D!-ڷNvqǎu`UE~2:;?'^绺FS^?Jgr{;RM]I-8 񐨮YWvϏޡ)FFeԖ@D++1ߟJg:zz~63]qk{w䣯] deۑT5h'γvYvr`yW6%PZ 65ExPbtzDRښp]1Z9lVrjףx]5Af7Ojo-v{,<*DU :XIJԹKbǏ\@[7P!_@zcgR` 㡰,ު=ݑIENDB`davmail-6.3.0/src/java/tzoffsettimezones.properties0100644 0000000 0000000 00000002136 14503245214 021316 0ustar000000000 0000000 # failover table to convert timezone offset to timezone id -1200=Dateline Standard Time -1100=Samoa Standard Time -1000=Hawaiian Standard Time -0900=Alaskan Standard Time -0800=Pacific Standard Time -0700=Mountain Standard Time -0600=Central America Standard Time -0500=Eastern Standard Time -0400=Atlantic Standard Time -0330=Newfoundland and Labrador Standard Time -0300=E. South America Standard Time -0200=Mid-Atlantic Standard Time -0100=Azores Standard Time +0000=GMT Standard Time +0100=Central Europe Standard Time +0200=E. Europe Standard Time +0300=Russian Standard Time +0330=Iran Standard Time +0400=Arabian Standard Time +0430=Transitional Islamic State of Afghanistan Standard Time +0500=West Asia Standard Time +0530=India Standard Time +0545=Nepal Standard Time +0600=Central Asia Standard Time +0630=Myanmar Standard Time +0700=S.E. Asia Standard Time +0800=China Standard Time +0900=Korea Standard Time +0930=Cen. Australia Standard Time +1000=E. Australia Standard Time +1100=Central Pacific Standard Time +1200=Fiji Islands Standard Time +1300=Tonga Standard Time davmail-6.3.0/src/license.txt0100644 0000000 0000000 00000043103 12564151515 014644 0ustar000000000 0000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 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 Lesser 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) 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. 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) year 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 Lesser General Public License instead of this License. davmail-6.3.0/src/site/resources/android-chrome-96x96.png0100644 0000000 0000000 00000020726 13147304314 021644 0ustar000000000 0000000 PNG  IHDR``w8gAMA7 cHRMz&u0`:pQ<bKGDtIME5e wIDATxypd}?ޛ`p]%VH2m*"ƲGIrl9K8RNvD)R"iy{'`? 0IW;7}wGĭnb{p8`  Uu߃VxtxW GGv!k=kpaC̿ Z^A 5.` l:{ 0$!"0*`σRQs0S%Vp,S??y3|<:)׃h}boOBo[>h( ' X.ML#I`HJ5M<+`ȗ,}cOK|- Dӽࣞ(Bۻ@\s$> Wo:-,Q NpLH#߃M^>=26Miފx~>ș4 >@ q3~\JB Gk|]7`m媜R+K2c_C#Ж6KR#J NIfճ<PYI@B+2s9%ʫiAˣt4\!cf>H)InJ l5-BU. ٴK J&PA`!kkK^ pOॏAɤ5dE]{o||ǖF$VMж)o Lep[!]pPanO* ts `[O1+ s;u][>=_W]> DW zhk_dzTXwgb$aJ ]l^(A-Am]W 5YY;M1max4Qr͂$Iz4C)]$hA|eCDvB`#[y hasn/$ uZo\݉ /Dh)-I8"!kA1U q!1#7tS5rsѼ6a'N2L}*Ͱm ;?{5x Zm\> 0ѴRY & Mu[Ujɫ 6hs8}3l a=|У2` >Ḅa[AMћ#ζiS %0k4DhMKWU|h!~xNH-*[crַ7k+Ma Y/gL_0,ڶ> .nvzw[ԯ~q;kh_Ⱦ}n5M5onؒl6΍`~] PkJO{Ǝ%<" \v4?ܥْ6eYP!tW YRC p,*y;1v֔ ^@-@.+Uy'a;93n#$[ bg ?p_(^9U DzB#}}&J;l[, )Em$tGY w/<>Pp%74Tm JhO}U J@z CҎ)с;AYB))졣=@'ʟ3Atu0s|Z!)l^y׏,yU y/.V-(&H>W{\/ש6B}Ph4zz5W% Jj򢼨!7. M3Pr=%U8uJ&I~tR;8:` -^zQYGMgM:zf /A{`FCn[_,_ eH]DӦkzlg qCOopʜ삆 P&CJӐvҾvŚJ6ر#hL^'@YM=!'t2ԎD1 qR7fGc%I%=ۖڸqEQʩ{Zz:37 t拪 #FqqPnH/{YK`EA)WӾ{?+H_ $/"Rs@oCX7r <8˺ x{5Y 6)\cf;4e>V|dCgfy)-0h2t!9R%0 ¿>=r-D%XN7)]cߞfjS}ԵzJΚ=/&&+P; NJ/Af<U**d**+Z={Qk/KWns$;Z˪0u^"m?]\E=Bu̿-%SQL\#we0XYÎ;%Tl*<F @-%184[@ Zm ΍ 2C6-[~` G/2FBe-X}Ce39"LJPuj6UlElf]WV)kA ~eT讎M ´O,{IjQ6-hwȹ*rt[#` 3=w5p`AL'$K%YX7rUҦ͔]*/VL9]c3=J5XPDvYOY%qrWӶ͡sOL 55'q2+saBqL{L`$ $M1iq[9UP' `*Ztv` JkOͩ*Gl}hwEM@:ϿFsZ{$Ȝ0*NFl`Y˩bJnB`GIg  Jк{4]U*U$D ȏ0|8Co7pBPd'N}@t@I;/c0ljFfL$lSUS-'Iq^Ӑ9^ | %bW=C%+f~ꎝSyYhX_?MId8G \ fLC bzQCKSvB84':J}ķd\C\8#Bv#Pb30/ax-K_qL]#_}e0!wJ!+nďz+茰>Y| Ӕ-OC$>0`y%@/39Yj8&ekwp՜ꀯ%F랷a*(7YalHU~s|#j)^P.A-~эY(N@t`FI`3\˔Gw7tb6,@:TR\͛L̛^Xq`r8S,6` ~tR$~ ^.;6@qJI@٦Q9X@_cb$ϳVinx K>?=@K,9?s|H.@5Ws ]00obn#2U!jM])H1v_P>'A59~7+lW~a-j'81 X 5;9=YYӮ1@*)C,|Z`Oʫt텎\s} /LRF $NMsm&"配&ad,7a6Nȏk݅PS:6Cok{/JM,g`$*XǦ8w%gyW'y-QJvy}8H7M{Y_aٯѳsk>ROAnKLdS,,0߭Z$SW![wW,_k/ޅOf<]e:mm/Ĺ ֋s w!$PE\HT3~\1gET6'ͳ_401L=~D|wkطh#8x Ic9aN*3AHU8WIq~Ȇ4HOhA?F;$W@̢N0{oL]ɋPxU.LaɈ|H%N[ ى3jr.H*;S˂ 82|3_D&>RKy0Jدs8'Q]NIZ( R(O^\3vLe@bMm|0E/`N}Dz߆Z8 }*,C/*߾ߌ9`սfy1Vn?8CID{!a~gi)H\TWxzUwʹX Nz|!;K|$@5އ0O? Wku~޻JH\/SG~6Qar,LK}9yt,>݀Pa?Z|hR@{oa̤.j㧙z_`O_u}kjSː`8ʉo^䥪I hSrm<>UR*:&zch p*YxW@Z_(xKuR@%`{# g u6\=WA!$ 9R;Q?>jFH+H?B$x} p P}' xܑI?\crnꑐadKT;ˋeNF%k>Ff)XP9's$ ]~ªB T+aVz%:Nn7԰̷0z .qHI?~WygQ4 9(xvpDOŠSH*ָ7*{LxԏDu5 Ӝ9rucC&9Ϧ9~(mYD&6UG@aHHA 6mzH.V+IxQ{v5unUQ҅t:7 p,Msp`@G9srR1,*¹`ví$Ԁb&{lѡc>j ơRP'WI{ eAq,)+'arr%ǒ\ uQ\/d,c4./ވ瑭gO+ B" }V 蝴4!= #b&KYF).MW3%l6̶N:h6(Z|tb]\nXcle( 3ScPAT(^3gOp%Wcf#(CyoezPgt=`//LoЃ_!SS0 /̙KP++K,πm`>bI9ɵ8*9)TXytꤹ@DPѭ zDqv쉳3@.ߧ&s(~5je|E )RUrW$NOs|#jvLBMȷ7BAw_;[=^3?X͜ flM`M*2١ li > a, .nav-collapse .dropdown-menu a { color: #08c; font-weight: normal; } .nav-collapse .nav > li.active > a { color: white; } } .nav-header { color: black; } /* force logo size */ #bannerLeft img { height: 32px; } .navbar .brand { padding: 4px; } .brand img { height: 32px; } footer p { font-size: 0.7rem; } .breadcrumb { background-color: transparent; font-size: 0.7rem; border: 0; padding: 0.2rem; margin: 0; } body { background:#F1FAFF url(../images/inner-gd.png) repeat-x scroll 0 0; } hr { margin: 0.5rem; } #breadcrumbs { background-color: white; border:0; } .externalLink img { vertical-align: middle; } .section h2, .section h3 { border:0; background: transparent; color:black; font-size:17px; } .section h2 { padding:1px; } .section h3 { margin-left: 0.5rem; margin-top: 0; margin-bottom: 0; font-size:16px; font-weight:bold; } .section p, .section ul, .section pre { padding-left: 0.5rem; } .section pre { margin-left: 0.5rem; } .section table { margin-left:10px; border-collapse: collapse; } .small { font-size:9px; } .source { overflow:auto; } .floatLeft { float:left; } .notype { list-style-type:none; margin-left:10px; padding-left:0; } .about td{ vertical-align: top; } a.download { display: block; background: #5ACE1D url(../images/download.png) 95% center no-repeat; color: white; font-weight: bold; padding: 8px; border-radius: 8px; margin: 5px; } a.donate { display: block; background: #5ACE1D url(../images/donate.png) 95% center no-repeat; color: white; font-weight: bold; padding: 8px; border-radius: 8px; margin: 5px; } a.donate-euro { display: block; background: #5ACE1D url(../images/donate-euro.png) 95% center no-repeat; color: white; font-weight: bold; padding: 8px; border-radius: 8px; margin: 5px; } .about p { padding: 0; margin-top: 0; }davmail-6.3.0/src/site/resources/favicon-16x16.png0100644 0000000 0000000 00000002556 13147304314 020357 0ustar000000000 0000000 PNG  IHDR(-SgAMA7 cHRMz&u0`:pQ<PLTE-&to#sg>ّSh(;D* 9pܗkZLOڜO]@DޫND֟r؂ $pΛ ܲ ly2ݬl*͓;тjQוk2hP;cݐPGn~ڈhq7 , k1CH?\(yzHRWiޫmFtvt߽{uI,S_~Δ`T. @ҨJ ϗH|8͜>+3dftRNS'mq*u|CI,,*?`pF\ =j{pH1KbKGDWtIME5eIDATc```bbfiY yE%V6e̬ܼ|5u vM-¢ҲJ]=ں&CN斦ֶή^cӾ 'M2u3,f͞3{ ^4{˖Xjoe۸iVm߱sצ N{ٷC@ #G?q(vsbK/_  z?8$4,<"2*:&V]ĤT%hϳ] ׷AY2u%w^$BN[ NL ̂@K33`v {v۷B4]5>Y2xa} .$x3Ԁkf6˱K6 eIj IrZhBl$0B}%Ȳy^yF'"? ,<ش+/~t%E$4QTvwj \@fxP?׺y 3O8w=s_MܛإO@Zcq)YZ!tncvrdUr5sJON=,?UW~apGj mh/@qÈ};B"pGҩ6D[WV ܿJfv$-՚/+xeP$(QRµdNLsYl"֖R5oc :P8kP<f;Hv|!l/fJBxtrm}754=UF vf`!;Ô"H!S%_ ^9KTډ7Eݲ @5qqZ6N4) $HьsN`#$ 훣. "Y0^X R2c]Y1 fO #%rJ@$U%!M(D  jǹ_OsFY}sjK0_EtZQ/U " @JI~0As3\EQLgILc x}d?|YV. lU 4z {*jbmg%n kl"e`d|9I4h ts>X L@iК@IN2yx-D[+kg[=A}K/t,/(c9)[33nQvd1 kLU%{!L" %pn9nCl22kd 6p]鐲`782R:6!Px?o:ΖnFB4Xs嫲(<'Gxu({~u$ÒdT#t%BU9'N" ?Ë=|C45Bm ;jZڇNK٪żl3<&Z[IyExuzg͟#G㻙Q~La"PV`4;-r%:yGnvr8rBx^b|N6)ZQӫpgBheX~HMU_,Hp-xw?ή}<Z&g{J!"G].O4Jp?ڃňW-prpU ^~% ڋ ua+OX̰nqIܠ4+KiBӏ+W \v>?W3dKRa.{nap]T(eVew:"dG!콯#씰߆ ۸fE|ͭ46MдmC&;0Jzw1n85tcCkU)搎;]`j0'e `EEJeW3, YO%tEXtdate:create2017-08-23T14:53:14+02:00(%tEXtdate:modify2017-08-23T14:53:14+02:00ϒ$WzTXtRaw profile type iptcx qV((OIR# .c #K D4d#T ˀHJ.tB5IENDB`davmail-6.3.0/src/site/resources/favicon.ico0100644 0000000 0000000 00000002576 12564151557 017577 0ustar000000000 0000000 h( 8t4{0\yXWSwvwqfw!%("+11+ACKqvt|  5&$!,))=?nfHQEKH][`jdkpsux/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq !! %*1""%%4%x-$%%%4644#Z4444657666)^ 7668>88:/p\bVu&3R.OipT%8TnMQŞ5AZb^Fj5dw_mc֏Tˬ)`LSP(&*DInw`FkgXQ_owyN.߹j BaP+MjUNc};\H-0w;'$&R |1A%?p%4N#MջjzpMCsSsͅfcA10t}^'PPdu6.C?tZ:7qg Ri6AE%qżi21eE!B&le%zo73ed֨fH-W9F}d]J-Tz_kl@JߔkNw khݴ)m/Y#M`'z{'> N7iS }]A-H)1*Ո$ٵ zf)*愿T +d2qE9b:y_ X8ewXKP,N+56άQgB^p8v7wFot ZLũ&tS)eԳn11TK{šULZU:ST">CNL  CVlI08e 0[h#s]5苾Uؐo[d5G>t{[:>ݶ?/8[ۿĖr*FۙAH)!F";7ƕ9FAR)d}noӵ1] 1km)FQoϠ@[֮58/=uUNENQ@}o{S7=Ք_G^`;Ci.JQ+䁠_Zf]WY.!`Gkw8;b8tE9GP˳˳ !^k~pMmUנϿ̒2'v>SH)չЫ:T=֠V?P^pUY~0|mK朲={&ÕiO/._i~ DkSM:T4^?(8[~Wu2\]c̰8zȄ4+ͻ C'}S4KrR#z_;FJ$XW7 tFU 4_V9ֈ2梜E95r߱n׹U(^gyvR.;f?GJ e]YPިJ-vQ%gԒr~.Do}vqG17Hio\Pzaa8=?jkm,ȊuEmT_V*'{6'l Qh6n.ι87Cu{&|UT8=nA퍜%4商 asQΚ܌G{ԹOu nmhKѨf-6RyKs\'bN0kԑOz/ ժWfgܿi]<ۖW~8x}n_VF ?ش{TjM)炥kr3TJuDkz/[LOV!LYiwkO||ї9 YQ!R޽fƂXww7w;N'4:mŴf]9b1TwYXfMyd»='J),~^qZ.g.toշ֫?hE ˃;{g ǻڦ=-Y\>֠bP)W w;aش"tsᲒ<9us—[:RJ؞VݿiVB,]o `17=sK+C?9!c>ZUC[[AB.~ _ ?h5bk&=Gv7wmٳ&7+s2VFW.\i ? o5ƽ񈫈/ ]ЦR7fW杲=}>VsM{@Pӭ4 vO|Q}fV֮M$cBl*<7v7whj3kԗ>wtZbmޙxGZU[ էkc.-%&SJM{h>kԒk_ r 1ݸw䪶޼2tvwK}T9-N5]T]b֨ м΁ڞ뚣^v4hƥ{w)HJJ5hE ΎYu݆X݉4EXX& =iP)CN|ug/[ki( *f.u{}dę3?l#B掦Q?mtceuc}tGM稹Hf}k(!VdD馳AP}ԊzUe:R,+M'^x*?28<ӱ5݇kϯth|CC`Aʢ_DP`wͫ>hUӫ+ (>=jn\PZxK7޼9_cρn1c%%UlZJ)qh%9B>=e>!S[]onnNQ~!ۨo~9zm^iЊ/gGiZ\gB&1%J2'ok!3Eb ~`:zhby-vxںCB:rQuOxfDP(A<̄ѠHq{u!(_|~Yeh܌7#8;/ Ya};?X9yXיD`h^Cu)[: (8i[&{xUY~ΞC7G Ȅ,ۨ eYi!5okVJ<\e9ʢæߤ4{w:Byg5fН,ΤVE勜߿}ksS *.ϖe83r+4 ĿN6A!'6gϰ!l `R Kn^2gL-YR~uVpMIR8I3_Y'hp}I^U_C7a u?{,(vJ\xG,H|e=Ƿ7hVrʲp E֋#b\ŅħBAE!D7eVFDLKӍ_d!LLCcp@χNc^:JMS?޼J%˄'Q0)r]_~TXݼdNA#wg$L.2'}NY?EgP~!rRzрO., H8Vq|quy7FۿʎIov-Ycn }Ά>g"1{)OVa(COerkʵs 0cu3z?)E).\]gUz9fj{K7\5?|AW)EĽeZBSe˳ Fw;_ik1Tӊt!}fbq{kCۦEև/_\RZ3 +**7`T(N5]PpkOvuy6o >W ć4#u)J5C毓M*AEPdCɄ(|kÒ\߮;:$U*iP۝/hs"ZR?J^ţ.~P,]itڮWbD:K\&jr!f~Gl8܇*B7O߬oqR/-J5M-Ͻ鞖<)$7Toߧ#d֊oԵZ|__7]bKsC_Opaԗ+jisЊ"VsysMy~ LDpè L/ݪ_=bAWy2qg'dnq(FDwoxǂw.X,+-6S6!7xȵw\^6+ }s¬Qfq}'v KeuxptZg+,IoQ쵩^\!s*-ݪ/Z#jMij;-*B%Mx|5ݫ2|]eLKN{g[c3C~[$J iRԵHmuիr2n[^Yb4UwKX~ݜ"J%Zm2^移tK,["۪/~@dXn\P:(l(LDMDW_EqAom|EEY[$er^h͐Yt7kԷZɪ|mݢ6\ zUQ{?P_?p3#@2'=|E9z\&nyɜ}6诗T$ gCyGDTqC y&6G1_ RجSv6uV<貍o_^r͹|hwEoPδQ r۲&Mu񊽭] F|UN{ymNN%QxQLlR.LoMe\n3dg)5'l4 KguwJjXݼƽUrV.uؿm[bm ^m;u3W][OWТ[ɲs z!ļԫ+ nmlK㖴_21i[r_'/xX]x&VsϚ_\170Kl/ӆiuH.J-Lv3g.%S`p>/f4s@tP%Yo tM9Za8Q)b/2|,++~^imB _K7ȆJ<\oq t5]fdUh7aGϭALvyInGAzjEQrmR+&"x喥Y %#a~inޖ冯, ]xi\!ȝBB7c-o@Xg'ehjMb'"\_fR2^L ¥v4O~҂}(ugݽxM+WUß(m+JeU|GN=" R˲FIS)VfokLVQ$RB>^۲B/ެoO-*_)p|XyV/)&B x}s,FsN9d(I5\a6q"ӠeᒶG:t7@ t0ӒK.*Ld8e}sB_x}94 MB!t7dS/U7J?<(Ӣm*&yOYlu{>[[ k5^iPeQhJ ݿjğŹ_\1/\ y% պ]:OTe-8hypJ|xk@enk=ucuiBѬQ;hP&q\u5Be5t}g䱬u]\"=?~p"SB=ݔR6@"(jYVZI_[cnt޽f!)3e-}uWsG#;qzGSΰꢗjڞ0"9>ݻ-ަ޳fzk}>Jyd~^V&4'vr?E*J=۠j^%F ߸+ ,%YHܴ$pݨVϔ :UU">FǓ2& i |^r/监}iwyt$/pS89Y.*.ʜ@Ph+f]P>㋬jթO ]WP.eI>UKRQyM$6Xtߺv'֖`'>p:ٝ(J){.yyRZ̔Ilpk[5~0?RJm]4/UH)HpJ qq9YbD)Q fo˕`[{l2 )eAG?.^;37E~lNbwnJ. ?6 `BJg^^6;ܤSȯε( k՟NHl*Hʠ?__v1=)fgP!3, *`mkTH)3RԠ1nNGVf7RU O r 8ݓ+Zb(5 ysuվtLϙtjJ1}'fפŔ6^W7jB&3zoBzqVxIn JT}FV:.Xup1 )E^8ǨT~pӖן)puՐ{]/4V>6%ӌ:uA!NxvvDqVژi26B~ήGٝ 6Rۍi`pG׷5g:MtqYf}JO8?Wvw-q!uy䧭M3fC=;o}]O5Bꅕ<^S퉼9Z݁%o/HUmh[T ^f1Vf۔R[O8_ocͱ+K昴(~bɵ"mmk;W^}[̔N1d :'fOP!HJ1"2WB/;G.I!-J/J8㮪iU?YZbJVdi7Nu;/kifI&4ν"k;TH)3GӾ O55SF.%KRM\]R0m|+-+J'֖QxBrt?)YӫktYʨ@Ԫ[UMi*k>_jSf~|8GNs*ڊC._}WuƟ-/y9N+H{hIAFL,ˌsm)32[3@-iۋ-=i4$ץ>^x',s?[VTf;4?R}QqAˋ#QѢ5ƿTѡÂB<L*8#rlj;׏~RSJ}'SggWJ3K7mt~(C#vvU5^:dNu#,?$˳ϒœjG fTb!ĢT}5˦'욶MGWǺ-G߹x޼zyuz{vCF~¸+<4 z׾{Hȵj`4q35I)\Xc]G7ZA!>p: l/RB>r:Uܔ2⠊V!1Mz[okG>U,wm)R0=gzϜ/`s{j׉>KX#}82>}}G_8'P.+͔HPyvGBKϏ;#J2Ѻމ3(M(O<+7b tbF?u !T9OtRLu?N`ȵ>x 3vϵ5,Q3brnýsK'4pbn =dQPe[dFV!<<|pn>I_TAV9 J|#6 R'y biT1梛wפFLyƣNvFN KkmĄ]&}Qe¬Rv'>=p֧~+U&35Y@']J`p{SgjUVҤGN=*53cҦL::ƉpqJHOi9:M;d[ccYwhLf 7MAXmGf-θ<+ ]kV38Yeq +*Z jֻ*rmenԠ o3c%]H2!pʻ*DGkگ6GSQ]/8'G qfYK%SsSqFg8Sr7gJJ,hF *#FRU &ƌ-/u3^iqRT ڎ"KJB9}n=ywe]YSbH8|8S]'sDdLsRd+K?6mw{A0xvmIX'M3Sp; <Ǻ/f~(?mN\b|{~MřiXfYTY3/EتRеnS3be>a)=^OŽq6ƻ̪yH.y}M=ܴ>tMemq9z[Ұ\+Ns?oAV¨k'Nw}i_g2g5W,U5iYb>q4SGG9aNGhWBfޘn\nZf1 qSI$0Mf۴?u޼f|qhհifkS/L_covy)1jȪOD7Q j`-Gt-]ƻPn[?g]dAVPy|uެ3=pE!Dn(:b(UXFvzMg6zО!{(e[K3+AEU0Fsw~I'n닷dBrKt4co[g*N? G0aI$ju<`vWAfggc@MWք$9|ŢRùO>ǚvg伸"\˳M/6h9beƌYRw7<)ͳҞG78?;y ASm,Kt集3}yȕN!8#V\&21+*W6E_!o芠&oMNEV'<024ʇ->9 r EpcF)Ԕ3WK! 3ܖK +9ۺ=[{z^m6g BOG><^9'CNaIO̔'XvFf'~R6:*pYfAVAN#fkJKwjzC/5GWhGxaiujJyu[s?ZbK!<>yf-R~oQi>$jF C$|ƼQ_Ul\9df)`/& Y=?lΧ3ZR0SzpqG .s?;ٺ>F%6 X/2EQ#uyS _oqCAڿ/sI68dX Ө|TG87|+nV)1h2o -lh5:kdpN)\}ݹ,ʓL˳ʱ<ؽrvmqsfJpk9So x޺W/LX2~iy% 8tS;gjaTWX?YD^⻇jCq!NN3.(|QnUɍil~;J.<|}AsQskG\Fӱ۹2W+M}ѾԊ)UVYc/RݖƝ>wzvÜ܈YL2!./YQAZ_ {vuj?#M\_قR&&zM5ΫBHɆ̩[hnչ?|i @/4.?02YZ9l7?zǬݐB IDATET&]9`l@R~q_g,9W}<%&m%b5__EcZ.iUi tѶ \c#- aQ+34SJ]}!ċ-=?=1?;.ŞN,4GMe9}k=*a)*ENUR}yy_p8)ܼ&4؂u~Ƞ/\]uCgMe%P)L[wN$mD lruQ)b Jk[>+_;&bv~#fҾ?KQyGG20qǟlf.YH/4}C[c\{l=yͻ'-=׾{[}X]zFAJ}v/ oj\{?9ZcP;x3j6q4sd&ɢtqv 0ܦ̔l:UZA)Lst˲R+MlZ+s{|cSڸJ.,+uY1)BT8lwtOGVKe֪V>uo7fm},s^S@g}Gu5uf5V.E>gx)p9 :~8 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !Iv`FTHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATHATH2 :;;_z5k$? ۫t6 @T&E]]M7~x-T=Xm&%QLQČ *ݻ[ZZNV5+Vfs$O?p,_{dJvF0#: kg}7ozcc0.;cڵ7@"oO|nmm_NEI7777_G_y8)Et:zK/[ou:C@"Py7ؙXfD'@I}D\sMMMM/x<=zꩼ۬o~/u~~=ܓ`L4MCZ==;M: $T`$TZZZ'7mڴdɒԴ-[aUUUl1zҥ?uf'>_3o&Y?0n*sOdJt_WTwww< =s;GVRR[o=㽽k֬ݣ̈NnPٳg?CR裏~#uj}衇͛w_n8Ov/F1#: Kx@ ~8NJ 馛>|S?SFAe޽o}+rnؖ-[&[t~uttD>\zu/ϟ?~UUUagg}-[6 ߿}@ w饗 |L&M^۫vX,yyy7o.ovuuu__\.OMM-**ڴijx;v8tPKKZsν'l|IL~}Tm=ϕn *APqj8[VuXAD@Q(- S@"577W{INI/++366޽{5.xGedd[XXX[[ٓ*!YE@JrrrTTTzzzIIIz,,,ڷoooo_KJ5c/_mllKB' {'Uh9v@]IŪEL"%Ivv6zzzxq%sss.]ڪU+ٝchhػw嫋"Si U_)Ktt#LMMe#ҥK``?k΀ H?jii?uرJIRd...r;uqqٿL:Ipҥֲ1L:eHdU=ܢEt%*..fرc#'Ν;cƌ111MD"Yr$rpIwժUQ5jիWRdR]=~x9 X}P[K.{Ι3G)@&˪޲x<Qkǒ;Ȉ^yf+++2ǫ`!uۓ{֨Qӧӛ?qD򧨨(MEˑ;J5\uU]:991k׮7nܘ\n݇*?tP&gffr(x *o ǎ۷o#* yJZ5jT~~HZPeӧs-99wjrWBBBk.ٳgJJƏ611JrӤ͛GFF$ё >SNnӧT(Z (儾x0aJuq2+V(O[ƍ;w96-%EQμb͚5\+uMW*=RZff+(jذ!{;<3lmmF^Rԩsccc.6oޜ˛E.xʰ0rꆇ]]rr2k P:t(ǔөڳgwuT߸8򞤄%T= h_P*Ν;W"dܹJb!΂ ;UPS킊RRYB }}:KEU)A着.Yem۶)Ykx.%cbb-@MFeȐ!ffǏTի+**%nnnZyuTTTJJ kxx3;&=Ν;䒆 vڵyo޼g֘1jԨk׮}WnݺJJJiSSSi*-ϟ/%<<<ڶmkffVRRŋd&@rr3Ν;WieeeǏ/((gJKK_|f(JKK[j}񕕮3fgRenݺ%ŋ3HQT%~ɒ%gΜ!lťYfYYYgN*Ξ=e˖ݺu簡EEE#GɅ;vl֬nFFǏ)*))ٳg' t~:+VK\\\LLL󓓓###|-[lpT>;w.D"9r$Dqq={>*!P\vٻwo&@-mȵkd7OQxi޼} ---YGD"ҥK@@>}Pna8T]irrvڊ3R4!!QF֭[rC qOݸq#WxΜ9dNn0K򹹹{Uj$߬Jׯ_'4lؐ^XXغukrvCqѢEd~IQȆΝ;rCz&&&]̞=[Q">|(~Tg#,,,deZC>>>d ʭ0 _!.Xٝ`kkz8StREq&&&Vɓ[(ZQ t x\nD"QT`9s&%o߾K^F(hxQ(M6GeU***޽;w͛0`Uرc!C,\PQ`oo1c0=[-G+ݺukaa!3;m4%C1?}tĉ*nAݾ}H$k׮UxŊҽ{AϟguM044d5v\B? uRSSYOO)ST7ǏiE)rpp o***\Rݷox`ussSF;;}W7lB_xpϞ=cf;v~ERsNMmFFݻ:/)ՠkiiyMn߷oYO>8mll_nJ*Pv/KooZSkEEEHHx ݻweUhG QT(ۭ֭[v*Saa+W,Xкuݻo޼9++KtڵWZ<󵴴٠ NIxϟg*pذavvvݻw+K2o:t0?'OV1Y5"+VhڴW^\?֭#3ѣ'OڵYnff4h{C%.$իK.Ur@9!/GH2U֦MGHQoF~:rH:/)ՠpBEJb'h:u4hPI(Zp䈗SeVȞXiL''''''zٳɷo~۷L_{Jgݺu7n`\OߺukS,cƌ;wɡg>}ү_aÆ 0oh)U,"{}޾}{.R2 vl'OMhU%̌]z,~9mmm(jӦͣG(̼t׃Ft'U>PVPڮ^z/_v؁^ bhdC5,"{ɢkffueߚc:Yg܁m5vI]у)x M;u?{nkkk={sP~ԀӧOse IDATn%KJ|9٨;U{y_"K.[f:!!nmuz)󈻻{-gϞQEq H *O>ÇWod?Jc  WTU$Ҙ7(o9Q(NB?gfWD~zǏ,Xj)ɓ'߽{HǏ&\u,9^q~=B62/>+E>@PպukVVA5+۱gJWWEnٓ)f;w*yԩSZZZC +m;TȺ>Y={$c#W*3/;̙3G4pD6lپ}7~-Zh*tٳGy`CCC1k͍ ""Bk,"{}!KdE *IGQ>91σp;V N}q -G]rGFQoP boܸ4PH *pY]\\,--+Wًvؑjܹs$;V߂ʱz᎟u1FFFEO+ٳwpp Q!wJb^.YE[nmkkFFFr)))d1I&0lXptXq[YYjՊzEіj$ZpW^{~e{zz2׷؋/2?@DZPauzao@/_L~111au=bfZ*rS+6l3nڴIyT^"g(L>Bo_8UtYY`K>+UR;Ya#ǏWX<|tttpp0/,"{&L`RŋGHQԲeCnСaZlIβFeh DGS.o .i\tSfpIgggE3KJJ5B޽{咒QFc*?!z^pdeS*v˖-W>|p=Xk8}f"  :b)--2e 9׸q$Tm۶dmѫW*z 316.җ=YkS `c$ݻÆ|H¤InBBB~WE_x1m4,"{ӦM#[ ^vMcڵk*fffϗ z(Nz,`%+g@;V SL!ٳgEŋSr9 .)Ώ[m۶G>ёlaϜ(H *EGggg2dҤIqqqrۗ)XSedd?B6jh@OOOOlϞ=1bҥK隣߯\ʊ|9QTTw߱3%&&',,Yҽ{wEӚ4iLgggn&M:vJ1c=z,::{̙;檘~񞕬J_ڛ6mb_ɷDdU7]vVyyy P:p޽dj%ȑ#BӦM?Wd?Ok_xϏl7qDrEQQ̙3ׯ_O>x-\PnT:u"3fׯY|xgYڛ7o&81cƜ>}\RN.]tҲ,===)).jܸ7X\\\Y;w RZϞ=Ylmmu֢E CC7oƆ XYY*~ٲe7off<<<2ҥKCeU744|]JJz3믿ȾiSL!{sppP 333ftwwwczvc ]yoժս{XC@r9{MٕH$...VVVEEEϞ=`u9h E@.(KKK;uڮz깺6mT[[;===!!RVhhh qxܹsA h&&& 4MNNqkC?~\nE믬{&&&nnn-Z(//-xzz΅qQc8/--ҥ }Fkii?zHQwQQQ:tP[\wpO>wvرp#F`[nUb!uuV%1*z=Hƍܹ#O5kWW*d$%%)7L7oxnܸQ6Ǔao^m~~~d 4E+ed4bHH%ڵk$aU:l$R}!ǡY}V %x? h_xP*Κ5էr,..Vg.]8֬Y3llr]Tij:7o%Z]]]8QQQjV;R?0XK*o>2x~\]]gϞE:\rEy)N:G]r%ǘ=<].6mڄV/A!v@:mllN:(Iɮ]hyH$fİa•#Ɠ?T(244KHHXjU한:vXTT7+Wi֬kvww?z˗Ul*~Wj``pk׮yyycK3tttϠ YFnTXv_էOmmm_[lvvӇ{oJxbVΙ3صkWkWWUmFFF۷k׮)}}}//g?~\Q?* !899ݽ{wҥrsxĈѓ&MbկѡR_xs޿ԩ^T[XXL0!&&Fa\M6ze.PzӦMoݺuڵ)Awp:۶ml2{d111ǏZK[{fmllcAmTɉLNN)))]a :tb{eggikkׯ_ƦgϞU$>{,;;[ӧ' RVVօ RRR޿oddԼys777;;j%##ʕ+/^ӳpuu iEVV͛7SSSsss?|````bbح[7,Q tˉ^^^L?ƍ;y$899q; x!EQQQQϯSyݫ111yyyeee&&&z"5Xw_|9!!!33S" 0@(Jv P *ѫW/fhjmm킂=|j@/+..&K>2eJVVVyy9chِdZj3F_T1vXzm۶u=>>^n4쐭W^ @hhL_=z<}YܣG͛7h۷O> &;&zغ졠_aÆpKz9ү_?Rr|)lllF%w5Y!!!(h'**j׮]+,,u֓'O9s&3# *\b==zhѢo߾mڴtt(蠍  * :(蠠  * :(蠠IZZڙ3gbbbԩӠAwwsj:iP䄆2[vvv`z>(篨h'N(..f ?8@ (`.\iaaaL88qڵk;;#FSިQ# %3J VvmrVWWWS) 8qℎAYbEaa!=ݴiEi6=CA7nCώ;V>|P~o߾Վ->>ݻYYY>}277oҤI޽ xI*/^.rrrn߾ٳZjիWEݻwmg"/n߾ѣ2ccc ݻ7o\  y%MMM<<<~VVVyyqӦM{effJ]ի}}FF. 5C =Űp5I"wɒ%>'=maaLQTii Ξ=› >|(**N>3Oիؔ'&NeV5l/Ga7h:t4iU\ٳ=JO?mذ_%ܼyIn|~-EQ$22NIѣG_|]'OT)ܹ3444??D"1bČ3V\ӧ|[nJ)e={wHw^k׮gΜ-Pe˖]2?""WBQT* ^|%Aw0>}\|KQǏccc}||,7զKC~=dJVeYlЙI|ŋ0=+9o޼ŋsʕ+F[!;[ƍǎkO81xI޽{>}%7 zMLׯҥKJx"9{M%>|2ѣXe9}w3~ذaCOIIIF*..x*=X),,Mf͚qFrɭ[8䧟~ rpp`-9r7KMEEk-UK~yD1(%ނݻ6;vܿ;w$?ddd޽ҵ4h@nfhh8qDr{ұc!CȽѼ̏=\:^۷o3dڵJXȈw^[=fwZ䪨 OXX=CO߽{WntfhS%?futt~GE!EE*W7-K6mdKѓ'O%%lV鿜ݯ_N>{ڵSWWWq|}+@NN| 쬭v<ܭ\J"_*3N:4b7ԡCCCC)TAtaaaDDݝNri&%X۴nݺQX*G>+s&ȋwDh6հ|eO K_TBBB.b gTD(ҥKRW+=0ӕvfʷW8L])W!2|͛71=K$aÆ9{AUS(W۶m~AQMiذ!y0W}}}rN:lْMMMF$Dh6Erm䒉?)L"-z)m߾=?dc$&&F:g!R|С[F GQ3!2ˋճׯֶM6L+<`S IDATH$JlT5ӧO]\\Fy).#H|ioVKfZ<..n̙6cǎkX%;_"4pLI 6"B Ī P)ƼW"4nܸ?'cǎ|23+Htҽ{Ν;;::zj:t ԞF,4iҦMFW9}4S&(Ãٳ:u(*..iR^=Vfaa~ИrƣGF9mڴ[ޚjυ.k1l8{&TȮW߿O֙_cTQo>rf͚ر5DHnnnLA%:: eߟ k.zl߹sg~0'}&%%]z5*****ӧݻwkii2Jz z^D9ųUD"!Ҫ_OR̒ǏtfԩS,PBf"IqBBhԔyݽEtbb"=p!Y'&{{y:uٽ{7WEQ{au %`yJ8/jkl*@DZPaudɼHGQTU汒.k4+[jpسgO\ZZr9潬;fSNQD--!C6%ttt&O|]rػ?9rD kϟ3FFFY(KZ<z&R8)4A>}YƠPTCQTϞ=L4ux^Xi&j|G""mҺuk[[[fȤ${{{JII`f4i!`*)(KKLzʕ+O< SO>UjtA3W^ΝݻǴ ٰaCp{E'Un)?͙=S>j#Gn jɵLEDE &0RtŕeٲedC 2#F`R9ss\]W0-74BL͛7oРAVVփ(4hUYF.BuȧEZYYԩsyD~wԥK:$~2dYuADk.q6??̙3gΜQjȃjii|_ڵ۶m/  kkÇ+ ٱc}F_"I&ڵiQ^^~5zZ3 M +QdE}1>>jo/[ `ŊOu9zʕ+y&Y?d)"vvv/^$޻wOȤ'\&5%HÆ #+;::XW^!!!:uVZC Q[]J8t됓GOx<(Kyݺu V) m8jٲ%9+HXPP(jܹߟ:u2&L՜6+W4kLnڵk=z_}~k׮믿飭-]˖-׮]ۮ]>}M"##՘CLݻ73mccSU]2wLҶm}uUQIR__ٳǏWAYUvs:t{pn޼ʕ+=W\f͚zU)Bl8׎9r=-HLRnpNpu:uꘛo]#_Qw^vvv^^vmllz'##ʕ+/^ӳpuu奁Lʺyfjjjnn LLLuf``fʔ)dи8zիWyyyzzz]t:I?x묬 .ȨynnnI-UQw7P5P Jq@&|QjF/  * :(蠠  * :ښN: 2e˖̬ՃL`dzTAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPAADT@tPPt>[ӧOʢ/^ 5_RRҨQ#M'tӦM5HnnSQ551yׯ/_,((JEiii뛛ڶmX)١CWPP`iihѢ~i:Ei/~Я9r̙gϞUc_}&W޽/*zںuRKJJ;vYK.l\ _ј>!!aĈ\J)E;ȑ#B @<`)EML3|j@կ۷o/[۷UcAAojjڵkHؗ)((h߾}4077'g%[IU5#ĐfW< {A%!!a߿'ZZZ:88jTOO////===)))66LgjO穰FQǏ5M۷S||<=ۿW2jF!5x$JYYիR̙3nj ifffmmݽ{wRRR_飖T!00̙3֞N'51uA%000%%mذݻ[n_666[v'%[l֭[ڵL.|IGTTMML3|Dݘ>44ZfMʕ+W^]x0[P&رkbXd3{5BoA%))СCUcn׮3O@`mRXXHZZZV#: 6԰ϟH:uꘛٓͫZW]իڵkhMѿҊYr5''\7T;rU{o1ޞsrr233Y]]]kkkVfXs7::Ç/_,***++722ҥZHg4+233#Oׯ'$$dddЉ766޽{;;ͽ~zJJJvvǏ իgmmݻwor<ʴRzR*痔:;;N@ME[PPpǏ^"ԭ[QFݻwR{gϞ1yoee_yyy̬ Ưx.]Zx13dɒW5 2~~~޹oݺskڵy*ڵz#v'O7,,,z=uTSSSO>>>dj}l$գ(..>|8YVY`I*]q|լ0ݻwΦ~zqݻիd~Сڻ̙3r(*//vĉ?Č;[J(Ν;ӦM۾};EQUt]oo]I)AݹsJ t mYYٚ5kFu%; 88xȐ!\UWM6M___+۷/J)PSҦMu2o-??gΜQrgo[loܸ1k֬OrLFvv˙n5ǽѽ{26mR[zz޽{Y--%KrN'O\d 111SN}*+Kqq+W-Z% .(HQTttY^~]i>ٳg֭eeeR\/_QHsν|2E1qĠ r޽۷o̙3OUP 44iRZj7^^^YFE[[SN7oޤg -Z}vLh֬Y 4ܹsF֭OwyŊr2oSSSw9g&3Fgoo?o޼.];wd^#""^|/Yh٣Gfܳgٳg˹|[*PZ~S=,R{ & W9'(jٲed)EKKks̑"--m7od=ZzƍƬN9zFGG3C__ڴizzz­wEQɓ%/?~<8<3kll dLQTͷoN/))ڷoNOcfg>g>GHHŋuoH._\k+W~5ΪhѢ>L[رcQ* U]M)00lСnnnFDց cǎUk?~ҤI9sKxe˖OͿVZH?u֭[%YgOJJrnnn?lg̘!~ZL2Eڱclj' ͛+kZ1իW\,Un]_>rJɋQB+W={4oc q]#A||| -@^J4tWޤ#Fw͖+4R8i }!((HLDD FYʰGmeR͚5رa( #G\n]m8ݻw7lԻw _?Scee5zh}>v)#=44Tvqq-ZIIIze(ƾzԩ{m ڜoV|̯P(&NAԆZw}7󹀀FϼgUVc?=*k׮zw3s+VgԁŒt)Gܶ?~ 0n8 # X]KWPPǻWZUcJ(d=^wҥׯ__nɓ'U#"""""~W } JEe˖ǎSmGGG?ztWnܸFRw333M9 '|r%~]rHϞ={]u$F 1D26]O4Rj#PQ[ݻOZ ϟjJ{@YTV++={3''gϞ={=u˗V+xZ!:Hӓ.}*Bʕ)Z|駗/_..]vz߄ ås^rʕ+K,Yfڵ[jզMÞTmSߖC?>22ÇϞ=(BF.P*EAǶG5o޼bޡC"y*ہHT믿+W~CIÕ|~Qň.a]#]]•@LƔsܸq_C'''vZ`3ԦMMMUuP?\\\4hЪU={`YHcuQ l;vZ0P|x]vOzHLjwa(E0 hx3M vDE:mС_zJ FEM@@>rHq⬬YU~RYN˗/!{v1qdG ٳgذa>n{ݻ}v^p:Ao~СÇ5H%)Eҫ\ ̏>H$eggjoooee%m߻wτemFGG:uJ#G,Q/f"yyqr .DEEI;*HonoooEtv(={V&2HIIf2yɂ.]:uԥK_֭?55u…woZӳ_fRRuֶm[mS.]tٲe5 hlaX^zBz뭷㥳kP( aR KU{(%mQ1 ƹto߮14lpܸq+Wׯ_?qR[Q]Ԍׯ,c-+Lv-Z+VoMknܹ;w֭իW`-bm@k֬e&Nh t BViYR7AV]btv{/Kpp9bƾ6ydA\\\>Cadvv7|Sކ .ԓذa>G)JPbȊt|et0lǏKwZQFkZSN zmxtMbb>̙3ѭ[ C^2 Tڶm+<^|AhٲZ7xCX`A1RlF:{V_~Emm7_b- QENN7|-~.xvډ(@voo<+W#&w!e˖Ew󭝞aҳ IIIzFVF }ffVŋK+t)iGʕ+eRvW^)"4Pw|zz_~P-Q>;Tyפݻ{n=_zŋT$Ӝ=00Phƍ׮]+4ógϞ;wN-[-_mGF/6mO`ڴiׯ/uqq^'O<--Mzz5ƻFձcGq;&&fʕiӦDժU>uT|.n@#e$}t= H뫦.Hm={tzj^fii9f{{VZIGرc:>\iii3g\bhL???55W^UPU•7qv++3g9299YIrry/_ޠA''츸7n~hggWťf͚7|qƶ)))qqq=zα[Ʋeˤի7rHmgO,fz:HGI-|MC?~f͚... o߾Z}u50ɓ'={V 233/_qFUP*))7o_XZZfee #Fؽ{XgϞ-\]k^^ǏܹCQҨÇӘn@׳f͊%;qɓ'kԨS|yoQ0nӦU v1׭[WV-''@:%77ŋ_;88|zfHgSΒ%K&O'~{_J1޽{KyѾ}&M8P5n޼oVVVӦMӑI:uTOUϞ=3gXQM6-!!''P(ᆱ;s^㱷}dmTO,՜9sƍ'O>}Z!|͘1cjKJ4RVO$ o1sL T֭;h )))ڦ6lho/ѠA6nخ];ꫯ-[ԍ+V0`Z+:/%RzF/z.Vz%KzN᪃9sH(S_ڞx/~QYYY-^xСjCrupuu1cF_[eXkT|ӧaÆ ..4BhѢʕ+[jUR%7o>H7utt\lٸq㜜ɶB ~9s 22+ѣGze]TAVڲe6o6_;;֭[Ϝ9sj3;fkk;}5ktYGںE[vm;ժU[bŋ[h-[BQf͏>h˖--ZЧ .|-,, ]t k^Z:QժUǏ_評J)Sm+W\ɓ'oذ( __QFرCx}!v6l7n\Ŋ5&ݻ]pİ7idӦM#GT[aVzM.X_~QMۨQ#.\(F cǎݾ}{PP"|DDDjjjJJJFF_&MJގIKK;q͛7=zT*˕+ۼys{{{|=--ȑ#KJJJIIpppVZfy\н{>|4gg nڰC ...>>>:f.*߀FVs]x166655UPyyy5iҤnݺ%V;v,::ӧYYYvvvmڴ)-`eF2L*^*;w.ڹs[F//˗/UT) P`jIII._V-z2{&3qDJVVV߲eKddl$xLrбcNJ j1|q!00@tϜ93p'NhK|ё#GJ;Se YNppOj׮ݹsרQ,**ܹsǏ?w\~~wݺuFKc}.[N:F*~0ݻ/^rRz_~( oT˗o۶M<ŎoMV6 *JMzz]###}}}[hѥKFr"P ;Q ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vW\)2 QdeevFC@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vTȎ `گ۟^֥E3-)M9rX^3ny@ 6߼Ts??.ѯv%!i*)Y٥[}Q&'Wr1m7PYyqX'N,gaio[űY鐜oӸ !#X IDATWJdWIʾ8P?kbSE>I}lmY'-4Z'5+Gr3 }ȕ}o?I[ZaZVP͇&gx_с]Xi,CFN7߸wѓ<Շf E-NUݧ4(_tؚ+#תW~ ou+iN^[9&.CJmN:|yyZB࿆Zw52$QVqa}^q L;z~h՟ڬ]JK~ЯfVZ{%g03kX[5?lZHY6uwGŦ)Um;WxqMBn%d^@ħf A\鱋qijR܉9|7V>I)BO2ddvԾq(/?j“ O6]u;Au. IY:yn4[ح/>zQOevtj4hW0MU۱ϴ%6=oiU>\M޳bn9jK~Яf>rohϳ&MXκTWKr \Mx # -/??IKvV&5zַByƨ|}g 6+E_ [s嶡Nҿ-.KKoߙenhռЫc\NL?.i>R0J Ozc{zT._'1=Kq7~EF}M}ԬO^tANi=0半CgU}V,ߵ}^~Խ% ̓ߕiԬϥ]>1Ay?s66Aܵ\Rs7Ɣ{z%Ż=M̬W Ϟ^u\f[I)"~7-;G|A&8[xLVAJN^vjn?z_oaTu[5U5S>z*Ҫ8ޫ'.-bq%IXP&m9ې;v,F6|e\5R߅\9rqv'/Գf:'?>E׍{;#ݚ.vh"M ٻ;OzŻ|clu\~аbyiA;OuR3]6V{SYk=7>TXZǒ3A!>ub0MR6~ovGvzPhnJ3Ū4.nKsiDa-B<&v h{,?h M8|OW_)KsU[ةiA5G+ oMVӒŮ>v6[vPRA/O-ܔOYxӾܶ~բA*ħ~wRLS@Űީ>Nsß798>o_?oix9>IGw?JB9ksBS?_.>Ll1MҢHg}A֖ct$dkigb˧'gGD8ͨH\Zi-P1Rmƨ>/`e!Γ*^@E7{I$+'-]K|prfkw_coiQ͹Kꕋ=,A% Tsbbz*Ȋkcp_"މ.r%aj l*eTIz%y|fuբ*)Y٧OG/ 忞9 2&> ٷ)gi_Z(}`4[8sjU?>|^RfAuԬaKo3A""P1"{ e\LJz5qwWc<Ǖոn}D/"tj,ROR]Tm+a͇75ydj nHD)eWŕZ n/,R&{}qq!2*y t-D?cƍ"q)-**JQcj @ňć K"rsU{u&.Swo&\Iܖ"/88D?cF :N:Ri=0 #zpNL{) At:R&nuާn>e)#Rvz#q\Z xYg(#&5]۲B)F:&Մ'dj @8,%/eho~٠?&gjo UN\[7p5%4.lm#eA*4%Zv֠byv |v좎~'#6y uXKyoi >i=0 6_9ユ'7PL!ѿdlj}g&>gdCwcӘ,Y!W݆ϛHƥ<qll '5?#"JwVz={;q3ǚ a3d ɪ=01Wv^CgtȬF[_|4ݝ'knWz[*.{r[]] ĬyN!r^~~ WmDaBc/O^>hX]yVf|Z>lP _a#nvxTjwGDTջ׫۽ͭ31],ވG}ޕGIUPþܭghڨ-VMY'/K/jZ{m XNmٱ켼j5Ksj/Ҽx'⸹o+-[ZZ:;ݷ4Vv^آzCr:xջ] O#1YARLMF]عّ]_rtEWv1J~m*Z+͵W/Q+?;?rjJӃU5_2z\g _cUU,yׯ~Aj5ݹ[fé`k=߹!=;Uuo,}LLid"+7/YƮ" jcոKg݇ds'vRJBzf^~e-WNMqA\LʳLA,:RɰEu,G+ oG+?_yazqҧ=Ĭ3>rdͧr{96KKN̽\K=jx%gj@/,>]m3"%D/W|Z7I'~Q T`D[nozcR w ; %8јiA;Oj]:&5=p۱(?lZۄeLuTPmyIF əYpN_*Uk ^{Vګc%+Pj%l0ƒ7`Qj+yوYsK)d@5TsמffH4Sר漎MLV* .*%moEJJQ{ZκWʼnj7uw-@T`:RBcApd_Ј@0=1!P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT !P ;*d@C@vT QvPV%&&%%%%''WZvھ]@a*(͛7o۶-<<֭[ڒUX^z۷wMYBYYY]۶mtM.]>f͚lx?ŋR ;wn  X6TKxxСC>Zj 7o^F 777Acbbn߾} .H\jUǎMP6@͛7O0A"W_9rdn =<""_]fM||ҥKhEA֬Y{IG۶m{"哘8k֬+WYo}5dqb!P۷o4hPzzjfǏ/v>|xlljk6@Y"bGΎ0`iii>>[9rd5 vիW>}۩ XXX/_vcƌg洉';;y><}-[N<emmٸq㠠]I矧OW}AFuyȐ!d%[Bo[n֭/^377wppUV۶m}m?E||ԩSU{ݻ_J9sy`AT"UZԼu^^j{ҥ#G,۟>}Zݻw?SGWN>}޽Y4j֬w}תU+=?Ϝ9Si;;??םɱcnjaѦ2rȥK<>Uk XzQT^^^7n(;{k׊/y4>}a,Ɇ k׮H>nܸ>Hw!JYiPCׯٽ{w.]vޭ;J!44[n?syjk:{6mH'-99^[~ZMddO?$7ΰQ C 5EEEXBw+Wn 1c|G!%%!66vmڴuV٪GEEu}:| ddd,\_~o~֭:| $%%M>}رz'===<%$$L0a*zY ЯJިoT.^إKKVVVllZl ˗i;uZZZ>}=*I25jَ֬;ʗ/1Cf͚jLʰa֮]ڮYfhh~;.]ڼyK]\\zճgOG>}cǎkԪU+.uС]Tʗ/P7N… j*Ǐũ=<<6nآE yJN ~vsss///{{肍3fl200ӧң<==={vBXhѣ}M UO>MHHP 6jժumKN:=|PsgggG| } _~s̑fRbż8`oo:uex…-[!%KWy:tm??BQC-v@ H СCǫ5O>hѢ[-J*kB\$ IDATsyolٲǏzjJ|"OOO ??7nXZZlRƍ͚5S U([n޽SgܹS$UZ)SөS'NT*4zoݺݻwO|}}$~ҥ˗]633SRܱc1BÇ]KK˷zkұLիAϑ#G4^G6yȑGV!--m ,z|111]Ç4Hϟ?_4r=@ETf#F?v-YDZnl?߰aC' 6mZl4:R*wV߾}qƽb;v̚5'_fM<6m*&޽m۴]%>>Wl^O4o}HQEzᘙןmҥ"Iһwoi?P(dFґI&iLfiuԹvƔ7nܨU|ǎScУG&L ҦM)wYRBV.]4ߊɾ[i~minoQF[lqpp7jHcɓ'K>p<^4k׮SFFFջzIIIFGǏmVXGvvvVy̘1iii_xJ*bJRy))O>mnn.ƯwA[i4[QcGիWOLɦM&qppИFJZ-U!Qi1*:p~Бxwء1.YJݻwk| ϶m*V)v6mO=yD::;vwޑQ(+V?hҿ1ԩӆ teԳgOi… 76RjCbTsviwΝ͛7~ݻwkK/g___>7mڤm8ʕ+mmmO;OaA;vE=ɮSnccMk˖-;rʭ[NLt֭kҤw,)ʟ~I{3fwq[@SFGGmllVZ4mTLбcG>:߻w`X#O>ڞiӦ-Sgqk׮=z'O???0`}f^}U}$QҖ+7N`u„ bGħOn߾`~}6={6lVR/,4VDEEi+}Ik]VfC*6Ũ,/^uVgΜ!!!Zvymvb1toݺ> p9q;00Pc3gH;|swGGJ֭w^Aåν{wMBQmR/Sppc.^X5://o۶mJy~ AsP1RAL"} W^]رc{IߺN:/_p|F vFk)fϞO6oެ-j߾}Q(PJ CF:3նؠ isl3󸻻KJ͟?_\-K.NN&j:$1>}zNmxáCmggg(_+MUꓭթ^>G999:O BIZ WH:_rʉݤC:UΝ;5&v{뭷)VVZ 7*jԨQΝ߯ kժU߾} PΞ=+nWTz(]N:aqI:uJUT( L?zHֱ̹A&3/ iAׯ/3Rߕc*>A@%Q$5%K^[fXKfZ喉Y*. hhEPBDc{sg<93<`{wγiL>ժUK=hq]qo[a^~~~꠬ pgg J0J>>>>_~UVƍ۵koswuq kŵkc)(44T}hݴiS%GEbx 8n`c8qʴHLL|2?D#q /]ۭ[>|˿{RRRjjl=ŒG!uڵ1F @cW>TZu׮]$ܼysƍuiٲ1c.\`B7dffʃRq=E9pzܵkW3yl" a0DZ\-Pgoo/KA=6ތ\|m{Y<)SgڵM6AԩSyփ.O4Z E U6]]]|k׮m߾GkΚ5q+sUUV\:1qqW^yEJ} tAP*TR~/^C]ݸqC=6ߝw>>j?>;;RfQ<}4ϡ[ޙ *aaa*evQ]8''gݺu櫤2e9RGꟙLEQ6mt-gҘSRR}H5kfpQvttw|[OofoooHh(t%0<ErJϚ5+b_ ,fcо}{x*XL͕%>SWSookL]<@Mׯ7"q eqp2-ZPOCCCs[{טrrݻwx$4\R}zipborYW55QllR04Z W */z|9%V\g0UViD[ullLE4UX&e޽{!qKGQDDݻ-Z4wU/]4\kΝ_4h#FDZߌ͞=ȑ#&+w}vddd]&M/-ny}-&&NZ|cqu֩#j(-PLjٲ,?oiӦ/^ħz!!!_u5/ڴi3q1b'66OݶdX/88X]ѣG}ꫯL^գGG4!̷~+nwW&$$RJ}&߽{|}},X`UJJʰaÖ-[~G_*v/_>jԨT+-[֪UB1yqqjѢB\DL;T%66^^я4Z Q _~/֟|aaa:t^;w9zڵknݺ͛sεiӦC͚5QÇ._|aq(ͤIL1}O>D?9''g͚5[n}5jbmm|͓'O^|Y|qѣGmڴwnrQйsguŋ333\jÇYFTLZ̿ۨQ>+W/j \… ԪO>T;>zhҤI ,رcZTuΝsEDDzh˖-[l1Sʕ+ %(RbFΝ3^iر'YYY!!!& ҥK6 .\pUvv/.[x\?..nŊfnquu]|~ۧ~v#"""""r: 88|m5`+W¿ouc:n„ =z킎;;v̙'qqq**U5jܹa٭W 0{l1{ 0?IF @a)CE)W\XX:IJ;vlPPm۷oުU+pqqYdɸq_6|Pwwwvu߾}mڴxd999&Gpp:?BĹ7M6Z*qMnٲE\(ɤAm޼yZʬYfHHߺ7m4q6ʖ-;}@Kw[l>dk ÇkvSzoPF毧P(JfPQСC#F0Bt:]V֯_¡}f͚9rd…:t5yN_/^ؿ-ٳf•}.]6nܸyZjiF R֯_\#G~7&:889rΝ7n|뭷}ڴiǏ7Wn&Lp_իW7yNk֬ٳO<)gFv?ҦM}n+++)S\tik+>ȑ#zg;usαcj)mʔ)۶m֭w#/>zh-4i~kUaw|oٲeݺu_?n8 -N"ww>{lbbGʖ-[V;+YLBB‘#G.]bmm]|ywwm1ĉGuVjj]*U4h}xԩӦMEPLL̢E"##Zn=p@:teV\x:v؉'߿+Ϸgfo۶-&&&>>>++ťSNqIY]umڵrRiii6m'O*TPv=z4(..nǎ׮]KLL,SS}}}eĢK/h̜9syޕv VZw)AmذA]̙3UVlP`Xbذac;;(cϳ; ջwouMBBPbl۶M=& - k֬Yě۷ť:tH=ӧ+#ڵk|ɓ-XpO<;;;l}3ftY3s~4_SOtb]yZre۶mӰ֭[ϟ?_{ Ӳ+P<xM{g*X &$&&6Lv(J͚5x޽{krǎ7o޽{wLLݕ+W\\\0Ī_ !!!FGGGDDũvu͖A 7T[jʕ+WL'O$%%ݺu=8qԩSsHRJ{_~1W jʔ)~~~SNݽ{wVV߿ժUc'XJRL~tRR #M;v,$$dϞ=Zf[[[7n79r]1T^xe9e8X[[wyƌ222wȑ۷o'$$=}L2*UzW6lسgڵk[xޥ/GJJK/Խ{w" #ayb!At*CP  TH@:!At*CP  TH@:!At*CP  TH(Ϸt1KWFtt閮ިAt*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  # IDATTH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  THdaÆ/_յgϞ;vhKOOt ޽{}Z[[O0!00[,u ]I *)))M41j=zȗ6k&;Њdggb[|)iAf|2X _JZPIII1mjj*X _JZP)So˖--ȗT֭kۚ5krEn:::m>}"RzQ\ٳ';;ݻwb[|)iAEQ͛7i񙙙:>2l.-v%mGQFFƝ;w*V-$S%m2=@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP kKWpخ;e*cotoTH@:ѥ[?x@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!+P=zڵuRJ988k׮jժ ;]zzP8rrrvuK%W:˫[n:uUr~ݻw2EQrrrO'IJQEӹWРD%$z-U8;;ٖ Tge?5U }ᇧO׭[744Բ ׯ;iPPA$$$֬Y%ܼyŋRJROs۷o?x ==˫cǎ9EQ?qƍǏVP^֭۳(O8foo_|  6Hgoׯ'''_|ZjSSS,Yrĉ$;;z 8nݺs޽m۶0@PyމEQ%ҺukGGGʕ+J\\ܴi֯__gumM4W}"##⋝;w,WPoҤI5k4Sݻw۵kq0aBPPP>a„UV鏗/_ޯ_j۶M-[ּy@3կ_N:ѣGA}(ʎ;>##̙3iv=?:t0m4)E~aRSS5o߾-Z|嗹ϙ3iӦ{^ 64mtܹf™(Νԩ\WXJ* ܻٛwS)ŌW_}uUѣGWn׮ʕ+[kѢ2dǎ8_#++ 6 8޽{y^4x=+cbb:u-xYze=A<|/:tH>|8jl߾ÇiΝE={^p!+srrVXѻwo-Ů_2QDqqq}]n/^8x zxyyw}wÆ d_O>՟t&Mj9===66رccǚ$ݻwk׮ׯ_?,]t۶mիWJ{]tԩS5۷oѣǞ={LڵO??NIIٱcǛoiill"nгgO3ի5j4o޼VZvvv,n駟Ι3L/^9rAI_cJJ͛7?.=z4r_رcǏlkkQr+_zU&::w9uTn? XyZE5{c'O988ԫW|w޵/1bA#YfUVtDFF}z߾}/]7o|鯿5_~iԮվ}\R~2d]߿pppժU ~ĉ7oެN38y#.]j\l+TvgK>׏xټy.'VZٙ8_ԮۤIhpAlluV~gϞ8>*U?~ zӧO_d_0111 3fÄΝkr>6mZnB/VVQDޘV\yԨQ~:f1TP!88XV/66vԩb@_Pڴi ~=h O0 ""8(2a„?P=\bEn|h{{%KwEqww_n/CCCMocc驞GcQQQ4-ZӑMsNddzjZ0^^^G1N) 7/}̤{S֯_oREquu]dɼy󴬁xT(8|p񓜜#GO?=}th^~g3}?\R\E?[oeׇ>k,)Mrʝ;wr+sݺuيt:uGWAsʳf~؅ 6nX=/kʝ;wÇFݨQ#3%2dz믿vsYF2mѢ6Wll"-⭢1{{իW ?[3ߝ_5\!͝;wڴiGGG/X]v 4O?<^ 1MŊ[j W}w2D6?G/n?_[o8gff*.&ԴiSqvvSRիY[[ϟ?>L=޴i+oܸ!j8vزe˪gϞʘTO?P\_dET[EQ7{cCs[z>ܷovڙ!m)^xA=IHH0 z.>~ɱmbg֭[&ܽ{@ kgmذm۶NNNݻwo 8&*==]| fny{{3f<QE[E4{8~ q|fj w(#yCP9{^j՟lٲ}|j{]N2(*Ӭ, 6\m۶O]f|MNT]I 5+N}Qk.bZ)%ɑlll233Nڶmykk)Vh(f_oV VLwygŊ7o\tin iii_~a#11Q=]v~K0N6u-[54jH]"رc-iii3xk4͛Zr(z>_SkK.m+6m:uQ̙3cƌy_;wj,U,*WJJzh# lll!ztI&sE)Vnnn:={AR|.n"vO}Eپ}ګ-TU\9[[[TmRddСCr?3>>믿Ç>|xܹ~~~}YhQއQj+55U=mPD-֬YK/f2* b`Fsš^zK{?pqqҥy=cA*M4qqq)@ 8{^q8qb۶mCCC ի,Y͛7ǯʰa Asj(D\N'nš,gggq qGGemץKv[?wС+\⒵/Tiiiz={'O rtt|WZlپ}̨4hPddUr'%%XUV3gδTC {P<ի\R|rQO p  z 4QC)haINc7&[=&9rOƏ˗/=zt߾}{+X}~興I&uxN/_;w._\=tRppp 'O޾};w6m4`GGGɓ'[Xl"#N*ϵɓ'VZ6'OS~¨&`c\rnWzzz֨QC\|Ya6mg6KXEQ4n_N>-|Q͛7O&88xƌVuxfs?Xl"Ӹp!<]hE-VQ^;qcqO \3xj~…s}8WWI.@M\bEqvcbɓLm>}ߕnݺ'NܹsGo:WtiqG`__bY+ofbUsW^Qݻ'F/\k֬xy悕#!Vw7eٓ<{zzR(n׬Y3åEӧc.^~ղeKΗ8Eiܸh%ufhyv2Flll۽ݻwx5Pv]vO5ޘk s[n`{>}bdV&N)S. `zu;vpZqݻwկ5 /hSɿŠqy{̙3Z 7`<[5`VQ^6mڈ֮]qۜ9s ?~xĈ4eqB g_mܸQI&Zj(؉TGt:Ej8| IDAT֭[jTSLsybb~22wwwqoA LnRSSɠ2TʕqvҲfTJJ*UOƊUsN2::El| BPI wE甔}^ŰͨQӜ1c̛7]_zjee5vX-?׫W/&u6l]{ߕSNh[ܝؐ!Cą|}}jժ M6W;udVun|{}'f _yzz[Usn̘1˷Yf!?رc7<Tw...SNGFFz{{?,,,a{```F/^,0:uy|댌1c\{yy͚5KI 6]X\a5jTN^}U-^_oqرC^s+J$==}РA3g4v{{{L͜2d8A<44߾~ɋzjGG>؊5`VQ^5k+?88ظ]xw1b*/AI7dȐw[\_~5jԨV]ҥ?~|ƍ۷o?mܸҥKo7oGڵkׯ[nʕ###;]t={j׮]7]3 ]ҥ]?|͛7UVٲe]vYu]>`iرc׬Y>zh}ӦMT2@lٲ-[4.gȐ!!!!';vhܸqڵK.x޽W-pʔ)&7)bYUgn̙'NPWK{,Xкu*U>x **ʕ+.]:++K &?|P<%%%22Rvrݻw_xqamW;v:tsrrロ7t"NRVX=yQ||=))i޽f4h9eʔ駟|>xLUTYtzjns0曻wnٲE$==xt#G9rdnQ,*kggglٲnݺoϒviz++Yf%%%QG ㏏=ڽ{w+Zj-ZhӦML)z+VܴiS``/UΙ3租~꾾ʕSO;t宎;+zzzVVVaaa={dɒ<\v&t:m۶uU\\@2e6l0zh{{# N:6m:uꔿ{R\عs1**jСV<^p߿Zj]6~K.{kWL֭[W3 ʕ+oذaժU͛77W|||õΤ׾}cǎ7.Blll:t믿ܹS?]vǎ3_̙39רQ#kt:7ӢXe[E14]޽{ǍJ/b޽߯meu9KOOt g}&Κ5+G,;;{'ȑ'O.]|իWoԨQ;|oݺCN־}-ZXjE[Mڮ]ԯ~={\~=11ʪ|=z0ƗF;rȽ{RRRJ.]ruvI\JY?ɓ7nxǏ˔)SBum۶nݺ+ ͛Ϝ9;995iҤ[noJHP7n8vZ>(Nnݚ?AGf H % Weڵqqq,̟c9ȯ/={V=3g'-sV yߵ,HyyyY6{󜝝;udZhձcG٦R)!CEtwV:Uǎlw[7nXJJ$(\\\+~hPaT }⋖InlK_ %?+ i%&&?~<>>ɓ'*U[nÆ -])P@swyG= `}EYf?p4s۷{xxXbOW_Y> 4IHHHMMY+{ŋD V&%%-[L~_FbRQzjttͲxT`ZDDĦM.]tڵħO*RT){{U6nӳ_~+VtM\ӧρr8 AΝt+W|5kԩS  /_ѣG3Xw9OT^1ci5W-3 f,baC0\fRccɒ cHRBs}ڞo~uyϷs|.PT__}ٳg5>==}͚5;w2eرcZ7@MNNΊ+ <8$$D> o޽|)E>a„ÇVXlBjjjIydyW^+V q@MPI؁>yDo6m\]]ݻw֭g;v,&&&77WxՖ?.=zHg,Iҋ/L_ɓ'esso+#>(q  ARNNΨQ)VZAAAFRYfh/^xA˖-MSmsܤI 08~A U6k8p JQӼy={1B~$//ojYFcy^+c @ڴi\b%Kh>Aŋׯ_ %/W\kR%''+G"ԩV%,Xmmf˓J&*ݹs'|;vԶf͚yzzʫO6LPљKOOW:99PHǎ;&xm $$$ڵ+11Çϟ?\rݺu7o׭[g%%%=zH^U.|uZ39ycǮ]miiYzuw}k׮z~SN]r%###''ƦZjM6ܹsf RFFF>}:---++ɩUV=z0ȿtIn޼y}yU9\NNN\\k~׋KU666...|0***..֭[O<133_Gݭ4/ʨo?###Cܾ}{ll۷U_AիWwww޽{}(̞?^u0TM f%7l0dyu…:L5h y5<<ϯDFF.Xɓ92+++??Yf8}nݔΝ;o__Uvڃ 8qb5*<--m޼y[nsNa۴lO?5|57oޜ9s֭[FVѣԩS7n|EyƊ+Ks%IO~WI^?h'$$Z׮]+,WgϞ~ee㠲lٲK~eԫWW^Z;F*6!!aQQQ~|$I^TlxV1ȑ##F,^X+888""B0J=z6mZ=KM'SJNN7oެK.:t37=z޻|k"""bذa!==}ĈZ/A7,wѳg .h^g}/HoYlӧO5)!!!={,,ޓ'O"""7@ZZڠA_nDXXXti׮]GDDcb^zݴS믿nggw/(;lCg˖-+T^R%|1cƨԪUUV 4̼~ɓ'zcqも6KJJ8qϟߵkWwww#jM,X0eyu˖- P)Sr!Cx{{oٲPPF7?a$q>'N4TM4wCɫk޻w1cʰ_hѿ+9r$&&o޼lCծ]㏷mۦlS*nٲ%J$i/6PݨG<0>}2|-NٳU 2eyoAoѢE3gδU{͛?S6mW_:uJO8:q^}… ---UyyyVq5&mʕ+˫gϞ-l۷o+Wq _fk"33Sy=ztϚ:uj˖-5)_nԣYu.YDqر 6,|www}W^MS?,:T$IeLolٲQ;իFH}T4q{/((h߾}hzիW,YҤIݻ<.[l|Jë...]tٳgjUd>3rŊ5ifݠAwww˭[ R;w^[fܭq֧wV裏4|b@@~Zft;P ^ٜ}]rCJnkk;}t $iԩG޼yS Zj9;;>|XCPpuuݶmۅ ~+%$$$$$|۷R> s97ԩsפI&MhMgfE;oРruݺu۷/}j[œ8qB^PA?2Qfy`k;hݻjNN1}K?ݖLM֭۷o/wЏ}AFkuIj֬)/gggF_EG,77~ڴi`OOJs΍7UoookիW%Bßs//u_իW;99rEsvv6`esr'Mv' ZnyM4Y`)0$KbUy9<~ԩSE 3Zjie*UW^򉠂ݻw999۶m۳gOtttIΜ9?nܸ3fXȑ#GvvvQQQRt.֋LٍC;wj577ww߿!C4i'c;+3]ãhkyi#6ݡ7.\z̔r50~Q<++ŋ7nܼyXrrrΝ Gvy3s;w?~wzӧOcginƌgΜQr7c 777ww.]#33S^֪&JA7, >|\}7 R=kaaCW1T A 4(..n…BU. IDAT;wTƕ+W֪Uk֬Yj2Hecmܸqj>~XլnѢE]t߿aodeeF!A7,? 捑JXywIu(Am䱜}eC[ްaÎ;.R 5)M<3,,絶ׯ_|ya]DݻsαcǾ曟}Z}5|Ѝw4 @1 n4REj4u@|Q|||:ԭ[+Wyٜ9szN+2[XX;oj׮suӯ_?y*%;;;GGǪUZYY)W51dȐ!ClٲeÆ gΜ?ؚ$I֭۱cDŽ u0+VMѨ$A7,؁S"@/ZxxxN'N~mr>U^|ԵØ1cN6lG6̙3gΜkӧO>$:ujNpBZZrǏO6ի+W%T"wX7xVbtS2H;PSɓ'gՁP-tKY @}5o|/_E'A7ѬX\&{o*ZNjV򽝛m j5ϿM;&*ڃ.Dž u+Gm'O(W[l\UN.,Z0aBIUnݺaaaGyYAkN9FrNh*q4Ū{qmKg{T)pv Tʵu*Wu}}:m۶UNq^ w^Q?6H||>rjjjll>h*|-۴ipi͟7? <7R^^^Y,u*ǎkԨѶm۔hR]޹snz,c@]٘;M:th޽:88hB^=pVʢϞ=+o߾ 4DP)׺vlo}3gP$I;wV`РAӧOtx(sK;ˁ>ҰEZZږ-[B\\5Գ{@항6mڤa'PM63AזQիW"##} vƏ$I]t.\aŔ7HW^əeɒ%3IF>2Ti֬ruƍEvTƏ$I#FP~",Y|رcH(Cm4)|cmV5"y~tc7!rRu{fff@@y9kD'77/(޽{vnܺu6mT^ݾ}ݻ>>>;cPK^NMMꫯR@@r.Hyc?^y<$$bŊoF;2є$_9(stt xʕSN-+kk˫tR/q1c(*0`i.?~E+IԩS,X VPo)lcAN1қ@9DP)ԩ3}t҄//lݺ@/_:uj͗.]|xO:taVV֠A_T姥6$Iʖ˗/Paz)/?|Ȑ!%::zС^^^$iذa.aaa}-lÇ{{{_^~N9Yn^uIXNN΀q5ٳgoMIlmmU'ӧOWۙ租~:j(yM*IM&^~w e@^;wLV_~ٻwoyŋǏѣGR>|SN!!!oˀKV 7fB}rU,'r%Ν;cƌ֯_^z֕*Uȸvݻw_Vwss۽{w4__۴ioԮ];//sV\yʦJΝWԩ;>zݻS쫹VZ5k;::|޽{W\QrO>W7nܨ6όlD*nnn7vppTÇSSSvw}7f)5YYY^^^jU^]v$uY$IUVmѢE͚5_zux[bŊ{7. ͛ Iҹsv횞|ή]v5jx_/ yG.]%333kҤj$$$k׮N~~~`e`)Sȫׯ_wrr*lc# 7LII&Y[[+?$)333!!Aͺutg.ժUk޽}Ui=ydmUO?v*IҐ!C?ɛ7oW;vXl deebŊ^z=x@~,)+W|̾Ϝ9Sfffcƌ1HJ$z͚5]vU^NOO*p *̘1#$$D0;2є$u_}ZcȌb?~|jՔgQJ?$lr֭ RN㢇^dIaqxݻO?U+;si# 74;v'uVv ,YdEȑ#G*3+}>a5jOaߐIs6mR@fffޑ]tQ^hxbaOaŚ^&M:t,X믿IF;:0T 7n-e,,,&M4k, ~T:tS>Ty#"" nbkԨ}Sjx֭b  +[o}؀ggg!&/W\O5[[EEGGٳʕ+{{{GGG+')̦M diiOZuȯcǎ111'NTSfaamƍQQQz:t 5&&͛wÇׯ_m\]] ƍ"Tݻw O>TRj^{͛wQy<$Iܷoŋ>}jnnnccSNWWw}jժڵڵkֵjտ*:~xjjjfffJ]\\|||#OvǏWb(Ν;⒓={VZZjhѢk׮ڇ?:3?sƍG={ήq&; IRffݻ㏴ KKjժ[:uƎ$~;y[?~lfffggװaÎ;nZb%N1@VFĉ]k0[nG*@I)#MԮnڴ)99Yp_zumJ>Ȩ_5:{zΝOl]me䎊cU 33N:t-q9881ht"Z@(e$Ifff?8*TХKΝ;tEQd111ׯ__Zj :vX<de-(He Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8O.: =z;*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  ᘗtPfǟ?>555>>mM\CѣG%]))))[l9qDjjVOtppСC>}H, `W^]͹}'nnnJ# ))駟~?(=q,AZf͚5kTСCj!, tr5JF&Nȭreee൬g͚EyT}74)Eq۷4/GPb !h'>>DRJHHa*BRRRPPVO]td &:׹sUWWז-[˗/9sF^mԨlٲ%//O$''w}W(f͚hBBΞ={%r;uTf˗/U˽{RVZ~7:v t.Dɇp­[?~cmmmkk۠Avy{{iR;\7$)**zۻ^ziB333[[ZjЄ)z E|Aq___mKS\͛[x $)))ɀ}Z5jl21t}Eɫ{IDAT1H3gΌW CPٴiرcUX?6jѣ666KܣG~-/^=ܲe˒%KT={6|w>DEEX~)pֶ[nÇoժUѥuӫW/w}aOiBZ33_y}yPnǰ_tjZtzjϞ=Z]|VVzղ Ed͚5I7njrڵ5k0JFӯB:uٳs֭C_wرC]6uT= w%''8(,dffnܸ{ӦMOa$yyy7nعs!CڵkWW@+]?=ͳTL4If̘!IƏo&լʔ*jfaBzjŊtҢO45q'N(ټyeJnݺ_hLʕ+|Add隒RRNN΢E铝mjwW\OǍWJӡCaÆɫO5|nLLC_zOZmڵ'O=hجmP(իW׹/^l۶M[ٳgG$I&M.ȌL#;;{СW^VZn:uN:bbb>,'G~'6m*U\]]{C*UZ۷o_ׯ[`NNNEoߠAd@ov׮] ӧOӯ^z%y|rժUyyy? n&No=t|~…ݻwjҤIϟ?W-WREm-X[׮]7n\hh6`0UL"%##cʕǏ׹߽{W(>~qqq߿lٲ/WqrrR?m#G ԯ_ڴiEos%K,_ӧGV^Z> 3O_t*UT={sss%Izɓׯ__͛<5jڙti]z2AVYzu; M V~}ՂM~WՂU[qqqUBvڥO*T_H4y_~T˹֭ӹ6m۫J0,E32 eر}\]]}||`pݺuW 2Pޟ5kN>Lzo-W^-6L9 6JUDP)XZiGaӰԬYUlݺR-7lذcǎt#IÇ?yt݅/vi('ҶOdׯN(\^ .`MҢTMaÆ#Gm2gyٹ؞oBJJJjj/!,##C˗k[۾:tЭ&y^jժzQ;vlƍU.|LOmbu¢B *T0l(P׮]?NOO/+?=͓*6Ք)SݻZ677={ՊI)/A`}vm{'+JvUY߾}%Id,̝;WngT/uw'IRbbϽÇ>|Waee%w$͛%XT(?=uԙ2e8w\y522R9'A~|}}MZ?9K3RV1l%!J?~#III ۷o?T||wE+ׯ{뭷ZnZV689x>s vjR5 A%11ٳ *|ʿ*3رC•J]xvQ،9R^MIIݻw`` }NĴ{ny,l++P꟞FM0A^4irО={*o0A`D]vU=rJMl25כo)V֭[Krf͚6mk>}'O޸qC|}} $]u:W12@e%Knz̘1N*!0yYJOO@@rYA9FVAK'g϶l٢hw{);痝l4tP5%/שS 2?<,,LYog͚u1U&Mj߾|CI|&]F~/b#֭ sqqիr*zkuM6'O˞ӧ+`eRʨ?=?7RTNˁ*zUV7n\rR09G۶mO>-IRVVˋ[fJE9V/7u577ׯ_m|||~rddgު͕sקL12* իW[n޼ywޕKLLLLL]\\[o)))Z7oiiëUO<2eڵkG\]]=hȨ?=kڴi@@ڬ~~~|@U-[* >DjGӯ 8P^V:\ eGmnZQ۲eKǡG}$Oa")RtDv <ٳgn֬\s˗OOO3$===!!!,,l-ZXf|9ʪ H4i$'''yB ӧO/nFJŞz #Qׯ_/-7Vg}+fgg:tH^+pVZȫn/4{lyPf]xa)elVVVGߢG3gΌ;uʦb233%gڿB4hРCiiiS,,,,XPfJJ~zLEvyիWK,ѿĉ 7o^)W.N>daaʫj{衜 N+6l,!S~quPa)e2nnns̉ݿQ~m 6rH )__߇jx+//U! ܾA4dcѥ)%<'w۹sٳ%Iںu^[֭SeU*?eڣG8::*vvvs4h#JP ~ps=z54qƒPNiӦ#j8;;[/T=r>ãh`oe_zW b!h… $=x`գF~mrÆ ޽[n:͟>~x_]߯_?Cڵku릜P쮒z>H5˗/׭[GPPꔖ GbŊ3gάRܹsO:I={6qģGh5 ୪/_eM쥭.<<\^':u:?]]vt9s(ju^yBr5BաC(seo!߯ڷo_|ogϞ]3GGG62FJqpp(M$P >yZêsΝ:uJlccĒ$˷u?]x OaX&''k@^$UVm] 9F+##C}.FϟcΞp;w٣>S6nܘ"[߿_e޽ ,йjΝ{ĉ7nHpB ;?899]vM|/R{KƍFݥ5jB={L^VVJ-@X:Չ'VZ%;ڻאA5B+G53ЊEQS! fe. ,3He3,-J¤7E/#3M<}Tgϊ9sQHNݭs?(C7nb?_]]]VYˣ)Eu ?֬Y#{ζ=u۷>kĂZVEY~~Hbי搐۶͛'?|޿& edd Mӥ(/SN9$bk43/F/^~=22r…z hjjzji4VEVuƍNl6ϟ?_EEu}ZdwV{1׏K41N'55Օu֩>NBBϟnr,oSRRJKK#""? `>*yRm׮]ݳ2,___P^^vZ5lEzd2Oh6#77WL=?00pȑrzζb뮔hf3S**-X@̝(UÇm???_bOC.!!!ZO>19Ơo߾uvv?~˗/9sh7MRͯ^swwwooߤIf̘}ނKdP^^~ĉҡÿVkVV#U\jf3R~@%EQ CCC=E17*pՕ+W\⡃Ff"*pߟ;wj񘊢ٳU& j^|(Jrr2}2 ܬŋmmmNU ޼y3ˤOimmZ mmmCfQ%(((,,LQ  0=1TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:w.?]IENDB`davmail-6.3.0/src/site/resources/images/android/androidemailaccount2.png0100644 0000000 0000000 00000174052 13410710541 025120 0ustar000000000 0000000 PNG  IHDR8p]sBITO IDATxw|[?𣽷ey;gwRf[P(.xmZh)B){HFBg'v&մdk\;+Xd=|c8c YvT "ulw2(.OowY#VK A"$O&Γuьwsh_5fmCf?g .Qblc4# bǸx 8H'iBV?R>wU`n]+H)icX^,W")(B8,- 3RN!/DH=z6?Nh5ZlvT\I"\%S G&KyPhynV"e9YUr'm`\xN͉4M{ux|>d)VH4`}Ȥ2)%~y2Nj-68bf"iq̶ٟ-)*[_~?U]}zkI iUY=>`XK,ՔYbN"RR1!db3:]V=en!c m*YR NG"gMy|hIURJB<^^19IJCʃ SӾ'gG:;>{n.Υysٴߟ߄yxt Wif "5ej=0ꮐRObIDW#uxF'4n|OZ'፭Rں%ya;E-Э-B Mku9<=c*yFv|0SR4Պyw$T%EU)$so]Ri0nGNFrq:^W wĿ:9Wז(oqw p{F̱R=Y?!,B" uO=ޮF xg)I> @7DkQK+ViYzOPa! ҼsJbM|xc g[xMN7}!ۗHLt%yhyߩqcW\˷ؐRg]D܏GFY>Igs{|~ϣE盗ٌ3}YU5gos{ϥw$onxMh{?ݰtu~v[\n ˧-[,zHz J-ܵ._&}w 0sT0VHH^('vGDӸ`4[n!D-d*YN ;b‘x^T?s%0 Hs RʼW]TQP%~o uz?o j^[pNCmSVܵGfvĭ%yW֔[Jr)ͧF$wo+[TSʱ1-=(8[}AyY%Tp8?XxȲӐ)7t*I//VC =:T|/|s`6%G6//U¿ <ҭVݩ;;lʼ-%yr \^U\=)GHR \Dɕ|!|}qe*c 9:Q*"ۖVRbp΁!L}~ݓ 0pZqg7=0Bzڐ u']};Cd*\YSrumvw߬N\t󸏞봪:=?yr{pM {~Y{br\%.l3*VfEmzßk7⋣l^N\8,oG ^Q]h6?u盗 BRfC.TcAKk9B~PӏX~8U5L; Ȯ#\M[bl}js vkhw,_@E8ާ7#$*W*EՁg>gsJkE|j,Gy,NސR+"3x|OFu 㷮P'ypdrX_>d0;Bc8~#PĞ1XB?,>B.gMq|jãw:sc)GPeRJהGmmh+x|IS'Qlo7#@fuL|[WPwa5loRvVqnFRj\Є=e3gpO7.V^; L/?rohMlog7.ڢ BȾzRR: ?K^o}5jҪ`tjl82pN{DޡT=ndTop8XRQ N-p4hN!;{GBY *sdqô_8yQE%4hvgAelF:NO66G=o޿z$+kJPHTz׶=o]isC^ZUtyUq*JX[~ay>z.dTO欌1eTJ3Ys=Rfъ}f]Enԧv|a%.( [RKϊY6fSAb%ʹR,0̨.0(zɂ2+,BR}pn;ބcm .:lrBr }RހUPln,;/X[=v =0v=Imz(9jƿZ}u*^#F%Q&]'*,B4b2V",;U{3W\5||oR;/QHs# aRDccTWW ;89۟efY~rhDxlye #q!c6{B)K:iA\X^:b!㝽×VQUFi*^#mtz !Nx im!%mj̛8[=D{[:>DtMTPaXj $U^P~Se|jA: ΁W)OWr8cN) =8[EbNSd-+$R>N؝{Ƕu &ZLT)[E1oM78G7.V?u}Cn=,.N;㆟mX([=p8gBD:K#o]`%!k򳯬)y9ҁᮬ)n8('J6KUu'vrnY>Uoz,^VXZ=&-=uLS_eiGƤ{MܲGZ<7hUH?P3TBwVԮ ] 7,q?xaȀB>?|ǍNr~c!+=5h J61c\ Kr4qS)o,B>k-kNڝ|ͶQS}X;BM1OZgwue 9'f wpxŠR=/#=*\6{}K<.~/w:ZY"wW=#zWӊgB i48Ӆ ()Y [&vKbwz:ӜW䂓7\3rswשy+/)K|]+nw<˯.x}ClNדO66S}/Q*-mO~8-Ԫ_XN}'g$ltM&MT Pp?-DPwVINf=/=*lkKI+j9C !*𿳢E ~vBC&N)7Y YlFK^.}9?Y-x5[K"6UuI_.PSOw뒪LIN{}Vi7Rʢiwe#.磧%:5p񏻇^T|ߺGgև]OʚwYL:fGEB&a(dز✈? vjo=T&հK'qTw8cu$8 h֕wgEw]#[T][W\[i]rs6?w޻z!dcQKTߺ [,"Lp\6v?sjUE 9grհ[<_;^dcSfO)ěm}gQӖ}ur*յs)buӠadwe] P$/ϪE7-;=c֪7~zZ.B3pl?<χ9mRS?o^nCrF"diybIxŰ̢RJ4d|'6u}F(B.'kN[qvjᔗL"חjRo,ʹ3BܿXE18~#j`B5'sEO.ix}anjk!v<7ҼR,R&OFI! *lVզ'p2Oȇ]Ԕz}뒪@9ۖ~RVjy$"s]]9V3̈0ߵLڶg tL|WowB4"Vsh 3STRg{`}DWc3NB.,Rʻ7ُv[~=HY<;{y,IeیעROw|v<{Nl'%˓+Uf\t+S8G"&jV"䊚-髽g2`ݵmOpYɊV[$]r׶=\Zn99<0ahlL)֑R ( ? 1RB%J],rnY<-!îA*t|k %<ު<wڜT]|m]5UK%%q ;j?ޘOV)eJ!X]IUhN.=Js80İžwpbB-0 dWr쐠"}Ψ:4##{*\W\\G* ț;e]%6_ьG^9֌wXH)NOZ`/~8,V;1+'z !buںں +oXTAu-\TQ%BZ'3%N{ω?;}l :?GksXlߗ}`cCTL=5Z~ɡ9,8gZ5l_mIOjMkJJte͎ IDAT>k*f6vf*{lmcY#e#ιO+~v'ղY,jz}_o}xgTv{ޡU m>4D!{x2h;115c lO7.R'9fӃ!'ˎ%a_Xwpbp8/( YW[z~}f:|ezC&֐Xxj a5%M ?u89w, <|; r-OT۝::Oi * 9%) 16.(/a)exIýⷶ {\]p쵖Zzj4bT!]]8,euӪ|õoh!勘[ 5|!JqkiV3uM1uKtGZN*XvjQ<>N74m˷ ݸrEV- ,u,`lwf[ʃʎޡhkE4`82𸊘ܞcc]»W.Y|#=XۓB6m(lnOl:1] 9RL! ˭;L&:LicNtw)Z7[Vir4OG&l@'69+$cG&_^]Z-#y5%7 maE2+A=|m]F-SV|~;NfV&px'Vk#j4N9)W-(ty/UMk x|Nr NӛE@y|ljNi H4'vzN,rDyzAwxt2J ֡~aU> ,evpi]Gi 'KӇTGe뫮_X鳀={5ӧs8 Ctf{(0FA ``````````.)9A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0ΙTn(znEY"f2Rnm@31S %YYetixvѣ@f={չ>?/g\P 0,WKEk͕s8Jy)Kb%; 5r.xGG<% TTK !{e agPPRN)%K(\ 0Ë BXߩ=i~mٳD)URfu3*3r&R EȖlEΈYjPI$!Oi^)DBqxC[gaT =PAJK)](: x¿kEP3<*H)IqQQ^"UAhqؗ\N/&->)H|*H)Iq}qV["2Mi>%^w~PoOfeNGJIkwY_d0{3 $KI+?C6u ly< *H)ItKV9&i6?9nosc6|\_ ^>A!($\M%\2@YObv$e? ,V$%F#S ;GYK2<V}| N!R8.4;BΆ]d L&{*.?sՒ_ؼ1l')y_\6hOӯX̯WJT|wzZMv Ӽ *H)ɵ9[^K+3AyoEBϽ$뙎Y2Ej7p횰7`OQuyb,R<~Źc8jor9?m1jT{UzZ}~ΐwc[t[˴4\QPY?!}6I˓m#3Q+ZIB* M]I3 8wrŚC߿'fvnɕ+ n,^Xy|~fq웴sQ?Ct焐+ T_.ԬHsErz&'"?TCމg;ٻsW:}wD UJOO }0|jpJr{ns8o3;~24∜[QV-ҟc.WPmuOms *H)I2kτ }mƯguUz6Ae]K+#_Y@md꾣nj6&%Q[u,ejd2z'|ڮj)/BUbq!}u:X)^XpkN/#CXb}': iewNhb{ƻs+X_9z1M])ʴY^ ,BbͶ㽇:,"t焐U-[lݢSl)um#3m@9fqPC$פP'(xǗ_[GZb-E_-?FN!P/ ?XVy2G)%$\9 3o n7h5Y(iPh!Ey97Vo%Q?s}UB'`o*R[Hus?\h).OJNFr]%qYk46ȂoWvX)?ZQ;*7JkdgxA^ Ae.Ug6&L< 5x?l-:/*x1cȠw wW^VH_B l(oOM-KjiBDm'MQĒji=V)ۘísd-يmb1w 6heG]6cr:wJR- i&yǗKE5a8-^. k4=+ Bo\o4\.?G[\ !7K2dZi,k+dٱcxDvDA+۔-_٬8RsB_W_ y~2n5a<>\-ݒ- Y gmn&;:cτ{}Jg\>Kn&Q^4ts6ꭇ68hHhUtA)%Ejd5YA^ׇl;r;/^Od&ݡS.U>`"9JB-|BGc-Cak4O,)ҶwU6afWOV[Vr>H4Hk4O,)΍ETdhnΖ|nᇚCᩇYEްYg;A-=W sN Z㥔ylqꏛҿ;r<pS3bQ"q^TH9jnަ7iqyc4{+_t|%<[<ٖڈF>o?K}cNϛ+M1'W|7xSWZLcX]ZL+j4\z$F+wGٸyw7V/MiPIUCghHDҟ#qz[y̚G~`bW[zz.)MjcreT2WH)0{7P>1FXrN [J!;1~OgB[s&7dlCR egrE|zյ{/ZJG;FK)ƷJ>wsRB{#m(!d1F۝^wM, +~u.}Hu.5Cq^U:*;\R,x.uwuNJcFۅ^UN_P%TQs2 ?}7hM sS|S+̎GF;zwuד$f]_2X2)s)hkL=a~g·w]dhj"ipO㺋-8*+xWK4\xm7 ѷks,'Z# Őҝ+x;vWĨW-C!=k\]>݇!eu RR{3ʜ *R!&gQXcwH늰]WȴOo1}$B Iq?zphk9,ON}c05C^S ?rVcG|-.ˤ[2D"MHߵ^[?fLOο^ 6lش=EQϦCOZ5)OqA9jNLؕ鳘2ߎ9+JLvx}/MFxs4wh51; *@b_iȐabإҝ7>֑?+VH9B^;ɬ>EKRᅹ"-e=6$=s/T؉WÖu~8b{f6Rza%e)y`"~HTo嘯23e=kR`tvWȝTIQ2bw<+oc[l^_9RJ4|6l:3w>)(FJM }<0W/^!WIPSFwʧ-I*9JBNO_zq޵Ez{}?<җIT_inx# 2ynj6ˣ3ZLSDTŠG_ yTJQT7lgpSK< %Yi NšIhdFI7ڇs)T_o19OC֒g !Gle?k?8S.ЕUoH cLs/n c<~?X>%܋}ΠU[*gps@.ڢSDx A4^" Wz$J#&0@ŎV&/m;YWD",_K%5ֈ BJ+k`A GV7ii̤hDf*t{kfͥ'+$ JQApu!wWC**makDfu=JC/qطjT"`H_)(t gǹsBsC&Խ1h)xFPeܓatɛ1 AVÍ%ZU~<;If#o-.S__w/ ‘$A1cPf!ڊ6V't{9n 8.dV\ƥJj2MJ]^|WGepy>1mnjF٢SDEnZ vfb IDAT{AD))[~Q^=< bCVʂ?఑G:{c. ^ 4_V:P_y8Yg:Y<8(xTl))>Rrnq:?W!Hɕ+Gp=K{nEp&W/Z4ACЩ!=paW ѱ%΍}eI/8{qFY%E &B$ݡMbuaKIBj9 'qޚXM Z[]"b5V묻TĒ"^vax}*#g\G)^][Y,ZޚgxPwшg| ʮ/:8sVֆ[&~ߪjC\[`SM ̠QG4 Z3 Δ6:Ets6dݴWf>;*u^SW_^wC5eʺ GlVYmV\gFu}.3D# /z~}`PwN|Eys%24XhӖX|2<՛Fupٕ2tkb+WԚ3<6E/C>fSvM+hg%`]QzYAu9 䢕j99 %q^$Z弶׭#z ͪ >>bgIe%C|h߯;j6g D>3=:A,ֹ9ssbv{_f>=GIHu[c?WSP<^>GO^n@r߱UIwc ('J`J?<E#QR .R9!$(O<1[=uYSSi6z-Oy+*{Xc´_. ^e?g@P'.#1]U. om1G1"Dj)ei_g,S4L3+HYƮ-2]W:uHf=!S?CV`la&yp=9JB>3mʀ돷-;lwqƮLyg/{ yxꜝ'-=#E/}+s%LNJfwO[5;?:eۼ=>~B78z t8?ez%ENw% *$8)E'miq~\EtcAkcl ;_0أTq3Ow.$d;[ӯq8?!'L}lXw|DPF5a>o뵹!{&n' 9hˉ2JڮtׄyM߽{S{6l;PRsskcצ)x O]yşv$Ϛu1{7wth؃q K?k L 8??9dR+[Ȼ8WH),2;ݍz{I{$fS4(Eavc瘩xbs|V++?pw[ GsTvy"޹90WY?1<'LG#t<6%)q9;lw3g} GȻ$OU#\cr{.OaX%;/GQ(8l7p4>7ϲ`#AL r\> QAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPAPy` YHDqhTYu(qDܩ#!QEi?T>-ڏW- uhR}V)$cgvMv7$_3cofvk}@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  TǦ+Ν;w[n%%%=ãE{.Lŋ®PrUV-!!A^ ZjU!֊+.]zE?Rݻw_%EF #FDFF涃5XÇoܸϟWPݽA])*(Ο??uT喞={~&޽[^ 7nI%3Ν;j BBBL*(zj,ѣ+W{LұcG*>0R$IrvvNe˹x)S~/_!))):::::~6mĉ\C*(6lx1y_eR ΝSn9}tZZn###)E-ZT;s֭[U=<~.\74nܸjժeʔIJJp­[TOZ1bbk׮SNm፹praÆp7nPnѣG͚5 >%̘1CٝRr}ᇓ'OvqqQn矧O%''gcLbI5ω111~WS™3g[V4$yyyVeKx޽{[\\\oKR$I W\`(*(Κ5k\sεk׌9pϞ=zܹӘ~7Ֆms GTVPjX֭[srr[>SYٳU6T 6m(Wsrr tayYє.]Z^1ƒ$988tŘh=}T޾PjXٳgy:|s+6hРRJf)$wyYٲek֬٬Y3pܹ7n$''URI&xo߾}…lgguUɓKII)[[:u͢}?{kfQ+WVV8*(5k *)))T6lhgg{ny ,;y?}mҥK׭[SNӦMsww7XI:~G^vM5Mڵ[jWG|rv QFct|Pxx_|M.^ȏ޻wܹs[ugɫzJNNW7mڤ#==}aaajOggg//!C 2jaÆcǎ=|P]{}}}njc۷o۶kfz5bĈ<_*WZZj3g~W-eʔ(X1,>>~ڵ{믿TwJ[{ײeK w222T?Æ ;v1~w۷oW \ 3w]>}eK[\zFh4/F5P̬\r„ -7o۷Cjժu]yuΝvvvj$h7PɓpݹsB {VV-!!A^ ZjUJJԩSCBB =˗/?{{>*s9rBWҥ-Z3VZ&̙3gΜi!Zj)oPʕ+w5Bѣ׭[!!!Ç7f|l/Hn233˕+W*lllv`ڵkPdӭVbE喏?X^&MZ|jbP}U,Y2f̘ZgPwWk֬K@Asݻw/UsرcʔRJݻVZUx9clUxv!99yɪGL6wއ&L]vy{{:t䤚dɓ'[n5*Wܔ4t'#G3Ht]9w>}(5k1I& 8{ԩ~~~aa/Hllϼy $eeeٳg۶m^x1;ӧO+W֭[X5,bzjRn1$IovA9Ë/veխO͓{k/_7o1cS4hѢE)7t"=;Cڢ:ŹQ5ԩ%K,Yp1Z)))#F0r$:IƎ;g^9*233 |r<'yڵY 9|Ϟ=U Ñ#Gn޼ /~kתuС*X}TP5mT9K_e`gÝ;w.tQ;::zԨQzKNIIQnQl]뭷jԨ|#GxykةS/5jիW֭WnggSNݻW5>h),'}L˖-6m74P=<<89;PՖ>Dy+WM6 6\ӧO===]/.[#~ʗ>eĉy?~Wky~'>zO͘1cn߾}4h{|`2|$I*S̙3`݊͟??ϿtP_~zǏ;V&󃂃UGر\ u *Uh";GFF֯__ pKnݡu?vV7n@{{/uk5j(~ ~֭jPܚ)hj֬Y*UժUkذGoVc<͛GEEO*TrJ/_ IDAT>?Q6hh4p{Sm4_l{EnݺY+W\da|}};NcժUZg}gǴk׮9sޓ8hРPWWWovMzݿ_5F1cFHH~TU]rm, _}^UR%44׻vUO>8n‹V2/̙3G5Gʕg̘QX^zAceNһR5pn漢:SFc8̙3L2-%eT֩S'7 *C=z!"kݺ=Ç uVUYs5<-[իٳ5kv_jg齻yyye۰a/T9r/G9r֬Y-YYY}]S@̟?_9qҥWXB 7oV5P短\x1;Jo/P.i4V(DVΝӻngϞU3ÇpMUKq;1}֭[j5T{ʆΧNPzed!^zoޘ=Us=^z'WOt[߸qØ4bU[ QT$IumٲVn?~\ͭ񂃃[Ǝk۪[/_\bET@V˚8q1bk܋/To-Zx;2ZԲe>ՉرҥK_*(rrrt'0Vhw.yeIMMݻwj5k4F,Ij'Oy IꖥhlժrÇUɶmB1"FՋ&gԩjaZ _]o^I',-ni-g۶mӦMSMxߦMR,yͺS橚rnT#xT&gfdoo\}enjT +W$O>W&/_VnQ=ŷ(eZݻwÇiiiʦׯ_7_Մ0tYf);$޽[L_tSj???K U'S\#I߿e\STMeggGEE~p reUc!Uǡ<Ģmτ [|||~<] J-[*缻|rJJvu׮]zyymPf޾}F~M9kB{K.]~]wB ;vܵk%&&Fy hرCygccc^{MTt>}Z0u׮]zGqȍjȦ?}/a1ڶmڢ '$լY Zslٲ'N(4lpǎƷ[ J:̞=[^}Exxx``vUՈ?rP 4ivU#[NffW^ Tm/K={(W|MUoZ3R=UFeܽ{ /---Ǫ2$I,C𰱱Q6W=0.D6Rca /[|k׮U,]>*()ڷol\h4ᒔT/I0FmjҤIkkvz7g͚UbS$IUVUnK߶\}ʕ+\ *z=}4Ǫ{[B_‹͛7U}||L(xqƿ*+_=zpuuGQvWMhx5k_}]UTqss3遹v-88XޢjgK ;;CZ>FUHjUpm^ ZdDϽrDhẊ.9Pg9@p -ZP9W)[ck@!-[};tpYUN:pő#GZT\o߾ݻwڵ1.׻wokz  *O<ٺu*(A:uܢ}.bŊyvKӧ!#H'OFGG+;%3hί$I'NPNxW\Z&SézHTP&r^}ש,퀮byR ֶaÆ-ׯ_P>O5bz#Aiyr-Zl_b}DTtiy5--m֭$/ڷoBÌT+}j֬jwwRHhԨ9P>*sYՖ_...^%IUCFRMY|6mZ`/ pZQ5*(YTݽ{Wֶo߾ƔӥKO]]] * U:\xQuU[Zl*Z_t)**ʂ2Hnݺf7oTݹlRoWuD ?0oa7XpnX"dҥr$[9V}ƍ|ڳgOe{*>/,ϟ?WVuQ >\yM6M7?o\\jQwwwu]wߙT+Yme˖… U.fe/HϞ=Ϟ=[z޼yB VNիWQ3,c or핏O8SA:H:c_>C-^ϲZP*UT:<<\wmc׿%Oţas@@jѯ_????oԨ]bTTO?ḏǏW -Ia ^VuXt].\lڭ[7n]NPz ͳ>)))A;&L<}<[ݼysKhܸq, R&$$=:##mذAuYnӭO>]`Ꮘ=zgD-8 %A%Nnw=<ѠjԘ#_/,4hР*;vX=bccsaɒ%'OVuӧFz6|p7s111m۶9ߺu+00M]t9rrKrrСCUwJݻj L:)8|A&Nؼys喈~n,Xx|V.:_[| 6HHHn,R@f\n]N5jԣGv@Ä(qvjgg(ч5j;pF R޽7o0 ''gŻwӧO˖-ӯ^zHmlѰaCO<۷G}Բeˬ+W91A;w޼y߿ ;~w;t蠽 puuꫯ f͚+lx٧~qo"""o߾gE>|p i`?C;ƍ망$33s[lٱc&NNN+Vkb/e˺t钚*o 뭷  ?"Ν;׭[wIe f֬Y5kִrUNw- h?>v~5o޼bŊ?tÕ EcM63FG9p1ŌF7ϟWm\r7z&NYBjՠUVsYΝr=777=Lm*쬼$iРAF*G2og>hϞ={kԨa|_^eoo_|̤$]5͢EƍgEDD 2DճE윙lْܹs}Qhʗ/occzqUlwSBBBT_;v9YzIsuuJNNVM5i$/,ZN={`FQ6ߵW~iԽ{wU#FX"b_(T-%$I*[l> ܹFȅ~3^{mϞ=C 4gOMd{TUMһwoU挌<~8R$Iܹ֭[WO~аa 4ɇƍ&IJJzޛʕ+YƘb5V5WMѨŋǏ ӧgâ[tM4)ݔ?Cs:龻KLL,x@CPAIQE &ի뤽8TdÆ ۼyG{j4=z{yyn/]Q}ժU RU#T[ ʗ/~[o%r-\/0:.]CիWUƍTFtIY 2jԨ]v5kȊիWoF^$- O[l믿N,N 6Tm1 A%QUv!899DkРS*g={*@}Сd;;;775kvGٿݻw>}ּy:6Va}М9s˫~jrn 7|OLLܵk˗RRRlmmVڸq={ȟ̈SNݽ{7555;;ruW^?¤8pw޴iS} _8p 666..ٳgzΝ ~,ZOw\\ܯ3gg *ԬYW^f: Gw^:u|}}-][@L%ٳgĉ76|yqN6mjRJEPPBOʱMu;BDPP=|pΝ򪍍͐!C >@$ϕK||| Yhڵk[F]Hu5s])))55˗]b/_2LRT/_fggFxs+'' |{%AxToLb,:? 4 Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP ®… vh45j԰7'9s&**ƍYYYM63#Vcǎ%ZL͛T$I'O.+WQF={ٳgU֬Y\(*l„ {i4+Z3fL5Y_~}ll?uvvOׯoLiyZZ… CBBn޼w5j :e͛7۵k I6lx_oڴ)W2eZl9v؁ UdKСC .oݺդtYkԨqUȗFYzСCM{g IDAT:h[hڃrGȇq}* @E/#'''!!|Mƍ gjժՌ3 ]n޼m۶g6GOj[o͝;7nIn߾=gΜm;v̌VYf6Ht…#Gݻw{yy͙3 jӦ)/ə1c "`Aٳg[l7fM6̙3ʍ\rgիqyYwyGNҥK7$;wsrr֭[/_>`Ս\*Uʖ-ɓ;w -Ź-..>*Z ͘1B ۟>} .r{m߾u y[F[[nݺ۷SN$eff;vlݛ7o9߿۶m3ˁkw}7%%E0`ho322۷~={h{)ǿ'N0&xr˾}233UXlٔ)S666]v8p`=N#gϞزe˟ݒ4vX777r,Zu.!+ ݰa 裏 }SNinjk9>6`eeeio& .|||{- 윐p%Kw?uTnW^NNN֮V^}ҥݺuӻsJJm&oHŬSNLLLn$lܸqѤ3|ǎFxb&O,nٲ,Ueff߿_|_d-$I~2Hݻ@$iҤI?-66+Ź B~C0A@ݻi8]._y_G_5߹sG͚57\)S˧Ob˖-<.#YEGG_NHHѣG6m2f(1B^ݰa ʟJ*em­XAjHtU? 5kcƌ1~oV?ry<$I^^^yVBMjmfÍ{i͜9\r/޸qʅy ãGoL4 !z{{ksrridwލ.WXqʔ)^z!Ch#fa5\V*/qhrڵ}}} R/``Y$ݸqСCeO>:TREni…m۶mҤv`% Q([(n۷;$ [as1Pӧ_Sv/L3QZf?3gǎ7n,*yTQ^!*IR.]L-ޒvZbbbꨟ᚛JنG´ F.| U&kjxyy/'''k.%?>>>ƍ.|4PT"))I^XO/y,[^effʍpMrmFj7n\י3gN>]nРcذa(1E)g`4w޿ׇ~hE/lРv` Q(#ub{k899wf&QvZ>Jȍ᚛?h9D񂃃srrrzI<==o ˜ձc3r+V)jժk׮g,8={^.wHMM]~&d`żᆪbpo߾}„ oΝ;zݻjg߿@jn*GGիWYJJJDDvfС(C__1chix ڵ55Uwgiii$;v+G͛9-..1@X$w_Γͻᄏ`wF^l2W+++88xܹ\X>m>}h7nܨ; BVRݻ7nnnF{(O.n*Tʕ_!J\Sn|E,Y',X 5THVL`;w4TtK}\b^BfשSѣG/]To0___sVFP`AdV888nݺEy࠽n2iV lmΜ9-Z z$IV7n\ڵ]5kż 2`?ǒ$]r%""sz,[vd^K&\ֿ ˜9sh )SnI{ѣˆGZs 0@;ӧO׭[_4e_7nYcƍm/gϞ9,Z/'33S۷oڴi]/0A@/IӧOϜ9ӬY3SK~믛rf5p@yǏ络+Wȫnݺu떑߿?##CoD1G޽{khK%ԹsѣG/[LO>cǎ4P0<1QFÇQv:ƻzԺrttQ ^,XM }>}7Ç޽[zuWޥOQb@##DHHHBBv?4k׮5iD۷СCzvMPGvIIwV(җPZJ*KIbccӍQQQrJ;w5j%Iə9sѣG@|QP4uU_ŋDƎkB*11Q;S?.){V ޽{yTڵ[n]~ڵkuqwwҥv933Ӥ7nܐ{':[rtt;c߾}Gq7o^ݺuw]zc. "clׯ7I&mtwvv _v!''ȩmZjw^LLvY;O^V4j(y'`.hҤ-җxb#'lٽ{|4M߾}9`?rA@ѩS'ԳgF}{>>z2eʉ'\=]'N5kVÆ 偧lll7o?8q"n۶.ׯ_?igĈ66~{an{6m4<<|Ŋ[ֽ/rww vQZ5a-z 9::\ѣAAA3h5mt޼y/^Tl'' ʧħGaYYY3g*KKLLMJJ.W\[jոq®~qqqѷnJIIruu^znݪTRU+^z5%%Eє/_RJ^^^͚5pK_B=zlggWBΝ;knGE?ܽ{w{{{b, b*~Ap*CP  T@8!Ap*CPc߁aLS1G4MLqO1s=CsԧMS+\RA s-w14K…>>,Ý יΙ3̽s9C@sTh !P9*4@C@sTh !P9*4@tn`pvv.V8xyy=|[GYԭp0*)SLBBBQ$!!L2E CNt~~~IIIE8xz0TM ĵE霜z}Ŋ333:TJ///#`HIIIHHrJ *V띜QQOQmp F1++ɓ'iii)))wIII1 F[ tzg,Q3JtAQqssʒ$Iח)S&++Kpr"puupwwwss{Tu@E-yr@333 Cvv6Q dbȀ^g0YT s...:`0deeFDbƨMK/S|[NCsѣb6y'99D!P|( X+f9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@}Q7Qegg_v-))`0us!z?00ɉK222 '>>>666000 TRz=`HNNNHH ,9M6)@>|x5jTR`2OVVVll,Q i֬ٹs粲-@ Fʕ+D)P;00ʕ+FHT2F1!!! G _Ou[NY|||!@E-јs0SvvvVV=*qͭh$Ų T#P1 ,ŤYTbYTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9n)>>֭[r900|ynv…d^^=:11?W3Ϙ[ILLLzz$I>lժU}sIӕ.]RJVn +?W~N8udNSt:uo[˕:t(>>Ç/((cǎ꿚orlٲժU3 OʒLbrss{饗̪_3g%K֮][)66V *T\Vx3g]V./ZhȐ!yn6r'Ne^ԩ:uX|w}'~]v5W6o<##C_|ٳALteʔUVÆ RR%s,?쳈W湁[ ڻwoMU.Iܹs׭[wҥ|:\\\ڵk׭[֭[Jyԩ]vmܸQZ۷G<Ȅm۶_<=ݻ&6زeO?$ 6f2䔝-IRDDŁJxx<^f }N:կ_wޝ7oޢE {?šQlbbb&L /SN96 ;vW_}駟>zH6ER˗{=1pڵSnҼy͛?~Ĉ4iܹs 9UV+V7|?T^yݻ[_4矗 ϟxɚ5krf}ee7ãRlYf_^$5]ti޼y6| ~_$ٳ'w .[U~xҥ IG~\VڱcrD)J}xfٲej&H7ѫCb@&TXQν$iŊ-6lhY36m_]9"f[.]7Nf͚r0 MHKK$)$$D,wI1iY ,T(XsIu)z'DyImM?t:] o[U.nf 常84:_| `1}uIbFqٲe0..N  / Pٵk\prreʥ"ԩS۶m[6/%Kݻ+nM41ksA;f͚%%KLL=`*(,,LWZ6ǎo4jȲigIP/WnѢ\6 f=JKFFF-zСCk\BӉŝ!*+Ԉ `[l! @1@@t">|ŋYl|8peoh-ǼXJ(+Ӵllٲ;rȿo1\O\rrsgYo,YͲ֭[0ŃyӧϤI$I\d… MLLܽ{\߿ezj 6mjb钞={~ݓ$?p@HHxst:oor5nܸ~??\%JghrU!W+2rk۴f̘q!yL9̮iШaÆ͟?_x֭gV^/]T,ѫW/Eه߲eK+o Tƌc8@\MǏ'%%y{{ۦKTܹcY 7ne۶͆<==ϟ)IҖ-["""䕅(oo.]ȣ&n߾jժQFnڴI.xxx1²8x.۷/==&iZ6gϥ\ɓ۷W߭[$IJKKW5\rEER-YD$8~W^y׷` 1b^)6l۷[ܶwFDDXrR)1P/<<ߦMV׮][ͭ\_U.R.bnZJJXT̙3W. C#P]k֬\>{5kN:te۷O<|jPR%β+}`Q>z \7h@2߿_ Ls8zDY˗E]ҥm[n ,ɐr@# 4ȑ#ryŊ[>cgի׺ukjްaݻwr``sԼ*..nݺk׮Yܟc'\m۶ǣ::oMy*U899eggKtҥTL:tH˖-U&[K.$h4N4ɓ:NkKUiд>} {ŋ `q͛7oeWZqrɓ'oG;|}}۴i#333NUOˮm۶-˕+'LIIW~E"k=xbJjjY={eN0k֬^._vmʕC@z-.\}va lYׯ_2zެz^uQ*Vz뭷DyͻvRYɓHu9ۮ99nݺ933wiF94mT.\r]vKuMͫȑl2tTh{-cwn[W7QO%8ɓ'-k=suСcǎr`0e%MXhQddx8dȐ<7k[޽\~qXXXlll><**J.*Ujƌm&_tILtqqq#GXZYfRM6"RyfBB +B@@ʗ/ߩS'!\]]-XqHR2֭6Wk{BCC/__ƍ7n<~CA巽]+;wlILLl׮ի8>>uk׮ό3D $$IZ~믿.ω={m͛CyySۚ={vjHGA >\)iӦYN>}y\t~[r=JV8+00pby3g9r͛ƍGUz/R\"<]ʕ+Eу~ƍO6m߾}qqqׯ_?s̪U[~}%IǏorI>쳺u늇;w]aþ;yҰ .|m۶ڵ'NlҤ- /)ФI *,o6۷2;VRE^011qӦMz=Rh[nNNNo<$IfRY&V޿@O?O_o.[6$=36mz/\ ?UVZJ$WWW :''QFM0-Ӯ]@Q|"w[VIΝEyӦM7Ɔ su/::uݢE 5۵򐐐cǎ0=s_(E=p@1]Yfܹ*̬YD8ab}}Z\Odd7r5\CAÇ߾}&D/_qƹeݻw?|֭[+Vvjժ۶m oٲe~134w lOO+Vg%ܜUT+ r[VV$IzL2YYYń+yȀܣRԭs$*j^ggg^i0R C\\\\]]z=Bbysqqt...!++h4@&$}m^ 0FlrX-'}ѝr;! +FX@p]1!P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@苺*;;;>>ڵkIII NN XBQmp<񱱱J CrrrBBB|||PPP```Q->>_mڴOQǏרQJ*EC?ybccROfΝ;Umq0*f0W\ $JJށW\1EGBh4 E8z0T̐Lw 㓜] q$*jƬl&YQQknF#A0,MT`1.&B` 'B@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh u`ʅ 岻{z311?W3e||[r```z'NDEE]z599Y.]N:۷VYSSSMlQbrʙ6bbb:CԱcGwwwkjpƒRSSK,Sz6mT\Y mVoXbJ$I}PB ?,9jժ-[֬bbbrRjժUKlr(u4w޽|\~gWn%gVjE^z%s_y\dڵkĽ{^xۏ?.YdҥڴiSfMծh+V~/xυr'wqq_eoz֭)ׯ]&֯_)?{J()^IKK~DDDai&M7Ϝ9c}rorbE?99yĉ&~ܚ5kvZ5թSGn^V޽{oڴIe;s1cF5{RJV{aŶ!痢ɻ;"R`Xdܼys޽6iOv>>瓒ƎۧOlVW( vޝ kd˧~ZT)|9sՌӧ ܡC;ظO"ƨ8{X>7ڰ=JK,3fm۶ݻwD2hll6mt9 :\rj:g̘{EFFFRRիWϝ;'~Fƍӿ[unذa ť]vݺukݺ$INڵkƍݠ} IDAT#22]v)!;v֭+"9ܽ{7**j֭;wLKK?ΨQ|||Lܖ_&Nԭ[W.=ݻ&ܲeO?$ O[j"[`A-d넄'ؽyر+WF/EBvر/*ٻwoff¶m֯_߯_?[3gμkb$$Ik~zUZ5;wܽ{ݳyf77իW|#wEk{N[? 2e|h_tM65HQ~WLldɥrC 7opŊ#GT9s۶mG~(.~?;s(E;FEשST4o1*Cunjb?dɒb5j䷥rJ||k׮ׂf2 |||;wo;wCYaZj$pi' w^!9Q )ϔv:lYL"*tqqٳgLuMMMs3;E8FeR.k֬1 GnONNV^ zzzN27V6t}Vaϝ6OV\x"  :so`'{=sb#Gl'nynShGq!`Hr ?\8ŃLDV}q1 `Ϟ=:u2ᄏl21ҥK&bkӦͱcǔc͛w=zÇrjՎ;֮]6裏3˖-;qD_?~~~;w4=LPPΝ;_~e!?>88X.gff;DnEbicdž233E rݛ}vJ0aZDz&Y}Zl)2eD"d菱zes"##EGoC`󓋗2Mcڵ&Fw+W?qeʔ11:EfP"Pq +Vz$IZb5DGG ڬeaÆ'Oe,aB= $_&qqqY~Q{_^i?\Yn]Ŋ ԩ[zzɓwyϯ}}}Cޕf/.\o/~СC7o疚:vleӦM\ڵȑ#*ʖ-+tSGlN٭[4Lc^<\Rhv]f D [eԨQ%%%W233E$I#F(LdףP"Pq /\޿9,Y$++K$gggsspMS(:hҤIŋN^k[a~wȔiC Q?Ǐ9gȍ7DgϞ*kѣΝ;{_QÅ l̘1bلjժ8kر %{Ϟ=;t Ҿ *s{' o7n,ި@ʑ[nUVKiCi4";\>c1qddMԶ`8\re v=> @1ud߾}b2SJGQibʔ͛ ⎏^Wvٕ=N.ݻe0cƌ\~}ժUr8> cPXnڵ… ryk׶rH%JC.]oV%&&>zH.y_~efOCQ333ENhѢX9ػPoƌbݻw;vN7{lӽ^Ç_rE~XBܝc qIL Si 2Q-вeˡCeSGJҥ-GlVI9 _.nzyyڕ=N.JǏcG夽SL#oq'mOB$}Q7j=xos̑۷o+Wī,YܻwoP`zrW$I%JUV9rHu{rKJJ7[*•^}˗9RBϞ=e˖;w޽isq_xTxUfq̞=׮]$Ie$}jַ)cg׮]*;`wm61V'((H ׯߴi_$%% s͜9wꈸk.左f"iW4ߋm_~'Op=zeo_^;i$(.$$"{zzvM899yq~/I%K>|*J#Ǎ'~L%IOr_(ǑY^;72>}TVmرkG}qZl٭[=zlyYԩi+ 1S۫:,[ٳ< :t0x`5//c'qȽ򝯯o&M׭[;XF ,ҥϕBCCEy˖-ּ]V6;X*PFʳ˗=z(bK?~۶mUVM (J*zZ˗/_6qj3t:s2ӠAKXXԩS#$I0`1<{_&MS&}6mڽ{WU#1'sӳ033SXn<88X9mЧOrԩ~͚w5k.11>6Ӷo^ իWWSv<^{N.?~D܈MJJ G#ǎ<ᅨ m۷5BBBh?~cb#ŃhM$رcڸqc'.\LP1R߆9}iFFO,<<\yd\\Y/W[f͚LMf"$44T mj2O2W^U&TE1] o.*%IOs:k,w `9v,aÆwsŨgq9eqI&8K/$=z$O=T {);J}-U\#޽{wBB+8*4v:heGӳO>T[>}^{~ŋL/0W̝@Oˮm۶1&M׈qqqgorʉKIIcոxX5wU hܶm%I~(瘘ˮm)))~avv]vofmy3fΝ;iJ:v,yfQC TjUWlYf=rڵk+WT3Vj*V%oooq_=ydddN'(~zɧ7-\p * <ؼy!@'O~\[ \nѢE&UNڸnݺyw}WLܦM܋=+[N]KXPPPj|GbfoX\h4N8yncׯ_zެ__]SY#GȲe8pȌu;c!{/ӚEDDD[__=zIwrˎg|:8Ç4EI6wrd+uA d7 aaab1-ZA5d4&,,LLJJ21uݻwˏ? -ÇGEERJ͘1#6}quuǏW?>oĉbf2er$m6@Pc3fه͛'ί7o7n\i1իEveƍJׯ󶚫M6͛"QǴ>H޽[}GC)_5ߋCf֭C:tPTME;,8}Dʗ//~t222䂫]g%a޽{˗/oqƍ7N+Xiڴib業[9r;wخ]իWq|||֭׮]+3fL͚5soYZ5 ӧ><{C?hРvXyIׯGؾr~xi&ՙ(︋Y%///a4ͽ7lٳU&Ei}U7nآE ӱ۷@E;+?;r"F/E;,8})Ăÿ[]mڴ))/^[oJwy믿ڵk&Myooׯ?~|ǎ)G|}}MXE=zg2 &MoF__ߕ+WW^7o;v\Jwwܳg\5p׆ӧ?~$ƕ+Wn۶UV-Z]vʕ}}}޽pÇ8p@nA%گի͝]nݺ"RO>ŋrm޼y0z۷8qB?e˖4uwiy$t3>}|rY}F^{57/իG:uM6͚5СK/TjҥK߼yƍgΜ9s̾}})*[+V8ߋׯߊ+֚5k;hGӳO>T&M4lP)N*4ݺusrrz뭷RRRgbcc LL[fO>}޽3g/^_RHHHxxxEO?O?74DΝ;v*gw^ddhtʓRpppddH-6cxfի88yҥKş~m^h޺ukytP|| -Z{3M;*}7bn߾N;VRE^411qӦMܮ]uk׮7|S\gdd:tСCB ˗/o߾7rW,P}/ZQF/H$sTrTIDATh`דvXp?%SԯbBW/Ij׮]<''N:EGGh-5jxg1$$رcߴ{믿Vs{С{D牤L2cǎ=p@Cfi"ZjSLQ+#5kv )'2O9f͚%RGTrqqY~W_}~\=z8qBeR {q2^/4 dדvXp?%ӆ@8p3h߿|ƍw׷{޺ukŊԒ?P̭rUܪVm۶-[7A``1c~G'*OOϹs9sfܸq/9NQƘ1cΝ;7sLS ةaڴigϞNNN}YkeN_{#T.Z|r)%_~7F\f^okO-nSaa<==vkmvOOO޽'=*f|<>>:vf6f޽/0^{1 l6Ǐ>|xjG~n?}ۇqg73܆|<o߾ϟ?p>=!0Z޼yZ_~\.VM.0,ŋqx~X,W:d2pwwի/_.iG57$|p:T _Wr\.www8Lri-ab8|> &SLߵ8.wT.6et}N_)QTʥ\lZdӚEO>Q)@ W< G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@Pr #T G9B*@_qCvIENDB`davmail-6.3.0/src/site/resources/images/android/androidemailaccount3.png0100644 0000000 0000000 00000277631 13410710541 025130 0ustar000000000 0000000 PNG  IHDR8p]sBITO IDATxw|#ս63,K-vz+B@Hr@ r I $@Y.z]eYhT,ے5Ob#id͎3ߡȽ"BB'{T@pT@pT@pT@pT@pT@pHTR"VKĄH!Bux|NIHEtZ2( d*hn9mvϿ K @QkFbO"ѹjEZQ~bg⸗"TAق \*iNLrF.9)U J,+d鞴yKYk6GL, p!-LM>CyŢٙU]5h+*`L$$Qƅ緸<./lZ:wwlnv|ר\,D*X#2}<;X>3b;M) b1JQںAT^ϐqg{&mz,mVi!#v1huD^foD\¨Rd+T/tT diHE"[._gH2 !E*YJ9Y2#e2\C:nE.ULjeN *:MLztp,8 ,+ke%U(Bͺ鳝V6p>1sٺ=i홴hmnRxtpt-Ւ)%vZ" +"Ψٵ8CptZ=~}%AegI~g?Du(UKMN,+3~阰,a sD5y ]FRfT)2iZI.1jwuLXzHB:^B)ԈӑB"0idl\lH)sHB.[U:H *Nwaﮆʤ[E*L*g>14~tp,:7 l{ z!aNJh?C7Wז(} Ό|~a0eX)\[W4? D ;8iu9}Õ6p)SR ٗVJ?:׆TDʢb*tn 5mu]'_\U2Gz+Ȩz[O.r7)E' E^!pkϏG;P2dJ3I=~#GR cf߿,+g *kQB*Uvg#G3PZMf{M^N'R Um+6eD,7 .XYvT2ذbksmV\rO./WRȯ[QqaIO?qn|1J"!%Zd+f{! ?v8!6M<ZW޼Va<*XfFν=C2I_*_bCJY".*˿,h:EA{Z{{~QK%_kxk !7xm0vbnKFu{;~fĴJ5ܶ@\x͑ sT/$$;7o+΍ÿdl/!De):*~SaN؄HX_xHs`H)%U4Wm.2f) 6LzUOQvTDo*4~hnS޶}']ԖnZl/5]e,PYX W|ս7R}iEMOPtK1"G%oڲLM vg{N2:p;\ͯiz}~ sC \U]RcNwB"JVJ!OPK%6ʪ ]1vܔO//Rd4~陴["~|acJɻbpWdlYQ^Q?;\;tt ~Uu+*;>D_%߰:p%C'hgj\F)P_!Eȇ+ o\]H)^z3ÛDi.Qh`#]Mvz?U߼v]^6oUF.x@$+\S[e13t5s[Jk ٺli].[iyVU͵/-/d1R'U4 r!bHe rYeQR|n|'"+>3b'۾Zqqy_N(G*,++k⩔bq{~m}wo^9}x'D_:9dZJ~}{OܿcECx.;o,ȹe2:܄2Wyj/6gX{N+Z=i3$KW&k=ZmNGLt޷"Z:5*?u *9sBA=??oI/./x\B^=:8((޲*R',9tbhW_I9?;icTIl6o`ZBvEu1/he_hv:vd`J{lT] FfиbGO{8R^=bR6k"d !dC~6i#_:sjx>=7b`JqMmo93gvk݃<~+. VV뵛 ׭蘰x"qx}w WՔ|?O ݾM)ݓWPy>!!јk`t'S=Wהe`Wd+YJYJNfo~y3p9 ֘c*(:_ *x]~>6qWb<}CB,&e'a!,Q%_75`!̓MR>c^9dSM쬦 ϵtL_a3tɊl7-,Ssۺ+汩D~vdK 5!iwoxye{wD`_Gl E<"Ts *'9KWbTY2Ơ6O&B|Uqg ۜ쥍\B#$Bm*4檦zIc| ^9cBKze!FbCA6 ,/\[W~CC͜RK7xgw"CA{Ye!!d{7EبVoLq}VL'5oCk|{KUj,KhVRΔp},ٰEe\ YvyO|sx}{\>|z MS𙳝S q!;6]2]hnhQ):R^GEMyL{`[UcBtMe wR"to+N6c-km*̙Gw7i*>R+0ŎJbqxf\W Rnr|;!fӕ;&,1uNBLz&m쓗jy0̏T$ rjĶ*uUjJBdž({3{R46:Oֱq/K F)o)2BI+!8Cee13 岊a 4hG/ Zc#uy4i"JA'6›2G/i.c!6u| *4E*lbኩN gt0i5M&_kRd}}]x ۻtJ!$q9:vs0gSDRK%.o7F{\.Ԭ"XܞC&[=CKVdQQY>;`󵵵JcW"ejOr|/ 3'7^`S79] %hf_}-y]@%"UEH>[ 4migUt)Ca}C6CvJ}*g_?eu{>l 1hu[ct a-d:~yF }U\PsMmC,R鞮cx~{liTY[5FrW_%*Q*hZݺʨwCCuwaJ`gwS`ȷ>Ķ 5+g}B1M]1 M) F=pʁ:n`vyj]W>;^ . $G"dE&PZv=28$7 7.9ZJPFBLѧ|oϑYBFB![A{m]yhg~Rq^+9suCCu<~.;BgSMiڝnsc=!d[qMTߺ0G 44%54mxCEuqcA#L<Fа7D- 5':t&B֣"Elm})*g닇WpB(كŹ T@LID̮C 4:vxc~z&w}S4Z'Aؔ콘!4wF͎~vjizֿ9gǞyNywVeo[W(hV tS`7b!{?uKZP)d֕kΕ^!̊rb=P(CZkGI^ vf8+D /'| Kz[GNBHAQJU9ZJኲ!28CI61cj?]q!ɿneB'Fz-6BHA{Us}rS_:l3Y"IZPMN&%\z{/;^B74TDՔܸzBHV]ϨgzK’D4!0;Q:]7:Vow!m k"̔N-)V3p=0>j&.*%b𑳄V)֞/wv‹GYy;WUb^CMFKwwJyy`n%ˁ@1ٙWT%kKn\]ذkر +"=!EUEk*()@@zlb^k\(CYL)p:R#N7!e%-n<`}~6!>*{s.gm!DhDjJ+gfk>$hLPIb\z>O@ȕ%PZ^j,ԨJLNoPH%ʾfW.[eiGGDX>RUĻ=V= `OMgXܞ~p 6Bz&mzuٙGL6Q)!>|Mm){m jЅS !dD=VGNLT$鬒O5u0MpIQBm ?TeXewP4[nP{m:R &G%U>ȥ$rJ! ' 0쟽b@ ."Q|eu [+<M\>Р1 +${/4-XBH\HE<~BWMZ}?K1+%Aw=xzv5}IBS%_mLsz}='U2HD4&7koo@ <Bt ܸ:W]R^vDеu# _][6<vα`_\^@9407b't6BziڼJ9=jp*9jgPh՞x҂y,uSq_O}x2hQM9k5EH(1M7BWV PHDO xJa=us2B-k|=]~aeB}1lncvu;Hh-.(QI ri}_B%߳1z.Zc((l*'G%EXLBӗV~r~c74b塦#+`K2a/w[e՘N`\KOEzeӋRUt H78艹 {/4bwvL/ey?ϰɎj5ej2\,=bBBK\C|"astp셖ŋz0FJE+0 9:8&ؑWՔ|Sz x3^[<T<~C+o0 gȸu|h3[XvT˘y9K%dRvMwH{Qg˃MD*J\N! !n|B_ +:cvWie_Y]EH]>ˎ ݓ 4sfA|h,J֡nE0Ӊ[uT@PΌRIrq^uT~Uu+*0kI.@ȽJ>@HE"R"2[\ >`pGMwD`~,ug_0AA 1)I>A                                                            */d!N$7p=;K@9di Ґ̔'%h^gےD+RJr^M2oy;;i %T"i^)ҠS3IX -BQol/ !pyX*sTR-Emv90KG)q@kyMf_HcqyHՁeMLx%4C=4*H)asO!(eE=vϛ?&{ mA) uc]XpyHH)+= R @JKàm R@(2U:gF\ޖIG'_W*Z-~'^O^izXDIyד֩*T2DG#JNȔ~fm8mdĢ5:UB":f-iK292qTlIǠ3nG !de\%˔>{b>Ģ uBgH͵o'4xipl>,¡* ,VgJfTmFJÜ8r˲?]UfHD_r<8f]Сy~\]D:O!er{l/OsmQggvٟTB:*S0g̎MniP٠SyBc_<8S!*ו/?g#mO 'k*(>5d{e_*lݧzѕ(7Wwdf(xc玑<W+1\`% ju2}81h!dSΚ9y%Fǵo=#k8gO}:룒Nוh{ty:{ϟ:F1rCPH3TR*K6eYB/J-6Hi*!"ZXl{6Ih{ n,(MZV#LAǻ[؟]WT6I;ڝF흵{nWcyuz57P($K2Vf*Wf*X}g{M__.X>DP5P 3 E(.'˨H%T|In%_4vVUp˰+Ub+>_kX(R-T?Q?fx\._.GwO3% k* RU9\!o^_u/lʲ\^@߯+msg{3K& JOy'"mL-=E8TU:WH_ZS<6 "]ӨuzmAʑK]_bC$47UE.^dԾqa- >YdBIqe4? % MYm(/˭ӫ~X:ݛ}חe؛ZWh1n?WZ[c~,~`e5ylew//Z-595nt3h_ҼϷ|+AIc#%9g4CRkFWiŹew;|LhY|KVAthpdn m8wN:n.Wɶfk. )MvMӳgx2?|~#l{gIJwp{LRVޙ,PkSM1!l~rzZY\Dej^ŋL/+ ]͵wauY} 1]իC?]lxc$_}Z/!7bi8])M*ZZ,ZR^"2 =>D,CØN~Nԏ/rF:m7'NOTTѮ %JK.}%7-;#N/È?ϼ>8;@s{mbn`iVfLLz|^0:=X){ ~p2ɕC>bO깟! ?AEzRxl?%X-4Y8lKs}*R !derE.k Q– w{o<Ԯdk uB.˼ cfH%lʶ5&:MG&_!NmP:CO~|/[<[v1~X*7V1h~e cZ#];8nݵ{;"t||*Ov /l`08',8 ?CuCr)!WML>CGYw&Vznu5h0F"{Y_=z{zik5{߶ޭwJW*jdɭtU~֠<>a;>暺`\߱RC`)H9*QR ,SfeD_=.%|Uc^xw7/ 3{ xCR(x1E^dG;OtGx|wrˑw_ LRDe/Z ,ZOkE.hoԼ`rc'67ަH-Qq) EyG;z;/7gk"mɒ-YA׌_0KzNH )zIdPAJXCmc+#L.lTn nHYG֖"\^/bߨc]SFc:U*p< ]h'sNB%"%{TXQUNL?ĩ t)<#xU17YQj+$Fy,w .]FOTA#ۭq;RTyױ[F[sN"#X櫰Y%31!AB1jCjc+ÛFcl! 2_/As}lNY:mm|,-͗|m֡&c#4?Ft n{Tyױ[F[sN"#Mb*i#:=pY]g@k`|!#Ë oe * _\}Yvm^ Gp!+?4UGI)d)-)*KG1,=䠎Uq[fV`zRQUFeHW ;=?:3}4W.0봊HGfRڲuzG:B$:1aSD kju |)Wknpg$7[Qhлyldsx,TJZ 2> )o=u+tF=T{G->r˨ݖ K:"6ݼg]'灳v$+Un^U8TxտaVjYjFJ9g !` X ?o! feabc=:![f/J'{nZډ[BVeRi0 S:Gwԝƙz_>{ ݩhK8y*KG-^w:e_\q$ rf+OGp]j<ҖcwdNZcGLQ_mas^AhN܅2 !:Ufc::B{k?8ϫsNmfxˌ7X/ՅzB'T6TMw_zl.sbbӽ"_(͊%Jiܗv|+36|Es xML(Bn6iU^p#A[Ϋ@)bY ΐwG&cY85u$86"s},TJjze`L宯WcT|&ENo/KӨ\z eA_fcQC,Θ/$4jc߫Xuhƫt$FyЬ*vLA̛+cmE3*_V3ƅx7(SWMFr:96xSi1T*Y%$l*\DڼזS~v?t7͏v ϔ]۲3^ZS\˸i񋖁Y ⷭCǃ&gT_V"ڲXe-~ԗ+WJ|>yy ,?GHDPqgm^ؚyWeyS#KU7U.B39~1Ƿ&c#Icct~k&5E8$PX JkAHr(WOt=7T||Kw1Le'7+8d?/t3f"Kr*6|@ϛbr;'{^Z͍ ?7Ugx&[ͥ굊Fv,LK IDAT')uW{"PW.di*}ؠ fu#,/lwg])]WT=SQd+]w>?d }LwVz'j-2xh*jg^>^c%E8TR *d)ݿZ]ʭio2Ret+LHnCn6^Rm P\d^d>l2N*{r#ǭ {dZyE~(QgH"*~hײ uVY_hz}bʔ^x P+xWO봊{(y}fOJSziҩk~m`*Su*v/V'u$ipl<3YUy:G#2gP$bs!P[_֎jyۯӫ. ^F>Lp8*w(nYWϺ}\ҁsOD>KG3^[ƶ2O%4Fյ-í s@JXHiBF"a]˳5=Nt/@J9 %<1mչ, 'C4Sq7CEH#8~ vX]5*Jj,1MkNBGچFp>Sfs&LRo~p8 Roȹ$W[Qz16Y6b? P8 WJ)KSi%b"&wmt2'{  (* 8XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:] QAPAPAPiPd?Bd,q EXLQlF!O\~!00 a"m0!"5}cy("H)/ By!lA)!S(*RN)bTD]!pR s鸃l(BQ\LX]܂amP* BMݢշ"l4_TR; VV(0kMU^p-!@PY(n!9:a_45S7VAPH Th\X*4&tM`A ԛYc>3Y`lY]͐ eFR$-*zވ.={﹧~gPC@uT ձ m޼9;;[N[#CCC崫*qttz<1Uxe'O7n8qo߾[%1c2XZZں+T (k׮y&fnԨ#̣Vz~ݻWxzzv֭kWFqr[T^}ǎ+[[ يV^ݶm[b ,HOO͛6mڠA++;w\|933StUV曏?-[L]XXX:::ߺu+///>UL9dΐQt5kѱի㇇ھZGGGۭ4iRfM33k׮=9wkԨѺu /*B4:t8ȑ|I4͛%I277ٳa;w dee}ZN;;;O8QoI.^x K$''9zFswwo۶ɓ'%I*++r劼YEPE<Jpqq12sA"Pi׮lիVV^k*IzѣGrkҸqcsN+JTԩS"ݹsg#Kr5o_rrY8,,LuʁFr}xxxiY!%TU(P1N9HN9Pwރ-ej)X {f*GPF݊$IWA$IW^MZXXItttxx?{ޒ*TufJ[aÆ2cDzzz||[ E`w-9amm3<🮨rL'/((P-ZJKKEZ(\ݺu}||oIJJJ~CtIk!_@d*jرce>ڵ+***55TOQF 7t(77W {~jZL4)##C^VViӦ:u4iҤu֝:uRK @rر`xUyt*tw,VRz?xӦM{GFFnذkV~ v+Vȇ<󌛛[ڵmll,--%I*))矟)b\Ec:h.333olcc3nܸ~gϞvr\aaɓ'Ϝ9ӯ_#F-KxT 6aY>}UNNNeԮgoooee%Wk T`9UH7j諯zG1bĈׯ3ݻZRR2jԨGWS@"V~׮]Ǐ_V!spp÷xzIEc"{{{yU?xWLL֭[cbbK`Qy2vRƊ /P5ѫBW~}9QTTtҥLEc:uȉG{V^.%%%ᏹ=*I=h몬+z}ddoQQ嘮Yf6$>|~{/**={SN``eddT` U=*I9~)!!P7>huM/?qℑftXXc(t]vرc;Ubbbmۦ<#ȈR.@")߳gޮ5k;vL*Wz*zM43/_\tСGLEc6mڈ!U˗/7*\paٲe۶m[hrBK-FYn?! 4P^z'cWFFf\i} ҥUo߾y1HMQ#G~a^re߾}QQnرcjjy^x9Czzy-s]rG:pgʋEEE}Ç$I1113gC;;]*+%TOFr1k~WYwTT|xեK[[[+[666rgEnncXbעE0%%_bCAAݻwvvvFŒ*t&L {o׮]eggg++ܬ,ɌٰaD"Iǘ1c֬Y#9.\x񢓓FsNVV|_@Я 6u֭[+ϔ*GGǷ~[>ϟ?Uo PXXXxm]888L>]TRQwUnRPPp-ڎ;vZgܸqaYYYff+W^)b kkW^y_~x'G boo?w۷>|XkCF~mӧ۵kUoԨQ-[ܶmիWڵ{Wի'wREc://Eر#"""==]몃C vo߾=:::33S몝W@@UjMHHϷuqqi߾r5JWQջz+Wmll۵kgggWܗ;w8884hx1117oh4nnn-[KP!\]VVVÇj^Q"PHŋYc@EKqqqjjjaaa_eJ^n=Ϝ93iҤy3fxۻwˇSLyo޼0%̬2!ɹy#O?].%+3"zĉ5?~_|qqqrcǎӦM+gƍW\,--533VZ&M_y޽{o333C]t֭[I'''=zoČ3Dch 6$),,o=vXvvyÆ g͚e(T6mZNNQƖ-[vzEW˖-7oܷo߬,I"""-[fze˖K.eggq[֭ꫯZYYoBBB{ĉjժծ]_>|cdffΜ9SN[ZZXBN'&&_/_̔]vӦMɓ'7o\ӧOǏrJ^^$IVVVjjݺu׮]LRnr4sL9Vڒ%KǏ ~zVVֽ{lmmܞ}1cƼ&}e ΝۼyhggWvm޽{?֔skffzjq>88xO~ziiE5Zjս{ӧ*̙SVV&hѢErjժUo!6lxҥrjiiiuD'^nnns}MɆ .\h|ZMdJJJӦM崙YQQQqqq``/"7}7ŷ-IRbb|k.Z.''YfF#Iggg'''[FZ33OK%''Ϛ5kƻ87nIRRRL[W^y^+wLZZܹsuvr%''믿6$>||~??۷iI5wܩSX^zhv٭[3gΔ[ѽ{P^:uwynܸO? >[o-[LUǏƭ_^9:W_5V><*>}zbPF͚5ԩS]\\ f͚n:#e6l޽ʓڵkܸX/K9tPG碧Ҳey̙s0s=\~|r_]ϝ;-[ <8%%EyS $if2RfZZZ>}o߮uٹe˖mڴ_,**w?ꫯC ƍm۶yvvvZw9C=:--My{۶m5k{ʕ+gS*SVV6rȫW*KvsskѢE^_r^3tO0Z睜4hĖg6{EEELڵ[nݲeK'''eΒO?… 5LNmڴɔ?k.nѢC-* /~#G :T?C˵L4ȑ#飏>tR||wҥڵk<'Oˍ;ypss>|1chet֭[崙ق .1bD.]8p **ӇZzСC[hrJCI/'O47==_<~I`+W$$$?ONNN>yĉmllDСC ġѣ8zܹVOMM?~QI|NNN~\\\\\ܩS.^̿|I&ݹsG>tuu SNĤXu▲ 8\jٲŋbccf̘q q>>11ի|󍇇gԊƍXh\e˖3gΜ;w͛[nm׮Ȝ`B|||={ǎ 0xh+U9*=zcxP/Y+l6m7n(s˖-z&$$ 2$&&F>ؾ}{߾}us*rZj[t֭a('OlrJǒ$}7s̑ .;e̘1bذa?Y¿EG?p}Ŋ=z[f||ĉ7rжmۍ7je#Gܿ!C,_\D!C=zT1x9*”)S,Yw…  t52,,cǎ9nݺ*7oެw &3/ޏ,}nK+[3::Z>Y+WW?1L5u()KKK˨-[ɯV}=Q?EM]r ;w25j{nQ$IM6 ~F7ߘRnݺm޼(E$-#FR\\\Zh8pW^yETQbccm^zmذZF aTT_GkJLFve'IǮ]{9'ڽ{JM6ݳg$IWS#Flڴtի9883ʱ:M:uҥfW{zzYF)))QΖV Q}pp;t蠬)?hh=GG@q;v-QxahرF)<T@E9ӳEW]|Ywo(̾kWWW#6iDK^nHTi rР4;`ss#G'''GGG'''۷Oyۮɒ$n"K^;c{נAq;f斖}]-QGG+VQeeeTw}+Ipvv4hLƍæԤI^zCs3toP!tuС?Ի{rs=g(YYY)RaIM6j(#\^=q%xxx(#%㳧Z)xhzVYi>3gΜ9s}r˜4i...޸qzYnȾ}DZ\9sYvvv+VXvrPϞ=kדtH2[^-ݺuiY /bM)Eʑ*'N!}1eOΝ;+njcʖ+N6͔`sܹc<Ç__oVe0@7ڨQO?lʧ"99PD:<<ޅ֭SCk<<0Uo(;N>}r_'Y5022R1”:XYYu}?+I?##Gԛ'""B9xf…zsʾ#5ڴi#Ϯw^tt2IJJ}M2dXr[yĉV);{SN]lliiihh w$I&*"UI$+Ҕ$ۻYfbm0ݑ{^yzzo^kڌ!r!0W1f̘?\Onj(Q yhxV{Toaa!Fi{]ݻw崵@rASJ&Psss WTn 6yH++Ӣd:?clmmWg$I ⿴7(prr\]]GsƍM)Vi֬)wլYS<jZ徃7WԫQFdiIrU%IW{M@KUQݻXܹsC7nXltH׫W&ި܍w:vؙNTUy``fffdi>3F9W]}2 64eRw$I^^^]îLf>kҤH+ƍe: + #{YAYG-..}֭['pTxhMV-Zb"I?ܳgO9''gտk&Mڵk׵k!C9)wv횉.T 8VUZnxiݽ{wC)Dk q;Zx+^)>@b'r /_uK.eee竭%:z@9¿}vHH6/}}0C$Iruuݿ.]'o{hѢcǎf:s*PRRR!/J|tV>|X"(y2iQHkId\S(jժ/NrQKNNΧ~ڴiӡC~7LNNS["I2]+<::ܹsW_}C JT@E$wwZLg.[K."/##^L"-ZЛG9@F\V^`+?n!BpqqTڷo_NK哣f5t\-zCӧO>}ݻv튌eȑ#SNջrv֭۶m`5= e̠7Px躱S"Zfffg$Ii7&|G3e2i$aժUkݺuÆ -0r_3g o߾}Ȑ!rmC JT@Eֿy[)%%%K.qrյڵkK;z+v"D`dٱTxQnYQk);mSM$vؐ$I,&Q"bccORL2fC[N4[[۞={n޼Y> ɓ'y z6eʔkٳg7ʛ7o^p-5*}hWIJJrΖϨK3<} P Les=ʝ_(EM<ĉ&M2Eȑ#"~zяԱcX\KC J:PQTS|}xCMYfR_~Y9\vS={v|iiիM)v o|r;#JHHXXw޽{ŋʶlbJ'|f̘4`1KKKL,Sk׮C㋞qxnnrR ʆr5;?ۧ[@nܸQD2-*@E $ŋ_pa#nݺ/_lpMwnݺ `=fb4FQSSopYbu[nj/*)PV+ӡCqn:CkRvխ[_~&ި&~lZA[:uĜZϞ=E7QJJʑ#GĎNby0<f͚tTT;v(L0כRk]>}GR4UQ/YqssirMeאrKGG8p@NwСsκyƎ+WTTCM6ZN*)))&-^8<<\oŞ;vسg<ʦmuVny-SfM|.\1r-[...#FxyhPU*)wO 3޵kr$ƍsg}֔2݃_@@Kegg6o޼>Ʀܿ۱c;vL0^mܽ{2ڏH-?kfb$5jx~Z*I<==¦N7133ԩ֭[!o?tZo33֭[Ν5j)<ԩSFjժ۷o߹sg&MLƍ'oݺU\3f,YD{իϘ1c߾}`۷:T4O8qBJ_>uɓ6l7ŋ###{ѵk'NuEoO>=zU?<<|K/o߾ٳgR'|{^zIo߈uΝcǎuٹ}C{ǎ[li<9sD不|Pz8pԩSyyyvvvM4ݻr%kiiYfM__r>FDDD;vڵkkӦW<^xAL?~… 5jpvv~ƌ>}tXXۣ֭Go#""nݺumѣ3#wޝhׯߧOTEyfTaaahhhll[ 7o>`Nݻ7...33ٹaÆƍU4,X0sr*,,ԩ]~m 5Xzv@&ڶmXquu* ToM8QN;88ƪ9jz@ 5l01&##Cؽ{H!Py:-\PLٳgOn+ T°0q8|J xTN]v}뭷%K>JPV\ym92bĈʭp*O/_N-X`ȑbFɕl2q/V.Q PyÐ{7e˖+xdff3&!!A>4774iRV < jߙC.sĉbgΜw 4hذaFܻwΝ;8oׯ_qU222$IOJJ:zhZZ_'W }ٷ~c:u6mڠAGGG[[ۂk׮)s~ᇟ~1 mXNn1W a'GJO>h4q֭[n*  *ΫV"JiERUx{{رAAA4eVev 4c PI買ݞUsʸnbii_#PZ|}}}}} .\~=##ֶZjuygڶm;p͛WvʮB%sqqYt˗sss7nܯ_?BzQH<':*T@PC@uT !P:*T@PC@uT !P:*T@PC@uTeeW@_UӧWv=*TGu=*j<~PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@Pʮ~- 4裏LkGݻw9r#GJJqqqvvVw狻I>^&ԩSqqq999 6Ѻ=55ɓֵknժ/PxRT@%))iƍϟh4Zڶm;rH7ƍ6m*..V߹sAz{Wjjŋtǎ|+VDFF'L T_?șMrnڴ^;vCCCO9XRf^z 6LW^5?~Ν;ݛsƍ0`|+5`~<)VjժBW.]4iҤΝ;*$""bչzfdd\266vԩFjh,Ys_UXXm6ݸKwެzK7no m۶˗/Ϝ9HM .\xYWsssׯ_5vؿ_-((Л3))믿6mZ fU(P /୭4iRfM33k׮=wkԨѺukB"""~GQ]f ^)} U… EEE.]t15ktvvLKK5ڵѣֽ ,HOO͛6mڠA++;w\|Y|gϮZ74RkWFq؂ST^}ǎgmР}aaaZZZ^^hm۶-&UO5Bʆ D{رWϜ9j*ySQQц ϟUBjjիE!]t3fȰm۶Psz+#:uԶm:uܻw~?\Zj 2D9)&&AȟYFdpuu@Hdaa1fqN8a&ӧOWF)$M0A+A^uHdee5lذ={3.\@J,Byxx]].++rkN>-'N/^qloFFKKI&if͚G\tIy5>>¢M6zi#SY$I[ѣ^_8tuu^zLN_~]jP2K9JW>}<<????<`L=m&>H׮]Ǐ_)n(2.~hժU``ۤ$<<\N:>?qbccE^Ě) `JIĮZ1^bt oooq?B|}}E:##CyI9&|US(]<' T/[n›7oQ eddddd);^(7TΓ$k׮bZcnjяٶm W.KHH0mƍ:&y~@o߾bWKU6n!ﯕErBѬ[P9I4hԦM10` .,[l۶m-Rl {sf͚cǎCW5xDF7P^СC>h۶mʶi^^ѣG?쳝;wݺuСVi%QQQ_|r\EΜ9#uUc:88y۷Ol"IRzzoh"ygs]rAGK.⻍ {$Io޳g￿~Bjjؐi `JWۻv풛˙۶m VMqqq^^VW@v&N[ǘ1c֬Y#w \pŋNNNNNNΝ;YYYQnff6l0'''B'L$׮]eggg++ܬ,1L.ǧ%^zuҥʀD/-77Wh{̞F:P$iȑuݰaXz,77Wwrkk^z;PQ})++۲e\TYYYfffffn9CׯB|}}U/ $~vĈ}5VS~/^gJKKQor۷oKT\\|vUB]=P$gϞ;ydzzr0VZmڴ߿Æ ߾}۷GGG(vvv^^^M41RעEvu} rss3U{{sn߾ZK988taĈNNNr"Iӧ+=Pݻwpcccܹs]sssggg777媵yfvvFwsskٲr/S$&&&&&޹sA;8&$$ںo~O!z/YYY :ȽOXI0zWPePC@uT !P:*T@PC@uT !P:*T@PC@uT !P:*T@PC@uT !PػӸP'QBEArHs Zѭ5sh2YiF9(*8( (2~΁AZ{YؾgA8!Ap*CP  T@8!?*6322ݻQmJPQ;;3/~>}xW_})vx7o\PP````nn:jԨɫV:|7=z$rttݻ)SKl>HKK .lڴ$I'N?~lhhشi3fL6=DfS}(V͚5 ʕ+'O\%}9}\޺usٷo-Erssowg $&&W>;wvlmmFN8:mڴBuɓ'\RϾ&pێ"?2669[ǵwמ={^y={N)$?smk?uIӿ⋞={&$$AmڴI#UCϥK~TIKKˆ ֯_?'''>>ÇG3f0777n\qmfdd1&&&7[njjBBBk׮z/"44T?xU7*׿)_޶m[bbbDDĩSBCC?>|pNnnٳkwU++>ƍn:w\dd7ׯ 鰒Rf͚uر:tHGv^P1={̙3)S80tPjݻw߼y_~yeˊls˖-۶mS۶m)'߿_Ϟ2 ,lРu޽=<<xQTǠr!eGƍ,Y]vYmܹJ͚5۳gO˖-ټy;vX[[ˇK.է={ܺu>]u *[m۶YR}Ν;rᄈѠٳSNݺuKwLMM-[fllP5TꅳK?xYf)Wioﯔ{Ubŋݻ'IRnn͛tׯ_۶mKlcPQt۷%366^`Aqfee(o>}066իצMnߣG}8kȐ!FFFr9==}%ȑ#O>&&&Gnݺ)刈ݕԩl^DJNʕ+ݻw>|===Kڹs甲͡C0--M)'%%{*:IVZշoh055uݺuׯwppС?MӔzw1c}ٳwU*-[-SdJ~.UC/+*ݴi~Ƚ{:nݺh"K֭d Rɩo߿m۶nZ~}?fmm###+@%tPQOx>m-[o߾]]AJLL۷˶@5$tP]RKv%u>͘1Cn͛7WԟJ.[N6 tPiҤR~z-ZTG_+Wק' 6Te={T 8B-Z(/騼qƝ;wئzהM6ӓXܸqcO}||yiS+WYV*ݻwWO>7o^q5Ϝ9GilR]+?SBBK.\~QO>zRW^x{_zxx̞=Ě@u#tP3fr?s\jWkcccË:cƌZ9ӱc޽{ku ̙3~" 2%K|z& *~R_g6mګWMܿԩS7nܐ?266nٲeDD|uV6SSSuYf^:uԬY3ss'O_vɓJ5cc //"/|e_~eƍרQ#555:::$$ڵk?666'OT&&&+WN<-@ vhfZw/:tL\\ƍ{%N:W3fÇ3YYYb``_JliRN::uիIu g͚uʕ1cӬ t+ssn߾}׮]zv>D{ .$''תU...rbbS^VFu:::v޽M6ٳgccc322 lllڵkקO333 癣"/ *// Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!ApjTv4XT;>>>݅7*#ђ!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  TFewWBBŽ;䲭СC+?(?0?~|qDP *ٳguT044455]M-<<<ԩSaP~ *?֧fTTTppp``ѣ˻oUՙLӣGΝ;֭[E7*j:thٲ޾};--M>~aٶGe*/҈#4==}ϗ$)99ygϮ(KUa藹[o5vX̵k.^X̪BP 4]vahhh%vx1~{W^Ѻ+_~=555==ԴN::u222TPQ?hWxҥKk۷?ccc":ujڵYYYE~{7ne؂q˖-\"IRRRݻw_z%Ϝ9ׯFEE]jW8~FfPdggM:K.},???:HK,Q^i PeT#\V-O曄аyM4166~۷._vکSjիWW^a011qpp[A|||llӧVtvv."IRXXXAE I۬Y3jwޕ =n:%988ԯ_0!!!&&FdFFƊ+MV\$ggg I)ֶN:=JOO믿t7*JƧ6lPRɓC+:u-Zh$ @oiXXڵkAe .,ܶl"7oj <}aaaaHHv WviӦƧQQQJJqrrz6mTuֺu䨓~^zIWhS[6lcbbT8~CWWױc*;dgg:th홙}WnnǕC߿|\5k:Hddd4nܸN:ɇgΜ;wekk?Xcǎ3fP^DGG+ˤ&M(i#h(vvp7j|yfϞ=[R$Irtt3gN'OlܸQ[Ԭ&OޢE '''uTfH>sL~COtO@UREӧOȇ&&&={TWu떁Qv튛ާO=%..N X`۷˅TjAyBBƍ;wRRR4)o]j׮(""Bbaa1eʔ";Yv)SԬYS>|{ɌLR4IBCC7]VVV&M*Z֭^Wy~EEE'K㱸w޽{.5'Oh|cU8::j7X&->|X._vMu~̼3g SNCm۶m۶WWW yQr233sww?{K/RWenREA)I5^ܩ\#dggl$IFFF;v>6&$$ܺuѣGYYYZDQF:u:w$Iyyy?Ç;uc*yٶ Iŋ%I{nnnW[666СT"##333y/.CCnݺ[W^LժUKc6gg5kZ߿g5(hbbcKT+/FPaÆڵ߿+޽ŋ`&&& ######lҰaCggg77:uk ڵJVVVXX @:t IǦMrrr233CCCo&M4jHr||"iڌ,--堢c$n}KKK}&#tE{a͚5y$)88xƍ?~XXX̝;w˖-ǎS^Ȼ$$$ 6L{ij[n7n_\vM*7oޔ_MȻXXXjJpeuP&림KMM*oxPͽAI&Ͽ+yPPК5k9-fffZ_i5$I[jvLMMǏ?xG^|966V=`,+++444,,loFy`eeլY3z$44T.hB.AƍW*iD~񢦎 '(70$szR*/%%% @N) 9rSz6ؠA7x7HMMz͛7o޼Kfر#//o̘1тT(ƒ$yzznݺU~qN:),--5&$^zJYc?( ,--DvrQf 7'N(!ֱ nԩSGη~;gx3ZP6 vQݕjVVV1yw FOLMM+ӕպu> 333jeI^~r'''???%i:u|XbddVd-['OԱQ$IgϞUʺk`oo!!!m jQQJұ5͛4;;;11111122TOW󷠦*WvhԨ\޵k\/n} Ht̙:!"I3ٳ3IN8l_Nu *Jy޽E9ٰaCpprb~~qߥ~ФImAѵkW9ʋ\P2M6ر\\` 11q?GkS7enj+WÇ+©.AC>22ٳO>$)))i޽|Ɂ2e x_~"IRDDŋZjyzzm ͛7]e\"M0A;o޼ӧO+͟?_y#$/_=ZysM???7FEE\rݺuL>N:Kte˖inn.%---??_=qܸq6l+_~*??ɓ')))J1001boAIs:w\df͚˂IT^=Iׯ?yQ+VrOҔӦMsnk۶m{VXf33L9OJTV,u@UU]ިH4}t )N:~̝+6`++&''GEEݽ{799Yy6115j-(ɤnݺ8*ԛ(tpuu ޽{ݻbkklF9tPYYYIIIJJ133QVO@V]ިHTv9sl߾رc3̺toXYY'%%/]+tqW^MNNVZ...^^^[hѢQF_ӂ޽{:hѢ;w>}ZYULacc奞ƌӦM?ݻ&5kСèQlll*eA͛5kִر=pGDD<|k׶kӦMz*@TTTLLLjjjAAA:uZhQbzwލzi :tPV:m;rssxpoVӠ=OPFsT(*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  TFewwYzsRRRj׮{]|9---///33366vnnn\RYqȏVܠ1uD󅅅.\prrrppqر#>>ȏ R.*A:>J fffrI\TqOk֬%r P *͛7񩭭-T%@7xyyAR.*[XXXZZkhֻw>K*@OUsIڵk|{{cΟ?K*@T rrrʧWe)///!!N:fff\"%v:}1 q'*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!N+VTvjǧFp{"ZPx@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T-8 IDAT@8!h+T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@85*Ŋ|qeYXX8::zzzVvwIĠRXXxcǎVv_4?~ܹsϟݻj``Pٝ~>|ѣǏ8p;TAÇWv/uرWv/F,“'OVv/F9*7oTۏ5AlٲE%**TI½QypтI 7n}FMkkˆ^re֬YV>]zu߾}^140JYtzaЦM:tH;hpqqٻwԩS3g*:T[*e##m۶z^|}*e?@?#>>^W޽ P/^\ܾ}{u( JqBgϞm}ݻwWCBBʦg@)1HIIQ=C#={ Rkڴgddl߾=444...33̬^z...C i޼3GƦXZZ6k}Ȑ!5kԧhy+[.wظKbbb=z$ ;uT%ʼnVEmРѹs'%%䘛7o޼w毓$̙3AAAQQQO>511~_}iYG={͛YYYum׮]~ڷo_) ~WRRR6lйsg???9;;nZ9 ֧%IWb+|>o߾ݫW Rdnzy睌 =[>rH.]RѣGK.uuu=t?]]]-[#NHtEʪY틔:bĈyS۶mѣoV\<==7nXPJѥKː}=z244?Ǎ+L0ƍ%֌0`ի333Ɠ'O-Z=ҥK%.| sɓ'K޽{>\wDQ5jO_~e„ 'N :ۣl(^[nnرcwޭg?sĉz|ԩǏ׿3ЯظwGJJ[ojIidggˇ;vtssɹwӧoRSSgΜ!Ç uiݝlll>|xм<޽{zС"4_iii?;wT޻w}qzL aÆ\*999af:w`fft'On=kҥ:ڼr|LܠAeKK˴3gΨ?ggg+_>}z֬Y>m۶QFSPļ曡M(fŹ+faaTn+߼ys7}Ϟ=4ibjj"Y`>D*SEXXX߾}QF7^zU)w/ׯFz…ʣՑ#G_\\'NT?ըQc̘1 ,ըy֭ٳgڵKf2}kj7;x`+++ȑ#I/vHzYfffr(͛73gθq4*ܻw_駟 Gg}6lp֬YӦMxOHH/֬YLNN=髯Rӧϲeˊe___ [͊sWmMc5jG{:n3fSՂ ԛݻ7o<uy0JU?~|߾}ǎR$IO{=0///Z 5k$Irtt?~+Gm7oT6ҥ\P#ʡgӻwSNiIm6aLAA%Kk*::ȑ#aÆ hshԨѲe~G###cǔbbbugϞ֒5jգ+YAӢE#GH)VOI N)$٭Yf*Uߴig O:5fGG_Ν+/^ng>L=iii?rXF_uế}ڴi-R)r"?&^~ŵHd``HcΝ;w%vڶmm6݋:tP{~?EGoĉÂ-[WŋY}.]wrm(ҪU[3-X@L'O5k}D*hٲe .8rJOOv}ᇺ\Y9//OTe1 傂/N8鹞jԨb ?尠`ǎE֌R38p̙jR/\P\͸8?}q{=E6^NV]Q޷I&PxZZ_b~~~ϳwjwPPА!C46WEFFO{vuu3gs.6k֬:uXM}vlaa1o<TT)-O'еkW{QU[hhRѣ=ׇꅪy]g}uppP%I-Ƭn݋˚6maÆU5` k5ԨQC_zvGϚd*m۶۷o [r7L(,, <<<|||WiӦzn/X~}\q;qqqI dmmOtq)044T+$Iٳ˗rqmۦ,S/[[[OϟOLLu9s㮡TC===] Ӯ];ej9ã_uʩYRZl/Y$2coT;^:&&& `ȑ괠;yQ<==u̐.)jkVʅ?.O=dt/O<)rla166m1<( YYYY%{Q 4}g_zo/fJ+*WSA=>I&e;}T#FlڴΝ;6l5jTڞ;wnРAyyt@}QAc_~_ѽ{waddv(GIYnnZj%v9rh7Y˕BX%S# ˛7o^ݗ/_^ +YRy@#T/5k|7k׾YYY_ƺa#99Y)lٲ-h}:77W}IVV7"hH;wV3C_~[[… >s3fhѢ_~׳ hVnJKKSʥ@Y!TSƍ۹sgPPz#ڵk̙S]R$ٶJl޼PQA{KMĕd$ݻWy311y>eN:&&&ʡzJt'MԼy &^ɓwIHHxzuڲeˈ#4N>yɓ˖-򲳳9r?\!levۗVFFRVT.]l޼yΝ/?c-~&''9jsǏ иq*5WqرcƍeK={^ĩmݻwWo@^&,,,֬YS􆄄]vlժ;C1n"*A$I 8rz첚,kkk&48p<Μ9{U~%k5^(,Y񑥥eVvڳg^*0z6m*a=%%wsso*pWR @!5mtƍ'z]& n|_5ԠؑzG dԻw*bD졽6>ػwLg͚uk׮9rѣ?#G 3gN׋{ܹs\<"oRQEѱ几2f0??СCJYhh*˰\v-!!A.+[ZZz{{k\~HUv|ߵk{sf4`YYYuծ~M9QիW,XPܹs{;v;R]ܹlyۗz* A;wnrss+nO4޹s,zoyyymA㉭QFtwwo֬\ɑA߾}ڵkI㯲+IǗsΩg>Q,_\]g_}U|~^nݕ+W46\t۷+J+*/:=lT+lh*]QeHcñcJۂ?IGec2`K̔0^*? S,򪊧qJv4*dddܹoE(r&;;f+^U{Pa*UƯaaaΣGԇO>}ԫ$?z6szkS?>HeLLLF?ٳߗϘksyp`!CTPϊߪ¿|r4[wEkժR~:zP1*UDNԇvzvsMc٥Cj*/\=2'..N$e{N:9\J#G*؞>}ʕ+G]vпåee$I:t̾iL>o؂knX]ÊiVC|oРAÝ;wya@Jꫯ>|ܹsЎzT᛬J9++k_矫'];Vw} e})O}-*[[[7**G5܍7֯_OUVSMƣ[&&&Xѱ@4A{L95RuV=g-]*UzӧOOy>sԅvک>>>g۷9s܊~TFho|<*!^N94118qv5GGGނ70Ș0aAQbP5R;p>kF]tI9fU]Q[[|%^?kl| 3#Ts?p@=xNKKoڴieŒGaaa3/_*??ŋ+3g뼽u%iӦ}:1b|UVV2ȧu|31bzwm'NT/6dV=~ǎ WŹtҀת.nO>}Ç?C|||/+Y WTm3f_-ZHw_gΜ~ T77o>}3f۶m ۸q㆟/~0`)SʽZ{=O׹3f6lXsy=ڻwE{۷lR.+"nZ=z)""o߾/pҥK={ܷorvڟ}YqM?~7|=&LӧO3'NTOoݺUdG7 @9cii9u kVCy^RVV֘1c,X}]r7ߜ>}zS1q̟?_:'''00000¢YfM4133355}ijjjTT h֮][_Kttz΁<ܦMF'$$k?8pɒ%܈UU}l(Wi<.s#`bbg}dɒΝ;;88ԪU+99922… *O>Dci3gn޼YLOO;w?jcc# ߼yScZjw^׮]۷ĉW^ٹs}:tвeKkkkSSFDDܾ}[ϋ V)wEEoΞ=_\[n666&&&III7o޼~9~<3JU駟-Xɓ'iiil'7x_~{4i޽{%*TORoҤ>xyy^z˃{ffzJJÇu?~95k_$%%)'t4kccvZ///4""9<;+\A@QAlc]k&Yɓ)n6&&jC4c4`AERgo \.@>̝9u^˜uVxt//XTz+7_ӦMW^#hߞeggر-,,|ٵ$]#GܿozL)͛GFFΟ?EL IDATߦMO?tʕ][Gurr4pL5-,,6ooB7lذcu4yhhæ:4{vڕwN뭷UK {Wm_Y;w޽{oYJ-Z0aBTTڪ=T??!ױ[=?֗C%$$zgggOO~!P}>ԩS5-<IPP IIIf{n(ڵݻW>j(Qɓ'+[9Fѭ[7yر@W޽Ҕg+<`0DѴiS__߫WVK(|ww`۷oGGGVrY|*דv= Mk.00JnݺoggobZ缼GC//;k׮]tD% jvuNԶFT X _zUtرOJNNN||8S-[-FEE_233EήR={o٤I__߾}Kt_}չsʬѣ˗/s%u-444((yCZDcΟ?_G)EQJJJJO&>}Z+gft*** ԩ: ׅ .]ԩS߳gxvj{-((P˽z~|EQ;6q_)b(...:wݺu{9c wwwillUl֭?iT׿[QIOmFDDDddݻgϞ={,1״i>}lٲI& 4(22R}_t̙.GLg~꾝U$ϵ P:b0N8 (Jި4i2h _˽iZZZBBU,EEEe}||?799YLЪUW^yR{@=^}EzEQ._l4}{9o0aE1 ;v(/͘;wn\\\v(ʵkJ7C%h999߿ ZH~AeȐ!NNNꞓ'OF/z Kv_氍2%%%~񍪐UL_tizz٤I0OOMM,RK̅URRb4>$%%jg)ƌ#;wN4؈ٳ{۷hFLݻw^N]ᐛ[^Ntpl}>}}ڧO1 "66dK.EDDXgmo%Ӆ 6lM~¬˫D m_5Ν;wڵBCCղjHLL(katEQnt+W0zѭ̠b0UAAAwV%//Æ ;v)(((ݰ'|Ҝ ;vTϞ={Сd)_^_5)Ƅ+WylmmN˖v$}j*00 H}>>>(/^,=>**J1huܽ{2`gѣG *{:tie[PP:xw ӧvH s^#UEt5Aŋ1bNj'jI# *9 CꋊlQ'k0A;qSETWXOJJJKKp Et:]˖-u^zgE)))IJJJJJڰaC˖-;tקO6Bnn0pB3T̆\Y={tssP̙3=H,};PKIPѾ4hЦMԿC*Cz}zy222([DmFzw3fW^~~~F;-,,lmm:tPɈKstta%%%111֭ =zt$ZUcEQRRRRRRĘ1gqb[ᖖ}ٹs({Տ0zKKK1|QQQbHFF?oYǏ0mvĈmOe<#GKII;v,66vȑ'O֞MqbiHsT`#aaa[IIIIIÇՠr5꥝ $ K:FGGAʕ+.\PҥK˧TJVVֱcJV_\]]'O裿oyxwquioo/ϕۭ6K-*~_]tiѢNԸFEQ0u[uHXyaf:p(9׷SKug7T]]v??+R\\|!m-[)rΝVq,**RKm c^ טʏ?x-EQN:.>7_~~[ѣIjo{7[# ^uܲewdHHTEK:uEQ[7ťK.j;1;;މK;Pg/$6mRVVV,lbd߾}jw#6Fdeeeee%%%hP1<::Z:RGDDTK#^zULLܭ[7;;2vf5neԂKjĈ/d#Q\z⃵MtT3 k׮-0Ei۶nݺA,z/(/$$$|/@PEQJJJ|_/j'jVc*F;0ʕ+p|EQM<%ֳgOPRRo߾~uM=zx[rԩ{/11Q{/^nمU2cƌMׯ/ZhǎbIEQ222,^X]̙3.]fmll{gzi'jV4hP\\lٲeyɛw^NK``9 سgzӧ*uzM>}ի1 Νsqqqqq1 wר&LPzI//~oQܹf͚7Z[[fggufJJ/uRG=z0}|}5~_>##ClV'OresNN\(JNNΡC R6T߰aJJJ6nx=EQJJJn߾}mÚ4i?iȑeV_z:qɓkj ˠ WWW1R/@ j]Tu>|X<캹\ e훁7|{oРAڅ;;}.X`̘1&* \x1cJڴiEӿxѦM???sNv ϟy;w G.]*--99999ݻM6m۶ta2h(hd6m,***#++Iƛ8VT'4_ TH@:!At*CP  TH@:!At*CP  TH@:!At*CP  TH@:ұ԰m۶͛T_NN,6g͚Y@hlAjӓzo( *^c *hp.]m6пywP*O[nO?ԢEso ӣ>?~\yj BPA}jѢvٹZTPM奖[h1sm$'WW 6߿8$$ͭ[)TPGU߭\@:iA%333776jήkCFFFAAANʪfWW2MקSQ[nl;+^h]v/ YYYEEE899y{{8pU믿:u*55֭[AQ[[[ggg???O666&jXhQ~~Z4i_zϫ͛⣜_-[ZZ{j9--m֭)))wQ[>~۶mqqq)))999>>^^^FGEE}~״Ϭmڴi׮]6mڴ~zmƝ;wTڵ ڵ[l1Q^8immݦM.]m̙ctgٲewW{]}?Q˖-gΜ9vX'''uOVVO?~tEQ̩vѢE...Ǐ9rd׮]=۷o^*[vm~hT̀nݪn:tĈM)EQ3gΨ''ɓ'O2E(^߱cի/\ 7mڔnM4iܸqb^߾ۋ/{JJJ'ZY}WVG;B߾}g̘1d1O^fͮ]?oٲekl IDATuΛ7OO8]ݓ?ܹsGs̙>}̘1aaa:t0 /_VsBW{]O?'6t~'xBEQ\]]g͚yf?.6~W_}U>Ki999}z2ڝ;w1vvvK,)o^#;;?[nbǵ vډ_tv-~~~6o)sR/~͍?#}VӦM}];;;GL6~-FDl74q3< u{)K:[n_{zz.[Lt-3 ~9իҥKHmW2\@ * ~\&M*qJeee`MVXsZZ(VXs='6>88؜jkLו+WDٜQEJ&'ȣG؈^?q43m֜Ìޟ^<³jpP31x`1Qu~~ܹs3*ȑ#z^-[[[kGֽ{wQty٥J0A7*ڙp;tP_]\\}4sW%++kΝ۾}x]tVE1'Ubb)S>nܸvYQvuup-A(U}5u_v]&HTrrrĦl޽'Np˗srrz}9X:zw.@)F(ҿ[ KMh5eѢEOFP{?Z͚>}u̙˗/*U!&&ĉӦM+siHΝ;T%U;$.HT:hV_rrEܾ=ؘ1c[(p޼y?s=Z&WP&I~hB6oe 'O?N4*/j_~}o|}}jFmh裏v7 2D_oNi֬( 0}%uIҠbcc]/99j.((طo4hЂ j͒I?aN^tv@{(W}ռ.$ *xxxr >TEGGkG̚5j?~x#t쬬,1k{kIhu桇?Ԯ(vׯWgȚUJ(Mޠ޸qCzYS5ky{{e^um۶ )ԦMZR7?Z>|x}2bOOO_~NNNj7oVG5+i 4yʐ!CDƍbqL9.nb f)}] VWhUs3339K5\pp(/5}%u7]lZScԇ4m7۷o_~j? .M3_7nxWRˎcƌ1yُV5US}z…F+f,F e˖87HEEE[QEiѢE>}raaaaaZ߿:lRg?Zh<n2}_|}Rz}[l+V%˗/G+77>Іޮ]GwyG[RRgEٳg...^r[H5+i @Kf_}տo{Qi h׮Ý;w.]tĉt {:KJJ~]v:'''999>>^xNO999fGO7*:Ѫ^ػwojj0eʔ޽{i>///333))ĉXYY e/{⪷m۶w~l2///555...))I6o׮]3gά)y_I{]ZREQƌߊ=7nظqc[ZZ>S+W4]gHH3<_=bҚ7oO"bee?= ,9ُV5* :t!gYZZΙ3#SLy~(GEE5Ldɒ{}%uhIKkK֦\䥗^z4iR˗/0aXBW80zhQt~իײeErJNN[hQ-odѲO'cǎ#G1~TAٳ׿ݻg_ӕh|wW\={v6PRVVVAlҤIc֮]{- /X[[]dj$oPIOOEJiҤI޽[h7n۷VKqȑ` +}Lllٳ%$Iޠvڼ<ܢE_~SNS{{{_____qƭ^z_588׷Z,{lĉwtt&ķo>sZtg֦-KK˙3ga֭uJY[[R@ITbccrvL?qDN j}j]Eյ۷oꚙ(JAAAbbb```yߺu+&&&---??߿,|̙t^ߤIf͚ѣQ999.]R...:t(+Wܾ}[\TGyyyIIIF$''dee)ҳgPmZ rQQ9!!#իW0w''^gΟ?ղ _LǏONNtNNN~~~'2So!&iPϬZ:v(rByoذԩSGdEQl:vءC'NDFF&''M;}vggCN0YIII~Zݻܹs˫R˳gѣ~mnnnfee\211^(5kܹe~zΝ...SM?>|-?` 6(233uVǏ3m[6{5ddd|iii'O6ѤB0A%88AK}+-={ SG=t:wwwgggp͜.B0A:<<<22RLLL7oބ  Pڮ_ߊGO>]#"""22R]!q޽={4z=|]ԲN:tԩS)**jݺu/^Q˹)iӦ} hٲeaaa ;jk5L,X ƒ"Bٳg˫StWԔҭ[I&W.aϞ=K͛7իEFW@H:뗢(&L͛˖-{6n(nʹ~z]g/Q׬ &L4I- ;vհi&1dر3g4zC"*ٳG%Z?YשS]n^Y}RFFFBBBcΜ9#$tӳPm yw,--K/m۶V@T,--_~޽{kw^~~z|5k$&&VXOJJ3ϔyؘ1c<<t;|PTT$@4o\ݽvN>'k׮嘘ѱc?AeL ڵ]DQU@4"tܹsΊ(rrwwW(b@ȭ[^vjEShv7mƨ-*hAE2d{ァ"kfdd\pAܼysqXvVA,2py%\م66狲(W@T=gܩSSVxg)%%E *666999UhwVԩS{^o… &m@m.{T[U cׯ'W||gi.>Zlܹ#&wwwQí[P(k5}G=zT,\ӧOц4Q6 d *>>>JJ@;v\v޽{О۫82%%Z|د Q.F EHHIϜ9M/,PPPPu:].]V@eTڴiӡC\\\v OILLKmXZZIE '::_ϟ?aswCDY\([/Up#bJڦ]8r200P-gdd!ڗE2!333//Og1W6mV@eTE5jx4Ybx_)+wM,: h?<""b/jW IDAT"\vޭz8::&n߾_~X\iZNIIx>Wi YYY_u1..nǎbtտPY~ 8PlFEE曛7o$Pʕ+֭?XJjҤIF͘1iӦj-ڱcxU%##?ŋcgΜt钶iӦ|7mڴtRtѣVٳ(GDDlٲE4 //_]`ӧyjw(ʖ-[j!ڟE+ @Q5o\;km8qĢE^KõiG-}no!T~? љ*==}ӦM6mjڴmII^׮ƨ(//~oQ,ܹf͚7Z[[fggG:n„ AAA|||L߫;s挫kf͊ӵϬF2j#<p?Caa{{KK:լݻĨgΙ3!??'k"T}6l؀vuرC---=<<ۛ*00p?ѣG322>mڴi=Ǝk45֐!C7m')ƍ[}qrrڸqo޼G,QΝ|ϛy|vjPt:ܹsvq5=cڵ3]Io!I׀V[MLLy^tM6m޼y׮]+[Urrrrrݻw6mڶm[JM`w\ 77nݺiD6-++ٳwyAfͼ|||*{ 5%)))))~~~EEEsQڈ#x ېpBܵk崴N׼yʶ@isdysbYYYM0ĹQrttmCNGUPC η 3cՄBCCn<<<ңLz r] ̒ F|V2uXBvذa641*K/^7o<{5dȐ* =om@ lW^ݼyN//ɓ'zA/kܹ6666FesqqiݺuvvNsssիט1cP5k6`ܦMZk&j^CZ@R@:!At*CP  TH@:!At*CP  TH@:!A{wIB" hB Z7s}M˫\]]<8//oΜ9;v/[nݺu맟~ 8qbXPXXիW5O<޿?޸qc͚5-.Vʹs7nƦHVW״iӷ~E̙3'--MS_Bcٿe4)E?xԨQedϞ=GՔ U۰aÚ5kRRR<<<&MԥKR2zcǎSyaaSrssLƍ vMI!ܼysƌ?2?p%MbŊz0Z+-**jҥI̙:΢E*UTV6++ӧ)))K 67Ea"իW_dɐ!C40/_Ք5k6c *~+W۷y… ;&=ZZz'vڵcǎ={>>?0swj,,,_*cƍ۷oAzz-+ז4 ȑ#""">zYUϨlܸf56lP4?h_5k#),,\hQvv"ڵK4h5""6BOJM)W<[oդIM9++kՖmk!tPZ9s+FM>=88Xތ/>E(⯼J^ '==f@@\~޽{H%y!N WxA|r<`cX qJbbrx@-ڴiSLV[,B۳g٭[7P:n8oݻw\3v$I+VTK`N󎷷i&˶U7DEEɫJTի׬Y3yS^gʞ={5e͚'We//֭[{N>lprRZ%?{LiAAA )))uppjٲ2"+...55UT5ʫjw6?Ν;ə...۷7L.TRfMM933s۶mWJJC:uwSquy)jժiMO|UPEW*UTn]y3//7=<<4ZQ9g,)/^MMMvpppvvW^HHOLgΝSN0/qr>k֬2dH޽KsΜ9I 2DkѣG^ 6ڵK9w}WZݻ>ܺ~ ͜9̙3Jʕ+l٢ =CCCΝ[ҫZ$~;v7?~˛&M4hPIMU2gdlmdɫWJ:QFzR~4SNttfs޽ * .ZSPTV`t rW^5v<8>)L|#OFܮ][jW\qaPFFFΝ;ڵk{M7qD}1Q_?\O"I8pܹ0=iI駟ns\\܌3.\0}t{{{=+7SN}%=ydƍw;wnYBSN}qۘ3?۷o޼yZwuڻw_| |9¾kLsΤ}F% @yѣ墬,P^չsbbbM ;w45ĩSnٲ"&'':t:~+Ȟ={_wFO5׌=ZϚMj޽G.W,11O>8kB'N|qR)>#1)֭[LRjJ={vn-Zظ8=X*ww!CT`_5oyĽbccӲeK5%%eҤI˖-3*EQQQr~/eJս{wy3((vr;tД)STӧ'OټysYYY=zիW5Ý%IꫯJZhDզ5J$ݽUVO<~zddׯwpp1bD_U/IR5k֬|Ν?SYӧ͛7uTzj׮|"+%%E9QF*Jy]m+gϞZ厎iiiwލI1k֬:u??Yitrvʕ+שS977G ^z%M9;;[.I Zjr%S|FFFkDFF.X@mӦM֭ZJ/*/Tݿ„ ?>qnVs'OS_=on K1p@ )T$I2dɓ'd]6`ǗgA^^۷͆ \ϱcM???Ӿ}{9>|CzV7U6|>@wLRRҷ~m6zpJJ׮]kv!98o߾E{|rԩS}9jԨ.]r>#gMmV\:ժUiӦ=rϞ=ϗoDGG/_|ܸq6W^sV*;޻wO988 2x;KC*ܿ 0-uEΝS``ݻw+[nKMvҿe˖)/.6h`֭%7nXs%y13T{1~%K Ie  \`A (e˖7o.R$Iѣ`ݺuzltժU[vm^muuu6mڌ3sZ9sƈ#׍ڻ+w :9eHlns}ÖM4Yzu)Ezkʁvb)+13>}LYUPa&$I#GT.g+IRaa?7xc޼y/_X܍7ZV~Cow:aÆtt}jNNNVCwwŋ랊i5gj%IZb|TVϜ9S4SLqY} WNR\Ԍ3Mͤl ǎSo9sC(?J*ɛF R~V݅$IݻsDDF+3s%>P>Z$ʁmIIIOX]ZlkN lذa:tXd-۷o߾}{˖-uСûk؅CłCժU3;v(n:kݳ*ٳg岫rnGՔSmU *VO>>>[>rfԉ6m ]tYp<1ڜz-ZB}F׬YAV2Bj_~z6z3?(,IP25jꫯz>VfEc7lP2U>b:$I˗/vڏ?xkFGGGGG_>00?"Eb) W/okk[S$y{{z^p!..ԯ1͛3F6m(ofgg+tMTZ``5$$Dp޽D#o$I͛7ݸqCQn]zWNρd]<[}FguN/Z!T^]ò֠f͚ݿ(Ϛ|G-)fc5AEAs̑$i߾};sr2?? 2e>Z, *ʑ RٴiS:t ;w~':*pႲ7nݺ'O6g ݓ7MypAA3gYP7.ͽtr)+|w!g.& flnӪUի?zHc}.+ggg'O~ o}޽r>eXk^feAEֹsΝ;ggg߿ȑ#gϞ-@˗:hРcNJ|Q;iݝ;w*owQݻwosrr4TFHשSǀ3gȋ0H訜TJ$ɿ Ok7nXKPQt Յ>#?cժUe˖:t[n=X,%eNR 8pѢEקO<5hTX[nݺu۳gov %٫VzY?eæ(=|\TH蘘3gH/l@ Vwa=ݨQ#fBBj.?֭[ YYY;nj/TR&eln3v˗/+crʕ+W6lغuv|F WWWZ-LRJÇ_pajjoرcn[0.*2ݻwʕ+֭;p2Hl߾Zj/sQ]?-\]]ucǎG6#""tug՟5OC#awrrR^1UC\G1>fBu!+eHfɒ%ӧOך9--M3wuumҤI֭ufm;;;yDrNdqss4hrNg=i7Q '.dN[& IDATŋZWԾ;#.UkrF=-ZėUVǎS%-Z_!ZDզI{!VA-T-ZԧON)ҋׅ>#%AMʕ-Z4wܒ>IJJ:x9s:wx`4@I;*Zڴiw 6,66V'''gʕƽkrHMM=urŋ/^\J~2KLF666㩃SEK98^G,4 )9::999UXQ=zg6Z]Z6{ݽ{˗N)IRJJ/rC>\){m*߻wĉ\RaÆS{>$I5jXpa~.\g 0b,26ʕ{T222%aj899eLPFPM1{l_u^^^]vm߾}I-_|Ŋfi]h]3?tE3ŋO8qk׮i-5tzVcsJѣGѺST 4O<Ӭ_;#oy)Erׯ\?㢇iLZ/\РAW[NŹ%I5s233QFC5sBVDYnSz TVٲe˔)SJ}ִ&KX\vm<== |e T_vͰs\k,y"5k2 8x\V^˫_vZ&%%i6qʕNSVTgϖ0Q7vss=qD~Duvvv͚53ssv 0 Y)}FgɓwQ[w)IS&MvgN''0VC`"ҺhtfW^Ϟ=sSNݾ}[l֬Yڵz7|S.ܹÔA122R!N::tH!rU۰aC|vJ\&RPfc݄a]aHlns…͛7.ecrtuڵiӦZGnٲEjtOX2BZS-9gCrrs.du2gd\ֿ)w•+W Dȡ|Z@3}lrR+?wܟ)o.]ԩSGv]j7noԧTSRR6l o^ARժUK9[y$SLѺ*,RޅDäL?mn?~\ӕdwww}pll`gg7b''֭[l TFW:tyg͚zj>RgGݺu>iv<[nZ5=^y0%%e„ 7oQfϞ|_9[I$i/+ٳfZ`1cN>`1cܺuK1}r@EtSIaիWW>:tHW^4hPSSSc.TV&&e<ـ)M˖-Ǐ̙Sj3f͚uӾXqqq>7-> pժUnj{YJ"nPqww3fjVtt~8a„oݺdɒwyg֭mڴy-u" RՎ_$Q+ϢorӧO@QV0`^ۻwcbb=!!!cj{ 9iҤiӦ1effnٲ{n\rE 0`ڵEWNzj߾}=*ﱷ/v^5&M(?)ĒtI.NC=VԩjꫯʷϠNHHPSN9СfFF/2h c*V8k֬aÆs,\pժUM4quuRJnnÇoKDJ4mڴy;wFDD4n_VZaaaZZݻw)u6;;;ɋ/^~}Fj֬YRO޾};**JyIX>\]]4nիW+W÷~۰ل>ݻw˿o222.]w5lͭ )))66VkJ*eeeɛ E煳,B0]0)S|Ffφm{m6yρ=jgg㘘;wh} =Z'ϝ;'6lh:Hfoo|4hh^}ٳgJf͚֭[{xxh؅ cajFП kTXqٲez_77ӧΣ$IGGݻy/,+*$ծ]{Ŋ?Ӈ~5GGǶmΚ5k߾}emmXiћ7otҥK/-Zxzzˊ %YvիW/[,88oMJ7~;v融V\yڴi?CNt|WT)88x…6mRf6\]]-[pF۫B ~ɓScҥݻw-fn:l0eUe666-ZXdɺu43(T^v5v!Ø{?#3gڦ6'Nܼy￯|PJ>|xDDOfJk.ܸqc///=XIIIϟNKKKMMʲsvvQF`yb<̠GbYKNNNMMuvv]v˖-3 =vlll}}}[jTj ~ [j~z[n8q"..ӧ*TpvvرKw;wWZiӦm۶5V?u?~nggӦM='3]ȈL=L蟑Isyڦ6W^믿233+VӬY32U[o={L_pXv[K666C{2l2{lMqaq: XofժUǾ}%(ݻ<+--mƍmy?˛ lllmOZ3u`,Va裏,ւׯOIRSS/^lKqqq[l7jooo"ĉfݻg˶9sfjjܼy}Z=AզM>}h_}U||exX̙3-օB?~|ƍ5q%''[ICDDʕ+5eJ'ZI AVbůZ^AcƌIJJln޽glWz"j֬9Uj6###z]˶ `lgeddh6_{SZIARPPВ%K\]]5mzݼyS^7dbIa%H$O<9>>>00-zԨQCSfH7gϞfͲtsX+ Wƍ7m4}vY-/QFY `8]n +ɱt <,p|iXP-666C{yFj_%ʏ@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Apl\b6xxIw [ C߸_K*TНD@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8&QjՒ^rVM{ *L¯~=^ 0 O6(Q5tWcVtף<$ɵZ5JM)A@8!Ap*CP  T@8!Ap*CP K7DӧuPB+:88xxxԩS'$$l`:Kx+V8~;88t`Q)^z?tsM6%%%i#Gl{YGPiҤIݺuOOO͛7SSS5{.]:uTOOOD/^<|p P**jիWIܹϗ$ɓ'7n:uY߯_?Jsʕ .XU <.]˛gϞ`cu S֭/_)ߺuKΝOKKqvvjٲwݸqCSZjڵ%I=sǏ%I lӦ͕+WrssGEEUɐNy\駟.^}]PPV{߿`MEaaak׮=sLaafgvvv6m֮]ѣo_h\/^,UPQR0޴iSFFFfgg8qŋaaaAAAOpk׮`zJbb\/z7lؠL$Z]vmWWGin1"88X颢}_95+ŶIVjLL̦MҠAAyyyDGGoذے$lܸVZ%NR*Wܲeˀww;;;I&M$6qDy/| *7իu-[4倀ɓ'jӦM7oAgϞ㏟~KǏW@98##cҥ M;;v)vիW5e''Çk ÇWTI_ݽ{ÇR}?\cѣG剹BBB\]]KW^iٲwȑ[n zű_{?0p@r9$$DڴisQMYz,(:JvvvIk)__~Zú ˭aÆ*U<"?l#R;uTVؗI&gΜє/_;::N8>Ǝ?>::#junf͚ec=(ռf͚իWlJ*TݻY9sIDAT -]6l0wܬ/;srr9RjՀ5}DZZU*U  ; _~ƍz6K._<77K666Z; ݻשSR+!O4I_ܹs-WyǏGDDܻwO>RJ!!!:*ӧ˗MggΝ;w͛O޻w|WϞ=gϞ&~1c2t)((%==ƍo޼|履~:d!nP~wV8nܸbG1egg嗻vnڴWZ7țuꫯׯ_쑫Woۛ攔=z<|P>xG.˗/_jU~~f_urr*x@(Z~͑#G7BSԩӕ+W4{kժUI& c͚5>>>K/9rDs+ƍ})`ռaÆCɛÇ3fLGjl2''͌ GG͛x qQٻw\9rdo[D0]e~}Tq)C'7o^^^{XƍTSÇ۵k)ܹ#U*j.ɚ5k'644trpwwם%LWڷo?j(yʕ+ǎ3JYeP;w}F-^ƦS-L4iݺuڵ+6Tu;w~~~L!o,[Ge՛7o7.]dp͚5[reRRҩSUVNC_͛7l HHHД[9`"VTo.Oidɒ5jfWWnݺŋ/_)8Ҝ5CyGEkd@XT>|X>M6e *iiirŠffN81%%EV?_ v… ƍw5WRE.Ǘ,w-@dVT?~wN4"5{yy5kL<iJ=Ç׭['ogT999nCf̘Gl۶ XQOyyy>rSSS/իWoժUիWT/^{7L*׷Eoifǎ{zjͫjwyo߾h5`>b.]wvvUrak={ƍiiivvv...ڵ0yу  Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Apl,mn=z_@8K wT@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8±9s挥;*z;*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!kc8-s#+t$JF1n5 q@\d a"-DQ[ftk{YƯ}=}>M9  T@8!Ap*CP  T@8kv"(hTQ#˲b)..e0BXY.\0(H3&tb))))//'(r''ree,˺TLDPpSSSe0Y׭[gt\Tp8-aTp8 zzz ju\|R/^|G~Guzm;v{$i}Y~ݮJ{)ZJQUFHqƩK.y{=zU WIIի'|o ڮ~ 6\_555%t~OOŋ7$Z2X H<x~֭ .>}-x#mzy楡BuvvY% HRfVXyySO=Mĉ!D"`0Mg̘iӦ4gH$FS_ǸFy* Mz{{7l`i5544hOP]]→ctWiNqYE"! Hcw4g3)STWWko^:ttŊi0:fPVѷHj=6ݳgO59'xBڵKWǧNZWWgNХk0#EtnuuuVUg\X(q__$,WPP`Zz3JBCP `V_֦]]]g~%KPY1zbd: 0AiiU={;fb= Y~MwyeulXo#&ƚ]~vLq3w|]W%s̩jYYY,rN2e@*Cլt:Q̡6UTTq `.G">1nֿܸ֯_?eee 0Yyq5YƔ`:Zi***if5y<"m:f̘͛7WNf+//4WqTձ`YYYc-w9mz]v^(rʮ=АA[WCw`&v+--+mmm DRo}ԋUH) 0n_r6͈0}xuuKL)8,)Ÿ"a 0A `9x{ァM,uw|>2b1bY}T$LDP8qb|޴i:1c޽{|Iݻw>}ڤ Q\\w|Q$EPB+VЦ{}?캺I&/_r+PwU^ _#A" nsݢ5=ztҥv]SnܸQ;(J 0>cXeDJX,T(lu*ZX___UUyJI l٢ӵkΝ;Wر/Hw)))eҫ<rm؉'ȉ|>_8֦^wɃOhhhUDZXW^Ik}FbNĺ=~ڴi8oݺ;4"IηzK.X`ժUCΑeyڵ۷oOS}+,,L%R,}H '… r\Nx^mm۶>%2k c*Ad j `Wtl랙 }۝'rrU M)IWT~w߭{zzL̙3;wԦgv:79[r6wm`}inݺD/14$W2A`pn'L oyɖ-[i0joo/))%J)V5ԄCP N駟0D"$8gϾf sKR:p˓(I4.tb[ŜNgccUJ)yyyuuuUPP js\8;;kI@ pwぁwyL;yUR$IlI<T-Zlٲ߷ɓg 0mڴ7j_VdYv\ DEF7z"˲b)..e| Ap؞p*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP "IENDB`davmail-6.3.0/src/site/resources/images/android/androidemailaccount4.png0100644 0000000 0000000 00000276253 13410710541 025130 0ustar000000000 0000000 PNG  IHDR8p]sBITO IDATxw|[?-K-ޱ gOBeЖ :PBKe=-C)RV*2DZ㽷d-P\Mk_a+~9{:aTvTvTvTvTvTvnˑyKa9lBpXis: !dwNjb*مbB\BpN%)}tIeh9]h.d+ X","A/e1 łB-4GQɝVe1+0O~ A`c3e9*f%5  "^~PgtA!Ѧd*0OT A`bR+pBjϭtu}y߻ҠsTR EAbIx0atvәwB~SL̝^c-V͡lNqkfX,-r#^;g_ R @%=p-o\V`eB!,QT?=`ϚTRwi"TGV (N05bZ&{j$=8>38 ^҃eˋ.^ XVwq}'S4Q$.QY0؜3!53 RqB8[!/UXq[!DX"s8A ٵ,G qtQ)AfIzP\^v; f1[*T T$ rw}>ha.HQ-"- !cj0M־Y}_~aXoI*s%lt$֔Ok 1W|VªB18m̠Zrj"ϯBNU3sIKx0_AM3\>wUqR岢<^ D\Jt18gdROYruh%JE ` H)YH./5^B*^Q_$8'#S65ߘDP"An2ZOۦ4m꜒~AOv&#IoDI)\&K+Eʅ]<n?O;>q\ kth/V*s%W6Um(xpx,%!WQ,瞑YNB6lJnjEQ~; }.yQm5eRQht:9^P# 9o4Vn(7>}D_dXCɞ!r mR;PrxŹvɃH)ZpMU x74DQm(RQI;3P5:ն(d R Wn,S,7jYT# wTrn[pCw͘6}+!o)TܲD" F"ᷛk6>XlThAHT+|!_kœ. Ǻ?N` `~-j"|e cx*2YvM8#| )%Kl,ZYD0Z^!}R2.[P_EQݶm_jKލKN6Bo˥_>iMH6[ZeeJ"r9 h/$8W7o,+ iutGv!D. 2b|mIAЄ#pn_\#y@w柑2 RʼW-\PST'jRu)t~94i؁iEᲘkK֖.U*<ϩKoYЮ#th.{ENcP{沘RZ*Ly?[w!$ <ƖD~J(ŶwNb=ģ@p\I?OG :GVm֓j=l&seq  \RW^)C[R>C +MK"@m۶M\UKJv S;IJįj)Og-h_[ TGLևv98>C}l`쳁k]·OiUbEӁGc޻ t}14ĹU[W-r.-}+Ym<TAWK_ZM)k=ãX]nّJ0_̇^tֱ't D6r5{G>?6}h/EyU%ngIV !l&š؂ U'l(Uz~p)aHT*ϯˋT2Â/mOԡ| ߽n¸|ü źZfpy䡳)K[荏oo;_*@VH)* @}rm 9๊vMpXMEyWKz4:_'_{gp\mS? ,uJ1Ԡ3{F&?}BYXuJXKzN]jCޯՖyS٬x}N* ^؛Rzg~dB8jZ㹭j5c*EsݸOe|DHnm{eEP@ix+s%g)rx32ydbWzVNݟ8F2%$^|pˡHAۊ8lO֏z:?g\Z]_P>Ek=ڞ3{GRRu1%(G&UBĂ4/9S+ޥ-V !64GmTf2XP)8c|P BBlu/WL7ȣa1p83z^B*. 6 6\+ADcS,VsI}yذˋ46鹔1[Em.3O.[Q$~n9nޟ 6{_M7H'vthwO9rb?]8U4~łJτ5f0)YK,G K_ވg]f _wi؋m=){ZBȤC YʦSub6'ӣ笖yUm>z< \_z!~a/ s&zyOV6#jWqSg iċHn7^ e <cfv۝fbu:y$M͜Wrx2YNk{k}U,οiYCYXܲvQdz-!Dk=Xkg:uK 7q@!N eW-&uD[D&,>JWH*fj&3+n^3$s=ݥe7hR"٣ da즖&aTH%yMAR?^8a4w^p*j Lfi*@a2"g I~jr MUB+{o'F%uW6U?}dBk}`6Y^j}u3!dcY 6-`3FsVWRp9:ul*s/Nar5uZIs>O!f9DX+z?6yq]J">--5%?Y8"RQf[wYTk]n^#s9~L펡B\*p0 }z`2ut?iu\ B*ڧg-W K/OJIw+`^Po S+Y}϶|) e9__\MIš|y8 uR/d?sXPyi}/ˁImIچ~+ O.}kaL27y2ks]^TS\q%eu!Ȅm\۶6Y!u iD(QS(R8\crĉݖ,GnŶ6M):C԰HWH^8Own^:xxd<_u>wЅ*0od_m*r<+J7!{syXK˯_zBHT\+ϩx{KXj0۽`ўiҭݶml%({mzA!Ԗ.+Rx~0wkQR[>ڳcpm7(/0o݊<B>~i]Hؔ/;JtDЕM՞f-*!ul#ʋx.@+yxjz/O!ju}Lv6){6_b5ڒ{)_9QmХ>{WÁXJWK֖xUlݫ Tl&PZQk8KyJxsখ-o:]~W/]WZ@1;>9m< 쎿>>7+**W]JraH, ~P ߻[Ҷ}Z`~b;ňi8[Dx&OYfQ{c8O!CP_^(_a߽n5%g4[_/<㽁ln5k{E&>t褺@ X 7Aa߷X|\ph@kf`yժHFUvfMӳIl\JRt<5d3n՛mm? &sSޢy_gÒEL03EMou֓m=;:9J۞OƶVWH%oZF;}UL6.'9i2߳"ot;ڲOƺԺ0/[rw N$y) *roEqϋIkGƉbWCՋbL)TfG#hѵ 0;↓R게n5|g{ lR<uDc^PSO3ot <+ϖ}Xݼt\Zm843j-e]ɮQ *=*Bgq}SA\#˹{bτ%BɓjmRҠRXU MV|'2e9ޑý"`p.8fG iT,q6{FvB Ƀ/^Q/s5۾)/[V{n,By$n:nR=@6NoMd9]O% oj9<=<>=;7Y1/wYa޺TvX9|2y HiPaFגOb2Wq!fsiF}?X XVx׺amLw6 y lgkA+I+c~>8F * SՕ"H:nZ*,sYa޲pcLvǃ'P҃Jl3ŘXk{檅eRbε5d0w!=Xl7Sk;ҭao[gqdW*z!` IDATenBt0BED_GC4.unH)0ϼ93hx" ؁6KŁg9ݮwBN֊JOGSȄZaKî+o;Mw- kKo]0ݭ#]f lÔr{;Rwz)~*b[ϋm= oRQ('}өc-&3L],NulzcY!Mvd%?^ޘV$:%gVOzP\_TD x̤3 @sjU~СS3YKr-^*~ 錏k8\Vr qbsVIE@NmM.R1Y{4 (q h҆tR$E剭NՄ@#:CS{f@uxb&J ֡ja C[r,%eR )<TUGk]:ݭ=u3MA[ie1ח*@J_m,asZG5f[lp~d;;kx GR         T֧ >УA;yOJw+ vԔr]koz~GRЯ@CYףLSGЯ>P*qTۜ'i=(,TaqdKw[`9]A%Tɒ\a.=ksI.Oy+1_s݃&Q?v;]9 Y)Bn_&n?2FsďA^2mHP)iH).Q\P"E1z9fq0󫪯,Sxur75ilc8@e RJT cmm)R$ۤ:tN4mxkz1\$ 99Ϭ*rcضZ{k]GKxqWIΌLkU>Mc{RB@۶8@PAJʺ<ɫkxܽFjvx,f>S%I8,YK 'FSܽdx߮l *.x\o Hx΁msoԈ L)]3S/LOX|j|YKT+6+ Bm*؟J~!"_Srج!wg n[8@sPAJ֓+|bw=9A+zYWg^D%eE3Ř Т=3v9Xɡt79y;)%Zw4oϡ>bsxcCs~cX}F+AȒ7 *H)ђrX?){GxV|՞n}E)X&@6A)% ||#ǺƩ00,3 J_m.GbxzY^}dmI*8W3UDl2H%YLc^BnT(Y ;O,4ٙB\˲SVGu״>/yA2C`^WA)%6_-ʭl<~oEGX 5 |2#/ L?3Z_t̠2˵O|"6Z\eHƹXz|\$`Fjl}jK3x2|vL>6<;5 q'qHc|gti X*N{ӧ'B= u3'NgT5如rߕvnI o;FcMپP{S삜_nwzPczoj6淸D%\F!)-bp ڿNFKdM=7EY'hSD>SIj&^J0kZhPdR,]٤.wq#,,6:T-ΛsY-JQq[-jMRHUiެnVJoo(ɱNz&U _aLDR]*B#Kʯ,SpMX Ƃ+~6Nج~"‹`Ԉ5b=3E)oon/6 7H߫y`GsdN!lTE<m.7uOVyh ^/Pse^ M>u<2؈gsRpdy2G)%+|gmLZ;}X4̎7V+^_BY d1|dXKkj_%xGޯt‰[țj/~ti]_<56rRޭM7TbF!D3WM u%Jc2lsct!_6ש9zsJ~(Wž7c6?*Yb>xH9,u-PiM_LeNpmeE~#尞YYP*]8LkkjnVݪ~tV *pw4HLJL;\T?|xQE/.LyE>ne[+Ա7FFsN  RJܖD~ߋ'^X(OqzkDw6䵕Ъ6yAOj YR)}2is !w\(x'fFw1R:)ipKr u!dAkk7lo3a% [LL6ӕa-Q|N&<&&U)۷{by_s;;' g+sVv,,91~v}2ݣhh\{x4irYur9B3&>r8"Y1$I?r$>ul2؈g2C dvPAJ_`h:OVnE>wpKR|\B~i`ΣCw.(=\?7~ݷ𚛐7?=<0j Ps5yL[hS\,.^BV*k$aJ-fFǵ~Cni#ZԛdTMP)(W8yqKZ羔W• [huԻVID$߮Kr; oD71{uuW U,&_ |4mf >׾76GU/y208B6b63qA%P ٷQ+ҭ;/d{75;|&-(ĻU̓pX7RoKk^y28cNF[]_'"79޾^+٤SoްD>gP;rE0_Iz(jnʗz\s2ώ眤*Y(3/RGTɷ^yGZml}@1:7EvkSa]4lZw>/gmW1ܷVlzwzMIٷQ׶E0Yپ)'ؗ yO0WL?81$LLT&}.|ߔ}f9NL%˷\[:rzI2x$/ŒHn/ijI2ߜvvP̗|grίgߴ~+A_]옊hrg޲@N@ H;( KG hq^QQsR /R5^@YF>ةCoٯ6Rpda_sJtpͳc##d9' @vȠiB:U"pŹ>Nؗ ejf+p0>ך ),KŊ1Y3RlVRٷQ2Xm.7йYŁ~x;]csc(5U?Q"nrF4ԫC,ѷMЧSGh!C9I=TS{ung 9>C:.%7y8n 7&;5b^KX| "}7}]啢7hWOhr״ɫ0i)%s**dLkwbGeAs:$PN٣_Ȭ+(O;'"Q½O% 8Jp{xb0(/zAK}S+|?0Vq~RҔAlJB?ҟ_}yЮ}'ڠg2SG.sNA*sՀy#RoctER»*疺› jÇcQj XSbh|.lI7ԠrvAn*2SG(ˏLsNA -pTU=θRpcRɯ*1!d"q_ao՚\tf" V̯Yp/-6Xҿ= Uk C ENWgj.u ܋UvWK=bs):r|ldsqd-Z_D(|OVMe<X`Jw8~ 5X%wB2Jh#Bo)͏Kwvu,2^k*ſh,:$zxzV%w \bk>-S>ut)>$PZ䤆2 $όR[ v̩IM!% 7N,I׾#cK>j{}s U"=M%i2?st~B[쀕7+}nR}drI<ƀȂ fE.B.MfKG.N0 kVdz5sk6AfibȽGI.V(MR8orM5Ȭ)N:t^mBmԈOܯ}z %JFFK9' @֚?A dd5ۨӯHCE]cg L"$tSˍDe[&eRoesY-J<Rot7ѡ|pc3b?U (4W.зꂤg}9ÖάO,962}91*Yko|,/WXV[~_p>ڑuxG:53Xuw֒\r\uKM!GVnk;r`P]>oEqwZ&12O{AQ.!E&3Wfh眨5 AV3:bSV΍U GB`t8,O/PTILգNOլͱRomdrw_݉鷎Jsh;9!rs(q:뱑h{ΉPZ4.L,dM[U96bx CWZ uut\P5~~Wx~+W)$Ъ6iW}9߅ŹsoFȀOd; raTt|ugVJN|ԡؘRpImP!*xՕy1 }6s}.hzrj#'r>WWD:"\ȍpfMto:a8DjmN\!UdMZD/ƸN-r[2$iǔ.I3Scc~H9'ه @vA Dlc2]YU%bn+V[2pr<&]䊔K: 'pbcv\k{sRM.. U1cU6+V_)_]];fv3MfFUm+ ʝ VZ_=s sozbߑoT8dܧj񌳥C ;e&Z*U۰] m +sϚYOMoGaK U(58:YώAȟ/kTKz Z/*sGjqOLƳC*fFίBƹG?VxgtT*Y%2}FO 9><0sDt:8~!tk >뻣rW?9P_;R]g~s,N=3wa߮JZ ݱ̟[Qa=p|C-M^!⽾&9nE3S2?΁oK)8$PBr #ư]pO[!fno(~ujcѪw8\v!S'oQ=c`sZ_mv̧VT^}sXsPc9\ւJ+WhәP٬7sUm`3ub wÝGPǦ.pI;5^Uf5KҋUXo?2J!^HiaʪVkNB8Put8 IDAT2ť*_~kSfFhjHf3lR]R"{epYo5^>>OrJ2wzLp~;TKI`sUey ͼ>2lU\]P,C??=j{~H^̿!f֧j~1ܖV}Im%ʊ(y}Aw7;/޽ o]Z{D?>Z7X%XMHTcR窫Y*|f噃AhOh9wk`lUJrȇz ϻi} K2rnҩoHՒMw*L'>u(؈綴sNlCB{+܄ls5z##&乾|>v}QOQqz{Du]dž&c薇?:kΎ`Cȸ|'hJگH Jjm_GU,9A// zߟZmۄ뻻L/b<^+gϐPd.F3S5x΁lK7>P*THr]k^ٸ?fl %:5}kwE;ΣCՎ Um苓A/û@7ﻯm皵9~~tGbxM?lW h\{oeBIPRo#4iohh֟3zATO6l?X,51Gڛ}/ LSM *3S2x΁lK7>PY4ˋ: )%n{zZdVW[z1}XE !#Nl(: 'h>:kzg3A![/)ߐ0N?yCѹEAsN[6<`i6WDMms\=7BTz08;3-攚}{چ;‹T0.׎I˃3/EYzly(*sB݄tyg*8i-iMVϔO^F<M 9>Teې*UH)Z+\'Ŵzsd;0kbJqT e 9|9-`tv3Z$j6<ɹR!WbI>{%saqnTX0QVG7v_}2jNt/vrs s[re""1Iz>Hپ\TpV~N I.‰XapJ篜a1 S{٤sV):sx΁q?&5d*X)s.ZJ ѻ A-9iusTRBPn5=Mwo pH#Eمu.7 } s@AP%nG:}\tRǴ KFN6[H%s2 @87V+o/.rXR.|VV5T9 צ 4uaq+=R\rgjł $>:[f4a@*qq .WMU=dR{Z98LF ByE~; R LRWТҠkP :]\&O=CHn3-9C;c3XKDվ<`_ybp8zxɞɤ71ca@*qTpLk~kXq$S&mtطJ8d T}uz cמ+-:طJ8dUxk$5bf0P: mo p3,ðln ݀ MOOF6-Jx<^ Ae߾}yooV>fKKK[ZZn*JCm}Ϟ=_+++144n#7tSss1_Şdx`0z=|p___eeeٶmF>b۽?S"fkv===;w|W^o~S,4cǎ)`=j{z*uݟ|Iq:nJ&isOWWW?F+]bŲejkk djkk۵kؘ9}X,ַ58pꫯp8gǎ7.PuQ . ܠ/^&q811ݭ=?wuw@ơoPy gBBK.y<\/Ȣ ** n$יg0|yoi񼼼aÆϱcLW0lٲE$*Z2Q,ڵ3qԽ{vܹ~^/I۷7nV[Piׯ۷o'{F3k,ej}||M^gsĉǓ(1Ѹqgyfڴi"gmT@4Q)..m۶3ke„ =>>...r!11199x8 1Z6beSNa0@Urr-''rk);;[„ݻZO>Կ6ܨQ#OOϔs΢_pA._zdffĤ߿A5j۶m[ha~#n݊NOO/((6s޻wOrppeKNNɑ$W^Fuʒ%%Irttl׮]`"0KJÇҡC18!>>>3g<3.ya8(QQ1Al۶-..NA,--uOReܾ}ٳg-K/8993fС%qƲer>}fϞvhq ]\\/_.qqqOM??~\.?%DTjJrrr}2|sZ>>>G$ݻ.kA|؜/TL;~iQQٳg_|e5a1 u%$$^S/_ҥKF:tpI_~ʕ/I/ PqT:FW]FHHȮ]yС^zի`5jԷonݺ5oÇ 6$iРAvJRiv@U4Q$iIIIqqq͛7WZk׮~Tz5Cwr"/+QgΜvvvC $IoT"##Ŧ&''ZlS*+__xN$իFcٷm&Q 8pΜ9F2~xKKm۶IWV `s988xyy?^ׯ C&{{{??ڏUҮ_$i^{O>ʝ7nعsoooڴ)!!ʉʐ!C=GY>|Xtݻ<(s5(((/333͆ xZZ n\XA(";wN.;99 ~ѣX/hYf߯_?F?$Cy:'*MoT$I]`~)I`HKKKKK۴i8|r'~,--}}}#""$I/kHX^eQrJLL̑#GTXgeo%Ӆ 6].MuaJg .\Pv0:uUV [nߊ?~ԩFE߿@:Q""BNc$IR>Iׯ²)iڡCN6Ծ[&hG^\\78pǧo߾I(Itt|$u/'*r/e$8P9#Q:uԩS'IҎ=z7oOx -(0`R_TT$jڴKmA%4MͻvTzsrr%I2 ۷oo޼ytҷo_1H~~0VPPh"35[իW-ZdeeI;eQTT\h4Fuj?NTN=KTWWשSN:СC;w#XΞ=w'|C cryHxsȑ<ܻwoHw]t1٠Akkƍo߾dgg__۷o?tx{c0nڽ{z$ie-X$>>>$)55555Usk(m8P 5Q һwO?TLBn"QQvj}ݿ$I?FjRڴi3bĈ++g}vȑϟOMMUu<8uTLLȑ#'M}B tyټysx㶶U.??ݻwKdii7Fod={ܹs J(666ݻw=zTݻwv%?QF={3fK5F~IZnݥKs8`&M[ 7otQF^^^vvvu_ХKn޼y^okkҹsg_HNNNNN{nqqqFڴim4]ԗ8>SoB~;#Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPEGGݻW.;::ku.//obs̙uj_-QzjHH\vuu%Q to*IҸqHTj /r޽zo…666u Ҟ={V^-w٬Y mHPӣ.>}ZyܹBԬY3fӦM* Ҵirf͂6cTPo~b-ZuDP1;;QFuP~PS_h977777&Z YYY:$???''zPE+..U2Mef? IDATftjlS[nUoW=/Pէ1*k|||NNNQQ$I|ꩧ*=;!!~;{lZZڭ[z$IM6ҥ?+++-,^@.N8̯/]$z-Q^^G}$ZҥKrzz={?z9ڦMN4ILtsΥʡZXX4mڴcǎO?4Eegg/_\lTqqq{=|jjj^^ޣG4K.]F_6mvĉW޾}[iooַoɓ'nݺF>jJSN}gϞ{n LR̳su KLL\x7n\]vYsO$9!##c̙6l0HTXX߿+ѣGOn"K$)///XhQ1WE Ibcc_|ŭ[_z%KVPPjժS޺uhݻ /ٳF:_~D:W^9rre֭;wܦMS>ynײZt]sUݞ9>F>P>5o<88x̘1򞜜;wn۶-33Sxs]xr@øqF% SRRD͛7FYYY 0`Ϟ=c 8::ZlR$I &M-6tO?[$iӦz~ƍO׏?n:4f̘1Du^{Md)$،7n֭bg^^^VV\6lXhhܹsmllƎe˖>}7o -kU9ye)$?_`ؓiӦR SpwwߺuyӼ$I/m:vAFEE؈N;s43hӦ9Ռޟ\<ܣqP3/ZhID/Jm`J"iJ;tЙ3g._|ռP $)gܪ_Uŋ?iiif~~~HHHhhKΝ}|| *z%)]%T}0A5ԙ$??ƍv W\}ƌc3aeM ]Qr_ʢ1*%IjܸqѣG'LVQb&yyyF _[jeΜKRCnzN#z?L<988X9ÈQET]բZ+@YTFVYM߿pB޶:ujժuŝ:u*..Μ-,,I;vСC\^VO>}ȈثW*ez>::̙3ӦM+uiH堝N:yxxT.kkXRW*p{zzN2ee-pB󟹟z)@yP_5͘1c*/ZYfȐ!>ۚ5kiҤ( 0}(J+++~raaadd4hoaQootL9ktJ\Z_5^~Be5'''Q{x_JRi"I(WCǕ#^fΜY]-+7N?rsssrrlTƍ!sjc={l$)^qFU֎^UT{^%7QQ􍉉f322DqƽzݽN۳g޽{$IiݺuM|o Vi'NX91Ul*?߿\~Qhhh5F[UT{^%7Q2d(gddEM31Lt-ǛYS HeשaÆUUkrn߾?~lsJM++ʿk~~~ZuUT{^Fԛ9;;ח{7n+._,6\}ر^rJ.ٍ=ڜԣ.Z(WMy葘4Y(DɦO.& &!!̚SJ`D$IʉVO:wߙ|ܹEQWZerqqG}d#$IԬY}>|P.ɳ#v*[n.O[luCV\|Rr~GlOk׮-7ofҤI+V0+J}0DeƌWZU֣̙srtvvѣܵkҥKK]{Ν&Lؼy~K9rGm^Qvx饗s?ce%}]1`/z뭲RYf}֭[dIO}tҥuֶNLL֭3ݦ /zj';;[,Ws='zgeeE@@ݻŞA{:E;;%K񽰰رcǎ3qV7oG&OѣO>Dt]+((kyٲe54_J_7xcھ;fO2^zaÆ֭7|3~x~N+wn1ᩧeFܬwjUN޽WZս{w37o|ҥ 3eʔe˖) Uy^ߨf͚wߝ?d.{{~͜9K.%-˼y~'N(ߕYZZz{{?+..N.GDDߜosssWԩS}ΫVi[nS~Fӱc{,88Μf׭[/eFlmm}}}~i5Z+ IIIǏOOOtM6uww2dHUegg>|ڵkyyyVVV΃n֬Y5F$$$ܽ{ZI&nnn>>>:tt111gϞqNkРMg 3*W=/PճDA=DꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDXuƾۙ7o^]Fh>|X1C@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPbrrr߿oaaaooߡC++J#6$BTF… h4)\qk׮͚5T)  zyaÆ%l޼֭[ryܹb:7QꫯDҰa>}7k֬ ---..ĉrƍO:V;;#Goz;00d7nYfINMT6o|=ܬY^{cǎS[[[OOOOOϱc~ouL2e„ ,uaG7|Sx /_$ .\(MVGјש,k׮'N\zCBB$!44w͚53:*D~I4~x/7o\jo?[3m۶Mt8p+b5k'Nz~߾}F-رC 3fLpp{W^Ҳe{o̙رկ_?qK։oڷoZT{ cV>|EwޒV@7QjZ>};oܸs7|޴q? IDATiSBBBANNN/BF"/^(FKtqٮ]1t]t'O,7Jjfj۶m}$I={娨Μ9#5bhѢEY.]5eUPQMT$I]`AppHzo߾ŋ[{11`rI˚AX$___O4(YE:uenTx\jjYf% G999IIIO~ TȂ>ӧ}d0ӷn8pJ$);]vMFQ"%yxxeD9}sjӦ\.*999##C.{xxX1hZegT@Et0+++?)))***66ʕLn߾~9sM%zt:Cwܑ EEEbݽ8O^S5__ׯhoooѩSğ &0mۊe"U@%ԏDEԩSN$IJKK;zӧż$EGGbO~~Xa`ѢEf~у­[ $IjܸqϠ"YJMM[[[+++y⼼Jlݻhҥٳgj׮˗OML[bP.{T[Ʈ_<83R>\*_}4o\.ܹsGL4\!΢[nUV+ʮDE~D9*****J,\ӷo߿F ,mU@E1QSSS *U+:tkN. G:?_D)e;;; ԗ FܹӪB(5&*[n߾\...޼ys$$$6Z$J?~/.] 19`‘#G:رc,NAVZ*b|1UMS.kjw.nݺ)_9{ݻnnn[V~Z[DEQFGkךHV^-rwwWP޵kWN[rr4R||W_}g)G#x{{'33sݺu~e;;;vvv"|bqɚj955}L/ӮrrrV^]jx}͒ V@Ei{コ...999b䨨5iDTvoa=bbP-**JNu󣣣Z%yfglOOVZڴisI17%%%))UVb>ݻwo޼Y,1a„]*c4hЮ];9{>><<<&O?ʹccc4iR\\)~$)((hԨQF1<Ǐemvٸq޿_jeu ^=z􈎎.\7o^ƍ {z]P=Q `0\|O>qpphڴG3}rnnnrrrJJyMd>U`>v:vc(V۶mÇϙ3G[R˖- "IRnn9-4jԨo߾/۷ow޽\---u6sL+JզMΝ;ggg}Ϟ=;==]Ѯ_$ڵkF}!Ϯ3ϘL5{ݼyzT[fԣn޼4MF*Trrrrrݻw5jԦMoo M`u7o7hРE]vUΉlZNN΅ ܹѣ&MyxxTKbbbbblmm]]]tRu(**7o?bĈg}V1$&&.ZH.{yy<===111//O8::v1W R]޽ۛ~Rprr2⥖yxx&=zT4M@@@hIJ-T=FrI\j %\Wc0j ʗvZy&kkaÆ=c@OcTPbbbt:͛7/\ u(IҐ!C*1:Aҥtss4i* ~\nnn ,ZUVE{=ze=I& ˭[0Pӂ&@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT !Q:$*TDꐨPC@uHT\z5%%oN{$*_?O?Tׁ귷z륗^uV]<|c*Y櫯nnnaaau\FӤI'''///;; oJ_wС#P/YuPofʕAsիJ1gΜ,ܿz*PΝ;qƘZ1c~ )))g^j{݆>JnnNkݺ_[ʺuDhL3Tʕ+7nܐˮUu֭f͚Yxɒ%z zիW^ݱcoY}͞=ŋ7nK7ntqq3/Q9}kZֶE;wٳO>ioooYdɽ{䲧3au ꫯ,E^z_h#aaaGˮh@aÆ5k9;;#F(y=zԜ ɓ'&jƍgΜ$IRFFoa @}Rƨlڴ)$$DW4{{{^h߾zeРAoC``~[ت]RRs=wysĉ-D;SLVVVaaa$4l0$((/J5TiӦDa޽Ybźuv6mwy{{3G,:a5O>ې/c֯I&}'$ܹsڴi6mR۷ʒ%KDS,%!!!..NlTKxꅳg*_w*M()##c˖-=[zvĉW_}sΒ$P9۷_tw_nCPԃ_Gyw>˗/*UYfӧ岽|Pvv#垈zO?fuV'':RۣEMFczD??bŊfϞ={Cu뛿<%I2 ˖-߿_('*zAArs@@@;uԬY3۷o߸q#>>gϞU :U޸q؜1cF>^B(IR޽+ڂ }JXXXvv\I/ʮ~~~bOTTTnnn('EHL]fݻ7///##UV-.|}}+2cZZrHOQ+v0} OKKϷjԨQvwf/_|С+W=|ںEC5D`bv-Z888.\p;wںW"*%%%??_l*b5RY{ܹ3gΤt:KKK{{f͚ELݴiS~vq:t푐 Rqtt4XDvmEW;u$6O\b57\C1V))***&&&999??ֶI&~~~ ?~M6٧,X̭$;bW_}uمk׮ݳgOZZZk֬qss 0aBYm.YD9I`=Gй*??Æ {Qξ;::=z֬Yk'B|Att\|۶mS :wީ1{lرc.]Z֧FjJ*6srr&O,6|PoT]sX]zgffU{?M:tбc˗/˛DE-_D5A̘1C٥@Sobŋ+H`gc߬ h4CHEi*(B[֚־SJ>ZZ%"Rb%Bf?}{I2d׹ι'3s:ɿ&<89)[YYg2zɓwi֭+W_4gώֽۣG6mڴǫyHզΛ7oΝ%I}s >\噖$IƍiӦ]p/WYQEDD|%ɞsg3.;~g';?lݺ544Ԕ";{lHHȭ[TߦM|Xo,G}diYAg5M6}7+XL;*m۶\SRR&Ll2Î#**J.7lPz~laaѫW/y[{ -SO8qbVVEOO֭[kzիW^,IR~~ܹs5jTBF655O?U~$xzz:99=yڵkC#F(سg<_Zj5mڴvw=ӧOM2EoooY)))QdM4Pokk[jJrڵ3gj}իW״)--=I222f̘Q~}W03B.]RX~U&&&:88H=-_S$^z6֭[ʕ?6F?8666-[lРkjݻwE兪cn۶Mz\:tԩST`רQ޽{’xxx 8Pk` I>SN3fL xݹsGlܸ?~\lԨVܹTݻwȑ@'''O6M1nܸbȰ0y^vv9s6o\aJ4gΜKttt4h'|[llH\XXvΝ;-' uOP#>>~֬Y_ټy+\G$vEɛK.{Z-ZSyF!!!yLRRҪU~gzpJJʜ9s֮]kv!98>(:8cժUr9""bС槟~ڽ{T.3wdlOoU :ujz믿Ι3GbŊѣGlgg^xA9ZA^~(28Ç 2%Iߐ!CM8188؀+("8wrݻW90,7={T^jڽ{ʗ-[u֒B߼ysK.ӎU@ǏWx $yyy-[,88X~%33s6mn޼hJ$c{_)((Xnʚ ޽{5jXv^muuu:uiӔsZ9sƀ# ܻ /q!CT,c|Gbgct8Ö-ZXfM)E7xcŊʁvb)+13~f,--nh:H'($?7n\׮]._l.G1ׯe+++/toz~m7nLANJOOWSsrr2/ZHT_|r͸WL$\Rzjee5}tjq8{w|||/_iӦ5jHL*Zjpq;#oTw! MF6QQQA_=iӦ)3e魭CBBUf%I 5F%zP$iԩqqq?S~|YfbbZkիWwvv֣M6-v6?b͛郃ԩS7n o^vbp2]v-PMVVV_~eўzذafAAQjcݻM5C(jgg'o|4Hu;X IDAT$o߾HߑHF+3+oiS$f(Ç/σvj۶+b:&3*aÆ.^XƝ;wܹe˖ ]8wFU}v.][PPкuZuY[v;)'''WL?jA*UzuѣR'nٲ0w`yb"_]+jiif}ڵ}}}2V0f݅ﯲHߑHFygIR'Uܹs*WV[XX+ԩS?\~}knݺj~yI|||VXO?8qa111111߇~"Ib* Wz/occSS$yyy5mT~… )nZ2;v8p5Rk~~~kӅ$$$񬾵$nZ>+~V+F ˊ/'v* V$B噈܌;?hu_~ϯ:f͚GZjggM]\\*ߒPa&hΚ5K߿̙3X4ϟ?f͚_IRAE92A(嚘-[q-00P*yyy;vuT~e 6ma 48qbEVySk-ݔ;9sF͂j4o\ 77ҥKU DPAޅݼ;қM@@@͚5?~ܾ}˪jժ'O7||T3Ĥ[nݺuߏ=z٢ T]|yȐ! D>JQ;;v(o:vիתUrrr4TFHׯ__VXgΜa$I9es$I OkׯKPQt3Յ̔#?X[[{՚e˖>|gϞAAA=X,%e b .,~gmaAEJ*={ٳg^^ޯozª܂ӏ4i܌7T呙y?֭[񙙙YYY;nlT2SFelng]|Y9+W\|F5nܸC:uVVVo|1HBBB,X_~2ݶ`XTdֽzիו+W֭[wAeQxAEGeKWWWoy嗕lڵKGP_{6^TO 8YyTy$4Os=zTg )#}GZD6//iNKK u\]][hѡC={}VH Y%RFj5`z2iڴEVZuEmƍ\bbpETڳgrM6JqeXҢbeTmZZA$ɰbԴAe…۵kYBHߑ q…g.iC͚5[nSLQzҲ"C6lاO2}<%$wTtqƍÆ }敜oְ7p+(G9ŰW-ZhѢ2UgϞ2KL#kkRA謁#Uvv1cܜTLΏ?6]Zm۷w˗/S_~C Qܼ

ڬhT[N/_V^ZXb6=zرeZR4T2SF$ɻM.]ݻwC Tv *NbX#F1A˖-4&$ӧO]&o޼yaÆzԣ.98ʴەqqqk8t\t7 n޼ꫯ?JITD.\-\[$ n@ff26idȐ!{2w$`ԬYs5j駟4lٲ%44jMnԹ9pkN388X4h] /BhkvrLC#:$}2]suumڴJ}tt˗5k[f\]]4j\reƍ̙33Tm@O<ٿ5򯳵mժU7 &&F9i```7.d ؟6'N%IС\NIIYnS'}PHվr9++k*-[nm߾]͞[lQd+g1 TK*lHNNZ`N4f݅`aT*?6F*Pr'JZh;/$P̜6mŭR-]TyǧXފ9 |||$;;ĉ򦋋~T^]y_y~lrR+?w͢޽{~m޽VaÆH;/]ԧTSRR֯_/o^ARh֭ޭSP¢-n]=Q~6OĉjLOOW~jp]ll`kk;bgg:tń-Pq'|=dyg̘f" e5{Q>ҩS'GS+/;ƍ:}̙3+g6j$ ꫯJ=cƌ5ӺwHHH5jԭ[t3i$倊@TN) u[fMÇuA;55 1sBeeaT*?i۴mV.'&&Κ5f̘1CyW}bcc=z$o|ի5w5m3Dܠ>j(լ?pر(i*[n-^ںuzǎ{=SHsc;*Z?~YT_W.|bOV޻w/88/޾}|M;ۏݻr,\ff NZהe˖^ziMrrrI]uk]9ի|cW틝WME'z/$\͝8q5k9sLhh.P's*w21^0*c|GПmlƮ]>쳒~qN>ԯ_?͖$ԩS򏦽}NJ}yzz@f\N@W^|yAA뎎=mfffZZݻw=zTtoFV^9J.]?^SVQ/^TNqFv7ڵKCK4k,3&L4hPݢ 5׾S-\]]Uѣ[k>''M64'MNN}zΝ(%aIF5bĈb[FEEɛ[vttLMM}ћolBٽ{:VZƍ n߾5E]VVxbd]v 9ܭL̨ }G8ƍ-[(͞=#""/Xhoh;2v?FctӧW4ryyyڦ$&&޼yݻZ?&M0`Qcر֭[LÇ_bEZZGK.3g=GE-[:#+/*,wٺubO84i|+GPdoo?}t+ի]vG5wt\jկJ)$I-[ʒg>HII9uꔎԤ͞s}ɛ::nUT O>}*SvssG!'7o>3 3B1R06Gӟm&M>77˺0`"I҅ r@@x;Ke˖.]XZkמ>}ʕ+䇊9u*lll[C7nX9KJ ZZn]ǎU.U~˗zfj֬Y_BoݺujN1-,,/_+fkk긒>رcIZU[ld5XXXkСq&a]H?f~M*U-[6x`upss/Ԭ(IѣGnVVVzRy,3*$y{{\r۶m~dZ^z3f߿LsS>-zƍ]tIڦMOO]yY1??U$I^fͲeڵkWүEFƌ}vݳZGGǩS㏯x;;v-X`ӦM̦e,XФIbϽ,--۵kjժ'Scɒ%z)OuaÆi-*nӦŋ׭[G>>mBPyURe޼y ׮]5jTRRi[0w9sf~~f>Jg]ڵ̙Szufdd!C߿oVז-[&M|WLb&0GH/vuul޾}дM7njʯ:K+.A$'Nw_:uLݢgZkժ)3 LI;̘1`,rrrL"11/ԩGcРA=zxLfmyyyj菟GP   T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8W\1upGp,rrrLQ  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8֦n@~ӧOҲJ*o߾K5X䘺 [r'Ю]~999U*wT*##СCW^}||LݜoӦMIII'|bccc3ҢE }===ѣG7nHMMռdɒ)SxzzVlKtŸ8M9$$\~~ n0bU pСk&$յDZ#˗/1bDvt.***;;z<|PNM/- U"?"IRյ͛6mSAԩ#~;wHaÆuzxxt8MJqttl۶mfsrrlmm%I0auT+ PTrss9"oZ;lٲ%++KSn֬ĉ;L:5,,L ?O?7NA{1cƼ hT322,YٴԩrWj!!!Z)E!$$N_ݿZYYR3rɓ'+WxܹV~8v<1W]]]K^h۶wђlРoZ81k߾}G׳^l֬י IDAT^۷};;vLSֱ" 2]ZJVVVju+[)Vƍ40TtpwwoڴkVnݢ;<|P^۱l`EYYYUZUTt, H#7nXEKKK;;;'''oooC6u'KIIqqq)c4=<רQC.K&faaQjU4 @ RJM999RRR4jժ y&$Ikӣu|ҥ|Mø-PijT4h ?{ӧOet*޳T^yk;s@DDݻwK3:::22RS}yh \tyJE=+AN:-[ԔW\)?wڷoZCˏH# =+AEVVMS{iN:%k~~cǦOyw-q]RSS5WTJ汎A6lʕ=z|QXdRR!$Irvv1beKբE3ghʗ/_9rSFF_?P ׯ_rppSNƍYJ(3T@|!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  Xe^pOzzsZZhѵk_|ݴiSaafK.ƍwyqfffvvG}/|zM=kkk;|p=T0*o^n322)!!֭['O\fMΝGѤI믿>pwPIHHsX9h[ ?} prr",APٵk7|{C={v׿ r{'//oS_Frrr+D&zPY~… UAA֭ӧ5TU*%K)֭[6m5jTfk׮8qb׮]ߡϟ}MNSSNMMMlZZZ^)EerIР ywQ.ooVZɛ/^Ǐ߱coWR,[ѣCCChLQ rZjA%"""??_SzWTW.1off9sCשSgܸqeƍfPPСCZIIr U- AJbb\vssswwWFWWWǢ%/XYYM4ѱlذA~޽VZSN-k :( CPY 0}ff<"I|3D$`j;wn֭fPPP```j$)==?7 `oo_JtP.Le@e"hP>3=ި\L7ِ &р={л 8PJtx\&4raÆ߸lٲׯkʚA_z4ĉrB.݋̬QFÆ xL_ AU *W\7TҥK6m7z-k˚cIII?^\V_|W I7=\ffy|{{{͛ѣLqT~z o 8q~ }葦leedɒ[XnnnTTTTTǍ׭[RONNȐ7Kcnnn9:.\|[n*QYb<`r„ zϦu%\f5k֔:؃ƍjժRsrs߾}:*ܾ}{>}8PjP*|\E^$wwz999?|Psaa+llltU'OP 0JT) Y7Ξ=[LL_2/2KKΝ;;vT~˗;wNYXX4k֬k888n: vڮw9uԹsQpYYYf+_TTvGl߾}HH7~laa1a„rΣ;Xwwi7l0gΜ~AJffܹsǒW!KKݻ9Kk!C?>,,ڵkrӧO߶m[YזLQ9wٳnnn3fP۷owf=w^(7]]]/_{,Yhhr .СCgϞݳg_|q+R4׭[׼ysm۶K2;iҤ4ͦɓ===ռw󏦬y׋$bĉ:qBCC4Ÿ=5S͙3gǎz]m”l߾"0㠒+6lʻ"7oД-,,ƍg9|;$5k֬gϞjUvvɛ5+ߖ7^z}CU1ckKԳgQFyo\\܊+_]e(F^+мgaa)8qP5cAe|Y$o~*;{dM}Ɇo_nZ.f//:uțrٳg߿_lҤɢETgcǎ#Gț|GUPP SRR\kVVVžT 4G9 jժu]M'_PYf͛M//%K8;;yoBBŋ,Ydɒ%e:5klذM6Z_|E5i8Oܾ}[^l[5)LyoI}S19eLn֬Yeǧu떜<<}[=G&+Vbb;MRAeĉfϞ=U26mtQܳguy]vɛ[nڴi{֬Y]vʚo,*//oԩE h:L6СCK/ r4irrׇ}$33s޼y_<۲رcu駟7U˗?Ǐ˯nݺ{E@1u.[LJՕKԺu %ʇ'LazٶmfΜ'beeռysww9sɓ'w1bԨQk^d֠/gg-ZԫWٹɓ'W^z...6mW^-D _5'55)}~alZKM)$=:)))<<\~%55ĉ'N(-...| )fD_f_tW{:;;3F73f -v |||VXѹsg"J%z{޾sΣF.S]vݰaÁ?~\tKK jJF3+...33ʪF Z^W^=w\bbbJJe;vf & T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T ж|rS7x9MQ SwT@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!ApM ˸[KOrLݖjڼZ86u[ "''mU(|/{ BSD|N m1 ~lc"I vo 1 P{weV{M %-R ~?`VA(ѥM݄1INP6fTѸ/ kpI*CP  JcS7g (ŰarssucaaaggҸq@i^p9s$''׮]{ܹ}5uZQ|&@999n.-z y԰J… ;wە+WjԨaV (>{@S7a[}|ϿvmnZdDpWNN_5sL__߉'feeEfɓ=f(> m/LvoPoǺnU "KKK[xq/^h궘OOO妅 /`Ƙ >L0MJyJMIbNC4hТEbwJOO[Sή]4ibܶV:]tД~zӶ,g0k" RYz^9ŎC){?SRR6m?^pAzÆ ϝ;ggggVFׯ{nf{=S7<g0k&*Ŧq:A"5Ⱦٳgggg˯L8q֬Yo"*/)Eby[+GPϨL4iVVV+Vz _J4*mP$)$$gϞfjjƍ!\{ST$I'N%JIۚ7nQQQw~INNg{5z?޹sKsss]\\\]]6mڻwo*x111rڵKZ իSFԴ!666!!A/vK.ɏ0{yy[LLLJJ)]Ɏ~WСCOvZJJJVVSj՚6mꫯ6kLe%*? 1_GڵJMMݹsٳgݻ3WoomёLfLQiuѣsRRwݻw޼yEή[nfjذs挚 :~7K^^^S=k׮-vnݺ>|XSӧ͛%I [zCA#G\paW)11oپ}KڧUV}QHHHД1_×-[&IR\\܌3_שS=i/tiѢE*qΝ;ŞJsڴi$Y(999)))}6mʩ tR)E .9k׮׮]3l*cJs΀3~Ivѵk?08sl3ǽJ>K${쩵KI>}{C7--:srr =%77P>p֬Y3vX7=ڳgݻwbWiii R]?ԩS+  @9RT']]]u왒һwoZjzyyUZ5!!ҥKNR,.Xiʔ)%U;tPQ//;>666ٳg>/(((ӟ)3g$''˛ξժU͍wrrRl\SNM4IRlmm۵kפI5k֨Q#55֭[>ٳgmllـ #G-,,Zlٶm{.''Nu떼'Oƍcǎrqem<^_ DJ)[l޼Ǐ|y̘1SNƍwlΝ;G~~~V;a尢jժ͘1cĈZݿ?,,lÆ yyyyyy*8)f͚XFU SK{d֭Ǐf3**j̙3f(ѥ gϞ˭[5k֫_=sL_vOdm<N]Ӯ[*bUgTΝݵkגܷoO?$o֨Qc֭EO%IjРAxxg}&5{7mVdTڵk\rӦMZ@ IDATQ<8~x)HJG7[Ҁ{oǎUV_ٴiSy.cرcE%Io޼VZݣG,X f-$oԨj;w믿ZZK…3a;NB/^w=z\5k֔O;vKqatqf>ĉY(44+mzYb;|Cl֭[,5j;'O=zt)ӷ7o^uW6,#fF$|#G̴޽{w-b5pU/s'\wk׮!~iU… [0+V/ShQy.bDv+|#O):Y*E :N!Jppp>}3bÆ KSXBLkcc3~x%oT|yCg1A.](V#F(,6 P:wMSDk./33/6[l+\q(缋mg UUJ!. oM5!!!&&ʕ+Heʔ1R3gĶ͛7߻wnݻŋ=vضP@'iUlٲbez3r+uիW/ӣI[0J(1p@%%Zx ??c`.M$I2?ĻTBBBBBBzTʕ7mnÇ޽+v5kry#GK"V$cymer+פIwww1u5k<==|c䤰<s۷۴ikkK.ez7*ޥUVVVYw 9| {] ,(Fl$޽{bDr+' nZZԩSwݫW+q&T{aXXsjV+SSS떘׭.i39 )E<Tv:nܸLGuK7ipJ>*FhmN~s']rg͛m6ϟ??~-ZRn-Z+pag(*zJ͌I5t۶m0`ϟ?Ϯ OJJls'<֭[vܹs)S|G'N,]λxaxxxlܸQIIFӍ@Ud-)%Kޥb_~)KKKQ77nȮX[[Ι8Uȹ&v?śΜ9#/ɓ'ZMދ |V!? hٱ)RNLLۋ/^dcﴜ;٢nݺ'O޻wǏoާO{O^`'O~ Oe ˓RkAm۶m۶?6mC+6$%%fWcv(zsCo8`ɹڴiz˗/w]?,_ %…rBJT^ *$͜9S޹hժU/_6Szݓ'OfWK}}ΝVNbrrrNE˹Cׯ_?bJJJҥK_·paܢ$RȃA| III}kvuuAAA___sF)r9sȗ<…rBJQ(I&O,Kjf?|M6zuat\vtt'O2=СCGUXɡɓ'md>VUrMy C %ig*fP0aȘ:uWL۷ r͛7i&,X->HOO߳gO̙3'##Ca9$NB2ϟJ^}aI3%dRJ͠"IҠAի'voܸ1gSuVBnڴIϧO6vډ{㏙V8}g*|J*w7ol?|!眜;J߿_ !!!bMYUy6H4mڴo_~Ç 3Fk駟f!'99yȑǏҥ;ȑ#Gǻϝ;2S… gΜi}Zn-ȑ#«V4isTp4i"KMMU^yʡЀ!vݺu354СC͚5{Æ {wra\~_~CkDwK63݊wOZt[l4hPÆ ^paXXիWuZvڵ6lU윑;w\xQoSkΞ=رc&899y֬Y˖-sww~+WB())) ?رc+bfΜxU+V,==ѣG.]EѴjj߾} 99t•h֬ـVX!^ٱcǾ}TRlYWWWkk'O?zzLc° rȮY0iy<(QbȑbǴI&9rha''}u̙iiiO6?(H"/?sppXvm.]bccwmFꫯf̘a5k5jMM5v"E! W觟~ܵkx%55588888Q&o;-/w?~|rSV\i={.?`4׬Ys+Wδ6ggEuI_~aշ~;}bŊeC'\ m۶3F>>o>~}?N6-@~d!Yt\hkϯ?MMHF }ϧu^v&ׅ{T\мye˖ 6Ldϟ?nnn+W+ˮ2r]ѣGm۶PB```sQjAPrM̓njddѢEǍw16jOCe.ڼ-11СCaaa=zⅥC"E|}}5kֹsgF|@u@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*TիWs ?x@u,RSSs ?x@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@u*T@n7;w̝;W1qD%Gmٲȑ#F3 G4zٳg… +<*11Q#-@u*T@u*T@uT:WN }abbeBJ,Yre<}ٳ>|򥭭oJLExxnѱTR$ݹsٳ111$UV~OOO͛7CCCRRRJ,YfbŊ)8׮]~z||/WhLp-h .ǧ;88(QZǏ;w.666!!`ŊPh(_.ܻwoӦMW^jzTRϞ=ŭ)7oxWܹɩC͛77dΝ틏+iӦv}G{mذ!,,L[ؾ}W޽3 ]ʉ'VZl^x7\n]S9sf Frʛ7o~gfZj駰,Prr۷mftݷo_\\_|aȟٶm1cXYYiIRRҏ?x%MHHظqc\\\~?f͚$%ݻ7#FԬY{eW5GAʕ++V?,XTRE˗/-[{Vr̙%KJlmm˔)tX'N8p\v-%%?ԍ7NdȐrʉjZ{vO8ѢE2eʘju]~ȑ 6$&&ܲe$I͚5ҥ8|ΝbB6~P2ם;wWW1cS$IUV;vnwѫdӦMQF>s-$I]t֭n[iI Rn2eTPL 0m„ zC2*T矋qo~ǏE7-{{S$Io߾իW[ҪU#GS$IM40`^: 8PItҬY3ʵk "{V~ *<]d%pgdd޿?$$D4h oԾ}{1둑Fi4C,Y2(P`z@L2"h7nz- Fh*Vd&Mm3CY$Irqqӧ?/^\캻,?nѣGzޯj_~{U!ղeKooo/ѣGŀ Y^FJj\Flٲ*T0lٲF踺fjܸag0Cs3%]]]͜v*ULsss+\# )Y~ *Kh4+W8qA|}}}}} %I23'$I"Ht]e,-Yx`65˖y0`tb1Ķֺ f%T^=88X%K###<<<<<|ΥJ]|x\BB0˩S*|SSkGBB®].^n9y+|T'OyÇ5L222Ξ=_rvξejmL.ɓ6lx'9կF壠"Iu۴isСK.ݿ_޵)99ܹsmڴ޽@yW"Bd[vر=--M[P>ӳXb $)--mٲe/O~0EAE>}<3՝w޽{+Wܼy͛=}޽{C-*K,9k,Eu)¢e˖]v-\^1rQ `J|Y]wsrpphРn[ؤI>ØzѣG_'|\ `J|tppS>{,..NQ?+QBI&MN8!/,ch;͛biӦW3TT$Ie?~,Nh4ժUJII⿦Mf???#|Ç|U(\P `z|ŠL{lݺU /[PLLLLLLxxq2$կ__ >y_¶mfKn߾mئMJsc_PoPiݺX$&&fѢEfʦMΜ9۶h۶^r6ZM#*$C+aIII/6x]/l۶mܹM!_~޽F]ɓbW9$}0CA޾s'n۶M~oŋcǎ};w/6lذf͚zkN<-x34tϝ;744Tkkk[~}JWP! IDAT@$$IQQQ֭;wne˗/￯{rVzĹ 4iҙ3g^|)IӧO;nܸ'RSÂ$y+*Ke˖O>ݵkv966v۶m ~Ջ/TReРAUy{{wڵ׮]~V}y\\)ҥ^%^^^ Xbٳgǟdee'*^zvQzjժ]xQ{EYZZ,XPHtYwZ^,/}0CAE={322 )/X`g-[fdd矺222bccccc ܹs6mVWp˗ ~Ʀ{[VAsg}6ׯW)aذa+W|$I^zj*Ur2y+)j*$5k֬ZjΝwF)ZhŊ۶m[D Ujժjժו+W #mʕ۷o_T)3T\yܹ;v8sLTT_ *Tj:xzz*|믿>7YBj֬ٽ{wGGG///]P$)$$$׃bmȂ7o>˗NNNYk {ɳgϴZg~)qΝ;w<<--PB9ܼyۉ666UV-y+;T @EP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:r}!!!111ϟ?OHHHOO.Tgٲerw*W``ݻf|Pv;:;; ߲HMM6୊^jUPPPDDD_+WCmt*HZZʕ+׭[ڕh4m~WŊƶr"<<|7o{ã|UT*Z$I QQQ_~ V+?mƌu}{ A%_ >}AJׯ߽{Fez{nݺcǎOmmmLҮ]i17J޷cǎ)SzJRVqdŋoٲETecc3k֬VZegsJ7.99Ykcc3z~vN0aBttnq͚5e˖͆ł#---***%%%LJJLJJ:%Izi 8qH)?ӛIVZۍ2eʛT&5JJJ:^"IHHɡd&3.WffFl-P &;uTNLYtݻwuە*UӧO\zuϞ=.]~|||zzO6mM6:u۱j׮ݣGqoƴiШQ/.Iҹs֮]{ϟ[ZZ 8W^Fkٳ+Wtۅ ^dIճY~}{۷ܹsoNHH(WWײe6k죏>*P +8pرc!!! vvvEiذ~hooi%fmk43f>|k׮'O޿ٳg)RD5jt貘ׯ_ ˗/%I*P@"Eʔ)SF={*9m֬Ybgg7~x݋!!!p“'O_zemm۾} *:e27oܷoŋ}:w\ۢE-Z(P3F၆ht-TT*U$ʔ)Sw!} mhb…f ߺukǎbTʕǍWZ5_x>#FAL2ebݻw7Lu 5kV6m~%&M.^x```7jѿΝ;C>Ӯ]*lݻWX?)ܧOodddduW^MKK[`͛u7mFY[[sܸq╇Λ7СCz988 0`Ȑ!f#I.ڞ?>""bf.Z Mk։={#G?:t/E~nnnǏ7o/qԨQݺu36mܻwOTlٲL IRBBBEdԩӕVNE @ȿ]92p#GO)$]|y֙駟ͯe˗[޽hŋAڵK/7>}doJ$sYSDD͛͗ ٳ-[I9eʔ3gfچѣG7o$I^`A޽-o222""" zj37|$]??~o߾AAAfn$I_`ԩS'999<}#eM\zz&4GqZd/oҤoDFFK.hׯz= .[ND$N:Q\9So4rSN_rss𰶶NNN_>y… -[1ZU/]do&M^={իWuۥK?e6lذzumٲ%(($*UQ%Jؾ};zEΝM<}QY=<<-jiiw_uʕ 3::zСgΜ{I$''ˣ]tttPPPժU܌ŋ?C솆^xQj4wwŋ.\8%%EΝ;$;ٳg/^xB Vhъ++WC Μ9yͮVVV+>>… mڴ1uuIt޽#FybŊ)Iҕ+WׯoNŋ/\P>\"E<==).2ҤIÞE[nmz-Z$UR}lO~ɋITN~5mT^&$$? 7 NNN[nuvv6Z1c/vzݵkWq{m۶7oڵk'/'B#!*UJ޾}J[۷v Xx7i=ݛ?Ç9d3Z>c]h4v2ӧzzx˫[n۷ߕmڴiΝh4K.55FhРA>++֭[e ߾}{@@g%J[(E#н{=zF Iv[nɋY[[GEEv]\\uֱcG1$)))iWzSIRt+]tnڶm+N`ddd@@[nO?V28:ujӦM tݻwÆ _5ͯjfukkk+שSO>{Сŋ߸qCҦMK.Xƍ7SVZ4pcǚ?İ.ZqTV/ZE~*v{j*"IRj~/R#Rn޽#G6bĈM6)SF~I&F^Sڵ 5jI)Ǐ߿Mx)S fjq޴ZÇ5k?ܼy~;P?… :,X`oݗ/_>{l>qm޼jժdA|?zhq'ImN# _˖->3 ;vܸqcZċO< Pޞ^z_@77>lڵF\z588Xlٲeر"HاOm۶ǯk5k(l.L0aժUz͚5[f| ^9qٴ… θk.R4MN6X࢕-!?'O$|ƒ O6Zl…ŋ/_IJ(o999vZի4f͚ .tppȴ<0|';w' ''RJ8qbF+iӦ.\`XΝ;՛?6m:tP{59!1ŋ_lYڵMt*U?ё#GL+QĊ+L}f`S *4}t[[[ʹs4F޽{w~3gjń z8 ҩyLDgkkO?+5hNjj={{{ϟ?7z*:vht/^ 4/rʥKVZ.ZCorzcPwtUdD7ӿcǎ-,,&LbBOOÇ .dzW`A3rG]󽼼 DGG?ŋ]KK˶m=ztG]rXS]\\Sװ!(*UxРAbWo؏$I˗/-h4}]w3f1/##cʕrĉzMރLזWt\N jIW޲eK{g+Vʕ+)PMOO?qℒKԷovڙ)ТE ~a//J*]GFEEk]TJ4nxСC 2d ٱcخQFf2[n>--mϞ=׫W;j%Iw$3kܹO}( mxc֭[_ϴΦMo(^Wʌ_lGDD-#/\`f;wcF4U֔׸hxmq(qݻɣF2ה˗/]SYV]vf/_F %J$жm[eBCCg+7sgGw;&IҫW2?r|-[ZYY}|| *_B޽{[N7z!== 0S^᜶;xI*ps%$,YR<;wԭZRR8ϟ?WrG}$,d<TCK,J -u\fE kˏOT4i"|/TӧżFVVV!ysޡ&&&Mzj1>A_1zFPSNy۬<Ӳe7bT6\\\Lgq5CIzN%zTOW|yo )RDl_C05E<̈Mz\\\F:th{]vMnZIh#yC~|'HݼyGZرcճZ ɓ'(:K$M\xQLv$U[n߾;v-X@ٳg0Ҧ녨Ӱa׈\D> *...V7n|nj}"۷o߾G9t˗o߾FV={ct yeʗHߛgRJDG [[[U 3cmĶޯ ;#)u' +[lmllwΝzj5+Zn=w\5Ӡ 1򹹳4`]AEI&e "##>*jy+5/Wܜ9sJ|4юdLgd}`lmmL;%4Eȇz+$Vؐ$IL&#Ḉ;wR\^zo'Nbmm]n}v<(˗ŔwSNb\ oM77^z͙3+Vhڴ}XBW>UWהL8fQ$I>|>Nh)=|8B7?;M%Kw}˖-ݺu3u娇|a]vH+W~ɵthP Uϐ??_u…6lؠ#||ҭ\!~ ߛ}(::Z`~:X-^ބxw߿/=<=x"_qSLɖyx߂-Z 9q(Ӽy׮PuPP3d Ik֬٤IntttPP|ǏڑoNk^"oŹG1ϒI#vbccқ][l?x@oLmw%Kɓ'}Æ vZ]@=;wNښZ^ .ZT *O<ɴ|XX͗9u={fnZ>\$IuJ!"{FWx9of~=pb\8###00P/ZM6MMeuJtA=ٙUHoS… SA떀ܳgxN:@%TTDIL˯X"bkÆ U͐/fA5ݻ`e"2iZo|T7nf۾}n¢E|||Ķ{>z7+V;w45?C^mƍWRlΝ˵h֬^yUTK]uGFF={VX/I҇~s*.+ׯ_7_bΝ̴N)vRҒǏmE+GFFJdHɏ6s>cbb䏆K:+VZa:כl]vM@p޽{YfeZ$I+Wpц+5jÙZof´YfZJ۟BOvįw7l0YƐ@ TTڵk'-Νs1ze˖#F(p%i IDATO?%$$̞={ٲe *Ԯ]۰ @ 7TzСC״+WN>]a3%bCկ__tR2ӧObd'22O?VԩS _|!f!{ѣ gyֹsΰa.^(^ܹa[\dk׮:t۷ KM4~fرFUCnذO&L믿+%JӧaI777Mg̘dXڵ-6UXQPO"l:$)22o߾M6mܸ q \:UOHZPmn޼YvԬYxVVVQQQ.\/P{6>;|t׮]ѣGZ|||^x~yÄ |gF=z3tO222su+WYѼx.] ? 8p`(QZ5+++͍ 4޶l٢j;uٳG |ƍ3f|OPPP@@aŊ2eVnܹs{| 6lj_,/0ZgJƏ?ydq&O<ٹsUVRٹ@7o|\7nTN///++;w\zU^uʇX&M=6,UTݺux␐IZǗ/__-E @SuP$/ 4_ĵZ-[A԰aÚ5k67nܸq?Q'ONMMc3͙3Po}̙3-ݫWMh 4j(Uvډe =z$?z,,, ִiSS |rJttE~zJKKݥWڷorJy7yu0?Hܥ_$فh4/Vf~r =3ӧG|Vutttqq_g\*',\PLr;w&'';88,YiӦz >zݻw㭭ܚ4i&+'洤MY4dzTJJJhhUʕu] *Phcƌm;::w;vL0Amkk~5*U@/dՇ~(M:5W#G:uRc*y_-=z4{r]JJʹs~97U^bwժU .k֭Ϟ=m;99i&wA%3fL t*+!!aݺubA l޼yEZ8Э[+!--mݺuˁ#>>믿~nҲ[n$+0a|ر$I-Zhժ&;,{zzT0qw}wI̬4iܾ}~5mڴޚTrss߿oLɄ-[M4ֶN5\pkLD7*j:t>>''G$99?_`K@y8?>~x}n߾~+++$)##cݺu ,M a藭s=7eF#rҥsΙUj!ûu릜:uʄ _F߿LL||uÅccc/_keeմiS={y;w噙شkѱ.j(((r|lkk۱cG}ĔHڢEJdff޸qC>vpppssW[ffӧo߾ۨQ#{{m6i{Uoܸ&I'nݺeeei^hxTPԩr؎;<(w4kl7mt%yVE'MԦMڭQF_~e~~$I-ZXbE5rC}*-~eWTn߾e˖h9_w'Nlٲe߽{O?3s5kDEEUTT-[ݻW;wtuu}YxѠ#[\\[ 99yٲeoWn?{l J;vlڵ~[RRrܹo_-`aaѡC/J~\'N(҄@GÇ7nܨEEE3gݻ+*URR駟*/Ĵ$&&?>|hPA޽{qƍMMM裏RSSS333ww֭[[XXdgggdd_]paڵ3gԽELLի7 nnn͚5h4IIInݒZ޾K.XC.]"IRtttAE) Iq֭vy|[~xZhQQQ(72//oʕH&-**2P@+VSKӦMݻ[ZZ/ F *ꞮַׯWRK/*VVV{nرcC i߾V%aaaJy眝o׮]+*+** [dI-yf9$ +QQQ9$66VysZ&$$lܸQI)/B۶m׮]oS\\nݺ\WhSo[jU\\lii8|3gS)S(;߿nURRraTkݻw/\ ͟?_R$I277:ujϞ=Ӳ'Nhƍ򱓓ٳz=z3g2ʄZٹuWQQQZ#.][,66V}Go7mڤTҽ{ S$I!!!ivv{5''З^zϯ}̖$o޼y:Fo?<99Y>0`k4ynM4hr;\pJsuu޽|\QQL 999!$::Z>x7ndffjS޺4iGՕ+W-vvv/rlҤ/lmm-^pΝ;d/r#$I:uaƌԩSO=h`_  *TYzGvvַJV ЭVj /]:FR7nܺu JKKO81rHu1e֚JׯՍ%Ij׮oDD$IG2eJ%;t``}g*~~~С<Ae޽J\TݻO6f7Ruvww777?9vO<[I׮]vZi^֝5_~A/5ff^ܩ\UGP)**r(I-IRii={J^5Hq9In޼YRR+DN,,,rՂeދ2̬o߾ʔS7֚ƣK.򄖻w~---- b GT h4Z֭ې!C*]W-''>w\: W^z͛[j֥K__ߦMi ݺuJaaatt @%Iׯ?P\\\PPp)e2Au֎ꚓtMennnoo/# S&0(x8J޽u)Y[[ںӫ$)22￿~[bggp͛7:tHy#.5fݥk}~˟K.A%..N~5aii)jbggױcGy}ttT *FaC(o򢦴4++pҕRO#*[~]#""֬Yiرc6mZhaeeըQ#IJKKWZe++~ȑp­[ O:=rgy.jppph׮NFy=r)}vvv򱗗T~w%/^QFrc.QSO 2x<Aeff)EM0Aw,#+lٲ3<3deeY;v(--22R9]Jlƍ~кuڭAѧO9TTTȋ8;;W|do?ڶmۣG/tիW+kѢ: sssSy/*3<<<""fCQ *S~zjhhɓ'%IJOO߽{oo>yLw٫1c(:Ν;K=E+W|'iƍk}N]ůԴiӔ 0nz?|[VVh"卐| 4i$5N\\\hh _|ŷ~T{Gǣ2GgϞ>>>$ݼysfff@beeURR"K)++S:u/_vppppp(++TF?~ASszUivڵiF^L͛OҢE^z/'\rÆ rKsrrvvvnөScn۶M>sʕ+׬YcccSPP II7n\XXh7*$͚5Kk{ruJiڴ?]RR"++VTTddd$$$ܼy3##CC[ZZN8qȑxdҬY3 UqV̞=[XVV͛7o޼N)...sW &=ZcaaazzRlllՓа=*oT$IjҤIHH:5cƦw<󌃃kzzu{Cѣcbb222mܸرckoQ^pZ۽{|-xzz.]tΝǏWVS8;;;V=Ms^{KLu PCCCM݆͜93--M󊊊gzzzqI_qر#))ү¸$@ܠre^zKLr P *yyy-((\qo$@ܠn[.1%@=7;V߷Ç\q',//* w\q$IݺuLII(++h4SLYh 3455iӦ666\"%@y8 G<*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!N#S7@ʕ+Ml& oTGS\\l6Fp*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  TWRRRddիW߿o?sss;;;S7h4Ŧn}:tmK1Bј-@C#ЯR$I8|}L.$%%:tݻwM .DFF .Eѣn7>..N}:qĖ-[=jɛ7oVEIHH0aI7*I& R$Ih4=ĉj5.hjѢZT-*ႊGpsT W_}qΝ7nhǵkמ}YtѢEF2a{/#'---//յ5\~ŋ򱹹y- @CPPP$I&l FPi"""vsՌ"Immm]\\&MԼysS_lk׮|WeeeYYYYYYW\ٴiӢEƎ;wN:;- oN:կ_sVRteff_~˗/U"4@{_r^9wܗ_~.Z_ ͩSLM6CӧO׮]mllRSSoݺuوǏ*׭[giirzo;* JaaY)e˖!!!f*Խ{wyЋ/Ο??<<\vՁO=T4ЯeٲeA۶m~ݔk3gT>X`Aaaa]50ҠʱW_}յkW#]bE``rzZn`JÑ^+ ((Z5|'h۷Z 4ΝPN Pw޿4**vZTLi6mjPɀ""" o߾ݶm[/۾}Sn߾]PP`ccӼys//QFנ={9s֭[޾]v~~~F6ׯ+͛7򪤤?C>{fff={}_ҲeKӧOݻ?HOO/..uww2dHo'I҉'"""---|#FnѢ|f͚'OfffxzzN:sIII_򬭭۴iӫW1cƨOjAPڒ$ITK߾}˗/T,Ye˖~o1b…=zV{bccݻWke0vؐWWW$''+o~EUy~~I&Uy̙3<(Uy>3f8~|hѢ~O>kҥK=<<̙3cƌj(++>+-UVSN}뭷ʫ}G۶ms玾2={1cF6j}*jW:tH>?~<>XjURRRtkHLL\dɶm*mҜ9sƌڡCc1phuYΝ;WJ2l0cڹs5k*M)$/Æ ۽{-),,|e˖JF+44@m]tԩriLK$ٳ%%%gΜQN1rssdɒJSڵk/gdݻ~/ݻl2[,_@$ܹsAAAFڪVvJgee?SmO|wW=CPi8z~gϞ9Hfff[n:ujJJJ333MWYAAAW.((0K.7nH\|ȑ#~ѣGlݻӡCVyRSSnj]eɊ 6?ޘjlSO(jIII'N駟)_O6͘CvȑѣGWxnB=u*))2e?ld[N>Ϝ97pXXX({n֭՚dR]EEEFѣSqq;w?~5o<ÝÇ_vMU===KKKSRRbbbN:UZZٽ{ѣ_Ç7qNNΞ={׿hΝ;էw9|A \4n̘1 WKXXXqqrڮ]^zؤ=zTݻ=xol2u^x_lR>'''NPsss_.]^Wϯk׮͛7W*rR&11g=uꔾ^8OE=<==5kVRRlkk.7k,u[JOO/^ؘfP%J2wpWO8;f8ZytUVWz󩩩5ks5<>P4h+ys*?.YD_g֫穨^:::|W }o:nܸo@wQ)7"''端RN5j7z}J+jMTckƌU.~kUYshhAaz뭷"""Fի|||BBBpq7mڴb.zjەc;;{f&U2z RSSdrtUu:uJ9~'o1\駟V/To|w_՘Aܔ޹$InWRkVEem۶]~To՚^KFz:3ׯ_pp㪵m[h痔h۹}2@Ç;99ߒ޽{رcSto!IҀ.\ m6e'|Gq9s&--Mwӧ]K++_tPw=.]X@nݺ)SS ̙V6>mذ_~UVO.PGJ&}*WСֿdԻʘT !xQizzİ &ӂѣ'N70CRL5iD9HKK*payտXgggW:MYuVboF (kgnݺU_U9nٲȑ#ZU\\QiM} nݺ>^GJ&}*WS3@=>uֵ;cTǏnܸ~'VӧE4LֆO>duoѿիWu9;;+ꮤDIk;v;M0Ai}tUluJk!,ґ,,,돕{_bE&j%>ZGPyX[[?6l~ڵkG,,, ʱE[VwJL}*Ǻo~g%򁗗DKJJԗtԫW/1s9$I {ܩS6m4kReɒ%FaѢEC Qr̙9so~sݻwUC鞊z{+''G9h4j Aeaa1uԝ;wFDDW=]6$$lo/IRͶJtwwW*3 {gϞ_MWo"tO322*J{nWgiiY>iӦʩzJtbccg̘>mڴիW=zƍikǏ0;;ѣ˗/;vl6m&LW_U}HUkS67G]޽7mڴs\n`-k3bq)+sdc=6l0ѣG+ZCԫAkzǩk߸qzZaggf}RSSwcǎ/ zTOE=EPA$IAAAPoWTTT[3EDB#xdd^vÆ SJUv xP/Yr@QXX8nܸO?@+{{;gUj0矏Ǝa__ߏ>T> OE!ޠ W۶m{H#ff4WaA/ (#v?w(;Z.&tRo޼Lc}zcrO&k^ݻw?qww?Ç.]ypI&լ=&LزeKbbbDDDHHȐ!Ct׋^p]E&y*[+Pw*^^^'OVN_owR VG+VXU=ҥK򱲏q㴮RwRwڥܮ];%LP=Yfew)5;wnLLŋO[pݻ޽cǎ)S۫ lܸq…&$OE}>բG=zCPi .\S%)7nܨE[xiiillluk9::+׮];X%~l7nU/Wz$y|];}zzŊ+e/^Tk[7roŋZ .[,>>5SQ}p@_?W\Y=ZJW`T-ҚpС֠-4PX#ܭ駟]t/QvÈ;+imҭ[7yyym{5whYe\\\6nk)}W&z~썧^X @hj]zݻ>~ ^%=6l͛7hץ>FEEIe,--'L`~ɓwޕ?_R6ϑYYY;U5jT=L?X LRm?cǎqJJ:zP?* DϞ=էvY=9Rn5gϞUN~ܸq0۷oKl׳gJKI4aeǏ_xQO>vvv7Z/ @$[w2B2ƼaV1݈ݻ,%%~ROE=?>|tΝF^Xk0@1B==<<5G=ZM֟~i帰p_']L2py;;;e={(@}W(߄d+Q_n1%WZN5-Z]g#LKK۲eK<<?IDAT JrttT۷o1kF?^9uvvjuSQϏ[[&&&~U^W_im| @TÆ 3眜`}^yZnbU,,,*sYbBCC?l޼ynܸqJ]Ih;w޽Ə/_UXX ԩS.]i%%%?^;ӧj5jpqqQϰ߱c•>ϟ ]Z A))))? T. VjSQϏ̙~tR!o7o pDwÍ0`Ϟ='M4ywU裏tǀ>|xڴi 493}t7>׮]”OgΜYoj1SQ\]]+N)..>}54믿+PGj1SQlll֯_?b۳̽{VZlѢEK.̬& jGFF9̬z}ܾ;v0Ț7ocǎ-ZSeٲe|MuV5jTӦMӁsՐ!C+fff۶m3fzh_ k֬N??QkJi4_uȐ!mڴQ>Wëz֭g϶~ӊ+ jꩨǾZtrcgOfϞݸqkAPi:ucǎSN{xx(loo?tUV͘1Y֭[+>Ƴ۷rjOΫkk֭[^zUWwiL?~ҷC7o޼w^y6 G;v_n׮2k׮Ͽp႑ӢZizx쫫CoZh1~ʯt4ŦnßӥKVr=+//?zرج++f͚mkuB=zĉnh4 ݻVW $'|r߾}W]aff֬Y3ѣGWƗ8pر+++GGΝ;{ϟJHHϷvppܹs;w,Zߵkי3g5kֲe=z1BݺukʕO*x* pCC%IYZsۛ=@C%ܪ_۷?{rzΝe˖=U2f.2jʠAV i4ShhNNNAAAn "n$I~S:ِ!C@uT<==?~,q&lڴۀm)Td=M &  CG۶m+wմgq_CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  TѥKLިm? T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8ie6Fp47uOx@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!N#S7 Vrr Ο?r…Jx{{;99x{{;;;s !,M4([lLIIօNNN&L Zs…u{yb>/xkuСÂ~QӦM6mZUaTPsK.MHHӻo#pBHHH^^^=gʣ}TP{7'Ho۷~n#۷tҥK* … &I)KbARK_VBBBk6;w.66V>޽{=jPٳg/_,k. {ؤI,,,$IJJJ W>wrr:thukS\$///y.޽{ݻMغuڭR/R:t%I9-۷_zuT1T@Zp9rֶ,X/njaÆ*Ucwܑ[XRR#nmm{={_Unnnܸ!6mt;v$)((T-6m>|x֩()EVYU6~5xBCG AsBѱGFYA#:dn!DIv]ƈ,ms0fF$ǘ9󂘹ɥIq\~ޯG{muomm/_ޑ?={tt.gI}J-TYE2L0\n]`YjO]BB|TjUtS-3AJKR~Jmm픡X,ܜdl6˗oW2NO&s}-x<-[ܽzzz˄cN_$sţnwnHns r|B7(ED*̀ɲ(J@@`5k֨Lm7WaE"m*vuu矷8Ϸň:,vJAL`k.YD=Neŋ_QQKggMϴuݺu&thW04DP&tRKKVXccO>Ι3g\(J<ʕ+W۷Ϥ(XUƘy*${q\jYv`dR{"6 7*v4@ѿNθcA$.\0HTUh:.gK.moo.Hhɓ'r֭ g븚AYE&! 0}Y+0ciѣGտȟqz~ٲeHĚ W.#Mr`H$t:;pw߭ONNAGdEEE8E1U{Vak!|rdd$ 񩧞ڴi,F# 444l߾]+># )ݻs7>rիWcÑnۨ0KE/Bd2`n…,.rA5֮]֖/힘r> -]4ufT*5^*>od` u9?+貸(Xc޼y޽{[nw>ȓUWʎ;, c Xv777key Z3gk566ɝ@`X,b Xe9*#N8qEqѣGK|n{d2YF[WCw`%vkhhTWeRz뭏?gR n,xmۦe1a0ɴ_rŒ#IA+RkV!4f'OZ裏VTT}8/8#YAMB`E+ }eY\rqcǎ;w΢ zj}ˈ&a- ٺuV{P(?ǕHn'ŋ'^kPOUFf E<  >}z``@+7oxl6۲eݫe9YП1jjjt2"8p*@XeeZ6699֦ftuuitΝuuuZo|7fhz]1h/ڃP*@ Μ9SKNVB%K^L&vz<11K/ڟnBƂ.A4BoI$˗/W3^K;l7|S+ׯ_})HsN%J)NԄCPbgϞ駟 QQEQ_pW_Jё:7o>uАZ 455ђh~盘>/JiYE`H$R:_@\xܪ0?>>WVVFQ5)bszfs\h4ϋլFb٢([x 7nٲϵgx<|{j寿 tR$@8lO @8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8! Q4IENDB`davmail-6.3.0/src/site/resources/images/android/androidemailaccount5.png0100644 0000000 0000000 00000356534 13410710541 025132 0ustar000000000 0000000 PNG  IHDR8p]sBITO IDATxw|[K{I١@)-SF@)-Kn))-ЖJ(eJ2 #g9qx)ڿ?(Ze[?s.I=גY]FP 9CP 9CP 9Lt@ժ4FRUJJ)P+:Bau.b8V{6hw$ ӋZ!534FoNu*jFmZ=0]TdB%ݘOVsn'bm4X<1,%.B^bJC]*LqJ(PU*buNLdt쌔='NtbVw%R.Oi"8`&A)K&DiJ̴d]ITL|w`ʷTf%T 0AAEP$iT:Ƅ9l.W\I!SjT}=d3۝}6:7U*4 ALRuo9)E&P^xSJKLT -[ezGt[mUm]lj{v4wxl&$)ӑNX]Y[7W9H)bT"OVY05=7 xvkݕ+WMF&O`*iUu 9dh+2*^ WALJ3hsvt~xmkSNopQvz>*¶L"iȤQ/ͨ.^NjiDvv* $];l]I^ "(k d !ޯk~ZZאӵ}FjrEw@{ϤnN!L7+3/._W);pl}BEQXd2;uQ׎|XC`쮥/)/>>[[bxL=XTdB4]mvG$kTh÷:>LJDpW힝t{vtܱr%Ժu%y5~nQ(zlJl_[~R &s (oDI3R#}fSY9t5f÷bRVg}l7` Ql2+Li~^g'A9?0rmZBϖܹ0@1XW*?]>~Жdi2b#L]X(;]%Z馇_fҨ7:nxjf3U#*w.TbX[soqݿuc`P)]5h7pmavN;4.qCZvv]n!Z!_S}}f|CBGt⊂$[^t?mjxcXھӄR.a vwݟ4WΥs3vXEnc='J)WU|yNi.Pv^|eٹ깙s3SٺL mM6lyV *%e<_n;R=HyjҪ,!R.lFg#S+w-~eTbcvFm+S)eor*|څ[֟}\jgk9b6-{:YM'vVh io.r=2ZF??+ͷv65ޱ[=?MW~xO5AJ3 tt|pu㉦ɻ0ۨ>+rwk֦tT*bUnY8{'5#"@~Rʉށk<5{[k^nwՖmyy{Hc=[ !vt8qC[4`TJlo{6՚'.Z|aVQPP1i?=wIĎ='mkɔ ֦3dKjF؞4`^f峊Nc(x)/.=|]gtWUo"oƭ[֧ U=lViViMAk{^?z#'}:]g׭f]QQ7 I)zg-&z <0c{慨qS[O\YQRl5[:}qE^db$|4f~첞 * =n{j^:T;'j\m+BΞ}{Tp .oBȄ,ר%9)B|ؾ%MCJ7p9ڑE>7:ͯ>;:_{wލvNغeᬙi֡?c)ZuC⁠2^k s Zvvyh1Q\6{MAh'woNiõny<{ kl_1q+a;M""]\iЖ w7I4C7ޓ006j"tw oiFj̴+*C_u?)E){]֡=[%_\S*YBvd(٥B>v3ʥg$ ;/,κj 7L%~[>'^G=:7 J~s<`-JS[o2J4\OhEyT2YE CNgO5ٞyhs}@c=z>xVawVM9_wߛvN"H R{k d FtuZm[7h.jc{l[+]ū7w:\ K#}TUUJMx(MI:(rv$̘k n!ڹe>#aT4 EAWO&Č(?ózM*tGxCؕv/L6=G;4t7yzl=e"֜Ac Zb󳮪,ybGu]JR%9[B-;*,;;KpJkn}]`]b\6۷+ǽ8%l ?teJitwDQVsV/Xɚ3 16zXb#Т*̾mq^~\╤Vݽ|z:ku:uKdo wD%xUnd~VjN{ 5VKas~eo9$kN-dU*\kOW"/ΥEFZs|9Vg?ގT"KϟqzrcqNoI>\O쨖B'e Jr^>dҪ4o-/Mk %R﷝i0T#yR7X7:](LM@wLlB]6;,3ҒR.[!*e}tg秡w8nKr҃y)%ѥ8C!?U1xpp[Zb9v87^8~sQ񏗮g,N?(+5W0*]X~j!>ZϺ,3nD:}y%,4-K==h4+KՍXie(L6u~qn&*I11̼޶{?K}=m !fs3~pTR ? n0 !4 EQ1+J6٥Bc=8xd!-f!DE zUUWZt>ɾ=ayLo.||CMn',eWFHJ>Ro]47FbE"(6g%LKQ([˅ngS]$LuqkuHqu[mBt{ݤUO!+L)6 EiJO}wq֝K+*~r!!gzSʛn~o?|I1;# ,bN;[:[P).!*xz$G$~֯1N(ۚ:XQc !d|aV+dB\YY|Cxݳr^A^8`ƭaO(s3 枚li%L[}޸ŕn;mV %FF&͔"C &V^Qڿx uQYL!ĿO4y\o/۝dTyP_(K'[PZ򍈖_69F#hq8xphnk|VB&d_Sz pӂJ<($UƵ>۰-s3SSjlfmцA|ǷeQvДivGt'zlJB4iL0RA'pyy<IRBNIif%0ZSUw,+ν}Iojk_:T"utc)Ձjqz"tDuvے˄L$~poT{sl|V&Ģ촻}hZ͖k3 0ݔ&efE}@RN)B}ڂe|*M4`[`<mqE^'XRȅvWpr !Pwݟ"Eey'KRAҩ l.f{* *v{R8GpV~qUFB0;k |*NSUG`RKrCWVѩs3>ilwy?dG)՚;B|s˽_]0smat~d .bq8sE)?P[Jr^fjQ'8?8W<-d7mugσ*~݇#EUr:~mom[`Jh ٘%鿳rriO;Ǜ$0,Jwݭ޹GX/[<7SR޿vfni5+3ezw{l0c}u37傒\\~Y sd_{o.]KAs^moZ{3A%t%p0\~Iy gR.c;wIo;˗@ŽM)?g/Z)ɖdxx՚^o==dM׶\XWbJyKQD)ųNlX![bK5LhPIieߘyqR+WW~uSNM6Ѵ Tfq8i畕%Y,Gxz~xRdoϐs3 }ifw46|ob?i؏ Kr)r^?zRsM *Krmh7;tX^DSe^DoMA'utShҨc=G}ld}-Lժ{ۛ;$2}4ݱ<ߏ5]}JmXwEi??wҰsrnkK& *2!KZ򱕗/MIzw.V+̀^wo: 윢.' rXϱΠaKT\=ˊ"33|p?S8۠[MT2EˀՑq4 ˤ0JfATBLe6#J)%o|Ӏe,UI)b6ԯ)=dD(T67VT_<d۠R"+oq8Kw-f~gżDSGݜsގa:,C_sKEp֞^&Jc(z}DU#z ;#2˽jMtY ~0 41IELzg5 ! ! ! ! QҊDТ@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@roP$e.0.@b[wHla-*)v@]Jh2$CЮ`Xfשz{M2\ɢ}ZkwN|&4+˕ro51'Hϯ"(pz<;vޓ.c4p)e_R"439&-f~HzSB)}kV']lIl2F2NWm,7%!%0_J qAiiѢBJ%zEϟJH07'_.<wt[ڛL chv;hː+x *4opTg>@9FP.[-umn+q)7Ń )%&>7L/ tF+3 ?t S75B0FS9Rb|:t -e?=4E֐_{kO} @ LX(` /ojRJf&o=sMCe RJ },S8!һJ3'\RJl}1p7z4v_7A0;]1|eiڤRX\v耵'/֫ijB&#C:+֫R as[' )"Z[ZmO|L'9N3ۑQWy:/; ަTP!yYs:uzKͩSruUy&}PߨTniɲw 8xLY'E&dzc`K>ˤRN֝<(d1uJA'Ic$^j/uwե/槾#%%3w@;m w9$LRF;8'{V ⟍߭@,Ixh~ͥ*ْT# -}f^i ~_,,jI5It<|9J2~um]T'Mqz-V3ߚ"-UvǮ0怸 Ey~r We$$*å!Ă}K&$le)6[ *֝fGT.M"?>nې-Gw6UyNRnKR wgxptW~z)oc͒˳6q㴻|#ak;Q)ʯM&U 'L}׮fַ꽃o5EQo-zXl~c1:0k9\W||?dl91h{6KS ӍvH:F%BJ}!NkNcɅ٦~"$mgpA«擣A=Ю. 3:9'0k;@>J;Ȼr5W_0|>Yޔ5Dwxj2N!4cC&L.Z?fKR~jcp)ū&5R0) )%O-1h Wk}r /Jѯ Z([AˉJO LGq=I*Bh߷aē !ps-2d$ =s{'̶=#frs%MO{o1'ZLV#@Ĕ⵾/pP^3DAq`QGCuetw%-Jb7G]LO-- +'jif:Xy:>\&n+ϊx{Î$+91xW{Ɔ݊f%i 8Nub13(G1=RC[-GF7 6)ǨxGQ%S߈8KsS|?.LG{uC-Qr8a5[y /l`uGm}sMgFW/Mhm՟9ҐAlvJJ.K fMygu"ҍí8ub1;:h=3]c 7vEY@Lʠ"*qsSIΥy.RZP"JAz"MN*_mw ]Y~2`AEUbLˠ\~_^G}0Ґz:~q=y\Bwti !RTk@M(7 $hQʶYE!bQ{MQc]gaYgl*Ԑ*1>0(gW`7/Ca'2P Q OGt<&ћ2UMItѢ.[޷!X)oh4ftר! 7^śUs/K5h~4=jkeo sדSsMP%Qldߔ3*7'd/ڨyp  t(v3^M 58V11.ژm.Ue0HZjP&kef޽'TRZƫʲԱbs ;fq=y5x%0"=x]Q/pPM),Ito~5z{YҠt쵁 ` ViW/eu{F$6X.ƍS\Omw)^oQJp`J/[}7eT|]@fn&lrbbk{qe~K(e˳-0阂AEUF39iс#L"4J}?&7dHknp-!h-Ʌz-e#456F{OBGf($|M̛2Ne%r!Iqbӣ?3//-O3F8SCG<)?47,7p(:h삡WyvոK S?yA:Ɏn#\Jį&>Û7e<,.6sbL6s2w~fZ#bKHΔ *$Sw n\w_ԽWк+:kQ>KeԠ˄_u@2^T<+ʓ ![4hCSU#gF= ;vcr& {SD?+G0;`heua%p<\&BTY% 7d^T8^\&n l=Н3tQհ[߅wk߄|ݶ-d¾P+Ҍ_- hjZ@KXbȎ]ܬZ&&M rIXy?!_-{/rThԏ7vQnAVU:]Qwk֘rx6ZQ=L;Rm+jSOh/'m/( U*TAy@~}~YK[)*O-/mg*8*ШjFHTr{_FXdp^ ajIwߜ*5h v|`,AEU7ߤ_8"q&fs)zu!KI !~suw`/ MO.+ jš >}NQ+[Yv}q阅d&~vEy`~#5-'(!1#+?ŵE[ 6p̤sbޔPҍoSQ9"ߘav F>h֧QĬRfмffP׿-H,Da"[l_-U]cGcwn&s2!˲;|kOҸ=bW˅r|rdө/||I %>}eN.1pY^j__,Rqy~ F.?a!J.47Gs60րuͧ_wblnJLT)}./eQ^)9LVWtcI ־y(\B|"W7^Q;/+A=j~U2~N86;G:+#Ԩ=6aQ&M b^:W3ʌ!jQ$7d¢˳Um\=v絟iDZ] MkƸ{YuSgYVnO,J 5Y赻:NUJ"KJJ Yuv}2LK2B,B,ė'}nQm!GU㟺 !{C֘B|,%pnOݩR Eqit\O EY:x;OZ wr}Fbwinkg=C!r3_X7~P]Sƞ6}O}i'#tB ܽJ&OU+v?6+E{hAw=BO4-3RyͰp :]J,E 1r_鱷hQ]|?k}LWv&6(xT, ?{O]%rYVQ A"'k˄HU+35uGL)BZzY&f׉3 M=ۻG{;hBUkM)8MJSŃ#3ZJSgiUaSʠuTDrc[6d8xHhy3h(CtdOOkJ ]ɱGe\Orަg:#־s7z5yվMοq&ݻ[C9xDa :]߭5%/Z9.|C#IּcUmJ֪. C2F}ȱ9p19ɺ mX;v~90\UU{le 8yyn~gMZzeՌv0. xvoY,a[nw c"V.7ŧ}-Gaƹ4tyoFՖ3U/Z@ҍ;zl~'ϡg5$ϻL)RS]Rթr#zCjVד䲋rR $B1tXU^!G|^je6M)gYklDmimF9BZ8C=:9pbDnV~>/"IQ&NhY;wR_Dkҝ\ndhTZgcw僎4e1 c0~8 ! ! ! ! Q&09|u LjO`a*w[]~ ! ! ! ! ! ! ~ƨ IDAT! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !nOt -*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r*$@r.⮽}Æ yyy]vYb$K/}|m%0 2J8p`hhhΜ9z>%ݼyٳ *"|n}LP@T}٭[FA.k4^S^^zj4aŋ۶m"'''?t `pne˖ż<St࠯FdǏ߲e/jժkh4ƻll߾O?K[$L+wlf"`*nP-ŲiӦ;s̙ ,R.ZN`ab>뮻T*Ub5zLg#,\pƌfs[[۱c[Z[[{///obxFRRҥ^o\s}ى*ITUU577{vmIdNXEEEq-LM*%%%W]up|W7n轓3w}X`^{W_=44b;S_=hzLrݻw'T*005Lu%̛7oL-IgrtҚ5k}|ĉ;wuum۶bt:4w#GSSSKKK۶mB,^xڵ<@iɒ%KӳcǎAR\XXbŊQ-bZ?ӓ'Oi4 ̞=;39pn>v8Oۙ3gFuYkkkUUUcclhYYY;0L|!}\PP=g ++fe˖G*jkkjZjurrrEEŢE;h``ѣǾrvuȑ>m2 ׬Yhonn޾}{wwZNOO={vWVWW j44s%K(GER6JEEln_|qo!믿q嗯[.Gyx~SO=m6h|Ao]Õ_ */˲e˾/gdd w/;X,ZqqSOnG}zuEP__ /8p7œJ?5\ ^555dxT?^x-RUU/_㧟~zhh(oݻ>|뭷Zʷz$+oǎv롡 6+I۷~U<7nta+8pNMM$jػwo >gyG71[_ax/˱cf`jRAXӅu'|w_ӕL&ZWWk[ne'^266mZ~P(JKK=O{{{}}lo~swW=)EPL&188t:k ~EEEI B/r^Wӟ{juiiiJJL&kii9y),9sx۱cm۶ T{x>|x˖-JIIj---摭[.\s =gٸqGG199n744yWCVM[z/R1L.Yɍ7&%%kޯVCCC---l6ϟ~a_;\./++WTǎ}CO~~ TP񯲇ބnnn^~z|++6lV,^xJ*f0VX1LrǏ|ٳgtM=~:!ngJJJrrrγy;w~\x_[@fp#{|QO~6uEŋp gz駽l6?~g㢪DDAQPEWB534ifiݛifY}vݲ,,WҴ}_\D@QYE6|a`z93|sqٺwAn(ID_Fٳs䏨Ws=+zj}СAԩSѯ_ѣG+:thƍrεkBCCnjS7b~޽{^Cё#G~g[l$VZ}1b|Ν?bָq)S(snܸq'BBB O4ZYȑ#[M6_{9sN1bȑ#raa={ |\Æ ϟ?eʔnݺhgM6aKڵ{O$jo޼|x=;vnݺ͝;Wicc3twyDŽ 3}'&4l9oR7n܈vUѓDDDK{=M>>>3goܸQ|ܶmD˳>;i$Q߾}gΜ)˗6%I***5lJ 1c>'N9S#R$I1bD߾}+ſ;we?)E$ qƉ񅅅O.@UCJNN_-&Z[[lJ}M1W^[ϰa +W uXXXL:|xGGG_rE.;::N:U*FSN/]<ٳgggn/G;Teح[#~V~]TTtuVrNZbii9ydwY-Dj-,,ᅰ|X.%▅NUjٲR\Æ B:d)P޽KA IxMg[Æ '~]ܾ}Nsss]ܫY驧;GRW*{9p@Z΋ڵ0a΋Q$K<ɳ)؛B 'C~ 9g˰͛[XXș322ĉz]E_<3..N"H UbDaa_\۶mmmmb:Lcmm]|BN%3}֠A@yBV]jՁtb;GgΜQgϊ~!Sm#@LWr"Gq666ƍ˘k`*9WrrիW߿' 'G*i4WWW??q>,1L(''g…F\Nv]b1cXXXԩSGnH'Ѷ:uޫJ5y䔔_(66666vͮ^^^m۶ҥȏʷ`0kkTX8˪^z;w2]v]pL <#tԩ|Zj֮]qI;AEPdXJfffʏeE6Sݗ1,XyÇ~6y3glܸg)i677-[H|_WjjXR&O9 jFQ'O&Q*^]9e:PaDS!)nD9R"fLTe$2СC.]yrDP^^ٳgÇ RҚZ:u$IaaarP9uꔨcǎej8c?=Q;fQ~}KKKIZիTRAM~jh54FSNloooee%?{^ eԨQF̌}=zcVw޽{mĸ/;;=zIR~QjéGzzƍ唢h /J`oo/T탎hIzzz?|P4nݺʹ(rA9 ={|W>_r={Nuptt _999b2___12ʹY]WѣD=^~ʙT*$ʅ VOl(m䈈BtVl)X%Lu_3|UZ'ٵkWQ 3^tb&j^H}qI=Z6+(æTeM~~~JJJJJJll8ƕYXXd1A]vf]gϞ|{9uTŗuuu?rܹiӦ$+3ˀgyҥKr/ą /^ /"IRtt.q^]vnnnZ^=cqc~r4:vXff / F'޽{bagy3SRRͰF)V o566vÆ OMM=s̑#G|#*OPP8qw}'? fdd[nuqqJOO4͈#̑R$I_)SV\){-_~LMMUPꫯѲuÆ _˗Y!777''G~.//"q}bLdd3j׮3a„`ߗZ7n_ӣ\\XXtqG޽[yejOx{{?opҥ:uhڤ$eXHHСCY'OTB6dȐ *:tp|VZ@bccSPP :NT'e藬{gVe{֭7nܿ_[[ۗ^zikIz W233O73gXH^xaС=RSSEJqpp1cF7AVΑ(((HOO;Te@Ǐ/Vg.**JKK~z|||ZZH)/!C ֻwo ,|4hФI"EEE߿~zBBb:iҤiR>}?Ǐ+SӬYD,((|r6T'GEdɒ~-,,,99Y]g}V,k>>>>?o:uxKz1l0pƌӦMxem_|E777S"={UJ]wX2}0`۷GFFkgg?l0c&7m3>>^no[UV}ݶmۥK)N$++m>\9Ƴo~a!:u4j(gggOOO1zŋ *I;.....Z׷JF?gff>~ɩEX)>>666...۷7yyyM4i۶$eXtt{222 =<<ڴic| *((1c 4~x6H.]w^VVVZ4h'N~2ܸq#;;ֶaÆI:z pС5kHh-ZoUɚ8}\hҤ )@=*xrEEEY7fZ CP*11q͚5B=q~Ivڵ{EFFGJԧO" <==GU%@I'ٳ+!&L}f͚Y%``2ŋǎ~)EǣG;~CUNڃӧM`%)))s9zZT=+!!ԪUs]ti߾cRR˗?~BO#U?<99Y6mtѢE;wV7z_ݻwSSSWZgUjz~;wI&?NJQܹU+{3o+zƍPZj}/iժK/H] IDAT$fl"PoPt(w1((Șƍgoo//ӷ 4DGG&$R$Irtto6qJ'G` 6 ʜӢE ;;R)stt4fͱׯCwwwggR:wɓ'=<<:tЧOKMTgCFӺukj9ڵk;;;o߾G...h$*JJZZkmmmEѣGn۷_|Eq`aI^~唔IWG}$lb8׮]+]]]_x3fSa;wn^^xgOrcǎs666{0aBLNYnn_~dKh&NX *բEI nnn_vn2 3rJ$^rYQ-̻wΘ1czV5jTDDDmjKuܹy)SJ~JJ)6m1bo7+|צjݴiӔ3*I)ɤ]vڵ|NjrX9tA,Ç+իWwf͚n:dTm޽;k֬W:tW_靚roF j׮ݱcGOOgdd\v/K&ML2܍,I6m{P׬m„ N5-lڴI(77W#G*W^}Ǐw6jԨK=*}{G}L_o3L9s̛7oW|||-[իWgyfΜ9'.[lÆ bk:_n}}vXXkMf 5J稔w-}}} do 夑 .8yrC ׯ/IRaa/^e???;w|ps PԜrԩ~Mk矯xciii%M;IOOnnnbŋ^r h_#GdǏo۶{{{9R?>11r5?ܿ8tuu]|.ɢزeR?%$$DJ+qڴi֦K.%xԐh"V+ZYY͚5$5mC:uJi+6o\ÃDҴiSoo믢/q傂ôT˗/Wv8;;W[6|(:F͛WtJդIqƙp{f6jy)W0aBPP*W.Ut PV(aSAUWrߒ=z4\2(焘ڒlذavڟ1 5nXZ Jc,*''ɓ'+&O>D|VgϞmw."`:ގZΟ?_XqسgܸqCsJҦMQ~z%T[/SM>Wj@޽7|sN[[9~vUKK)Si @uT'qdggg'瓜cǎ~ᴴ4,ԩSBB$IwܹxNÇP1>}\,FBuvs7Sz?~? [YY-X5i&0''?~!Cwi4 &,]T%NY=Yfk@Gr;x_~)V|r]&~~~̙3:AEb[Wڵs?EEEofگdjKII׿#^6lذa)NddXĉ'N/}||ڵkR\s:u_~Uӭ[7 ZC.^8|W_}uȐ!,~,.]yWd77.]}AtvשD\hIf^?S3ʕ+E?r+W1bȐ! ,P|'#[ݛIZu * sQsϽkf8ЬW*;%>:{^[9.(11Ql _Ē$egg$zZ1rrr>6~;w=BCCOOemnzĈeuĉjU ̧ZJOO5kVRRxgϞ>m۶M4+,,y1'N2%4/hڷ~ի__/ܟۡC_%v: ˓DPQ3J(7nx׮]& U[~W_?~k׮N:A$ѣG=Z՞8q",,,"""66VgիW_{ŋWΉ#GLNNVKь?^2ߘy)oڴ_m2H؇$%%ES^+˗9:0Jue 2Sz͛7wƈEEE_~eXZZ_=p®]*{x̄vZeV9ur"Sejܸ ğ^} B *_dneeUf_xQ^xQ>۱Ӳe-ZeyzqN)i)wk3U[*;;?X9w|˖-{1G(W~*_w8::N6@g d#\xq=5ٳ~JnF>}o>sXFH#w޽r۷Zj0ЦMQ>zrӘ0S5k8,,,O:=NAeܽ{m+8qbIE5*)h_~ &T~K|||4i"322bcc[!!!%]rmZhiWZͮj1vX=B}6SdVVVimK{ˇ?wQ{P)eСC̙SU gddM4ib`=zJ^CXǍ9R/r9cڙ5҂ 6m*/u6k֬vP^TWnSZ[[꫎ݻwꩧ1ՈJ-S/^\MK{rYgCD&tRICdر=gΜp×\reҤI}̙3KZYLy…ueiibcccW\i愄e˖C'';--]v[j7m߻wO8x`hFPWիW?1IU]vUk\A&MR8t1 K]񩧞*@HHH --MKNNٳgEo^.../&T_ G)+wѣ1WuM-,, ?p@ڻھ+~sWk$77+c7|3iժU#F0~:|T[,Zemm]^(A0вeK~ҥKWXѵkW}8?mzRzW3n8q`nѢEk׮:tdkkoذe˖j!zcǎݸq#--MZ[[;99S iڋ/^|9)));;ѣGkӦMΝM5 P~P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P˗/WuGh=zTmCP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:CP:U;vˍ7:thնT-[dddS#jjTnݺmiiԼysn#GeipXXXRR\&I*gϞ=z7233[ZZ6i$000$$ɩT֭[]Vw{n<';;[uFSTT|%33sݺu je˖bmmݹs;jժ~999nݺ|S޽+sȑڵk3Z T6lC\~7|E]{{֭[nzׯ?pٱc֭[WAJQIKKfԩʔdaa1iҤ@p׮]JҠjrӦM۵kg^xA娨|9tWzz(z~f\\\߿/IR~~~LLBBBjj|SI}2\ѠAI>|+ؠAoooߴiN:կ_ȻHJJ͵SN֭Zj9884m_Jna3g$&&999ZӧO߼y333ǧ 333_.J:3>>>--M.7k֬^zF ,@ ҠRv2_ }QwYvq){oBCCw!ÇwA'X9rܹsCcǎmܸ|۷HU7 PGE#F(Cݻr9slݺΝ;FVҵkW䗜U1˫I&%{L9s|xƍ?۶mS>}I&)3$I}9s|xA㟤T [ʔ"IR@@omgg'Zgڴi^ݻ̙3uƘ1bȑrpϞ=:5p+IRnΝ+R$I666C}wtJTfj0 7|sܹ}s?cLLLrXXXt~/KKɓ'+z-Z% o'OLJJ͚55jw.Jj[nѪU+<==QEEEbI+s_͛7<* IDATW^yEoÆ K\rE\gϊggI&魡u?޷*MofSoP$~ٓ&MҙI_TTt֭={,Zwٵk)ʡ\zG9z*-[m۶w8233o)P޽KA Qy3D/$IbI?5kf:z߫W/K!wQ.*ϟnݺXګe˖%U9*~5J(ǏY(11qƍ{>|xHHH}||o߾-wx7..ݻrf#ʹڊΘ(1J(2d\4pR-,,'Nf뫼q_زF$KI\->>^oݺ%ʝ:u2PCl Hdcc3dȐ!C\v-,,,""ʍ>~ᇨW_}F;AE3g(Ϟ=+ 4Ik +((`իdBqƕ4h(jWZu.]LVѫZXZĸ&{{\壼,)IiYze˖[n?~wx̙3sѹ*88?"""o4e]RZV.d"&O"wn޼˫m۶]t))TN K%ƭ,\ [Ljr:uQ ,@ͦ9*4id̘1_}Ք)S3X.\&$$''I)b,΄Qn*c* ,4h#Ϝ9vٳg֙C_-,UI;J|NB^^ٳg?-[TU SpҔ|FjR?,@W͆~8uyC^,IR޽CCC/1ήGhrG#\\\F5jԨȘ1ѣG;vjʽ+%Q6iӦ~iYkO1FoScP ;x\nѢѣKI&bM7oGGǶm^pAf͚]zU~WhZ666<0GԳgOyMttmۢ,9P6Cgb988a`b8B&///._lUʉzPڵ(WtRB,j*}||CV{ UBhX1L5j$uv,eQ2,@ͦƠ-߼yGgʭzw]. oRAbwŢǏ8͛ckժUT}GKRi-4rÇQrk3gΔ%ЛSz lj *7ZvÆ ^"ĐzbJv:FgϞ"w;vLDC|#RRRRRRbcc)ܯY[h=zf}Z')=z@5_QbbXqAGVVXA*~5$ICqgΜYfoVXժU6W"}|}}EpJJJvҥeGGG7uiݺ\(,,4Zg$Wf 'ƧXlٲ%K(xxyy}WX!J8v영8::BYYYw.~NNN7|#,,@ͦҠҭ[޽{Ckbb7Ο?ݻ+#G,vl^^=f2vXEɱcGINNζm۾kK3 :[j5nܸӾ\\XXtݤhF\-4ĉ;222~ǭ[XYYeeeˋP{ TкuaÆabb׬Y+&7f'O{0=ziӦ۷׮]ѣGbE|7 P7H4}VZm߾]9Q>;;;;;...cƌ)uW޽O񄪜bnV6lUQQ߿(,,hӦrկ*o>666...۷/Ξ)))?SoZY:8tК5k$Ih4-Rng@%T>}Z.4i҄ӓT2 (5k+A߿[@?UA׮] ͽw^dd޾O>5<$$$OOQFUI{ %={MU7@jxsF5M :u4lذ(=qP'n#P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !P !5VjjjU7,>|h^z%___TuVhhhdddHH?Uvr!88xРA\֮]weff͝;&TߟbBBB*UNٳg $Ijٲekrʮ]}k|7))? rrrvڃ jCݿTu… rJ_|GU$"o߾gϞǏr`ՠAFiܸqU5|lw߉Í7Ta{iUҸq r_fƠTNڱcrHLj'.DGGe[[2,ݝ _rÇ_~=33ѣG 4hݺu~|OHHʒu˹[ltRff}- ~Uq7x],cnP/''_IBBaÆbcc=z$4h&&&ٳ͛999666...-Z6G9wܩS>|XTTTvmggvȆĈTիW]...ʕ񲳳8q|{{{''mk䲽}͍Ν;iiiOok%IRwu6U^k@#-.,,,<<<...++Kԩ]:xhc:=SW^|M+=ztdd\]C78x\UVhhg#GY&<<666={={vN4̙3ryK.$oٴivƍ;wnppX Yfw'IĉϞ=+-,,vae[7_W9}]qm6,/Vȝ4io-Iׯ_!"ENNڭ[7֭[m۶8eeeէOɓ'ڰ`c/{_ѣϟ/IRrrۧD믷jp.bs۶mnZj%I7oގ;aTT(O2ԩST";vKTHOOoۗT9#F0R_~5F3qIJ. jUu*[~DÇ;wNR,Xo\xQ$I3f̺um$dee͜9sٲez7e FV<)ń߀Fi֬YյE$ѣG?gϞ}E)E3gL6mʕ+W K,))HTPPo߾'-IҁF7HTXX')39#ݻwGi!**jѢE'N4.;;iӦۛR 80'. >V:t O}=-==W^ -9UK,;IQPP0gm dz樸vӍ!}?;{ +!`TQTX.Tk>j:Ъ:P Q 2DD!"{~>7 !zu>'|'G;01eeeV;nmmmddŋ8waÇ •+W6CBB,D>}?N0ʊd[(Θ1C =ؘ~P*Q=,SSS777{{{CCÊǏ'$$wﶷ_~=}Y\]]쌌#TW_ >u#RTTi&xXXXљIii-[٣ݻWxx<}|%ڸImF1 `aaajjZ^^LrL^^9?sL-Ѭ-[&Ь.0 3ydTUUEDD,]T)tÇ+7ܿE"ћo;m605p@aY e˖-\Pa3ѣɓJfffJJJ5ggg; Ì1B@/bff#zz###ѣGϙ3G@EXB,Ԅ:tS^^zj.[lɒ%2=Q_ diݺut7BC"n޼5}'t1$$o% )ڸIWYYI7nTs… | W3226Ə:evoNubח~ ~z;w_ucn޼yYR411ݵkUUUm۶M^z=zjAx…f댈L;͝6m޽{&2={̜9ڎdǎL0U>3sR믿_VDza"##>0̴i~W,a T*s6nҼ<2!0>p@S|}}cddDh=h5`uDQ:g'!Ÿ8za]F޻w/y_~:7l@q]';v( qww'UK" t&EI[۷4gcǎUrѣev߿_ ,2d)ƫ'NܲeHo6=b[š5499l2])n!LMM5[-߿#%*111Zn׮]UљFmm3goii)k2ܻw:;iҤf?ц tuuFUzϞ=[Y9=====]< EOOO--$Y >plllPP=E&OJc̞׫d=ÁT*%sIk͛cbbBJt>{.,X~&%%5{JK`t1bĈиh'5ݞ ܹs SNѢEGƹ6+""M[2z:)88NHH|?sLQ@ P؉H̯{V剙a`5ޢ$cM=4ݮqZIe~Pe%ݻ_-lѳgŋkp݂ 4U@h0̸qvBBV~_={+$H zqz$@nnQ[[[rrrrtt$۷o+9L-0*oѾp}nrqqQe<_fddŌ+Wpa]uΡVeeIm Xe۝nR@0sETk׮k׮ҕNx<޲evؑJϟOh)Q8oooQ2{8::Κ5EXZZ.a7n, :Ja%t}@н{VcnnsYZZݹs-޾}ߦgswwW}8uշoߋ/R4''o߾I###ϟ?p3g\z ju啛|@`Ŋ"HQ4'*SNݾ};_ccsHG/7U X,Z-MgϞGhz:UV*df.*((@MMoߎOMM-)))//߹sgVV_H͙3L)tRkk붉 @ަ/艀Μ9S__n5U =׺t/YM"tDE y.7UJeeeEGG~nff&ٶ :QQ}N^zܔq&裏,--ImMbqppDaf̙dOt/z5 AjauQHƍw%{Zdf/rUUUIIIɰ/^ȴe)C35K7{QBCCU9K ц)S"h`!Qaqpppvv&P҅͘1c;k׮9|~Spȑ#Aɗ/_V/_5PvCCכ=/%$|a'j&mikx; [|7.(DL8l_vutt4hPӇz-E9BFkɄ `'O\\\zw8H4tPRLNN kR gJ|0\P#GĨ^P(ͶKh&{ݺuK2***RRRHV\)=<<<|ѢE􃬅ڵk(֮J$уlٲk.eLrrr|uuu-t~]U mܤf͢8{ڵkq8&&fҥrFFFFWY[[wcH9Ĩ(u/_77ͼqLT*=uٳg]\\lllsrr+++skkk݈#lmme;W7n|ann.[;qDXXX^z) KKKKKK|~أGk f_ `jj=Z,,,OѬY*ʞ?>uTz"`oґ#GΚ5Ny7nBOO(33ɓ'2ciV^ uDE|}}oNtoi(33w}7>>Jqqq^~رǎteݬo{瓝R4++K]裏:h;Rt;ʚ+00P,>?Qaaadd$)6LmܤqQQQTTSWWBdɒ%K(9+H]M 3bq+g%Ɂ,X@/"ܐ!C:,aiӦ:$,K鬭lٲpBmĻo6{App{gjjz ._ɐi!4~ڵ+ @f|O?ݰatAHT@QD"Q+*D7n駟&N`ȑ۷oETG_qzGխ[~acǎm삂Ξ= !X~ݻ]\\3t~5dnnޢw9}t]]]jkk:K7~:o޼ݻ7u ۷/U7o 8A}7oLKK+,,BҲo߾b-9pΝ;I?CsNJJJIIIYY@ 055H$X rrrsss_zU[[kdddkkioofQQQO<044433suu3f*cĵqܿӧUUUnnnX.Jdɒ{@S(((N0PJWqYzXׇh{HTWݻPJE8qb;,$*ӧOkvևhKX3+,,tÇ_u33v YHT:1c544TUUD"YfM{"$*PEEq KK˶ E0FQpY---o>~Т WWW<G&Lx뭷,,,70ӧ<Ʀ[n@ Q$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs Q$%%w -*9E8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 pZ~wvj>}ݶkx6i@:C/##%K,Z{ݻ׾Q@uDLwm`@뗊<<<G)?8666''iРA]rrrJJJiiiyyI߾}|~?0 BR۷X,ni%999:::"W^...ݺuS*===cccGGGWWW]]_RRRSS# {5l0 OWbUUUݹsɓ'fff... hLv̬wM/^vvv*&Oo&@'ЩGGG]QQa'Nw^]]ٳdƌQQQEEE/z{{+QӬ;v ֢?ڡ4h=zP^}鬬Fz Z߿l'N?~%K w9svΜ9'NOOoÇ[#/\p-v;((hܸqʣRH itD~謭UxLLL̏?HEEEJKK{w>}^| deeܹf͚p֭ÇWWW+|޽{|888Eر,s{(ILLommmbbRQQQXXX^^^__9%6d:UB?ҟ?gQF-^>,<<׮]2dȐ!C=Jkk+VНͤRihh [&NاO/((غukqq1[ѣ|  U<J>!C,YbeeE^?|0c&44_L ˗m=|:PgÇ.\0q|̙tdTT|ź~MC YhY]˧NR|[Rt>g֯ׯb~d8~8Wfdf֬YsaRidd$j^^mXY 0|>d}l9r~~~}QKSAmPt>$Qܹsg~~>[xI\\-Hz-L>2OII!2 |>wvvH$ kGQ+B+++۶m[NN[433Z47y;cWcdF2#͝;WxxxZ ˗/O>I*>x~Uu]bcffT_)GG7xCKmF )u_7nܠxyyՋ>,:: T2cСl JIرcaggG_zUUU;v -bxݺu={lDyQ:٤I+-0t_)///%5j(~888(zR%/rȑ#LKmC )uD%22ʕ+kjjev4hٲe2;310Jfb<3 㖆J?h*Jƞ={mCCիWޞox֭1c䤰/xQF)y~۶ xJj000 2ԿXt[ְaÔ бtD|E{=2B~:AK&R ##̆JrBOc~mu֭_0L}}?p77#F{]]]\}}ŋ:T2KH󚞞h%N7r<yĉ2}Xeee+Tee_|b W#)++w^^^^+#faRP0Y|yQQ0ؘ~ KK޽{8pĈMe ŤyJ2ZE~3: 6L~Q޽/;"z͒}/߳ez}6nܨNb>;qĵkHTcccAAAAAAlllhh˴iM_54JPbv-zi tDF>3NȐ9ƍ!!!A$ׯGa|>_GG]C#%%WtyK.'Ohwލԋ]#-y4|:F&sssݫWY Ǜ4iٳHL`Ǜ?~}}'=ϟׯY$ܹsΝ[ZZf OjJdMSb B]]]6k |3:.B}}}+T Ztt49woQxYfM:a vTT*=t萭LLLƌNʾ9n8 WRebe-Dl<ghtJA˗/cWDaǫYmpŊdǒuS݀>[n^|Y\\T޽;QSS#dMKRWIT׮]kE t#y  2;))ɓ- f_Rr$YTa"%2Xcc͛7Tɓ?(f]bcc[ ݵ(蔺J2zh2NMM Iѣ=~x"8pYHܹsqqq ******JOO'sȣǚ3f +ݸqӻwoTӓp|ݻ?QNNNSYhYYYJJzPtJ]%Qqvv&]ԣ|rr]÷nJx >=zۤBӦM#˨:t GGGvC*MCmll藜C)W\ab1;FԿX{&|ؽ{w29Uee3g~gٳK)mKK˱c6m||]b/m@@_|yر~M"ꖕ5R)i܆ 0Ǐ{===z=}}:񷬬SN⠠l aaagVܾ}.^ѣ'''IW^R(Pf~͛/$q}}}~~>41qD????ԼX 8::N>g999w DUUUdauuucLrmN222 yW}x?,@U~<<<֭[G/^QUUGgA%K˜; 8@g)&&&.yKJJji tN4iҥ"-666x"33/^ zzz͓i!|||IKKcccaaafffvv6Rtuu[Tbf~~~$KDWWE@@TSSS\\\VVF=zx{{2&>,@'ӅZTX...[n=sLLLLAA̫"uƌ=z?W(nܸԩS׮]- 6w\333[[[2o\\[_FF_0L]]ݡCK^uWWSN%&&044tqq>}Ǐwrr ~YYɐQb.\ؿǏ&7oۨ$#Fo2m/^^^ӦMlG KwkUVVVVV֫WE"==zTQQa``kҳiqDjj_|)JBa=8߿2nݺ9;;h)`%ԹX <~833˗d2sTQTTˆccc[[[5tԵƨ@D8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HTs QAD8 p$*9HT:@36o\^^,Y䤑@}O> OLL8q ZWIZZڏ?ƍӹ|P555yk.T 9r$<<ٳgmpZ#%*QTUUg)<qĉzt~%655H@ 7o^{GzHT@,--x ЉvD`l@oZii)677[@@ghh;̙3Gf)*,,"EЙtD%55U*-mll̔qڵZnݺ9::z{{]VVnуݮ:yKKKBa>}OnccAŶgϞT Z'Hvv6]|״kkknݺ4'''22ɓ'%%%O>ƍS~Q?卍FFFfff 3fT͛vI$zf+W$$$<{F( 8pܸq*Nvjv[(۫rV^^ދ/HYa 2*M*/&&&>>>++oԨQk]] }+OU*aݸqC%MݤDIIɁ.]1NNNfTUUU۷oWZ:-8t;Mϝ;UUU7):;;7}gk׮S0LMMիW.\xUCg5kڵK`ԨQx+ϧvqqFA_ٵ_, 0555uf) H{)))g޺ukSY 0uuu.] | SQQ0̕+W̙0KaF*^|9 E9h&x񢿿cǔg ɛ6m Pr[088X(jfM<Y hOKT H1**Jz VRR[o7J{֭[FU}c2e ]x񢊕={n^8q'a;0Luuoԃ/~޽?0o^|yjj*RQQ_^tIp|tR?|hڸIO8aUtw=zHUaiiF;;;O:m .7Fr7odJJJTA:}1 c``/LYY٪U*;[[[x"---..gBpʕƐ@'K"O>uuuEEE쏩&L"wtt4 3fPB166_*(((,,JdTlа lccݻׯ_O_V333WWW;;;###DH*~WÇomڴ$<o...uuuqqqtfRZZe˖={h0z+::'''G'_6nҸm۶AA 꺺:88XXX?}4>>>33ipNϜ9SKmn4++e˖4%* L<$*UUUK.U~JEEk 57'EHo;2eggo۶4466xyy 8Pyqbٲe .T،0zh򤒙ld0#FC6Ћ燇>z^asQ}0z+,`ѢE+V555!!!a^˖-[deeOCM| ] oI￧'h6n}UVVƍp7|CՌ={͆hNB0880r]¯_)Ν+//'_]7o={MLL; almmwEgGUUU۶mS-|W^G}뭷zPc466^p:#""n0>>>*ӎ蹡rssMw^><>>~Ϟ=3g<|211ٱc/0 jժ>C~AAA=9aH-0 3mڴ_U>Ka&88x…(Jܧ4//LH08.__={=t<2|e:::ZX)Q{r|H1..tXk׮m333=K|_~ᡤ 6aܽ{I)BpǎʟB pUEH$2]nQ)..Vd큁t?+}رc?zh666W>m Bjĉl٢3oMVqh Gh&MNN;}-[LyW.gggzʯ|[F SSSVokHJLL̴۵k|UtQ[[{%[ZZJ=z1ݣNN4Oa]]]vQgV)~VNOOOOOWrpzzHSK k|+DoѠɓ'+g,Ap J\Қbccyfǘf*-ݤϞ=) ,III͞Rb888X(u1yD4#%*IzM';w攓'OU ޞA@_h*5qhhh iӦrrr 矣._Ϝ9Ą>,))uE!v"'+~޽UybfFf*XXGMkqnR-TYɤ{7| Fsngg`MЬ.0 3n8dUWϞ= z!CA puV9IJ&S 0 coo['Oгs˖-'O\v!C$ 0ޛ7ostҩS4]"sdTL)u}٪I)8-ݤ2Yg 6LHZmdq tD\S?(R4""BaEEEqqqH7D~~~nn.)ʯ8}pCCFYtﯴ$&&>|Ǐ[#''Е+W>|ҤIJӧ=GlH26?ë>X, i6IP= {Р<ݤt}߾}jDaSN4h+Vhi @S:Pb̘1|ׯ{uvΟ?Oy<K]6fW݌3BBBءRW?^+\\\\T@|l1##ʕ+\XײEsUYYRdVevT ̜9slQ*ڵڵk~~~t*lٲ;v嵺FGJT4ۛ$*~5@hJGqd Tz9 ~MMwB~:_)))p޽M*|}}))) %mߤ}hرc+WZfMhhh5I$7|`FH҉D">|8)u~Sݢ48YyXɶP(Tرqrr"|nЉi&D;vꫯZ 8**j͓'OOޡ%fj)mKwbƍvFFFrr2 K.CRX G_ t޽񘛛\ynnnwao~UNqŋT*۷ommnR'&&*f̙3W^}뭷ZF+xyy*000XbH$vTMԩSo.x9ýMUB_.###oy{{D%11ٳg-::^N ; tmywS||۷SSSKJJcwܙ_k/ys)(( SJ4-]ںmP z5z"3g׳&&&~~~MUBOõD~~~FFFv}}=~VH$]$Qzr5Mjժ޺uk޽ӦM#7#ٳ;wl`X 00ٖ)ShJ=m geeiH0a<<<Ȱ{ytT-JbxĈHEZZ"O2C5hzjv7رcl1ez#G -ڀX,^r^S .0W!;;;99:ua- ܻwO1+!!ŋtz%%rK7JŦu!kjj137inݶm۶h"me.cmmt%HTcgGFDDѷkwqqH$25p/9… Ð ۻOpRYY_iiiI---NTT7AI?#KKKR|A0x`fX-!Qa9s&Yaӧ'^)BZzj@0j(RqF}}ݻwɞև,`鋥\UUURR):::j2,_&&&dŋ2mY LMz޽APUt0eaʔ),,,%yHTaI144tax3fhNA499ڵkd">05rHzP˗U<1<<˗8x` G;;;pfO9xK ,_ڸImmm(tNeccx~K$ !Q?'N$׮]#c >>>}!?^KQ#GZ2a2ɓ%޽{k5N$ :š=($$Bٳ0 #`9Tȑ#111/ bڸI-,,enRnR1==+WbU3c 2Ӭ5R?ǁ(TSSiӦm۶YEh@LE@ΝKݺu+={?`ݺub]1)޽{~kర6q<߫k&g+**ڼysalڴ*o˞ٚ5kΝێ1(ԑjP>‚~`-j̙'O&ŪoܸQܣUUUǏ>}'KJJ֭[{ ĄBӵ3n8///R,//_fͦMd_h kaav6D-[ڵKf_~e]]]|N8֫W={ RD>ѣ=ֈi IDATZbuu}~644<$EGVqv i=z4k֬CDϟO:tȑf͢S^zƍ+---**|XիWc:B)Q6__۷=[-,$$wߍ';Ri\\~)Ɵ׆;vc=zY7kk۷{dT*ʒoW!tuu?ڎ8;;/]β ŪOOwTXXIÆ ?E7\TTE%&&&&&*-Ydɒ%J:R/mcƌ!EX܊YDr ЋH(7dȐCi;KafڴiD|!Kc'Rq}:kk-[,\Pہ^ @{^… W2dCߤv ߯D"O7lؠ]A/>j(HԊJD"ƍ駉'*yp1009rgzQ155Wqu~ؿرckx<;;g϶AB2֯_{nG :~`G ;wN>]WWWڦMΛ7{M~͛B.rP_EE͛7 P(۷X,n`8sNRjjjܹRRRRVV&LMM%W^zzz۫YsvvvTTԓ'O*** \]]njqmܤ)))iyyyUU@҅,Y޽{춽}DDDػ󀨪wcqC\ f" nibh[Zd;⎢((!"#"s a~u03,BׯEjjrhGPy^lٲE9 aGPy^۷Onٲe-8sa~_ݻw`c"Tʿ7n̙3G^d˳w޽;<<\v{@@@j,*Hr_~I^^^vv EiرjA*ty[[ӧ׬Y cTʡ  95k믻vZ'*吣Vmk4www??w}Fm>B(nܸq]FSvmgggK7( 0Fp*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  TܹsnOTGc6?Dp*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!7%]+{9,ݖaSEզj󂻥bJKWF|K yo4ni 0&"y㦛[EN)$KnnHh醘 A0ƣ[, 6zQ[aw ,E)/?oݖniT>k&Ok!9nBBP *Ct\ ! >eF~nݺ7oe`>e>eeeխ[ Ujj.\p5v JQQJLL̦MΞ={ҥ?~X+ۻlgРAիWtK˭> ##$U7u&LoΝ>o޼7x-0MNN۠… ϟ?_ժUׯ_hhhFJaϛ:uܹs$U[.00$U]'O|WD''s=<<'*֭+V|d_m6pIY9lϊj:t UR$IJOO_b+pBs xFV~^v MiM'շ7v,+AeΝZ nCCC{=s 0777eQѼ⋖j .Tr$!>F%>>~С>Ttwwh׮]ӦMRSS_~ĉ\+?֭S◻1eԀ:t+2.@IRttY s+ӄ*Zvʔ4eʔѣGҼy>}Hw^K,{KOO_ҭ(ݻ|ׯ7o|nH*Lx" 37ʂ b:ulҴiSjѢŎ;Ǝ?O4w޶fl.PRQJ):nn))E|rR+.^Ȕ"[h\LJJZzښm);KIIܠK.ŪaVV}dqF50}֭[P'))iƍIIIiii={,qqǏܔS^z5""ʕ+wʲuqqiܸ񫯾jΝ;)G%,X <<ŋ_O?ؼ꫟|I֭շ0##ov׿Uf͠'|A}MIIm/]T}{@yBJKC'O={)Cں[na.]:r:{{{{zz:833SM6o><)RJJׯ_x<#뗵u.]nݪ+6,22Rw=99YWT(cǎ򶽽aÌ|퐐9h4VZy{{$''*Ǐo|ggg+w֭[SNnnnNNNٷn:uɓ'tN0e˖ϲ|)[nN5:viggy۷oϘ13((H9祗^rttԽرcrW+Irss?W^yEمOOBBرcv''6mԯ__WsRRR\\܃ÇcǎmҤIq;2n]ڑ/ *$ݻW5<}ٳMtw@@@xxn… N2?rK.Fnm%I۴i3{le39s̚5K״k׮/6jԨ F]vww3gNIllG}t)]QՆ:tO(9T\y̘1'NRV;kZݞr2Q|0vX;;;Λ7o޼y;w6mL<޽{rf͚aaaFV:{K';w>w\(^vm%\BJ)]$IСChhrϵkׂ2bРAv~~ڵk|ɪU#%1tИ)EO?ߗzO|ӪU8Cɭcǎwǯ\ReQZիWz)E$[[۩S~w*JSJcbbRӦMꫯ;\TIII퓋5kܹsرcR$I .]bEybccQ@!I9m)A=C*$M:uԨQ=2dG}tرW!RUʠ|7ɓ'EC+Ҕ\]]׬Yb[WReѢEH5mVɓ'ەqVVV}]޽^z[nU߂FաCxeCC?nѢ~wyG.婉PeRBwYpaڵ͛ Iҵk׾^֭K0W^/_m={ٳ͛77tٳgϜ9#{a${իdT^{K =lʡƍkРA ڵٳEDe/;CrdԤz+**Jgܹ5X mf+ԕ+WE5'Lj*މ'| (^xb}zz9JXujӚR ĉcbb飷ΥK~.]xyyM2X 2Dn:#otI[TXhyyܸqj IR׮]w|Y[[O2E͑bF慝:uR =Qyw,?Z~}吧ׯi_^~^N^N_R\R-)Š2DEiӦ7n<}{}:Umݺu-$w5k{zzY:uFQa$ըQC~Q(jܼyS.jZeg0auФz\\\*W,?h֬oWn4iҤIuʚ5k&MQNʴڹ|=s|# ~UsRe&jJ׍*22222>|Xm۶*k$I&WzF~$r*uױJ*VVVه ʢg*Fׯ o]zuŊ,t@czgjذarOYÔZYY?C w_p7n(76mJ& @[|?Y[U((d-VM1-(5&Mرʕ+LMVaSR\}z-OU/ϯ]]];u$/={ɓ'+سgӌV4hrOcZTbkk񒒒"ʱ"ֿ\C }kD\y{"SΪU=.اK֯_?yʑ;vP.r5zQ>|hf<ƎR4hvܹÇ۷o A,ZPʌ?W!@ *$hbȐ!rӧ#z ~䉲WDD]V7x -\iiii)**_~VVVgϞ9sf_R)8Aʴi'OJVޚW^5td*Ut"s|]$IѣeMK($IF-Z(?s/RWBJ)A޽{ q .-Z(ƻK)SM||[$ILII:d-yvz=Aqeee9rD.i&44Ԃ"SUH)jTܔӧOw*g8p׷d-yvڵsvLGUǏ`Vk[rQ95@AƳ )E%AJ֭-[8eeݺuQQQO<۷d0Xݳq[۶mbʢ6VS헅eRz^z)޻wcJPr$IR(^'NضmܸqcرUS6C 77f͚M6m۶N/8vFFY*.@J).qWwuu>}Qia}}}o۷aUV\͛;xpݶ탂JØδis]1))k׮|{ァCI)S('2֭kfFDGG/_|ӦM+III6ޑ?T$Izwn߾=cƌ<ݞ_|vvvv*UzQFFƕ+Wn޼\Be˖r(R.]<<<._3cA?c^u{?9soťz999n:s̵kהuttT?E{zz L30aš5kÇӦMojժԋ/&''+_UreebINNn׮]:H駟͜9Eлw~I9ozTz-/7֭[oذ!((H)-^iӦo`9dkklٲ߻wOy޽{zIZ'p 0D1*q>|PE IDATw*_xMR$I:trtZ ṰSNQQQvѸq7x +|||֭[QoݻwWJHH0gʕ2T$IjԨѦMCBB<<<*Vh`GGǀŋ#F(^[ٳ[Fogoo_1e˖JOΝccc'N W^YvmTTT%IԩRj(@٧ɱt-55СCٕ*UZj:uZhѹsB٫_N6M.ٳK.j3ܶm˗222lllVڨQ#xK|ڷoߡCܹYR%gggOOOTu|dPl}VX &P&uúmOOOz<y;_ҟIdIϖn _֭[ǎ}`c`Y5l[ SlAEߪULVVVm,yfE$2`C*6o,oo߾QFl ,W 2s\ASkK4̛^:l٢hX̌׽rmK4L_III=zWsRʅ Y/G$oܘEQI߽5u'#%%eÆ _urrsh$͛{Wo'{9,ݨSASMMz}EK7ǔ'*nnn999yyyYYY...XsD%33W\~ \P~{WK=t'*ժUmk4w„ Ζm{ǨHhիf$ =cT@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8±:wX |Xg)Jt+LA/^T֭;p@'''KG)??k׮U>ErdB{ |3cHf͚~ԩSZVuǎM6TL_~rX??yY=(A%---++nݺn,/;;;!!A.޿߂|nZWSSS_|Rn9\pڵk X1<){A%&&fӦMgϞt?~,IRŊZl3hРի[x0Ul@R… ϟ?_KO>ȸpš5kf̘ѯ_F~;3g͛WZÇw=e#'NPy|zz+l2yqƙmVl2aÆ͝;W Wعsk>CCC{=sJ%Kx(ܹsR-AiZ~}JJ\߿eH):lJ||СC>|Ю]M:;;٥^~ĉ111?w}Wmoy$IO<)6VVV}#~`q\PTZѣ)iʔ)G;ťy溹h+uɒ%~~~z4Ϲ˗/M4`c(~-X@9l:uS0iѢŎ;F)ϟ4iB>>}U_Y/˗/gddkժiӦ7nUV˫O>F~,{&''m(ܚ5kW_}UUza%۷o?~\\yֶGg.t޽{+g+Rrr 7oi7ԬY3((hĉիW/Viii_~  Ӻu#Fok׮͚5kÆ zTwԩ 6LHHPg,[lذajųtI~~MO#I4dȐ/lzyy%&&*-~h@帲렳dɒ~ܹsO>-ڵk?,,X?MLLϣ $Zj2eJYǬS=89rE$Iu̙3### deeշoiӦ:"!O>Q͛gQ&Y\vyTҳg4)%##cȑoflll7$i͛7wy%h۷m۶s1r[&Iݻw,XgGFFzyy-\HJ$ɓ!!!/^T_J6lxCY>\zuNVZU:f=sqqqcƌ9s挡8!I͛7vکLj1ct1""Я$I+VhӦԩST[j233%IڴiS M)$nܸ߿XP&Tڶm(wi`.,_\oǐ{ĉ&M2_{Ԉx׍ߓ) 8pj駟~W_?TFdd;C #G.VBt灹͛7>}Z}?hjoܸdɒl5>x`ܹ@{addaHKK JJJ*JcTtuV]1==}ذaX"##zm\]]}}}֭x݄X^yڨQ#e+qnݺB$J* cǎջ qrrjӦM333z<|pرM41>slllXX{OӦMW.W~k׮ <8>>ں?ŋG֭۹sڵkWT޽{G3sLKTvmeOK^G7.B[׮][oYϦ_I\jԩSvv[N:uɼ<&LhٲOiV{Ν={*$RJ;vlܸqZrssܹsxeJ߱cǫgϞbZ1۷o<~XWh4ZvqqINNU^Q?~쎥yLNܠ"IRhh޽{O={M=>)SN8QNիn^נOXf͝;w; gg X*v횲UonhnnܸQIoʕi w^)E$wwK.ZXq:f=sӧOW~ ߪU8CtqB)T9s5W\tBgX~~|V\믿 :thLLL"Iҧ~\}@Y'tP$iԩFR?tА!C<<<>cǎ=㷘={?н{w#WrW~W:6>-Z9~wb^^ڵk |Ie?xh۶rʯ͛7o~G3g_H/I7| LKKScquu]fM|JUTYhTdddTxbheelٲ_H$5jܹ=|񗔚˗4yd{{{~@|I.\8k,׮];uԬY>ȑ#%ʨ3pF||gqeQM_ &T\Y.8qБ7nP[YT~@޸q1cSnZMtYŋ+ 7AEյkWxҩ_WJJ\>|k[2gz-Y1իWWt钙(=BQM8W_2eʮ] NtҥK.-^I&}6l. ZdɽO===wc]QԼ+f]~}/// 7699 ԩb yXKÆ l۶mSy뭷T0$$dĈE&I7| TvtvvVS׮]/ʵZr(UV+IԩSw-Ϗ~zs' RJyxx߿_(FP$iӦ7n<}{n姆:|MBBB||ӱcG [n=_ϮI&M4)5k&ߙw^~}e_СCm!+T>#l>*ZBܼyS.jZGƍϟԳgO}m۶C'OdS$IQ#PLPiժ'@ddddd ~~{kn;v4T[rr_%ԷDyp^^^ttտ"T;ussu떮?1 j׮aIy>նm[7idYmtt<$Iy#GfVNNN*|R`>e, 0`Vq;vDGG\رc={裏f̘Qh%P_wttRyй|[/20#>g]177w۶moiad&MT&MԱcǕ+WaK.54D$55u˖-ƍ{饗}]n'¬AEn07ǠF3U|^J%N9y߾}{xnǏ ʮENkD͚5Kڒj 'RrttUV*Ulmm+)))qjGDDYرc'[$)==_ݼyshhhV]4bŊ)83,x(gP$N:VҥÇ}WR?(V>cݖ5h୷ٳf͚5k֬|7x7ސ$ȑ#w>rӧҔݳgȑ#V*o+/**_~VVV~3̽聏n{ǎׯߺu3ʕ+gΜ,ߥrH[l{W,d[3U[R%yd׶^ʕ+?kx~`6mڴɓգիWEӧO컔E)Ϝ9/(޽{/_T[n,*DYVVrm6mڄZ1nnn+W3fDžNrT*&!I/\d7PoN!*j8p@qkW{)t}9"hPqssSKݻwEutٳdߥ%&&*;Dǂљ7o1ș3g^zI޾sN||ԦG^ gSy٫&o9 l׮ѣGտ#88XyOoj}}}X իW.xLB4}e˖,\=P8bRSSE=P*ÇmT>wQ٤B-%yf/PsP'ݬgSZjݻw՜*,sʧM۷ol۶պjJ.ٳXʢO8!;tParEРҫW/e{;v(Jԭ[7)S-sg7AiiiEᑧptAkݺu*)-X@af=eֳ|B}A IDAT"_2o}zEEH*W-׮]Όl̘1B:666-[lذKJ߿Ν .zo_=vPz|}}&VZkժeccs޽/?^<*US#e˖)?c޴iS[Oj)Iǻu<^*UjժFyyy7oeQMW&Y\L駟͜9S$IjV4ݻO?Te2'';w1-qqqTZ7t*IRppbJJbΝllmm-[ֿ{;ݻw^C/UVxxx~ .3o߾_9v) 4رcMR$I[bE^uGEEz| f̘1w\>CwҋgSm~z!322 4~U*,M:HԺu 6)y/^l(NZ;w1B/??ȿÆ S3E˩dtAܮ_q>|w*_xM۷5Jq;vܵkѣGjL[NoBi4??۷w]AcBBFFF~zcOpqqYhɋhҤɾ} ]A?cO2I/M3g~GʾOgϞzI_N:EEE4n822АtsW[zM6M:Uytss[`eTN'T2&W$I5ڴiS|||HHz~Nj/1BwqppXpattt``ʕ+Z*::Zx!֭ )b (sα'N[Sfmm+]6**J7WON//5yyyaaa=cJ *@8qrꠏ?ٗ3ׯw=#_EXn]JJ*//ƍʝji>`A?s ` H[X(."MED!Wr~MjZ[޲r%\A}L C3\7BesY|9yaf|f>C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sW[7*4.??e !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh !P9*4@C@sTh ڙt??m]XU/{ׯZe1'|[Ю"V$ٺ,IvjAvb~lHݼFI-7b6nuĂ@0ͩѶ.Z[n\jR `Pܭ]"zR$.[<TuLS l `PF=[4/Y+!8v؝;wrssԩӲeK[ (Jŷnݺoyyy^^^۷ooѢ ;vlbb<iF?--M޽m[@3wqwwWpVVkchS= (%%%))I\m \W_zUJ~DFwy?~ᇲl̙3 kBZQ^=oo 6YeI<<S~((wIW}brH4{/ںeu4SN#6mjdcǎ)}Q 6ab7ȞXEmT `qqq.ٳgʕ׮]kٲСC/,r7n޼KbK?Jɱ_<(ȴI,*"""l]rppx7U.~)XIW?n)CQlˍH+S `LWRņ%@R~n͊dT>}{wl[-+**R)RTZgϞ={ٰ<%H嫍JZZڔ)ScYf?V;v}~ҥ+[no^g IIIJ/uiР׫W޽{W-,,TN<5y yyya͚5Mڙׯ_;Vnذaz@>{Guh6l|ݻwsrr<<<5kַo_E=|={.^"77:˫T$''Ĝ?>###??J*umժUu:-e[͸l7o޼q<ݺukWJ*mV}!srr6oޜpjժjժO>귣WӞSeyyyիWUo>}tN( ){rرC]|9==Çj֭/lҦ_Ɍڵk7jHYlݻWZf͚5ǧ+ߍgΜQ~8VjR,iiiiiiʬK\Hw .k֬ /ѣe˖&`+D)2;q( _r+ܻw-[?@PPPllMƾ+_|1vX5+&'';v.vZjڴiF~>{m9:4h l2񯯽ښ5koĈ}AAA 4i"-% :xh|7v911Qvqq?TD!ClݺUTRbb>lӦMi۶1cK6x5,QZU. /ق av_[ƍaCQ$I[jUvOnXC=*MMM+]ѣGyyyڰaÎ;V썗$I?>p@~>ӧOM2Ѝ$I6m ZrR=x୷2dH|||?$mݺK./Vb5o\>z:L鿻@|ֹsg5߲uV??e˖Hm۶o߾]%Kެ,Ilұc+VHTXXy栠 &didٻwoΝk^w.^w*lCVT~~ ZQ_L9Q#''GoPbsaƍ_~(ESNEDD9]*nnnϯT%5k֥KEׯ_ Ztinn333͛jfH "nذA劑J $I 0Kyrss fC?cٳgˏwr5ߒ5nܸM6Y8===88xʕnEߟ2e|fFaӧ/Aw%~n{e|J*mܸqԨQb! J\Ң7;;{ƍGVSQFIwegidٰa͋n޼9tШ(ۄu*UPP0rȘSW]DFGG\1**޽{ʬ,q.Wsv<طo_5%VRt6*:Tyޓn۶͌_q퐐y晀f͚yzz޾}ٳ ew}ݽ{NMOu!mV 2>Bʕ+ʭB<ѿz)(˫W>zh lO?$?ծ]; ǧZjYYY/^LHH͜9gԨQ⏥&M\\\'K/d<ʩS4hrݤx1]hQ,_\ʊ)yYE_;;;x#""ήM6~~~Qɓ'uIeȘ8q͛KܲN>~ԩb-]]]e^:|5W-&m{Tc##R@EE9r]믿.F)#F5k~#/~C'N_b[ | &駟~l-wxv^Ҟ?ӾƿҥKbP׮]K׌^rUJqM2Fyyy ,X`eff8P];3~jժ8+?log̘a<&MfȜL6MgK.M2E)/**?/\4w޵jRnAkʍW˖-:4uT_k''3f,\Pxێ;Ğ\]]ׯ_*I?qFGÇSL1VIYm.\p9yZ/Nin[dexHcȑҿ$(,,4r"XsTիW߲!VN{*uԉ?~Ckww/믿\KuYR?wI&lzEC9SXv6iРAX\ztF;j'9t͛7(DFFH= ^GbHy T$I4hСCY9oY{{˗8ZoyOľV4.00qʬ/1ӼW_}ջwo#˄鷩hذaLLX}ovNً/oOxoGѷpBTJ Ν;'#**ɓ'$uEFRnݪTRJ%Е+Wɚń# !{XfS;,;v\{Z2^{_Wf}_وFƢ"mZ֬Y#?9Ҍ%qpp(6%@_PP8۴iS!N?/]Tiw4uT5Ͽ2Abc\CwQ 5jԨCJܨ0'/"M:U?H)"^3Y=N;'ojZ5jHlxp55&kV~ܸq(dW4Dg e㝌]6''G-uxIJZ9)S=)z*8TI,>?Klgו\IBBB2}bDBBBAAA cMm۶ved;v(>>>&5o(QNT0xxx/_x_}CIBgV !\R <.IħM6)Mu*}( FXX\ЩFC y?ī+P BVo*D)j@E $LLr]A)nŇәO91=))ШXb,׷o_C2njԨ!&;NNjj+WY!~䉡7!j?׮]SDvvvrSyyy7n_%66Vvss3A\ReVLKV۽+'O^Zv9YJͼFRbiRhDXXPXX(ݾ}[-@ o;~Μ97EYbk"wwy5Jy_L]>,,̪4L4ibۿJ4,5AAAPm۶(((P4i"K$Ivmڴ)viK];>He BV8a$IqqwNs='''C9>׮]l2C߹s'::z„ M4y7)(`X+Q*HlС111J׺nttmKUxyyuYݵkׇ~(.{ne:00P}rGlP~RoN:e)G6m4={(/=zUyZ)Tpp"\ fdJv$I/RYVjٽPkgH^^ްaÊӳFNNN7ofG#*dTG%}A۹i\?/bi`\lwҥ{*ݼ"޽ۤ 8?+ AwQPPIm2Qu&44TɯKsɿڵkؙU^^|?#1H~rim0q'۶mSN7e~#;m4ٹ]vtAAA\\r?Խ{wCkխ[Wa|[?-lBS*vtD*GMOOК YRh޼yoVigbggf(-K 7~"8yd)6T57 *D)&ȁ&$\Z5Rf7oެiʹiĮc%v(IxtffҥK?5mF岪!CM.[xx0Z(y_vvv30ڵkafgggEZ۽UkqbՐp=n+R#(tߪU:%www1lΝjsVVӧYOOOHURLUIF!&O VTT4q%K_k ,Pf+U4yd#\"5x_"vL) n{)7+cǎ+///""bԩ ڷo FiӲeK#k 4H^+//OIjڴiX5];Qݺu_xev˖-rt>}:((Hƒ,RR*ѣG+y܂%۷y!v ﯦYȱʒ*^cǎRL8_~bI}uu޼y<""xKe1kٲejX5Rիy_arrrF~-srr֭[.**JOO74ul矗^ ZjSzU5];>L?]၁; UJ~`K Mdd!C.^Xl׽{wqX0#Af8/%/h#3gΘ1cLj;%%E|Ms]v5owINNֿ2/\[n:t/:;;߿ƍÆ R]6nXvbO/ʈ%?^jՏ?ءC ֩S(33?8uN;GwΝ;nIC@y@he3,4{ͮbN4yu)3f|… ZUTUfSSSդYMT ]M_a$խ[w˗/Wٗw##iaȑ#椞<<̙3>eNzYS~QF;ˣGL-ٹ i/d}_~BCC(VR{?ɩcǎʬ#bHc;c[];Q.]Lbh`^zi;v;ܹx+R0beGg}vȑ7|Șvvv-Z:u/ol.??e(7>|رk׮effٹx{{wEf.^s嬬jժ揽?3f(wZsΤ7oW^˫Eݺux*صݻȑ#ozg}||L})Rbs'N|rffÇjժc*2x`l]3 PAݺu;z~쫶|1=t_zUQ矶ERц͛SܪN{^^LC͛77mڴhѢTAd7@?;nN))ɓl^^ʕ+mXfWUV=yD$::V)ҥK n߾mМ](@k8&WKڶm'IIIǏIyY6BZ1 ?Câ~&` ,PQ IDAT<66%`9)Pڻw2ۡCe:---**`~)Pw2;k,OOOevݺu(+OʦMioo=zSd(3+7~+$ 2$22R$;;{I=wÇիYիwUf۷oL_tʬ8-֭['Fdddرɓ׮]ζsqqyf#ew'N899իW]vsss3W)))ʬkkݼyƍt֭J\E< *UԶm[.^yS4++k˖- ׯ_˫^zZ|}}ӠA,z8;vСC/_NOO𡣣cZ<<jpGu֭[?cÆ /_{|yxx4k֬o߾?m>|xϞ=_TT֡C^zyyy111ϟϯRJݺu[jտFdcr߾}ǏpƒԬY^ѣG˖-T@ő_NL:U)ݡC hǎMl-}}}Ufh/yHMM5]O}oʔ).\0M6\R}>enڥKŋ߲/J7~嗩F;uTDDDPP ")ʡCΟ?̊ CU?~j*b_t\5gffΛ7/44ЏMmܸ_W3{z}KT N>g|>\b1oߞ7n=z=>j(1,z8mذaoyE7o:tn,}djZ+u3gΨowߩYRJ7n5j!<<~SYYP< *((={%K$Iڽ{wHH*gee7NlriDzzzppʕ+ EMO2>Pe%ѿpAӦMŇ|:%ڶm[_gyF#o xΒ͚5,,,}ٳg۷wjr…:w 4ҥ˳>3'Nϟ5k[!!!˗/^y#Iz@#gdaInݺdٵi#???555>>^}ԩSO<(,,Ut5Kw(ZHZZNz.|___qa??b,ytCe.N*U&Mt]333Ow޵kמ5kֽ{W6miӌpqygg3f/v9%UV=q℅v08&uběI@VR֭['fĈ՚5kT2˘;wzꑑ˖-+SƍGEE}SHTٳGMwvvްa[odz-[dnYǏ)ƅ Ν;'O+=߿*iiiʬw/:FyС=z;v2[XXzj[.Eq :uō?^0pww/kiŮYTմKW?iرcbv( `׮]~~~' J/%2<2zXVkΙ3Gqӿ+1$VHlСCSNV3fyۿa#رcuӦM_߸q O>|8ec++_DW^s5;vk͡Cn޼ED*moo?j(|}}[j޽[|}_dee}ʬh|~{޼y'y w߉ڳfҥg隊ùs m3**JNAS*xy# [nUR*UTb+W4r3[O/w;T{O<k2ɓYޢGzX"kݺu:ϿuԨQcɒ% 7r瑽W_}ջwo#˄IkذaLLLƍowIxV|ϲopBTLHH0%N}]ڷoo*:**7o|m֬ٸqJ\kÉ58pPXXh$I}߾}򄛛#;cYfN 6\te\]]g̿-b|eqгsɓTφEiMȷ~+Ә0aL|}}d$56](cwC۶ma6$""Bbi Hnܹ2ܨQ:(F_TYS@$=ʍ;7ވX 5j$Lv횡%-}gjZE+"bb&qb"k#bsM6U@sCoT.]KtrrRG|b<Uf?&կ_ժU@^ķy_ƍkĉl||KAׯ_WKHb|fbYa'7o޼y^P:]KhVӚ,Zeȋ/ӫW7n(yyyFz+ybةS'#5<<}邂8ʁ:%hħ'&K<*TNMڵk:|v%Oɍ7}5LOgT$IUVUsKP?FF8uzuj驌{z@yTܤI9e͓;w1%>WT:8MN"No h*}j*ҠYf+Z:J].vd\\\vء~Jt#r;!<<|ܹlaam۶ÇIKPiT|t]J#FY^z:uR ?1&##Cvpp(E\YŞLJRj5ر=߳jLLR]ZjڴW||NH^^f=5&SNNNtt#G~Ԝ\5C}XFfm"&IRÆ YʧNt>q(F͚9sfbb؋ɓ'O<9s֭[3$$Ć%`C Tl"6ҥU'鎌,_:H$fGi}Q 999ʴ,VӞ={*?u8bZ׮]@%##c۶mb3۷+7Ў*[ڄEƊ)@ea#^M[1oEt9Eg袼Կ~7|S'633Ç/{9|p^OQYv8۵kה=iر/=)I ֢b,zh*u޿_i";t<%-&$Ibmڴ1Py8}f}`bjڄ+""iUN녲Xڵk-[f)ڝ;w'LФI7xC'@7*<%I?C6rΝk׆hOʕ++:w!切G6mބ٣tpѫW:M/J0#;v2K/YE^^ްaÔD...5jprr#7oBSGie"H2%S9Jd%aaaaaa6lXn]bbbMݻ?lݺuҤIh4PYzY*EEE@R*ݓ0qZ"}Y]vU1bK.?$IW\_~]x6g<~x^ooW_}5$$D-bj:h*U,T彥,;;ٹE}jרQC< 1Ȍ.ݻwAqY-:l)%.c嚆*]ʠm۶5ԄiJ$O:t~[aK;wVE@,]MtEZjLǫoVwm6'''+V`KWѣNF|}}Y5/*⬡ƍ=Z,/Nɓ':fkmФmQ!C(yyy|/$飏>?rHԩ{O?fjfM۵k'O)^ݻw7Vݺu˗/ߺuK2Yt'j*oذA͒>Ut5e^(J+ҳgOe޽{ .T$ISWw3j(e:77wڴi6,IL:&7nDpR|cyl-@=m*yyy;wTf]]]G]7:C*Zl)ή_/^,HhR$fX͛U>d6m_b<8իWϟ_*~`OzMB4hڵkNҋ,7n,t9`DNNNxxa#-zdjJ_(J+[o K~ӧKC>|X>͆ "6 Znu/^,Vf1.3;wT".++K<<==M/&rC[ڵk҃cRi:[.v/,[6WX1}ts -wUf&NdkM>]WJ*M<٤rkĉSy\|ɓU> rMCCC4INcР}7q¶lKrnK1JB(!mI.ݖnw߭B`J666Uq/mɶ$˒~|YfUkL^ h|G +%%%==ݒu9L~-Q͔ 667R˩9B3†o9{G|||t+ ٳO+Cݻ+?"kbb_4P(^~^{GꁚYsssW_}uڟxud0{6N{(@n:濴&_Zogy楗^bfu_k)n_}̯R~l۶hg .Ywn_vHWzBػwo~á+**K/)J˷?{Ȥ.#fH1Zj%N=Ⱥό߿74lStҥ'|277hOS΁rn /9o<"hڵ>&o6lؠ;>غu?FŌy'u_c۷3:;o޼{O ޽Lg6O>Ӻc~|g;wlll4 t; v؋E>vttHKK !luַ~.|?я WO~r)\N+?ޚ?ܹs5Mgg۷O$ cY IDATn-YdժU`hhsݺ-RH$}`ZW]]mXoܸz7oܸ "x㍷zkٲebSV>%5c&tʕt#Ll~+77 |K79 ?ꫯoӟ`PzYPˍѱdS?hM kx͛_]lYHHH@@xWW۷t+ Xp?23>??_dIlllPPVJ---n@TdHkd^^O?ѣGO>=o޼ĐOOOD[[[ԤW=Ӆ(PuNnzwe/~@eůoaSC{'?0P!߿) !dc@pgyFV6?mO͛7>Fؾ};H֚hMbSAaf`G.\x}N}#J͏;dddY{(00;wԝgbbT[ci$ksi o޼if^ByW^yXEMtgfxg ty,..6U-o~HQ?x i{饗LhW@@~_ ;|[2% ǺhNkezjK~z/_>qA^|&4OxC?oFHH_>`KR\\{[zuLL}Vu~wK9&nnnV:z믿NCc&eI/~_~9"":ZeeaGILL,((~;Bs C xe˖1ňnHcf8csAɹv~3S3Ҹ^믿>s `ʕ̧׮]'f NkvӶo>>˗/-|Bʕׯ߹sG*r8Pxb;fcǎtww+J??o޼فX6'_zW&yzznذAw&i;@SwӶ¶od'NhllKIIYf%/v@L&ϯsaaak׮}c6ʊROMM]b7b;uww644 :-rARRʕ+M=j/^AYf6e?4` .9J!hK.N>!P0lsŮ.W1TXXw)Z̄Q`zڵ+00Uѥj{zzkݷ(.L IRTwfIBp8aaav^g/*&j7ϘFqUJ ,ft{W0!PA@X `*:Tu PA@X `*:Tu PA@Xg:=6RBNNJ#%.\˛7n ]biά:/BRvuruC\ ̴fQKTdb[ W5Iety횜suͧ8S~`D5 !֬ T@}c#!$%)i\X,qss۾u˚UN266VYU-ʤRYeUؘS6%FSzoTKJJ%]V(%sf2?K2BH֭ɟE,9J~~GBleymv*Uz@etdT&BgwgKRrRܪPeL258,Tzz{N{OoohHزiM] `YGDB!gJUu ]HMINKM#{~@, p8nBںT_oPՄs4B\njJ2cN@Qk4tA*VewwD3.H**1ww@6Nںz):*R BFFGoWFF<<<|~LtTvVwoK$9sBa\lLfF?J665K$ ;2"<##ct}RMmLg&1M͢FT&W( `Vc{.UF !AA}[e*_|}v]m[MV|¥!|/=vS͒R Z|!&z^U:??qftt>757N#p8y%jS%ʩsھ؜9o,!owtB~jee>Brt?:x^mc.]ڍs/ sJa@7-?½6dEJ9$9:<_6T,1׋ _ ׫~~l޸hrIM=?gΦؾl>׋/^LWׅKZ|\gfJ$ý!0\rf5V*u t9-mWZj TǧI̼SgΞxIÐdΗ߮0Jwz{L|*𷃃lt#gK$_<4,AW  RYxFKk3O;V+|s ?yNp\fx_"BC{!u:fqKkGZY}g nǞ̙B}bѓ vvuSՂfA@+>xfS) ~F3m(\i:fvF/1p/|j,Zhff&;q+Waʖ'x<>.Lz70jhhĩ3͢?a .![e.Y`[h嫅ZvlL~;cc}|rKk} ?ZIhE#G^N9NxXX|\@W767 !}}{6<,LN9Kyxx$%& 7D١V__ߓЩfx !\.Woͳbc~w/_-d+h4ڮnQK+-X{>W_~d},˞ AAʮf}\QYu豝?}YzZ TK {L+vB:xzxx$%ćniiP(gϙ߈3=-͋Ǔ+Z&w*ß(+`ny4tgjxS딕iIIefQ c'Oed<=c娜3k\6:vnb68u&3#݋3) !'O_2]rI CC M%T&_4{*\;D)sDžFj|s=LV Hv2YՁJI##": TyAf7~KK6Z7貯eg 9zd2BL&/2Rw|TqS/\V9Jp8 ۶u^Ec'r211qjmOt ]<475: w])r=GɌSg{IbBk?0_~Qq uw}ْE /\NLLL*+_fnܢL.d"˷_][WYUMC߳+*2Bw.<3hY$2Z-hhl$|ȀX|rL 3X(>c^оjRfU+\i9fmm9hgAo%kr|jJlBH]}mL ;wc&p:\F&=v=c*6\e6k yj!+ W͢Bȭ˗-SfD'jK28<չM/JT30QKF.P* &\ [/!D۳+g[s޶e^'59+m8SOD-zѩ !۷n1LsbB3M="*5pccc׋rLtsob4NJR.Yld%+#oJ4=Rb@0gTHp-XR@Y`I\RVKQzZA]ČɼvۗtZy{{3ignϋ̷jL/Of9RSY]WҖ0?;EV[ظ6BLt=ҸMU,ϔ/Rksg6.0'Fِߦ٠M%J5C"6;3ڕV05Ad8b|}̟Gߌuvv\`=i62VaiR3L::*]7>.R[WVt:. Fa B\.;%MֻU~VYggT&35 K4$0ˢOW*oZqQT/??LsM> )uk c-fT>?22T*kjFյR!aAA}}mwJ%S` NHmiY6϶9Ęl +뢝y\ۇ\#n]Q񉌌HLHe>,/f)`6*ʤS/bfk;d[eVpZtTgfϼc'Nљ4]By;1!6 T`1TN6ux按T D///}RbBo_RTJ[s8Fp;sgB.M'a,1fY֚ \?Wp(h]}C]}é31+[nfKYz؃{S cO*ZqICGGXhP9Y 8Xv_2yh< B8 mU5ɮɭS#;:>0Kgf&5utǫk QJgs̜Y6\HJ+;+sI6nXfu͒҆Ʀ9FZZKJoϷv˳Du XFF{45>lvf0ww2}}GwwU+rW*bS2>1*.ߗ;qrttLT߾oRBȭrixXXLtdl=,ϜٙGOTս}tJh'Eg؜$_pXgPvTt888$f+y sH1u[k8<=sVswwt746ZZiPW?|Z%l?e.ǺQoO!x5U*UQ U!V4Suafۘ\t6r~lۖ6<вgT |_$%&I:kfR 19>i=x?baCf1xxx%BH۝v`Ȉ{wFG+غeamtO'[W 59eKtL yanfn ɧԝ]]w>eF0?щ/5٪65ڍ"őщbfdFgDxx]h_Qlؗ QP߮`yqLL4]Je2o;% |1744t-'OO+L>Wܷ6\Sljg_~&gմT~~~tV2>PsW 30ӒdƲ=qrHg ]w;*&&%$~}s3nlѹ;xŋ[j .˴./M"0t굊*SqF挋% :YhHasd*6r3?01Q!9!g<\ݖ鐄_bFY̫::;mmK%:4$.7ЈŨɗBYb +K$V2YnnyZYYcI¢^]S+L h̔2C÷+*u?Zp.2,?%*"2$>>^i[l:vFΕkQ|>||\,2uн|7dm[qummCSSXhW+;áU:ScXx̸oֶRBȀX>  yy)޾g\;Ni";;Poܰĩ3'}q칠Cd2YwO/Mm3;+c*JTBY QQ-t^CrCά.-YQ Ę6ݿԙZvlL~/E{{{jL٥T*r|ز1l`ɹ^`~YmtBC|^^^*PGgoXg[b\"甁=8ٳg<׭\jbKP*rrRUx{{''&ЗM#_߱}ko_? E,>p8ykTVܷڍa)!D*UK'WnkrVorft4=5uռx''zJ2Htޯdƞ];y^iA?0@rss[6w}^N.Rxw|}MкRmt]ǎ͜ޑ}rR"YܵCGP4YS\ru[fO1{[yL>J2Ȑ0BsZ& sž?Kڕ\tvufWzBBc|h,/Xr'///--ڵk"hxxx 2l2@fI\.6_h! TJ͒ҵkV3NWTeАy.=2O 3mߖQpᢨUo.<.v괩#N;EGEzyh?tھ-2<ҕa#9)qۖAGMqlLL{ӥ:[p^ ]F8809:;_hs1{Zt*lCcsd ̸:/s|n\/*no{pef K$62_XX#'<,,>.ڍTuwwOLbcY;:::g09)QoXwV+udbB-Cm+ĭ=JfS_04/F(nHNJ SUTTi4BP(BFFGkL,j '>66=-atF5 KJR/\0ߪYD,?͢#sFCRiuM-]vwwg*HpeeugwBx~YYa!wdƦfdPTx{GFgd},a(1!32:JZ.74BM]qwBDDa#lNlNk/^jKk$1::;39VP(aatƦʪ̌TQ,R*t9 Xʕk]ʌ|/g}ykoYt|E3u.\N(ܷ|i^z:BأK,vCCC\RM̼ TZb>s6==m~`Q؉N5KJKJܹqFjU'O2*o3]S;%Jo\k.شqJdd}rD7Zv!ΔHr"ji1.J|˗ٖlٜ ^VբE7K!!Ǧp}[vv762E*Yx| Bg_i244t;rs/GR,ە3m'1냇n0(dh5E 8u#NU{]QCL?#V,i;i9f'S=~AQ*o>sl~lL4===ں19!$4$8(00(0P d>D27@G^wZi)4P%Fsdp.WUט Tjpc}]M,qF3g'Ǟ }jppmvbcG4MM陘=>a^WTV>zlnБW]'<,,>.V isφIOYy9}p"ccbxRYGQNHyz:i#'O_2]rI CC MbBT&_BC4~DLFLO5kbj:xR<<<CBB   (3LmSlf'.~wB'BC}F-ji®Ͼ՗_v䤤3g !*!;+Soک(qqt!&:FTTV]ZoUmuf\V4/OPhW0Ssg9_RB᧎^<=###U@{$yrX:Dw?ޣO?6`(*.Ypa\l ׮^A}}m6/;Kw'KoBd2g_|/ " ٱ]zwБk7!RfU+ ˁs~ф8N+pQdN96GzY7~KkKٙl69ޫ!KOW$6ó!j+t;~Yoֶ+rV|T\l }CBi*V:#%)!&0Pi3ل,2"\rZWL1k*t|j/wDGE)ˆ\~-(eт۶n]m]MLLBk8:65X"3O68 |'iK}Z]|DSR_P4xgnoϮUU^hSOG*vR8E)w>؜H 9);驩Bob Ҋ "#BT'xFOoo!ǛfgeBZjtuA㪋r AR(mw !11** Ws '] *Jiim`݉^=]J":vۃ0(W(dwpUZp8;o335`Lzm(.48c#uL6o2?a˦&g,GrV288Y[dцaeKؖH9#;H$< K/2NxxSKQ& mU[= %njj1!300q~Ͼzw 0pkY4tJVOoWTҚ}Dx8xLW[Xq-<={a3+FG!캷|ϱ+Pa5fJr^onj VFT;a^ qMo|&ѳg#ࠥ&jԼɊ$}Uٟچ&,_VYZN֮Yo׿5T*DliURH''5uwͦtPʪ[eH.x-7wna: ņB:F0SSoc jN)Z lH,|'4^r3gG;28 tuOJc᥮̌ ÿwtN>LMqE =vnhl2di0cdlG).pgd'32وwMfDGE ZkjefӿBnnnnݔ|!mS]# QYU]T| O>9If /^$u# Qk!79)YvGєWGףںzBA̘k!(pe{F!>r>c!`cW'0 !244̹aOԨzSJmEBTO eوJ5A' d#͎s jGrI-ӗװ# sIvb%1\RԩkVTd$1P'CeU5ӰP)3R}|GGzzāS5Ns32 ֨ݍJ.`|s:S/^!::tG(2 .\j ߓ7|kBFO{!nnn=moXEʰTt2ݠNK \.mpp߮S qQ%(!S*.No*dTGLt4 Tj5mW;8ǰ7!$6:NVTU@[Zd##4"Y=u`T>?22T*kjjյ]!aAA}}mwJ%0syZ\RPLpw(XَE s"ϱ%a*Yõh \d/:%He2۾81T-gj !JTuľY7٩؉S}~*iɧBJe]}mb00xYDѻP(jȯؘ֛YYt&9rVLt D@IDʘlؙקT*++ R)m6p 7syѪ[)ʯ_23oXT-6;egeα{?]pQ-7o{+.)=xS  }||<='6jfa)!YԒvA FRdge?uZնݹC_0kY`;6&&vR$/k$%@uH{GXLadfFb5u4P3{BBtzCJ\l, {z=\"p.*S0BuYJnoSpwXk}ZEeQ%:/RTNNf,;9zF)9V1 I,B"#k!4ި[36xosBC{z5uYLS_ZٙGOTս}CCC~~~ aN$_pXg Ʀa܌6cCѺ>㝿O_蕖ŮX!vb|9S ?6 ǓȡaK4wyi mjdQ]5lIDAT%LEV2وceN.]-[\۶eUcZyKij:T̨u ]=L4 r`-_0<,h*j! ̈́9s̿{~ƄxBT*c3øm5#=чwBv?(i@?yk(P!4jȈldu"j%eSsIXΣj96(0.6UXvb&IMI6r|dtrML /7~~~fs`HH444Dg6TisxE+3]/_)a Ui fy{O^dnrWm>ÒݙČd>**cMMa`vvy.EFhl3i=b@YW B!!dtl{r wwKKN-6&'M&V `v*˖.f;zwTLUt?Zq2fȚsL=S՟}53U'I2W"MS> utvw[nQn2ڟZ.˴//hW^2qKX;3SS[RtיNLv%.v93uF?!Z~ *eI^KtАyAT*mr &fhأyV=~TG':܃pLJbwf8uuMBx+e-B/Okީz|'CsAs d^PIm> dkJoӇյ MMa>_9`jswwp86fn!~ My\\%_ 822=RJ%!QPJW3^ۊ֌9/^"tu:rtϮ̧W 546Bzz{ .\|p*=vxW *QmmyF&gq:z\.w,]'=5uƶ.zzxGϝo S5Iy$SMÜtPycQ@!+,ζuMmwP7Koܷl)H1'Y !۲22 .\Mrb׮Ym _k,rc֬13+ Zt*lCc\.tn@@Vfё|}|ܷbH3$62<ҕ #9)qۖAt*X;N11U5z-X|¬̌ :ݔ%>6vE%!=+#ݒ$,!&QJ%&yYg kZ__oT({v_W*љU##K/*--J=<<[y!f%+ C = 1>8F55zz{GGGq&'%ZVQ&$1wTdU3ZyTk뺻'&^^G?-m==R_jJVqrv+udbB-C->¬``m^u6]]s*U`9*=ĮQ`!*:Tu PA@X `*:Tu PA@X `*:Tu PA@X `*:Tu PA@X `*:Tu PA@X `*:Tu PA@X `*:Tu PA3i ިp] `*:Tu PA3i ިp\ `*:Tu PA@X `*:Tu PA@X `*:Tu PA@X `*:Tu PA@?1 ۂN qAHA<'! 1l2LG!inV%:H1(b؂YΟh:M`F'}8eZۻާs}Ѥ/}T@8!Ap*CP  T@8kv"(hTQ#˲b)..e0BXY.\0(H3&tb))))//'(r''ree,˺TLDPpSSSe0Y׭[gt\Tp8-aTp8 zzz ju\|R/^|G~Guzm;v{$i}Y~ݮJ{)ZJQUFHqƩK.y{=zU WIIի'|o ڮ~ 6\_555%t~OOŋ7$Z2X H<x~֭ .>}-x#mzy楡BuvvY% HRfVXyySO=Mĉ!D"`0Mg̘iӦ4gH$FS_ǸFy* Mz{{7l`i5544hOP]]→ctWiNqYE"! Hcw4g3)STWWko^:ttŊi0:fPVѷHj=6ݳgO59'xBڵKWǧNZWWgNХk0#EtnuuuVUg\X(q__$,WPP`Zz3JBCP `V_֦]]]g~%KPY1zbd: 0AiiU={;fb= Y~MwyeulXo#&ƚ]~vLq3w|]W%s̩jYYY,rN2e@*Cլt:Q̡6UTTq `.G">1nֿܸ֯_?eee 0Yyq5YƔ`:Zi***if5y<"m:f̘͛7WNf+//4WqTձ`YYYc-w9mz]v^(rʮ=АA[WCw`&v+--+mmm DRo}ԋUH) 0n_r6͈0}xuuKL)8,)Ÿ"a 0A `9x{ァM,uw|>2b1bY}T$LDP8qb|޴i:1c޽{|Iݻw>}ڤ Q\\w|Q$EPB+VЦ{}?캺I&/_r+PwU^ _#A" nsݢ5=ztҥv]SnܸQ;(J 0>cXeDJX,T(lu*ZX___UUyJI l٢ӵkΝ;Wر/Hw)))eҫ<rm؉'ȉ|>_8֦^wɃOhhhUDZXW^Ik}FbNĺ=~ڴi8oݺ;4"IηzK.X`ժUCΑeyڵ۷oOS}+,,L%R,}H '… r\Nx^mm۶>%2k c*Ad j `Wtl랙 }۝'rrU M)IWT~w߭{zzL̙3;wԦgv:79[r6wm`}inݺD/14$W2A`pn'L oyɖ-[i0joo/))%J)V5ԄCP N駟0D"$8gϾf sKR:p˓(I4.tb[ŜNgccUJ)yyyuuuUPP js\8;;kI@ pwぁwyL;yUR$IlI<T-Zlٲ߷ɓg 0mڴ7j_VdYv\ DEF7z"˲b)..e| Ap؞p*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP  T@8!Ap*CP I'IENDB`davmail-6.3.0/src/site/resources/images/android/androidemailaccount6.png0100644 0000000 0000000 00000236014 13410710541 025121 0ustar000000000 0000000 PNG  IHDR8p]sBITO IDATxg|ս>3{j{mٲ܍ &!p !! $RhM( ?ތqmIVj_l#~x]Ψ1Ϝs~?ormoG K "2LE)VHgZ" <&{;<~: A`IP22\:烈44M!]h~`qxO,K|1/ "^*M};\U49jEyᚷs6${K Vɯ,XibB3t=_3aקX<^y:W CF!s憑w}(R\jIhP2 mfkZAJH0!nXH2 !>Er)2.V駚Hqx}&1?nb<^BVUʣ}BR#[LsH)rNnPlvt]^SOGjuZ99әO +d+:~ qntYl> [τ-W(ѫ# ecBJ]R ~G״5G%yVǹsrjؔ!̳s3kOQu;2T]VY|G365ja.1:]_UFT-+d ٝwǸHh CHkuj 4I YNm^2ѐRfE!N_kUa^%A&nWKC$G5a~nٶtL~I"tsdk$u)hJ:?60{`߰5?,]J>Erʣs; RjS,V܎V0+rPȧ&!PHu~՜oIRgdf3zˬpQ Q.,W00LfEpь'¦yW?btšaHӘ%b%_`G^F#7f7f !u?_t iUzuWݰyAO ,52 dI7ȄgZg{/>_siQvZmךj홿!8"ҼY_gYIrPIfm|P]i/J, /C#>駏7&%P\YW [FQd;3WNrtKSK) o.mD#/cG^GOo49?݅j=S<Ԑ{)4[r٪) ͨP +"C_cݲr9pz9o۷eIBVL~A&=rn}wG;VuMx[4Aluno-B%Y7.Oyve4BN*NJ *ncVjԄ# \HzXc`EP({S1E*9Ţ7UR3qQ&Yg2Է|hI.?@5y ﹺXc{흄"..̺,x~T|4l]ICY! 0|\ӭyUR0grɃj5 Qg-=u#ȏnl+f5'-%j}{O,3hg{ZV69?y|p,?k`W7JYV>-7殹D&gT. s>Y8`I 7WfDTS4YU&M)VO'mCg$Tq;[@D|ˋO M {V?v!@/ސ3M'L?}IWH+RcKw5}VG]ۏw]zSM9jhRl+d?ڰ|y.9ͻ ힰyrSK 4uDn{gt݈"wnSQ!:;q|p`LT!R~u7_KŁY+S *Jݛ)} 'L *T6|4=tR5lYÏsaߞ}=#wc[]>-/MfK3?F?`h5O_X*B ܿ7_ܞ^WŢ\]4pu>x97|rh[VS+n]NL}#R2d)dr=C3f%NTK,K. 4px 7Jr‚Z,okyHCԕ tRUA!`Ȍ?9d2l}t욖!YÙ"TXQ7t=~\~=7Ui\Ų?K6(ouܻuU_*Ϗs⳧[_h>K 9X0 |d݃me%9WF.+ѩKtYkv[_o~;QǮ_YrEiO>>zrӈPlJ鞰=z.<]crZ:M)~'Sm]We @"o*5$)2q\Bf^`"L>lPS ,2oȅ5߿79d֛{SJ\rsMń<6ks'B'g٦W޺2\~)/a{P>mx'C^kg'&d*"L|}y;*n-V`/7K*HФBpPd$ rIdqkxLN#L{&ԊhK%GgKONm'aEӭWzw>,<:">/G(K"Km$f9 #d76OEZUNuEinڰ/7vraÜ%1xY1뵠m?c]v}ńlLbYGqJ P˷f(B:lПO4Gn~ñ3yEZY vt`q|aA&[oݶSø8,Ы΁6wZl  RTu>O%`j%AA%x9d0w"?G ;Oiw9BO#)EBϮux}b 2\ I_]J7`D<}qrwxƍ.Ϗveյ!_*g#lNקq9*/[uY%Sy6"ueۚ^g^cNvETLfsٺ6hUB?h^,N;['ai0㶎qPA.)k-eBݛP= t3t{N&<ޚV=z)+oYS9Hfgri("5r[nnfj\(=^j5;5p}ݐL'x'=e.]!R/+y!dS{q@NAGNo1Mz-RIR~?;u a WulC}#viB@Bvצ[{KG֭2uW^ViMUlVQ)P; 1JPP ,|eKyJD JrReBsum?)eeu__slpl[nz暊!3,WWD.RHIo_[y[W\]Yȑ?bCGXJa:\յݹ~9!dKNZXPiUP srgzCYINu^)NGFvaȄm^랰=~>C1̞kW/,\ AdWS)D°"a9, -}4_;{gjwCGPOWJIJZjŘuNOkku^s튢1KSԆVFH;2yN*~`?75`0:r갾 =;?:iEݵ㍣\Z 6${Φ;z߭.Syl;\B+WߓS^l蝰?\UTzKNr[:sR~`oB_YBC犳R !$G(*Q̋5|:4U\sӳT+O22Eqx}*8d7U]XxjtDkӊ\޳D ȅMA[LN}{jǭ|w@WJWW7T_ 90Lx{n[zpRJ0|4gB|~J1#JF R|<jxMRJST{Sl?\|}ٮ2NwM0?||dxHPPayR/_Y3'PU%rՊbX ̖D%PBh9En5O]q}fjd]q[sҪR 6B"k*^jǓmxlWg7NO;{ЩrI\,"b'.{1˭u!;>`V* |1In[}yIѴa]VUUB,Q U4>sÄnn};?<փHDwm qے\͔B&RfSM^aP`ud0Bkckx'ܞ?zBef;% l'kKQ BY%h !d<7ryI.!"W*[YJ7V xŗJkqO9+Zi~"?3U^k>fUI '>L!BEk;>~gߺL]sx}V{A;\@,>撰gv<Πyg~q.t//Js gS !gӨ4hF7ʥ?C[?Rܵi!4衺ޫIjR$l !vgpMd;hsj)2,ɶV._lxLoYXp\W$nFG/5v&U/ۭ#8l ;ZeNU݆*4U&%dK`GB" -ApͶUnpk^{] q BHq^ܱ(L!D IDATIE]Tɖ`q;g](^_.E^ClRGQ^ǩ@u,zU*H^FQgL2#9܎^`)ӫ*!1{kE8R!$M.4h/*Ȍ"Bޱ].l-ѩuR%YQL-* !vTVul## P[(LPkS{K97;-3hu ޷gA !Abt˷Jߙ@ϯ2.)ژN/ SϜr7* 2 !zi"D+S29]Πpmp6٫|P@IEklP+SDOJZ}zrBM5n?śS !N/ǝ%:5!U%K5lcʵylZzuR^QO̠MWH !*ܳ x7](;"/kr%:B$|>5eDJ*iJwG <Ӽm؟u Eq|kRB[ Nn_,]1C=Xt֤I7Ȅ7U]Zu|p$ue-#g:榕5:7;93:>ȅRzs1n}5Oz纪WŽst!w檿h>5lZO ;Pp_.矜Udqx}}V{JAVS4g^1HHDֲ  *B¬^^45xH1nz _#6{(BF-ʄ|vB$\>J.B"AZylb]\t=6!hQoO[&괔Ю a^iz-{s*1%'mKNZ zFn5 xPpD}u \V>mu^mu)xز" ;?}|nIqbP׮(ΣӼ;Jma5%.]1ǔlz.žd@HhxM4ȅu翢$'grFeK<Պ{x:xMF̹w$"~ey/nsm;;\5lwށ-+LAFJBkZ8Hr_Zhaz_jǩXmw'z's>Zu~KN?!{_k0?]&p'Z꺪@sa^kT.)9땦wEpC~F 㧆LGGe䤭00 d)իRQpyI.ە鍖DըNӯ4t%fkcV7R;_n,ӫs Xdx[-Mx3'9\WiU GauuMA+]#(3.:l?[VS{ha3G;HɄ33&s1:#/W`GQ&#P5Se/Ιw!_8R * !L9d k]tRCk~ۘi,Kj8k,{0 H?ݼr{nT }'5Y ˑR`ykcV*miw`$h# *[e6)xiqt 2 !XTS?mշ{}§(!'S4k3R^mn6n] 4Qg?#RU"j Oؐfsٷ]Qb-;9o~+8\~k_^:&[htjtj$jSrrX$,nϨu4Tカ>!PE7V``7N|@`IR{5JZS Cu~~1kMݬ ~~ݻ񒍚) 0 Z;W(ͽ"٣M' Lv3̻mo[[ҨW:6Q0^?=6۝8pueJ^'Vhڡ۽nǍ:\} Fm|M7JYVQt)CŃ"5cHDO^!]!{[ ([`wy~Ʊ?{iaF#p fT H~i3*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9dVd4=f?8XTW&{ͽ}R>LJqx~`̖A ăOv]YL=*1YJ!GߨIHgvxo0>>3ͯy?HFK2!!61ۆ)zpBȕY/e7RQ藇=fM},um8^~e6Mj7+?mwV o,2nKUB~k lu}44_*%Bb.ԮɃk;F?\"TUJ*?>nv<1A)/"3BB_.OQ+47 wvk|(>* Y:*)Bre\,1}XgF ʨ'(L))SJ{rXnEE69l&NgLȣ~ZCXG/m,*ːy)Ë4vT^9EJ &so-Shor^\yk`||f-UiRk{O3 tͮ_%Bxu .Ȕ y{KQ2`O.U{vT^5ӈʻ"3ޣZ򻅩S`!Z,)*ᾜoYpk1+sWjdS\Wzvzkt'byn-I}T +5Y+pղ7-QD_O\ȣ^PtCOsQֲp&FTyeO77j٫KJbK&="8 ` үpFV׸/bJ|NvYSjtF6O\F jo#ӯy*Yۻ7Ƭ=f$Z%隚K4wr9dF 8"dյsrf5HamǮ3 ˿4/ xWm˽+6"[oIsfT2ec#oLB<= שW7Dc]'szxiH-UuREm ZFh*>:tm^Juf )i^9o~3wvL_'}uˡ,*[t[xZo#Msp5)b/gPio LW*N[4}cO|.C#}zce:.;!}4- V3 ~ Ycs,> ,)f~sAe_3z{` [~To xViV5T=^!X#_AKZȯPIJJlcJϫ}wbdrx6340G\ö:=w M77)uSI䡙Ot>>av(fX+$YRï:F[*ߗ#Tk;qGXPy/՟XBEы7Y]5?눩[HcVB堒3:GVɖ苲"cβtE[OK}S 3 芲~YJBº( Fy v#Φ5?bZ8 hcgc@i$u2 KT*D0+ϴT)Q C BiJHRQ֣q+j)jQ+VOoMAc򷎑f7\Os]͟p.XPtzf]"S[%ayxYRQX?ʹM,MFlW èޒؐEu(BU`wNHNɷ6wصڒ5Fn@7Lkwzž)Pg{ݎŒ\~~[fBHL"7 aWl|{O ֩s9{N?Ez6ghu!7@O[T/JMxP2M'z~XwңF@Q-LM֨N+w^gq;R7L481]/yr*jmx"Ƿ?▿ 3qx>bMkt^/N [Ad\3=9 j:NHcIRɊB՟~^..O.[[<kk,,W8E?(M!g"nAq̛a''Y~ ,u1O &R^hN3C.dT76H50^o ٘bc4+eu7{| ZvC!ϜoT3 V6?%_]Q_b 91TUd IDAT2#&{XO(?si-6wCw߲è~n}ad1Ĝ?C/S¿)t ܔkrϼg\:׃u(칇WdoTO| þ O ћZ2?ER5a36\`-oKhdd"2ߕ/oO YYfuMb/^ፈ%:7<2G0U"|*MQs|ctbɖM/m,Εz˝eOxL+z- z ]WpMnJY[ +- ]0|i`gKH7~mOquݭeӜ` B53(gSm#a0?ٴY@.bmf7f3Z`>u6{cԽ` go>nWUy8 k#&' zŎTfFnoM̙zicl-SmL˞{ϴgl- RBB밇$;Ov+>N Y[pM?=zMlgL!(M2uaV;G:ng5JiM噚{1_/◫kuϤf_(9a&E˛K~4xdE3&Cǂ~VyE&k:K)+2_чu)m 07x+[Fezw}eSq,A\|kr&~USl],1gzlѩWł7=4cѶD?H֝ 3{`͟j]M Ya9ڱG;n_95hV~^׻ӏ5Oe-n񙰟C8Gyno-UŠL4"f]^S}iTxaL)I$<wfᐥ zp!0MSJbqazIЖ$:@Ox}&~\0?oRe")g.qku5*ҭUB"Jx!^߰{dd‚)_9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9IB`F8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8A8Aw5mO*Ѩh!R4PTDd˾c6Ό|3}d)[e*ʔ *i[~{vϽz>:}=9~ PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@xGChbbb222!C<)lnPƴ!PP#G0 zj ј4*̬)S'%%%..dц- 9|pIII=~}}}U)‘ ¹s0L:,^822urr>}bSVTTӹ'OTueQFyxxl߾\|Ν;̬@ XfM.^H_nݺ4Y8֭[wϟ?ӳ)))=͛7d 4l0ZfMqq1=maa|穭Mjii?Ϧ-MD*"->*#G}}fVKKkݺu ."@tѷoݻwWhԩϧg'O\<.4M8AnP?DDD|MOO.\(oWrYE(:22>|ݻĉU]"G"4>< TlllMg_GGGYsUJ(lll~GUÑ ^g^ĄڵkWby?}tkkk@x'{---?#55533[r%WmٲeǏȠgm&~d…-[qYeee-Z011ѣ}}ϝwz{{+w(..VSSkѢEv<<>>)));;Ĥsά.UN%G"2n\BQɴTMbQ ~;x YZ\)2,XVt;;Eeggךѣ,L?zhLm۶ɲ8)~w}Yjii:tyƎ7UVbӧO@@j3l(ښxŊ:u-˗/Errr"'__K‹>7|#={&Mddd$vڮ]V5_' _hAA+:v(AP [}_~oJXXXΝk]Eyzzɒgqqܹse¿_~ϰAmz##pUTT++;;Z&^‹&={˖-K ,--+z)V#J]]}„ EEE*apOTTT|7CU,ejm̙3 XsY}7Q\ ɓZmjjDKKBqOuū*kʅ ]VZzfڵ&qqq5ŋƣŋKM ʷ~+lr*w geeeI377U<̤? ϰmz/'0)Xׅ T|}}e, EQZZZ퓯H.~АѬwȟ7@dԩ2޽{ր[e)(cIIIi׮,Y5k֬gϞ' T|$\VÍ7QoW^-}!!!dzI {2UWQ >Ç̦Xpa;vlذIOQI~:v쨩贴4y}zAւ"H$~.FbR7n{\rE .]"g}||$fE“)+vT!I6SfCCLۥKhs b̓m2M&SWW?y}͍L֪UI&w]JO9rR?~>A```}UGGŋY}襥333-OTTr$w.SYO᛻M6̷)))RVlzzzifY׊x^7EFRQQ1m4rӟz|JWWÇR)..f&%ٳfffb)Dzd.ݦMl &%ESL,55I-duvm3lЛ^7%4@ed)MiҤ]Jg޽LEСCRٳ ysrr+Gʕ++Ν;̴@ ظqk֬!Mk׮bfvΜ9b_mݺiZ]]u w.\4t>뵹xiMMMI)rpp j555W\BOL5jԲe$e8zI&1IIIo߮KnȑRo> |ɓ'wޕ{q\TY, 99Rz ړiê؛H©XXX;Ǐ7mڔ_1lٲַS6jjj7ou3cPnYl'zrٳ͜9Sz7熆_~%3;.\LKoYKQԘ1ctpak֬uիWΘFEJ`ILkkk׺C.YD]] WX{&,ڞ[ .,eϟg544\LМG!KE%G",2n\B\lnWWWSt)o޼L7Nz ړiê؛H©2=cŊ_g?|@t;w.GTZZǏݻׯvlFFƣG|j Xud{7oA w)))4s.2lЛ~555+++ُ?r_/wJYnnnZh~~>ٮՕҥKNoz jIfϞ}1T+WYiݻwuRɑR빌MwLJ#UUU\gff>y߿UɴaUMbTyBQ>:QYY%墨0W///Lƍ2q &W #22sӧoի9ͰozOTXo )B/_\AzR|ǘ&ٙ|Wҍa.ZeGQj>K%Gb]punsO6|BlSNUUU1u꫷T~2m|{#X8ՐPp#G)-[V&Cv߄ذ'''}JΒmC%Gb])p{ns8;;3w222X\W&&&cǎUkiSD©Pzje&ZnΝ[ofc4joo_RRBC+,,حgI<|YJKKj*F U[Y?fɡ9 `ر}xxx|Wݺucu{E)=b!6=OܹM4~9sڵ %߬m۶ y6ذN͚5;+VY\ B!JDqt)vzs3&,,s`` qP($;PYdD*UpA*r#CO>UVV~ѿ(KKݻwgMy󄞞遮RRR^M鬮޻wUP zZZTs& IDATBVYݒ[UJ&''}*,,Tr$֊Íӳ{+Vˣg\B*ϟ'PJ#|;6!V, ~ɭUVtuuxǓˊxQU>L>}-Z0/^On\dM[}ӧ_|wN:۷OtN/TiAc ^FP' RSSUUHMכ[SSѣGt/2ܲuɴQV bqqqh5"Z#YYYIII!CdO [q<455gΜCak׎e7'~ jLM,.,.:'l]H$)pbR&;8[QE$ShܝL1U썦b[ TSիWeaxx89Jj{+W!%%(sϓ5{dՅ kѢEfMB/_}IOc0y,ݙ'dJJ %\TY\ +'Tr$AGg=7!S\ruf@0yd/VܝLe+vW,\kZ1EEE:FGZZݻwYss?'O=ebuW]]]OjTW^fff999lxx,VϞ=KO/)zv^tiMM e,X@vҷsk׮IV(Κ5iԩ\gMOFAJ{3zh,'OHIw^rSvؑ ]d ELdd2l߾}Æ G߿ZZ4\l%쓿[HHoB3{ݺu}k,.̚5ܠΝ۹sę PF*9Í]H ƌ0!w/V*"Nh(bbZ Tnݪ|uӧKJJϟ?ֲevUL/3iҤׯ_=}tƌK.%*y^يI&iG?`FZ[["JJJL~єO>>8p< amڴYjI@@СCŞ&322ƍb zs?|P҉-}bԩ?ToooBP V]pTeq}cfkjjVZxbfqƩS>h*9Í]H9[ε6:UDLeP*vy59hCCڿrVY,^? ?1220`_|QPPz tbk֬aٯ_vUUU}ykCif"{x^|חN^__ǏiiiϞ=cRb?^Rg#d;T۵k[n#Z[[K\6Moll\\\LOIz)pʕ۶mcf `mm]^^^TTD+݃țg޳g+MjjAunmmݬYw^1b|h&M:s N>}+SS씔;wUk۶moܸ!‚-BqO2̼⋼GEFFƜ9rd=$rQeqt >}ZXXggg'%%{)H\Í6wvv/l2?9*".Ny*իhXm/G& ,`u)KKK٧Os$_x:thn~~~O,Kb555__߰z ?~|ڵ2nܼySʾtL6-..nݺudhaaqՕ+W~+:uyhkk׫q{yyih饺C7nwrr"[FEEIVOO?v횷79w\`` ,tڵ g϶@[[Z!qE8'CCCO8ѳgOݶmۮ\+*,.8::FGG\Rl cdd4qĸ8???%Rё(7nB\o'6oޜJW)d*#W\y‘ >|WTTӺu=z_~=..ȨuSl"''ʕ+EEE&&&{B0<<<##ݻw>}׷1PBTSyyy/^LKK铁U~|^^͛7 *++􌌌u׀wwjhhlӳ-8"'4~Uxxxvvvaai޽eox&,.DDD<~877W (侲BH7v!.6;w_ϟ?|}*"Le/3o+vbQ *P fϞ}QzLJ)hMxK(FDD0FRaa ;vx̘1-!P]v1C Qay iӦӳM@.]YXX 櫑#G6@@fΜYTT$?~𔾾޽{U2 !P#kkSNy{{ _PQFuЁ555Uaa+|{yy=:@#w x *;Tw PAU &&&##2d ÙY޽{<M 8r3@o^|9sLfvT MI 6l%KJJJT]P=<'*L:=y ]D/җ[n0% 4~䬖J<]@7uTɓ'0%@gmmy>{ĉ.v CM͏?R`94A~߹s'##XMMEڵhٲe3MNNɩlٲeΝkOJJή611ܹGKX'޽344>!!!&&&//u ӓo镕111EEEFFF枞u*r^xAg۪U+HIü*CCC ʽ?pZӝ;w MLL<<|ݺuRE#uu|~={dff2ɞ={v!9=sLFF+}}޽{wH=ھ}7 X_iiicΜ9&M=0!!>}霜ݻӳ} H &9vwO;wSN?(*%%姟~w6ĉ׮]KFA7o bruu]x!Cd_ r߳gOxxxQQ+@ЩSq͛7O5@#~]~[n~mtt EQѳf2dȋ/d% KE_LܸqW^7oR(***:p{\\\LII۷5kRRRXQ EQsrrpBYɎGŕӦM[t)Hҭ[͛7^RURRr5??RY pB77`(?,aUUU) K(233sttdsNvvv:}Ǐ_ :A!=^6lзo߳gϊF)El߾o߾B޽e([n=zժU)VRv ZɓQ EQ555iii7nݻwhhh=D=P9pѣoY߸qcĈ999$.++rʄ Ҥʚ|pȐ!{r?x@%dԨQtEE,+̴d)r[^^7/T)))&L(--t钏OoUU֭[Wɸ oĉ[n L*T ~,Y5000`qYYYff[\yrϲϏDvpp066 /^xQYY8++k{P(;v˗/utt۶mLߪSrTBQ;vذaĤ_~;v|utt4EFFΛ7ɓ28q{Okee۸f999&LvZSBI&MvӳK.>--nE555UX~,5k֣GCC?}?<~x….]S'III8_~3fإsZY:XZZjhh?|" .С;eh,]46lofnnJe˖~lxxxDD_SSC7Ұ駟&L@~1w;w0;wnY[ӧ̬@ 7nܖ-[7[*++??pz(ooaÆu͛7dHZVMMmΜ9?!?Xz5sٳb[nݭ[Y]]nլ+ .,Z͛7?rʠ ^B)===k؜333I郂L8e_UWW;wҥKY˗/^L:~8=ѬYe˖-[LGGɞ={֮]GzӧO;DuUPiii{ef6lذl2VK.-\***VX]6:pyuذaΝ4(_`3[SS,R^ʊR(رcHHHǎO \"CFFY9~8{MM3f\zNƲ.**ѣcǎurr233ٳ'˯+Wϋ~]ve)?Ç54'qffjkk۷oÆ Nh<[Z?.//;1]LxzzYocܹs-Z`}fVBQԂ 6mD~rmUNU cǎ-/_.P5lذVZ1>Ӳ4t Tȧ`ƍRY,/.\ O^XʔPȍ@WWW(.$p]6館]N鍌i{Oruu^SSe3nvwTrd)jV2??ljJ buҥSN-d޽˼sBQԠAľһwz9%є)S>>S<֥vpp032v_* כ*7oޞ={Ao3G ]T O8qd/*k]$2b >qDv)o\rlg!PvӦMۺu+UYY٩SXF/ٻxJUWzS&U-[ܼyH,$$$$$gϞު-'@C[ر/&&&*Xو6fyHE> /쬭1N*,9=IUWzS~V~~~K,auP\\sVZMK֛ǩ*!&>^ [hLWTTx*u5~xf:::+r6 IDATٳcڴi+*wDU ;}˗/۩S'}u $*YYYIII!CdnUX\%$$$2j׮9E@EcG%c2:uK.1 _%*_oi(U3gΌ!ǂcTX*iRUUvYÃ0<==ׯ3Cr޽{… ^%\|l%5zχ>W/_}IOcU"(L@Mjuuu?a i;vdf333kP(PҸ2W\R^Aey>00BCC9-&OLGGG:u!aqUA@@-\1ȎY Oֻ6:|V(^Zz8֥7`=Аd˖-gb3~͛g+~hKܘ;?~ܸq#,#*_o\sUj\O'׊@OGGGϢWJisKԐ@+Y5k̞;wnΝgff+w,-Y!*22_Oo߾aÆG?-- nmwy5IY Yf}dԩ\PÆ cEK+JUzS8>WG&r߿ɓ'RݻɇׯhxՋ4iYbccG=|с 8/%EQվ}y1555VZx138 ԩSTy6mڬZ$ `Сb222ƍb =>2&oޗL2e=y֭['=h)r`wݳg.][UM\899}laa װ@ c̙3SNCС^f,_חiݻ3g?~LKK{)###F9E]~}DDBG``zvvvRRϕSZ-YgΜa>~k>}+SS씔;wTTT0ڶm믿f?޻wݻlQQѷ~gwwv}6>>֭[b.JXWάN|||dʯ>W[ly#;;{ݺusqqn֬YIIIFFݻwY}>|._|zQ9*<7P^hю;333žnllpM擧O2RREQ:::AAAÆ b>,**"ehiiyyyJOuuu]P(um۶b ?~ɹrJfffQQk޽U]."""?~+mmm}||j}ԠZqqq]aaF˖-mmm===M(gdd{ӧO666^^^2'J( }*˻yfzzzAAAeeQnd޽{/_ҥhMJ T{/h PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw|1((HեEDDЄhedd޽;//k׮.p",,ÇǏ:tM&///44nӦͰaT[h>}cǎR4t߿ĉ?~7n ME T*++srr JKKuttZhѾ}{uuusHNN ]ti֬wT߾}ܹs}ƽ@!^|QeՋ/BŬ&ULbii9eʔ͛7sZ T"""?~QVVF~caa<`]]]ڵE_АB7dXQP{~6mڬXBz]}޽gϞс ɉ!mš555]vUu1k/GGG/_ĉOEEEqqqtnnnLL W%nఢ@ǎ{EQzzz ,rŋ 6޽;!!PU\\m۶M61y!iܸq_~%EQ铪KYxz̙j{3fج444ԪY---. ̝?&G j+ 8x.!!!**6lX%墶ɓ'6l;w"*,;3C??u wޝ$zrrr455߿_RRBQTMMMHHHŶ:thxxxUU}~g-111;;(C`jĈ=zh@ upph۶AQQׯ?N'(..޳gϒ%K:w_egF}bnnvU"##=<<:vB@@%##Lbcc3gΜ6m0 gg:88)'N3fP(Wοh@7ofeeC Lbdd4m4gggV1cDFF$уNJJzjOfdd3fh޼͛7'ukPIII޽{KJKO ???)PեKc2n" Ǵ(~ݼyiգGY:;;=|199W^4)))S622~*{5=ݲevډMVPPpׯ_IWW^+**J򏨩OiccS뭾Ģf͚YZZٳUVҋ]Qb&&&~TMMMOOuֲAY<}Ç?~644qrr9/^xqnnnYYX?W^}QCCY[z],zZBz]v-[dg֭[2%Q&&*%%%鬒TUU=|ٳg>|644pqqf<;;;..DKKUV;wSMļC޷o_Inܸ-]v0n߾KJKK###577뙲/^CC.]Hؙe)ys2ر۷o)JHH, TRSS>}/իWÇ/OÇ͟?ŋyXBaxxxQQ… 9**? b|QjjY;{رAߟ={6##cɒ%Ri;vի[$''/\Ȉn߾_I꛵޽{sٳ?@B044ٳ\S&U=YVVe˖$ߖ>fi9\gʔ)-gφg[nu޽{qٲeLׯTJLmٲQ63͛72{SN555eMLL?7)G2kӦٳ+0z6**jett41@ 0aL͛t[gN4I9<b._:w‚I~KEEE@@@vȕziǨ~(B6>j\\\FM}'*88(552ýWVV^pF]4cpT1vYEuIR2&()f)''GRB_"cǎ?qٳgΝ;GסY9X鴵f999eee@Ix٠H93؛7o$uLOZ21,ܾ[VC ___C_SSUVZwoenpfff:b4ŋLi%KθK.e6\fff:fXu>e֪|Μ9}1bČ3X/0oeƙqMs bv]Z|(f͚5lqq'įbǐ6\oa1}tVJzc455}}} |´D%q]1 A#FQ4eժULBQעE*u*@pqgLVLG@|uttЯ[&HIIanu֍l?$$$3gÇ3/?}9sDCCc֬Yb_uСsJR#o^zE)E*jMM i,_~)hk{1]v;880ږ۽9L#}}}Yf~t+v )dNrnzbrqq133cf۴iCvK2dB͛7oP1OnD1dQ7Y3MDnZҥ u*8֊KUϬD@]]];III6<Eݿf$<ׯ{AқRUDAPET,a7&j[Ѩ1kS,CS]AP""]zeO ,@ϫݳgԎ9.;w`{-+YN+dWS_^8]lvq4O8ƍoKy8s։,0 = @!xΝ;/^H0hРyɟ#;pZZ۷onI;:::/ s3a. tW@],8f.]TUUٻP˟m}ѷ2sf{ݻ{xxۖ ́1Ŷ {4&:0'_S_EnvDDSS T$[ZD<+6򩪪ٓ8DJS-e}62@ȾVUUqW6{@E*/_$#$"/蔗 bYnST[:8;; 9r֭[삛MQ/^TTT;3jw _9sP(a9&Gbiii=f{M˓rnkݡ_.}AR5OYXX@V)P~ =2}NNN:t`L9s&y C*..&=6m$ǵ… sss6Ht[[[ߟ^ŗ/_?t9ddd.+W볇GV?r6nE1 Y̓=͕v-* G@j՘vvvfIIIIII`'s[YYu ZZnҦMw%5ّgϞutt0%k IDATaB' iX}G"u %@߅9!),,l|sQ:Pm<-A42ƴwԉzK4ZɒF*C~H$D<`2d/wb1J7sΓ'ORRR>h!!!Ǐ'sݻw733k׮&XSSsQo`y9S}`8Ѓ郪UjO4-,%\&ZnW?ᅢj:~J>b:-pȨGvLLLXX{w-6Awr{ \*++ǖ-[8Rkb=&@$ݿ#eJJʬ9rD9Ћ6pP1 CG1 nB*'VRNE)Wm>}mPoq6yyyN"W 0i&)''D֫dV.KKKSSS4?u+Xڬֽ{wEe o0̌3 {pOHHW#...l5H$"}q:ܫW/R=V^^~!Yw?v"*r65P(<}dtaΝϟ^իRO8.ɒeooOj:333WXצM!C(0sssrVYYyaxnn7 զMrV\\|UL~:kǡB~b%h))ZdiiI_zŝxdIff;dNo޼ٱc)ԩS3=vɓ'DJ͡NsP+ 4 L @m۶-*ڵk߾}??x`۷okwd'XhCCCYusu7o|5zSNuNjɚ ܓ*܄ HkITT?@wf&!!&Q4Ts&%%mذ!""WYBE|;g&OHHȎ;^VVvҥ}N0Alis?> SRR6mD !!!=9cgQ.NNNd? $?zII_qFRY*'nj-bZdooOaii9k,Rӟy#GDEE7􅅅?_6oN^0ܹsSX?޼y'O3'q㤾]!UE捧#ٳg풫4O'&,YrQR+ ######uuuUTTJKKVИ7o^ca\\\CRg&vA:xS{z6m,^Xs?UUUUxZK)988ANRRRGQQQq9C+++߿PSSp6gyj7Y_xc###CClz**--sErQUixJ>b6](nQaoÆ b_ JJJĢ++k׎1lllL]zd,D999^JNN&M]]}|Ԓ4>''+WuÅo߾}-}bjjzjoMk?HUVV7@$J1339rԷ+BCEMSLS_t^˗KHF):tXbѣ)m~7o$''Q… {-+E]Tr+2X2큁A ,--D }Ivtt8qb_ݻb3wFFF_ttۑÇ_tɓ'0vvvdԍTϡgϞ;vxQѩS''H߿ŋĂmۺN0ߤ*'nR-Z4lذ0H$޽;s:"v  zxxpbZbŝ;w]F֙e̙3-,,3QEU!y)MOO'z;@N݌*++222D"F۶m<͛7ov^!}B***ttt욷IBBBVVVAAP(133ѣ_~]ZZձc>}48'OdeetСW^J΁m),,500ڵk}cܸZ}}}KKlGQǡ&R))Eׯg266޿ޛ]hjjm۶gϞr.OJJڴi.n%%% m:88ԫ{b/?Iؓ'O5#[n_0-/Pfv!v{Ů\Y (SeeQs}]resZ0FƆݖ:e6bAAAlG5wqB ŮuX#//ȑ#8К!Pٳ;痖ּ?iELMMg̘ 4ٳu0LiiÇc\ҢWdh TTUU,YN۽{"ViŮ\09seh<*p:uZ|!0O>oAHII9{P(TQQ>}zWUSXxk׮~ȢMD__Ȑ!충i~,,,ڷo_TT4gD)XG2((նboҥK,^ MTw0Fx *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PQkO^^7|C]K.Xh .@=ёIppA<xݢs$VVV|AǎV6h"}ݹsjjjFw^]].4*۶m3j=>&-43gl߾>qD~-(D^^^xxxVVV~~~aaP(nӦMsxׁJGN0aƍvvv](axxxsҥKqqq/_cǎnnns511Qf Z_555~~~k@tЁ~خ]* 4FFFիu6k֬ .$$$pD) deeݺuk=z6mÇVTୖԢ2c }}}'+**߾}|QQњ5k:bB-]?|0:tXjUsꧺzΝmo.JK T,Y1SzzǽgD"H$:|ұc\zԴKƊ=oeeջwt֭}ZXXիXRPSSs{?~|Ĉ8$$ݝ#7 r3esssaVPPbnnj*YҥK m}}/HѣDž Ǝ0LDDā^xqϟq݄ fΜ^R_م"HOO]vNNNcƌ:uA\^r%ڵ}޽ϯ233̙3fvEQW :nN󋎎~]mm~Ϟ=]]]-[&kWdgg] kKWSSSW(@КUح[7#W<==':rG>_x/-ԝׯKtʕzzzEꫯ|'OmݺU2+jĆ=\2 +4kTߗŋwĞ722ܹ3ŮBW'Ӽ gSTzj#++qq$9sfpp0yjeeЭ[7j-[ܺukt,jiiеkWwG(bwZ`)ߵkӧcǎKV:}4GSL믿'544,--{mee%###?#9{oݺ$mJ=6o̝>&&fǏ8p<<<>+Wpkjŋ)o߾陖F?iffhoo/9tF{ظGz211kyrww^eB$yyy}DIիW>pqի+++3ڵѣi)blڴ)>>^2!|˗ɶmAZn_UUU|Mj?ccUV=|$HOO߳g=a55+?XYYYRWҥKw"֬Y+2??ޞNֶm[zDSS 6x~ tܙKwZUE'cfιbiݻG]:uꔜ,+O]_X_ްaCvdf͒cfff֭{nzzzjj͛7%wrll,N 9X||g1 cmmgСy4iiiVVVt666۷oOKK=|O?$Ԯ^*r ٳg߸qNWbt"w,vCѣΝ;]bM&+[Dտ[]]]vE:KzMg>c y<<<8>F^ZηH怃-G@eܹ߀dзPNNN/6Ȓ/ic&((N"ADDX*kɓeu.+Xֽ{S촪Vg}Ƒ\Yw}:۔)SrrrdW__$vvvlt7oޔg||cƌor@eŲ-,,HJ550)*Q%޳g999$%[חFjjj%S#Zy/ae}}}ɼO:::>>>K۷/y&8BC IDAT8ŋ)njӵkW… ܅'NNNҥիWj"۷{~ϟ5M6t %ݾOkܼ֚y011ٹs'GիWꁁR}w$O 30 ӥKiD(ٳGb:… m۶3%e|ppٳ3333cǎb}Znܸ!kˌ3H<)uWbb"}9ٳs?+*6$Æ ˗ @#Aq=%-Ydƾ۟8q4&ҔvPSS;r䈬 6l@Hs%.]ۯ_=zYZZI9hj!ٖ:Z=`Y7,uuuz7nHMI2kSQQA2a,}Iv_O4~СC9[[[9<ڟij]t˗YNz -vMwdmmM:o4559nOiAAAfRedd,X}z5Fo&3 `U,7:ի;wLJ۷o'%WSS۷o_wǏ'";@e5,O>壏>"ܹ#u ]%.]JI7EEEI#%S_G8hjA XT#N;3u;2~xB֕tݻwtmMMYQFɳX9s25TV8+Ǻu֮]v5kH.G2dĉs…fffvuusӏ9Rg,׮]#tIb֮]KFQkkk?~ɓ# FAђC:'''K߹slO@.O~RNk5=:bR\XXֽ{vqq%%aѬ:Q$%%mviRi$6(%#MAwg2yЋ6 O^^r*1{ 6.+;aZ9@W0 CR/pϞ='O['1u޽[QQAOUXXH5=+5NkLMM_>o޼pH$zׯ֭[goo:w>}pd\V 9ѝ|t"5ݻwرc9ry8[W B9b_cAEC* ݨHPhAW WWW2%00PG/4s| Z91*_#]ڵkm6Μ9T-ry`aa!TND;հ ޽{ԑ555O<9pAF-*!K}}qx[JMCpsTvJ[5??wOIkqW z:>>>䐳[^N8h[T9.e ]pX===;;;sssccc$88ѣ}||؇#҃5OMZe˖-[,((ˑ)aB{BCC,Y"uӶvE*Ϟ=#ttt đgw;(b*"[͂T֒bܳeddTVVFȈRO!tKc?wիWdc˖%W4JA =z7n8|h瓻ܬ,F4 4堛䬆bĉ'322tLo^SVz?zqn{#2ϒXs 999ͮkooO_z%dbbbȶd[ :P._%FM188Z^8hj}HN Z/^$=;v8}Ff@-P9p諹eU 2ٺu+G+WܵkؓCnnnvee%CIn)ӚڬYӧOגwHޞwgnHII8q"]UL+,,\jՏ?Hӧϰa$SݻL%֯_?ofcccW T{yy}t>fff-n Ki;iرcCHo>___WWWsss POޭ[7r,ˆ \kaTTԠA\]]-,,􊊊222>}z}zo_^j[nꫯn?wܕ+WhbbVXXȧOҍ?~~~+WTȜ  `ond(=z4vر盚&''߿ܹsd8;'O/_W_<{? aX>QS޻w%%%ׯ?t萻uNBazzzTTTHHǂanݺگ_]v-^ɛ7o `bb,v?lٲyqGb+V۷oذavvvyyy ׯ_Oj55;wj^hWqڎ1-7ofgt ׮]۾}? 5%Z:@EA qڵں_Ŵo~d@zzzuu<=ԩS䙖;fQi;M ~ᇛ7oS妦HMz7ox{{Ϛ5܄UTTܸq JMMロ8q}YmmիI%hII˗/_̑fk۶#5͛7QQQ3>}lP(:ј1c\]]QqÇ֊}'$'sJ?##>$>>l[$@7ߌ?^VVp={Ν;队$[kESWW1bD@@}Wi#G$}T>4%^d D ҥKlmvvv =|4nݺutްaGp7f??@#v9͛7t¼tԱ_|Ů]]vLGSf˖-c$}7Eͥ&;w=h ***7nkѵ5kքzzzң55?ڵk_<{~z~ڵ~ݺuu~ZYu. __%%%iii71{zfUWW߸q+))ֶvwwgjиb555CCCy!""",,,%%TEEEWWSNzrss>|8ڻeY AK|||nn̙#y;mm: 6LrzADDDNN6lXgRSSBɨQo⡎;Y.\@OLL)//722֭ VVVd۷\wUTTDDD߿]p@d#ccǏ6od*pԩO?MLLsX_|SL!orssZ (@@Cر zbhv ]ԩS0MT!\\\Kp׮]}]3@~߳;v>}z? 4жmFnD۷{yyUZcƌɺO)T|||L0P]]}yfqP9s~}p-fFOa XZZN4iʔ)_7nHMM}왉Iӗa֯\oooaJKKCBB222ȫcǎ lw!P+ctҹsg--/^)M6)*/^bo޼igg"0A4ƍ'NiӦ7nB|NNNNNNoܹ3Vb梪*ycc~ Q @sAoo7o3^MMwޓ&M/tuuPHCC%55ѣGo۶ Q @3B/P۷oǿ{.77RKKKOO}ݻwwpp0aBnݚ_WQQ|X]]! @Cw PA@x *;Tw PA@x *;Tw PA@x .6ws-[E *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@f IDATx *;Tw PA@x *;Tw PA@x *;Tw PAPs5w)Zk׮%&&6w)Pk˗/<`ooh^ZXX8c . T<{lϞ= DGG#Pa… g}ּiF충㛷<o eǏommRRRmFKI磆F?u;}TWW7wq6o<---arrrΜ9]0ĉ*??:r弼pP(drҤI܉{=2~xWWW5Zm۶zJV&mڴPSSz:t @+.\p\]]/_6oyx7FaMM͉'oGyJ# ՝;w?VVVSL|>??? ޽{UUU ۷oƍڵ̙3NZQQѦMF'8mB믿nEawww+++vQ%000ɓxкݼyԩi## ]ox:nbZ+|n?y͛7['* |Gݎi~~>=R>Bc>vvv0333&&&--TEEEWWё#}ؘ)ٮΎ^Urrm)1žF$)))FFF={kإMQF^E>}vd@Oj(++cǢ"MMMCC޽{ߑKM)~G~eZK7Qی[n;vb&::Z(ʿ? 0SN};9666..Nͽ>y+55ҥK111Ĝ8qo߾3f $%%ٳׯߊ+d}իWɝg}F^JOO߹s'??~xddH$b'PqwwObbbΟ?O>|ܹ߹s 9R a޾}KJ2z _'qܹ &0299'!!qXZZΚ5Kdff磢~@ccI&9;Y sssSSӆe"iҤIofׯ$ovW23YPϝ;S]0ˡчɓ===}}}o޼)6/իW;t0}[K?n߾}de^]]{nB lڴIOɥK]&,--Mv95ҤAWǏgggK&޽{7o$/Bŋ7o$a-+00رcR.]n*` Q_YR˽7F }}2 ӳgOEEE=RHGhMT7le]vZ 8}4)֖}޽$''J* SSSCBBLMMޛ:w #my=YǺSN!!!111{MMM;155}ݯ/˗޽0`Ԭ233l.k󊊊/_0@#;;O޹sۤʐVUUWVVֻw۷/==DhGq {y_,:::++_~r%66֭[|Ѷ@=z`砪I9::~zII -*44t޽޽jkk322Y>l̮^&ujG B{{{ߥr6211y&;SYY:Ȱ0u4 駟‡Z6LjVyiRՠȫkH,Cر#Lyy;¤NVTTC:F!5F~}Q,U 7⩨R컔%ȲB}H AnQafڴiQQQlgϢȽczz:9UTT8*!ܹᅮ_UUں]v"(;;;99=JKKD0̳gvCΝ;6<Ųy{{/ammmhh(222RRR_ѣvvvw'':udhh( HH$ 0003fL}٘JGGW^=bFFFʊɶث?H8;e䔔\rE"b/M( йsgmmmv;##t I{w_U}'~dEQAA hUwivӡ:NJ.]/[uƽP[DiZqAAڪ"l1"kǝ9@B{!unrsrng;wnrN::th޼W\~'|rq=!WFmsٷBKKKzL&SNN:ONe˖I&=35v_|q#/_'qw%h"Ä +}UlA֡Z? ;|g?鮒q%o߾^ziz+}w'=lڴiܸqv[y>%~^xanݲ_,--}饗&LPRRdoOW$N2ꂂ2侑oVro߾7zӦM/ĉwQUyr VCԥ_˳ӷrˎ}5eʔֽ{KްaÔ)Sy]=sYzȕT[琗'|D Zn+rŊ6l(?}Sܳ~%9g޼y3gd2qv"ԯ_ /,Ǐqt޽oL&֭M7tAeo~O>dŎڶm;z/+_ܣG.Ovn2;{^E|ּ|w}7;ݴin\rIW9SGU!C|.sϳ>韒L&S^?? urH/3L&s'Cii?_2AޤI_Eɛɣŋ'{mk-2#}ѢEq7xcR)LSOꪫLx>|=q?iɏ#eԂP)**JN`d}L&O';h4Fbܹ8)?0~>@rN7vo>١COOVK.Mviݺ??t&ÇOotmyJiiǞVO>I>֭N7.]$Gn߾z={L`2]ytrTCZ;}#5kVg-{{wNUchhuHΦd6mZޖУG ._\yb}}y~#IHwNů4E+묳Κ:uj%KL0k[M6^{-w:*؉s2֭[NZrH^pz!Tg۶m}˼,>*Gdyl۶mzbŊGQڵkWTT}g7 N}qW:쫄9sTr˗':^*-CO9C+UV6|?O fժU ,8C*yٮ \i{%/ ?rH$WRP?ˎvT`/V[LaaaVec^r~~10kF~g09 jMd2??i?g[bErV >uI~]QRRk6+))IVʗ_~?XQ/fn8n0uITZ#G\jU۷ϛ7o޼yoڴiӵkמ={߿,Oz}v5dȐɓ''{M+~eFL~i3ECS-Z2֮J| yYqiOTvz}e)T?}&{weС?uzl3=z(FR\\YӅWR-jѢmڴ) vߥZCװ71_7Ο4nZ=m;wNB<&$}^uok=CɻM49C;vتU d[>5+:*އ9re̙3'韪^$A]vg/K.M*qYf;gqE]ˢV>:*LfƌPy7|QG7+|HZ44բEMkРAr͢\c-zzȡq}q9Z2 "}J+ܭ`-ڵkǍ\SN v裿o͛7?3[n⋫+ީ:yܮ)ٳ.˜"|w~wO%6md'֭[Wen]vɇy?Cɓgv=z=ztrq[N6sK3'nW{l2=cƌ3f$o%?F\nӦMU0bkhj(ǭ[&ީZC~&.琗1_74rrg`JzwN_o*xE(B<vT'Q䂀:7spI&%7O:*Mvmstr.˪ڴiSZPPP`w0`@r,ٳytӦM˻EI.]3gVcihz=Κ5Ek*_9s<2e`?ԩSU^*'tRot9wܷ~;;]~2yo>y;pٲe&%%%}\l{dq*e|ӧOsN0"ytÆ :_G}t]w%xgyf~ժUV7o^z2ǂWg}_g}69Q.]X~>}dW\һw]7߬uԩx;i8--a֬YL2UTr(9G>xe[^:;Qnt*j}zԩȑ#uVI֭%\裏fhѢEڵk'ϟE͛7߶mʕ+5lK/U~q/CI݇Ogo.[엿C=ԤI 6$W4jhƍվ6h= (zG$͙3gԨQEEE_~7!C$wѣǰaÞ}Ϳoظq7&q|=Pr}}~kO'2 kD%kM|xɒ%K,I?t^WnGZ>#MOQkǎO> nm۶٬Y*_l{Eܙ\s5oذO>Yhg}sNUg'VXQ޷ײe??q+%SN˒o߾f͚ .Yd͚5ɳBGqgT0ݻs1k.^?NWJFF$ةoWN>@<}׎߬Ys-6j˖-|Ygq7tĉ_y2G 7i裏袋ZhѥK@~z/^O>cƌygg̘lҤɑGygW鼺N8a۷o߾}+sW^ƍ[jucPzG9q9sF3|]~z^PPp5׼?|red{s[ȼoW;wҥ˒%K2LvһU />&LdɒaÆGqĈ#ڵkP2S M{FQk*楗^ڽ{'.]44hЧO#F%_5kњC%ǁ1_Lfafy?k?{w.\o۶Yf|pUw\j՜9s֭[m۶/}[-G-Zh 6l۶G2/^x?|֭M49zctMnzرyZ<;w~nݺƍw`͛7?av:{e͛W\\\PPвe޽{qlW[l5jT}N;.rH,Ypu5hРuGqĎך̋܇=&(:o޼ymܸqƝ:uٳguŋ-Jc>}7nd{n-k*9:x}z?c=}coOPM>{N_y啃ɋB%_~d2zk"N8__kvy}!SjݴiW_=h裏kkzv| {IvzU7|3;ѩS'B]O>>s3CާMwJWyWӋCPBv"9AҥKJ zLlٲŘ1c-[V}f̘\HaÆ:}!Sf͚^x!;}'x58%T`'z1tĉ+xV`YlC==TÆ O9唚^"jx?\jm?i;K>`r±Aie|i>##;t0bĈ^WUo|c ,X~{M7eSdZ`;SaÆO?tΜ9kN<İϸĔzG4iR=ZjUXXf͚/_}^~'N[oe2 ^~FO \aaw;cK,j}ɕ]t KX_|qݺug/~f͚.کSh.`yw?AK.޽{M/֢VTTԽ{~{ƍ+Wܶm[޽kziկjvM6'pB.N/^oҥKkYf5H^z޽ڵkW^]-Y72dȨQWOwҥw}mԩ3bĈN;|9oƱc.[,h}m~ 4(;ݡC] hѢ}k׮-((> ѣիW^/_>sOJKK5jԬYC=cx|Z~;wܦM?K.9餓jzq\GvmӦM'OvDK/tAżF*  '*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG S~ #Tp P*@8B"[lY|yrX~e֯_yf2+Ww9cx뭷Ə?s̅ Yf۶mEEE]v۷#ZyY2eʇ~geآEnݺp W\qE.]v9}{%%%nSNLfԩw}׭[WNN:eN sʹU]BEM7?q۶mo߾dٳg~Gw0oUVڵkg͚5k֬ꫯ+τ |;iӦ͕W^9nܸ۷gm۶?8ɂJ.eׯ5ySO=ue*eGf:]γ+%/ۏ?+WVriO;_I'*L&o[*..NqkӦMV6o޼bŊO?4ֆ K.y_W__~7o^\\|͛7'ߚ9sy7iҤ-[roYfU@L&kҕr'>ӫV;wif͚'w^AAA>[lWXQG|+Æ {뭷nցnݺm۶'pBޕqKd^|H?_WIvzo9gΝ'O|!t3<ӶmbO=TeZGdһoիaÆȑ v_xqv஻СC3ڵ7ޘܜ6m+^ ;^z j)g'ڴi.gp Ox'x"4hw9ϑ#G3fٲeLf˖-Ǐ=zt?{@-%T2;~ VVznqƙ3g&7/,Cz_:Y?hРj)~e VXX/rϫ K_~ev~_*{l2=w܊ܬY- >QoС/Bٳ py]ve?'ڵ{+%%%ի{`o"T2L8餓-ZY\\?#]v=#xvԩ2J_]~ҥ_|q5/O^î_L&ӡC^xKq-8q_߽{c9{w*ڵks_[Z*@-%TW.]Nz]wH[/;SO=_/o>*9ڶm[^]QF5y3g裏nݚCii髯:mڴ~;4dAAA2ݳg޽yFU`/:T/KKK7gXaÆ 6,,[o1cƌ%K$wغuرc/UTTLb,_7N׭[W9,_|˖-ۯJ?ޱc+7os=wg֩bO=~2?Ҽyd:/ǫ>(th"Ϫ1?0}]v^C>O=TV/{7nL߭m۶y`_:TڴiL{ׯ^~ͮ]HÇ;vlrsŊ'NL!}镏?x9F_Ußd1TL2\wu^xA%7.\I'|m۶~ s9'}{キJ?>~eO }>=ܳbŊ9QOY|2=nܸ*-6:T5kv''7J~d-Z:u|_n髦l۶,]4n߾}5*9زe~TrgϞ]{-td2ѣG7h y=|ͻ9swyGN?t$9.]$7ユ+WV|￿{_wu?Oy'pŽo߾nKzkذa?яl*oQ`Qy^];s'OJAAAݏ:Ν;lrƍW~򗿔zIFÇ7c=vѢEW6l8x~uܹ?_b{믯Y&[zƍWޜ_]uUMx}i߾}ݺu-Z4s{o֭ڵk믧?СêUs_[77_ؿaՎP)))+m߾J?ئMkĈ_?ϹnݺrK0_};v|'ӧ;KwjڴO>9v\/O:uN=ԩSR2_۷衇*L&sW>ݺulO;^zi*Yw>;󨣎jذaywk߾\+Hԫb6mڽ;x>={fϞ}Wfs_ѣG/RFQQWՉ'N4)KR^v_|q޼yk׮]n] ZlٺuA/ǙZjڴisYvmIIIݺu7oޭ[va՞3OtשSI&ڵ;Ç ҤI9a/5T(P`/PvBG #Tp P*@8BG Sy^ #Tp P*@8BG #Tp P*@8BG #TpUjz`5'*@8BGl޼DG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp PYrXIDAT*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tu{ nn¬Q Ws C7F6qMini lJ MrL e\mRk&d\rA9l~U?.瞋x|ޟs=?@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@ћ7o>_Qk/q Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq Gq gյm۶ý[[[;f̘}---&M:Swwwx^~={O0SO;A|8묳-[l߾48qg>#U3f'` @gwyg%{2eJ[[[{{{CCp&bŊu۷;\+_… +?mgc?K/pRms* ,8ڵk-:N׷lٲYf??\ -={-[hΝrKu FŋgΜ+bʕUZcv!6m?v*?O@ @'z뭇{sժUj长>g?#[Vy477Zs-@[[[[[ے%K,Yr ݻ;O=!};cHG G>ES 86nܸ nܸqŋ===7_}'ybs̙O>R{w]sx7oW~F:pDBt]wp +ߎK,/[ZZxqy};)6׭[Wxg}vi7ٳ8 bҥ/6}gyp;]OSi|_馛u\>֭[+9j׮]\sMi*#GSS׿be=]ٳaÆbꫯDӧO:uji<00f͚Jڽ{__<|o*#UW]X[?Og;655U1ь3q?޲+Vܱc iL( ]tQyT}bO~xDs^|W]uUi*#MZ5Im۶ɓ'W79SWWWtuuU~eˊy- HsW_}XUصkW1:T?OTpDB`9묳8J틓N:w刿/yYfկF8޽4.RRUSSw8㡆JMM7n׿~CCCSn֭sέ|iӦ|Gej 0[ou}}}xܸqUR`x73Q1nll<50_B`ټyK㺺O?CeH_u/>f?O@PN4oĉa„ xǎ^+kkkO;S={'|r%TF-[38LRT7˦MGO9ɓ'Wwrv[EYp*#+qb /ӧO?餓J}?b7STg8_ޏ`ضmҸo/ P!z{{o⡎kp;_s5m?Oo߾;Slmm=cgy(P z{{M6\wu---ԩ歷U\7^xҸn…U]`.b> q׿>zxλ[?cqOOW͛7~H__M7裏\}՟,_hiswb U__ڵk͛}눇777x//|;;.￿xN[d0>`p}/lݺuܹo/?3r9^‡FnV*mݻwҥ{3>O0aoΝ;l_;iҤza̙/}C*|3<8 @Jooow;xXl٨Q~ 3/:իW777W>Qu:::~^ziVw;BXpܫ={un*nq,]t͚5yҤIӦM+άY.{۾}{qw\SSSkk… N:jΜ9[frRZ(K/=;w|7Ǝ{)L2eƌ8 gT8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B#T8B74[vIENDB`davmail-6.3.0/src/site/resources/images/android/davdroidaddaccount1.png0100644 0000000 0000000 00000331024 13410710541 024726 0ustar000000000 0000000 PNG  IHDR8p]sBITO IDATxw|սmYG;A BiҖu;novOJ[(-mٛ$2p8dm@kGek|!q$߷9{ID@( ! ! ! Qǻ@$}Ni!ZթNu !.=؇*@ZM7f$fivt@b1蒃^nX1EPPEzRnzRN!k܍hT4cv1{?77d  *`aG8cuOYG *ڔRZUbզBH3d 3u7vz}X5.ss[{k݋GI\Pt':ؔuEP`SEvZq^zZ[hպye} ?R17/LAY-%1T>[n۰cu<[ZuFi Zc>=I6Z#j(s)pO̾ x*R*0s^VJh'~[:G;q<sO!FK3fR3 Eza^Jv RX!0tɥ9KFHqP玶e55ТRӓrrJ4妕RcDiĐ%Ż`JsJ)^W{_}WK:BZ^.Yq4OZ1W|u/ǫ32w$ҪuƸ#nk^>p y`D%7DAt7- UrbF.INЪ4jV pyn30z|~ 3؞VZRCN_|gsL˩XJTMUkwmYvEP`vѨ^<8BUT)͘ϐѨbD5c;`u6yZ{ZJ%'flAP*-O# ;"wE1[5a`B˥5X94gQ!+Ac eq&K&1?"q\wS]ryfsnA7 /VJX\n }~k_]^kK/HʍqR8E;dnkw]#uM5z82U5VUl5%[aiL)n=.y:GI_ ˜+/~n2}0ui%ʷV Yf6ybT|>mkS&rX { Vjܼ:M ~{en uNs{UѩH12rӍ9[=fus޴6)E5^1惡+S &ZpY{jێk*w,("ՐێտzaG3Yj]n[ #Ox]n{6-+ppq\~{o5,x]gpK{SR*߲#u}Tl\3V߿;#;LLLOi-K$x{{BRH;N>V2/BT^2,(W~5Fi LɅrbT*+?:Y[vBѓ_3vɽ * __<АݲuoSұԽg*՘57oEL!znJJpSWM:]cSJ|ަRJro×|>_g%{ؘP(3ARuk1vZE3V_g4\$ޙ* &h 'Ϸ5OBr#˪µo\3r:!t]sQe ]si߉ŰKhPqoGo߷-%rC.37?7aW B~[wCGugvj9 dSjhv7U7hyr{Ⱦ,gI^h?vٲHr6)ENeI?3[o姗߸YU*zOֆTN ĥ%߽{XqsF}ښ7.M_9;cf/ lJB4v: B4cN בUbwYJ !Hz~YŦso vyǶW?}C$Y?Np3Ko<m| ȟNjw*+\!{bmf ngowU-(רZuB^FyeM _~{ȫ>O]q+X;o_o<#i[~ Vז.ըuBC/Rb<ݴOaJOSeLNM+'2\L"h>%Col+Jb 5Q=n%a#I\T`M$ݴcj[/<3.<7)E`Bb0=p=뚖cK's忖,byȓ\ݥnXp`2<$Ŧ>>V٩7OEkom_[z.-z ZT!b鿆<ŧF[O}mRBZEgKzۄBH3fY;r,+,8zh2ӑJVuG}?tr3}Q(VT/uݫ_ޗ^xsS NH$\ ޣoŒ!{+#ta(R egH)LrՂ|lERrK?W-xȃƬ"!nn-yN@k}I!F*\k/޷m?T.ݷ'{w+9%I2 fHJ|g%|cU`Q9Y ̹ 槗Kzo&"Ъ]|ϖeо=Gm_?Z׵'4^V>n!R-㭑e7OR9/Psy3'x9xaz^u /_}bPI">8ui /ý#'h޽&B>yZƾZ{& U*VGӏwX~QDH_*̜;v`P틗f妗槕wS9<\Od3)^:' ;8בk&rmCGQˮ=ְ3pP/(B1`7M[FP+˷_׏^8rۖ8/bM{e,֮snp; M{wV?:NNLT*sw>~L~R;w̡_,MmJ)}Lc1<馽#O3]4]<ڰ[|:ls <ڷuJB}? ~.|Z5[T~,-Xi7Nz=/i!;8G:TDZiW}"OrqK{_o^BeS}h=ܸ`bTJs=uR~ϯ+>W9/xZSW~2rpnފ[|:ef`}Om[_ykKGۙ״hꮹg׊ljHbD垂KG ULBpw)EYEy;"XV"oXÎK]g"fW~48qҞg$)oDmrzRvQfee`1_V+}AW}<Ǜi9anR"͘_|t~-5؞qr!ڏ?yC#*eοkRxyC=[αϴ93R&V49st}pod}FlB ~,~)~X;N5yB.% !lݯ < !.k Ec[+$_Kʕo.y{[s]`Sib7p_ו ss8=}C^s󜬪Č֞s\x !^(Nݜ9\G[_}Rѯ{h@6.#ss#G~R#wٺ)_=Hȃ,Tlڴo}|` r{|G.͋x;]\lRVAx鿽v?ܝ͏A{_^ R({IU)B,4۲dfV9_ Pu{Ǹwe!&v$34{q` GO62#sZ`8Zjרuo^ n_dkꮉENGT~߉toWB,(poɉs'e_ߺU[)fݸS [|fz}^b7.x+'!ẗ^[h%ݿۻh+N]/.x٩C>ȵcaJ~C#kP$Q4m?'uiwoR˪Z;hWtpV2EJ՚y7f$K;N>2F+AkA*5߿q=͞B L5KN,6UrO.Cpٞ;׹vm8@5k ug_< ?@Jw/fN%߰}i6)BL!Do`]+i8ɞ6SJ뿔V?MlDkn><-/͘kǟ^NAES3*ͰsL~c_n7v!nXFyVWl #u<}sKK.̜bf3uK[^vm}ȯ'=7O Ҩˮjֲҫ+ ^w7MI_ *} ekomHURn\1F3bv}՟ ߾m?FW )wEW^䞨ƅSJPkoȧ側Po>VɵJ7[!8ְ367zCӞ?5:MU35\1oUՓ>ްkUݸ;TQ= R.P(_*}o&H3f?p_:Ï}N JSWû5+߿+bw>RpkpYE\OɉKY}W`}B|k1;Q6RXVEJ͖%^l=ySBsd0jv椕CtxöF[ݮ|S }󢻃[F !RDQ$49_/ *N JbՋ-\Bqʏ&{&Ps9Da<&qaCB#qkg'r0Sͫ>Q.hꪉvO~R &!ĎGO*FCNv{\BR%f%`) ^>p/+ݬRN#K/5ML44[|/~ᲩV~te Vi/+?q{ ~<d̽B!4*=W}W/܊MߔRoZ !^׋~?yזf/^^zfB>Jk !'ꒄN#.M i%wB#OZضÁvPA%X"b@me$Ru ٰQLJ3f{_>u,*^O뵚=gziƬ b.Ax/?iqU_9K[7y׾qc*3؞Q6r)pTfBtDmZ_3&l?*zєR=zK 3X ;#KzC?O!!!ky4wg/|6M,C|7X_86yd-ԪS}Cf[|FvHӫ\D]r>-?<^+'tɻVq{!֧.dFJu_|.uUW*>Z_>4lZzRNGWCF]o \(+ʮdבbT eSۂl@̒kG34wco<= !׽T~r|ۑXZ)+MgSJ~Ư!lݏ}Mն,\xb۩K{8ߔRkwi8n:xg) B{cwY4;ְ3]}mxJ [ʷ?Sv{fשǢꘜ~s^;z񋯭-0OEm1ɓsK߻5[ՇVda:yž!:&s/@g;ʂ5ZŻ؞x}~[wP+'~etO"o1!m?:ZtmKK6l[Zi䑱[Fn^99Pn8`oӷ.v:z|uLsUժ;%k,^|,bYX/|VՄcnA1"h]hOpOθi 2r IDATܼ"oE-i7_<V|$UJey$?okaѕܼ՗ވ{8< XR+5&UI1K(o 8:5}>*Ԁ)bN_Z4ghW7?NEmy5,)2qioy7.*ސR:,Կz19xʂ5!7'{,^*@~vc4k糇9e]oYxӏmuvӏ~$}zi4C^kT*UvPpwm۱H Ϩp;c`GwV?:F$T ? lTm3{*wUw/Q wr}.vݑ#FB޿^t5۝uR鎠F]߄o<N}"V<^(~{9;xG.?rߴ^2kQ =RT8~:چu6-+޽|xwӀ%Ż@ )i#u/?}O5ws|6ӈlO/|xwLj J@lQ D`TATATATA쨗-]>0@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@v*d@vX:qX>O$ FMQODZ1APm}Cn[Q!DZTd-OVk,* G@wuܗ[C=bcaeJZ4c!b1B\wɚ/Y> A Wkܣ(cs[nEՙb2Af[.;y0 v7٪6d wYjT2? @!eԔqyO2M,QR?X`6|_jsNM[e; l6)zYU0޻/G:8^\RJPKm*." .ƗRS!-W`T'C}Nc1ۻm-9̮2ںC'0~5ϴԆM\1{ּ`M) FM܊I麤t0wMnɾJ 0nLYh>ZJ.1夔Km}m! .jDRLE ٗȭH2jvv7"lyY{g;3d73IH)3Iñ"07 ]DRɋɍpZ\|MnnErGlƬx@'0^~/wϋ$Xyq(`ろqș"ChR>F?jvX>Uf3:)eqٽ zG{p+Պ!ągt\EPp510οK6dz%*p8$餔zaufO9S%Y&k.M0rIJ.H-]d*K i4ܲ\}ݛ|<5JTᳰuCc5sBKD;+NNTH)3XݡMj:@<._%ϮM'72f[7ӞI)3؅ݖЁȒAS.Y/L}-f{ga ȠKzV'ԉSA<ױގFPi*C&-W ƅ}vicFko۰Uڜ~`&1G[R.e ?!2VQjf?BۧTu!ĩ CGoT/j2n+Vm/HSyx\3ot\8Q/1T+s%/>[t6ZwN[zZw`鹉IK-].=._.ss@hG]:X<}'wO: 9ʐi97T~k w[ ;Rk%ƪYn*,k,w^Xr/ydGY)w=\?=&A%fH)3}x24ӵCݏ\t9UhߎEoCu'vnAOtLWۯ}|O]6;G5>b;cΒ,f}^?5\8/ڇڇ,Zz}-9 !>|1J58=gxyٖ+$.v{ۅOɗq_- Nv7^Mmx|m. {+ 槄8}qy$Z0#  75] YBJwáۧ-B4EB7ܧwlGvmaK~tQw]dGv?rq2oWC}Vρ'ڨsS{_9>ZJmLVp^c{TH)ۧ,]Z_!jMǿ{*Qwx_yy%*Ɖ"!y^nn#8rSct=~)w6Zɦ3Q?iOȥHCOlb!G2 sS]nbɠ}P!k K`U+DIm#>]"7xgmEq^y AOq{XsqIm|8(r!3SVw.u ǥ kܐKJ-ߖrpm)ئs<)eaCCVd_9Kνs}wrG(.ՖS:[,1Yc*25Ngjz0Deg4iT2f%}tRw'^[>_%_^]"CvIRbybufbIm\-$&k *SuB!}azj>]/*Td0kZ}l YUtvO?P%K3_v6Z?/fH<юG+RWmdwh)Eh{'xnkv >E(M#T:6ȃkM2xwIȟl?ґK:Jl;Yh B1Wސt"9r@%w>T^WZa*6lܒ%i#v\z7u޿6nܩlm 34 xo?l˾//2ۥk>Q˷歾0=q=ݼKቴxi[>R1ݧlxP)K '08m8@1ZJ5&HLש_c05§ !5*g׸mp@iK6Bͽl-! R֒+n/)KT N:/,5V(w?soJTv{S"'C"4/+[.Q;|X;ڸ35 ۿ{JB~j%7:jm`&6AurȔ"Pkyz~`Jz3 PJsGʴ *YTKVF&R)ĶO) ]t͇WfnKÏ,*;@]ɵi _ MP*ɩVBZqJ;?ImNԤ- @ha'6<5#SˌInhJ@ JuC=iFe5BUf?2-K2I<.KOчXpX=^3qݻm 6^&?!"C45wBkD"ƚ tH J,zJy5=^&q.5IO2[5xh(ikcj*/?%+!v #E溡}Qo C2ʬq^joVd}!f_A%VyفL]"lj ]rxoxt]aeK C2(5q;CJ\4\_iJ kLPϤ8-T%5k?)]:o1cRt *b̬]j?)O<Ö=ERn>bkHIs=-1INOK%Z 8q辧u8%<3x5%xJV1=Һ"dot(`S!|i#Yf*MGѲJE#_;NVN0"R0?9UjF輦 !>ī(*ɿ5$Le^7Uzy2l_qZNYF.6$/㖖\w-Y_LVdG?c"$J]k*ɂ`$9VۏV6jܦ.q_|߾S]l`JgkE~KՑN[-b>@aL xn|;Џ&#*> uЧ:NrKoQ(CXv]#^_2A".3W󱝛fڠ}RH~%rgfiRe'")#4v瓘w8Z3dfsf{$ցy=_~e _c-8z5ҫ%vM8 ?z#[v2q!fKn4QfJ fZdO-b32 :/ >EkF>[rBX=5w~~^2(Պ䂪DcVgP+Uo=}kیHMc-Oj{ '{O(Y%5G,1yRsRL *2I2aϩ]5J%~0$L%ZGkm:#Q79^ΕOD< J'-1ڸĭHv tii*àX5.xݓLx*37Z>n5 I&ء'bj3RK?R"'-Hz)%G3K RŪ(`-迭SF]iAEUsr{PE%|".Qta q1.%F$Mj%}Q4n:9-|J`6Qkrc*2a̜ izG{)1ws>rJb/G.sO΍u@B?KSr$Zp~}>xѪ0zۆwa  bwLj㫷z|/Y=s᰿[bּ*B'"9|߁xRK "1j\Z>&+UPyo3"Y&)bAVVrV'kTso[kJK ?)߫*t~tb9%rS[sc&Ͷ?}X^0)F)J-8L?KƳraUJNYһLbtm:Sx ]vdU.;%3\"Cr'C/O5֔?79)Crx6C3Rp)n|˛[̡ӈCeSJbXm;cMP]2_!s $.y|EFZ\ CM-1b(VL|;U>+-G{sINYEUVm:KbpUmȒCNV.>%=?xH$l~wu' *7pLb)9SrZZ.[{k?<~c9`*ݏ\ m-Y~}~ԔIm<1Ysç=(;BlPde[ƒ|KJ*[ȈlT-A"CaUjK\Vʭt2d{!.HV다JI<$DoXErf[E%B*:0~hkNߥlEƖT6^4KNB\yG8bu8`p dKhɔ^9z~4=p;B,$=r 6;%KGh|.UR'F**Q5Vփ \;"z+'U7lLҤڃ="'wKno IDAT ȣ>l {% kTɵtY-_xs`Kؾ"+=f25wR&3n}=KMJJ׭ؖǗf1*s}6cO%-ے)ݣn7`d4[z]y!ʢ_zçfGQQYrMZՍBd%,ߚwǗf:ް_tC5 |?|Cv c\?/96lHq._qN`6Q٥I}m.tYɓ_%O)Es݇eo/Ft锥rx mz^b:>}2Kl#]MVǐՆ4mT>6Xmmp{\^J7,Npl!^ۇ܍':/نznWի i }h#t: ~9J.Z=yao`T`xxx}}}$B/X`0 (E \5M~~~~~[ZZΞ=kۃooڴ)11H>>--:l\B/$%h̙l+LUBUUUr2lD)/]]]gggiB+ d | @09E|:b^JkȮ==S[***:9 TB\.7-- { 9y)!377WUU J@0yT)eeeżB2*=/l6 ;L*...++eU@766:T&ݻw555566zqyYRRRiiiUUѣ^]RRRttǏhkkkbb"ժݻw۷'={,!!Aޣ'Oy󦬬^UUW^&&&ݺu{uUUU=z]aaa]]޽!C/7o kjjTUU3eʔMMM)))999555nݺikk6NSSS\ I>wٕbikk8XH:R^^^pppjjjeeڀ,X0dqqq111EEEM"Ʒ[29  jii!gPI+ #555STTTҢ Və>W_}5iҤvUZZzر _ 0557oƍy'YSSSw4gΜ'Nv677X6޲e˕+W%/_'~wUTT433XjUkI_mncc{xq777&;ZYYq8^VJJ }6_aWWW^QK蟫G`1bH=jӯzϟ766fmllݙᄏqر]oEGGUVV<<<ɓall~\]rƍ111|7PQQ>|… W\w{#G1A 6lׯWWWTG?ر$$$޽;,, ~lٲEaݤ<}tDDjWg}j*c IEM'#޽{#N['ݻaZ鶭1bĚ5k=zZ˻zԩS]]]SSSEի \w3rHP}}Ǐ (^N+++KKK?ر̙3|Bk׮;vlzz:π֤FGG'&&R}6}CCCtm%%%6uuu4|/ؾ}T#ݻ7f̘ɓ'=ȵk׎9L[QQ;qe˖RBQQQ_~+feff.X`ƌwmkE.gsss'+W1⫯ mJ!T__ejj3?P_y N8rȽ{ B\.7%%{ȑAAA"'g>> DMj&$$$L>=))I, 5kv:11kP jٳg 덊Jx=K2xԩ{ԚM6}g_fw<(B].]rrreKpp3:of*((XxPW<+V`~A.]tÆ wA~w/rrrld___akVuƣGzyyQ;wҤI>dU\\qٳg &Z\ aݺuSRR Dx@6t֬Y/_!Xz}s2;sFyyyӦMy'sԩ6, ?]vٳG^ss_"T۷ Jrʒ Ν;JFjJ 7y:ѣHl@=)C M9}zzz555 --->>>jjjׯgRov1RRR6lX^jjjt/_fСCБ={:LPQQʷS(>>~7on>|H-yɜ9swJɝ;w[XX3559 6hhh099Gfɒ%wޥ[[[WMM8---!!r3gd^kר544 ҧO6]SS{q!!!Ǐ?tvѣYB?~믿wjkk7i…? 4D[[099ŋG3f̼y%k$]YYyСzzzՙԳ+o)H:j? |7_~vZliiibbPRRDx'Z@mmmGm j%7>+d٫Vڸq#1$$'!!Zponjj:}tرf͚+VQ߿+Wп~(rÆ )wٽ{wrr2V~\ϝ;wkĘ6q+z7 ]HHHSS=YΝ;۷oΝԒqv|j"͛X͛SrwGƛ{[[[yzz.]۷K'ߴihnndlÇ_v \%''߹sgZc###ooos?|y[nQ \O T$+**lB,uW_aSN]|Yؾ8T~hƍ7rXZZbH=A .\sNzƼڵ+00M yܹs[ c~Bb:AGdձLzӯ#߿z1cFLL }t}}=[n" 2{Ţ/2hРO 3&&ٳ#""򴴴nll}+?~|dddknjnܸAKz=w$$ܷnJ>|ӧOwI??~Çn@u|hѢ䐐7˗/|}}fnCz{{_xo^oSSk׮:tHQ_7\?,Z|@+$B<ұl'x{{cGuuu_nkk+xǃ[+LOO?p}XXXqر744ܪbmvۨ;w~uHĉ_^`Lx\n@@}{fGt{Dڹs'6\}իB_Kɓ'S[ZZϭi5kŋ]f +qM<ϟn_vW^B8qbذaXahhd${nn.!dddD?՘1cBCC7pu|)((>|ŋL~$ݼ~:v2a„6}k֬ ⲳX o .] p\_\z4իGƍcC#.\ `~ٳg :djjfuFFFϟnnIpƌX!2;4C hhh=TSSRAA6AFIIi[A#PxxG%l6Lٵké%ê1y̙wV]]_~I];999ҔG*.X@!˱6I>gb X,/"B݈pu|]ӓɖnS;;;3i]%S orFl2G駟TUU%ƁO~L@]556~xMO}R s"`X݄ L!aZZǏ^S'߾}aSSƍVeVPTT2`!ABdɒ͛7SRyB9;RiȊԨ*++]fI칧c+VU#T樨, IDATaQ\$\_Ww_~XI``MQ2&CFp\2'SSUUU!Pa1S+ggg~vuu55a,--=uΝEkm86Ϟ\5_÷'!//[ܠʹ KǽGYCcǎ X˥G.7>Fy@|1cMu$&}\ebbt9@2&'=*EEEArz(/-d#544 Pa?JE;)*bbb"}7}y/cccj7|pjzfR>>3}@|MwI;/[p#틕t<"ϝyV$\x?ݹs'::mҥ' Z|@ R_Tlj1] $Kcǐ)vˊ\mlkrGj&MD TFE% &OLsJT^}}6$^oSYYٮfɪ??>]T.us///JŗKյ$꾾˗/9s̙3666ǏwrryTdj*d$н{wIJY,VSS—lNܿ`,$d޽{Vc-*wޥ>&3g5P;rիWԇ" JKK/^b #ܹs騨(,mWqϝ.4Pvwݽh|fddddd\zb[[[O6UQВ1yRVVvFԐנREV]PP@=Wr\eeeOWii)v' iYb)$o_Bqppn#"" \\\޹sqnn.u=Bhʔ)krA.X ,,E)gWxu$獵7p8iiiW\/tRQ$S W>P!{$l* ZZZ󑐙v:m---!zIf$6ѻSTTTD(Ò. ЧP=aa]XHBB54h=63޽{ԇ *l6 t)bL@%7o߾=eʔ`b< }}wQSSejj* Ҭ^q_%NaBGG!T___UU)|ۡgzyyQo>z<~Y֯_ϻ/ƍG>g,1qGV"_khhHWiiիܹs7lbsƓĞ:vyZ\\wAXpu$漣ҢE-Z LHHHNNnm顆}={yc$S 'rpݻ撅mJJlTА}gϞݻwi )))ikkQ ?}$Z" a‚oJfffrr2wJJJ'NNM "l/TTTq'NK֕󨪫:uj…jHϮk'n:99GFF޽{ѣG ҥK?:N|CĐ!Cп7o սy:7,$$:R~ ^8}:ڐ$NN?-wI6?Sbb[9roLtFr}M畧!_ tjKB={$cXAa%5:홡}V26ޝB?>uhيǏ/wpŒ uȓ ׭['H$;}Ew;iu$Mgg稨+WbeeeԄЉI>|p966bI_XXÇc3.@7BE̅xlɓ[ZXX`%_.nܸqX ۧEMLLI B8N@@B(!!ԩS. +!i&>!~y%N?7dvSN_U~^ 'P!}}f%;:$ QI___f>:>>>>>^\v +9r$!dkkG鑑/_PW6?~<=uo2n1uuuHL,,;;;$:: Jd9xIO4 +INN;A$ݜ2eͿ}X sU'?  6*qqqdAeggcQ ͶE}&.{I{}pƌ|7ׯ… B(S6%x i`j 1cƈ+5k766=zTZp"N$%%ѳw|Æ r3g0!WIb>$WM~I%S {r!&cH*qqqdGNM! MMMN ؖ-[ASSsժUmO˰@͓Ws̡&nll =d ,{^*O8Aݠ+((`%qfϞut{{{ک655aɸ; ?ya%/_fCbMcccDHOwldjrOOblllllL EEE׋w 9/>***-- uSK׭[dK.cV \|9Jcc~Fcaa+ ߺnݺ=ZB3f =r gD֭V5mll\v-v999͋^`:FOz6wljjZ|9D_]6IZ խ]:(5VjhhhsKiUNnGݺujzD'Zܓ@=ZOOUBYYY= 9bKD~~Geh==ѣGC6m Ν%_nesN{+RQ%&& ^L7##c֬Y߿ܪC@cJJJ|dllLO!^P6%%C+aÆ-_+qrrbѣG䇼aL.d٬Ykn_ӧ߸q_;k"ާOŋc/_tww|'[Tk׮wJNN9w]ța_~%ֹAĞ={ڼk.24Uxxq._L߾j߾}vvvUF̙7DgX} ,--i„ m\[&L*//_~}G+{:t(V=}M6vWXX?̝;[XX( )BЭ[7`ƌw.--jժ'O !;$COCkkkzk' |7#N:ķb//5kP' " 7ydjrOV#c;;Rp,2hnn~Ǐ k)^f0owEF>555)))u06٩th֌޽{k:;w[ outt466ׯMHHx߻z+Wꫯl疙bŊ[#455+++Yw6m5j}ٲÇӗ8kԩ|Rb9:)•+W^|ieeUQQn:77nx_tťZ^]]}ر .?kiiUWWgff&''GGG;sY <~;iTVV޽ѣfffzzzgVVVvA~:::wꫯ|qٲe[l$Ϯٵ==$ܱcӧOl6l8pĉޫW/55ꬬׯ_GEEX,־}Z{.7 T?aɓ?N.ANUuuuo߾544ݻw^t}Z_\.w&LPUU:QJG ={_)''RPK,a1lҥIII|/((wLSٳaEm„ @ 6|b}ݺukmHrssNtR DFuڵEaCP&nܸA5m۶m֭jk8KQQJ_aVfI/^899رc? >ZZZb׾mpu$了˗gϞM?9'vIOW Z|ۡ_蟘AUUΎc jkk߽{Ӑ7o䔕666666֖y&"""$$ӧ޽<A"vaaacǎa_eeM6 eѣpBaW|ddabbBbccޖ1a ޽{nffv}jf=i4͛#FʙΒŋo߾]]R];I9xqƉV֭[:$x3<*AIIiرcǎEX60p*++srr"""oݺx֭Jb^KII `hhezF&,,,#B'N8|0444o~uxy̙zFFFBESLJ0&455S2IިQ={atjTUUHjgk׮_;bݟ>}jee5l0B-H"uG9~xݙԨw_U@F$8pӧOm&fff7ofdjJDmbll}9rmfJMMͽ{㳳kkkY,өVZMY~O?$ ceeR `cccgg'O>}QPPP__O!C&NZ6yٳUUվ}5jƌҺ.1~555YYY ZZZWQC=%\XH໙ӧfuuuMM>}=ή[n P(!SZZZII o-'l:l6GC ۷/мyUx}||l"t.r/j,ѯ_~ee={S__78zK%QQMSATUUUTTTWW566 )(((++jhht֭{Jp@zkNYYՕb:գBEONM2.CE#ȷ={c͚5Bual9D)u@DMۅ(: ?x[ N[K|}}TTT/_pbӧOwY`aaa!EEE///&˰DFF.Y$??ZHc Gii+(!|A7oKUUݻ]]](!Q PG bkk;rH6]ZZUPP@~ڴiT௩/ jALMMa=`)))]~WVV<(@ {lmmCݭ[~!44T__ `BmdQT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2́@ s PT2Qv@]z522ZboopBi΋m]xT@Wj ͆@пM@vڋ/8ΨQVZ%!xN : jɄ n߾-tj˖-va```hh#/^H-h1%˖-;tPk/[޽{̏5hРQF?~̘1"4N\Y@DWWWWYYI-Vc:QKOz!͖|Khp||/%FFF3gg@߿O5j@l P@OK*C\hpXXΝ;%f͂E6%&&Ι3'00P+d*HߨQMWQQٸq9s.;v֭[[kCCCIII~~~rrrBBBff&}/ӧzȖT yll,=z[$oqNNN 7;|ׯ?s֭ΝwHL@V:;;5tWXn,\0**j?]~=%%EM v|TTTN>ga卍$  ?~,/TtV:::K, ?|w=&ӃNٳgIIIUUU G{uIII?~VPP8pjϟgggWWWv޽o߾ӧOjoС={Q{8;;>|Zr $kjjLIIɩAuM[[{ذavvvToGCS=p@{{{ccc)***//onn&_GGG񾿥OQTTw6mffgZ˯zϟ766ݝJر=!!aaaaX]555[l)۷7˻zӁDz֭[f\ws,XǏ\.MEE* xY,A2+++ %vq 좍999yڵϟ|TĜvW;""aH-}6@%44{_n+\RRtuuuﯾ۷o?y#9UUUj\rm:twww&9$00~im.r…2<{)7Ԅdnj 6Q&:gڵs=oooz:o'Ny0 puue555<}T1(mmmMvMrԩS 9d׮]{졎lSssrʒ ;w.æy;vLלq{yo߾ݾ}{Md y΍IYYzzzz555 A--->>>jjjׯgRov1RRR6lX^jjj/_fСCX|Ϟ=r+**RSSv ߿oÇ%O<3gRSSN)s玣} SSS%"311qb"]]] &󫭭H=KIIIXa'FԴpBl$$iРA&&&uuu/^Esss$!## zƌJ+y]~0aBs5k`qqq٭sNl(#իW{yyaXǵ` x<-d \zXwܸqLv?t}DЅ G<{,v'СCmVgddty쾔o߾ g̘2O#CC,؀C555_[l!`Tlll&YxFSSիw`ʕRiR;чJ.X@%˱8aAϳgbS2X,/Bl6-;2\Lvܵk3dxxG%l6Lsܵké%F֮]|{@t˖-c~~IUUZRXX( [1}hɓ?>浟>(11Q@`,m8yChhĉ/\#%CMMm?ᾳgJZ[@5Orqq:u*ú&LfN΂>a N'={qssbHzO ߚ+ `2=uA~p,--|obB_~P5Sizzz 7/.lll߿{Gïlo߾N455oܸoEXfEEESKNv#" .ʊ{9}>7믿^dIc!4p@555j†bsu:󙒒B_ fŊ +"uȓjZ6<<<&L@-oVSS"Bu,Yyfj'؛7o䤢¼. unnpmҥXիuuulHDGGWGn' o15P!W仚rPPu2+++===^ k-P&ͩ ;d=MO|`d`3HYGOIu3v 0tSlܹ]fbUSu111|aK+VsH())^+c#ƌ!m  c { Yb%>jŌE ׯ6I_>2S}y|Ä`l]-5jݻw+HHnnׯ={oUJdt*r`;w5St\pj5틕9 -0 :QLMMM|S#vƮiҤI0+++))iԨQmKqq3gΜ9clllcc3~x'''Ʋfeea%ج6+++Eh  B!.!2Ee%z rVB]>غwޢ59;;cSBBB@ݻԇԄ]s̡*|GzP @TUUqzΝӧOGEEa};Һ \+ww͛7,qUelllmm=m4WWWcKKK/^] Y]~4!@ cN jiDM5աz҈8-mw!0؝' DK!YDkrpp)#"" \\\޹sqnn.u=Bhʔ)k2>GG>}+wWW u(;btA7n<7ᤥ]r/8pҥK5 *@Zp \R@H57Dk"-Q'QS=B)pUVona>#P#F!N ÖRAQW䡯+71%fرkXHBB54h%bkkK]޽{e"Tl,ЕA_jܸqnnn .\Xz<"}իKJJ ѣTZ"S>|ҥ6'O޹sʺ!Q Tȱ[ "jTGԖҏ_V50k2k0#s`E#^@cƳfvwss[~=Ǐ/^7n럑rCu9}- WQQVw򉆆VzeaaA]27M%33x޽ݕ&NHD*999_;?~h ' uIҁQ@NZp~ө܌j;''''''w}QJJ }K.?P.;qD^NE:Y#~\.9pyG)0N! P06^<$zxnD[2B*&*u9DO0}5ve ::7nܠhmΙ3gR&߇PGB/aѯ۟{~z-b>}4 #$l BǧSG)yyOnۙvY+uuuZdt"] PrA `ŜW JDFFV·g^[jʰ ڸ/zw i~Gjj*e+?~umsa욚q?gϞN2sss%֭V{ą#.)1brJƝ_~XX -qHC52A-MHIی3r~ˬ+n5ߴ&&ܦm6߼Vˬ͐ jiB\Qeu5Tɀ@Q1O-aٓ'Ooiaa~Zqa WTTP>---jbb*MMMjp[ ͦN*Fw  bbbD>ÇɝF!Ԥ_}رcT`3QgD"i %JjkkN:E%a%NMN "XDeyrExpÈ3e[Ʊ:{4{q{ 80Bf}4 Fb+^GT!k}u|||||ǹvV2rHz/9Bǖ)lxe@@5e xxõI?ΦvCbbeݻwO}eT:::ٵqFGwa}D+A@A,<[+ϼB7ݰeމoNCJӌ8-RrrZ)rMkQ˼90K·ɈP8Jg#wQ}grt!,أF+1DͣG%FĒXbXbyh"" @PAzpǁ~ڝٝ;w3oooWD,oպHRRұcDW[Y:yj FdΝ; #<(\ұcǚ{ o.ݛOCٳgK{lٲo&rdd/4 [MeYVJ|*KZS20j=4H\YYO?t*܌t@*1 ^ kpY-,tZ9WgYB -xN;hB-aSZ93& g[Q!H 1}={:h6o<''Nt>´ץno!C@x`U6T*ƍ%H5'v-..:u6#xiii'N,--ޑ޽{~RSSl٢M%Kh?+X: ~4fpttT[3((H􁗕M:UĀ#FZ z0eϥb/Zbw&,x,tm-RWk-tiޣ|1{d59L9eTEs1*̙#*6l(OԾ}DC䶶-]T6ԩ4 ?i؀T*u￯\P|㘘>}M6Ș9s)S!͚5,e"!dٲe~ ~~~s̩,>LKK={aD4d=S3="J"W0L+ FU)Ju_\1e_ En{%%;ۼ۸~[R=y5R!dӦMoRSS|wnnn%%%III7o޼t' &_=o&M$ɓ'ǏꫯKyyy*I\ڰڷo߼yscmڴfmR_,҇ZgooߪU+Ѷ;vv횏Enn'OgS۸q4#Ptt̙ٴiS+++SSӂwV6gl{>x'Rߞ={VW+//oɒ%?\.yӧO٪zT[,Y>'rNsO?]n=..n[C2 ߹sG7ji…/^XOMM1c?УG6mٙ<}֭[/_B5t۶m- ~͛7w֍/¢ɓ'QQQ!!!ҏqƍ5{N.M0O,$/ShaTWjЊEm/VO `\}ZҞj'=O&{*2LB;*"(aJ7988PꫯHAArh*lѣ.=ONN[p_-Z4sLQ9˲њw(**RKtILNN޷ot9ZӦMo~ΝFn皗wImݻW:5/P4,u$+&ulbCmEZN>)WB-IGrU-jwG(Yv%'E}1תUӧOwҥm ̙S,?ӤI{Ç9=pwwEܹt0c OI&Ν_en%K矕-(S}ۿkw͚5kܹpuu=ttMՏ+VL6n ,.MVTu5ںu(f-Z8~x׮]{/L&ꫯ~Gm*ѣ5DZcDŽ*MXFvz)!w>>XKVf(TNBmN_ZK_HY)++eKvb!ȏ놊5V}B*PX";"u2TӦM͛'Ȥ.]Z;]vժUZlw~>=3dѧ׼yjEwޯ1m[qsanncǎ]vk׮mry@@@hhܹsoZZ`t7իW/^e-h x񢏏O֭EW^fMFlnnlٲ-[hXl2sLђ' :ut ##jŋϯV^_tiƌT (ӧK_z/O,Cc ۴u)7ö־Gʈ}>K>*r*#>l{tۋr¨ئS=!PC_!ȷ~{֭3f4o\C5ccc__͛7_vU4L>cǎ> lllp_I'oT?3all,^aƈ#M&W^ի~Ç~޽{ RS2Mmڴ1c˗w <^tٳgϴB53geR(>>~~~H'N-V\Yzz<F5k֬sνzj)Ouʕ+ׯ_OKK+...//700i֬Y-:t3tǥK.\RBԾ}8C),,<~xXXӧOd2;[?s;+qر\eMLLy睾}J zEO<9}Ç={ƭx155577wttСC^,--k^/^MMM-))(JPڶlٲGeYh(zpɾ#✊K(*`-mR%K%]G:X1`vىZeWL Btفi.UXg/N]y5T^/z>7)RS1*BaY[7sPEL"im I:X1%L(L[+6sT{ e<n -'9S|A_Iż ,e 8DPJe !j h[W^}rBx+p` !,K`,!2^nmehhPxABUkH L _K!HXDyPe !ETN"!dX%0-|bVER|A-]tݺumj*bzOOO[[{neHz )ΩH-qaw'J*vDyPe*v_A-6ڸTte -#9$=EAWm۶ロ3gΖ-[ouر 1P-B(BtC?Bط矗N:uڴ 2e(GtcT(B}"B&fj%SKFE(xD't~.aY²T]󠃲Ə_PPXs·I~~%K"ziҤI\M:eQE E=z !\:`*kPsx Rqo-#Kcz]fmm'%"""00e˖={l׮]&M._*T߾}- @{z0*wؔ4RJ,XJP+bY*1B]ABH %#l¨ <(*ÇHVnZ=xŃ2Jr^*ei%r卭,!ds;֫yV4B33w/ kv>}:u ɾj@/e !/V'&"|TSS*=eIFJPWGٓٳO*R6.VyRYay =ShxVErG:{&:{K7BHS¾|-*ы@YfQE RwdT{=S Qֺ6Q̲ք*b&P 7y<!L+aӠeeX[WIG1/:E&E(}5yyBXǶ/V'J&bB_ (0*bAXSe#aT/,DYLDYǶ|@T8q "EeSqW!!eNb-S(0嬥uVEP|3FEVq EBXKgYBdeq :,WrfK!wwr&%!tc; dYҙ<ETJb`4&(e EQdBђ*4ag m2aT$\(B bMf|G\I^2u0^J4F JY*ªb6"2b;R",v8a ![XUfʙU~ ,Eʈ%X”ʏ6Hų2w˩۴`%E[Is CK*V@(HFn&&\LR5vŹ/ P۬ Ԯr#T8tLXb>JBQ_bbh`*pۨ)a+ַPdǤ"pE2)g5UnP}ߒeEί!,Å7KЌ*++k>M=XR1lbZ>8۴3a -4a !D*r?nlX+gSNh9|RVHKX۬K T4ӣ@eESo&ەO>NLm a E>#sTbɌJr!qa}Xg/IDM7E 3PIQ/B&&|QU_5+@@:@haT Tbox5͙y_)S +z})^{}hxG8}TN֜2bbjbԂQ#S0- y[BDfH @Ad⃙ʆe!%{ylԆ鿘2kZ@@*")HoB%Q)+^[0==(, ! %*`YrKR+;){zl== Tl9 -P/ϏFM>X+犗!Uc53Q9:Jn:{g J THV'T^c G|kӜm;q{u}(zt=O:DeƉF( iXުX Jw\JuB+͗CI/Yg30fm\Ywط}XVQSԖBHYUAPש{T#,-J!0]ƫ FK}TC:O٩oI^ʋMQ8MhًE,yC^ 0B̀0.]-"xZހ@(*.R:jE0bץZ+ |k}!ތ@íaY)ٙxрfܐ !,2YWV~(I !/BFE;AIafūv\j/x`yB0~ ۤ#m2NʈR^A>_:B%ܠ_lm/b҈mڅi֕uۤ+3Vy eV~RYIf<Eܥ$"1klE,bofֺB"ErJxxxBBBAABhԨsՍT* !VVV[իyE$??̙3KKK+..622jԨQ˖-Pe󒒒g޹s'--PPXYY9::...Ϭ߹s';;DPٹZZZjp]2I09`<`B*eEư7Ҽyv!,پ}{޽㘘5kҶrcҤI'NqvرwМ۴i3r &kyYfݻWXo߾.]p;wRRR"mkhhةSI&}Gj/~ܹ~-88877W*EQnnn}+[lٽ{+Wu900U>:*n>bXf:uƍ%w>|8!d…k׮-(("۷ooѢEncǎ+Vܿ_?C``6'LWX_ 0 ,,l̙aaa\dׯKC-BȽ{bŊ!PZ…jJLLM}:tH}!a~yU!!ѣSL2ݾ}{ҤISN}GϞ=V󲲲ҥKZW*?syyyյ_n`KV@]/!/{{{~ Ӹqwyښe]BYx_~vJ_WHH%WWN:[YYEEE]zXTn IDAT;whtꗈY˖- SRR߿v !dʕ?chԨ! >> fv]~]Cgx;88t$##Ç7oޔV.۷o  P*B3f̐)?rȒ%KD-[s玆͛7oժU͛7jW}UVgFiT7o>mڴcNJeee/֭g(J89s̏?XT-::zժU;w+!!aѢEvRTrWWװ:ʓP] 4tt7oJ)6mھ}<===:44ɓ'̎;V>11q„ [nǏܹ&51bDjj7mڴ}9rDGB=ڳgO###K w޾ǎ0ClԨQdgg7dSN^*..֜ <<|ĉ_:u:qMrȐ!gϞ*XX:kT64=իWkcjji&7/_ɟ) vigg?k׮mݺɓ[I{{ќ2_~*ɲ0hР[jΒ\mք D%Բ-@7t@ BTE]֭FJ177E)))qqq_ Pajj**яL!ЋHTŋ.]h#hV˲ս@/IIIe CÇE%gUrrrhX,Po*55u׮]111qqq999j7wcO>߿_jJ=*9r/_,\\z/!@A诿ĉ]o:.@Ç駕zQlN N>=n8i c[hjkkknnnffF/2[:KJ`X x dee}駢(E& 6lƌ:u\CCC EQǫ_iӦ~W@^?(g>rȆ.066*,ѣE %ڢ4ٳgo}ãBѣG Z@tݹs璒%M6 jgggQI'T@ݸqCT =5*7KMM4HOtM^D%!!!wm.*E%7˫AO Z@ttZU*3gάEv:qDӻw'O^^u...޽ʆJrܸq/_TRRR;khAAA BXRVV6uԘ-2bĈ~PT@ 4LT8{ׯkhw^ZT֭Ǎ'*LLLׯχs__BJKK,X7ӧ055K,:q=zKddd~GȲeyQaBBߜ9s*[ϓ6{aÆNjMMM몯ZoϞ=+?//oɒ%?\.yӧOY|'Oe땩m҄?͛uֱcG{{{ 'ODEE.qz;@kc_}4)((v횆vvvr\edlllo~ΝF*'OjP~޽nnnuG/x=̚5kܹEUCڶm+*>ogϞGYscǎuԩv{PcT൱x-[4nX4M^xǧu֢Wëk}.]1c4 bp!PɨQ_>sL(:ujvvv>|nLMMWXꪹrfͦMj*ss!(} ޥK.\RBԾ}s DFF^x166655(Bakk۲e=zx{{7t*@t~A: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sA: yCwJJJ٣%rI=w>]t)..baa1l0͕o޼ymBEQcƌ _Y+sss;;-ZKEڶm[@^@EeJR,,,LII{{C5}EEEwuwwd /Oz/ T*ڵk,˶jժ:100!,˖J{n^^ou*m۶>zae###~mV[*|ذ]}ρ ؘ;NOOo職z_STTܰ'S4333+))!P\\gϞRedddiiҢE OIIyafffQQJ200033kܸqV4MNN~AFFFqq1wSkkk͛֏Mry!999 ?oD0 w@QGEEq .ի+>|eY,++++++..]v*$$$66VؖibbGziddTYoXe_qFD޺uڵk|bbbbcccnnNLzz ^ʕ+<"  |LT߹sGPR>}:&&kKӴIIIgϞ+]4`O@_Jz*WW&qDEEq666۷wvvN!ѢgϞrvvv;vlܸ1wzΝ۷oBnݺo[XX޼y3))BQT˖-۶m"+,,y&?===22ۻv?Z6`O@_爊Jξ{ѣG[4ÍZ|BӧS-u>}Q !w妙)Jc=!$--qtgL655}w]]]X~ݑ|}QF Kz2rƍ7nTBh׮tgz B L1##/z;.&qvv$_w~ڶmVzSooO*x77W=ʊQ( @ѓ@E3{{{;;;iy|⃓|J%ǝӧO. WpRRRf͚ujj*!$##A;w&R)(jڴiw zaJJJ?~3͹KKKJ%=;;NNN?Z>}}oKViii}GG.nff*eTC:/ oooD)Pw$Pyw<==E <~999J244TPpn߾jEnnnO0@%--ҥK5~޽oܸCnW~~~~~~||k7n&%BYC-С(u!$333))Ip@cllNLOO3t\p"˛4ihmmmbb­Nw^XXXeWd:urwwarrrNN7aaԇvM=pI.R5366K!p-*P?P!/H.J166~.!()))%%%99{OOO?|~`MӃ z~H>p d``ТE nۙD$:ڢW܁{͢!77=z >UV\a^^޽{:|ĢRŵY¯|n@y#.(|ZᲲ2~/j]0++޽{nd;w7LKK_G?H֘wPRR20~ӆA˖-Z?#\b? 燅 y 7rAѣG4~Ye/I9;;N~$=۷@Kdffn'&&&GIFDD$$$pǢ7wxl?p!(,,r ^޽{gϞ=}tewZAAAhh(^d2??M{rݝ;vuݺuќZP)--?y0aF80bbbowwy֐ΝN4i"߄SN{smXMJJiFv5',^zҥKܖ;w8qywȴ׺uk~؝;wjp*I֯;wܿ_XRJKK#!M4 Ү]ny}JJJJJ M!B#dgg dggsӧO 􅿯tGgΜ\N:ejjjhh(j.݉2vvv;wzJbY6.....PQ4k֬CZ^YTy&!$33ѣGjw}KԸdDe%%%9MӭZի+E^8::ݛ?-R766ӧwʲlQQQvvvaa!&MG[SSS???azBa[LեKj}qR)( ۵k'(E8_DJxɈL&300033uwwl T*k !M6\9fff~BBǏ322JJJJL&311vss)ccc__gϞfff) -Zl^Ð!C=z]\\ue˖M%%A옘-Z5("@O~>A: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sA: *sΑ7tHIII^^jaaall\G@5tjٳ{O;v8q̈#>4ܩS:jAXX͟nzȑrA˗//**)Zxqz*YӀ]v5`===Gnݺ]pZinݺ>?:t0 הcFFwLtIII_֯_ѣG]+3ׯ㭭;P@Z888|'u 􉿿?oݺҥKU ~ACڵkW||<```PG@\tR!1116mj@È&7n O?C__:jfڶmlhh8yk$11QT =:@Es8p?&Y7Ptttpp0ڻwoww:jzs&&&uJݺuk@/h0֭+//O\gRVg7o|r;;;BНڄh%%%.(WW>Z^2eʔ)SRSS/P0 cEu }@?T5k7"Pj^ W\&FׯCבޮQ ٳgυ sssYU(NNN>>>cƌyp=x)));v|Gqqqϟ)XZZ:88CرƍCn֯_ϲ,:a„k:vӧOҌ7nٯ_j]2EEEFFFM6mҤV90ܩ뵼ԩS c~neyO8~?wbY׷EZVfX} .ܾ};;;ɩ_~>-55ȑ# YYYCuuu|k5= T̙sAC-!866666vϞ=ܸqtk//ʮ|knݺΝ;smĈ~kٳ޽{OӴiӀSV8iҤ[rǿˎ;!$--M o^f8ׯ__lYpppAA襷zk .իW3gΤK_(cԨQӦM366V}6_2`!CTy3glܸ?uww>DOsO׬Y3eBȮ]֭[wͲ2ayXX؊+Ξ=?ݤI>*;{OL1##;iDnhP)"/^ϟ?/̪144l۶ĉǍ"?AAA?cjjٳ=* L7M ֭ہ>ap뗟_}RZZݻw{1s[nIBHll}||\5?޹sEݽ{Oɓ'Wܹ\oΟZJ>6lؐǟ9ZBϟ(vqΝZ^4j(__]v}&,{Νk׮K 4Hx_isC OraaaBBBǎ*R!.U@h IDATvѣɓ'˗ȑ#(<wAAAC jS"5f̘;vL(O)++ ӧO7o^ez?~/k;»>{~nj_Y:kطzO~ ;v8h ;;쨨cǎ]pA-Ν;gϞ-g* 2?mҤڬYWiU(rrr333Ȉ}>rȫW:::ZppԩSEb===mmmYMMM%XjUƍgΜ)`۶m ѿZ =z}tFboڴITHӴkƍU*UZZZbbR$ wh ...00011QXhaabjjZXX7ndggnjnkk+lҥK<99ѣ҅>^`zԩ_~%((Hmj#‰4hГ'O5򲷷g&%%%""B8Z]zǚ LIt@@ɓ{ɿaÆk 'B$''ϙ3gǎj6g᳗ŋE^ڼys͛tR.djڴ… wA&i_BBB~a\.?3blذa˖-- >sO6mܹjYYYK.]n$$%%-Yd͚5 6L8tp!ϑk0B'LzhBȺus9y®Y`Ql2iٳ;LMMDž>s,XoDKK{?MJJ:vXeо+[b4Ju}B\i&i›;wnV%j`uu񛒕vZ`ƍGyްaÄCR,nذAĉkLw7 T:ugiӵkWaVloS}]Q$sI?XxZUUprr=zt?ǝ:u6m&]v:ujWvuu%AN%m6Y˗/ O5'999UYg„ hqӔi>/HJJN5fNjԨG}TeriݺS0E8¥:jW]SUeL֭ۑ#GӼ`*5)-ݬ0zkjDEK BxP=yM4޽ƍ:mڴ_/;a„i|%+Z.A'ޝEU?3,o "KBeiYfiidi{cVfnb SPEAvAagǵ\~=s;ggͥc==+555:,2& 󣣣dddЛ+3\MItIUmLS!Rn"y8cZ\|\(TU@WեzTZG֐Pϟ]N^y󢣣V:t;T^]v=xMN2JzzzJTޮ]/]˾ur:tt߾}(@i#p½{^|Ν; RfM$F>} &9 Ofl[7wTNU)ŶPmJ0~40GWP~~~~~~3g&''JHKK0a7lg^~MS)g*U-E]d ={Сk֬Q?S7np޽3gB -,nj{p.]W_k? tb .̟?wt ŵvbYگףG/ۢ͛7I//3gΨ=}tz uu3f[{߱vccc:ym? *g=ݻ"C]jUFFիw+Wlc  P[[J8~.1~Pil̙3}C܉6k;<_ g gQE%OJ' Tr?xڵvAOUrwJ|}}=233Uc X[[+S4i{{3cϘ2) jZt1T:mAB6mOQf93gٓMקg̔uX&}ۂzbɓ'Ӹ:_n'Zܱ6jCZXXXOu@@w|}6l@g(++[)@7AHۖ?[R#F ܺuKq:Eeee-^]$ QF3gDGGÇ+@{6w/eذatr۶muuuJVJl?`i PQ[)ɓtA[gFA'ϟ?O2566޿>Ӗ+{­+1k,gŋ|Ν;b{{{&s={vFF}FUYW999&'Nl8<;C322>ce-ZH̭? *p֏lR9s\xQ^ɓ'kkjjJ/lgg&~mK`}7l֖31>KA:rqqQm)%mNEEFF[oqŋsssef.,,8q9L'o߾}$_o8<;H?9sݻ7l\XXDim|+A#>>2_iggg[VO?^ffϞ=s̭[~~~Ǐγ}vz [XXKLWgDDS~͛~Il6qIvv;/_~A;&}je($$Dd@@@[2ݱh 6SY$͛}}}eny//pLFFF&O.>*g/E"ѤI+++dn])HoܸBOOvvv~̙̋3ܹstOBzzzhhFeeeNNNjj*gnҥKoɚkr=uuufz>}z?uy饗>쳥K]vٳ̬8??ދE ,?3ߟ7o_|accQ^^^PPVTTmܸ xNa<;Bݹs)SUヂ윜LMMbqqq7 ۷oRO0>42(һwQFoyoݺ̺pJ޽[QQAD̖ {:u*gK~~tCիׯ*sLNF/b޽tr ׯ_Olnn̔p^5544;n8NY$qfV0,--'MyfN899 8a)SWk#0;pLrrrrrr266駟)*? j5kZѻwÇ;88gqFFF.^@oF8p ...imm{On])VZdɒ 355ݺu󕹦#G^zs2$::3;ݻoV8Y+Sk N: Gttd*? *->|%nK)WX( _}U|||$ƲeΝKO=z;`/ss/]֖3%!!!11MӻӺRXdɹsBBBdnѣG7|3))7444` 0 ..nٲe{TMMm/^trrP(|x-^uJyysssKKK̜>*)))..2 -:wy厩/EZccӧ333}zGWᩡGx  PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x @]x1;;b``0ařSSS ! ,,YZ =*;Tw PAӉWR[n=x𠦦YCCCOO̬_~FFFfff nݺ[:3XU@@@VVVfffeeeCCC=Fvvv>>>7o޼~uuucc}߾}\֭[LzΆvvv}Y󹹹޽{{{{677kii^`ܹsΝ;= fffNNNݻwW. !\|֭[=P^^^^^,l|||VV]&??Ν;>>>ݺuYP,'&&MMM___322_^WWGd\XXxÇԔ&N񂂂DVUUUUU }B455߿SHTRRB}6F)???SSS&D8;;SM<<<-Lҿ&J!1Ŝk~@*555́kkkÇGLsԔq0`CR[[ rjjjÆ S0D1uuuOOOmmmyGGGv,փ 윜ieeTUU^===NNNNUOJ_lpRUUtM4;kQTT\ttt IDATLLL2ƭDѴU5&/=ehhd{f0^N=Pٳݻw !UUU111nnn=z3h%%%|tBӰTa[HUUU7662dqW:&@G=Pqpp':uJ__ԴG666=b=466mАz=4;*__߫W޺u`G)%&\xz:v@ <֭[>dA[nyzz*ح<2Lů:VuumllLLLttt)W\yO'Tؙ.y i "0;2SKKKcccّ`Bp̘1mεkט(EKKkĈ]:Ӊ'f[X`j׫گ_?deeezz:X9KYaa!sȟ(t *zzzA]]]ii.(TV455!C+қ'ZXX9F䏆vvFU'Tq\2# VQQ{ʕ+W\|2Bt֍m߹s] -g^_`\x?]u@E__Ғ9ξ}l՗/_f樨!fff)))2]1DK.igϞ-0cLaaX,9y$gWIg~:_ss!C$$$477K$l MMzg^x9W4hPEEܻw///O[[[ň:s RRRr)]]]MMMNYGGGX:kQQiIQQQQQP(.e!x}~:w !W^IE"Q]]۴tuu>|tq---??={2IDRSSSQQ!666~~~euuuGemm͞DtY555wwwֶ211f"&+++___6*'ݣ°7nܝ;w***jkkZZZzzz}˻{nYYY]]]ccHzW߿nݺikk[ZZӇz7o,,,nnn֭}޽ !L =tډiG]*;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA@x zGW:˗/_|͛UUU"[nÆ j@W@Z29݃Onggl]<ZƍO[PGG'44/i@@dHII裏.]$NCCC]]]YYYmmtNCC˗__jݻˇgS``!C|||LLL8E222.\XH4y;v?@W@pM6I$&) -Z~-[\v={a]]]W(*?x۶mlqԚ5k~J&9rÇkhhaxlɒ%t2iҤuQ !O?fO^d j !:thMMMLwݼys/RTTDԌ|WZw&ss :f񆎮HhmLffflllQQу ,,,#_SSӭ[7[[W^yEcbb~w6:j(ʿ?s޽:BvϞ= &/=y}ؤ-[ZɁ?&---W\Oϭ[,YdժUl۴iS铛&J2UUUmٲ?LOOgglmm'NMΛ7o͚5 .<~xuu5ѬYn*}_СCcccU;d…7nd_"֭۸q#g1KK?O?U&gϞݲeK\\\UU666-rttlRׯƍ̙Cؾ}{rr_~HH9a^regϞD"ypȠ BȖ-[{ X)0y䯾vq:vԩsU$p*bŊ?<;;{2!Bpѻv~pmWWWKge^[;wMN6naJ N81dȐe˖k?[nȐ!?-// R! IIIan޼|}||GG):u*229666޹s-b 2ҥK#?ŋ~Ǐg(((4iѣd!yyyСC?IDyyyAAAo˗eUUU^^^'OdO\rȑGnB$ɍ7͛7~2%+SRR`(rA-GZAAԩS_y啈Q [/rСJ^QSSsܹÇ8qB_!D,;v,00P_O>=z}oWֺ"믿L沲?/h1gFFH/ILL VWUUdo9~w߷o_PP^~BCC>,̙3W&''YXXr'NL2Efku//GlsTWWoڴi̘1-fkts17!44tٲe2#U'Nط7nܕ+WZ̙6eʔx}}}8Ky櫯Tu uVhhhqq2]FưƍG'/\SӫW`eVzn8;p:VVV755H$׮]4 ֮]kff`y3f =bllnaa!]ؗRXX8mڴx_B+Ϟ=Ջ"-##?p}!;;;;;W.;k֬׋D"D!s !w޹~:}~ZZZ7n܈_޽扏3gί*ɯ*2339ݹs炃cbbܪr۶ml޳gO --Z:Ç,XK/s 3;;?d2e_:rH:֧~ʩmCCCQQܹs93gٺu֭ 裏=3~xy? 8JIxnRO(_#:$=A__ٲe:::ɇʛ?&$$I cǎ-^~KnؓǏf(0lذk׮=ztŊgϞ1cƂ 8͸ӧO3f͒wPvP(OWZ5ÇZjjj8enݺ%=lѣG{;Se#ꆇQVss s~lRMMܷoD=<<\ϑfjjqF9}}/ȑ#!gϞ&3֭[/_NlqCOOo}zŊO愝8u.^&555^jbbnݺ '9Lm !¹sr2'Iţ9B?{ <}nhTd4BBB $/ѣ}]Lllt-[I ]vq:Xh&LKH$%W vppPl3nȑzDo&ۤ8psZ*&&7d󛙙ɼ7s$&޽{7= aݺuiӦݻx8={g.\x&%vLWV0aذao6示ݻ8oe>Z`ʕ  80<<b޽{srfL0AW/YW^lPLũXt;kыz3]0**N*SO<2@"g^o~Px+ܹ~;qF-G:uJq~BƍA&_|(444ş`eeEBmF߿%K_qF6`OJG#GlqLN;wXW^y9KɓsR^{5ŗାbG)3tPzU⊊ jhhgEG`ԩ-S[yZp PsE/Ҷm۶kٲeya0`ܹ-VАޘŕj́6g$VFF/&;=KtңGy7ˣϗsٵ0;;Nr^Ϛ5K_}U 4=a] h~)K?]^K"Jn@DwD7t2uU-V^Gy7eyI΋gyGssK/k? ={lg={o&p0٤p[Xߟ=NMM_*و$kה,"XȈNLlll Fοz*Sd[p&R? hkkɇJwpp`8xi88 [ϭlSLYt);"00~w9))..n] ^u[NކǎcIq޽ecq@3:H!Bח.]'W899)`+!d=z`޽?ep񚚚O[D\]]@EE󫫫iy[CFFFJ* uuu[tuujb͚56m0`aüĝHi"##4zw^|EyϾ633S0?ͦemm-/;|>ϙңOFyL 3E}e|$##C% >8>ĉg\\\AA-;VXXؖ-[ؿ\f=u$33|As Ю0GE3g^3ڤk׮?~%Kūqi5N cy x1!K,ᒒvZ/ec3N3+ZrO6CΜCJKK^%'Qt]tiĈǏ>oB 3ΰ~zwū)]!PQd޼y@UVyxx :tǎ .%BQ(bt{Hޛ`:S:3=^I;@mxrt{P<-z$BgJɱm] K^k׮K.=J1cddd$Gu֭u[v@gϞ vS"\zu޼ynnnvhnnVI}T&#3dggӽ.^^^.E/Y T8gJg%Ksf=l|`ee$鵿8@]]Gw.\?>g HG;)+!3a-,,lcGo)o[zۍٖ38|10 wP:dݼy3}+Μ9(T]㛞ys ЮСCWZzjUtmmʕ+99-v'/PWV9闸˹rVgܺuik+mȑ5SSSy0..^L}o:N@o>hmm.|&LLLTT۷OtR#;;;z∈eId'j?̐!Cdff&Jt^u:yh6illSZZ9Qٳ32235dPP{\^^NM4s ~:wbeeE/ܼxb͛G7 cUUUo6=]7|C7mmm9m !O>Qp٪3g޽yÆ tK-#]&7$U;8 byZ˗/g^khh̞=[:ÀdCCCXXXZZN>^giɜElllNJ39s\xQ^ɓ'ZMMM5544\\\3/͕w͉'5s1c cĉˆϟ?ҥ fh?;P!;N}t 8ԩScƌ%MSSs֬Yϟ\z}asu[}ڎy+V8::ʌjBȀ-[F]RSSsss۾}ŋ<==5% :$44Tq~ss/}akk+o0' -j ]@AAATTTvvvEEP(޽{=Fݼy3>>>77R,wKACO>GijjW@svvfvw .3**nnn&M9… NNNǏ,zT򢣣 č-jllE/x*ϻɓ'l[~}@N8&njӁ@Ț5k^~eX,f͢,Xd``0{쎭( }}#G2ID/ <](II vxfD"ݻٓӦM <SߙT"22rڴi.]bdddmذaرaaaʊD#G?~ɓ} zVxBPPPQQQ]]]AAAmm-Ւ%K:b T1++>lMMMo^ptt100խ*((ʺs}JJ۷ytUȐ>e˖ޕT У@xGuxzTw PA@x *;Tw PA@x *;Tw PA@x *;Tw PA j>"Hz6:@x*&QyGWx3*U%˭~*nzIgIQb3^ם"JA]aZڡy+71s*.1~FD_"Wmu`@Iy9KBW SԎ,p0#*=*2iHjhXvK*{/~i'QU,)}V ʉP(6&bb_\p0a /QPYDI7]SļJ %o7}/ȽVM ;XK  -wT=BnHp3d^+KTq1t87{#چ2Ǜ«B$F6:.LUKPAjIhz+ b 2N 'MDDb=@< OK"5HMTr>MSDXH* 2~kF;UHP"(H&7,%Il!@Er4BH]F5n싏/e֗&'JU% Ǯ"?^(QW NG _'E)J#(Eb`)&1#jsī"j&|lDBbjO4u\_y\d̘OȐu<\}g!Zb@=.XY0a;8O EQʝ87RmD !D"&GoSpqx=/=*/o;qjeZؒń%N?*\x(!DwUx~wL?)L9j`&)ڝBD„jgVrܠvt+[O.&3+xhh?C8>"@oz!DpaR8}Yx^=7=*W# %}|#͍Uӻ'("1uh~9o\SxU[FoaSDF!}{ %jAe!=e<!\AΥ'2d] 5+vÏZ;GG)L56"ψ|nMi]3ORʈD"L=l#GÙ ߸2 LzM.E-VZB&z^&e !~ȝ).y14"x+y'rXʜ]b-<1MEP%(J#Hl=$LAA"Wbl8ϿT/YHCFɼ!%,H;A8S} ȉ+|,<ϺH"Y_qce\HjAAm)&L9'N}{{oI{oq}UDtAe^ BA"g(?,7兠hE jjJjᕷٝf}-~~35ʲkᙡfijy"%b(ܻ?ƶiay(9vqv?\oOC3Dh^1%ZZp][? -{M ڊOPΦI) r1|T<U"'wIC&V:qy+N[z;\(.A$^K;lahCUAт ;  =z)uk߿'8r~z+w1S]ZIP) ^E+vwApvwfh7д;@[;ÖWlApr-ɺ/ijŌӷF)-:$t짆&jG}w K P'p4p .%  Pw3q*]ӗܰ]b5ݎyRGÒ'7n{qa dN,y@wvKJ×cJ[f.+v4t&l- p[EH!D߲.~P;>! AE7n߃+flE)JL(ԉMН-5ź/^nO>x}g29UՎNSIi6obb%AK6/ A~*.SMNzzLPҋEY/겺T򳄜tGC*;GCk+9ʿ[q@xiaGO|4QK=AĤ_?ګeOqn!%l+W-.Sn/idhK s{,uY*bqޭUAȻZ6/9-6MShdO5Xg#mx=EP"uto|@N[F<^(+2ß_}enc?Ddyۈ7.ZzXط:T ^A8lK|Ep[yt*b[?y3JGSo!oB *3( f&;lQFM.9yYZb y}qu/7[RtPA*\A<}Bip3S'tE_,&5x%]bgŋV/ڵ7oC.tXq M1=aS[gYqXط>>b.p b=/'xݚ`NL,m15^L;)u ?5 7Ĝtia{A WrG#CPo1𭟛wTq4t2.$W WfR1/Ve|[NnbNwF.Cx%M(qf`0莯ŭR!ƭ8 Тb/&S!'5>cx6.p[bv f]6DQqXɄʳZ}A:zC;ѰN#Qw2גRgGW{#Tp[GW ]n^^g}!w?g`z K["-^OJ ;CAiX#mQbJwM(] ^adJv{^/1;Mu҂jN#uN^7OŬGyW|Р݀ MnC{KfF9yGUw…Ǐ'''3F:dRRRւ#߿?0&MSMkA^~~k۶" t-))i۶{:[W9rիFGGs|_@f&?x9cɓ]]]A_|4,^W^UСCeW_}5mڴEG}s|oK.K˖-'O,(uI&)6-Z̃YvTΜ9ӫW2>|p6m8>Ƿ WW2dH޽M^aV4ib_u۶m'v(BVVg}9ڵ]P[0>`gt؊+; * ,su|긤7nXahhDb:$%%)[ƍi0?z|8KKԉ!.&zjiBܵaPp윜qOa"TkW0X 8>ǯn$I&&//TxXs 0//Jn9~=>u\hh{+J*_fVjٲb:Jom֭9>Ƿ+Z$RSS%TU+FvTgz{ws|{=>Q㊒-[Vb]-[$ႏ=z(oG6lؐs|<>!))i+/hZy4Λ7ϜݍMfDav[T>2ctF/_^ok@vQO ,_ѴU]ҿRٳm]׶m!Cdeeeee8::6klĈ+WOsZw| BPPP|| wqQӳ]v/_pSN*KǗ7uvAHKK[t۷o+󩤤Tv&M]f N< VlllddI;Yk߾# B@@@AA >99Y݃#ؐ!CLسm^~EaΪ*!!! 2bu AvCe䴴͛+֫U&;_!u>`W\&,wrr2[RRRnntV1ba,tl?444 U+???===55ԩSIII&-sl}~~~m5 IKKo*\ n=L#nߺukd+TP%%%}w5ִBVAuWll]j&U,BP@]Wcqb> PӡC2g#KZZڟjNh hٲeV%͆LV1A0EZ)E^>^^2~w}ǏuVQ^=//VZuܹgϞ]v\P[p*^~~~vv$//Vvܹn:yɞ={-[6uT[U ˩޼yU3??7oTl_WJ?9rdՂ nz̘1'On֬…Z 0QQQAQm%^atܹzcǎT1Z@ B9r䈼$((hȐ!UY3T͛7z뭝;w~;wuu⺌^DDĢE]eDQ*\{9sK~m>|ƍh F\2 `{;w^pܹs󮮮3g>|e?xGf*k׮?~m{7nܸ:k Z@P4g}z}hhkdox5^z4suֽ{?5k_|Qյl@PaÆu-x衇F9}t: _~̙:tIŀU u~jWW?P7 Ztp6 jTU}QEaRRR cTPP%*VXqCgׯߓO>ywW\|Addsϊ__СCEEEg]\\w>n8K1ZiݺuoӧMof͚u 8߶c͚5f*+1 ǂ ꫷~{رO,|rqqNg[fvvvFF$33S__JJJNbŊUViĉo>3Ç%[l13رCtر-+|]xUe~0{e˖{dǼgNN*SUV^x rǎ;vػo7Μq_|ŋm`0V\xb3/U%''g|W@K.5k֓O>YsAm֭sU-WXXx|Nj/Scb QA-3qWm޽{VW^8q"w{l޼yϟ/>\5ͽz}[o|5:~xDDĉ'@\\\AA9nڴIQrA3믿*J74ի{omȎoi俾*5nܸ'!55'1cu'k{1)E.%%G]hǯ^z}'f <3'NkK/N)rǨQ/^lŹl;FPAmyZʊo!YYYSLy7-_^dgQz… [CݷoE{]x?OTɩ{򒜜;w޽{3s⦘CQGaΎ5xСh*|옺[MjRyiiiw͛O>W_5p y7,X TyY:w1bEPb0VZ5fy =>襖v={ ,=?`ZC>|Xsnn6??Ǐ򖖖Λ7}o|ɩ}7믿KKKZ߬ F~7 YYYgΜ)Q(&&歷zW*_}{>^gΜ)sH?п^|̙3`;kNs 33SW԰aCuzsuݼyS^R]:qDvv-..~衇=!%Z֭[v|||/_u%Ktu!ofo=rj0R?_~]XXOVVVRRRLL:޽_n]uWB>?.֭[ӦMݯ^zǏ+ڽ âEt2dX<})FBPA1sC) ]\\&M4sL5k;~PϞ=;88ž/_~ՓO^lիm@!2cƌ|P?0xEիKȑ#gϞ-o}p 6`nfQ۾}fefM/%o9s%wuƍ;<=K6mR;utt{lUxbΝk!))W^a޼yjdee[9oog}'T\Ϝ9'Z.X7qDuJ 3gzԃ16n_ھ}{V*}(>lTTTi o߾}*Ϟ=}ʟuַ~ɓW^5מ={,?sLTXQ5m̶T=ԩSÆ mRʸx(ٳk!((hÆ 'OV>}zڵVԡ>g͚nԩ̙k?kf&u|2󞷷ouVuݢELϛR EanSSS i&uvc]uy]aÆ}7{ٳ5k\xqU_K̙3Gѕ+88x۶m&2e?(,r ՄZ`͚5A-Zt]wᆱrJ._\qEw tAAA+VPܠƍ={vhbРABg1Mݠazldddaa񡻻[$*ݻw #Q\\gϞ]vK\\\VXazoFN%|gjBPA-ѯ_ǛwyM^res=ӧϘ1c̯^?ϘC .TI5 rmb{{ 0qqq&1駟sς8Gaǎ{^r\yծ%Í[Ϟ=wذa+WXtT%:tkzUO6_yEѣ6YgZF 3swuWO_.n>h݅ zYT='''Ÿ_$//OqGEyGNVۜ:uzM6GJ/11X/̜9)tر9C;6ݻυ3 IDATƍtҪO:;;ISxkfԝl_~Qӧ~D1 gϞ V駟_۷oozDwqQcIzzzRR9*ТSO֩n86|rss\]}3,$$EWȑ#uҪ)uQQQelKKKS,P KG_ŋ2> еkjUԳZ^OObр=z -[?4 v EZ*J:vhݡRũkݺug5k֩S'y?Û7o"nܸQ=iv6ܣE ܹ[oJU(55իYYY UJ@}9zI`y睖OD:QLM6U0z6GP֩/!!!*88Xq۩̱Y͙ Fw}<8qsmv)Ucǎ)s|;v߿eaڴi3wܱcں"(##cݺuqqqIII7n(sTR(eCZA"##V*@Ṫ<-ҭ)sY%:6Xݾyh`6iĺ3MV ؾ}"Ç2{Zv ''ǎ?믊}kҺfN\34^=eff*J9R26WǨ (!zc#qKy!Iff(VQ,"QtyyyYwƺ_~}':t|˗/SSSA0`@ ߿5߯X''==}ѢEpIHH1bرcZR.>>>6Z^^bMCWWZ:N*ۢblE4///''YYYEEER_ggg77zy{{zzzzxx8884T3usՋ)^Aڠz9Z, C>ǚѪU+EH>} mݺULbj]f5CErwuרQ+<\rʔ)4l˖-SLv횭+R574h`CT/[UiWbƍwEvqk4idݝz-i&)H7:th߾+]}h722RtPRR2w\}oO>y衇lUS_N5իK+j< ޽{Rj/-ހ&(fee1X#.DNSuP[W:(J*Taҭtur0 ~{߾} ޱcf͚;;;;;;6k֬cǎ ۷>]Ν;~c.GZXzk*JNus }QKLLL_ *Rfy޽{Ӎ}\4nnn]v mڴNRfzSӦMCCC#""vjVq{޼yRI!!!{Eaٲe$55u۶mA԰(\rEgԀQ[Q4w>>!!!...fwqq ^/k<ڮ4m4|%%%ӦMx9}pܸq&V 0ab{Μ{/_8qb{ޡ?Ʈ]tSP4?(oUK={LTSO)F lٲoƢ|t2jԨJ<Ν[rϜ9~ w,..0ab zML4In~~ԩSi|I˝Ug}V 1{lwW\˛ M6M:M:Y+/^8zÇ;߮:ZɎ/Ũ)xfddț2ϳ͛0I&OI\aM40`4]EŌXU*^R&&&9R1Ow}7m4E y+ ƍXLܹsӧMת0qgG֭;ud}̠ 999zҚ7UZZ3ϘE^xW6GGGZf0d7azЋ/hz6*Yח[؎=:n8ӷ~˩4_ܹ߯zAA gϞ=n8 "esΝ;wNR C۶m{*5wTIFWW޽{mVثʑ2:uz~ݻe"݊{DQ\`Ax {뮻VZ>''7۷洱ÇoMә% )ѫW/E7n[H{P\\hѢ.]|}G;vtRu~&(kZx޼y.\VA͟?_=sTTԤIz]f[]`?snӜ5~9}7_5jzR{Ν;{+ʧNھ}hE.\… /Ry/ȑ#&&;I})iv2 rrr6)!i&,,L٢^搆t0%qqq~~~nÇ+9W=/߿c###?ϢEߺukǏYaM6l8wɓ'+'N8k,璧gvvvRRR\\6VΝKuI=kS2'Vɮr~~~eV^}Ѱ0//O6fz:U˗GDDJHHx^z饎;h#77ƍIIIN*+kxn^ i&y޽{7o\jz2߼yvޭjeggϟ?С7ϔ |U>>Uϟ?'T999yjHHt9ʒ.5yO?} ֭[簰={ׯ_?+++11qqq׿_~ϯjyxx|CU\gϞ'Wnn>~/_^u7/0 !..И"ȺfU- .\`"baaa\\zFӦMÆ 믿O]x믿6 >3='N(s 4br5r劙'ozR2W)Ӹq-Zs]3G^.11Q'T??qԨQg;fNc=gUi2{۷N  *ѡC^{m֬Yo׏jܸ+ly6#ǗMZZiHHHu8xK>쳊9 :tС Э[7KxUΝ;]V⚝csmذuSGk&O/)(RwnsUk5t:]nݼ')))iiiuX _zaž/ 'O\Fz衇,^&ڵkҽ{wWW 3fԧu ܳg}nڱcGvСöm3.j_Q *RP_uVRLTC׻uMsZݾ~Հ-Z8pW_UObB.]"##,X`?{իWoׯ]6>| (m0@Q^O?U`g<==W^nݺ;}G/WG4{lE%Kjp7x/4ONӍ7naaa111Z[sɒ%~9{zz.\/0f̘}w}_5klٲ 6XpIΝ<8c &=sP^ bNFq%BWR#5iF^A\r%y ayo3f 2kW\y ix;O 5h;|tOX]ZU1cر :&;"w˖-}9jԨcǎmذa~t:u1cƯnݺ_NYfg.]*=ǎ{#܆ sUVIlٲzj)SDGGO0D\iذ =*-_}nݺuaÆXOV:,X >>Ē\6xiӦjƷv۳>{iv:r)%,"})ܻwojjoСCmp֭ƞRK*qqq{?/_\PPpws=e[\p͛:ӳEaaaH&MR >};SA 駟|}}oݻ&]աC;|'' vmmڴ F8x}RRR_^XXִiΝ;4H#O?EGGܼyK7տYa wUTTڨQo}6 'Nؿs222u6l(͆ZT.Ű"uܵkWQQvնN>#ׯO06zhj{WmU~I'!h~VI7oa(EEE,oIFN+--UOn )*rJiiiA+g9;;GDDت>N,Kܼy8^JM4lp!I&Ɗ pʕ7oڶn0ӂ >SKzonǎ6lXusvcvvߗT!aÅtj???RlNzѢE&L0sm۶mܸQQHs Ej}ԭrooo'''j5O;99y{{+ʥ 3^~嗙3gN:^3g<39*&}AE"_JjTiР$ U@/Bffĉsss%%%/޽͛%''g#FHOOW<5yduX `0H_(I|5O^LOe׏P,7nܸm; tqq̼xbtt>}'- IP1.(ECL| Orrr6mڤ(?{ٳg}X/ر߿`$'<<|׮]?ѣ+ԬYiӦo .% 5;T`0Xcʕ(:z988ت2NDDDDDDqqΝ;]vMWWWooovEDDt5TDQtvvS1 6\aa"8;;36rrr:tСCm];g]DQtss <ۄ|2byA(z ƍ|yG#屇"|o)\vMLTy2arZT$(*..l tbyDsM>H222Atꌌ i`08;;{yy٪V"rwwoԨ`0XZZ.ÕMꖞ^ZZj 5f$c PZTARPp͛7Pb͛7/\xQF6l4. 2]奤6jNg+ Vj; *׷aÆB%!!V+,,LHH=hQFn`!HDQl۶TIגNw|Ea6m(ivTM657'&&fddXccBz(ШQM L"=xSN򒒒|NW*AGGG(ԩF w IDATsrrl]Sm]*#͛H}wRMtttVV1H?4oߟ)I۶mN>]TTd,wttlڴi۶muvӆP]j;)رPڴiӭ[7z&qv-ueԌ͛7;111lܢE{gҥKuW vT¹s碢䝬۶m۵kWN뫶uE:^9{=zhݺ5)[v#Gz}Ν'MdѾҥK՝M/yv&TJTTԹsԁyݺusuu  ::L~֭[у?~ڵƇ۱cN2eʕQJPg0 BCC@ )))vJOOʥq,֝ȸ(v֗T??PR ̷suKٳl2s裏K+N@Ja?{^vM%xƍ}m۶C...ߑ`RVu<{lII-E:i n'''f0SN5իW-Zٹo߾!!!͛7-((qFRRRbb'222Ah׮] dAE }ݷo_ff1BH-%%%NJNNСC``:"ΉqwN'E .$$$H:*z|۷j9r䈼$((hȐ!.Bik={ςkϞ=~m˖-ͩ}̻Q1A~~C{rN3A:IBȲ-@#$9,eQ9Uv[rȩH"RF't3mc~^{OM^z__s_UV%򥥥5mnРA*Uۜ_uժUK.ݺukܿOq~驩*b:tA#]ty7vΜ9;v <)))ƍ ߰M6-|Izzz^YWE%O^3vq֬Y?Clݺu .QFZիwWVrʱXlΝ;vڸqڵk333lْw-Y-lNʻKPTm۶}ŪW~mR.]? 233nZv:?)ׯ:uy6lذ} uQsNNV\9iҤ fff~=zH6 tN}NN322/_j׮}s1;vYfqMT\J Cy~J"vN>,_駟~ɓ'/\p^۳go1^xW?~Uv)Op|嗣#~>5dȐb /p֬Yڶm[Å󥦦֪U+n{+x0͚5۹sg|vXt1++k˖-ё5jmuYgKё/|ƌё[n)xT(S/7/ܸqnWț. n*JTı_3.o*͛7w}cƌg|7|3r{kMb'<+d;vL>}O>䣏>zyuW}5jԽޛg=Yn]ܶm۶-<{K^g*xoܸ1nW8v_~G}t?_ÇsOkYSBT |%ۈ_Q /O?z*/˖-{]xt]w]r%?~n}"͒';;ۋzGM6ٳw{+V\}O|bTT(*/*컏>+X~}Q7}饗VX;$r-PNNΥ^u/;;{-҆ ܤ'sW\yΞ=;#ܵkSO=:t$6ONP\*o//X,֨Qv5lܴiӏ?8ŝ}GW]uرc:וW^/5j߾}ƍ֮]hѢovurssyN8Hoj7:*rUR^JbX{Hw 'DWZr\^-[&=cT.lҢEuQxm~׹s~_z'w=nZP\*$/++wjjРAnڴiĈO>deBos=wu2#7x饗~bڵk?'N+cUZ5:dɒ?hRRR.sÆ 馛zuw<#9˗//Z:t>}n+%5o|ܸq7`W^yeO9ťl?Pt҂ڵ1c &l7˗/5 jРAqWȴj;C O>~{믿}^UTiĈ/bӦMߪ|+SӨQW^yAO>y1 N<]~P*$iԨQqohذQNׯ_￿ە?)SDGU'xcZj̘1doo߾_ک/FzQ|zo0ieAGׯaÆ n>`zEG͛7\sqww֭]v NTz+m4iC%rQj>--ԡCgڵkȚ5k69eArIO>$H5jݻw{RJǎ#s̉[-++Gt$%%HoƸ+SSS#Kp?k*R;X7OݺuKpf͚EG233׮]qI~P\*$?93:"裏YhQȤI~1=p5k<#VvJﻸPbqW@$cܹq#ENn~)xiFN=ԢNԬY|sssO޼yX)*;B2-[7ru' 6 ^iN{ոq㸑_~;!OĭXbڵ6mE$r NUVō]R\ ~-~7nث˗Ǎ%@^=YzرcgϞxqƍv*-T(vBddeeō$آZ~}_|3HDyg}O?ݶm[̘8T(vB"ʊ{]KX%橏ӟ]T(vB"+7U\%[NNi|&LӧϺuJz} NPdq#%w@AJ{e˖8#h׮]˖-[hQ^5k֨Q#D:Y%P+U}֭[KhUFV3nᖕ *Sņ|z.+*;/&Ջ?~LdɒکbZȐ!C*B24i7ߖDzhH<کWXiڴi~Jb} N>:n+Zn7_*S?k֬N8$&*>P 8F>䓢>J'n;ƍ|}QRj~q#u-іT(vBdwy׏ZjܸqE̙3wVZŭӥK{}Wj~Νq#6mJ|9sdff*;B2TҩSG}4/^?4l3,8Q׮]ǎxc/>묳&O\EJFJ#N}O&8ENNߞK>k%THR߾}J>/ͷmܹnׯ_jjjt$;;o^xqs-_{y=VVZq#7n,KZf͚ō,\W_srrz駟۷ *$m۶_|qc=/X۷oKNQƭ޺9^z ._ozSL9s,Xvq}3++k čdddl޼-stRF?񏅟􌌌;oOYO?,B￿[n?n7:t0~ocD?pM/w]wݵ[~?]tO?7駟wƍcR8k.xի;u_>믿3o)y֮]ʳgm@RM4K/-xEMժU۵kסCFtA6mZx>{ܸ>^?gΜ?kUVN> ֪Uk˖-K.;w^orȔ)SZlYp?7|ѣ#}9rdVN8!###n#h׮]Z6mڴt~u֭ѻ>8^T{8;wsM 塇:jԨqkn۶mg̘ѿY"55[n>}zo%f͚O?t[GʙR8< /p@Ϟ=M֮]̜9s/c)}P LBѪU'N8k׮5kj)))[~衇Ν{'1Qzz>:w~hѢ?}Ξ={ĈUر :vX#p/oo?*55|K/PS}/7o0a^+}P @neee}GfZl٦MW^~>m!OJœ9sM?^z)));#8O<_~I~*UԩS?S:vXJ>bS ~ƌ|ɲe6lذcǎƍm۶SN ^Cb'pB;2e%\XnŋioT2nܸ;&8WEz^;=qP-[{W_}̙3 X,hѢ~_}Urӽ;v|'Z)Xl˖-~8$''g;v( qBp>?ԩEj_| /P~oqŊEj#FK!!,XP:Qs PL6kݸqcxڵ۶m[~:ulܸqݺu?׬Y]'++k)))\sM=##F\r6mN> 4h`k׮Ș9sf܌UW]=CKz"HP*nf͚z_|qZZZO<1{ 5kM'O~ǣ#)));w̙3gذa%= $HرcMѣ3X,Vnx_~V C~ww;X.k׮ё^{>(*@]f͚n?.iaÆ5l0qΝ{֭[P PŕCfffһZvmtz׉{LW6lxFG,Y2x2:*Ջ.Z*]ŅJܞt~Bvؾ}{&}+f̘13f(B*@״i 󣋍7t-Jz27lذkg SD!T#.I*Q͛7/NVk2פIDGϟCPq;s .矓]СCu>6ov۷oP*?~|;y7gyfw.N:5pBpGqёٳg/"*@p5D/Zx#3fL<9:ңG=ܻwhdeew}E.4}=Ӣ#/b P*֭[{ёzKp;v 4hΝ^tE{ZQFݺuL4)1|2<=TqÆ W_}O?ȶ\s͜9s#/|?OѷynΖ2צM}QPQhݺYt^Xx<,X .]t޽{5lpРAnm۶nz9|Ȑ!YO< W(kYYY_uQJOOoݺut5k֔)SG~^z7ڵkݣ7xw'Le˖N7o%+222y<ٳ{w)Y`I^{ŋSϞ= >K.۷o/*~`q7'㏟:uj/xe͘1#d׮]}G}twԩSvYYY6lw&M+Oy䑜>:8{ٳg2[nZZ֭[VX˽z}w&8i:餓n'xrNKZZرco_=777O;w\f͚5kI'SOŽ~?va󟳲۶m[hQ"|wvmEDs=SL(2f͚>߸q֭[UVV-[z-Z(g͚5s˗oٲ%''jժrHO;ZjĤ*@p\G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p G*@p M%IENDB`davmail-6.3.0/src/site/resources/images/android/davdroidaddaccount2.png0100644 0000000 0000000 00000311132 13410710541 024725 0ustar000000000 0000000 PNG  IHDR8p]sBITO IDATxw|[} (%niKִ%K8Nĉ4N&m4M$jYM4ߤΰǎ#oI֖H R$%q  K 8.Ź$E79[qD9PCP ;CP ;CP ;5z1`֩ :M^kBUZZ/u;u;6kx{ ` UZKlJB̢XYҎwN'.>pp;l#6{?4! (fK5'݈F5ǦcS'G:>~bR) 9LE0 JNJL5jպjSPfcr֢V=U\fbQkolbQ)Uq1 Njs{f;*[ H1[J4]Be/Znoik+E< 0*O 1J ZħٝCslx98sjFi18%`RhIR|VswHϔPToTJu֢䄬N|#=]6{טgt\nBQ̱&crB"B~Ak,Xm5ͿR 0*+F]|^jx)cveP;mcѮRmKM351᧥s֪ "МCJfA\T?5q]o=3ЖlJ87XJol;oZr@J%.͠ r=QvMO9ƆS?)4sn֢jk,̥Q ̹1&cQoKB؆:GGz;Og=͜bQ)ЩK2׶\ow9H)Q1hft#4 F?88{ 9n'g.ͺ m䶏Ă?y\g.4z{1/Q*JBJY􊮁fkߕɵb.L[eMijfdtdqJ{.4E F]Fs΁s;&cRFbaB"&ftqS*5^'pcZoRL9,wsTkTڒu%U ouᏝMg]nŶiLKa`}SwN!,4+n/Li o{:ڠViZS3)>SUر[O\zu:Xt{, aGzO_ƹ'f%o]ᮼqiw7APQkxDz{KʐJqG(r7njxO 9l־+#rRu{&/4H) 96euegL4s|&mŸTs[t?}Vjܛ-XCoUq;?\uR~ rOBοctMNY%k^:TOՅf)e(Z%/eL,|d7bt={4W|x~Kc"{6{!os[swMWoUѐ3+*7!!Ay-^}xַnzڝc#B89ސfMY^N2414KKw!in!{i5;Kև.֏y\G6dϹR%ޙN%]k??rlX{ۏ׿r``57eyMy%`yOOG2nYBqm edtBCށu{*g&c҇~=Ŕjxx+M9lC[[ߥUe7/|㷾a4[)ET/Ϲ-/e%.U1:F~KduҬ 91Xp;l ߮lxcUMK_uɘyN]z-x@l毚cCGrJmm0d:t\;޲9}651;?X1r?aHičo_e;߮yP͟%  JȶIڢK~5I;XMsYW}0"ܔelLJ){UxC%[>j >ͱ)%Y#?_ /7IKd'<{?}Idgn/PAEY}MPkkoi5BRI;I>5ws`uωշD]-zK2ܽ1slJǵH)ѲĦI. xα~{x/Y_ k`[!&c5kQ#[k_ )Q]x@kMQR`s"I*dIs6?A/ův%3MƤݫ>/=R3M- {ַ~_,Ŕb KQd=7C^.yM_y\O)ܴaJJIKdӅ^عC-G&ܽQJ~-GOnٽXO^)&g4sGcMƤqGwI aY>PQ*r{\5BMYh(@o:uU3%I1e/lwȏ#iyT$޳汉w~K1k'ngZrʿJJBt>ַ".XOo?R.wT5vK]Rd=y58;sB !BaM Բyۄ5Ǫߚ[(TJup 9g||ǿW7v]x/?n<|p1Š /ʷ@5pSR6/}DB%~ڙ_uARʤ[`b`;ji&"[xt7A>JᲿt#؂ľD <w(ߚb- )#5(ʤ枋!'e?;lS8t*,,*"^c# Ƥ='~yc3lKY[˿  Y>1RwN ?HX&ƶI{cS_7;rS*[t7Q VAư4!pqRBƒmf* v_?qຢ:Aaw,SѪ α/: 4M*,,.sU#΁='~~`i־+־+'/-ͺ֨O׿6Sb__^鲵JQ$s]rB^kֶ8}uMīlY~J$sMJb\zAJ!e?t(pn=U o./?}6{gS>0}![xdSvVRqVRq%}UB7}ƮS! fks9_o߿yiRMJ1-?Xrd;FFb I mkxVsI Y9I%YI]lS()2}%뙗O=!G/~i3&$|f8tsO !;>$~̯+0m^2crk0Tjh{lӡMZ>͜WxT*wW<4u *,\!ӽ2n]ɥ1=5GԾr;c?,us^ f֨u^l[k T*J_{ǒ2Zk?/&PqjYXE:!0>ߑ^g_NLJ۹# $Vd~I9I[?|WN2" ʠnye̯gvΦ^'TV}'/}zZ)`S(ۖo~YcBJ*ޱ߹A{o];<}Sk_SW\nc߭/kTVr[ߥgqJ=mI O Ko][xS7cEi7~>#d5.X`[$׿aɽ3 ssOum_H"# 1.0"p='- RxݽBJ8u.${`ͳBZ5(b|I K#]y*:RZOXEq-.Xr;9#av4;V'3X2'>fT;Z{߯Xkwo6NtA9׏ ;GVߨfjXµΐ#_;w_GRfnqw$۔"hWN*ico%|~^nƆoo!lbnws _~snU@i5M0K.҄GFx.P}'x5704sn`Qe\ErN)B Y;'3H;`& W)T!?LYW,7AR#󎅜U)ْZv} !N__NU]I3<w@v- LGB؝j*@Q1,/RU2D<!5ٻIK*򥫻n^^P!.u\[7db2&M\%B[x%RV ַ>sq1|\+6̹lFmۉ?\-9ay}m)! !:tCazE$m.Zt%)DPTJuAj2lgZ/"`2O)~Gjܽ9<}C.3x !ĹCW}Lrwl/{l:puNj>3.HKO5/I*tD,1M_՛l}^qN8~^oM!Dswmqy6a)ľ>xo:FHXT4]厪Ҽqυi+ +tÃ?pekg0eI*v3/|S%kZnBcׅB0Ǧ䧔e-*Ŵx8^:RBHg*[IR?V[^+S|kb>˖wfuoOCãMչ)˅1+I*x\z4Wm[~[U?;q w5]d5%*@厪@\s?=W~>p + e~jy5>ߑ޸?}|o?K 27e5DKwo|wdpwm'**ݒl~x??uZ)*~uÁ߼:UVuكum''X]#{}{ ;j[O,_|B޻og,_x=1Ϳ0Fz/|[*YB2ok x]q:]Y5s(9IlG*uLFTVlb޾/%3(ٔe%8FmW.O*ǵ~8Fс>{SOqb&xCkգAӫZ{sXr+y)+ e~|_<~CT !rJnT5U~idtTZ0me`V{=5^z^?MY]?:xh@N5-^s[Y@ gW eox`f#7n/h "αsGV߸#ED[8t88,˾5dL*J_UVKg^=+?*]=%lgnT|p͟ctq[ϟUbtZW|ɣc?I椲-%BZL!)jQZzjy#M?v < K~jYw!yUoOR0}$s]RBBu;XKm'`QzEoQ=8J+C!.ݔ2+9s"??)X19ګnLvz"6/G>U=:)eq9V^`g`-PhϷ]ސ i޴A2/u7L|N9`sfa:"??)~pB62U=>3R3{=qYg?Qҗ"|~hC}&N劶dRho:ߟ4%׵Y v[gP%꒲iADkw}z:&^c4E1ubcNOG}rz1AcN3/˿q!DoH_y}9͐;Uϊ{oۈT1&mjn~`>^z÷8. ?!^*[IWRsoHlR1yw4$!dP2tƪVʌ%&'fڟɫDhO%eZaI(3c[t6ثYzZFp;gmʔҍkΒ,V۬׶^Xr;|dNjyi:zrC]M)CJCc i$֢-ِ{+.uO]Xvy=Qf3&1vy7?ZLCJKmC~TuzZ{ZX\fׅYxחkv{5 ;>oim\qiT舻B#5ܑ}nwՆ~f`37n딸py՟ׅ|?V;V;xw}$sIB C7nsm#y?lnt LRʼW::}JD!!N}6wwYJTo>ye5TtAɚC]. U2 Evy_{~~Poqim|o YA9?izFt?3.uct=tnȔ*veԘ txbs>@T|Z2s{ʽ[?Ulg_wXL&)h׌\=bR73s&^UfQr)YngY[zN'RG^imv?H6kƜ3wpڸ/^3^Jd$YtB!}֋ao?7\2[TjeR1֢UkUt-$f`h Q?/  [R|u϶T}Pe[RnH tHwA__MRܐ-it"#3su6kJl;(x痆bޝt&9R{h +-H1xQn9`ǕW^^ns}NJfӯI.Uߝ}9,w/-n _Le4tGq(UkͲ_n؟>H; }W Xa}BxPI͏ ˦0Ox)PפLk#1W~MR0T Vm AT19EoH+·qB$h>k UjznyOv$Ur@gxp|ed;=s9=5oKTvּ- nEHB=/3{ݾl ?SWK707䛥T+nyOBrSڇ&9nhw}O!Zm$֋3;oBU؞&RQ66#*s2RRŻ V/ ?X,šT{NS](N] V'l]%*e-~6$fJ<+-k!zս-j%PgF/npiZgCyHe/37"lؑ?5Ye[R{vYC#0VU+=cL)r0' WCURb VXKz#)UP)1\AX;^ݫD%u{B[& Xb%d ?y˷NѤn6_nִ6~-ެ B,ۜ//ӑK͋[ F$etJ@$&XzJstJ4!* Ak㒲%DVZ̩ NwM{wMM7B}\f*Z;6H$k ]N[ĠIJ~Wn95`/ڸi'p­ܙqth(ik`j&bn?!Y~9v #i7ECQo Cs2ʂqQjoW%|1PA%t?VyÁUf"lj ]rtox8.$tp)y9B *5ן M*rs-5)~n纭3}>_i]q4ReW"8SqO^yꘪG=cjPf؇Ky9nAV.lKɗZCJ O0Hrڽ) 9n0i3szq`gttrxܣDrɷlNX.~ƻOHZ"-(T TL>V=A%)4Erɑ,3xY/&u{Ỉd.7IHlBR1yzǣJ众13WyNjt*DEr=C;#͘Db9ɷ<2 ygd9*fm1r| *2 t6ڧ+ۍKs/͘D^ (N$%Ԯ&)$iZOɍ ?E6U Zl+ϩPӪo2%|>_^kcq!dzJ%2q^\rm#43WJW Z'#=BBw8zG pI5d@J"3US/Je{G{v>Vr0yqlLfd07;o!"T3s#Xwt,{[#X(Xӯ,٘xEkIi ;¿e1UIN` !4̗ԛR ^otssov K,3X%Ŝf%qJT^&7:n053MJ(&83Yqc7K`[*MH͏46kіlH o7$2w9YɟUi9Z aDO~׳߻pO:ɚCu7Vv5ZUvkA`\qvԆ}K7L ᕎǜʽ 9F.{S+ &Ȁt$U"dJ֧ąe\Z[r- I::xP761mF>W'>\h}RFQ|\t5 ՟m:f Jqp>Rtf Fl4_8:1bJ1(ngCxcHbʖV|/B+uB3wJYfI:vP9۔o14Ur$Jyݾutc9{G/7KNEUޖ|vTYTz[},tʜP{DbKFLrH,ݔ' *+^8yR~}@䴴hU"cNϹ7:&1 "{iニ|JSm#G;3rNk1ݟ,~g9U3)yFGrr"C*`zXǥ˷T&Y)Pܿ,0ijrYe//7F,]ILK͋KH٨.IiRG}ZZc$o &mŝj)6ZS孴٥+ !j[Y+c1J*EѺEEnOjWEjW_X8VT2w3dZ~rdplܭBbQqݙLdYi<.QW~GzRqt=7i}Z^jPOR(hӔmOS6CB IDATd},%/VS kU:[d}7|?|Izw(O1 ۤ8N(UC,1VHgJB(glavT4o:kt^ǔlHܧOWpDoW9466Ũfm2j6PemsvMЊZ*-Yn5tXhޗ3"0~/1U< Vb{RfR ysZK(gAsaUZhh.*%PD#rdN3 nzii8S!9ǘV/ۺ^#*JMY&!u:vchiw;c5X!NUS sn$Ac,݋2'oCP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;x^~>v[ BP(T*JxuQ ;S#*dCP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;CP ;hkkknnl.kttTPh4ŋ[, (RYYyQ(yyyk׮Ș>LƉ'8K Eqq333cn *>lcc^h6o޼})4ǂ{ &zE.-LMMMG,Y2[0֨={g|V/Z(>>^ьl6Ojw4wyުۻwoR_1LPL) h%%%**'O:u?Ǐ3 T{bXޢ^h2nM6ٳԩS!+ofqq1k>>C"ٟ'&H)Zߺukq+LY/L9TjjjB<#sw,_<˗ϟ?]0@PٿȔ-Z7&&&ڦNNr̙37?SMA%5k&brdL/?~xpJLL̎;&`yyǃ8ΪuM/vwwj4ټbŊH^;22r厎v5hLNN.(($100F CJJJ^^^Ҭ/Kf3:::66Fl.../Œ]r544\.Bj-Kff|f200L&lw GA.}Eq㟅]ںtYAhl(Qޕhn&z>hI{o  {fw,99gyi^^^yrss-(( 3335f>{lll,i233/^֒JQt!&&Ϟ=U}iXĊ}AZZZEE bSN u] vڵ%ɺu_ёg S-jjWAA4>W>}q D ܺu+...55U H2cnnnza~~~ГN8ٳ)SDUUUN{. TT Ϟ=4i/̿-JP߿?99.۷ovrrjֲ T/#5h φI^x+0梨#;?vf.))ٵkWVVgaFR]~],O07aE_Ƥp[+66^;`'*//߽{wjj'blq^8qwiR%T<6Ibeeeeeհ}ЖrA2R"fffԐyT*եK:w~vvv;v477.--NKKv#rvv6@0)//w,,,#u7@Y+33sGd2gggLfjjZUU͙tС D{;;;J겲 w… &&&ղ\Buֲi+**rss5Yȸ|2l3}Z5A*%%%T\.o(E":::؈buyF.])iee5rHڢ{]Μ9cvpӡm``Q=aaa=~̙3TDDҵkEi+aE_ZRynHбcGVVV^z;"..֭[l1 sgϞQbxĈ]BR;88`$RQJΝWH|| -ñT_1NJQQ]uyl"700FwNS*y[ug͚| k~~~DDĤI4saWWׅ vA.vvv .l2D"??ɓ'kǮ]q,yyy)#@k%5vS1777|I(FFF'N={vQ 0ϟ,uqź <8 J~bbbCm׬Sr'YN S-2d5Ps=DZP "a"""-\y'N蕗ǍfE$5J[fbb2sLn!p !P2dСC|)5qX,={6u`ƍשS'2Ν;3Q)}9;,C3XːM]Rtڴi|½[Dw rqqs'rn((}3fLlll#tO õxbmm=n8o޼I`իu:LLL+ϳx{{S)H}e5rHdZZgzT{ya'J$2EPp+2lĉ<3wڕJ"QiZsqRIuDܞK:/,, شm[[[[DBRPHSCV Vs^*ű)YYYTNTTTCxΝ;{zzRU||<LqrK@EED"Ϝ Գ^ r9_?56]hEբ/=Dܩ+9D=촲D pzkyadTJp[TZ;`YXvvvPJbggµT i%,UGMNcqtwF^^^R5WUU']T3@a T]3wbzq_6k{qqqyy95!{ Zj䖶Czdq[V/r9fff@@ơ KbӵL=S^^^AAAEEx9Jic@Noܹs@*܅_=nhY\EE~|oܸ33}5_5rm DWZZڰC@&@EtI(Pi AxQTJ%5>A,JN'*//FҋD"KKˆm0*bZʣf,㰏=:~բFn+Gs<9E,7hܦT;h0 caaAuOEKF_nxɑ#G "N*slٲ``z P NZ鉸odY#A*T3J7"hڴi?-7رcQ^ަbjїaȈ+LSDD" NjjjLMMp4n =t@-w$JTT˗Tr$H'rJյkWyMDX&&&ӦMm5!E_FSSSrJ*))i?5~O3 C.큠Tp,,,haw]PPgQ{((1l`ȝ( v"B+ rKhccӰC@&@ۛYR޽>Jiث_$>}Juos5E_Fkkk*w˞ޞJlءz :P133ڵ+3;;ѱ1Ԉ^3=s=֞Zej>ysu"7a<}ZR,k̝- az2ʕ+#Fhccc)LLLzjӭ[ׯ)999riO]}\4ajї!#::LIJJkJߋ/^xL2eʠAZDޗ.]"S233322tD pKGpǮp'JK-* ߟ_}䣼T;}ٓQ[['2ZVVVs,뮍E_=zPPVV![FFqO vΝ;SJbzsK===*6w>a'O6P/^,--iйxD؋;<=;;kkkO>݀K[\:`բ/CVqϞ=+W?BnnӧOTR'b楗^R߿D Ü;wZԔj!qL_ſl@ Cr;}tv n2 P(n߾t.\HIIᓳ4+6@aɓ'syDGG߿.]:u0b8((J!O%o߾KIII[nU?Ԅ۷;\ۛ[9gΜ}ϟo۶Nz6>>djїɉ!GEEwݻj055:th˞Ԕ;r,//o4\< : xbé5Ԙ@`z.CLMMo*ŋwޭvppи|RqFHH a ֯_?MHHfYҥS᫪B8QZZ0NYYݻw4΢VVVv .P]D"ɓ51#RmYJ211Ύ[󵵵?vX\\ƣiRI43669r]h>ϯ4""ʕ+:u022V{ƍkb̙3gǎ܇򨨨۷ovY&UUUfggr_ZZZΘ1CY'ʋ/FEE988d2##z;СC;䐉iiiΦznjїr#{TǏ...yyyYYYܓ뾒 v"afΜuV*xS('NtRd2YMMMqqqVVVJJְ0@wᲪJwHRcccjC^zQOQ o^~emZej2eɓ'gϞiBqvv;wn v"KK;wrbH7uT>9ƌs*]RpORL_1֮uQa;vƌY|ʔ)siRm ^*D.: 6lzٽkLx!T _={WyxNm988,Yť'266>|Y2tо}{"ssٳgk/*jc ^R(z)Hg͚ſgyǨd2Y~jjjrrrϠ*H̙cmm]of[[۔z3 #3|{{,jk(ŝ:uJHHq={^բ/W#0rf:t IDATgϞcYYYM0:Ndnn>`ϟ;i"5R^O~ggyu"5Fi@a{ճgO###B{a>cc;Κ5kРAz؄$=zD Bd6665koO,GGG M%Hz1mڴeccX2Ommmǎt=??_| P-2p52 #JRUUURR-fDr֬Yf;0궎2b[nG:uj{u޽{zs9;;3fʔ) DGG0MhD׵egg'''VWWT*ԩSUdee%''痖:K$TjooOH$+++'''OOO5>?~\XXXYYilllaaammF-Q}ՔJeRRRFFFQQQeeݻwopO<0YYYIIIeeeƦ2ã kRPJJebbbeeձc=z4Ga4W h 1l0=T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ qKHeBTl@#E * 8T@p PA@ * 8T@p PA#n4o\Y$}-[ЋHTtS^^Qeee˖ C/*<JE<БںW^3Xlٲ%!!_m@kʉ':3L&۷رc.\Ԭf2iҤϫ?ܹBҖܸqƍ=*(((--U(2L*gС-]Lhv>PKiiidddddw}7w܏?K.-](_F) 88ސcÆ ?#e/O rrrr X>Í7T*WZſ}lݛ7ow2bĈ'NHҦ/.*hcTV\A&~ב-U$З((̙3'Oԫ_pp[kKKKuʕ+W̙S]]%aºuƦ(O>^_e7gΜ5f̘> a;ի 4PauÆ bgϞ,@v~|7oee՘c:ɓ:uRon޼ŋ >ZAA/SA ˄ ͛G';vXh#DFF޻w/##u:RSonٲyB,֯_g찰}3f… ?e77lsa˗/T*+++GGaÆ4𬼼+WJ$;;Ν;?rrrN:^PP`kk;u~q%''/_|^۴iS#Oֻw۷O6MT*O?͛ncO52}Y|ruu%JNN֝???H$XK+W|又8q&&&߲eK![BY|RLOO;wn-YDO8pBc{n>|.r_U'j{rvv^hQ\\C KM]W*[lѽl ]Po7oޜ6mƪ0114iRTT>zlgfǎ|~QF{-X@ Uqݪ1?vR۷RN8#VVG}}9IR=|O?ӸF0'O&7O<ɧT&N#BHOO zWoܸ4[iiϝ;&~7cǎ=utCRv˗/:u*ڶg4h͚5(sJjj  Ŀ 888(((44\|T*o߾o:ѣG \UU3lذ՛?<<<$$Df֭ωrrrؙu77n&L=xvv~:uT>]kfΜ9qRyEJ _j7.J[r?>lۅw_vO8*J3gƍcOw>p@2ԩSj5kbpݒv@a(m9cbbFqQڑ=zh'{WɷJ.]s@2qppAAA|2 3o޼5kh|={އ&6lϞ=sMJJ9//oٲe|&~HHHP|*?&&f„ JKKSRRx_vmmmo2]]];t5o<d2ŋ՟ܹ5Ξ4i҅ ?Dd+ٳgĺu떿S^:mܸqf&K_jN΋۾}~myvQQQdɒk;YBXlՂ6erիرc2ae&FZv=FEm䦶9sP--- &J ųgܹSXXf(,, }6a77bϜ93i$匎~)/~_GCXܹsg\nffVXXD-]TTrʗ^zرcly=sssSRR7._\cڪwyzqrrիJɹwX?tqʕ# ;VUUwxbLL ՕlٲWJ299999رcwɒ%?BPT8Ta7xdY&Lcffݻw?{[o޽[1cccON666ݻL&OLLBK.M0!""R-&=~=f``qvjccy)껿}#GjkL0ȑ#7]&?{ZYzʕ܈bѢE_~%_XXxQ݃q[Tp6u LK;k T*wQb877mر>nϟ˭z{̳h"|w֭2P݂z{Qo-Y[[^,YBj8f166Fz#}K:!!A1 ١aKK5kP}sssWZE }377ˋ)Oԩ>}PXp ԗZ5/?zHcp'&qssx]hhwejԑ#G<==۶ms;uTggQAԅ t-W-ƨ@ETkƩݼypErɡCt?&͓KIw!{ISSS ܿ 'Ov˗/Sà:w|-m{]n1P8:tp5mҘ/ Wj;CLMM"(""M3СCuCjj* YZZg(ƍ|~+V >֢-gOXE477 x ',aFCD066ujUDd Kͽ YkQhf]hhnjURLOO&Mfa27;:Hu@a]u~~>ٳI&M6MW^nfggsZYY9 vw&$$|^<w::C:_bm|}}GQ/._5\rܜ4i4q7|LX7of7%A5MFPT[nQvf̘1aaa=z6vXmi+^{+ˏ=zҥzŊׯ zM PSSCU/0۶m#G!{xxlذAw7nhggnFGGSdRRR'?Pw}@T~Iw1X-?C uǏsv1jԨmr+Ȕxn9s搓z{i;#uW?~ǎvц@a5S1TzP3lݺgƌ>ZlםaKK˟ d|'l(neeuq- _ ~o߾MzJ~wȮ>+9޷W^W}La~gATk/5MwDBMp-jcۅͦMtO7`r4g $StEF"h ׭6 nu`za+;ozzsn3g~YYYMsEDDmllΝ[o4x{{ۓϵ|^Q/ȱf6s0Lff/үʆjT"ݡՐ!C؇aÆ؅Rk7nP077fLb%$$ڵꫯ4, ='OIOO'ȱ2 2Lzed>3/{zzN>}Νl}Ѳ_ꆙ7o'|jjj"##+]5ދV*JԤsח?޽{M_ڵkdTֻw}[N [@B?&?~<DIHHc7njӰ%5$6ݻ]Mmg%Ժ'O?QF\vv6yxxxP/% GGGTx5޺u}tx饗uӯ_KjFN}ֹsgm'@ZZA=QvW^縸8%χHax ޽{<'lef:ub={To?> s nTmQ &늆prȄX, p* Y$`\gϞ=tPdddVVuy fljEҥ 5KЄ5֖Ho6~7nׯСCy.piBBB"Wi ytᢢ";lfff]tі}PVVFSCztnaQQգGOR%$$4PBpEpp͛o.WbbG1Hn=`z60׮]9rԩS8$DAPTruhAQcmŋ;sss2QT޸q~:u\.1bի޽[Ѩ}GIؑ @gm/^`_(8)Q>Btf1rF#m|ꪤjE޽{ {>L^W\О!PauRK]ִxW״EMrAH$.f6faaaGEGG_~~~~CQ4 y!moLP`[[['e/c.џLJ0I gxC[o[[B $vɓ͐rl755mX/-oT,&v{pbxȐ!~Ν;oܸSr/>-u}РA& [ǂB|5 2ŋaaavSRݹsg徾VNX0M&I/ݹVm"D#"{2$uEu8pꑴ͠8eXvꫯm_999(C:995,n=Ν;&5S-55uJ??^ `L2}v…1c0 }-6OȚڤQFSp˗ccc⸽M?rH޶~׬e֍}B577@ IDAT6&& bgu=GfLD;*Cbr&JoNNNBrGAWcnݸn=k-* \ar]֦Mn.\h? .$l_Çbq4殱m̘1_}UXXXFFիWWXAMrUYYrHjGxS Yi066qJJ Y.p\S(2h!WdpuL}PAܐ.ONns|-:t7o^Oڳl۶|С5ȿ:"o?#F`7؉X?pM"??'$$|w芊oL=1i Tuw"s:88%Q:zNO>/qZbܹdWeeett48l0m]*2qD@X]tṈ^fΜ~NMMxbAADmz j`>M5\_?@DEEQ}0!L|qD.adaa#'W.k˖NJ9j(roiƎK3..ʃB;vMCr_]HRu7]cǎ?~6uƜ-g:PYb9D"ywɛx3ǝ5k9GaǑJh/ԘP$<iƍcR[x19wVUUՃ ~~~C|AA66(--%cpF&El3gKLLU:x?gFNs>dfϞ=f+z:KFFUσ&7[bܹSMYf5n=kڵk9hBB￯jovPPЪUd33n2LMM%G֭̓[GJv#ݾ}Jd8pKQ\\܉'M'{=Ν;$_dӜkppp{ Jxxɓ'u牏߶m+Py"((\PP@}z -[.PٲeK޽2?]"P?Tg̘o>*#Fуd_XS `5fNNN[}˗/'0aYZZSR֮]K>ʻr}{z߯M4Za z |ܹ3gRR{4ha!T[ǵk׆ urrr?דOdvJiӦ#Fh\&ѣ{eSt߾}Ԉj5O͛oܸAf?VZEG/_G-\Pߟ~8--mܸq w0; FNԥK?k}|pp0,::zȑdϟO>/N}СÇ'&&K,ѸPUk] 0;C0dtҥK/^/|F:s挶n}jk >P=husqqٶm95F+Wܿ?y\|'|,H t<ޑ?Sk5՘a['9ԩS>>>.q[o]tb?~LgM6m˖-υ&M5koyyyxx˗̙3;|M6-[LWvv_|sNf.]+mE֭w}tR>srrVXW_ 0籱ơbRt˖-SLa&;xѣG}}}]\\d2Yaa'OA'ۺ[߿Nd2ً/޽mѣǚ5k4 .&Mt}*Q0tr`zyy?]ګ'H̙wYJ"ܹsʔ)ԟCBAuVstt9sM+Zx{{͛l0Xu}]uUU]td|V'عsMezW <|oAuJII!XlٲԡԱГ'ObbbZرc꒒۷Syk׮/^)T>`Ν...<`_ٳGzuuu˖-+//g֭[uLCBB͛G>ܾ}ӧѣGuVz3up^ZZʎҨK.vŶEpprWWW&%11z'%[hZ/>Ν{ڵ;v_Ro߾'OVfhРAaaaTgϞ\LҊ cɒ%| F}9{,F TgYZZ/ƍֿ95=zn 777j#Q 0{677'S]-7m?PVVV/޹sgZZݻ}}}=T~"##׬YCfo!Ct"/##Ǐ9ˢEWE"ѢE-p fʕgΜ5jX)gÆ 111^^^f͚w}^OJ'N<|ӧ}Q ?~ƛ={6do4ԩS?E}g {>}u,YrMjݻ~}jŃ ںukTT9Fnݺ;v&LVϏ_?qm>|{>3m׭ۧ~z5>Vk]PɼytwppOw:sp@""۷oGFFx񢬬100cԖj,+++44499ήSNƍh=zZRRRWW'|}}u4;ԫ󉉉&&&^^^#F߮0>>>?Ԗ344ƍ999澾3gYի/_SNm̄aaaYYYyyyUUUVVVcƌ7֫ٳO>---} huscmڴ>nƌ*/_~EaaT*'WmKk]ksyyyiEILL}U@@^gu_twxh@ڼyʕ+՟_Tt*\ii;Ɗ+9mw}}sJVd޽l"{@/ء'O\vm˖iEj\V@ݬY^}Uv󫯾[<Mٳɓ[0m 0_V㏗,YB.=edd\]arҥ-[$6 L&;yd>}ԛ*j׮]d'J)55U wP(m6jԨd6qh+򐐐 \vMO?+]tѶB8y3gΝ;ףG C=2++ի[`m0''˗/G6mQ'Ʈ[k׮ΖR4+++))ӧ e C~~իW՟ ֲhp3 <}̌Çԟ(g77MmjB$@%33s׮]oܹܷoߠ*@ٿ\\0ofZD-@cTjkkK^^UUUZBP\\C缼lyZ@[T'X,T*zS"ly] -..V={XhImQhRH$rwwׯ_Kڑĸm@{%XUU%J[,- bv]@p[ܿŋFFFrGRTTÜJ333Toaԟe2Y.]tdNIIT \\\S^^nllܡC^z.,==]Ҳsrfee.R|AIIJQ mpBlkk+}qjjjYYJС\.ӧ />|XRRR^^.H,--MNNNJJR(&&&RX^u={:}5x?L]E=zpssӷ$ >Nc.F~in/nd&33ɓ'D*vӓd .{c&555!!TTuۛQӧJRMOJJ22fhӀ4C555=JOOW/ܡC]uƗ_6w"CPkwJvvs>}&(w>n8ƪMnnnDDǏ{:0W^1bĠAٳgNRYj555{쩨`F$~y?~…Dl Ü>}gر666w^g j+ITTݻw՟O>`Gyyywf2s'Nű3YUWW4³ْ+W\bWvg;wnY١)))uuud+W?<$K/IHHF`q_6`clcnmOvF?3Ǹmcs`a22ЁQ(L~JA)|/_6FEEhqZZZ ijj ((((**r7n#ߐ{r޽'O@Çb1Ea㞲lm#Vx]Iċ/GFFKu{#UR, z T$V'Oↆ T* &IBcX***CZ_~ &+pY-Lwߡ˕JFqff`0X֦aeNm#VF^ [n#|ellLՂiO>ıүVWV sssSSSp[PpxkZHXw0kN$8288'x<,|\6ǁ{q@hId@Juu5ԡT T*o޼ -Kuug}fWDEE$;;'ohhC.R-;;:*|kxx 2رch7388XQQ1::J "s/BCC- C |ࠒÿjN|] \ۋo5778۷ٕJVѣGc[[[AA$faD֗/_iii.|f|$@VT6D߆ЯF^9NAAAqq14fk`&((hhZv|---7pw$(?w?# Ys.s;@ FWJ۷Afkhht /'Þ̓C q~j4PH$ΝC C<22zZ8w̢" ؊lٲV533>GGG!Ap2))? ..V IDATŋnA"\xɓ[ndm |Ν>E1+ ?( |||<:,MLL@'S,G%㕖VD`faJX޺u G*ӟ|1+MuoCB$0ׅA)}?~NUo~Yr5ꆅg?dgϞGFFx_OSOw' \x.055?Ç=!'ÞC qxGD\\<QQQɠl`F`W+wvPV]+ g_jr7( O< ۛR$ eW^^w}!!!v9tS*>|o6e8p8<%'';N:.?T=(F_5+^BW&''ggghD:k`=qp &kJBGͩOP|ɓ'QW ;ȁ)97tb6J GwdΝp]ϟ%\}]AXVJEq?77W.W^۶mleggދzuŌ+t}.HHjVdAV*D"0q8G%Jtt4,;& $)1;6u:Չ _jq_ȥ%(00i D 8._ЯͰv_-+ QsH>kEp;(G|Vnp6Bĉ't: Q!!!111 YYY\4ӟ((< yyyMMM@}{|>ݟ&VLlt UK'I@X~?8l G @pݻw L&SWWRܵkWqq1EtUCaBL :::lctEлFkY?~uHE"Q|||xxxpp@ KVڵkQb0Nnk ) dFZ]rsj,g}9Zgep#RGPR1!!!}}}jzrr|bCT*jDD/K*mV__"`,œQe{^{ 2;;[UUٱcWjxBtf:6a\) 5 SGgZ/'CypazЖ)V?77lP݃y8']莋嶶63;;;aJt#l oB= #EGGbA{U0Uuh}ˆ"+^BhlmmmwuF۶m{፴)V˛7oFE_N͇Kᆅ+*A$&&rss󊡊nڴ U}Lt: bEnu>''{ioo'ju]]x˚SRR\ utt J0R |>n&C"AL«Wޏx3LwzE{/77BpFzCSF9_3 :rM7w{,7Nf544pÇI*媢/'vp^Ge׮]~~~[_FP2ٳg]UUzy/HLLޕN_}{[ГR`fGdddZZʕ+Nwff~9;;n&.b G9Vb4^ꅳhVVVÏ<bbbvW\qӧn0Uu}BryBȄ8j7ot[---,QJ7x8O}XnN>fݺuقc }97F/#mg} 7&[k#Aoo/ d `P(n_۷o]m@ѧ^~-HCVWTTy/Px L .. kVpzzZ&qshhh{{;t ,/_ő ʕ+p:88wܚ?33mÉ7h0>}ZQQagcbbY8 ۇ|p:'44t۶m~˗pB455uӦM|1-.{_<z˳==="(((G7n4 >{nŃ$0%T*mkk:[$AM~1T gUFSF u!$A0oFJF -z$fkXVWTˆd8_QTp{\jj*p]f3ť3FaDO$ ŋET* ojjDriG_N͇);@Ƅ{TرcLSS׋D"@`XF#RVVXU\\\iiiee%PW^,//z8$p8MuׯI߾}޽{|>aaannpjIOOGRRRȯ.//|2PZ˷oIt:C,{7HĮ]@bX,ONip\/L_y'===--|\.χƚ >oZ[XXB+fŋ/,,>8>>߸qC(L&yl6lpdT'6+D#x] ,..YVVݻN5V7%%NTbh49rěYnN]>+((hnnnqq>D>>> k|~ii)DƠ4S~Yw {CnYY\f N&wG(;v8rfAEŎcsΡjj2LJgff<-ٶm+x|#~aHH(_J .ھ\VVX,YyDDDAAj=vvyy5~~~|A@@䝸sf;tО={ c4;; Ht'MuoCB$0ׅAڵ %9gff5 $ٳ#5yVB盗mSWxȀ С0,==srl>_Fn@rI)SN,6mڴeټP(LOO///' BD"پ}fsG$eee{$ /_)$Iii)oI/0(]}[u$<<\&MOO; ܹs{7>>x. O^^˝U$={6&&ưD"4C/$''GGGOMMfdd9s&..D hㆲlm#VLu!$A111[lY\\Gx)u5/b訝$vHSw ;jyt͙%%%+bЗNal;u48܀pdm_~rCBB"""2ZPDVOMMePyfW1։DF~߀!o}痗МTQT`/:::..nb08 -..J$jGaJѡ!^/SSSoWD=Q:D߆0b\+^B۫j\nhhhRRj_Ûdu_~m21L/YZVV JLL$I994F/Sm :sT6---7n p`0 `)lߣa 1^2`0 `/Qa# TΈ`0 ـ`Gu_~$Z~- `0 =hoxݻ0źڅP>yκV `0;*aaaA.L&cXիWF111Q(W; @!/:W t&I(FFFD,--MNN __߀hra0ksT^zuePNKKcJ|AZK<1 bqBBB^^^ZZڊTTTx\@ H$[n .j}IooАdBe˖۷RSee%[ =xpkΝ;wfggA>>̀` X0LP(nܸtbT*՟ӧO2ɓ蔼#߯_^^;کz+W&'':*a>קݍubYgϞ / ;*+{Ǐ///'$$l۶m%bpkRr<|xiFvp8)))㽽p?P&Xyrrr\\f4Z k׮bWu644AD(fffEFF * Pfkhhū`pd0*++/\wWŁ7WLǏǘDr#dS:!aYBa5g:td2,b##`n޼ Gfee]vСgϞUUUa?âbbb<_&ѣGKKKA_W 544u\\\yyyxx8?=====}޽/_ f'''W𩧧G.]8i!+|ȑ#$U`YO稌Ӥ$Cf)0#p Y{́ @^^| ǩi__G ACCCݎWVVVBW*::… |-4>('O0>syW@;vlw/S 9Qimm˵ `0 kѣK 讏V@)7ؾ};T*.Qg<L,T(> ?vww%s'O wq 2::?ܹ3%%e AYQ0+B`N1 ɓ` `JDhh(l===zl6 Ȍ L&SGG< LII CȈBliiingvv˗+NC"HCU*[rfggGGGA9(({#bPo)p 흘X\\r"("""%%eUu:]WWh ~~~IIIaNyle PT0J\\܊ Yt~J`0_|||ZZڪ.jFm޼955 5g"Qcf)McDW' p2JbZm6DDDvv@ DWW8RUi>#\())i֭+~eΝY\\|ٞ={ G!aRFFƦMV0+++,, e0T*-tOvdׯ_:::\~vQQQc`Vd8*]]]:A󼼼u+ ʔJeMM h(w/--%޽{O;w} NPG=2K@933ܹs|Q[[(cqOoooMMF;Ŷ8 ) hJ^x822bѣG۷o_1~ tL#jL4mzh$ud555TFsZm䒒#)===K[[la4ٱZe* 11V566BsdGllH$K16:))i #GFF@ IDAT8qm'cfE֍F.GDhhh||C.+ F`#pޗa***\-/--uww'Nti •5KN>͌+w7|3>>^_WW700py5fWiz}}}JO~`"VM3*a[_|%`0TWWϟWVVz9sLFFba9EIb1o۶޽{@O4j9EOSF(?HYYYYYu>=kZUUU3H'OB*R^D0TX<@TqYYYY,\N1ZnooӖ!!!`nnnjj e*Ф<˕JFqff`0X֦&Hhiircbbm6Fb/..^|ԩS鞸/;BDOOSG'''5MTTepK"8`R_'>|~ttt`` Ùoh4^v?!!BqUXP( 0L###Slkkpj]<>>hkV/>hV>>>  8UTT;֭[?#X,cccp,>5xD 7,Mc\Sz3ǓH$Z=?ɓ'b<___T* M&VbHJJrb=F,+j5|RFp||>|M𱽽=33gf͛Pd2oC*GE.et:p۶mwsN/^Ҁ ڿ?V]oKKcڊn>KKK{waаRDPłV8<<\UU 2رch=88XQQ늎 (ˎZ`a8 G~z NMKK+))A׋J͛7Z,>̮ XIvvvII :___ryzz:sd?W5^[@n߾ Jj>+HXX~3\LvYH7228.G3Klݺ.@ ػwOUœH$/^j]n5Ox</99s_w܄1::M ͔hDmkp_=aDOPBBB 9992T*uo6<(CEۡoAQǃ h(݊ٮZuuun݂n.t(0>|BJGkpǕq+++2rzzΝ;WUÇ? ЙΣ*/4ߖ-[FJl67mD l zROvv6I!bϟ?M:3 VkkkIl /GRSSaKooobb"_8ڿ?BjZ ]hs7mD=a+A8eΝ%}9ڹ$'##dHZ*ʣ!@n5ON^^]1vs4ђdpnzV ÈH$eɊT*D`q=j]t"|kz(2 l6T?DDhhѣGID[3';aZoݺ^oݺ1\4uC@yPNu=} ;v 碜6T t|Ծ1rnX1UyNNQHZZX,؋/E"֭[ X`CJNLL V___[[| [L0VitFgUnv[cCl-q8{nPFOn( P!]-1t_m#.Ƿxŋ/V,22ٳBiii\sɑG/ grr֣3 A<{ Ƴq8Y/dS϶m Bp̀j( W\͐d^P!W||<fii M㓚 AU`˥q] HҀZW^mnn̤8 7 BL&ŮyvgffL&dйb*7f"Cc7oPWI+ȉR4uCV;*Zbㅦ@III-myyCp]>:??O{󾲲AVTL Ya>hT* `9~~~~imm\.ΚBDSn$Qq;w*˽C =2XA8*޽r۷@t5q /jtgS<|:vޣFs|2ijj?y<ޱcX:ouuuyQAf{#E!ڵ||qff& cAAkGuCV;*hJt.0Bhy蠠 X2Cq%ɀ266&taBC wZօt8"Yk!$$x~~o``@VONN!bǽlDDD\ 3;;[UU:rcǎ:NzL>>J59p7|ommݱcӍ7qqq\6==m4xGeޡ! i( > M*M?wMexz5pT*O_KR0KdXS"<< j5ɉ+A&ݽy_ `?33'''ԫ  ¶hsd2٧~Ìmmmh8Dhh(pzcӷfE^^tn_S&;j`DO̺h;+[D8x9##ERTTkܺ&JNN >vrQj$vI|!# Zwuql"EK Jioof\.GLehx.BWG!%/͛CCCpɹtss3ؠ l"e$駟2;;)i&xָ\.?~O:L'6nfkkk#18(o۶cL}5~#aDO #oEo/_zjI[oQ@ݻw/^xYAAӧOPss3vT\\T*e4nc6o޼ )>>4u", 01!!s&[$77nOT(G4χ3pUZ !j SSSp1\D{(DFFAl@"$b`f;lt:nppd]춋Ɂ/6Z]WWGr+yvм$G6gϞ<4_S&34F˰0bV$>>f\^^y&KNwwI ptr=so('GB%Puu5Deee4+&Tt",uTЙ?(Vov+W8SM###@l6_rř~-WCMfœ+ﰃYJwgH tb4^Jޗjru.$&&JFonFY[OA MMMN啕cV޼yoX,FO_S&5fi9艗YmţÇ&/ҕg5::_%VsvDGG/ьU(  K. jm$k>|JNNf*&> <Hށ`a2:: bPm6\.g\wy~#z˗+**쫎9؟gZϞ=_O#>tjśgJՊ֭[2lR9J"Ac?O}޽{Kww_W4 Z_JBqGD<99?~9Z;wK0( "!!!@_^ZZb65D|||aa!tǿ7nB[}}}f3#{R|2j/_}6th X{d2-r?a vRbbFhg\+O/..\իy^;9p[:~@߾}޽{|>aaannNr8"tlJ8]R~ߊbxƷzv`.|x8>oZKYXXZv'qqqUUU޾`???ժj!ZAA޽{$_S&375˰0b}v\SSl6?5xA< )oǏǦ|Lb>ξ#\bY\\y|#G6md$ KKK:VUC~~\ rv|uCWTLpc‚':thϞ=hdyHt4t&~!:Ÿ0:::::AR  Bmk@@@JJ+Ѽ+ML\VV nXfgg :TPP@RɎ;yP6;;;<<<:::77>_\\gdgg;wM& }}}KKK8;}뭷հ9M!{vN>mXё|+nصkWYYxl6FOgϞ=`D˚FSzevxTؽ{spRBCC?Ý;w[߿.zeff~vɬz=hv^JttG}}vz3|Xz Eu+*pY3$$č222OLdQ|>|8,,54dOРP(`,D"-,,| 3lݺ],$+++ ݻjڮG ܶm۾}+vܙF(&''A@U"D}EDDP|pUxvBŋ߿/vيD̃EGGwԩOHHW*v'd"Ĕk`D0LeMszevxTHKKKJJjjjmuݻw3~:Ν;شuNSDEE}GGGkkbqZ[|||vv6¶SIIIjӵyPS8l] z@Gz04??x57JVzP(ܼyj;Q D  ~d2DHLX⢯D"IMMu{۫j\nhhhRRjO$_}gM4 ꉗaaQaffFV:___QFl6IhA```dd$\`6Q`0 `0{T0 `0;* `0 u`G`0 `0 `0ց `0 :`0 `XvT0 `0 `0 aQ`0 `0;* `0 u`G`0 `0 `0ց `0 :`0 `XvT0 `0 YkRm IDATٳE߭]XX'OWV}(ݻH흝Ql6Xe˖b:ub0 ;wL& vlv Mb8*CCC?8G8;;100__||1^:XPP>*={DDDl6֭["r{O`+JX.((pRNz0555== bwY[y0ETNNNryy9]0~۷o_[[N#b4449s+<ePxAK!% /W7 1 V'5d͙+~~~k+@PXX?vuu. OoVhhì_k)0Վh.¬-F5`fǎИ[zav"ˇq)T0abZAe^`yyq ~)**Fg``esssݻqz5篵 fcƩ)  yU*b!妦W麺ǍFP(KJJJJJbDr1666??SRRd2:j5XVT0 ӈ vU˗/ ߲e yo0!000&& B177grrrܸ#`fffllNWhZ(jm >Pw``GכfP^ze6AMR*orrwbbbqqD7_4 @D@@vduADDD9Tk~~~hh_(3J+222קjF#ۼysjjn:OT x<4uWKFFFbbJ"byy}ep%Y*xJI4:* ͑U=%68M&SNݸqX,uTV F7կH*koo#G8S}@JeMM w/--ExuÄ\t ?c~KԼz %~֭[\ZZ?BGgff;wΕ$=jkkeWJ"/^hll +ؾ}?}#]JHSSS@@@AAc:ƈns!Z ԻORI833>A WH7@Ӛ:tb@ǃQFP7zWP<ʕ+`(_i:/;w} 9uT> sT>>6m#w=ĩwP(\lp8N:j} HPSn?^nrBqU ˜422_ PCR\T*7333j655ZT*&iffQ,Oq!.l٦5 4Z\\|Sǻpm~۰l  v)P)89P(RRR`pT5 ___WT*ס|>?:::00LNN2׮]OHHp%0P(LLL|QAˬjy[nonXƴZ-;PO\4uL~p<Ո#***313CV{zzMLLj.KȰq85=ţׯݓSbU SG'''5 Gq_u09*pI??9x/ݨmbb쒒t___!\F֗/_iiinxx8h6ѩ\.~:( WUUA!Ɏ; `,KEEEtttXX MDYYYIIIJ: //-#pMĖ-[u;@APPU{Z}55… wpsW]xuu56--D**ʛ7oc(?3WŎl^pf W- niikGCCCuuu%%%NZQ۷Hx_ZSS#𱭭1O[EH$|p_`Q:*ʩP IGIqÚQ,D'ͧĪeUO;338 N3UFl6[gg6olu07cvwEh Cuu5yŋ'OBd2Cy>NLL:rh0aaa?be2ٳgƑQ-HΝ;z)A?L###Plٲ tHP_ttxB!W_8 %5{Jlq#,, CPigƮ7Zf&;*]۷jZ=55E.8ypqǓeZ bqyy&BɓpT*I"zy<^yyu |f (pdjj*z*;qBbcc9Z_vZÊ. ✾dPlG;Bx /Ohoo/1::N/KNNej`Gulhhx<j):y:B,ڵ ~lll$͵@6B2$^fnl<%8tF  7ЌvAE(&;*ϟ?뒹$ 322@j#8;;$ݼx9fggqeՊW`Bv[ 77>XKp *MH6+0|yG|ڱsΒ<h(Ӈ 4m6_P-[vwavO_̙33VqeѺ:hWb1 J!W/X3q[6F{z:sRw}=8u7mdw/adGnyxSם7+˲yWl  &` !HH@4ON̴3>3O;34m'M@CB҄5a3v,eKe罯kY+s={{j#ҰHbwHeYmll#m:~ ȶŶx-O:;:쑯RUUUY٢̙3m?JO{555g{&;h9 =H$Njddҿ֛;Kb6m-\`ۭ\n_z^]zz:Ǽ)Ӷ@rnNw.  42iu!&͛Gɩ}MOLL#:T*dV4\cY%1 4IRtfJIUiLݻ~V__Oִ1g OHH #5 É' ̙DzO.넘d5###Rc9uuuuwwtrS N`ݹsT}h $kMX{ S f.0f˥IcQTTilnnM"sZTT{||< VWWh7-ںFDI郩a*vjt19 c=`蠓!b1YȖago^xVOQ 7o!/GGG'''su-XgِH$&)šp{U[4͵k?~L`?k׮_ʮeddX0d p0/ٳI***2&4!͛;<<^h}`j-*Fa>a-sdI>m^x ,XpmHLʹټy<<<^|ťKUUUo yUQQdɒL;D{_ݣB+Z\ٶW{Sh.d ___rE/H!88:84,.+$_4~q|||BBBH>>t;88ؾ"9HRwww:)%ۘ$H$rCјqW;g6b󕿜]/33333s``VVK.((0 ֖)0<O Tj2 #r.XooɏH$zg׬YcGǐCAMB2yKSGRKhiiP*i= @JJʥK FyQbb"9$ gJݑ6>`J'&&VӀm**%&y?>{,u]=KUXUv/ȍ[CTVV1Rj.wؓ=or¶HIIJ\nm'Ǣ`F677ߝ8qŽs9^_9M8hr}(8LB2IKS^B}}= w{jVO%{ h;@ss3={G]ƅ=/^驫ce],Ӟ]]]r\\ULj4:^fII Gk2/c88VCtҘ`VB <=3܎!/E'0 s5&LmS9P={6 ߵZѣGUjjj>駟>1<<.u444tqܹSRR2#$$?nrOvZ[a/// ~ ???O{)|rZѣ?dZ>t}@eq.ĘtSG-hW+((@jgo 6Ё%%%dVV{Ç5[322w`7o}DZWWo߾rRAOO?[nOXiǖ2x9};8כ>B 6~&g4{{{h"H233-[Hϟ~fK /E7;;{xxwppV{ElK,Φsf˖-vDel۶m&y5::ʮZ);w###KXOpLW!q Kon{yyqTTTX:x-66ɤ[bbI̙3Ν5 'J[nOb#//ope˻,ZDPPJ2x_~lK;wP__0_g~饗,>;R,Xe^Lꫯ.2]˘# vssh4,{m'O<}lX&t( o3> D *H&8So0L]]ӧOu:L& QTgWR4$$d֬YY122_=܋/8#8^I6BƞGmƌ111[ ّ2V[[[__?44oW/}}}tk!&B -xN%\r/r^MiQTTW_1 #[ `L1*`]488Q  騦FVmJ8iԩSdF#OOO3pAg^訮!_p!@PL MMMteR*$$0!PBCCwʥHl@`ZD~~~sYb@_0uT@p0* 8T@p PAڵkd; `H pyV={T*lT T:| T*':EƨXq޽Mǹsz{{mݧ`ArwwDFH$**hoo'[nubBtқ7oFGGϟ?|A僠 Tez֮] D`zAM 8QqMMMuuFP(QQQ b466VUUuvvjZDP(f͚o#sǏ߶bR4w\e:ɶwxx=P___Z=cƌ`][[~^/JCBB̙~#^OGFF߫oiT{{{eee[[АL& 1cDž[jjjȶBguu0clMMMd',,FӑD`>P6f;7$ZV**q]5;@4M]]٦ѣځѨT*SRR<<,((hll8hѢ5k8---W\`W( Dn:???kgvRRҮ]㥥d{˖- .ۿ?NOOήpBKKA<==.\}o}ss ^z5>w ۿx*j޽.\hnn6yl6ioo|GK+m3@?MOAA74ɞr<##|9ZM[hhǬ;#WC E/hmmC+Wjkk_u63gуUWWرIG(..><[.++غukRR ^Ͽrŋt7n{W͟}̙c\NU?2\C_b`Yggl77H___NGk0]]]~۷ofT?:::44D[[[bc#>HZI!q{{{yy9 ?|>"MLLdwoȶVoE^rimm1@uuRT*:VqBBB7w\zG H$3gΌ qssPGFF***5(뫮&>>>*|˗/www9sxyyv9€uֱumZ--vǏ+۹M`bO8A?s[ZZlu9XrꢍdgXc0- nnn.\  R(###ZFGG>}nsr?2\O-*gϞ}ZnEk0.\p 򲴴4==="" eeed[$gffG]p<_reR6nBw!$srrƗ_D:l\AV4狊,X@wMwOx===-%77vHHHX~}`` oEEӧIJsssyӟtERӢ=ٴZmCC}i4߿j[MM Ef͚e˩k\.ĴЛ~zvsb^^^~~>U\\o^@(ԕ+Wѿ撏Kqss[hիJ%}{AAAAAɐBڣrvRv|)d,@gjkkrwo!0b8++o6 3?N^^m YbŦMLƬ/ZW_t5q/111o&;Ja&22rϞ=v/ wk'[Rtvcccjjj#wŮk2 tcc#nKiP7pv&1/^ނ on=gtt\mx mů 20… >eddlڴVqww_f {\5a߭G+ 4PDbX,Z~g>$O 3CƦmVYujZVm\uVR-[hū7/b͛M*DDD ӧO;EKK "##-^xhhhll,6t. [^CP***mbχF*R=\.HLssǏɶovvX\VӏҘ/9|R@k_=H$"۴rv}둱J`[Os'%%f:~w*WJJ Ǥ%%%  of\?̙37 ;{-ﻉŋ9]6O{UVVΞ=_\5 ˖-cFϜ9 ; ]wҮiii6gΜ6a Cuu/9|s\fPPrd2h߼ٹfG+ 4Pp05dC$"##.]J?{IMM% NB@Z^ڴKc ŤwUUUiiiZZnu& rNL?|]&͛74TUUj!$qd ~=W{9P_ cw^Ã9:rv9Nی~M@[Ӎf ۛݭٜyG0 t)2 QTf@ 16OHHx!0ĉsIJJQeTTԣGinnJiO(wwxt:ŎvsssKNN%I|;۝$1dC*z{Oh__sFȸpm\Ϙ #@E\v=Ervt *Kl7o!Cd A]]ŋã#@ng&Nt7o^nnN{B۝iEXZ!8q-Wɱ \JUVVZV_rRrxq1*_J T؝v_n^~̙2|h:uiggӧ-lr؎!$$$!!lǏ[f}Iz)))&O+ 088HFej'Np:e쵫J9ϟv(v;R``IJJ"uVH0 ⬵5&[e\ٳg|jGN>|8//O?}%/svb:gZ.++0Gʼy3}eIzzz_ܺu=ZZ6lKpc>C: 8@Ǩ$&&&$$Eijj:r䈛D"!0`0'v`0<<٧WP NoUzzMR|}}nz12(رcgϞ%=zzzS_~+iӦSN˗/J$FGDիW#mn@\̩ʋ陱q*,,Mڢ0̶mL e*;wƊ3,Y-JKLc wwe˖egg[LG5MSSSSS;J ܽ{U}}}+$888==3ϰ1FFF>gF5%IffeN{@W\\=ً8>1.NLJJʮ]Nkmmmhh>OOϬUV@\̩ d,@[TJ{zjqqI`Lf0:Ǐ-P.\WQQa"JZzuTTGb?Jя~_^^Ng222%''{yy]tIVLR=+Vܼy<ڹs'ƜsyUUUzI، [͌5y^ژ?&d>L&_bEppwbNUMÌŋ-}h= 0݉ЁxLCCCzmƌ111]#J222=Q-IB9#𥮮ӧ:N&T*>jttT*̚5[)(ʇ) ɂ:%/sj:nZelsss___DDBpY:"1*0m!PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8T@p PA@ * 8tvv^vl,_|bcIl 7)^N'˽':EtlTR㟤p)P)...//ohhjdϟ?<ʓ'OΜ9jCCCOpv*..c哓mshѢ۷ob}}}Moo~:88(JePPܹsiEd{ƌdz^*̙3O00P__orFPv`';((ߟaNFF#Jٳ8MՑmZD ãGjkkFR NII0y{[[ۃ%ٳcbblO@OOσZ[[ZT*U(111Wg}E„N#y``[\\-cRսfͲ=Spڜ0LZZ-o!?2$`0Ν;|+WTTT$v̙uY1 3<<\VVVQQu֤$s+WTNwƍW_}[_X[Fa+W־%9sbjA򪫫wA:O?Um>(;/?䓧OZowwcZ[[׭[Yt:+++!77?++ݻgΜ?$پ}9s<''gpp{zzN>][[m6;.Ģk׮]tO/EbddO?? PRRB  Tv``o~ZTTCk6nnnιF<:vK/4o<겲2RA헗3AAAMgg0 dСC3Ispp;D;UUUlݺbjkR4<Rlґq}*GaG)=88h0_nMJww7ݶ-Ο?O&*jƍ*Q]]]NNH,,,, I/,+W/EEE{n{pomBvYz[l .ܸq,--MOO09HYYYaa!D陙.EEE.\bʕ+ׯ/ +**˘,zt:]aaaAA) ÐڭL&KNN1c0mUcpyAٳg[.22ʕ+$<0yyynaD+W /..%{ttҥK ø-ZhJvrrrh~zv\^^^~~>9Hqqqbb"i#ut,קH|7~-} /|܅Y,uFQ.;L1n_\nn.Ya7|]5a&22rϞ=O:p3 I{JꫯWM~;r;ɰrXH^ {'//>f^bŦML /ZW_bWvNHH0 1ٳg˖-͋PTP)))oRŋ/޹s'A/^W^aG) ,\pƍ&{fddlڴF) øY=b/҆ l߾ݤիاQW;O_E"??nϛ7o|X|o1fa~?񏣣w>;Xj2^jv7[n8MT*ݲe ***8F͛7TZ1 ֆ"^$bXkq|XYYYGG 6!66&qٗfߧ͛7[MR21!njθv˖-/8 i3n" V0{9HDicKuXbjZ f"ni&錊Zj՘oyS@T#޽Kї&44499l oڞ3gxɮ˂ onm7:;k8{)qF0ܹs9Ϟ=c&ku}煯/GSaFFЙߟcrv-c@LF['޽KPq7 FO_EѣGt;%%cj/[Vs TxGׯ`EmF3[nrR7*=$|$z "###@DZIjcq]@,C5. ]f̘'-+'!`wrcϖa?}| v$1MٵO?`0|T:NJI7mmmnN722BlmaaFFF`<<<\z.͚5y'"&;%0,ۈ'Jz=GL.t0`x,8_9:::D^^^c/ =_ڵk?6$̶0̘ 9]\P5GI}㑜"g7FCcF߿7Ғb< zS Q. *Zu;`nps ^v{^uDפdRwv,!*qm ؏&@]A=kcw azw=uML& r ×_~iy!H?^&HӤ{v{Uґ*㸦0LC T}٩ӍOHH`LJ`\H$꽽ϟK?k֬1bǵ;ipMJ&}gvb[Jw~w'01HHRwwwB8+JJJFoooSS{^4P9s&P*>a(A:RFڻ&55|1IRztU"Hhz=/+pa Rg,4RT"Qdvws%T*% p. vZah{-o3D"RtɈ!ܛ5:{AcO^ |\F?]oqB4 555.8#_] q7쩜3 ׸I]"H6ٟSpvݻ԰p0dǹ>XLO9VWmQxx80wĉq&vl>|u؝DӺI-40U$m<*se? BCCK Mjj*eee܍*jʕ+x_E]*L 7PafÆ Jߞ| sْ1[+++cǎ䘇[v-0yyyI~~*++_t:]~~#G \lǜ6l8pMv}o߾{^O>}cǎ}Վ\T"Yڧ믿>wnHכ7nLLL4?֭[;F:tvv;vٳdҞr/K=૫{=\j7l@;$&&&$$0kQn5MSSSSSPw:L=3t;0###}}}ϏmfQvP(vIX&dɒl޹hnhhhnn'uww_lYvv# SffҥKct:]oo/I 6xᄒ%M{{{idnKv___cccKKIgUN]vk:F)YYYV2?_F|}]vٲed&Y&m߾3qLIBoQ!VX_UUeލ[,>ƭ/""¾2)i*0ܼyٳd;55W^Z&bZZZaO $*R###GO9(//xzzZ 6*R_~ӧO{zz8^֐sW_}EJMM6c/2 _kT*X,ﯭmoo;[nR  bĽEقw!]@*jW^UqJ?@&@tttttt[[ۃGGG==="##m_eiiid;00pb pXG~ PA@ * 8T@p PA@ * 8T@p PA@ ,[^|ʼnNpOt& }z۶mezz׹>+))1H$߽{oP(HLjӮÇSRR?#JaCzzG -Z4o<ѣGo߶8'Odܼy37o|gy;wXR1?紴+Wؑ$ԦW_7ljjq'oSSÇÉN0̦M/=:# їJ_m<ӧOlٲo߾ &i뗿T*.]rȐ .>3T?I͛&0=oFՒ/^?A_Z* я~nEdK.]jJ yiaaannnoo/G?S``/<޴$5]7dee#5ݫh~8p~ǫW0IEDD,_ҥKeMMM^^իm?W_}~}vݼy?);JYro۹s?S_zŋGDD؞0E/Vz~6B~_D"џH+Dx饗/?n{]F_H,j4rǎ/^4RGڵlOLj"PٿG^x?]?O6l@_VWW;v)h۷o //_l{=Jh1 eq?Oq)V:tИ߷o_TT}yĉf״TCr#GxN0Hlhh8wɡ"hwOBxmL=R~6& &?FeeeeVVCWҞy;w}t&3 SXXxСGuttHݻw?v?~޽{d3ffee c>"ͳ8Pmǎ징&E-:y+W<==SRRo>1SvK.=x,P(VZe2/:::?~֭OvwwF//1-++;rHYYYkk^ \x-[^V~;M=q{{;6i 8|ii)ٖd?яko/?eBtttܸqLMMիWSegg[e1aկ˼Nj IDAT~ꫫ?󢢢A??իWK3f̰\ g?z=:޷TUU^^h4{qsZ^yߵkך;t;vp_q9z{gmHqFbĉ1..?PhoowN,^ ;w!//oʕƍs ݖdoh40k׮Wž?yFDA"FEWA A ED%gL\Wy6hAA`ԈӣGvJmsu}wg}˔/_mٲ%h=hӦWZ15LԩSO>'lρ{Fhܸq֭׭[QnժUgqƬYzo{'}KӦM;uԼy/bʕ7o.}˖-cǎ-**JξfΜy]6aÆ;wn׮ZjŊ#vK.do{ 7?a4nܸSN͚5[fMzA͜93/+c%&TuZi'k$ɤoOVӏ{o-:qRZZo$WӱcǭNlٲr R5jԨQLPg5kN;ʕ;hbɈ V[ϯ@&ҥK&oZOǤwkѢE/첛nꫯӧOz;ylРg]RR|zkɒ%/[n믿^yWQFg}ׯ_r/d+lռUgȑ#ӿ7nK.y׬Yr5k֌?|42[Uϯ@K.ZR)W_eӟT>bĈƍ?ر7|Yg 80&򩧞:QnpVN8Nxǯcʳ>;mڴG?|Mf͚?W^ 8ѣGuQ?O-[wqoQV͚5+ܣGʟW5j讻Jn޼9=jU]FJ²2Cوy|lh p]W7rC u]YXdɂ ?:<}LY#$;e2QF+%gôz~***%_PIld`ve?9~>aVa\ 9E~/gz}goAewq9Wr3LqqqrNz&iԨe]\-))չc[GKM:9kٲeH9sTȌēO>ދ)o8*B^x!ګW . 6LڴJɣ|ׯ w#ݺuk߾} N>53o[g}6`*%_TrO7ٳkyG/brI&C OZlߣNʐ!CA\5kV{Zj5~KffΜ\nٲei&=Ur뱭%Ov&]O>9=ĉ~;}xGd;]Mˍ5v4\D~̈́ʶRn;Ep;wA~xr&?/;z{v!W]us=Wo޼n(..4hglٲYfݺu|Mnk)=8>SiڵKN[[Ƕ']>}nn-{{wqG.]uvǞviwŮqM07HNW+wiܸ6W}JuZ.J:t>XY믿<=ӓ={>{L&W_fٲՔ+_/b|*˥UTJCWY>k~׿.\0>}GVXyժUB%G#GmoOtزeҥK.]:~ÇuQgqưar9Z/ȑ#kѶGÚy^ۂ,yZP@봀w]ؕr衇v=wԩPy$W-Kq7*j  dUTJC]vZJʲ/Dp1o_%%:+᧡.vI\z5jĉ+nӦMӟOsv7^|ŵY⫮ƍwa]wm֬Y#… ѨgjOW?ZDPi+eРAI+Ws=˯7.uߩSڏ4PYVSz`&Mk}UU:J&{s#> (__%C~k֬Y>?5o޼:u4jԨQFM:u_hQo3LiiW\1zf o^qc۸q}?+??@9_׮]u-.yP鎹9 _ 6n8v7yWw.-Zc=ӣEWSzskL G[EԵ?T9$T>w}w[+}L}'Tڏ_O3'\>W_}5s~ڴip[l;3U6bĈʮ:f̘g:#ɩ93ֹ-g߄ Nwͩm۶!NZ*/˓;\v!$R}\wu5j`N\MqMhLfKJ#Olpa2{\qtL&'6m~7ϋU;+VH.a-N;G}>k6CۥK1bD}^C*Q϶-gل NmNsNry忄$Xd2oUgaO.M:udm޼9])]M鯍r l1UJCeРAI&J.}Q.>`Q3^MvXr4Ǘk&P]tQ)cVZD'r-\?>y޴ic=V|KV~n{aĹHd*O?.쳺ꪫW?m]dߒL&;W{0;ƍ}<μ<>d߄ Nwͩ*{{'N<, 6:th9c9Ir?w1c҇TK.o޼j_3"C%\wuG6mZ{ݻwOO3ߞ|_ؠA .ڵK.W;`Yr_>AYYYr&L&sv-=ƍK/}n;vLTl׭[r,O:5O]p y=ڕdƏ_ZZZc[wK^M.:=L֍7\p2^:>g 6 > =se *p_\ݰaСCsaÆ9s}y{&81{^zr]DVX1iҤ/o ,;Lpuץ?u߄ N+6{{T>:d˖-/bO~6ꢋ.J/6ڿ6lXzd.p ֧O#bŊ,#oذ+\vmk&@d;Dd2W^յkמ~]w]U}پ}&d2ƍoӑU)$\:x 6lW+߾aÆ+"yAX/N#4rȪv7oȑ#m۶Msn6߿yZ+<蠃3f8S-[ՉGq饗nܸt6W~ۺ[ZnB\uqOrBLup+߸.Te#w_z41cׯ_{~yҥM7Ta?믾;+Gׯ$5 ZSHii{k޽;:4o/-ZV_TTtw<=z$ǐ/3K'WwO?O>:uZf{7y^{-W~ 7ܰwqofrM6֭[&MVZbŊ #&MvWIxgqa^{͝;w5jTۿ[ݴW^?۶m'Xb3gLo#F۶nذacƌIrGիC|_9sluߘnݺ%K`Λ7邏NJ,.z|y>*5}ZYYى'=[jծ]H۵kWLVԩS 0Mݺu2eJX˒}*:]>|޻Zzucss)2cƌ-+輪{kpڷocx[[nvMq2UͿ>_3Qv*סCYfr-[RTTԻw3gVU)5֫W)S}Nٺu/Kd2>}s=՞C譾̞=O?]fMFڵkwG]iiiJKKׯ_߲ew߽W^ɸ=ժjjڴi~ի4i{ll^{ Z믿n޼yV=޽{W'/JJJΝz͛7k[=OgΜYr3L֭:蠾}>5[ބ N{ׯ/f͚&MtcI]^ܜGYYK/dɒCqZjնm#<Ylٲu??m۶w}O>+fWqBe5?6!v] P*@8BG ~헜]s΅]لsG ~ #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp Ia IDAT P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8B _Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BG #Tp P*@8BaOqq/7k?ybSL?x_ufZl٦M]Nh޼ys/믛6mڢE<餓zY{#{?Yz#<\ih͚5^Æ 0aB5jԨYf͛7c=tҵk׳:}yYuuuݺu-Ǐ?2L&O=zѢE[l2Y=/|wv;}ƍoMnԩ3<ӥKgۙx^x>l5lذYf-ZmC9d9>s|րƌMREN >-|prT;2e߿`͛7gl 8ۇ~xȑݻϘ1c[sIՏQFUf٨Q?}ֻ[x1OYYYzz{]o]ng}oO0[o֭y睗NƊoLfܸqm&ywl…_3LYYٽۧOiӦޫ2cƌ_JiӦ?RaiӦ/>[p3}I'4iR[fϞ]ᝣƍwꩧW}ُڻӨ(=ʢD@&C"$nD+b zU BrE@W\@Q `J 1" # So =LO*zJoaM󫪪bsڶmc5@9:jMMMFFƜ9s.\XZZZZHM^`]ti/^TGM>=&&FO ///ot+ ֨\~}]]݊++7odz*>>~ѢEJ7,>>>((UV ԩeUUD"{7^z^VSS١CШ|___rVM\\\T[>}dffZӒk׮~9>֭[˿6~ __ߗ/_roiiiaa{I$UVD"oof+Ҡ={4HevGC0qįZ6ӧ߿r 9GEE9::\6zٳH> |Wuqq;wl~\ziNNѣGT(ڬ;*t}K={4[~DD͛٤j,~9}9 PRRre69tP+++rVFqq_>bccyfffaaa ~u%֯_ONc~߾}-)@QUeX}l݊1x Vщ'֭SkגSb2h*@Lr6+66M3 EngPdrݺuS)Sj%Μbڵ8:663,ںjGi%c7Z}D29rHEY[[Ϙ19}B%ٙu˖-5 hf G78p 咒ׯR|GM8MZZZ:99ɇ^zO֖g{TǧDk֬s>F%<5 zEo@U O>Q(NyEƍ`4$$DMTAAg-FFFk֬_BBB=~ܸq 8rvj D*raH$ٳgsFa???>Gtt4Fu)Sh H8wtQ@JVFꫯȜgϢ5 PѣGGaQF/E"HaNjii&/\PUUlkLMM7I%,I4Uغu+3tЖyɓ'5jhקуoFFF_~e >W^KٿgGzddd7 6РA7 d%$$(:\$^ZMMO'OwyX /(O]ކ \׮]laaنQoTvG3f gΜy)2duS?smmn50 SYYxAIDAT2!*annyfM7DgO!w<דT>{LMިxxx4_~-Hݻ1-//_dI}}=9`dM^^^;wd_oy54Ʀo߾lNAAҥKq155uww_bWW (>}4{n jCjSt5-;eʔSN9Gquuuqq`{ tO윜rss&qNUZZ&-bkk.|,,,LII! m<|捜*!!ӧ\)))K,I6kĉ?433sttTmc=x Ft$XEm۶%-٪spE )22_Wvrr"gKLL$wꬨ8QFkNG8O888k Ʉѹs縸8;;;;vp9rM&_ĉa{:s"NR^^tQ7lӦE SNi֭Ps7*@5 9s9iiiEEErP;{Z7/^H$$N`ВQU ۷oC>""ߟ]5X]]dɒ7~=jjj JJJb_JM6Q2cS݃>Й`ul?T(NұcG%,//3gΐUbccܜ4*J PڹZYYJ׍^|;w9QQQXYYlٲF9P&8@fzzz޸qc߾}lxb<=*߲e͛&Ϟ={ڵaÆiI ӥ`uڕ<ܙsB=zD&0PdddNNNiiiC۷Vtg/E)>lʃdCr:G\䄐_ُ 2D6ƍ} @h7e}Kmmw}2[NS HlmmUR0FЀbKUTRUȜG5;] hΞ/_lf_tΝ?\G By椤$69i$OA144ܵk׿/r)֭[8vXvvUV``'Ν>? Mn@U4f̘06BE+bdb6WR"r0Ț7oޙ3g.]ٳ\%k)Q-9=}3DA>kqƑ{qTTT;vL%̚գGͼ}v9}CgWm0v#Fz"t$XE]ve555R䒒6ibb_^I6|JȰE!P-Y!סCF/ AAA+Ϟ=[SS#[%:78pp/\y Rv+W$,9rD%%+AS HÉ(NR9lmmɜ[nkP]MM gybBQQѵkؤ!I={dSN%iii uaX?P%s֯_$]aaÆ7پ}JJV`y{{A{~~PEW\̻hJ2Vl֬dTm6FiC%s߯]tt4(UVǏ,66V*A)1u„ dգG6ݻpO}ȡB&9GhW_uz);Ν;-YKhh(9m۶7qVVV[n%)v@7PUׯ;sN0}ħ"a"""n޼IvLh`ooi,*@Ϟ=sԒ%Kdx"9t̙JhkkKR[!ѣɜǏϟ?LNR4(((!!ݻmرc/_NH$???V-h ì\... qȑfffʵ-;;M>}z͚5^?L09vXNNY8ۀH$ÇsV~!!!5U7o^p ٸq]Ã<?>gOvYrFQ&52x~9< HsssSSSٜgϞ5}ڴiϟ>}ԩSd!ݻw糁_п>&&&33gb<99y߾}6QHTT[uu Gm7|v6$9888qBv2hEEE߾}u,111&MR~cߑ#GZ>{mOOϿߦMkkkKKKccJDRTTDΠmЭ[cǎə}?#ϿD"qqq!nݺ]OγC.U;::dzS(0L.]ݻg ȑ#9__O:|Yf]rEG敕eee~}NLLիW1 1{lN0a;t`bb͛'ONlӦͮ]Cs[N6mϞ=| }jhhHn͓J:F`hH4iҤÇ7d-..ItY0d=1a~LOO~p!厵2::[WWEsWҥW\\8ijp"C͘1CZDᅲ4888$%%Rqvv短8555?JKKvڣGd?66%<|ATDܹsgLL m,:g%pdLKK㬓!;55uܹ<755 p!U9Ç %sJKK/^,j]Xcǎl|ӦMjfOݠ'7 *211ٽ{wtt4G˖-_lmmW0رc/\Nn?#IΜ9-bhhɿy: X,،=zҥgΜIMM0dg 0eʔ>M~ZAڵۺukjjٳ;we|I``7ZH9 ݺu+88XBmW>>>dNRR_~0xj;~xyyeee< W^W^]fui.]3gNnd䰬RRRbbbzTM9}Yc033،94]t`H"dff>|˗UUUfff={2d«Wx˗޽ݻwݻT[@_@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@n3$vIENDB`davmail-6.3.0/src/site/resources/images/davmail.svg0100644 0000000 0000000 00000010650 13452623363 021045 0ustar000000000 0000000 davmail-6.3.0/src/site/resources/images/davmailArchitecture.png0100644 0000000 0000000 00000215555 12564151525 023407 0ustar000000000 0000000 PNG  IHDR&lwtRNS7X} pHYs   IDATxy\{ASNC< PQCLExP"hyah"i(RDRO>X]{1JV~2;;y<$I4V ͋ANBTXPP<JV _lذᣏ>L6 .^ٴiʡ H[n܈ @HHHHHX,NJJHJJ#""`ʕNIIIyV ͫøq㲲@& J %IvvcLMMө鎎b8777==}̙˖- 9sfXX@AAP(l[YPP<TUUcƌٳgdggչP(rhhhh:Prʙ3g|2R50lذ]vM&O\UUݫW/cc㶍G&eeeP0?(:`Y[[QkZ޽{ &;hРaÆQxh&\]]mff֣Gnt@q944444/:FCCCCC+ՂE ""*h i<#R4;;ǒ:JȈ&Jbq]]/eAAmIIqSfFFF7FDŽXvݻwoX,/^lbb`~{gϞjGuuummϟogg4u`ӧO;::Z ̟?~@ 011qvvDG=z ږ@k֬訨(U)XloUUUUUΝk?ȔV @ kD \z6jiiV!!!O d .,--MNNFs衠4444Ry__n]Fˡ兄L0/(rhhhhhhʡCCCCCC+>44444rhhhh(JhiF Vlnn>iҤbZ94444l**@\EMPy4^e?qtpppTTT}}}=z'lyh=f`i0;곎9t^ GXZߵ7o-Ӧ-^̌V "Oaa9lVܢh>Ώnף;r22wΙ3ʡy]dQ⩨XtiQo *)3<F+5G.'&&9|x7vPS|՚oܼjժ Z94444lVm4444" fhCS{Pi{=W`i<`V%q~SRRVPP{J###mSPz444]Y6 \.Nl>B!+uB.)iԯP%KiRSS5fڰaxʔ) .O6-/////oʔ)"м&uvo(*$Kdao; g[,wȭ_r_ĚcǢ Ǝ{5qqq0f̘&i$%ŨNEx7-qss[dI^k4%%%Vb@CCC˦1}|{W_cs{L"?_dqI:M+w*`wwaÆPEuv444O%[,XpݼY`^j1n$k,ؑS"^_Y3D,xdq8TF мMR욭S ( 5ZQt9$lc3Rk$&S ctubɺMF3Ykf&VI(.A &azVn1+{ˡye#-o_ƺ~~}+J*s~c*J*z9@vFNĢ~~}/.w<[8.|CJkUcL X.)koV +.1_9.t :|6o-2@lGmkY%륲V$jBVnԭQʚKfGq%IUJdɒ춧-ZzjT*H1ArrFy[|SFE@Rc!8qQtyԳBHM[ˎO=FPur`[c.^qFOp=g) {USf% SSS,YP( O:P(ӳAvvvzz;w-[l2m ͫM^.)vʟ.c&]ܝ`Ian\ف{kdhlh*i}]%IC >c'Q;0'*V. $A~y/QΨQ[ZZF]PPЫW/H4s#F˩lMz?qvsS [s/-]!oYǟvdĻ{%k[[쬬իWd2zc_K*ؚVм"uMi? Nഩ_x>{AvkT3gΜ93 44fΜW_ 7TE`3CCC˦iedf=7+W^z̹}1~@Ir!!!SL/--V ¯_x%deP CC:FTSukmn/߾YZ%'m;jO5rE?7THf ?ݑbsYlaqx\ ЬU' G81pLczc%Uߧ+ 6jLhl犎ow.2jqn,7;SOut X!s#Fvk$36ySQQQQQQ\\\__5\ʉmٶ@#G433ϒ4]0&=@Ek YXl-ߚ0rF@|R؄=h-' 5Asy״rl^%^pP$Q𰶶={?{BWH$ܿ}}}qqȑ#'K Ec]= o/tz8BԯG|JzՊ\. $5*'$$@RRÇ fE唯R[L[֯7nx***rrrmll 2q'N<{E9uD&H2m4!C{{{S, /߾W([]uj\[Txū6^7e,=dIw5Q p숰B ':8bܬTdmi݃2먮=),,ܽ{wNNV ٹsggm*..ϿpBZZZqqqPPИ1cmll3, M'Ǥ%ψzQtj40:dT>ü*Z`kgӳ3rvYq8zƞ ކ$:HWFʤQd˖ȸ\&"xSRR233mllNo߾x25V=rH^^^bb"oZ6/fS[[B?A9m+~mk:ʄ ?C$AxIwʑgC× Y[-iIRL9#Sh Diii"(&&ի]-x6m"I&Qĉ)hټsEi o͋~3x ssps}L9 $Ax^$2@uPd|}DEĬN*,{DËI <3z~C?=Ma@ZJ¥+Ek7XD۹?72fň|<${'ZZᰟ.i"Jꉆ>ϝN\R__*"秥GFFRhht,wNI8z𳹳LLڞ?O^X^>^Z; ۺ\q n$'.puqx"cDͽbXþ+׊DwI1V?|},x~eanOa+ʦē jvJKKg ht\n:>~mo.ٛ g-fn\vmI~[]}R5rH䱖=6s {VaiY]]iϛ,XO{'M6=~ns$:[<8-ds6Hhffʏqxaaaaaa۶m t-g"yZ>aJOw'yw&+} \9!t#3ߓnk{o$<-%}'y$CEEͩ(Z# ŕ"ɖm[vQT[rS6YUbѧ*#J˷;W7[ E1Xg b?|}pڞsۂꚆ͓G?,t^ҊeC xwhU~ؽ7;7"y('W'9uJ;F'N]<}_Ns&\{Ҕ3FV&%d3]_:yfOֿt3lč\^K=' .hHB ŬVZk3OqqҥK+**֭[G_S*&"##̙Cgh?%n;qXxQqo?[q&*7|=ewJdIS߽*og65g;~1h}UlILfN/Sfogebltq׮_[pwjw0cر6'O]˿NifFԊJJBiREϯoEIeL017:0+o9&;c,qp5 `& Fu>luʽs $VQQjժ`\F흑Q__yC ˜-GkJ17γ%<c+^\|>so6/_%FW,:_T>αs"G>l$M$IlW|s.K̿pѳ}ljrq6eP8b!^L8d!S#'S,ߤS.qNk׽|.ou$8NئS-VJU!*J毒JԪz.,hu3A/8\>#G=\._۳MBBBQQȑ#wE_l8#&xYsġȈ<>|ٳ9w _,k,z3xkb?|MYUA?7̅M?@c$IPa1+zIw .&F?忝-YLŜduӥ󴲡JdmHKRhQR+M͍& lLL+-?jHn~~RE~I#F*xFo! ^&Z8z<#^<֯qrr*//E~~~xxm``grrr\rrr```xxkb#իwqqY~}h^C6g֕W* SS3a=ذXKWE?5w۰oi?xdU|5m~Ȇ`,x<㦺; U:v'n7i>Cǯ+UZ Ǐ0sH #LcW߾Sy+!ԊZ-,A`{9SB'R)0_DO+gؐJUT*@cZy6VmCcöD\EI%`';@H'5=WX\Cse4WIyrCe 6&,] < 333<>_VVVB?t}Zn]hhku*n󤥥.^/ t{6&p8{w`s TJkrjgaGhɎ';dp^%1pΑF~];r_;8߹S4fQ&G@tzLĨ̟ )[Ao]\W,iL_s7_50c8 @Jjn6T]?6ýMщs~@, IDAT8o 1b}̶s9 !3߸`f<[cV(a#IPe'Ndt#VSg1]FD`0X-u2QZJJQerT:wC >bLJuS?޽{8O6d2L~x!fkkBp8T aaaEEEgϦsrrh<-P]dG+7T]1XʆbS϶4U6i-/qO9[xⴘB\39r's.UrHڨFJI@ iTx34T@ .%\V`O ZP_HZJplu۾|a޽Vk{{; *Oԅ-..1cƨQΝR(  ȢEJKKNvQӧܠu;i?>>>ꝓIɱ{pS SxXln*e2lm_#Sh54/wwmm{/}/ fLȌ9,܄#nTAa6(A=B鎲@[L \дЩ26"REEfq - MQei+G dM!fG_,ZRSS^SS_P33۷={v)))?zvS(۷/##ɓ...Tm'Lǣ^NybZ(+VJc,6" F)I*Ԋ{?[խZé\?;cW;q;IhCxqOK9/T9,'چOLkg pu.[Qkكz 5.60*S Zoxennn~Stƍ?3g8;;3fΝC!C ?! 5?R N8qIOOϧʣT*~R,(((((xt7GmkViVϻtVUkQ!"ᨖQ9:nzNsKش_hici٢.[߯WQ~_ jxh5yF@ $03@,Mxle\0= 50RV X8 5zL?kl@02^~W (=28|#@[o1-#}ˏ#={ѣGT*_,JX,Vw}NL5o]\\"##cccsڡ[Y&+++--dɒ_aÆ˗/d2L//cccǎKqwwM,O6nnn---+W|h:[ FCu/wen6# h-me&v߾ko>5dA}qJ?[NWʦH|1f N`i47YC]ܼۿranMe!\=\,mzzXZppXzx=˟>f̜-#}w‘|ɾ}n߾- jkk "Jry۵9M{Kׯ ,v ߵk0 ,!!!66633sСPggɓnjnn>ydHDE0 .+WWBQTT.322d2L&DB$;;{ԨQ"(===$$`ԨQ&L/q*)CǏ_]q;_|xczk;_/0VV\^TxL޹c9' FM \nS\&f_-pKJwraP%K*&Ko$E !w A{X{jM³,?HWWG')*+(]Q=jԨT*Ɒpss۳g蘛 0aBRRRRF իD"qss|rVVP(,))eG޺u+"//oAeBBB dkkKB5T]oW_H.uWfO_g.;KQTxZ'/ޱv;b .'c?[?d2I 0`.5·눇QImOcgRVZ?'gʵi$1cތEK[Һ g?jZ[ԽֹaNGqq$!GZJtT!vr7ڮu~[p$l&iR$F I0R: E 0PL% n 5>2qt\gl: SQ ͛@Fè 2VZ1l:sU z=g#88888X$,]taaamG?&L0a8::mP(|h:[RPj۬Zcddw(:BRS34_r-gTrÒgD@RWTTj@ÌM:$`2׋u&q0Pvl:@9وX^S-yգ|%31TLb P7+3;4*NQjVxfHp' c+cNnTԁ1vrht(=w{s?: Jj[D9҃nq }221|.S8`çݲ mpy=h:cZd P N_WE%gptt/\)ũ!)zz=a#Fcǎ;vlqq1}Z|r<<<1?Yp: z1x=+-@BY[:'s{XYz055=s #!!!(((66ڵkaaanU\\f''#FT*$077ߴim>S^^>q=xO/uVIm 7?-38N(j67`BZ[[cnbahb¾ygf8̐Ā_:0Pqj^l(X)S]Q0&ÈqI$8A g[1H `(1(F٠צ2jPg(kIyiyRU^LfTz[Q?B  &+L6@2z@@4Vߘ^OZfjj:~S&gѳg3f899-Yds̹xErp^0I϶nnnjIaKKK\#N yrBCCCCC 6?;.8FGoܺw=;[{oGgǎ1CY,θqVgΜ0죵B&ё3a!Яba,IևP4 ;6gTNM ]Q.mlilU  NL 0JyiAAChZvAqz.Nc*KDr)46sJ;*T[YebkY?-/t+A$j:o`,Y< { *'ϞbmoVZ5I&}'#F8~UL7[lA}V!-4/RZZkލ@OII:gZ<*||h_ma=Z jI\`gЙx0}/ydgǃ_+,~ϐlj{9/W6Xl*d8 H,gA8Nb@Ѱ[œyL {'b#4@Y.ӳ2Yu\g!<6>HL=p޾ZF@X#4AIy*P477/_|ܸqW\=ztii+֭[e˖>ѣk׮577 kchhri<`ܻwI^pI&D"TNo$Sj-{9-щ'Pݛ}Salbv;wѣGO:rJʲe(PH lERiii)d{]kz:ˑsQQQ111tD<\΋[8gpG9kq?lFxl"'s[N=]rVoGo[8](F\f3~گ3 fŚ䯹~?r?FN㷶s?7ut'[m۶=j+_;q^+///&&&++kӦM^^^yDD5P… YYYSLPa`XjF.?U-L)$Sm տ8%%%111(((22ߟ>2'Ĭw(OOL )v q Ͷ5(&\VozG =U}43-4(IS| @]^ْM>7)Z!k<{\лHXx=kds8i:  tV 1Svc5e(kZSS>v6V= h|8lu.bU'hzq0X tϐ(ߐoi}SV\1a35͏3jlllۆ|Gyyy7nt7n;wڵkqg$IVVVo`0p8Tb.1WmtCشiSyyȑ#ϟ?tPzKq9%Ï[0s<6$rIo$N-k apojhm4W@O ?M뿎?쁽Ч+iCd#nF ̌@~?l粖VjKCĄfI2g:iD9ePbLNsCQN-AouhtJabcbl iu;*뚪k,ӺV[yo i-QS]hf쨐5|~W'=SQ6]f~V1qsXsY IDAT?qsn߾-yj":[|9022ڲeKBB¸q] C׋G'p8%%% Λ7WB˄(#ʶQBҖ.]AxT (uYO?IkӛdC&/|]߻r rh4"zr~S9܀c,ݼibxy&fۡ*a!L>`0uoyѾ.fx?ڤRKƜlL0 =v؝:=jj@ӿ)-25-6 yUț\..pLMMecj57Ņ':rۗn|7̙3SN%Huuݻo޼+W"##"""[ҥ4j-[FMB: Y89%V9@.-v4iYdddhh(ݷyij/3ϝ'Vo۷;;/v#x樑CP(ٴMѦVj3;7рBoNob>UV H y\i8m8FwpKƭw?E|ŤL zt}Po{fU7aMZ3kcYI֪{[9an\Q%p8zڣekäE4דZ}$V7^ J| p|>aJ^]F:}l\x^/_>y䊊osn';6:7/066h4^^^:nǎ[lJl۶OA^^^>>>m(劊l: ȑ#ti_;fOwVW'c\PJ &(}0ݼ]d(g`x+eؽeP Bċ)(zcUl{(jScS#5g߯5P'[.i%f61{q)shF`Dy<.8U,J% 3ĥktZ]vn \]]MMMu:ennnbbݻw`t6{ҳ1 755]bСCE"Q\\СC͛7bĈ3gάXB&M"y[To;w++yM>q)pWѲyYPAOJJ L:544viHش, h8nN=N_qOݹ[9Aq0lԳ;}₯*4(S:߄r4/4N[2gu3>ԓ6_'LM|/$JAKkFjMjI9B6G9TmUgWhىF'{&i+A Zfg+pv573(nߩ07675)+!eݠA~f;kHɯhi8UJY3m>CHAAAb*͢ L/Z2666xZֶZYY&%%py܀eTqСCǍ=.z; TPZ`n&"|# /?/G#`rУ$&v ǐ5K0!(X63?>PAAc>;;;;3y?˴5kF$=<%vM׋4'K Q) gĬd$L,{oлo@%e ^n-\.cl2MM4P44Ff(mgڪdMWa]3z,Vs[m_;cl^R*T<󌭭hinnpppA4_j,H{~ŋޞoذoߎڌ??ta`wسe˖Bkk3g21kͩ3gΜ7ojQS8^n,Yqo2Ff-ܙ&MAH5cJtn$(R_z/Vmţ\-ic_9DV6I M*,|{H,&MVEw}37!1;iuj5@<&[}5&flb4s[}{c~蘒kt:fccP( ñokkqٳ?3 pw;؜gĈ&Lqㆭ-ZsN4rСK/tWkE]6}Mr<77}顡NNNOqP(7o޲eKppe˺jFquwB,*(=e34].כv|X071Iau@}a!gI[(;``]xkÚ9c 3T 5!vqqbNׯ05eQ Uj:ZnJp׷`4kjjD"#\bEDD{GI-&EQ$IN`˛ϹR<#&R:::RSS]\\X,Vmm-MFuj رcҥK]/XsGi/t: >7 )+#imf`/$v]XX=}IMM-,,㧮v7-_1CG߀Q%6?D_?^#M`;؉ lz9=t RLp |\~:yK>3}P{h=)p[9n>@jGGGGGNcXSK|>aEݤM}m1A}pui`iioΙ36L׳X,0֗/_D`ݺu6lt"kߴuªw>?oZ$ea,f0)..ࠠ TDV)..޲e\._pattryBBBvv;x~ٴbWc>6oBJ}u{%=cɃMӳiR x#:ԘC=R/e{xnVT4ؕbGw{[̙NN6 `[(+W;w/, !$I ^:j \yeŇK77ɓ'ļbd2_z`0 0$ɦ&ŋ0}@n`_~q+[gAc$@45#?8p@&y{{KR'Ɨb(=FӍyatڮ7i*+|8,,LPMGPdÇ#?̙3KKK9GU\\z orL&+--. 81.h,dw_̾s(۔V?~|8;;W^MKK3 y`c>x(wIR^"Cs֫ʳ6Sv.&d,[o{joo_|,cF2a8ھ;nE8_&NWu)ٛWo3L\.^+//_r r95?G9i&L4jPT*MI$ u[\BB)yرP0-xN0r 4ۯh486.ұ[}'=Zכ{(J@f|:+oݺ;?HVK: lUKSZZ[ry6OycVKC9kWP(nΉӔDN6H)_}ٷS8H666W\[ң ?nM=KjCee7 l9YI(⁖'+333M&Ә1c0 3if D΢gl~6:ؤPwF8AO7dd/_ z~>}Jdi-hX6|򘘘;F=߭\.wwwG÷f`جXAjٳ;trԱb{KP e.v}鄬ՏFO 322&{vU~~޽{Q{uD=a`s75h|G3u(4< 6ڎNFV\*S冡CGnccc0.\pUK2yKkKP`)ZY["k[-2a+==R +--sG69xʠ7h5Zh0*U"N#+pdY<>W -BA^;6=twQt:ԩS׬Y#H{Ox^< l4r<ٓЂ݆i5ZPpb`ÈQϪ&&&&((,/--[*++zjn~G'm^mdp,4v+wfڙs l1m秦feeÙ$ڵ;N!+ר4CdB+F9TtVm[,]Į- *cS$V,]CO ee l1zx26 fEFF.[;Gu:BprꕦB1_E# paAr}>EyFKÃ^mYHԴ`TC-DM Pwh%+"Zmz 5- 17`.C0zUYY9a__. AAAmwܿ:1 `B@hviW- (+9~(۔62`ٓ6Q,lbccdF&PTThKѣTNNNdddVVen͛u:=B}nMٮ6G_zrwOͫݒIcjeN5@hȀᇊdMA7Z[[ //… <… 'O\hQAAsU0zjhhqrrcU\\w޿ Q-zɫ֫:y$Zۑ1BaUUU7c3]dc=^Fqݒ ޙ3}X^ݱk&򶰴5/.)qƯWo_S'3ӒF 0.P__w`X =m޼y„ so*++WXq*jwիW0=6oeԏ$$Iii&/_ͭGx{H]&^ r 9;;ۣK_RR~ڵ_U^^n}aĨ2Odgg?LtE"X"bݺuyyy(A9L?uT||₲1RSSxƬ77K$\+X悔*** y233][[;gΜLDo]^^KOÅK }@}}EfOOϒߟ &!!^pss;uf=>\|pNLL4 @UUU`` ^TT0;/J֮]xĉl#JJJ\\\n'""A/>;;;'KII;r;2 Ezzznnܹsϟ? [4s `ɓ'bq^^^TTTuu5lmkkW՞B9ױVVVR_ј+=w]yO AUw}||&MT^^M4)/// lKK>xOOh&JP % qvv ? )Gϟ7oU%@DDL&khhxI dzX\__~yܜߚ{S!=z(;; VըOUbbV3gL&KNNH$mmm7n_W\s_-'%@seذy挌3g:u9Ûޮ/Ν/6mZIII{{g[[ۯUPP ќɓ'ўAAAl!$$ѣͨ.TWW[*zyy!sɓ ,4g:;;E[:`ĉ+ZՍBhF]DTt>{>F7Q4?EXXy|ܸqaaauuu4M_p!,,lǎ4Mha+|?lՕz3g-ǹ>[z5:4MoڴiӦMuuuaaa蘫}]> dǎ}Y]] MӫWizܸqW^zM̯B[FoTZZzj>;޳~~~Nz_֩S$ɕ+WꩶrG$fY?O'E9dKJJںukJJʂE &GWB 01d|}흳*))oQP~~D"ٰa  CBBnoxxX,2d7l`cc3k֬7|A(vW^-e2om~~gddܹsswTVV=^~~~ّ˖-{ S3s9}B][19sV|[늪Sh?;sU`M mY&Mڲe ߿Ȑ!n:95bMTUUUTT4\^^YQQ7o[@c>ŋ[[[?ʹ/nMNNFӃ|󍥥3>$%%j4yu:o*00pԩfLdddtt4 i)7GKЧ9ȫ~_^^WPPgc͞l V{Xg;@#<ˬYf#644z??2L+HݠP(VXIKYp'OL $ȅ Av>Վ5sH$1bD@@@aaa܈LR9rȉ'Ι3 Jh{òO F,>>!;.杷q8 ×;d쌛=1aGaÀ gΜ(xsrrrssw&H2RYVV`搷5bɓ'(J(Tm֝}wWŎA=VN ԵlI6.hٍ5sgD~\][VVV?RsB+** \.W(~~~haRM@yU4NS&sl<9[XXӧO߳gc111iiiL# ?????&EYYȈDqAAARv[aŧNZt4po5l(godF=\blq|X4pK#^VrN(8|~[s{S]ӔI'd Jp35ʃja$pp#:jLeih(̋ xzJ:% Raaajjcd/xdaaa~~~f(]}nY<}RuU_8 r(، 3s;sk5yo'޾ꋂ Ey:~QaI q4M?G؜6rF<` GW-N[HN`>{z0y`ݻW&܋˗WTT>7=k(8otE?V<쥁|dU}G>;'ʲKݒmI e2)=MծZ.`ai1%+qr[XYXZ@oϺW3Rqw8|Xϝ;w}jƏgTSSszS&nϴz? [κu%M}"шV=@O/`Inf żP1 ״CYlWDmʹ[yƀt:3555Rt}IYYYLLLVV3y12"hlknA!zd MdlQʕ+è(<_>.h}ME,.2qnǨ7 m&.CfrSۈOx*++Wc#fd2\.GIw.--}b2oݬk4h oikxSliNU_3n0?zWCd2` %@|:UPP"Z8tDXvj~t߂\ """;(Fr%UVV"Xg Ɣy{{3&.. . IOMS_;yeΦpeU3EeCgH9Oeq|bM%f\Psȡ杮:phАn9FQ _:ݱYuCv|&> U*Wzz:zɠAƏrsssrr .\KDt\؈l2Drrrlْ$y5MSds]egGphPw,"IeKF}7Z-T @h < r7ٓz DXmVmmXX-X9r)s(C$UkT*erdEN3g~gF UE+ֶajʔ{1LfU*@ 999G=v_y_~`08::666.^x˖-iiiy9)++zjeeeYYeP1{r*`"{Vk~Um ENPnN4EjխZU3I4y,aӿac >)=ʅy%ߤ~J \߂Rv_.am̙^Vr!4W^s@5c@^%d @Ј:Z[)9YM兕[NTEQ& 󽼼jkkuORRR|W={<+.Z0wXRX{؊G:`%vHjsќ P{o:7n:궶GtLF}+h @{J `ҁI F˷ d E-a5GFN @@4-#@xYx{)7E;c#F(..^dw}fX,F8V'O駟P{a„ Jرc omkn(!=W^9"?X$ %$M_kZ 2c?ˆl/m5sȸ1) : (mQ . X΀NRU7uXq֮cכ# @2.mB>MwR~.W^₅B>h7n܈qrrbX*l℄f㺺/)qsڼ-{[Vo| _&q7PEQ#a0H:$EÙJeU~07L.}8k~=t9&5!#m2vZzb9ׂf3lv0xnذf͚aÆPi0$I2J-^رcOv^_~$Ic +˧ \շEBWX imZoAN>['j:ڔdp56F$NVYh0[Pp/g&%, zRIZ \+\hoE47q`Vm䀇aM//|뵋/v (`00'UYY3}{t_ /N~>sMX(|VNoAN=/^V?xDkyc1h3B>G$\oU}ߩ5M-"e1X l;yXQɳl87Ky3Z!p!(2ܽEQF9->^)͟-ijoQ6Xٽ( J]H(zÃAN;u~ߺic|q #0ҙ|h#vYxՑ߳praH+Xrc@4zZ + ?{ s+W,3P2ei3VJPxcǎ1i7}6=Us^2ug>t:vvRFsAΒ, IDATA`,6baA4Ѐ)RkCK/|fԠЗ]帬Je͟3FۥLwY9^:7t$MZm>tih;`_okY<[uhi<c2:;;Sv FDD0GLSnk98|7 tu\ 4$ @ '0006q#Y yBBPpy~oi;m~gQ'FINX_)JDPDܛgԨҔ3A|~pl _o :i?tEtu;^#yJtYݱ3>۔0i7}6_~]|lDqӱ $͎5kkYf\r%9ʚ,:"##8 liWߟ1ٞ[.#")/av< rxwHk0X<>claep phi#Ik4|>˙K-pl.0MV"KO'N1AmHqâC¢C.W^*뭩~g kdT~^ّ_¢C O9՝\( ތ H]9v$nX$??M}TVou.1229<$Ij¬oxGǚ9j<3xyy9rɒ%UUS&L1mPaOɩ+҂ oi~-Wu4Qdߍx<ӱ^QOi 6#X4,\o pp2Q868N|Mg-|GsnfRkbs[E] x^J>RsƖ/_ɳ]&.M^qJgEٿk8sVp0}&mS8GG9SK<>ooer77O4$!!aժUg>{!KWH'LA BI:ͭɓ'feeedd/,Ỷ+G}Fޱ˗>|/wGQ@6A]iqnDs9Aue0fɒcv_8A =LԦUz.`$bc8&pK h1` 1idX4`4aay6F&:/[Z $JA8ǟچxp-.cem9-"xZD~ a][<~,~=EJ}oG)VFxѶGٮbp2ecccǏ_RR/>t-BA/H$0 0&Mt…S\'O3-&&׷&+1<:[nkTL M@qV<[7lѤja#-++oJ[NW1 1 iZ14 Y|h 0 '0>+p\B%h"|\yNBJW7}ZI_u8sF'.-=uRb])(8 (=(584)iFWȀYnjjjmm̙3}ٝ;w~IIIgϞ]~s>IDfٱFZ`\|<d2]rd j .d B P Vh|G}4kF@lde"-1HݳYK65g;4`-ZN{;q!@uQ=E p p.0Qݩ3Q4m"h`0YB!W(`98cR}o:xk /^+,;bs]/^_fN)}bgNb+96@H Kz~;vL6k֬qvv޳gΝ;y睹sN?2@ڜ)b\sh0jTiy|.߂!rzz3nܸI&EEEM2e޼y/K,X0p@#(B \.WVTTttēNP(]MRFEE!*HRLV[[u̅ =jFN~~~\\OYYYbbue'JߟXZZI|uuuo#GiOֽŽģiI :. x5``Q3.YQç^%(8J. DSGMd6=bԑ?488Nc8 Z;zHMdZ3FE,s NJt.75]9,>r4f ,8ΨvpՏm]8:[X{t޽{֮];gΜVo&77ϯð+W ▞D;U/P.5B?_P(Nk׮nFBO4bX,F2eJUUUxxxlllbb"߿?666<<Μ9eeeX__Ƙ9;;Sd2L&4\]]m x GӡyW{ g;Y&o$M($/(5jl-נQp ,9 ~9m1)a o+Q[6f~Nq[piHL4Å|- 47:%8\(M 8_`BWlƹ^m?k+\S6뗏ӿ{VVVQQرc|O?w֭W^]~ VNF$Ţ(ƍZnouDCixryLLLVVDrTgg'O"#&//3666::u޼ydݺu'Or{{{5kfggKҼHҪ*̙3Wbx۶mbX -]tȐ!111eaÆy桷{Y< bҪXil[Y C_8ytq݌XY`Ѥeux66';+J lkG,M|{ 7܇ߗe qX, 'h pWh8n(uzbMDz{+6ԖW&glVr٤gem쪋y7WunTku\u/w- gy^~'N;vHII ;w.gt η jJemMHHԅ @=233]|yll,7`SZZjO:ő&))822-\ۇE~ҧWO鋓GOz9>(L`V RX0N0 $իԥ qy߰#}" F 0HY"[=Bq48P j)A\8uE>d/o?ΤH0Xmue|2R^cD{:u{JQ%hd05y/O-۰f=/7npsnٳ={~ᇯW^/s=Kᨨ0Lg۶m DDD3(c6ynݺÇڵ $$$L6sssOSNݰaرc7o޼hѢeffrرcGvvviiӵZg\\܆ :upϥn2roFBB»ロLsիox6ox7}ˮO67{OJ۴c[t|_g͛`f0| l6h#٪.}c1KDsr67h\b4da%A"ǥRB,etJi{=@$*E2\" VІЩ0?aPHG0p(rANx(BS6ЮA} .=ǫSxMprVՊD"Xl4Eb˳$K\nѣG6lСP^^zi??˗/?k׮u\ZQ@˲e۶m|T*ӦM1c <(єNj߷̙3U*q mb^ {ڥK`XrV4tq;8fX%w ՚YRּ7GWU,~>l~T8~ǻ>^`)z j3RJ2(;I\c? E%e=>liEW~K%.R)Zj8IɃ]V;RB(y)ڳ|DxG0@, M9].$%"1v:\lZ{UMoPQNs͂9^>O?4==|}lZ9g5tF~~~AAA;v+**d2Z^lYxx:zu`ʔ)fF bg_NlN@n9l0s8AA{ijpboGi5Ri$(oh4f '_yA)teV p`,6IM6$ #2!A $^"A\(#6#Yv].bh X$+B@ 'G$UasBAFI.-w2ǛiӦݻsξccckjߙ__6C(,,8q_|g}'///++멧2E9s,^o߾ۈ7LyHoV\@_3Z2e򷸟~95sJӉ؛k,òh/=d9֢K #n"o#ipF,ьB,7j'E{xIb3׏ՌV(Qx 2 1 C&IyH~)dY:mX7^%E 5|i?s:|Obhf̘1}||rH$xX,6 bҤIgΜ)pV[׳_wTW[?NjbV{P(XݳgϪUΟ?/?nݺݞ7$:@:VUUM@\19S;t *!A~ w]^|v#udQAh'qD  ?L0ЗGQe&D {  YKrZ(DQ,.@*!zG tblZ'tW{ceb.E3=ᰑ"!FROB@ 1a#Weй͍=qry^B2ǧLӅ 2aINN0a7o\{ߧ݋ .}!!!d*((aNz~>Hc̹ 6ۭk=U~V1GJ@,XAtgR1)A^Ԅ-jiM 1jV2~\k1.RE$)2%2 b )H bZ V @,`,rͤ+jkW"@XXXiiO?rhPRSSrbN񩮮X~+W[U7wXTC.//O_~gϞݻ/Zw 2N$!pILLܾ};_ӳt i7&/p͸ώ%w(wޒՑ1[ؼe׶/>1;*lAzE,Pu RJAJ2& 6{tѓFN˻qYfqSo(\ o t{@Ji8e3_]R- lނSUQ6AMWs7k[bgRĿKhEa^$Aa8b pB,&ErEl:NT'RL5sP(G=}tBZ__OӴRt:555bǧfD7]p(UK7,oߎ;{J^:])Va48$2H6 5jʕ+T2^mY`\)6[ #:>{R"M[6O R\;0RB#'0 .B2t96-r8WL IDAT쫃~g v\\gaaajjjn$Jr\JR.L&Lvڵ:H$$c9s:t0{lמ:#}כ染Zln?=`0R$v .ߝPH ǻ b'Nb8@p)meeU{vW5UϨ1~蠑۶~"hĉ˖- \ff ~~~:N(:Nef;gY-6p3&ϛׁ|emܳ)+hOy'$F=\ .sQcT-4G" &I!A HR"'F2,r8얽.^46c+]}T.H,6w:_~eii322Rbl~~~9rҥKg$nj]po\; 9ptWo}&+4i Y<]eUU%^jV@,*-[NV{.SPa#D8) F00aYšU޾|ʷDA<4/aF#w1ܳfWt?޽{qqq׭[7dȐŋܹyGײĥhjgӧu 'sò ufR(19 mjmhkYc p!,1,KŶh}%G.IC"%jOڷC[+{+kw76gJ .\0f̘ us 6̙o!9Fșz`söo|󂧉|z/8ƺ*HRWz)T^wJ4H,,4K  :??)HYQYQ+ #XmW`şC)6+>eʠY)S4׶Sgqۮo-mڃ\ SXoWHػw?%K7ΉHq0>3]ȿڨd=cnպZ}nV|JIY)0}̬ov^qE{󙛳Jnڟ/N?;ɨ l.y_v)FRn[U{Ǚkm~ ]<{?޽;,,/LE`P*w@`O&555...;;{GV;dȐbnk^^^ff&~ژիW7޴nxNVmB2B$ 1sϧ[x^j6훑#}y ,P*ocSZZoGFF}Gr===p<.\ ԼZl46x5>F(KU XEU=2wZ4g رc7mOѣ >[_ ~iؤr]so7ZC9ݻw⯬:h4׬Yr!tn@~8Z GN2xX:6!>;fϻ(Sܔ68{CC_ 6T*? Xp8αJB/Y$ 3''f͚ZGNOsj*k/_(y";{tIˍ:Ǚk?lo6ezɜ^OhB0M/a tt^OQQQm7._ Kάq7Z">Vc9m<-=t%Y|̿-\7%<ںo̿Xd5[MzghuFk6H/}Iq=ޖu!C_9EEESPPl,9iuݤr~A\NZΙvݸy5L-̫}K,sno)66G&s="mM[>=?њ|hq[65x`"JN[n5j~~~пO>\Trrr\\\bbZ;DYf͎;K.,Yjy+xi~Y[q%oCC)KH f\k>VVɛ0u,o<4 _UN:iӦх '$$"()){ \r„ aaanTTTDGGr'<<\z\ÝwrLLl79zL!5'^q^ԩgtZPV*iii77b;۷oOLL<|TLKKI&eff>ӱY]]͵wǹ< n"-&⊇F^'!ڈ^{%KƖq;gU 8pɒ%3gk4R,v8T*ծ]֭[7ty50.\099y֭WXh-[v[p>PX#U/NZ~m$ @XʡJl`1 ZKJ5rwBѥm >M8q{={իW 2a„ZKD奦dffr gz LGg,NZ濒}3-S'jj*ky._% riMeӌr8ZV7pJr㧉jE-ѕJ𔂜)^]z>ޣҶOv%]me^.cJ!e%{Sd2No绿?'Nb96TAy=T7uhD !/"gry>}Ə[o1nϞ=f:s M$F,NZ^)nr{Io)dF+jŤ7MKhȐ!~abtheNN΅ lfpN%qehh;rz ,SZS5{l.={fΜ9rȉ'6dXk;x~-G=c+|8.Mj=tMh͵g<-S;J8sܹssss9pE\zrIyÇr64￿{Sm!$WE*[LY)Vw3LϾm-^z[-ߩs||||||VV70~D谰 6*J.Ts7Mq.  Vh* .5x4RSS.3z軀*33QJ{:UJ5B8`;%vëmY<]^_6 )&֭LU ھ0;~cB[@d=,?v7~.b#v)N%2`)]mMرcXVVV[[˭\hQBB¸q`ٲ9 ߟuVVh?aaa>ٳv#W3H.s~~~'ÇsLsfh<⦑{+ҠO6/ sP/#*^q \  ŢdwvnRڍQ6Kj["OS-̝;7))d2%&&6l8K]vMLLt'YfMJJJBdddEEE55[nh T*Uk%$322[. )''999\\BǹķrNN8ܹsSRR,Yҷo_F3iҤ 6$$$,YdҤI~+lZb̦)T.H\қS-=bNxp4טLY ^,` *"Dž&xð?{O ZO^jh|&bl6('IB JR?s>b/$nĒ /+++==>1^jСC-j~oyyy\ÿlfŧ??|lr8~T+uzO5X=[@PX'.L\q畂tkvk`7r/2XUbhx,w;ʮ?DčGcGEE}wsMQfgYdfJ&IeYL&S՝;Gׯat9 .m\\]̝;WwiժUnPݻ$::ҥKׯ߭cղY7\|lZm]fnR1%y"^W_nnn6Qێd4lu*BR]:4ڐ7,(\ !8N,?|H GTz5d6nݚXjhbEa *mՅ bbxe2ٽ8ޱƋWaiV|Ǚk`ڷWٖSk˴O LC}6EgS^5_zΟ=%uNԸA1 `(>w5u0Ѧ~>0hXx x:( nn0{:]d0:vx[CKe?E t $+Zkk`IK=& 8֛)+VU(c$4F ==/>Pųu֜3g~ +IV̟?gp2II=}t.]<$p`.aYvp8Z^z9Ç6mH$ËWs¦GnvNIhf0w):Sq暬eF/_Mm|KվkE9z>4 Xu<;p5 yw  k.|@ e!5g/~gqӹiYYYYYY:.336vXnZVsrSv˗^Zfdd4X*t8AƿwS]բ.ia()`fcnI([Wju:=cx, >KM_ܨ3.\77,Io`Z BֱKTr^Fm&L-3č,7a8YYה0 < 0Ia4,"@7 Njyi!4r=xLɔvҥo& )))===55ͤItc5le΁s,**jfۥRT*dtUoMmDI"ĆuջgIIh`F,TWc%RjJh5^ iesͰw$U 0 @6ƍ ~W]k;BxҫIwbRsٯg;dKHH8sLfffxxZ ԩp Xѣ| IDAT4lϥ!8t7uCS4Abh]Zbqq8$I"k^gZ)Z8&Q"`X'aON|@a h8O 6`m2o\^17@/,9h؀K] B֖ngHcbbPiiigΜrpdffr4N\nl9b?Q>ҥK]ti AD'?o"{*R"DBP  l6kY(w=S'ap`Q[9x(4M}z<}cDT9>vjNSXDJ.‑V0@90trxV^uTRzj KMMѣGhh(lժUiii[lYtiddd0waÆ_PP/c8DB!$HvN0 !&jN0H,(x^`u H.u>D Kq# [H"(!3%bX  a`}Q'P iԞ5pke rd2HIJL&F!UaI|zqUK90!q1,V/^-9yP[UwHhSPX #= vJ C7K +'EHÕ*B NZJ0%zh׿c06n˴bqkI3 8 h]8 `֥KTL@_%z%,ooF`f3:@?* ﰇ|/<֭[|93,,kH?111uta0'Rri49rXH2atKM&+bYe0ehwu۷#ОէK='Nk?1˱̥C{~;qF>yFמ/wBX3Libόn٘ @kJYLdܗϴi6m#G,))|UVZ3}S>Oi+z!1P4M3jrUTTX,e="u X3ށ>=zXX0">|;voIq/;]*r]]ti‚Kgr~ׯOH1~Sq"{\?c-[k$lŠWKʖzsiowCݭS+ޣ? SN@PPF?ٳ'77777w˖-{sĉ֊n}E0 lS(3JO,(0hA~~80vhJ49xPrq`'_zmܓ@fp.X=MбK(b`h`i`O WzN3G\ςg*jϞ=999>Çsss?CF(ap8/^p8 È$?_ Õ j>h4$a6zN !hX?/W;͟gt8,XڨޑZ70VĢѓFxµoYK  qun+g.GAHJ Y])pPqY Őo|ضs>!m?۷GDD;wKܦrpg\\67WH B$I!cW '/Em` opz Ԛ:Oկ-`\(.V^ahE'lWO^hZWin{t)jli*+7n\FSAP.$gha$"B$8 K.ij#݌e$I>Nwֺ-MZVNk,hpN%;v @$Auu,H1EahC0uuu$,B5#W; '1P\)uj=TQ3bbtl; ~\0`X\Q|c`~t=#q\Nsa%*GlS{ƪ3z4/X"D%apF4Pݗp!7,W=Àe$.l><͟.y8˰ M9IP $ c)eZ͍TVVŲg}a(^6tfJOWg.7l{^!X rbac88E׭ t:Ib$tN_nm>BS2y' 梂Kw'V(\.ATGrQ.fMC9AD)8l9vj:k$NӷK 04t:IEQ,W(ieXeehnS.aİ" i yjbٗPoAVB$9]x:))E0fp p0ǹc,K(>($E`"L,K+x<ܳsΆEwwCﱫ_ڭ6Dp0&p.4؛eXnqQIރsѱX01e9,qW]*318Ѳsq P!HdXsT:F\Na]4CѴZ=0M[m6Ih24M.tM&$E{ ˲?=Vz\Ke^"F;YԙuÝNN8Ƅ݈e"B$q0 p C6X,$ 83 Ќ`~8YZ\S}?߅]ȿȹfTֆEvpoݍk¹_4)[r͂5i3;ܮ-YI2 00^@16r1IܗP4'X@7b j+J|;ѲO}耶l儅zH$iެg?ReYN'E3 8\g24m ϝ.E{;yzd`sþ;DXw7j++ʯH*\a.B @ `8(@" paH!a"asHd?uzSbW(婳Wo;_K<o;f?w1$@UUfҩT*E}=]&Qy琓6Êej2,bt{fcEI2Hmmn/b+ UEzN'%cMU(i$hU7vEBKfƼ/FM{ /+>l޻Y fMO zҦo}>nUL0'OȒaކR5lp?%@(љD)dY1)!01Y>**GxC@|"Z4bL$7o܆?fYe9XF!ёJIEѯECd>rrFs6 X#@H1 h+-Q㉾J`YV"%lJ*M520ω뵌]iΪ}mux7-.}$zƉX?)+_Z5aZe"*Fg;a+Ͼ⅕UJ~mGFKЋ!dZfeQA @5jr&H˘B)$Q&BW@chfOP7e_x5?;u4>,orAkh?A=zwuv]EYEJ8UUUEhb)'NC;?=!*+k4l99``XjqU0 $)c+-U5:>/d9@Yb٬&Ij2IdElkQ)0 }{j[&|ᆴ GV `{j&L`/fMuikʟY'9ev70&H& Ɍez>XM%hqX !@d2ٍ7(%h&m-kF+W,_z7ϟ?ݽ~wDG9;NVZ_4iҦMC<_XFB㈦B1vu_ Cccc8u}B` cBǍsTh6Bb3'U# #T)1F_8c9c/-Oݻ/V_EȰj+/ ŶbkQ% 6l]L*L_|= ۺ/g+*\[n#7v>W$刻M9M 1AH5!UXU(A$v9*pJD (֨IFS~Q O乯}׬Yk544y/o3k֬m۶wVesqШQv~T'OqF`f_8!*!hAl61f9!C!ĔL0 BvZ99`/a Q$Ŗ@ 2(w_g[oΛk-.Y>2o @o(ޞL&gϞm2}BfĈoPOk!玧n[՟1d}btPI?QN=o1fA%yڀZno?+ Ȓ|Tx;`d_V# |& '>11P*QVHPd2d#PaM-g&L|kkWi̙<-[vnYU?H7oew^O3iҤg}VVV:aXPbRnSUME1/ t~9pUH/ݼ侠_(˘|>F[KXK-}>illhbTJ$A뮊=W_uN>=䙝w=V<᪗_k#_榢 c1rE($)P$c^XX[%L:HI50Gɘvufߟ_\\\]]SO4s5!CdK:O+y. U| hLI2vBlojRl<'q珜Ų kXӰHp\#AJGK-M[CZ+^`!>rрY_[oxwWX1̓ _z0r4Mo5/^|%V\qU9s7~5lذErr!ho?~88kuI#Fp8zBi sM _ ~Y@* @o:2 g>[,4R XKfH*YD T6w~# ga'S]mxr/ki`EJC h40=2|IpseKAl5;j/sgM޺ 0uT7t:_O>}=ܳ=?ѣgm0XH I&|ھm吓 6YVEeuuuׯ뭷.MMMfk޽{'O\Z% lf{޶i@ ,hj'L{HSr6% <%M[L`E79a,!B(F`(h+ěTN{IFiU$pe9iFD10H 5H?>+Ka~O<O?׽%.#i >B8~>hժUX`W_=ny׫O1b֭'Nd#͟җ8裏98x袋SO=yeA`r 8e$cu99`/fh4H|H(ZhQGGb҂1>$[NQ1c-)гj6[EEEK]"+M$pK /$rֺ> g7eDY`YEHU ojU9yso|K*1Dϑ ˂ )`(0b!RiX\+l:nTUeI!lUSt:9&(%Z7J I m^pWs=555] .\x+7^x;sU@z1{ٳgZjҥ&3ϼ[[UUO-***n1qDeWW8VY~O6}}AhB_M [B p5׌;G0tׅM;hl!o &I$} z '\x7pèQE uٳg(eee_ % 9jTwSO2NV4@ R$E A1#s^-&XuD*%bCZ]Nƃ G ?7Ԑу~ N%|i42$˔B#XS ސʚJ.lKF;J&SQ4jMӰaAND{9b wÙCۼvf{?bP(fs:{~`Op7-k r@={ nO?tѢEMMMPf͜9S4} K;2 j{@ @ O=uV6UEeIdYeYQTUQYVY;t:]]]}-ر#rn meKM&Ӓ%KO<cź٭.ҤJ !G 5p @()ٝ0Ln/$M[I.r>;9X䴘lX7 3VE^_~umڒyo$Ʉ0tE;cd?dk9d_]T|/IS0&)@,gB@jȤ q&M!#)4 qkP-C7I|N0MX#caBqHUXcϸ6KL6j֬Y3́@ XV=`+W>^fG,Ͼt#8p$I3f̐$ cw߾}N~4]cnjZewڭ6YlvJD Q%9S"01߶щ9.A>0RXX!_5طo,<5G)t[?>tD޶Ti1 `K<p_]fd Tiq񂥽')aWC ϵ'VWKUJk&eD s hBC TTUKG ,\r+ڵp3̽ݦG/P !XH\J23DIDe@Z&gĉ\2f:R2!fyoIJ"B{ Rc/X,L&󭭭 y󚛛of7?dϷz\p:)5)PQ`(śۚF0K4|/Fg&h4Mtf4 mʹ(urumYۮI$ $ 8q,b@P71F6wshFp&ĉrh6N9 /<ᔉPg_Ѷ]vǻo}ni ڈr(DUEe[V0Ðk;ނrDUJ6alxoW{STup D@PB)HB[ J{!կz^^Qjld2i4eYyvRSN9媫jooߵkWo}A㧍ަ ڀ +Y_|Qz@MG /"eQ{d*}x-M/A.r܀r??_p-N {LqC'{ NO6L>h:䐓S,Ñֶd"i0vM溚:[}V01Zɧ{Cl^ wI< UbL,ҵ[ drL51,KgoYMm,<àDs<+#׼!1P5iSIF'8-I½tBdYQYJ&3iboɅ~ҳI&1%pAI{F]6Ɗ]j}u2 B|;LIfjZ^xaii6jyŻTy׭[ۋ1nmmmmm}?-\瞋Æ {'&MDJm*dpL`ӯ֯ohj7~biio}*qşg}SSU`Ϟ;*H[#(FkϮppԓs)'YRlS3ĉW$UUUiӦ\ׯ_/QFJ٬/ [W]]A޽ki<36EVhL \,H qEAJ;86a @ e? > (F ~wA7BL!Eg^0K[ɗ{;W<ЛlY햋nwg]mOOX|i'a8`O>ؔ &7 J Ȉ&gC{9+g A1l#|#}nmHtnd3R=M Ȧk_= 'dONmmmorqWZZH$8L!{9r…رvG]3hu5 ;7jllv@oΝ;STaQ;nqB2ac ],  &m2ԧk,/ٙgZz׈so1bM[vH_Nv'JʕpF.'o|k 7sOc >>+ &/B~b3LOOnI)UUFa&lKKk[[[8 pi%ɴԶ0, :Qղ.+ԣPڿ&Ǝ8봐F<$:Sڏ@3DSST_'=xظTg\^ҪgUs~u`'mxOw zk;YbJL!7b۶]Eer%XjdA=[h@00L7i >VOk/5n^5 >3˗/'O !x<% eeYc^Iq]tET.m^mO7_bAs .`pdwm.q7gۺy[l0qm GE+}"M4T_\YQ䣏:]??r!沶:b &s=%%%,k{.b088]5`() 1 3S[9mJgĊ3LaylLVUf"ϡ" )G !z>С^ tLJ &:c`@!0RfGs;~yKgOeY~?ˏ?ʕ+^o?=MsϹ6o4s+oyт+{vjhnF 3@d=s>4`@1lKK[[[oZ[[oe˖9ux|5PߠYdil6F2 14MUx< X,i)XS@E! G+kn"D1D QBBDH4Mf(c (XeETMnL [/W 6DQ{Μ'~v֭gq,\|͏>5E}b IJ, aN0΀XķYv>r,IDATVi&}UUU[le (T_Q%wtvBVQ`/ a F/չ0,DV0:8@A:KW!o|m͇6WqQ=VhTYx6aj5vu,#ΒK;ZG"J(Ƙ YdfT/l2BM%Yl6+3R,)IRpdFጒ}aӯcFO>aJJJfq?z/}ܶj5!+h<<ƼV&Tj5&r;^[\sM99tiZx<^RRb0XʲF#E_+znf F˱,B;*cE# OR==AYR J(,3Quu{}yJ*cɰE1WM ުf%N_Ji_ +GRliw|iՖ~qxa´J?ia_>tcG* 䩪F'DSiTQ' ,qX,eT*LK) @ \t&(~r^E86:jjvl* j=At +V' CO-:dڷowUoYOhSsms!'%xo0h0 ! C9uxxn_ם-I4D~׳/xypHAd#L%` ۲2YـsO`};a/kLAOXd 4ExtݹUg]iuXoy/#`Ɯw77u7xlzw ?>{˃7C+?:/cx@ bI d5QYQt6e9Φ2B8 )gCb!k^ 2PS3T;Զ=얤d:¹_l6^Yg_ھ}i_tO/R ;ʛ`PY >4u؍@hdGd2YAK|'N!'%x)(.SزZl*T3q&IXбb̡GbX: ulG) TJ8,l: L*->+ֶ1Ժ&??2dI?i^8zh*D)= )dd`В᭡48D`ίʤ2c&,~e_kޖG`r;tj=ٲvۺw6_W0M_zNZWK0XEUP%brN |`AeYHl:uvoI"j &ǝP܅eߝ͗jԩ۫w)..}۶{6I}}ѢXc\}b dL:%eDS4Qw,)*r6H&.UV*rzA r+e$ ox&e_WΘE AfñPE#4L2lɷ$SYi;pM${\'4U&zN@ Orې`nU'̜U/>w@:vz{o4k2`x'Ltzdꬕ/ڴzk?[Ϸ9V5՛t8]5/_L&#b "T8i veIIIˀg,>isX L^ۅCM-Թ~'wϿxz2>Zz6Pl8'R6#~ǾϢ!KW\iپWCNN?`Nk\.sD[^.T<9ps}>WO{@h0 vaNC`L !Y&IQYL:c }mOfM8"Uɚ?{i[~fDgcM$.<;jO2 ?JgKW21s1GzaV'j F_'L?3?E&'3hȼ(J2 {#ݍ=D,YUF5:q Ylf(\cMgL?xq9c+G= jX@?ɲ d0L"^nݵ^s<9\)hN_}=U5 E] *(|>ם+H*ԗ`YjUN3..e HlUHnPʥ["`ӯd2y㢛ne|xOBU\\L)mll B9׿upgrrx]uU/w˃7dR^GD!91:{z§!*!d]'%<@bX] Ʉ4Y XhZ" b~l$"4`1n?E09ŪFKh<(mJx][@ynh4haw(L|뭿8+. +:W|&#n\.=q$_^ޯ\Mj;zFoG7m͏hw,BW;nF(NKh\MH)D22dBk66` (,˲ݑJwA99csa@<<(!PJ-V!X\OFc[KI=jg "c e[XP5noF^Q&\Z i6󹬅y}Χ_4l0 !ۗf) wLJ"FϨ,`􄻬NO)FWAA%\;L'4eȐPx9ZfXLhpk˶mm=]]!Exy_:ZNN?TktF }?jD;2m5U`sJ端4bX4bzzZZzzh:%j|QG :rrE<,9*0_!bBX#&sT4U1Z J"I ϼʲn Vdd,xtD"`ID12Xʴp~ y&ZQzwr^?ʦ՛O;oXݏ-՟n/ɬXFksfXG`Yn''O(//yyye{99Df @Pu1[ײ 58,2ź'U ,R)X01XT{tp$eI2|CCc)fM]16fclZ<#ݩoϟr/y`#Sݠ>[n[jL&ܱik U1cW?lr:8sk9-Yi5qLaa!nWkS&XȪDE <, Yf%d*V`*RQhΏ*z=`c" x pv! 7PoMN9OmQ:<  |9VMx4cB0ٿT! bE A%9-Zobu7 ؟zMNG\ZN?Eì6Oah8 2fi⢬iא#gr]qٌj&l"q 'pfeY\@)%bT# Bzб섖Nq╷-Ȥ2>9dC}]}z@<O@&rrx6"KHrlK0 >s2О{`S99t#RO*M& vʔlP YFN`5ESUʚhD~  ́4@ kQU !#o2jol7߲au-ڽF'M}о A=&rr;*"TQj@18^蟕uu' "K@&Rß 6v 2" 9aPC$9£$ oS,爤]`Jkl"A>^r{{qgt]^49 ]N_bSx::::;/uv`f| =A[?@l?G+րjޓ .$bxe಄ޖ\v[le=7oo\~7 9@˅zt\\Vk'zk~k7+.?o~:Z;n݋i,5H$VWW@RQJ9S(˲<ϛtgnnNo8 "n(_\\t]X,魭-۶5@@D ömf#iJX,655 xf```}}]D "gFT* |~|||~~?dii)LJxg pN8'ɕd=FIENDB`davmail-6.3.0/src/site/resources/images/davmailLogo.png0100644 0000000 0000000 00000007164 12564151525 021660 0ustar000000000 0000000 PNG  IHDR;(]F pHYs  ~&IDATx] pT"H`Fj;qtht:VS:љ2V4[VD<=̈́. n*iaX@!`Y@d#7]& y>$ :Y~*C) >>ik&O#>LA܋{rĕؼ WW_`.fby!+wNv7bbkoȺLڀ51dXvGHE=Upԡg1rn/Gk)ikHֳTђr͙h!A.GE(W[~ feBZSЂn 1}J%XkG[l,FᎅЛ>.4s't\N,%V?O`sH+mq:XF򁨳ΐ\W/ rߺXܣ;]6IąI }΂x2t.a7y.i kkӇӥ;ȃ>BZ+b^W6c|4zAhō^HD'3ANe.FlybPEH;AM4};'t%!-1E3I'T?cĮBXeyۂCXG[i) u\c -Hbl*440t4bgJ9>a9O86Db.*In}Yܶۍb7\aml+hyxog^!}ٔaA/nB9Vӥ&Ab^ Ǯfs.r"\W{~Ml{!c0Z3bg Jv&Rie.W8ϲxF|jw"qO.QQ>4w -?gʳ)cgVtqy k[?ohPY5Z]y;V}BggO[[lMD|"N醻0M/eNdbgˠ3AyeDq*+SZe~3nD?Sْ?8P]pKj3T>ZvV]Xs6l%z㿰B aco,J;L݀ˆ$vgy IEAkQNu#9UVWGېY-\*vD1<}+fg>(DgqOP "DZ8=U@tTȞ4~6VBރvX[q8G;M+: K,' Aa 3r7-&P͓-v'R;F {v # x;~g p^Y!NOy81(t-F+5Ob}uNbĞpu9BG((p!{@P;_۝JY ivn=y ҉b~#giQt1/^{>|X Bބ|dxnʝ NO6G>9YupUv'Z,[7ziZdp ^z#ٻcחZpC)+6t4( v米Y+y,aBkO=erinGNU_w$v~.FX?l=Y 8Y%"*tQGGQ. քto 7Y 6[^s%@9u| f]7_df.oS5;^o*6ñ:K e/i()cpWH#nBd})|~d4vXa:Ẃ~SX:hDY.xj(vo;"a5gEM?#Z&^:OWNDDjDh p_(隡 gmXL '6 Ua7qr_6b Hf>VR`)_(vl=9%;,_3;ƿqa ^!kGRvtoNT_`;Ɨ% Lj#1s$c>q/l&ֽvv/zM^Z4Ky~5DCCćL W?nY6 LY(l~yl]|3BnxF ԁQ/PF410g`DQXķ@f-4˛[Ǎ9dՏdkhh|a3w-$T?r +^ y fw/q3u1lw*H~kBCC# yHuq٧=3΅.w67kso PN\544Ruq/[X $bn$Dž'4vX?bbb?4L'"IENDB`davmail-6.3.0/src/site/resources/images/davmailSettings.png0100644 0000000 0000000 00000021365 12564151525 022557 0ustar000000000 0000000 PNG  IHDR}N IDATx{ǟ99*K(R%"5RT]"%vwJK)M%JBKֽJ4*HN0Zf7޳׬Y3{o?ksfϚ)eq"2x0@vͳ<rh@ɴl9jqqw4D4y%F(PNYaj+nQTKy3qhVV*>Zz4|}[mAtz>;a!/lŜ_л]~ٰ}e4rwжMxIo|޶-{eM{1rOэXżpGGGWWWGMb+ZI8scY➞//oϵȒ.y}x1j`׈N|btgO@!|k}lWh?_]udnuۼ :^o==}'spϕ)Ȟ^y"rYȐM>*i_HcDx'[r"m罷dK}E 8_zU:m?x~U6:!\$"klvS>"N}**"CF^?yQ%ߎ>ijnj|KDk_xȑF]u"rćM,X~m /1ҝ|qEY}Wqe^{u8_琁~$"0EDVefS'{Wc.g 従'~9vgr]N~ q;.uQ=)js?U_>T 98[kȦÇl:]Dtug-),]y_].Yzy]zI#}Π? }vi,&'G7f'x'G?OD"cȗ9G"/8k:6zƒ;-"X"bdɿ8}~?πE̟W+ ߓEe+kNtz:xCƊ; C :NDklv7 "2pة&# Ơ"ooy|2Gm)"ɮۅ"̽K=./gҀ|їo=zljc+"p߻j7-"#k:VDHwUqO:FD}b%ɠxg}Gg,,o_4}iZu7Y"s{ g߶9㝂xc8N ?߾Y(w_CqulsY]-o>wO9_3/\$<*Ht$4͜@w^d~{_>qdh{uL5EGW.a tȕr܇/L˽zVo|»l޳%mr"Z[ sZլKݝ/v-|us{to^yyxSCwBVM~1},GICuD?o:?P8[nÞcn{q־;.bISݐew6aHGÑM F$R7gs> ].zpŁ" d}oqEzEDVُm}Ȟ֕R υ\(υ* U$JT{N"Zsc{O}Y+=sBDzߴ{:m ]Yҍ\x\}O?v~/,Y(s_M۬<%-BGGG峬e;"A;3笽[}8s5]KVX6O~۹;N[m=hEtɩsDnz@~e4q ^K8n)&=4&:"2bWz*GNUڊq ^e:n_:üc~ȫ Ddž}`A ,w=e̻aJ މ/,@JtՖFHkh *}gJp@(fH"7TmliaD[ ɪTE b ׁ%e SwBՊUNvkq&ѩh6l{СL±DRh >06 \l|CmPIiΧpeӪ"ige/M|{ ~Qb݉=ʿ}a | CVD 5 RgA=/\:eu"7h&:);j&++0XSt_1N-Y #G2oSbA?`^]p2ߖ' =Ȍj6c!oA\6jH9ؘ7+KOt͏*2~>fm}`s& 4;=@ΠBmp%l.8 tgY7@2p';Rd@wAd>f֝ߎ&ߒsǙS}h*TαciniׯD7&Z#2F~o'T/4 +Vl@[M>BzQut^)BOf+30%M-Мۓ.MT5g;;@i@:IsHgg'٠;P'k~DJG5rAw$=>Ś VB%Ve$DELDݱ}̴`UDJ7ٜUvDݩNl4*w䍛,?vѱ[mH#MU(N-B*CכPoףr;{4Xc /׋K\y*n^НQulͩڠ__Dn"? 6,(%  c.@w!P*$BwU2i%)o^@KAtJ~W #\tSw,0$i{t2aJsy@٠;$SǼ@|WzCoZo{?./y֟/9=%X.bQ#Q敓\x4C!t)-0_ijk"w0́a@@IX Uebi$މlئKZ莍&&`^5_W0P2El^VBՒpWmD Ti^Gw #BGb"CΐBM"pU*oώ;t/ y`^wM.MDW]~hͫŎ ї +H_:ֻ&{0eޝucWd[e4y+qLʢѨ_yyQVyפ"j g=t`Rұ&9&}U#I٤<8I8h,nYX]odL켲oȤk@JTYշI8ӜX+rS~,eqt@-ѤD' M8P6;{$݁? @wlt 5d|mX݁R Rʱ!ұ wxjdU3,k0#C+'k,aSMHt DM*Ѥsj&kbp*%ٟN$.)p :L@ ,x;ŒMDdͅz$o8KUVB i4u{WS-q7_2uXBw@TqJ."6ZIm#ILorc5JOv{/ d($KFDVtǢy̔1b$mxixaBO)Fx_zF5-IRx  0*K%IKIkm x3e wӦ{aocCOÒ)t|+ɸ8UpY(}6-v@XRS&}2Nj&u3O~Q*>8i`}mFn"ީL2TF:b8Ő*V`I.F],c}%R]S,Ld`?Ί;TMNɱ=PrYRD.5ʑ%5%*v Hr-#9r 5!IZȁZ&94v<C3@w ͠A@wq@cT>6@cӚ0;PCtccOAw5t<&oͷ;E؈"3>6NI&?D[ϝ|l t5^a$X.tf+6.>6DAwlnG^McU Ei,|lwJPY}lʟ>6NkʙIvtڤ)T i7Ἧ[;ER/=tMUݱt(Fid%c^* CwU&VAw Ot@w;tF:P!tg>6@cT>6 ;@5@w >64t'NmbG]HXRwpnp iȘi&>6aHך}c,JgbeV6#؄ XciVF5F_?>6MdD7ohe>6`c>|lwjk}ljc jU 35>6("MABSHc (e"KMDV* CwU&VAw Ot@w;tF:P!tg>6@cT>6 ;@5@w pޜ|scc.yؠ; :MM`adt5H>6GVC|lНPK*߻G=5*ZEclS4ؠ;vAYljr@E-22E.=cX4cbhS#g"3ccCVHAwʎnݤ@" JQc^yt9JFUaAw߱4yyDMr|l}͠46mDǓ/ PM~dX[hw65HƑ}.s1ؘ,drtaNF GMmN٨XᒢU&r!>6T>6 y ;P6 `0ҁ A@wq@cT>6@cӚ0;PCtN`j">6撇 s^u3ߧr+|l ə"n,i' ؤ |^7#m5&yclb릴ƄE$cĔ=YM#ݱ1я*ٺUc㮨UUb cN idz^6&E>6NkRLMjI4O\_촋tp-ЂWѝß^7IzS7&$Or|l@UMcX:F_dF)R >6Q>6>6 y ;P6 `0ҁ ! ;;;`3WLαcqtT.(wt^pd@E^ݱw1莨$Mɒ'l-~,@SNoGlMѓ*ҔԚcnjخ_{P5Ynhbg޵9\RmZ^nh_G._AgfeI<VY̶T@wR vRo`,CJN^:;;r64e6)]]]%lH`~@w"Kt kټnI$Puʳ/f+h݂)]UHpI>Xq_;bSj),m#*UM-妷7tO}Ykoџf,^ Mp)jL0 AM% آ;&cl8]~=gz,IVF>56VhX;izDiM]2ɓ,Ct|UtMߓ$%WQI{SSx' ^(#嘠^7`MͫF^wHw"k}\e;1K=1](:zeЋ;9ԓKF:n0 y;dKbW79@lK nZUɤMD$6{dyv&-C"ﺡEzzROI(Q|2YUMO^wty J9r Pw8m>h|;@w =utJ@eC^w@wTy!\GtR[2vz5ԴЂ8 S$a*W10C~ NS[|o?|d3JPD HOSUqa,Ay%;@\0ٸ*ɲW> K=3yZ3zPd7=jO.eo|up|P4mN\_|c(^w* Ӹ~:iςk5;)I۳kIDAT9™=k_"=cnj㹘ZP@諝:mzwwwigONzp$"@q;#=W@eC^w@wT @w/@ysq(UwZ;;;;P$NAt#kP(wGGGA:cNS[U7g51>Mstt -C6N8ŝ;s< uGT&/9̞5 giDٳf xi`UIW@SiUa,ttw!D,]" .| 7}mUlqQǯٺllEbWb; i r2ZfII3u8MىLL$!^gaBʙ0,T![-Pς !) GS!TϘi4I KA4$EґK=ZSZ Sk9tẐl!:h!6z%ȁHcqMH7oo Mהn/AGčI36ٛ"tk8 =h?=mĊTB¾ iΨ|?^=Bv%Ђp[M>*gj_XFc_AO^70fc]/~sO8z/'iR~8}LS-d&  ;*Id|WI%mV>m$f3ͳGc7臸Ӡ❤c5 (ARdk7YAULQ|$|?bz]?,]by vrw])[Y+쭸keʟC)o5r?P7Ӎ*XtIt&~ ܡ0,[Ѭߏ\=SxCR['R#'o=8b4TF\$} zEY,=ܦER.TD\!Ց>R)uJZxє@Y8D,wRD%e3שjW)y%sa;t1CyEQIENDB`davmail-6.3.0/src/site/resources/images/donate.png0100644 0000000 0000000 00000001366 12564151555 020675 0ustar000000000 0000000 PNG  IHDRĴl; pHYs  ~IDATxڕ?hP?:>ɘAzT%XKl <9 b9*rہJl"jV*ES z{Kr}//ᄐ"B%₟FD63 (Gn v^9jK»v@Y8Y1Z犵tY3#uO!sbfˢ^tsuŬX(TG򝩅Vt<Vb?, bF\n6ΠJlǮ^X7_:C\B CΩ3zixKW]g[ȶL,N牑:*UoBb $?YdLrEFc&oHQw,GoX?)J!M#, /-#55A.L#cL`fey+uZ1j~Ӑ'(#;X#xW{̣k(޿+^XWgnY/TWp| sH` &-69l77U7X`CyNEyeGz5G 8uV," ̛~ !%/0ؖӍB\1,Uc-m`Eg {⎮_۲&P8,'FpP;$tt7O[Ve^q]__y,yIENDB`davmail-6.3.0/src/site/resources/images/download.png0100644 0000000 0000000 00000001217 12564151525 021222 0ustar000000000 0000000 PNG  IHDRĴl; pHYs  ~AIDATxڭ=@[8խL!FRipMvR[$] \A[=arr +OFP\;s7#fgžμe6Cr&K=MpqM3XUEt($7851V,+t<тXJ&4)qR?-hg,xXlq߻G^nf,9;Ѥ*7.υs7X:1zil j4(Vps!^)GoDC2ANˏJ99S_UN,ė~P41.刃>8˄.̍36h ]M00‰LB\u\R< h{8r˝[`!W3;+M;'( 8t)#|n®7&NLpK=;7vS70xْ-D>u1xm,zl v" ?{+gV7eJUu<9bu.6ء!WeKPIENDB`davmail-6.3.0/src/site/resources/images/inner-gd.png0100644 0000000 0000000 00000000272 12564151525 021116 0ustar000000000 0000000 PNG  IHDRJ tEXtSoftwareAdobe ImageReadyqe<\IDATxֱ @5v6$ ufq{h -F|X`]H]%$k` h 3lXcFAIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneAccount1.png0100644 0000000 0000000 00000142115 12564151525 023560 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]`Umv{H! @B b;ųݩy'zrbDQQQJ {mf Iރ̼>W޼랿4{GJr$~|ޞ|{v۹v;k/MMME|hnh;uVp-svힳW[S6T2zEG<H$| ˋ((O+W4Չb@DL<{螪^qd/6o݂~X@$_P})S0}3w`£Xx빬"?__/CDdZ Jcxƴ3#7ۇg\;^*e3n Ldf3L& *z~\?ǏǴ)DJ;trɉ;ܠ2.z5;TSUy!\jРXOט `g1!D-w–MQYY u48$OoMta)vU`ڄqT>$4 ܶLrGtu)y瑛zA Jxaq.Ҳ!!3_WWVm~Y/q٧BM3 '#hOHWlll3go3f8t~=KxnƍW_qG@a¸q藐KI _,EҠ =2mޱG23# I2յغs;*虼xNIp r]ԆZc{~~2V|LJϞGI/ӳ0C?d,tFl|. 7y}0٭J7wdӘNβJ|f 2>_ \|xs}刍Y`0i&,[?h\]q 7"n+GFvp=.*aЏe˖-K0t՚2p 7࣏>gVҙ|*,Xx;v܉Ru]xD]q1⅙K/Г׺٦͛^SM\̢^KXÆbDbNEcq-_@"L`u+V $>O>w҄}ozqQdسkR0yDF=",q睶߅}| BG!ҳm8!,}h<<_{B.vXNFY,,7lh}ݥEpwwǕW^Yܧ~ N+$(""JayHr̵WEuUevW4фi† %"_ЦG">\#>K%?n]sO>Y~&I/Gf%@4޴xz˂[ћoEL\<~WWW*Oh 'k\9y9?v,ja/O44cWw~g(IXLE <8:U8ORO%N _ED>|8&N&oۆ[JI厉E}B>tO?F(|ݼmT[WLW?2A*8O_O} nKc6uMp?Ic;wbH|\Ho>x+Q[o^ۈz0Ï:8}eX!q(>> 90!oOǺ](a1s|$  CYv=#2w<};|w;?ؖk s1cwG_-.acBm3Lx,YxO&j&@+V2dAܰ~->?ӂ0xa%g\+&O!~ *lIzoV́|_7 #]ER ܠ+DzͬdCMr  <엥^%#2sKBkr5V<k AaEψH[C.Cr"fϙ~3Ocɗ_㹧a+p iaTľ=Hkx`cſc E.g˫d묱4&2Lw=HoyBooyG{.kяHRl,j-0u|U]ݠ,Ro?))8|06l؀4 `!BBڂ l)_̧,iwTԟ~Ÿٖdw<1xB½QKּt?T OVniذZӏRrl4QGںa rd>b垻yU;m&P c5xa WeGܪs &H}HDdjhg!FL[Mȓ^WK>^id onxj5(eyHEk4 mxe=*G IxZ:!$>,5tNĘGo[N&>sM6 8_գ~4J&JydO~.nKQ/IW5EXvM~ \;"x̡;hfTEj!e 4Ky)X#zI=t@q[(IbHz۳?W0d lm ]/<|]&CFU}k"B%M$-adG|}|Q^Y}jGjM7[˖ d?AК_γɧѨo "4{0 LNn%F=jD}=M hȠ1'5^D,9鹩!jVgLGinj ϝ,ޗ=饶2@"p6؎7pF&ր oZ jA⥴ht߇A~fDQ5[Wa]#:Jsyȋ^ GI{D@g?H.Y-iNjl=KIY'b]Ҟ87Ӓ)*/޾~jbmy!:E⫭Bu E;>5)dgAMu ԤP{} (eBQ"?'[%SEx-)`2 D)YiGljbD^o+~B BrHExϏ$BZ$͸l L =iBM?56bBR(oq`$%5ȯ4vƫ͙6N4tPq1O$6? ڲfnV:ܡMW@\_~#I颮٥7/p`$FPa =z)Ǒ<"ۢmPɪ<yas&$wUYb>r9\ݽH |J=y]7WVvn>^~C$$)rp}+a/~Vrڹ~K)u 6lŤ cO߇gt:xwvxa% jko)D7+7 ֆ--щxH%k=IV{" %y_[]UQE5Y1{!z H0D #5SlWXZ̼RAd FGۮ7k@zJ+1bp?LTh0wU8~ +@UmbhpƥS.]Y⸪4?gq_kE~DFzs=|lr$Gs+;_ Xu[7C(n~m1z'*ͱc@bY`xUKR#GXNw$_۠Ñ\jU~V{+1sDHI!^xexa$QZ(}Fo0u+W%0䍵JKȉ^ >B]dD\l4GA |l+^}^Lo4WjO LNJ{,ԢLf-HH-.7*M Yel+G/j %F/w+w#*JAD@N-okEy*8_TV'p ;qh&GaPoP<c Y,fX ˡV"Wc;Jc>Dm)eZ]K_yе]EH.SVW;&׋F G-z23}T_pe,Byni 2tm ;rѳ7}C u58 .Pm 2e`_z Bi,^5r3B$$$JFZF^8L8tF5tI!HQMm0؊ĆcF!|liޔfL*|w !?r?|h vʃ${oŕM),GBl8\3;>|~}puWP($qyeXb[՗DʳbڭBE~GAcxըׁ+oY L;NsTBhLJPHK9+S31jhtsi [D-e\r1_x]~p|͟_`+"@mM^X3߯G@xy<.6-)(i+7i#IaѮ-_H::[`w՜xQ؄xN*C#)xOAd_s-kqY%z(_D]{ X!ʡoԋJ̒U}@@J>vz5uZ寘02C ;J֑'%&8#O62LLX[ MqXyUfa+0OoQ Ѓ=&_!,@C5[l|l%o]\^~pJ蘇dm7ere2sKlNL(I\WAz!%=ZF{+n=]i{y탕4)O0ƊɲG/|HӢS<+c8TCqqgEKġ IĂ犴߬GFcPW# \<̦TD)?Z\f)hDAICW6Ҋմ:Kk/qS'Ũ({v9>ZByUnzVMEmc+mbexueE\XT" nnЗ) pZX %I$ p IDAT* {Ry5HQd>D! v[*/H" p):'t;4u$H:A@#$Mѽ/P^D@" ReH$' 'JL'K,AvvYS׈eXȂ`8J-Ź 0a=72?mHŤ}iG.*D 4&EGk? ~= F /x^78 z9@rH)hHҝX>/bZUH'W4XNX"Zl j$ KlhQſe]uʔ)@zz:qUW"屮H,X`$uH)XZQcy(Ř&AT|' }ìemڸD,LklFģT=xc5^svWXX(Ϛ5 4ooo<쳘>}.۷c̙F@@ƌ7x(3gRL-Z$YT. +W믿 &`ذax'd{һwoy?~xtd׮]Ψ(O>CZkұRK~oٜ?>K t}:yzbwomSI^[ O;WN};Һr 0|PYkVU  Xq40KO> Vɓ'cׯ~VU}W *o۶MlK?++ Wg\N ֭Cnnp0)!駟âW_} d㪩I "gH I[n<vP>"cwfH}l?_1qWNqQh~ƌ‰vZ<3WZ%ι{n[^y 8`c Mعx&%?Ws {mTTlcWhQ3-\MyxѸ[ GC|T0a4k)os:zDKIL#fl}6O>Dl3THIOq^.>giT \+doo$6j?τR)Kxƍm3p~w+qoQ NŶJvYq(UKbL|o &hvuZ/?:g-cL2օ7|+W׌")h!)ǼW{&@z PH|Vb1b [qN? {#D@"p~!Τ&!H3w954! ~*U\ݜZL" 8Op  FJV5Ԥ+ZB|3ƶt>n6$* i Dtp >'`MLQWOІ2Umj/lF^n B%DTp & 9IT=qj  *U 阇U\>teDV3ypMf=N `ZH$S[nr? Ʋ8S:VE<8EWVQkB;SWO胤=;D@"pz8LNNC)_ʖ$<,eM9$sJ$C@5I$ϱ&+8IR$c8< A" t'&sv"tcؤ ܍$9>2U" H7W^D@"9;GJ$IKH:G@`TD#0G0H,9ohgSfT\rA=pF Ab|϶YD@" 8%F?mHŞ| L艸 xyBMB{,lj-LfrTJ2f Z3Zet@[@" *N!$1WZ`4Co09'eQ$ղ!D8:_FeFDG)fQD@7@gўUȍ'8{ JWҔjg`^" 8eBuvSIYK$.BJ$SC)XM fXVC_z*(+]l/NIk̴4fum6y.HS}ml~ˎ AbDٓú(F6;D+W]/vY@" 8op ӣAk8 hnVi3zyM#]- HNdYVuժZUC{# d|,`0DY\h5cQC*o&Z!]EiJz=IZУ\@CC.]I&!66\@SoH|f54l.nÓqbxŻS?bwJ(HqWO c*ty, {n+kdvDF;Pu˖-Cppt*i͔ooo˝:v6l؀{vO&J <}gÒ%K}V.)Z}flC$GE熒I΍)\{9mY5kF"cGuBWjHr'oѣG~$Lt t ~>o3. : fzd#7(&X%h$Ć"#;b#Kk|xDz*aEQ9++ .Dee%꫓ٳqQT H$  `ŨB A8W 6 ֓^[m#\HMs'spsUMBf2rY dcofT֣OAmС+\277V5\ӧcӦMB=袋?`׮]{f/ŕ[nAEL|kj0r\\xqX ]j87h#]\veXr%^uL0Æ O&=&={{EA5n8qa}(--m&-C^q-m6|9x .N裏D݌C~~؞|IA?0=ɏ#_PP V&V&k$FI5%0 ._С;c IqSP vb\}4U4Iu.4N\CZ _R fy,0R6Xd=o]8e&~gIU[~ôiӄ[^ۺurh+ᥗ^j##VYrz 3gHqI{b{Yug<⸸X56JDɁɔ%Hf*"8~xL8Q?E~x:„d|رip$g~~yu]GZse8HLPQFdH`1w_RШzKPi=z".ӘfZ7׫l$AL v5lc>t$a Kz}}}mL&H[D{]S ?~\8c 1 ɏbkfuD8dȁIVYj[yu]$ 2?'!/80tM P"1rSZCWl<*l M}i4@:CĻj\DeSl˾>栴c=;l X?Y BJݻw+'Y]>Й {f3y-YfN~)8p7|YcЊ+6D&R4,DF$@5I~g 9.&P`vR#h@xtLϼ+6Ӧּ>~xϏ,2rPSX+ Fr`i%g}V] fm``{͘HN7p7(sρ,B9gʔ)g2rK!f2KK?ŋm;Τt9(f g=o$Ū(QM&atuuG7 ooGK=[N>d=;-y#22ݴ";6<9,K`Y;-K/ M{yq~&͛7;}cX~3q`./4~3L:U8{x8&B$@M9< &?BΔkŚkb b/:Zd{l#Tcʘxl^}D&R9q~cGn AgOl111)0aMc*Qr:\!e7o_lcokFc&.3(ȐTyKL|oo߾u5 CsyG%I:E-,-lwHuwJq777Ye‚¬4*ut\lkb"){k5z>dW>Fsuǟ B>;>JK$ B>Й$i.f2$OEci\S[8Z䍇_p; Ȓ ``dUX?"sm|Mok01#9yd%"tS9ɸz6LזmeD $H[˭_0t~i2U" tS0OI? 1,DGvqo"Oz,Aq;oLHA) ]7cLɩD%!B&D<a'‘-"% q AOu_=z˵8ʿ"409I:["K$g |Rqz+ۑH$ND@UI$ϭ%{+8INSV%[HJ$gIgVYD@"p. \KA@UV* 8< Ƒ9ySB[Ee?tYNy-s5)MYSgB2K {I/#]y$Ipu-AD^eySfwusO &13QLҴK i:3jPZZ_VErAI/LfH$'C)x4(a4PH򛙥>b@=u%A=I󰠁,gdI$zGr!fi8\ {~[^ eD@"p87؈>(r IDATї@#3ҽDpb`w\A@4*˭DkOkA*ӠBqc<}L0VBb|ک^,'HN!"\c`{ie8b?5sQ[Dxxa1Gt8|`=!Mn2Q%mME ?B#T$@HN`ae%B,Qgtp#l24R_ªLHsѨ`tK6ǞjLHJU?8#AqUE6R#{DYK@&OeiD@"@8iڪRLh*ʃTF4M=  Zhɫ;GBĎ#yIy&[NjZH"A" &N!}&<&pzVWOڰ f\b { ? 7ẘHrp?HC>;?Vo W.|tkC f_D@"p8M=I+0Жrڊ,!Ic.\zҋjN"L;W 9:*aқpܼXRP_e lMA" N444`ҥ4ibccʥ9Kq#tKѰL=L 7vɀ@rr FuyPi2*SF ;,hChp񂛿_З`t)  44T];;mf2;߿8;+*$=:}ddggLB7kU7a0x nG+'4虝M*pf?`Ѡg_H*q}zyPe0EFM]|r8fΜi˹uV޽{m;wۈrƌxy 9 9ƳFN!@f#@2Ϥ>AUSW|䈃%`6y~#Q gL؋l>4\FWTX4Tg"ɓ'8ChHa˖-R{%ӧD!  0ȃ"A`qL96EԬD(^8 <66X Y"n,+$R#$?0yL=i䣂T^-!,* <>;qƉjqqqqGqqȣ"X}1~xDGGK.#<;θl2AsovOĭ[U]ٕrV-zȑ#qӧ{sXb ѣ[1uT%Y%g&#( : +. '&כh<5w> h F OJcEp׸$}}=rӺTգlu (iil`# d`5xtX>pf3 "ltǏKg϶I/~* ;JVVV^}a{͚5|5׈i+=CxWD޺$jfeڵsssE"##E|ff& еLg [nE<6{#Nc=\Ktpepm A rrQ9J6#0Myd;SN>*KI;pv!vb-x2+Y8㥅 D h WWb7 ? .ovE."##C+eX555`daկ*Һ۹Kqa{ٳ^%2&殶y:^{MtqѢEmoooL_!===#?`ժU6OoU9t^ٹ8gADLTkp|N`B,Ad/BXcI%=&B&>x`ôihBpw8PX7ө;2)a̘1ʡGrzWfdK~,*AQ<[z"W^)+l>w͓՗d@ߪl7*EegѣE#=`[xMc LJ~5:}qh4yS0{Q.|-҈@o *\QƜM ) Mp-'5ѢA"G*-zAwd(wxπN0AP[d9Z6@%DEEC:ÞYVHp*j0Uӱcl@yh lW6M-KPmM  0Yi'8jCDW5.n* &_3n \hb}&>yE3f#ye0iBS:uό4?m'g.%@lçKbuLLp?)))K ۆ~}r]v n֫w"]։|r#bŗUMhI-O[7"ԫZV3?ũ:6]ϛ$zz}I wo/":/aÆuXeWsA DB q!U4su*qDF@KsTW1g9"@7wBQw:eD@" \P "I?P2D@" 8;|U0j)U7$D@"  { *GCN2vt]0t0hX D@m~{GYIB#Gra֙=*A=iH}~4W Hf"WKL<YWz{el0`PX$ z x!ZYBY0H" 8ɬFmZ9üRRLvd9Ƣo.Ĭ9jgR_u+S" fHf7T^D@"8JH #8$@DZ9%n$nvCH$# qdND! Py9Ht+S" fHf7T^D@"8JH #8$@DZ9%n$nvCH$# qdND! Py9Ht+S" fHf7T^D@"8JH&Ѻ(R^.~r$TxA$^ӇF򅛇S"@bY Z3!!=#l<H/YW_*Ӳeb9̠pZkks../C)Fw}I$0ziQzFCڦW H_iA6 L¸1#um;y*HNqcF!iPuTȒ_YQ. C}Ԉ,H$}aPTiNpS`mU# Hh`ҳJChÃm~2H$?*Q,GCبC y{<=SH$ l)Ya1OI+))CP^^HNJBXXd>DDf.!IGaGvV wV@CyUVuPBHHҎEāHo^K$SB)h0i&>VflId4L.@Dww7j>/*.`! UCeY$$2庘4T^C0!D@" 8]H#0BOUO,76QU]'wdT剡Cq5I H&Fee44C|\YӡVR3+\#tF U={lkk$EXKDX-lz!11}!MÓ'O;8*+*az\Iګ!l VD@",+14K ClL4v- YV" 8}HS\t)&Gƞ~T _&9oo/2rl۶T;w D&F۷;wĞ={]T=ޛRD@MK&&1{,KbNJQ Hm)˲}|wfݝ%;y_{ _rw ճ'&M -O,;(6o[駟AQF!x\dႀ⫯شi!izZ5 ɭVP;0aw}GR %y}C rDqeԘIIJXz2v> wĴi nO>dumۢHmʔ)={"d h4QE%$8~Ӫz~FjXl9>COx޼yxǕzq&]n,.LZBS^ZۥCNv.Mbj~43gVh}vm*%ڼn:r-i4 \q-%$К`Z P4K/I/ILۥ6ǚ5k԰bH$ ,Q_,-[ēOgnGfNXs7"_|vکuIv,5jZl㦛nC qgc„ $eꪫK.oJݩM}| FxWNSUI`ȑt/UC&_}2%vZL:U^{m G)Y~=z'*"d(OZz)*]41ِߩ<՚`Ci7n4O>T<(ޠ&$rr7og3;)1҂%)0;vz<̳Ν?X|Eo5kTpE v֭ !#c.Ed2_^&~zdAr?|3GL-"щԶ[=܃{Wijφ TRDξ[O  e?tӪ^rх4x.("F6P w+5; $'t bZn:b"#kJ$&D4zcǎMV#"T2dEwyguY 7NLV1SE,,,Tԥw}WO*,g)"$P"+Z4G |/GYH+ttn";Ir78ܳc 2d0 S\VXN5E;v:컻{EkJ>g'"tZ8NL38#z.ZiH%&!N~"".RF˗2 ?dPG),d+yvԢ8R7=aU:Jv'gZEIC~B b6) ΢Ih[8 FL6o)PuZ?/:O11#oVEB ߟ(&ID< &EBDu]6{V=FE#p$ PCI~YZ PL\Ii E0#?,,>Ycb ! 4iڄ_P0=!+{ [.4!C&?8?A lkxN%"o!I&} e`'Uo}fRS,EM~}/՚RKV6K}oS adU"5 IDAT$F YY I@ NXBʗ$",ږ֭z'LTjGL]>sMP:o(Eε+nbr*r-JČ]j:Dk#O*"_H4X^&#L6Hኀ% F!?:d/?$GR7$%ݡ]QcTr2u.$))$3Y``!I(ϖ|[R4O+'Z / K "ǫISO2ok#OLt!qB_iጀh|qO2Z,橯F/rľ'ݾqer,"#FV O2OM+W4!#YbHeYǛ7obo;gjǍS_hy[]р Eꊉ{"U138*DH@"ZJF% [% QO}r+R۷o=O[tYXH-;g2^RkFk{򕂐D3~~  (sdEVě8iJ93U=f}EЫW/5R0AT?1OzF@#"i#@$+}5VkFw2c?Ƞ% &&D3,ԃ+S|!5%F@#i!@I[ASQyB "O<Ծ$*&i3qHu5`@`U\%,9y=Tf]T#(B߫`]I-T%QS_Ogw9Y?pBLEE9vDvN. w`$DB⣓o\EKa=y?-F/6l5`f駟nD#'tՂޯYNuUTTȬr'QW^wB3ѧZ5@z 2txh⚳'NJkmo}[j^qb,D|ň{L?=(z͐@-H(Ǒ݄ˎM6VZx$F6mg~2kF@#D 48[hj@8nsphF@#vhZ'N;BFpA@rt;5# ̞h4# pC(h4G% @̀G/Z#p#P ߁)#$R (|D[po/+ӵz>,Ju zט^2Ʃֳ,C56~uݜWgŝ'ьH䷒$x˗>|a΍hmD%g]35abx/) ̻^Mtbyq_ ^(vwT 7p}˱lҷ=xwYpc >ԉMx.zsHH0y;8vr3B1t>-DhSe35ŊPesR梨Q۷`Հ5ԫ&Gη*jzװŏs}h۸zh做XSr}/ܯxH\NhySԱeEL);p ?V„N{S#5R0=7Ͽ)(G=L^!|28bx9r o}pP p.ْ&2dz6ww-]~' cnM((bGe V"UYjDەx>T{ ΏOVG|̳^^8$A>eХ)F㜸 732 FlDϋjd6*>pǕWMBVg"<#1p=<]$*F(_iY 8daڤğZSVՏ?L^$AV7'Wu/6&ǎhVoZq#XOBlAiqRծ eVv>8FLB$]Un)W@H Ere:%Um 8;s5Y.f4e`zWy '~ŢO 5rpA+Qe)S\.Gkc+a3#{ߣs1VHE:HWq9!7&K糾$ ?R'S,So9&=HOqR[dbɌS^b/~KnW Ʀ ӁA}qܐx0w2 FC!{|n!?y/' mkynd V,;'＀c/Tf >{AF,$Tu@X 1YQL|}&eppicvZl۶ zvêUkawd 33a1yϹ q|K,d%<ڳj"Q]?M5;ChKy_̿쥶5nh-Py3*e6նK7y, emASQ3}X@S*o_t'$ Wz"jU]oET|e^<}L#7=8syqߜ.yos.ۻ'"}8F.V]|ᓿrbt73UC@q P]&bY-ڕeE#Gw05?Y>/yq)/4n |7kw=7fgxrOT髃;Ui HO*. ߮ b&I{ҝs?&RX=i 'VyyrUSٗ Uh׮-=hպƎ͛6aQhڴ ʹYزe adf)27O7g~S`Ybyhρv͎w}e"C[D8@{aD*}Eh3 !bR'-͞DO1]4;|Mb?Y 5vjgc庒>CeJ B/ѴEғG݄$_<LiӼyN4[a A'^1[>(TG󧂥u,|ھ{I !`wȏ/y/̡VԼTIr&K?#tL=~C-=H^9J!ڒ:mIF7mTUBYiڶmm@cΌ tٛ?hU^j[nQJB,l Wo}v\d*; ;&^|J_ i3*2&^&W 7icƿy&K4!vO.rE:xn9PcUcbk&y+kn&'?E7}Q&I4[N1AA).&թJIleԀ ݟ?b0K$,%,[8),5l!?IN0#9gO;8KjO'ѷ*۰>XΧƖN`$Xr .ޯdJ\_D_ [-:S'eꎷCPaGɗX]e\GC.wOS_^Z%v $?JvvBIȁ6f/\nTMkڮ,._4.D" Cj._l{0$᪬@] *:ieP@Po?mkgD MJ~-2#T%" 6q dG˩~1F>70)xshtv%މ[Ki0H%QHdYd"5&w)NoɵS<xl]mmNU|"û?QXƸxH`ۘ/{Mo)kgb7HC3l K.Qӟ@e4cZq$'a^,S |"}[ $'ZUCʷx<[3Sbxwq;F;qZw+Z1+nyC-">tm<1,"\TeǿV|a,^-"S3? )qY{>O{~KEq 'I(e{- ~H}_Q#KNܓ}I::6NͯG3'Nf"[ct>uqx+>fhbɵ[QSM,YNԓ{$ ]η 4̠#Y )w=uE\ t'*qђ%ْ$"'6*v%긍SY}vbT8 8Ou'K|ԅe^SH Sf˭W!OMM 7DzrZSNj=P}B@cjGFjWkƖ LM"I=,b+gj:6m讃_D 4q^9hG=4N-ewEa( ۫mSKmP4w/5_rRJhf_JqbY݄`r͢$o߲ߩputtM݉yBx_9S8 O=q&ZvgQ-y$}|*K&ϳ3ķ'b@yTF F看hl +q\?c %Ĥ\٭hAmo-AM ;\dhYۮ ibZ62Zbkھ[7kK4m.?"3[V>_Mh&a11e7|fs FNjQdaZ/F@#Hڬ$'oGby9;"4Zfר8MF@#8:H]dpBF@#8to IDAT7h4B u 0)!Vgk4_(6P7K#+)Ϊ9t9F@#D e3f/t4{oq]AjEoh4 wY_F@#P#kEoh4 wY_F@#P#kEoh4 wY_F@#P#)Xz7}sO V7r+uT:u F!ip}kX i.̮RhelQ"#Θ{&&zӢh@Zpx v+% 0j);樘9ѳlgDv78>{(|q=F-F'ϺC+ȁԄBd/v2D e\!7' r h d8VHc9\Ŋ ǎoN3QF@#;i!ѥ~9ʼxH?j| N#qdf}\1rTd l"?ih$CO؃nx*,7hh4C -Xa cq"ji f0^$Xvuy0;8ԥg# ّ #s$Lj,.$H\'Z4@=H TuSh ]b436E6cڶϐ̃%殝$&٨*29Tȏۅ`n7Fh4"d+U#(wѷWEXYf0rptlVJ*9I KI1*s-F PKu*RJO%\Jl,ڄˎ*wS[(7VU&_I\JSs.]v*.Σ< |Z4# ۍ^x6m:dds9\*,+D~0f$`@c<mEWFBr^-NvV)Im]y g?jI):m۶Ÿqnݺ {职 "XYE(DQ.slܾ + h,+X͑-pW~9A~>Oia \|~}D>Cڵ o> i@8,ئWC$%T6D7apx0o ckh+ `e36ll]E"T쨀CS3TR3o A tuYj1m4V ]wZN9qy)uOlV$+&y7*x~EܶnZ]N~_+qӟT~v]#D)!CzFHF@4KS2Ǝ,t_7)* B2J7;C##s/S tX|lh8B2^18hۚEFvr6Wl1b**&oV*ٗ,^M eCdN >8YH^cZn]CN %D 6UR8ĮzA#p! '֙u M0͛F~I]<: 3T=c(ed.q h(Pg\Ov~ tF~ă++A.? $W͜n@5} @ҢE #\|%1"I¿'꿘I;jP`y_yh #IF&X_l |K\E,C gs?Ӿ¨ޣƆ64S?j슠h<uSTKhzf͂DN:U- uI-O>0y| 'z(Th7/Wk~lH/O0 [6)d5svqeg"4ͨɈJ.jۇ8{IT\L.w4?3Κ6@),VJT}ȍf!*f2x XԄh2E_D[ʈM6By,M#W)_y{9t@>a$ FDO| e&&/l=#IОkOGMmx.ªY8f~gddZ#19DΑh0Ʋg;)B&6~OZQΏvE p-M}p|$VZ4&I:Mp+|D? k6qDzN%<'"Kh@z؄ڜi#a0Ф%0;E| ȴ?savmc!޲GbdXcL[6V,+EF@#POB@V Haɑdt yV >~JȞ v)EbA3/|)aXs0D4GͬeF@}Q|-n@9`dG2 sؓ@r c89&H92$ lN_& 4sL更D(# Y u Q@Z4ON= J2 ?5<IdOl'}$l/Ӝ@4,\ .#Q#wJM0Äs6㥓;o@#?i!]⮵w֏nŀؑ&9Gw La cfa酸ވ_(i˨3}{&<I #I4 Xf~ _#uaF@#0#я'_L;|Y, ,d\!hB;F_[1rl|p8OֿFF -`HiF0@ߝV B2XiS&#Zѫ-al/EWn#cкQD8hةAih4"Br$kMP1%3,fXUߙ9YNN+-;]wpN8%T PY(PVTT`ժU(((@fлwo RAU_*baOMإiԨQ}5noN>do==&pe=pW :`|pa0a}Y&ޢ.px'"9u㞂kcóqtܨ3ge+S; P Z!CpbĈj/"++9rdmx;#ƍeQ<ﯾRN^ulڴ\yz4@*K0WY9ۆYЌ,&!<kK\x]76՝aЗ T t|Rd ĺ}vN|GpwHUL1cǎظq#zyꩧTp (**Rm6b8F=.Ǐ`Z4k Ldt`0" t$6ھ_nc; ֙S01;cjg7'=FsQ30RO$T WןǴ׊] kl{0x[_zb}qzл=,<*8GCe˖nx<r)ׯu/bLeffb̙jV%d(,,T+۩S'lٲ_~%Zn3f`ٳ*cOVMQ@6'NT7Ӣvomï.NxQm|N>)9_7A< BVZ=:^O?SN„RUU DD7l٬~-;{ɻFF@HϮ@4>Ahw ͧp~N\vRnډ^]л$8jo緱`y>?gqgDG5`v+|@e^Dpm/GΝs᫯RZ⻓I4s*RܼyZ|1MbXVV:Զ\%Qi-nD{77vXpޘ`~n&7[1g/XP Sy=3Ւ | U>Ď(ڴ |oy{a@\8"! ld=<(#V2Qz+ (믘INjaÆA&q~7xהy+f?!c*o#rTkSV{lm/C8TeeN! &y rݵS;C3&h3!6ԝqmrXUP_xH-4ȑ.HNj|m;#f 10UD{eHUAAIȫh A;w:j[jfcF@! J򓓦E4>agҳ3*S"K+\}#|t2у OIt]2M`7٘h'nj? 3lE"9 Xx7P]KM|"5kZv:xǔ'1&){~/\o!5i!@ ?kF#ELgS9Bcs0$ 4pk52`3r&#B( KSd5OLIUĄ_ }ZhbK2gq_}5JX"YYYHa@)mڴQMKTE8RC`w)'~2{1-ݕ9kSW;U3qi-R'C<!LYo(o1fŪ!lg#u8LN=7ƬuHZA$裏*@%pB''`grcƌUW]L^,GH'&o_zFhA@EԴCE~aւe1U?%4W*r>doԊJ~af1W7~o}[K;vn+I~ 3Q[c}cF%I^#$W(,WS*Dj'ob ۷z}N]#bЃ5E4 JWF݁1 !Yae7H1J"؈ZH/`]6c %0fivDu? ʺ)͕t$B+XOٺOh@Z|L`m RP{ˏT4힉 0&lFGl`gy|#XZnq-b^?8!E>+%ʗ &~A5\ݯYh4 `6 fM×5z54dowk@ $ @y( =k}p2Cߟv&#H͐\DȐ<F@#P_fKu֎Tt$*g-glg0S0c6×ce D:$tmeD nhlq\F@#POB 10mIRNhs wqS IDAT]&h7y]vckr\WI /W|$įC Z?]6jvI7Hpvcij>Ht2 2 !Y?}[٨E#"z5Bϭe$unJ A- CTh(0]XVHmK3W)v(J9S aZ+hғjǴNF@#e#}uFf4֌ުh< nDFf4֌ުh< nDFf4֌ު1QDF(@ e?h4T6mwSQ#h46RFp@@pt5A@`+h4wIQ#h46RFp@ 4T.foX /-ݭV7r+uJS1F!?ף#6\ݠ{6GFud#GrXbG,ď% pgb˩7K-Z4@H ^;O? [›bl'cM.\1,.ή -4ˏ8s dsO#0`Ԣh@Zp[0)  Dp{|)]F84"A 'c~D1A1Au z,9LgA0y-iAF@#3i!ѥyʽ4g‘d"!Q8wsyְfc*sE<QQHr KIn6΃EY6def >IXiHqih4E -('䊙q/Js %uѐ1xlܢ꫊`x(%QF1ߐvܹG gyf>9xzE#hX^/^}U_ǦMC9˫ʱٳ  Ōznfz&9*1/F?SlnByyOH?P nvٳF@#pP Chs^e2wy1 /nY_m')硟p\߫X(y͍u֭[l2TTT Ub@=W\li:ue]^x΋^7Ɖ'n ˗/OK,^޽{[nKO3hń8q"wﮎ{+`G}j@ $8i$ -ʳU$ Ћf+g˯=Wy* 92!6pV(ʘ(&p&s ~g\.Y wy'qj5eٌ;v`1ck4i-ˆ#ЪU+5_L+W./7vԩ:w !NŋѶm[^T&hnǚ5k9 Ϣ B+In.]Ա&$OԩD ;;[ܧL| ?~<7@`$m$7#.`st;,,`'*/~TzpS+P|r]UIΠ;Ee[ET:!:ѦΝ 5o;vܣKGQ.e&ϙ32L_T׳gOlݺUMw}">LEJPEODQm۶s N>]MNnM7駟/E~B=֮][oU: 'OW/k!A">SϥYCT b^^nu0$J1~׋O\m.ODDh1Elݼh̺l<U$B"beȶķ~-LL_!Lǃ!C$\/"Ȋ+0rHs=8mQQ^4j_+BS]uUؤh }7jh~"_~uYrMi-re@C# _}Q:ƎWӴ64JGlIp6bCJ4Ȃbf598wX,Փ2cmV 8X lrnTg`BRW @ĶZ7lؠVŴ=3Tn'%)J#[DBE!c9FlbZwڥF!A!ȹ.rK:}R͛|o;ğt?Qk!?1 ! &(+!Ν [f3RhB 4Yz7^LFs=nD6{yv=?fC3IP:NHB"}IBDP4d~"LiԨy_`̙J[?B]tEOQ< :tiӦ)?Ç7S7mT5A ,H,yۿGzE#RKHhaα,|<,|mrȰ:hr?yMSl7 .ώW~wwF1;-0X=L`h!<:rq:8ceҧO.o"!1Ѱd-OP_~lSTJ!11 I}AoC|}H¬Mh\soR"U{p%OW/k!_~Zs8 %!= m9Ds-pU0"aD"^\6Zx'`0.a򗦳jV~ 簃YYt:m4Iv2aUr.(A !A׉iQ&뮻N}#fUԡD|+߿:,~?1qFu>!N;*uHhR~IK~-SO=/ ꈦ0@:ۯhQD$ Fa!?Dhh!դAc&j~lb)-;ވyFK;eQsYYvl*܆k߻ν Q; P3d"$cس O%/'W(%i1|If{E9Ty <v"WBLڵSuI_^ m'Q-&ON-y+ڤKjd J]b qC#ur- q #p!wpa?eU,EU;1hVU ]P+뵟bcl032,ڦ:Jլ,iFjjJlhf,&Z"Ǭ_^Qd8Vu֩hC[\YY|!Ŀ\I/B]NL_iV;L?jO.y 7{Uh!vh,X9,e]vΩ%Hc?NĠ'ґEi[US?L^~w ۣ0uBzb0aIpI4#ЮCqڻqǷbhBlEr h!I11>"sytH*Й  ތ[ݏwE_F@#pHH JK'5֍}݇(tdmnjAAs[y!FD#8H TBNuGM_F@#pD B_F@#p! 58h^|*{w,-~zmKoJK|.%'<(H وlG(rs'EE";bD㵈KNwdJ%+`oױ0 3G ,Cef њ'5no.Eu"^SFf%y .ܻHSg%k~qr &$kI"ld/c*kgA}ZZZP\\~f!0$IXp!&N8$`L`0up.C2lc2Q9KtɭM,*vSޑ/ ^?ΤlVӳs碶=sNrq饗^pyzrmmmF.Z8k_Ǟ={@)ȯM$ESe):ZAV&}Z%e|N^4>t`~S&8o#!@ωetzH0̃ʹNe%I$;кXK:9@&݁g>D>?CP&8VF]۶mý{L|uuuؼy3y7εY|#c:X!`@ee%nTWW!@Aң;"AEHTI]Db$C=ɝqd :vlAH:W=ɵsEqB$.#)Ɲwމ5kEwEa֬Ypw6T }?C\uU8PUU+O=101i$ݻwa!pbD7|3jjj\ _!G*JIXE`d~_Ս#wI#]E}q~La(DB(? Ǯ]p;eH$ϛonO>piƍXr'=71֭[. CTTT`ҥxW`FQNIK_Zw[HX{+@/VpXF kRvy|+bTz 8HS8;`pヒwy<}YWb„ Pdꮻr''NQQ wZ6{l{ذaS^ C_W_VJpfOo\58['\J&.@#{Pr34'}M7yA~9?.Ck^MaP)X3g.-7 S ۮ%o4ߍ7ވѣOsS$#9 J &I|#NO#:(Q~#f=uB=C\8LzDżHP^rOy1pq뭷p1c}X`{[nuj#.R7﫯rb'GyHOwȌSdLR5V(J JO;![(_ܳC3gs|T?*{rGTO"WTH^r.uIjޯ`/"w˯k*),7 c}OOm +A0ѪHTYJ ࢖ʹř((r[\wBR!EQhRx"Sreu$@W04/cǎTW^_+:uS0_{Ls'OvAnw;c{1 !GT F&[dɠ`P$YVK&%8ϑ_7 qY% kg@?n/T{Mz58u(nHHm7M#b!zuA((( C߈ߴiӆt7:BIZQPNR_+cd!:Ds!!$w<~E UdZ\;C UNq@:M2w)w30rdo;{2C9(YKi CHH(;:TnH4>S zmUqZ㺺q= j!|"T-WB x,q\D&iNeǏ!`i#Jw9? FR0BM'AE騹a-2۹@ViA)m_Dm]n33 C`BP%2dӽc\xARz8X&ōP?#q %!BƧZp]&cWO!0@!lL6cTՑ̪䶒j". 팯&WJkIDAT{EIv L7F 1ڛW~Q cHR<;#͠#E{*0%1cVLN43MxZ)Г BxH{WĚFUzif#а{B%Yt$pJ'%z}Χ?~=I<x79\PFEw"͔B Q2v8܎d:B՗LHB]}:G0 3C@'^vo/XIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneAccount2.png0100644 0000000 0000000 00000132104 12564151525 023556 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]xU~{=!{ XvU]w] b[{G. T齅{3{oBMH !<Ͻ3syg杯cO>wp>@l*[jvJKmmmcїĵw>4h^4Ý".=7|i˗\| r+~ 3gcj=}UK$k$d4G.'$dega͈:B+`$=6aW$ ¾=c##8`ɸEn9Ѯ/̘8^wqu=?IS8VlƉz ##EQ7M$"8011׶<[ V1 Bs--,`BH 8rlmmHHHqs!07Z؆|v^Ntޮ{q׭7cܨQH-@tL v!rHHs_V_>psumqL~{BTl /(WPG!#GEK^?>mܾKk㠺 Fx,MZJ_"c LKΑFSNtt<|mӺѭi=5b\uX"U fYOКЭ?şksAEe%كU+~ y\оw} +=i"a$Eo>':CeL,&CoDV~-EaqZL#= ;504D2G;K_ }||ݟ_]x|}:r07a x"ţ$w7t#֯_ZU=iY9Ͳfx'1hHAV%$(D%%B_@FR[P/+3?xƛ(,)դu1a1i+d/VL&fy܃HKb/&\3X 1q~u/_{gvXTcÿG =cA-g*GdYTVI-|BO3X(6tOڨQwi՝9V%{Kq\b\]:8Ic;_'~BS%>uCOpe_bM%0F?E%e+$Un*֑fξ^ B%̜|qg'00F2XH“hbRK,7Qv"̞{Rf* tQ_ (|=P`Ṩ%z$)7&ܹs92,qR bˋE[o"q}/*,5oYڑzZYwӿRa755+/?"dI\&ybՐOIM^89< 75%EN((*8N">nnnHOOGA~RH~wމrNc$&W\@z9,V/n{ه|)u3ÿ^|7՚ZvH|,3W[: Kty, /B|v؆ic!f( [˿VajA%;nQ1A ^tlެlRظY"D(1d7S)O?ga^VMb`mn=7M"P[7 |2Ib{饗PmhØYX'm.9=Kh>0.%czHHOog@ rkCSY9ÿ~XOdQqʈpP 8욓1;w ~u5^_[7m$$xhG펥N\CtiT)ӟKe[KdΙj$UTg)Y~OZʊl|եtWWREǔD~ե|l2sH{Hڵ g&O> v .ԔSDŽ^*ϒFDDyHEݰ!Mv}>1/ر .V( pնuLǙ+]R=~[˴YIѹڹ/ K^UJc&&&g/Řן(JI\Z021)\&~=DmlgmHFF`7߂9Aq86$D8쳚`*/ʣ^j\c[&88-p*L߯WWז'~űa8E'OaY8J#FjÒ[|F""1o8X+Bp:RWY>ف$X~ƏVoU$6/E$UFeDrDpWԠȯZ.RJ/a[H}g0T߱7M|^<ˀ.)*HS4ߓzuHa Ͽ^r rN%O?I[2R+QT];EyϣOjUԁYG("J$ml\C #J$iO QCO$zVfVetl"kPdž.EuɱAjO?bO8yH0?a  }4[JccVIeEd3 wCxB2#&:ЎʖNXw.+¨ ^c]'Pd W3Mw$VdI2׽&0h 4PUY2n>?_طcF{0c My3<|i&Ash'1x0%?~8%?G8(׷mvԝUt_7}OR6j[?OoS]Xگܽt8Us:mk+֬ DZy7~8-ֻo.qMY iD؅l$i'^CvnbƨycNj[;wjLcN-@_D6N0e39t$TrjҊKPA^ubۡB.I|UIΧc"Dzנ6+[^-mێǎmc|Hb~AIx3 ęCAM-J8^[4΂$;3|)夫?0O@RrJ_=T*F-897Uvh&@s9Rt9΀gN=vx |4 24wm,>.VBniͅ\"_/ҸIFr?zY9-;LV"lpLMP81ׯMx|aA -s}jXjgP &g/i>4FWB M=Uf;?9<Љ+yi '_2qwq#̉XⓟTd1*q22J4OjlC{S"?&Vj`OXbJ9 |`c6++'=|iz[Z~bٹ +P1^INϠ7>NiCzV䌘 b(s?X!Sg9oٌ49܎ʋpVDdSb@_o`mm`kmKR8W@$R}}{Y£9j߬OR賓 8RcGv<'^'/Բm3+R7wD=lkD֔yZ L"~^VT66o߁s(ll1_̚s- IA" h6`RB<+<}0p494D׊O:&տbȈQ5[D@o*\JJ6_nLiE+#.ص]ށ8g#=o_kehriݻز~-M'W/E_v$~U.k`dW1'OoD@"<խSN(}2 g9#>[J$ VmZOpvZ'9vAو~Z*5m 3)+&:$Q\X#$v*ZLƦU3F /QR?Sú5Dee3Ғq!z`Ĥdg#OFCݪ_nQ(/-!=`z*5XGN붲fK,).UaȄyD~uewK]}ޖSk|.kksšMQ@zv+9z-Ec'!njვ#Y 0o4l>-95Yx絗0֘(T$SDsdde5]m`nfw+;r N4ʐڙkp pۦA -wIK5*H1eLHrjkЈ5l*[UXK|rOhkiR~hgqI\6F3ZF vn[[ZgeiT]X*i=Q#/ \3 1fem$ZJӏ*E~ߡm_6+qT,Tǵr-l[T#Ϝ@i1\P e!=<̍ƣ| g8 7#x SÑ|MUle6g":Q tߨɦei-;$heoOgѪ\N 瑑 VَhBkji޴bѢMQM _\[AMb\oə{ hm_3SR18_v aaiɟD"\V5 \ѣW1k@6ȓVH)bn "" 15Z'V}S+`&>&l 9-?60n8u􀨀==ɮֶK^y(-)B\t:%'ekk '=]3elt8r2h]"X؊k?(}Bl?ߠHNCFZ =C&:ӶY,01}&LZ!ޖxӏnjLd4i JH"46iXnCI@lZʨ=Nh= a$,EG$ S2F|F+i"CBrH]̀]kQqiWtEUu&3'zM)8GKdnݵGR1(s$W=qӌ[uSf&rVuJ ll۸^|› 6߳T|IJs ?ҕl^V .D'3|{ FUe9]xx{7>G\\*B4ɩ8tLxrKi]R$;GW_䦣$L/x'r%(n~tCVQ{7FH(I'-=ڲ_H`b¤< ^X8I)}_RK"Rԯs0~֎z֣¦hnb7Tn":;ybj/7J> D^WHsj/b,&9L-.Ç?_PoI̩*x﷊<}cyǨIX͝sVǒ9[%O7 ~N2|FlŹt:yM*ă_Im,} ¥`TS~T׎]6|kCUELfr,^"58a=_#H+C(w6L=Oޞ9l0MΰmR ?J#ؐ 5{x )g_;zA8czޖyNU)KItgW th{(QÆݧ1{rsÁ2 "(\>I?o7s'1x{k [wӂʦŹoFmQ,5Xcdx#/>KWt/<5okE3QNbJ:Ivj1hXS!"DƦF}Ltߐ}(Tn[dmn j)jtYдvZ;EC~:HY@/8; ڞ9a8ˀ G Av^NF% 'G>/4ZR]G΢-noOfAnA_kKW_|K꧙16nR ol;H$#A!~0!sŝڝg84s灯 k/lЯgL-΋2~hI))O͝!\F^.н#}wm/N0y s޴FT IDATihR6'!x(zrVXх 0o u{9|ڰ<2 E'hǜC+RȀjCfpq4G>`8LIe/Bz!6)vvVXxM82˫$AQi$O9tol unˆ>xGUVCxu1FRЧw9ҍT OWQ'Jjѯog tn9H 0~D?}"ޝO/C͟:C|4-Ӎ⬵SOa%Q.rr8q"?YY:.׍d\%E5(ho BD|7Iʍy<<;ĈjŃM5||v_m#7_ppvm7KKຟIaFaO.²~>e̵:j_>|Xa0E?z66݇Xd&: /,<)oLnp7QvmϠWZx0Y} =DI=j 1c^bb/Ⅷí7L=8s%9㘄"{*SDkOo H'c{F agѪc0U8|0Y8vP-PXZi_F ~YS2w$JF`@Q$=$FxL֮ۀXܛ~2ANDsS-l KOmn_zLm0)ġ&抭sS3I58OR7?^g{kR(,)T735 1J9ckswqҊZO^a ZfCo͸4?-7":.!FA+Mkg火rfDxo9-羞> wS1oR?AGmGk\}`R zt.3=7>EfST;öQ/_G`lfazb垌/Ħ## | _7q0~}#^~.R kØ\p\*;zU=7Ξ\u0'% wU"Y2$=#3VZ @ʡωCII4 7̚,F*ҹ^v7|a5I5p:i {HJ!ΛE#DVg7/z}mo/:!3,8 k1lpNHMG5x̅tAh.r^9p{n!l`flGxYSȺxqV_p<{HɺE?yՁu8_OEDd47Y|R2rg]:oX|4թL'bwKA"IC4RuW=lΆ킱.cۂ?o!T;nAx89yڜ8eC1_3/.!!vѴ+OGr=Ud_쯵9fg ͝9YkmLburW)(W:9+KMJmw Go渹8ߪOkjk#MH^XY'HM QA)Dit p=W<)q6$sfG<57yiyfj"\<|`s_K+q2c M~C|gWtN(Ujq+ƥ2jdE|6qj=lye<_U;i|&sNZomX *v6Uzi~1OQG'y4. R>5&KP<Շml܌>;_6kZ_`=MbG)wOo[ O9ɘ'+sMxZSt~Wд$k:޲46>)s^cǩ?kHx5LgV~֎Tm5wNӽ^-}ElFYLv$}@ovslY셐nVtt "/sIQ4eeաoa`]dRx{|z5ꩻg#1=ۏDJc#h'k1a8#_K!O5!@o̧iZ+z8YaXusۂӖfKsc69/Zl~=O%ݺyqyеTLS!ۑV$D0yO$Nwm jׁp2{`r p]vYi0oWl.;.qy:k =Q[S ںy}l:ImI2\y:Ԫv"1MrM˫}PZ4$"=R8 'C@}s-7: PɎɣD$@*+J]d[al2\}y砱'Gǖ]裧=6r׭3W }Fʛ,O@+P,2kplwѠʭD@" ^ ,D@" >Yr`DQOZzcF >t"88=li[H$W#h1!C| ,&#`P ;P[<;IIi6[䭮?AFfZ ypvlADgIdQ*344"q Dr!~>Re4WUY)L[\\*lT 99 9"_oش[566{n&tD@"pЊNvjjBaoo{;т*A%]%hWX Neܿ?.[NiqqJlyP_pD}sfM|Eol D("ϸN25KWY=b V|&QXSDѷ/{)KLkķ-3%mbO"/Sg$9yyIJ&iS¢bO GU5"-N}ItpŹ$L0BohlBkJ]3Aem 21cXl޶_HEZNsamk>R?|R\QRZ.d>tط4%h|+{$lq1% yJE'\Qڝ"H5R"ZoKJD\UU5c@` *^?k+ ȳrrprGVnOBO8,ܨ "HIۖt 00Dt̡xi-wVO9'~A1ipX_ZPH$Wv' .kH-ddئgc)$1aKK -٩ 9XYZNMBIjFVlU' 19Α|rR4wljj*>i2£qHNG"cS#tNgI`iarI~DZaiE半ǰ!]91 @_"AΓjLq\IwcWJ8G||<1E$q`2r"ń:{!Ɖ|b_oÈ$' w/ gcXGj~H,J,`.cQu%0F901; cG¾C'ȁq@8 &oTT6{Bӧ^&6$iρʤ!Cn=FH?6VȨ@==\0h@y ~.˯P<TcS'&$1o#IzJf-u.(ܿOPJD@"pEhW/0{<+I*n95ME!ƃ#vV*y K/={?WTd#KP`՘8YZ997G$sGO/!):yH,"uY]#" $P]Lc݄I6+'ݝp*%i9.!YSgkV푲ԋ q!{u+Ysv9ՃĢ[';#,KKćox jaKU#ϗ_X"1mRNR+Kn ӖJop,ժwXM 1N5s5LSN:Ԡ5(1Sm󘵫 P'K3(<%E +uj)|Pue$gq@T\zajD@"phWUlR" ImNH:Hڌ$6C' J$]I] K$mF@`%$~e%6# ɂ@WG@`W?@7A*JQVR"TWѯW 5YP" \!2khd s k[n Ks&(/CNFYxU "KYf⪖rdD@"VƵp1FE_`,8z̼bK q&1t{HD`A_\{ 0(Ѓ0iUV'6*efD`Alq8zVxN[Q > W32D@" xZb])y$kU/.a=$5LH:+0$= (tNH$& ɶpm"6Z/Op(+f'He }K<+$g}y$@q9[izl]" # vlUV%H:;I]H`wuNlU" ('@udUB@U^6+G? IDAT+X_U?ZAmbe7)Ԡ׻z lE޻V`uxeޞe'F\f5| ڷ&;҉z:8"?\ۉOU욣ݍrn䊐XӶrz8b&qR{us {iq^CL#hsVa'Ga?s]`h6&% ?, .`XIP;XZ%c|±4;_Tl}]ᴩ< /o k-6W<0}j/Eg~UX2W3 n-m4]zKm LBYie-V&xf} * )xr5^Q:le3-0EO'*4)|:oc3q3BJA vVaJQ?`AOE01\ BR݋*37"QXy('뻥 fZ}^j.$ U)c͐[Zv)G DTgcF/EgUxmG9d D p!HBBw$s1v=AoDEacT%-hinP5<3\t!&oOvcO^+@v`}[@[z6If$" NQ 𠝺TASV".U'("45‚ O';AF"Z5`ASx 'P nxr#g !F:|X]@Z&ii81 2jW^|z!˲ĠD4e1$R\%(PDL~Lo,C[xqcE>ӣc!ȏG}ˮ q3cc1A$8oQ8L%HhE{TG|P_ý$R`r՛jE,V7nڔ $i:ˊVPaJ;`b.mESn%H{%.H`Ԕn~GGj>$BN|)^NZR"Cu!7+Fnِ*9RG+cXq.{+=| Tz+ )uu_ZUA붐$W7V-_7T+[@@ $eǗۿ/D)IMܭ؊Xʙ?H!Zc"Z$H pTFVd3ڧԼ,A+P7VNmbISa"/!ts 9m2jUw"wھw黒Tx;D1 T0|qY OYD"E%5~}@$7#=fKO*" pǍgš1?h(DS-Ӕbrx8!"uSxڎ,$_iDߜYy/L9y<9#X2(T=JgTHL0OzCbc VYdIɃI jv[/EHg4Mac/ qW6#>94U e[3X uQׯgfO%*1By5"֑O4gi:V5B=n5h){|]hʌ/5Qn_EXѽ3s^Ec .*:cTJY5Z)mkD}jdR9FPoLS!גHh erM ?)RW|wFX)ey"2ӆ.b I$ \mjR)]'7/~BMDnK1$e%EQ J}D@oxOtffI'.cPmup濻jr.}rI<hy4}Ԛ} TH$]I],>J$$UV*t$v$(t;VYD@"ΒD@"!HXe@W@@`W8K@ C`J$]I],>J$$UV*t$v$(t;VYD@"ΒD@"!HXe@W@@`W8K@ C`J$]I],>J$$UV*t.kMRZerQpe% /dnQ(Y&(/CNF*+䌠prp5P! J$"P]]¢"d")1 9*@[  bUU#+-.n2h,-ZhD@" h%e;qp IVk$e$_@h~7z$PCD"ظ#o ^u<D 6AœOГO}2D@" xWd}^XS] G{{}y$UE$TW= 6zU(3I$`^]Ћ&#zDD@"h WM}вDHl-b2D@"p 9r @kZd~DA@5s*@$WJTVmէgq}K!n&&&M黁*ڵKr` ?@&M9qH'OKR_Gb̯Ըe;uf!^xw$ީ_{G7?9v[㉭---߯駟 部-MTh>~$a˖->}zS^}())T%iSO=#Gim+񏏏{~Ð!C`w#2c am|! yO"bRӻֺs~L~e;/:CPl@@~Pei+cǎaXpa?~ķxb\x{/N>,;\7\mU< t#v SK,vvvorHCȂ>0bĈK~Æ L3ϠPyѣx5y|Mc~bƨQ=Xibccꢷw51-Zf670̜9SE=1118V9q"?qYZZo߾7n87xC9s v)Y*^t)&L___?QüO]=\EiYuUXz:G_4O5"? |$U6 vE{j tb䇵VI#mJ< VA_]w%{B|1vXqrr2֭[fRݻ1kC!..NyDjAV 9MD{<-mΝ~!==K,i2{Kcի #Vo.aiqFE/5^s $۷Ow}#LoaRYMcrS!T` JBBjN>DdK+D#+ajj'A!>ذ ~^9ϻ+ G~_6爭7E;MJy*UIJ{=1HVqA`uO?ō7ވ4 , 1!pq)Q/L,p믿4 I$|\ X69|`agL666` Ta"333A漯1ݛZ<<<40q%UVz 9?8xlc)))'}x$Un)nos"[wOx©/,Ixg!dJRa{ԻY[S5kL{%:7\,bȑ؊++͛7tV,X HW_ntv74I/A>,arhItƏ;C7 U[*12ѱjiBZ:fRc*2$&!,]YМrʊA--a/ajbwP\R{9Ҳ 4M=I2tSC$RKzdeed߮ykaGDXHHXkLMM52̚5aj^ uPjK8$PKaocذaƌSڧtu'-ax %[̙SDDDhLLڵka)K-aq9eEC Oüܤn{h!IM׎!> @ٱ6AWJdcɏpӹСsXk,hP74UqciG%\@A_Ζ5/2֧:ѣ&oJJ ܖ>>RTzGÂ'*Y^NF+ ߘ~`8wX\LXAdUI 999WWMffzX-ULdcLJ?ߺu+ 2tCeYmmVϘX j8FU-[&[̒>a{) />EL}c8:^V*m)+[k WDLr?ۈnwQXl2[|BfqS`TɏM.)}Rsm[,ݰzX"l۶Mlf}Ya#[x1{9F=on&$Ue%,c܎UGaԩwL\\;Xӧp訒!iˤǒ\V90eSի5ET51CCC*LtZBݱ/sg3s13ԔYtLW?~{!٦]tR1QUVF,&5 gߥhy`~Dy'.Z0Z6wBs]O|.Vn3[w:D }ώk)-,hpbYM0PR0w1m3gOVEٳmpJ²n:e\Lf}<DI1 ֭[7%T}Z1y+^\FL{-S}#[~.Gq=dְCqLXɕݝ%ncٔP_t>鈔A;["$l&p⇨5("8VT`*>yuE@H 0%ZZPU0cr-i"() NKFc393ǣ*ƬQE p 0JDsvտK}GPdE`UsDHClHyCroV+"9{N8\=g'̚-dɚ].__}z\PdCf("7{X3)"lܼUek 0slHqYo!E@PR (f+^&EJʫx [*˪eҰA=ə#uͧ(|~K- `.e sRPa6J;_/y0E@PBd=|CiyL!8 +i Vێk0iR,X?+ΜUοE\,&ۦE@1@Rۍ,~/PD,y ͸~w.PrIzw-uU*. @`[jV4`::E@ %܊"PLC'S(!^[PJidPE 0Ks+@B@ 0 L"``xinE@HC(CQP /ͭ(i%4t2u("J᥹E !NEPC@ 004"!ԡ(@`(V4`::E@ %܊"H$5/^ L9sD/DRAS@ pdǎ>Sr_'L|>s֝UE@!pWJy95._+˗/oM3NP/T(AD  D|-Dkר,ãuxB& ӱ ]r)*"jtDb>WXVbRfUڦ-[VYf^Q:o%jW5eWC7E@.Y7.nnxxhXUgt9cynɕ3ԫQw&}R _nLFXD3IR$WyãLQɗ'ϛ[N>#oŽj ʂe%s,Rj箽e]턌O~M(f@{3&FCnb9}[Gp)'m LÙ0^r87;?yoC΄hHՎn߃RE ^NGǹ8r!E@P@}֤(@pP .Z""SҮ*@pP .Z""SҮ*@pP .Z""SҮ*@pP .Z""SҮ*@pHԛ ʹ3'SW/:˥NkSE_cd̔Y-s摬~=`sr>ϋ9_z.,UԕB HܹWlQ*"@BS*]aݒ%k6)Xd͖=Zrh_)VR6'9sh"Ā眏--e+Ig^p4KZueb8!(I XfMNwf%w*= ;n+z5E@%U+Wu˱{yMy&GJTE@Hi)^RNF0Y秢(@JEBdDLu)D{sNͣ(@ O)pH//jE@P W17ًx"@&8̟K}GPdE9ɼE<Eɛ'4"(Ɋ@ܹ<M&E@PR:pgL)"(J"E fNDPE@ 0P4"9,?~_^¤XbRvm)UE@G2n8iӦ/_pHCBKk y䡇_~YdlM5dΝ2dc:H?yV4zDfN>'sn%KiRB˹?|\wΝ3T*[ĩdȐ!ZpI9s/]8.=8x,_SjT*._c޷.~]*hbtΞ=+F}7|#wuW`HwޑތtŊe۶m x C~9~apBtT4%lھ_>v!+ڡ!gK'I%e0Sfn +qͥ@c:!S8&OXJbtLaO][ew<(""׻t#$ [oamV>,7ncǎmf҇n͎G%FA#q/h)#fșs2s]a ~0襃%k[zLԫ^Z~V.:_M RT!ɖ5Lw/#NKke~|o߾>%۷k{1ԩ00$W\&1~B cprIiڴwh?^^|E:u!UW\qRR%uIeС& mtѢERT)/Lȑ#!~*aRdTc=w2kѾ)Q\2gfcz|]}wC+|y"?Ѡ0N -Wի(niE.OH919 4oUG%zZINZ,>y f,[x3IF微HƌՏuLџL{l! juAUduzB },wA_{טsL~s^_La-~26}aJYjשVʸ!oQf1ig0Fuʙs;G&R1/v-:}cSgӧpo9r$I4k]ɒ%x_x\tEVfe\3fhB.GK͛7W^yE-[&Ν-[Ȅ  ApHeڴig H@Ic "Ǐ7i)7e:ȟ]XDppylܶW+Ҩv9_e% Q2x؁\i[}ϳ_=ˍ ʺdܔc GUvK׎uM ce/:r=??,q#5Hy%kfb,\ W>/EDkʶ]d> ڶy n?m_Vf$j# R< hk5fCS?lVWU>Nge{?G1G@?I.mVo5 C"?"9;BA_|yo⍦l27o^ݻ. &t BR wРACͽ[5 4h?lҔ6o,˗/Fɰa"E{=;w_n*?,\P:t`4? D:mf˖M /^,[ RӲ;"aˏʌapy?xW+ٱ/?WJ'Y2g2ZG쌟D:Z~h\̃M ϧKE7جLxAckݤ|<9rzT,S仦qUl[6Tm+C=Z[oh mk7]%m}NHNW"!&+ A0\ɻhvCmr`x3K^M>@SͽFGczz'~ghBpfPdjӬtǯӐJu}׭M Nr4G4L}.L^x\`o䓱MZ|}FN@;v4 !~Ay䑠t K̙cV~7ڵԬYS:DVܹ,XА=T7u #ڵ={t4]vN7o1}УGovZ$@s)9o:ȟٳ 4mģ2ǏWTQ?.(_-\ah6^ĚBh,m)fϖT 1iV]?[̑D| Wl3Z%?1ƾh6^19?[ն&]!U| Lu4,L^+5C?ⵯθ {'Y㓅yNctL9go _8?"˻)m5o1bs3|Ey\axMTL\kV.;O(h\l ;ۓ܏nنN9nݺ;UOJm9sLߛ5k1]|MyJ.-7pA  #F0_ѢOmg]gZ^QSP^K װvkYm/ٵ1}DŽ{)Fc@+E>Yl>E0T$zl|#}v?SFS YC:X)k61^Iz4ZU^ Q瀗6:1uJW!mLy \ac\rfM?N_.?N[N&bh6N]xXD`fbo*-j<$/|0Ig[52AJD(5?ۧ gyO?b¼Z;;W^"I8D*4i|@Sa2;r7 D`;J\3%w:K oUW? 97~Ux+U9U0JyĤQ1C : yߎ+Sb eb9}d^%yPԮRt0Q]]zY`iP)3;yp"ߺOFN'-2lA# s0ɸَW|}Ra<;9sM#uw%&03W06xFo9 D MQVZe"ϝ;|0w}D #HZZ#[Ow b渑Ttnacvq}2Os;QFxbp2s 8zdP8iWP9M:NgSHy->K="hSD[B7Hru26M/}Ъ&{v!ΧYVlr"xl6c6#^g|D~s-2!Ͼڳv0\N0 ako}8Y:?ܤ(j&M8H [.Y nMQ wȞmowg򴍶c1Q! ^|h֛V\߾16*wD8fun<__&}.*\ Ŕ'i>0^q4y>D6*sJs+)Ot(&M]!G09~ t;./t)/}NJV.%"x!R+{g`~3ʋ&sM)mCb40?".p^T&=7QLog\Ǜx/^UY ~ć{^k" %vu {,]{;":~E@H7(SU}E@H7(SU}E@H7(SU}E@H7(SU}E@H7(SU< TE@HKx&|0-cQԃWMMsN"d V(%s"d V(%s"d V(%s"d V(%s"d V(%s"d V(%s"d V(tAϟÇ%"8}|}$xH 2DY2f(e˖ݻ͛l44a)\YΞ=mkcv?&~\ Ͼod%r¥x>i8uyy/qIܗF0oCB1?;V7oXL iZD`dO ̹pY6L1CyvhLԯ(U+Kt= <<\rr…$#`ѢEeժUfߥgϞJ<}M7͒={(tGHnCrd*c'o?}|rkd}ԥs;H&PV/_>۷(P4T$R̒%Ԯ],[>HcvZ;]v2{lE?c~IZ\rr7/\VjvY.]l.P:Y;&/`Wc=f4h-"?I}i#G4i]v"K"d=Ҧiu)T )HLeź]^3ϐ')}yL}ZAvWrw~Uvȑcz3K!cuaQx݁# 4E='Aĕŋ‚d!f2޹s4h@9bOڤIdذaHʕ婧2,X`LkvF!ӦM3d?~ٻw%J/-Rꫯ&dk}& -z'9ȗ3JzBv.Y2g]qly@N ;uE;y!ɟ>,YdɚM97.ZՑً7{ru㪂[뱗#wu&lR|mzț7[k +/_k5T!J*!SNIN|*ɓM}9}tݫW(mwߡCSƄFcef1r@QQA WlҭӕRl_c'_t6|8r|F_yKSqsĩs}! "d7NFz1kV.!m9p\6n/gѾ|84S^k&T ;C?OyFH ' d4uTeLZ48p 2n8B 2c sꫯ|˖-oʔ)ufG5Nϑ#`^&^oڴ`͛'-2ìϟ/ٙ2eo14]9kstC{mQ3.c~\r 9X%&0%-LRJɕW^i!s Z9/G>a Ç-њ['IL~ ,y1OOh~z"ցSą}G톖5ZKB%X<9L_"\O gϞQF7|#۷oOn{>g_޼y|K.ŋ\ NʰaÄC=o<“;SLRJɜ9p1裏[GzͰn>ٵhGD#3篏̄&+J łYe 7 L* \tiٵk@viՂd ,NHL*TcFk9c$ynEk?᭷2Im۶ &H| K&N(Ç_|Q *$iu\Bq>gyb#NKc$(\ ,b\;}#G KwuWHI=h9 6mԗf70  ?I1ctQz!g~jժҵkWC `VO=#/={J@׭[gTjժ -ڵ37M߲eI#}ӦM&;4L>]^}Ui֬Y,9|r5טvۙ3glu^uUp`PlYɟ?i76^q|ꩧdԩj>b={C:u2N\__??SLO)me߾}תUKʕ+'7|K2l_e,-WsE+BZjюwƁM[.<|(.Ew)yiO3wId!OS?EGK/KdӿG^']|*}5SΝ Sg{e?g}ـ#V$Js8 uʊ+ԩSܹs &͛7B.$BLzLnnA00767&yeOdÆ tR9ϰqF 1b!)wך}~N8!ӦM3hͱcL٭[4~ϟ/%h~|z7Mo:2I,#c>|X_<8L+Y!A|;rx믮Ν;}XF< 4#G,I& <_4UyM8wlq@*$/ɬOF[dTƆrlsHlɪ2lp7gHr[+؉3Έ-kf)rPqS&9ള|N]ܲa>ɝ3/iݲ~>c:5K&7y,ZM [ԔJĩνƠ}eț7#, J !:nP4 xRbE@@GʠI" u@}ITLY2Z3 1ZEN>hLc4IFAZ=&- uPA>2he"l#~j,jQsRPpamr=IfՍ̑UG{,V8oG"iJQKN%_%!uobN>{ޗ׌֭qZW|Cj8dpClCĊ#yh5SJ #^eVl;1AԨQC/_n'|wki>B8֜͹mw2x7 )h<`HY4^Fm1baUS~[lJYi1g/$=oh̟/Z^'rCZp\-`.]vp8Qbch/+ŕ"݄p/a-X/ 9r,S!  ݫ-z?HM Jn8w;˖ƝD]Ll-ӌ0wK&A0;W1Q-B9h|\<ɓ';sFi~fiXȗ#'5 )OH~}팉^ƌ$g&|I,G`^?1u_oR} L#\ܘFcƌ1oxNBA@wZ%G#u~Lkv5@x"㗁Ŭ'Hep1 Q}<` y;=q]ز9&aSdʔQ4.3筗iKHb ɚ+_~'a܄O[Ŕ\ڰ;St= ysGLh=51"G BW^y$H)kaÆ[]ؠ293n's>ͯJд! 8ӆAV\i@LLg1rv'İ&.2"EH&XA^arBe̩]0⿋Ic|:+8yf/(gυ׿MH8Ҿ4'{B?mqQ)28D"Le!rϺ ?Pq%)Ұ;R͇A/(`|;ۃ0 -(Ϝ &Lr~wͅʴ Ȑ&-<&#z%w/ x1nn)\'IE~a~ߍ|"d϶ub&t4Me)Q  hRȇqS/rDNrǎfJ Ore` %fRUj_6gI٥HLS"74Q`/Vq".JV.-B 2(i$&pZUǡ(i %u>u4"JYE m!ΧFP@@ 04"-(@(fU`::E@%Ҭ"PL[SG( XUPJi|hE K*@BWii 2"<`z`Z9:E =!UaS8=]:VE@`8tGPJlXE JQE@HO(cU((FCwE =!ζUP y`R(>6o'$Y9-ys$N9ɓ'eϞ=9sfɕ+d˖uL!D ݰ}Ν;)SFڵk'ZoVXnLj\C*W$yIV AHСC?K٥PB#GCڹD4~YC~[-.Un)#9Ҽa)V=zO@L hBV\)y敂 J֬Yj 2M)rECz6m?St)F$"P8?dӧO +Ú.]3gHƌ8&0&dΜ9:M5:!ϟUҥKcʒ4%H2edLKK6ɉ%@Β%!ۘéU c4XƆo3X#GHE\a4-jLEA~aO/w?fY%JBRIpSB,YS%AN K 6CJǏKXX$.&kז $4Uvʔ)~ܹݻW<(իWqmu ȒgGka tK~ߚ)5"ܷS `c_z%y׌sF(_~$HQܹS "l~/ԫW/| ǎEգGsO>R$M͚5eСf|b;v(/ 6$*ӷ{Nʖ-+[lIT]7nts…{ݹ*ƴ7%\%ς߹sd֬Yj*_9[nm[ŋM^○Pο3g~_:unku<|w7]QbEٶmy?Csh {zc ڃ>h/2 `b {=߿)a) Dӣ@,V+d8X71DˁAm3 uݺu0 L&6:|Nщ@CBoG۶me„ @ K&N(Ç_|1hǓ"?@^{f+M6J* (jW_kƌ `$-2Ty x/Dˆ)D=CnV¾NεZKY k[o5 dڵ>ڶƱNV6H~r$ /3S_!9sMOdҦM3ύEp>#aӤI@:hFv 鈍rӡTKP' Og[T}ҤIfv?L:d4O*C)z+<3pL!^'o5\?7SwZjeԍ捖arn@f&ML}l}JY%9 s>yƵ'S^V8ާ-a lxcO^5E֗G_c ۷o7&*&7a-ъco8Ae˖6[}.]Z4 @KhcӸ$%(cF1w8i/crܚ6#@dwY.**.l4ry Dbؗ+WGmm7!SX±7xJ%  -m01Y/̸ :P`P\ǝ&}ӝ/k7n|W[1>3t3cUXfϞmp^/NIyad(זlG(ǭK=5-Z=fχݏm5_lm:  T0*\Dvp|^C_}2Ў#!D|m"Xp @ >8[d m4KԼqѯ_?rQ#u 1Rs6j(C`ڈWk8Rx@,\Keۈip|`BV`.J >QL!ևFjDSXLnz}ac[_qEZA=͵ an`L~fV/ZfIDATlutl~$Q8n6ȍYc @B `5 ȍO*6LnmK1Ǒi?0Z%?AlCAZh+*tM>]ByM䅔G:SBlTÄ?ᜃO{jKs,a~//F#ٶμh2pcJaBdL(nK+|)E0BT` fhrhIbxmK>29'œ~yLFg5_N[0`ꯅPc" &38!AL ׸mڎ+_|}b/D`@ .:].!A7/W9%EEH3"aOl%8$W$ Y%<}0U_rfF[7fOξ%mqǕKʇXH 0TzAKGXҊg%re8'SOKNM&,lD8Y@ b}K$<֣sYd3}Ɋ[JRmIvɱ&:Ljq4@e7()n's1y)@!~\K%]!2Q``z%5*ܹ:KWI a_4`k"Epi8L&,Q ZODs\ҿMr}LgP( F@ 0iAE@H(3W#`贠"vS+@PL0tZPPR;J jE xf[ӂ" < TQE 5 UaS85M"%*@j@@ 05%"%*@j@@ 05%"%*@j@@ 05%"CҺV6o'$Y9-ys$N'#'Oʞ={-e))uܹL2Ү];l֓.XnLj\OJ H~gH 2O@C~[-M 0(0j%_g̑ HbEѣx = ErJɛ7,XP_@$%ŋ mڴIOҥK C5`E ~ !lχмX8ȟ"9s;\ \㈩jժtҘ$(M 0Ai!E L._b Ю'8m*1,c )Zw@ҥiAVcJ.2} }J~mƆ6,Q ZODba͒B?, vJ_ba,m6D*{p /Js)s(ejnF&?%@-c6o|k>|X(PS `cr/6UXQlْ >yǥx ;o6Z̓]Cx| G8 ժUW$;v(SLnٲey :Jxvƍ'ݺu3 z~ws1իkw„ sϑ#ɓ~1MvLgRɿ}Yv|9w̚5KVZ+Gb֭bXxk*T%7ߘi,>ԩcwc][cQ|]ںư7O5kKčL9},\,'Nz*~aC~`* n۶,L8Q6lq ӦM믿>m&eՊ,$emY71Dߛk|̺nݺiq=lu\?wi9.NѣD 9@ s`¢!B\۷o7uU=f;5oȐ!c2G,䦛ni&I$]4`k%Yٵq5k֘hW]uŃ믿6&1J ͒>f-=wԨQCZjbyغt%xH!ݣBz0?&&2~x󺎻W^z%Rpaг>+[o,?S\Y}ǘ ҠASo߾8RdIs1^C8_k׮BX !/LRNV65uCBZCF 믿JΝ}LJ1nW\=|p 2]ɑQNĸZ?'#oIiw^Yh2c π,YDgv$f;B盅'cE \ҥKz֬Y"E| }'L1|s\ m+rw6c>D %J|VHBRo=ɓ}WyHAXׯɊkLx= RZCrjzn$O<ъr _=63|^7K%v?dhIWp0P رcf㼧ŏ@0|D %FD'!JB{6 b!ltq3|iҤ9N Dv<ҨQ#Cԇd3%}z ؋9m%bw!V[%հeAb5B!b ]#P}7ukqO0f;{}_l/}c ɫ:^ktX`^[oeJdG0; >004kD6(āmdA0xתUw ibҥMHZٍ7j?&hVYam<i%1:b[W&Jh[ -[L d'<^Ab Iٶ,au\exx@ 4&:!|uGqw{<ȿNw@CB<|9h6@w! iG 7& +>H5@}Ҷa&V krQY;xOĴoێm >:P1 O!q}Y"Ԓ)S L;}~ou5[ wB@~vnmj8$:c5=$&5 4(ҪU+74!.`HM6&1dgXs8?_6Ig6?{<5 ȕ6l]];! 94 ڂ@c&hy E"\X[34 ~?i]{|AsCi'm% `#7), ˊ+Q}@upsSrcN΅>%>kJ!gqA&gY~lkb+o8Xt ҰNM|9jΝ;א O+P-e.)歡0@|Dk+?4dȼ2T"lݻ,S )H0<&s&ŜtgZL;>cT32o$-*>Q4K, \,\3m۶5nXKx\-j/_=ӚiG\v+qh=(tR?eߖ &J-zKӦMl+W˗/o2hx}}_*> 0wvAKiFd n|MF`V4^xܘh}:cg*$DP7nBZ\"?ĺ+ V5r0n3CGI*ffln͋Xb 8Ȃ"%Yi^߷usa~w"||xx<=ٰ֙]bˏ"VB pt>\&Bn_<-ŒJq1nvLHb݄~#&Cy@TYfJJ,-}'U?c_>>qǕKʇX!P PM{c8knanN 6(D⳦xHAHʃ`kT+`׸W=WaNj#oM۶#y=ȱkWf~Q`vue}=6ixԟs/3g5_ &݅7W?lތ3g.~!D)iV\ԭcRr}]?b5k&jP[[o5^h}d >| fϘs:guܻiV>d(Ǝ;@qƶm{<ʩ 7>>k?zP,}20% V,G~~>|z3gڟhUsrY |[HLwʻi-[W_v)N6 Yسw/ !RfJ ybEEDշƘѣjI~+[]"&2ccȓgZ$gtYg,CnNx[8~%ϗ=͂?Z3:>[ ەOIcQ,$>PVwǓcS\N|k"fcK PyCO-Drr2.8|T`Ŋx7+~|5bFy߾2'))jԬY6 #]~,V»o:web> ސZ\((kYB'`|<0 MHЈ#5r|y`S׿K4QV$qn†u됓[oO> 350q!-˯f/)_wb&i'#Eg5kOnb,I'`X!/foٱ{ ~rxcBDco~bQnXuYxX=}ompǝw!//o&YsV ;qX#vʩ_oy``&NEr}(z[_ 0(|4D7ӋNƧk\[77->U_Iu @@@.R)tyFUE-Ctt8W DdnV+W\6wVcxjX/ 8 X :8 2S0(zb/ᓕu~sZϻ'ӂOKK~Cwgno[yi)>^wO1@?D]XX"p5IwWܲS:}:z3N9ť%80Eey_?LoRrϡÇ߫***453fpx~c|G XK"y^p|Y=t >_1Yz?5b 3cV<# DwƠw|Se]97㣭XU={z|}C/>Qh l4H8%##?{ `fdtz)vzmT{ZGQZ:DL6C]Bp9b90ЪyXXe兆-6Nt>ޕ"]vt#mW#XO7M]VIg@9dj˦2? WwnWE"g@&SVO?~=8 a"6o\Z/2'Mj/[Jv*vxYZsa "0;=kWб+J,x8ԓub>bv$&oH0ʶWT  IUB~uֵJ&TH|9}My?{pDLߟNL0yӻG]Zy=iJ ,F3)9cOt2"LNcWI΄+aX ?FEX+rap\ *˷3fo 5HR]ms.G_tMx'/Bۛb^xe8[dfX>A Q `Ǐf߲ز0b\*;߈q-I̘H?bsYdWBu\3lY3vt_w^Hŭx_ҳslR^X)?3e;y@2%ׁ5fCc11HދmoS,EI>7 N5U|5bۅiř-Ԏ^ zyPnMN5bQ])~u}nsy퍚 e.O6$^y￱QF|}|ze7ʛV } *-̔ח݃HU[i>xwmD`]!isbrR) 5X1gPt92WeW12׵߭dg6zd 4ۥw@ B=އfJ߷GĒꕖsαCu㔉ƍ1^#4_cc8uVygR]Awmû䅕'ť客aQ/!Ku.J/.\}͵:*U+a„ W17(<'}r8*,Q*u,YOFbp`;jtTk49+'_ُ2БYb04[Ł)qi5H\P9«K-T,Er-Ę*oz4ʵm+K;5믿&S¥b_$|qyFŹN EHU{O .*lV/jjҋQ[%wof]ehN'Gyb{T0 P݋{m)9Zyν8Qf-uV&]*+1c_󢰛_AYczxGcUM7mQF+$%C<,=,(qG/BÐ_Z6n8dM{ }~wuޤ$r N1KN*m<ʪJ)|/F` LI\ⲽ2gWe(,.Z釦_dзO=#YG}mLN^7Nϴ`SƏA87إ'GnslaumV\KXqz#^Gd@_a@DH/il)7t`k.QXlAO;Jm[hLc4z{{'o߻߲rb{#V~?d1aGhW'|Fȼ!DY+.X^^>"O~s7Lɑa2`RʥKX,|<ݝr>ZM=>S|vrϕ0#Bc>2B*3AJd_WTU|Ʋr ת -]@/ސP_^\7KcɜGJXx(&9gkGrllu<  ĸXkj)%E2=rǑN4*. .8d0 KeRq *9uF @OD^6m6 ~{A #Ml>9G"am08d1{]7 6,|[[Bcp2 6`w]@ e|LA Ѝ\#A'"pT]`nθvR߻S@Cpڬ/a1  v`;HHSBXDʳSESfz >zL2M 7ST `8qk)\Faz!̸Q/_ N;D6\}a݊[}7)V `8 HK#&6ї.DZㇰXr6oڀ~I3J@F `i&O6]h7>H}M =6c$$F>rm;^0GzNDJ gێ'& 4};œ:eq[r6 Kjf>#!n5u3΂>;L;d(&:wHgiPkUg=p)ZM-ngwh[OjG>?_#_>w)<or@^c%׶zIW1ðrK|HM=g7}Z=I:1:2_8j%gOh]iE][7b UUaO,z'c(ۇ3Rv u+n#OnLن}:a<4FMӞ.=6'$ | M߬CzuN7P-?Yuؿǹ-9Y8|p *4 zDAR;iV:3ij^deoaiMd"ev@cx$ *_j"__-/ž][-ݲbn|JroSIqQ>n]M@T|S0^PT`?fT>#i(-)B|v)_v")ɏZ,~훷aQ)aF-`iI1_ϓ4GXH }OZOsfÍ/ 8Rzp쉸oP_I~Ywt~~Bu++p)mٙq#I$'D [WbΙbԈ3ؾs7}5p|NR\}Y9Xb \Qᮎm3-ǤCqR| io`-bSeeȡ]h8|69y^>?es3~`.x.n|JÏ!b#H (sQl$™SmܙF V?YsˇљX2Wk0lP k`|_1VAt_?CO/F>N|l1U9t[~ zˠI0ۂ,gXd,s_ݸ۝ 2rէpl-=<5plݗi LK7EIK{L b WUYqa[-RB|Iöv}4..ZC$esȍmut=iXSSl T[O|[bVz?_\s4^ڬKC:m3-˯gY+G^gN#[3NiBBnεJZGIVzjۥUS*>$+ؼq-zmԩwM%c',;0m)6~VjKB.{x Vm؆ΘFu g pO[ZNDv~=ewa㎃uX,ORb> IDATu*,)/kҕWr0#߮˰YHºݹ҃hE`D%%Rž*W_ï%eҶI׽1/}'up=sU]>zZF;8\FKKSZ^~=^cTT|% 5\RV_nH)-w:2_wyPWRXTm^P^gYFI}]WaխwHfe~YB,ߖ{G,)9NAmp2r`%EoFV#Y2sHi4o&Y9* A,:7 '+V^JVq:(i*QzB*\c@冨s=}FZ5E|Ɩ'6a!X5іN"͈_-@_cu^ ~’t q _x[b7J|`؋/~c[j9|l@ M2wL=-JI4PD4T{&N'O캫z`2 q =IX['+UlƩ?߯J\& ǘNCYym?Tk"?EKmjjo}mC{}쬲u,-CUM[{C& _~Q9>}* 3~+6Ç;,i)!жcmc̵ف̢,$7^GFԙ¬fVFnmIуE}z b _\5Po痙hknYW79WmI(IcmQ6|YۖӦOƤ c\qlhoKJ;XbQxO e~rE'W]v$ ~طɺW?͐QVsΜWXS`~aO_VehHپg:ʖAoB=Dw@oQ| DL ;>k8wsպ^|v.=xd?κ~oPVT'9P{}(Ga8Rnu5;@?x|zGiyip+tAn&z"f}cs,iVճ |dư 2MT A%fqi)"ùM=<Њ"BiEJSX\& >t6SQ͎GS!uљaé+.gfi|$ϛ5 TI-K`z^`.ӑ4ТȠFXқ"5f;u(L/|3J<ҧVV1sT/W>BIeBqM[qz5vqqYϗc\{ M %9P\vS/ƌPjVŸUTC.]>GSվc}6yreޟ*szD3N9xo}FMaZ}r LI'®Mp%Ģo%ѽ]AhP#uE 0N>_~á7>Z{RmJ|Yj$T>Y_AfHAdnه0Po}?̳"é]"cNWorsSk㊞: F >Lj{$K4楧5wZEᓯC`TlT{:GZg̘e*#rBH>Ԁp{ń$b98%&*i-GIXoY.d;U!o+ߘ0i[FNr'" ʬI+*<&H>簽yt?NȪM)_ن{*Q%g>3 ]i['o #ᇽh[i=ΣI;OmMM cQ`WqoB,]]e>^WW1AFe1})F H=I6\z8૭6 PTWȚpC]f:uzdtY| uXusZ}U%Syb>C@lcwPs*0gd|j PGK_JUԪ$ 0M `6 U+YVGoSE&L04".b~Bλo1NM0A#`a>A-Bc" !~M t 0;63"`-4& `wش `p!@ИA# [_++PY^ʊRucCGӤ4 E`pv`uU%򳏠10dXDE!,4>>ƨl0 O\"iiIcrbm^ \[]#I!8텺 2 mFoڌtI/o?Ő `8;mT7KMid1|6b D`=v< s25WqQ`qA Ά }PRq<" k>?#A"@*Gȩ.Q2IF `0r'!_gt  Ep&{" '8GGFz1 'I OCExX'A pB xUG#A#;{M @[0VČA m0mniA V 1͛7By睘5k-Zԩj*whvX'MɕZ4w܄Vk_Dž^;å>/[8a?6mr3HҬgg'΀WO!lf,/?4fH ˖-,:wH:qei-X:Ҋ\|9Z+f3fXZd#}x*^G]=3:QK=kl=0.\hśz&a %,0b6!$믿N* Ƀ>BI,ELK$QRDJ}ei4.zLG?#ɉ~Fa,[s(LKa~$k$+.**j,>AG!`X5<l<ܑఛ<#?iz$Z[$G;H^n5bn1HcZNTZ'SyKc»?;=fw 8șH"$ =YO JGdU%jPZяGR#73?F|ʏ]c0Ka@Xm@OG\mu 2}/guAG€|քB=.Y!Γٽu'84& }\ b `h$$Nn5[w+:6p5ګҫ5oP:p*rdVM,u2౺$&5OӉSaըn'éϑbs$VYO8a p0x& +O8AMUyloE GO fɰOxu2zE"I@k6 :[qӅH\7fEI<;H8BFP]eiFL]bº]$q-M ɜ?}s]Ht`R#ۄ:X$ɏSYzfxqVo qUZLՖsU:f0!Hܥ{m(I.-ʊ䦄Sb8ګ ӨmGt;ZU Jc[*]2ٮ1Am5~ZOn% ;eAvsu³F}iLq$APS7.P:jjjeQ{ZP(=>Y+a8:^^^V}*Ϲ7@Z4|(ݥGogCC7P)R"f \jsЇuKNN2Y_wew/;e2oEdSXtﱨY rN~#A$ PHhjrte1/2c]YE('9+a٪|; `xRCbSe,FwV룓n:#)L!8YP[E*5r>ɇO/ġ; w(KSH4gSQCUXo]p+KN9׬e("fuQY'0Rԉ\2_QTYօ=LGN~&1vajjrU$5g :p+(qeHke{Bx*]"BƷFW2ӳ+%t ziEjZ׫r45PB+OMtf~u^*&AYNmq'Ƣ[y$;"Hut`he)5w|`JXYE~$;4zw$ݑؑ"ml)sD#9|[iNrԉFK'J:,?vsl+:FW/xRu3#ݺ8f#?UeO#$ F* LzI H'a>jPF;s/k‡-2;Kǜ7$1L9}_̶ 0W>d58&]al9rs:i0_W*G UZ֫"*#-@֛V+3-}3-OuU&s zU4sh[MλB7tIHNХ/)/тa^Q]a>K zc8a듃62ՠ"iE8B N!>H1:vqy,U֧0Vܚj]Bfq5@`ե {JSz H@= g G"*#h=r.َ/Pmbei)|D՗+}MX06j75/‹]($?˃:(+Uh1 BWS^G"P~%(|iђQC+B!(avT:Nf9 1VTze2=` N$N=Zs;!1SW_B YZ<7q "j/ILn1l7f-p3 -:efev|&Gwx0@!eLNA`{P3i {ۤ !VjFKnNO 'lSA ⪁v{9E cC*OZ CTA 505A p 0x @5Y ]pw#A;!1Ο?;۴ `xj.p7 -#`e|LA Ѝ0؍oiA 2[ C暦 -#`e|LA Ѝ0؍oiA 2[ C暦 -#`e|LA Ѝ0؍oiA 2[ C暦 -#`e|LA Ѝ0؍oiA 2r6&+#PXX'xf=7thN뭏 ""'t|}~zVyyybnAiN @ӯ24t=PRR2{GsR[[^{ k֬gwYdc:u+@#` hW̎H:vªU2M6aExyy98D 1BXخm]]DRPP3#3S|ʷbN .0DIOYGE>}POb O$n@.* w4]4?ecGq۲՝1c5CTY/ƍy$'T@@&M?&e{nͶgge,vl릟W6`2| e/ dGbyr|.$DvBto/>+7k )J+*LLUJNߵ+BtC`l'?`Ȑ!ŋR+k+(tYq%`z O'=$8͛1lpp :TUU矷*.44?ioRE+K\ 8묳,R%e`x,?w:z8-Mmp7_,0gqUpB:6ޱ};?׿5MOWbYN]U[*ge`bu~Gؿo@d#Rޞ[`5փbUH\Ybm14*bW^YS2 "sqXzYz?!9✷ Q8fR,ICm9['2ku瘜5=6w؁{ۄ|cOO?6Y‘ߏ <{I;_?kIہ*OQ#awuW3_sY_vNaҽovRJ`B*~^u$D3~!]X=^SvC4hKQ&.+?#{}[%Oϝj"WZb7%R!`U+¹mũ y/jX\˫VIll,.;Po`u}}]xᇑlO3QG$\'ZM߮T,}SF? Cp eܿ`z! 7'&Dw 9FZGk䈋l7_G#}Q|ylYMvN1K|H̿^,o߾}oGzzespʕUQorҺM ?T‌ڪx_+#i J)3*i8m!xn-/lG_A3N]7qfd}rTFT;Γ $s=>1)]u5kEzu.3h-f yF_"'ygggcŊCҝ)r&?~{iVtuQ]`ϣXkfJKp[Q[n)}Zsͳ3-C)cY-_`IIǯזּISdS}9um**ęeukr\!|ˆ }Pz2HpD}ytT: 1O.wBVj8|)Ky#vXNXg}] ɏ#z:;ќi^uUO`sESGWˎ2+ΖEA:KXS%Gdn^TR-8I2ŮK}e1ߏیZ{<|wJrIUjO(mɫK7wǩ8]V o!]׸ކm=1>|_LHNNv~>?!#q;OHi-9OE[X-9ad2H7ד9tM SKϹ?b1(TR_ m9(VգX|}oX7Vg3鎪0vW"<Σ jH7>9 F4Yg3B,]O7E9>¾ɨI_ɚЩi͇Qw{uOu΂iZ#p0>r&_3Bz~ \DO$11њsd% sAVO?ZKmTЏHK,KJʄ%% 0G.o5J'~2}IƫRT F]:{igXY7 @9񴾔pʌڟT!GJōb5R#iT\a9dZBKT7T#C!7fQmṠQ ٥CŇ̕-͊q;UTh`:PV'B"cW?%Of9\JȉO xs9 [OO}kZfX{Pz[dN`XsĂzhSWO#2_Yզ0;8}* !MG$bvmUpr@ ˠ*7M z\5^6-o[0Z|HzJZ#3>8?*\[KS'֌^r7O2hw膶z:=o=Kw[uW`˗/!D1,eU*dN^Rf't0"*$x`vOR:Gt?:Op~Z[4+GhmLnz0Z('kXKeWspAԑ8^JY81#tD;i u'+)s=8X%d*C\Y|he6dؚ\= *+J@yhK54;Q^Yz>s zj&rhђXIRpǼ͙3[֊?"@-osT#ɕz8.8%#ieK.T%?cJX^N65B^>﬏f]Ce.Χqqqp`DhhHb}hk5gR:&{ ͺ̫H,ů2!eȶz!ǻe.V8OŹ:t]Z吶49g#"Ph/z*ߍgS:b[pnĤ$ :a[Sj0:FauFKD%WV(uK‡X^H֊VNV]p~`KB"HxytA!( qEGkI\ҧ&90AÎz,ˡ|i;z˗-2{LԓQ]P?kU[Vyjt=A"se*.Bl$t5B` 8.O\4ٳPt]sބ!&,ܞY@*7F<xiZJ}2;]]7٩?+WpH`;|bG9sݱe{"9#%[N9*]y,::silYǫpkd1y4B͉F`XR&9n0ѵW'#z2KhG?\|sM~kd}k!H+@b!ͭP,snCOpz6..z4rwnZk7\}3OdS9(]uan9s0L[;Lb訳ކ￷5;<7H qn'yXZۙW^iuu%ddP/Wg-2~>|Lϕ!jYOԜ3ŎX`# t 18Ѳ,_`g-S>5W< ז_W-q ʂQq꨺kZhTÑ`cWQ;9p嗃u^ܕ /?CIhl5źpRI.h*\X\t٭zlJ6_r56o]pO;iхM&~#{ aI܁+c"#",k#&[aq2N4N=ܵG _/HB 47=kevyQGxaVIgez߮Zm2»S(ɨ’zBl.Ma!'x7֟-%ؖX9=XV@Z!3>AoƅxlS摟<"y1="/e%a.z]Ii3z!;VYF=95jҴ b1&db,mHt#= ЊT3E9R#T`J`ucY%n~xyUxWȲRؚ߉dGϣUӸ"ZN1yA=+9t![O˦_ wyC>e9\\C,d^NQ^>uk]e?ƫ~纲MܤAvgd` M Mx<[,NSWՈe18;(̪U)TltVn歅 5$C;JNV%J=S+ *\?H1{9Ցݔ*.*sÿ5"L҅8splKX>ݘ:S/9Eo+МHY8NeF%Ihk4DYւ5H!Bv7> S/y㣜lQzԻ#ӥ;Y,8[^jƲd#'9/FJIg}xްe\oTW);1_*ܜT2fpw2Sn%rRqTU*sWvd+[d >t"v8Ϗ_FƤ爪K c[#[ e ɋc5"ZbjNP/ʑBb8 [r&Jr>vI!!>'s$uWSHhQ,[Έ?^dd_+j;-#Veqm/Sgo2dZ쐏4 b&,1BQƄca FHPs>kҫ!&4̙A M=ݻ 0A@!`P!a@C`BB !wM !@9 =C=  C s4z{-7 6h08 [nl0( *$ `qq4 `PTHA 0niA 00GA!~`ЈA `NxL=yKtM[ =O 6 FA%]b !pM t 4z{]6m4\"`%,& `  wٴ `p!@@A' `'eFA%]b !pM xej)o@ja%v!]95(C`?ćc`LG#8^^^!Q; 3J`֧`A%y y > ?/* 0ozGz v/I{PTYz!.arW piEjF`X%x <_0}#k.0=  x3)UiX%_tqKGscd7B@G,"JUXY/2|P\ 1 KSQ|}. ½g$an!{ }u}6yu2ŏbN_ 2" ϟ'Y㫯GjQQg_ QJ-,=@%*jnNOFR5nۭ2] CTᡯS"d,U}x-cѫwoD $4IJؼ?WBrtL4-{osRT+6_CQV_e{r0X0zY.OW0@WB`'[$?ڍ=V7g­xD"G07,"q}z);>B V1t5 @EBVxkMCmuӽ2[-_`fý *3]hXKwݫ0WɁ}/`{FJ_Y[ʚ:D{yBנ5-뙾]`׮=7v4֮ۀSOU]`heu*҃8\X2_ zyWgC7>}Z>Bbɪ#H/a#+eDFj_;r<>A^mjn@hх އj!b!_"0h@塯;7#0_œ   ӏ, _em5ޭfuXʌ*{!s惠@qú- $%D ݋Z, j 'Rܩ~cٛҋe)5>Z G`nvLx:qU؆"Y,_|$=gUGX m\ J̈́u2 vIҕvɕ~ IDATLZwUW!4uפrȱfw+v".;V= fAakzP00q^'u'gHs^]_1SLdW6a ?o0DhJ/eTgv|QyUBTյ]۫_Gnseig+&Q.eUdġR3CJhm5tKǥeߥ$FUV Կ&ϟcz5Fx_ :LF`AsM: %qdcJJ6FzJAV 9#5K傣ew~p*yaDcyzpER)xAoTiHx Um6/+~Bp JCSݙ8.@\X15m9 J7#P=5-+HyM]߫0a ~ *j=uEp|#H0iё pPpB ULbҪs_ EcED^ B2?qmv5Z4^ILHMoe?jlhc˕H4E *@ :8C PI0.3֪n2P]suxr`$THljI"@8 :5 :6uaFx!&Ѥi*,h@xC\|*ph*FeBMmΡNkKM-iQk ~ˤٿHq5q-SA.n&}?d¥˺ *!=w߷e%;ǚ7(Ib~=DYXECjݢ6t-:(fNfh$Sʀ $,YcBY"k]qXm: ɑR]S3lָD*e~F҂v?Sju'K}b/ $8Xmlu=>%B5& m A% XUŜyӯd_; )9FRjT GRW$HFgNM:Xp72s|ZϽU%+o'@F HY):툡z)% Žyg1| dՇ$7}0^\UK7SH :栾zswCQ߫n-vVvq5+5믒;e=˦e_ݷ)ꩢz4h5_UY&s.-揔F5645dn3jG7d dDmɯHM R/ ͐ɓezD񦺨!DGnr5>+IaٛN5Vv,Urx|;JeoIxCR ' F8$%'18/?y,MW@ MJ!9v,8Bw}麟'?!o\EjInZQ;ItdQ6ܐY`tcDeWAUW>'f͔qTΙ+sM$GRݏ?-M'Jl%樖w,V2iW /5-ͪK/ю:\>?yټ{vږZ]H^wk 1]yor}SD * &.Mdꕘ ʃV+Ĵ`YvJ`qļLu 'vJ>k~p aCOl iLɡfϔBwZXm%k5zצ׸VZ_|YƝx ]@ ?,dOH칦}cOTvRKkn  ǑN}ڮo^R+TzLR sꔩCup AӁqfG5ZGH0LC#@̢>>BLP/~#]o}ts~5E^%Mj)-[{IةڬS 6.Tkn{iܾS'*+u*<#gHٜyddMu4AT[5n`G ¡UQbC*Uۣ;iyq+(nS O JZ]35n?$`Tia_N$dHYK Jg U=]h+6ʅ[/IЫ:U.ʃ+FL0U1;X J~TkVª_AJɘN]`+pvVw`{[dȬ#dԌiұq4`eV(֣N}Y/]괸S!Ub k i58^; %!@ n9 fY@-?eȸ!:Ek$A%B=Tm-r]ol6,I3# ӵ8J bwlP.umHJwooj%u;D29R\_/M{! {.9A[5#PۮJEHtKr5i:u`=B*0>J/,GF<@y3e2C~F4DDvO|MߐW7* 3JBf 7M ೇj0z-cFJ)FrzۡZO:U'x]JpdZ^]J=lɍEe4P6 ^=`Zk $p#yCb Tx!@+A`H0j8)ae쑍rへFQ+mS{L~Crc&Ȭqj- >ָ>EWI$ qXVPr%hi4ҵJ&+`Ϋds3_Wgn3iPE+GR~=ZoҺFh-C*bw6ԌO=s;2@A N p\)#-/V/PzjTu9o[r mr2Y?DOWX]VSGf](u$d͖MaQb9bD,[*IAfUz؍<%!^uÝrԏm!@JB[*^*;GhU(h˶OMek ꎄ?T I@%2$,& X`O_.')stH}:gѩdS#,a_<>I SI }ʼn*e^%rDMHהCadPǝkS̊a)FڔHlFR&W+񔒻5Ij"gҸ?U+ (KJ 9 0 15\jÇ҅uc!y~[\,[t&Zu.M:BE _]աkGT }r]IJ{9MUԉ3~snkjy^D7P#Ρ5~`PIzJdQ+sёGGauKP#.JJB*jb1]W3䥃d}$)S#Y;;7H㘬@q g̘<a!Bn0_- iDF0  0%D &"D  VD`dVD$/֖4"@L#̊B["FHiY"[sX["@҈@˗/Oc̊"0&K~mY"@@ lT(D'$W(D'$W(D'$W(D'$W(D'$W(D'$W(D'$W(D'$W(D'wUD`xKRSa2~Hs= W+X`fͫvyVx`1K+?.Xtg< 7*'~}s{s}`᪪%+ÙrCpA=WsAU%A qg/xÆ;I/I' ]Dn%e@ ʦG%Ԓ/Oh_iu+R7sJ2&fc`LD\D$pJV( HE`gDY#n Orӣ2Ֆ"Y$ER6 BY@s<`/sʏMm@|`D=W>C  nyf`Q$H*:LGR-o9COKN^j)&o>[ŎKbv8>UCR^Q_a]ZRB>{:3؊I*` +[Jt8kFp?(:c-疔!%Av]6a8:1GaI_s'5$eyF =@~s lzӋ~(ڃA(`P0W iW!O=Xvd"}M~1=G~J" O\-1yr9ӥz=N&!@~iI ҁ$WܑPۜD Ey^O4.*zH-Qs߭m6ZH%W3?*={OGh^~>Š "b0H@"6`pB 0 PVo|Q2Q+B%9sLa v:8 wBp=PbЯ ua+@MsR!?% V\؀TBp~ҭ;{" gԪO_:|O{̃C`LKNrE .R:[G+Y *ЩjB LPmyq.|VF֋hPpQ?+i<&"2[Tn_k3HY^,7P8^H3-A+93u!J~V`MK\`*\c!1 ϭ-QAw3?gp`k@BxTSD_ڛ䇼0(WtgBJGpK2$Nlpd W@tm8%c{?0pK4uOo`%H3sŀpK%L|ɜאƇZexǵlYg5,ߩJf 3+. | y;%A`tË$?gXi+yy @<<8aeJ-a6GĶOvc0c`{/gpz}kwPŝ>x2\99;X3>@BjL] !C;$}@&^;w8yIʉmX$@Jnul <@(5FSdrOߕ RTuB4l jS]u Ċz{u6S =EH 8l b!n6-H>d#R 008ad 4p`.!Jk!yڀ9<04/5 p.*%I.Q RE0XE{ 8^AAS2 q@6#@̂ޱW n.h^$Ơ0%HY[?]`@!l1 ]S D` l׳D D` l׳D D` l׳D D` l׳D D` l׳D D` l׳D D` l׳D D` l׳D D`% $6D 0.]4?`; lT "@"@ "wK "@"@ "wK "@"@ "wK "@"@ "wK "@"@ "wK "@"@ "wK "@"@ "wK "@"@ "wKޠ}{ s3P^2T$HyЉlB{{qY>#R[[7@."@^`Ar{,!]w7@."@^`o6Id)$,͛eŊE;IfD  fQg vUBM(&Cs̕C|A9p1ujii7xC֬YӝO8 󥴴>/@& f';w9e˖ssyꩧ|:t~o~S=X8IU"'IȼB._p|@ E&"?w!㎓/| @zy_%\u[֭[Ku丹m69{u v ri1^`p6&磌J8חHjtB, zꩾRcfEX}oZ| 'ѣ\L0,@8׿fD`7y?y3<^ty:χ]7a\|_>}  :y(|F#@ U~F[a ؊ O\sg:܄< 6m?5ALDx 0%+2SL1xh1SNl<\Z֯_ j3< /'?>qo Qg+2"@(9|+X>sqN$E&"?qe̙ x8^ ^"0PHE0'".42?LD/b<Xg3$CL3=@2H~+SX;:*h['&Toy@"HrK%yI^<LbU= p0 n'N@o/ݜh6DѮo'-W8ꨣKļaÆnn0SN,{/RBg8g$E{5I5Qz/ROe]&7tSlx?X|L>WkܗzJ=h ?QD[YذӋ*{xE~(NE~4@Mdp N_&_0kXr3f5(qgº$ P8pCk 1.mn`*g XՁU$~h=guVU)^ ZFRA~~7 D.Pz,0_|-Z+y;ݷSo[d1T#g=TWA??I'0!~VA\O>d 2Q(oժU^tE}>o'$>‹/rGOŹo)6Gpŋ׿&4bFځ O3.אZm`oKVj8*$# /c ;@ "mH~~AoVH|ņq$g6m"D rD ' v"P r+l>;(]ADE R *"'@_n(kI@`7Ktηg{ 7@@"r`%l8S8f"$1 D  RoD`ZdfD) Ա+ HgD\BV\-֕"@ 0pGf%aȼE2kTLZ$ꢲ~_T^?)hںhBXJvʞ&NIJ) <8aJXnD, S{+">"kd򰐹!jm8!22ȭ/w"p |ؠ.\X"kU_sUh*9KDwܢۥUSN `?Uj-+5Er*$LU:aT:q%UBD_/Ϫ4΁v4hn)D s'@;sa΃--a>*?[&~D_϶5-or\uH~ywg]Aᐴt%]0o]kETuu:HC+4@sGO sz~ ~C^ڧ)λ9yz,4{S!(*7M8iX!RW IIW$7|BL K~_D]!wUk7p>~J\yZ,1U!vt{3^8_Hj[&gD2nxoxl~=$%%(]m_TiOW +cQIS{L>uT9W{;z jX2G' B<R >9$$UbkPYռT}Qxyh_;m$ ~|H~R+EǔvKx .A}zE>&y-%zF {/h/m;i-I_0n|M\S6=[}=NOhovHc[L$:w%ס_ƘJ*e^_RjWz {H<ЏJ^BR\06pOaP_è0VmxGqť;/@~F73D0+F.ԏϪz<$NN=ku%\Nmm< )``Rp }ݞ@$I3ԆFgst]Li#z>2.u%s2DQXqOQ0'Ry J׎<7"-M@PerQ˻ g8ygo#}㹰NHag_8u~ ڤ݃`qI=K>ܬf{ag~ϑ>!0xӳC7gH9tr:&[z~ďG^bSOt:ϧ*hu@ỏ4!, @plDgG׽ *B+SwG#Tˊ֘óu~>px,s\tLVG9YqaѤO5lbwFdZaLq*F3QUt6R#1_dZl_gEMzq8C~v.<S&t.:]4#_w^:)`CT-w7CT+ĭj pN.Ib qVqk1{Tʻ]99|z~y%DWv KGi=JH+Yy6.@p (FG>KtҦ?zYN6;Ix?tuuҍre^c=$hS- ^zҸ=nM۵M3,@8ރUŜ4\w>;Bu8ah[@X[5}W7Cj{Ut D"pI+e/8xWyʫF*OI¸?r H#@pfZ"@H # U"D` '@JiBR ,=D 0F̤Dd# :"0=F`Nw+O@H] FR*"@Y  @ T"@2 0S2_"@H?LVDEb]ƛZj26 Jͯ(7Y၌ lL5wCH&"0  by#e y2 D`WWT*?X>Z֖HDYAB BO/ Ƶ?w+  YURZjjAr7\("088uUAkHDfťe2w0V˫r#A c<"@@&}kkr{ ZF`D0rt /_+w9pP!%gVKm.%D T^|d6mYT^7A[-{BX3c"@,Sy8KOjc'JjU6ns QЈa-r\.imnhSB1Y%"`|[Z6J9).s'_h3uG1z߳۳bWĆ D@iA@ @{me6dv,3ߜ{Ν;_wo#666$EIgm&[{ҙbV&o)t:Sš:jk5p.HZk\;¤ټƔ?x6G#N:tV9AU#B7Vs HHǯS@}0mdthߡe4&%;_e #l'֬]__ 3 ?̬,̜: 3Oo#X6I9MJ!*J~z- >o*SL8VxU֊ΜƳO># 3f?7g),,DZio.í>Z-~~os\6i"**P^^eoo ~w;&OӦg8SOJR:o=zb`fͮ >[4D'V{♧n_A7[W(DͲ?~ vn߆LSCcɸ韷&̟9dS~mfLW-ΎnwܘߍR<|S'`gw$/b]SEc;ZrJZN_ie]pK~%%%UVԊװ,..ƂٳYTy.9?Vnv:n&Q^ e ok\?0nhd")l%Bd8nz9xycيпo&Ɖ3{<ٹ۳tM5^=ezoي4x+ ^^;nspb- o_o AZZ*NͷTY]C;+‹EqQڿ+އ [oE^apm߱:a% -Goi<#ϼn" : v./7:|"N3ܰp!^>8}Է_e-Ʋn:N՘~mD{CFFV!tϚ;Oeٷo7ED`E=R,K~¸|wvv°Q :g',rk ůλLa_H sUY*:'''\~?p.1tꫯPRTK%9#Hvǝ*W_y2cxKڋ>xڼl] ^]|6]1?eGJm\v[g >>>^u}AGwts< 6tTOǑ6r'Ԇ`⠙+-NzwJ4>.ݏ,O?7l@1r(=#;/_] |GY CgΞ5LQtu 2 {vc\J*U?c@x!)M:T'blRjNHV@T@bm,2I xCgyu:.W jN+^kg&-D,oʰvêp!<3*%񌨌pi92x՗텗ꚣ~<֋%Dc< *{r۬!h'#[]DGaKn>/e՗gCNMB7ܜ\$2Աc0~;\K¢ZﺐPJ-<|t6[u]~,}m &?r|xW0^)p&<*yKcdMݞ}UW+ tw`K?7. SC.$^T+Θ5 ʟl7`\!cbAM-@G~OAN `:Нӿi\#iʦdb='!%]cM#GB򫯑 `ݻq̘1_ѹr 9BHir;{;0`q Ɇ'$Ƽ+ޥ]qexVo788!U+Ö? [F;Cʜ?xp <엓1o|/<^za=&gf7tuu̫::cSfuoVsSEpZ戞puϾl98ξ .I~u%Ohy+/#lVȯ Eg27 ?["l|'7hxbC>}ړ%7S~4;F!+n_yx ߋC+Rc~o\RƜYh.nJ1_4`SVzh96tΒ뮺_ˆIJfD؎+Qjc PiZdG6lۇh_yђ,vp$K#͹s+Jswggg <]+ F͂jFg/p" ,gloʫI0Ѯ-6>6 oD^9:{A|R_=ȫ<)V^yI{eI<}̽l؏;x0fk/9de58O3!RNi_2x;a=8sP]}·4Xn3_:&.ǾPpE|*P]1\.Ms+QBWmPGPDl *GB2^\B'-|l㴬g&iwM\@d#j2ؙJ. +: ;EEprAv("MS4-Ӹ5CBJV5a}D3PIRZ}~}||nkS3iZ>gA1iKMOZU "|  zE_$Nx$>_w:}Gч$FPRUlH7?;ӕH8<ޡ]BA7A6.5 mߔ}Y<qU%FÊ%'iԜľ҈8`Ĵd&jt!fE%yN[V Gӱ:LwBi:ۢ,. k2w,_ V- dog1J4h*f_Gm* Pc)PJkYX #O5/{r-+8~_Í7a2Zq_g}b'K- ~tC3кvSĕMG)8Ekv 7OJOx>xL E'4PC`;_8q΃&$;PBFCOgS;྽upWk{Nj `W\b295t 7=is3нs'k6׳kgdT s׌AaG Gc[Jc2ad<<6!퍳:H 2;v AT\9Pc><$Pnn3U%a\WzVmٹ`5PI+\ ITv@&aSOg1mOFdtǐ1k$2#9MojM}ٶg:.4R `<\hkxII}Y=#xIEI TӢ*Nʩ{^S'"@[D/l>  Ǣ(' Ij/lHHA!@F]:, =B#8  Z /hup_ P?֏ @+F=JԊJ&M@r;SkZ}Rhh7i:ӛ=DAq4c+oߡCH 5 ^>k>/hw6r4}nyHA@= K^?*;zpWu=w1$J @+E = /_@z/;JjݲsOCOD}`JEaA|yLÐod./ Dӫ-FV)VE6֢Ch LLslu]7< fsJѧBwoxShw5 0XSCtb.p*m<q7uW`Ju"`LhQBlΞ> c/AA3 ŎͿ'PBv;*4nsK'.fi+l'Meֽ.-^V­$Ozj}| }ʣ<}㲸WprvU_kWg',&׺٪-2EA, ХH88.$,P_3"lT9}0>_Cmfd'Im#HGЇzn<t7ܐv}3Gw 3{CKJ4w8у(G(5لLw%Qgc#yNo՗8C}q[qgWtlk)pbi{۵MOw7pW\`:6<G'gŜ¬1= yڣ։v܍s&S'ӇE^k;4U>TlÓ}諀l<}:4Ȥ|c'6A@C^oRܮKXv vZ]ն3' =?ZB,Ks"=%Mk:`pĠ^$o;T ٲ`=F}Qt`Ț83l?Dه!csES3gÚ_Qڡ;|oLxGѯ\чx24~ߺ }6L]q?fvG٭ Z'#@`9Bw_69ĉcGM_G"b#35W |#꭯.?5x^~ةP^VӇ'wtB]U¼,ĝ"7?肀N= qmn[?͋ 6mOZ?;R"Ux@ǞTvGD{_şa翢CS`=ט:>tl84b>;lq챆4Bl1+f+w¨CEU? D5=REѷ'?zPkqq ',*GovZ<LSԌl; }95θꮯX+cma{}16gɀ8 7vFc gPfUkq *xQsSXn Xg qb՚⽏ ex 7W A.3zRr Rl=GdzBi5ZcBJS0gG#0{8y y9Yj4q3q쏎A r-~|nT)XxL\C]ז0Ρ=2:qla\3B!=ED~a -W]Jޣ 5^} bZ#=1la '%O=xy#$Яw7%b{jLn!(!͵bs4y+f}{!Xx[Mť((wCDzzo>fmL̬nN*d ,m8_]l/J)l|^;y!T` *tMɊ GWOyե8<[EZz:vTi95.=ld2= :@yˑN * X65~MP4婊*)Ab휫003Ǡ¨f&e̐PMlɶ ;3%>(CCբj'aΞ9?oE3Α IDATRIafN-3d\{H!BNx:w<Ħ8&Kc1 Hz\ C6ɅJsqС ;e: ҋ]PXǩgb+ɢ)'NF%*fƁ.(ePHJՓ>U{ϵ3a#'w+m2h1Gt7kRSZ-4%H;Vfr MZnJJ6`yna{Vyi\U/I~AɶhSM{pYG%w鄿ů ^LLw 6 K%]qY8y:͜`HW_!ѹs23Ӓd̽4<ԎS 1i46oۍ&g6`]A]?%) }DUsBjﲱ1zUpo#fL֯{šrBRn_4>^nkÌ ?i nȷ(̹'Fb_'W~<_+fT=QTF]^\_jv,^6aGdL"`RRfQ -U^9-sY88KY.Z@c)'gF,ipz &#_1eǸ!RvX2,kj9}o&Lh]'kvQՎq^l*iӝGs؊i Vgݖ4c;@xOp^\_ӭ2EZ6lll>GLd +# =M]5k|<ԯN#OwfN>92>}.]0N(*)Cl &yH#3 `cҘnO{T84Mq?7/&'1g05w5Vx9??A <Qlspq>pT*\%H k!`Yn)WhW:_XL}pyH{8E.?;{4SYf 7p>;@)b4~`gu0k l^u?~@lܺ G~"Wcv)Mh0cAs0k%ؼyHȜq1o9W9-)G. ej% j AQN8J̉qd b_VE ( _5|*oY#`X=g!.^pt67~`zfk:kOZ9Ajvf%e_89A#` wL'exA@Z  6om"%VMEA@h dp`{  ^+Sz{#_7rN9QrΉlӲ/@@@ tQL# h 6`d F@4.*m!60EA@0i\$TBm` `!@ӸH  KA4BqPA@hA. iM" l,]EBA Y(4 @@@ tQL# h 6}KcyyJT]]-iI헶 @B WC/l8_g8 a2ֱs"2 ~٢bw #3cF ńԑSA@@O]Ւj8tHJ:{{b(F;9:!NvA@0&J|fCTpjjJiiJgDt #`5֥rp6.b3ȐgkO*++kDE!;'>^hFPJvDv9pVlA@ 矖KS[;vF|B }H\HHHVpxMyl۾qI(D9Ͽ9*y9@DŪͦEA@hV#@u4/*&^pww蒒RD8}"||iڢH4I-CAb6斄tj?ɍ1e䀥=KgȳXF&(䄕ˁ MU 0(Pojok6qغcrrT3ylQAy|keA@U ^y|y]jf 爱'sfM&F0[|S((,2N* 4Vr K~׫G(Jȩq=//ZON{9~(?F(W * &D y|w}HyZ SaLB=q22ڐ)" 45VܭkL-_׷'O ''G;H̟=TyÏ6!; 46ak4<[ZZ[KОH:cPn$HL\2|чC9|v7gg$:!%- ^ntG^A!F;#w>{DIiM;;OY~Nfzi^fO#ERPX]AɧcF,-淽`iuHN =oTٸsA49zTVQ\O A *%  д6-R  [`ISAilZ<4A@hA @" شxJi ЂlA%ME@iA! ؂K*M@)-.BqahIi @>akggw8zƧxk$AXZRdxQ1z?x8[D  @ yR,#3-N hG'gKm0%HO` 2.Wjq+% &(,*-BjRBƶrE62Rbз3RĀH \8X7f $oQf k~iI8x(znQ%Xk"г{W8id+1* 07+  `?#f`iIrxODskB1yy{]]\)S pQ` La2G$|N[*iA@Xt$Y })O pQ5`9b&ݜ$ w7J37v Kll  `)B"&A jR:"" h)b^Z BM8%%%P&,VXt)bbb.XN9lllԯ[nfw,''כW Po:4i=ܮjyfϞ]->==Z|}vک_QQ޽{x֊k(n jO֭[qZi5믿F\\/_~Hȝ$** vϻ-//t:]i+++UzΝKghfX{Oݘ.#7_JKK) eeeJضmB-oFm/_ǎG 0<<yjqq޼y8q9;7E7K19xyya8X. ZYeͅ^p 7}w`)+WĔ)SХK\q`mє[nA>}0b;7;vjd8zhCÚ/ & $$Di,?0:%޽{qw`C°`tǏdz>W<~⦛nW_}|z޽lyӣcƌQk<͟9s&ϟo< ꩧT͛1w\5|c1ٳ'-Z+VG}s)\Rp9h0 |U $/\WwD 餧kr!⹫M}>^fMx CFgee:ud;L8Q'B 2DgooSٮZoHKKSq7x!ݰ#JCVCxaa ի {ձ9lmm ujxTucF7hРZi8it4WMb W_}U!wHUsQdTnjU``f?P:tnD*899o߮m"@0ݒ%KtO? h`Wm>x-l4}!""u>k't!cc{MY{`s= XW,[j֯_ϻ kfggcƍ _.dݺu,V5ߨQP\\qY\dh=xzzك#>W^2Z5# @M\pj/.>믿+&>@2rH5%J]3f0Nf>`>4{VOϞ=T5]v-HRiH3Ւ6zk.nOL\*[-l2>hk*#l/c k}4UjX[A c XSKZqQ 3gÚ/WaŒGvK<_мL1>:x܌mˋ?MtiYKemǶRARcgTruuU|!IVۧsssUO33kUɈ%3g'v32i5;~x35 룏>҂ [rZ( mnLz}U63SGN$X8ά ZM)$W^ Ƙ=_|񅺡0qfRfZ&k˖-S$k?]=,g'OlGi4V4P)E 竦i+Gi49r~gU_luZe K/U+/xǔm.~Guq1ݐMx67&TZ:K#`"9j k,x? EZ77&;vP I;!!ATo]5Rk/Yex܇IPs{`ߗ_~_:tPr!Lz<7)^Ǒ2P]ǒμkM +L|0 6䱰ѽZ4cڢh:gዘ"|a$6|ֱ k Wf]D&Gw*^Pq O>Qk&&OF'kQeׯ:UUys3}8z RR0l 8[AI``&?ȬTXfdPekN:—>IH3[*VA@0JZv:Am7XUU`,BB(-)Bqaҫ*+W% VABgÑ^T6J;?O iYВ_?/`?3HX/UKВ ЪlU)K-I+ !V5A@!@KВ ЪlU)K-I+ !V5A@!@KВ ЪlU)K-I+ !V5A@!@KВ ЪlU)K-I+ !V5A@!@KВ ЪlU)K-I+ `~~RS3P!LjU'tFh 4Hp1l߹E*-`5AqQ jPYY$.5ȱ O1L) ~?nUh>/Y`JKuꗒf*LA@4#GOvݷ_Np&*~-R]ۧ;\\,x+:]mf@m.nA*MGGwr5x~ +qd'cێ=JC,-)C;* Ç3ĺw89{kޟԝm%c/[0vP ([] H#C P;xIl\vGZz&]ڹ#w!HHLAخZRA8a$)n?"N> ~<#&%@N$QCGT^^A=!lnXUꐒEa%,Mu &"&'$+g2"c]/l U8?R  '--SddFl,G5gtp|;TJ?kx(uEIvv"] ΣpNG?^붨>_#2=x8u"x] dG.>UjO%;;e$osWUpAa1br-m˟o }.5Ae:AZg/m IDATF6vv*nAXx;IPqjaL=~8q"Аrk>yY۴%L_U[^{^{ŐA}G/|CުL,U=ɖRDMҴR[ʤIRr* iPHqٱI1R9LM)ϜEZ:i4#~4Ur$" L,x}0Bϟ;ݴcC"} C{PT;SYK';f#61%ćn'ϾSD/=_΄t$@AI Пl^ԔhSN@\AKeSPcQK /vz1Ndb?>!|4xe$nR29jRNdWAa)\ХK'Pr$նܮkϿYM"bgІ1ƩmqSVCI cDlS;L9RR'+UN$:&d7ca-ly,>^jNv㺶kCz7^~}{ Y O}(-KbrZsFMiM }ݲC1&["cMo8|Ç0UA"!`zT ,lʝNN^6;߰Mۓ`˜ >zlz!IcѭዦUr޴ɣ>8gi9z>ykLlkn_{kцI?x7뇛O<NJ Ѐ&S}@ZqN)M!5B4/e4Ŵ#oʹ8GQN4/nZ2tHd嚞vrYDbiU?䉣O`ɳۖ]'{?^fJZ^Z^}P-aRˣ,dcT:vjmlۆ^8^JK%sT3O?A@h>4Ń܌/ܲ/yЭ[rpuQ   +9a5daDkS:H) Kέ!l#kjm"~q BkjE-i|eeyLgG8:8(Ouqqq8}+ej1q}픸*+.h<h YaqA47穲~81/c1"j/is9GL8۬/r\-^ǝ 4 $MA,͂I @kD@5IB@,$ F[JA,͂I @kD@5IB@,$ F[JA,$H)=Q\Gͧ7ӏ!"NmgW86ˌ "Ғbd&~У@TZodAm# U4(|bp,~Byi ғÆ Ro 07+  `?RnYXZRlA" P1G"@^C^Wh  ,sLGN)O pQH\k8z?nNFI33 U6A@;uFsJ3YIA@;p;-AR-EL @A@ tD,E@R$ [PJG@AA.] ֭Ɂ}Uԛ#ΝҫWzj鴶]v 7܀,zY]j_]+S uxxx`СOQYYY+_} ź2kӧuV8p6QeEEE$..˗/`$hu4k.a)//P& NWa7Rso0d߿doߎg10ֱO/{|| UZi XOI:ŋCOq\(**ڛ D,}kʕ+1etW\qX1%[ЧO1dM߸qcW^Q31*..6evڪ~[-1p@z뭸U49b aaaX`wg'ѣn _}XC5ݻwc 7=.9f5&Z;1sL̟?8"~ꩧT͛ϕp5={ĢEb LGo)lj'--&AV*|}}U/ U=rBp:|\x#BQ}>^fMx CFғMשS'Cxʹ\dΜ9*?]X&Johs=W-۪.b݄ 4#{_8"YCu`.D:"eCZ[ުƈ/))ё[+ 6mLW_uU*  a3o<X SuA?Cl:Z8s'-,Y{^Б"`QǘU4^ wDg5 p߾}ΚX"AFFxH6lΝ;Fa+#);#yugm˸Ҿ}{ãl5֒XXׯJu|!ըI_ hGܹsԵźwH'Ndm;|}뭷Tl_8kyVq6m=vsַw^Ѝw}Jj*էڭ=kfggcƍ R֭[l{lFkʬg'&|n^*6~Frt7WS$.\:,b)رcx?XF_~ sƌɬ)&LZj|+"ჺ.H e](<}:,Z$6s;nnnk JGSvA<_p6=hf)KqÀ5 ML-i2A Ո8Zǎ3أhJn%iN RU4xPNǞݚַo_hoTZ:v,خj$o(DKgQ4Xbc;KU"39kdhɶ" ϢrssU&V!@&T{Ϝ9'|VYb< ܜV#ǏiDk^X܄4d EMc^WSx^q^a,{2l6hfnWJJ ȖHWck<UlЄo4Ӈɓ8kqӔh$"$?F*{uj#^C^/%a&}xfxkx8{^Xsi[*"N~"iXkS1^UFd[ Ogp>拞`֘k iX5%\=R^gg;% {z v&;;f͚ <&LqٲeJd~P.G ٓXXM4O[9b-* 5 x#6]_Յ*i$۠!]p:JTQk^`( at!hو 6i^`Si8:` <."iC3uTUiW:Zb 9߶!XwؒAGN1Tְgo,9L ^Zbh9 0\>{ٛ^skqaf0i*M/0yh~Ud!)@KvdٗՉf r,~25kׇ,v5 cam) X*{պURR{{ޓ{:U{=L4 wuW Il>YZP$hUŶmTXaob`ͅ5?ּ sNK}݇̋DvzQ:t3Fw5kjY?~믿V+Lj,\sM̩.D /P$hUdg7pw}g޶rJL2]tQk$==r #FIyTr777lڴ Æ S;v,-[naaM_Ƅ ~XJ@̙֭3qmɓ` sZ*˜iBCCѿEЬv}]-ak.΋-Ry"##S:M~۱cG7N wkn\HXXxݽ{wE>j+O<ѣGM%7t+'ݻ1{l5lƳix̟?ZgyF?S*qepu^ӊ+ e>ȩSpĉʖ#$x7WvAH0l_n꧅ EB$sW]:Ҽ>S7x3iYYYN:k>ꜝU~ۘLzY]tt.--Mx㍆Nh'44=RD :x~߾}U}ۻw7j'a,L7MoU9D"vȖj;ߎu~:z HN6MG&gOS|^}UUx a3o<>gN3uYJ6|*СCuvvv*899o߮ nɒ%~Z^xuMZRsjka謦2""S;*O$Sƶ 𝙅6lPQֶj믿lzG]W^aX%)zYk׮qr`-t60le>aUUVmSEZ&k٠rq6YF\MY !4s-Wkj{Wy'… Uy'_x> ,#GTR&1Pf̘Q-]]Lh|Sw&T5]v-HP!%V5'|RՒ*Fq]]] eHNiDأGeշ5N&.ySl&/ r뮻NUyOMD!ƒ,<37TV'mOcEk{Cʓ< G\c*7:rި`Kk64>Ii ud;ͭ n8vh~0EKi,V#GuWQeCB&.(EZֲ-]]\Q\E *JQAzCh@HޝL^^4~޼3|7 e8Xlje5ꨤ?oq`yJނJLL4ZqQ;H@@}A.X:`…^EvԖ%2c6-ZϬZmb@~/]L\SZEr֢0"ߌ U11Z,Y  d k.e*EgA(L6jټy59tL;-p3$ӧ;{yaw߭.,zM rѢko_#Ĝ\.mE%7*کSp]V"zfgV.>6mdCOZ%Cf3/{2 ȑ#USS)ǜ\Ж^9RWъҌϚ#3_V_{NؠqM6.\Mb7NWU!1>dx\ jme35uT/G1,wX9 F=Z|[F?5"թYc!]U˖1rj4_F9Nh?gSd(idmqf [z,0Y0oq?pRǠ 5NeP.wr\I &@Zݥr1+MXlQx=q-[^&@Q[l.?hrz`Ao@4)| IDATV,?dxMXҭ"Dbry?1ޙr٥:\>1^.٩ ˦jJ~hUD2I JA;Fvh8٤T' :tH-6Ҽ+C ,xW.&.í dBz s ֩վUUo:A&킥/%%%'s5kmu/"<̖~m)0Ѻ\.EF6V_A@(@[{Pm m޻&S-iépr٣ _7_ P}jR&$${6J=y%o&tmg^x` m۶: .[M;wӄZjN [g ڵ7'):*ڶiAC@!!nf]bsIt ։uH~~~F \ɓԲE32qμPZIV)}wv/Cy (? L'NsuvCr}Vec&; P'*]<|j%ҁǩ(c&W2ydC]ʤ!]Lt5`3_x\!&CҾh҄qP=-LwA @p6 GݤrZS2z8{s<UY(hqsrMXŐadև.qM{ "džGtCZ%L*,*R_i's(I6W1a!m۾G)sD5Jc+{":xOL=FuݤU"[a vCg~t+h}Q"Csrh[t82 cq۟&Nl޼C_ϏM'`rV,]֖%owÄhJK;^ya?WD.⑊HsFY}kp! RoI۝ni߫b8Yә13kQy' s e;Lk8cuzb)`a)SR|m0\8X]l!;M8 +.E9rQ}es]T6?_,tHV`]&񾷀 GxNw~X[XYfȋ8#KO,4X>W7N\[[[Ume55LVQ!hqMkAz mKA@WnLB i4- P+R 4$hH[A^W2A@hH6ѐ@" XpKe АlH!mzEF RᑗIyY7EhR 4:O_)4,Bã(_\]щ#6=krcX^ew,W9r #bNgcS\VbٵM9Y@2 m vgn:bQ L'QF}A@{M3iZZk~AqUZ"\Z{2NztU5yA@ pړ4 44Z- )$W%  tN$,ڜ#aY_D`s&GS*u-ZRBQA.H'0ÊXrQXv,rE ;_Y"@~z'  P; کPJA PFB!u\D'!`4A@`=fX1˜Ӆ@H?=1ZO?mA3oLo^'J˙$ԏ>t|Cs +ocCC} LO  :o w;?Oͺ6\)**!wFYxS%|_1u.7i(!ƽ99wP4 gf]eutY :㢶/f6VQݱ{KSjO.ZwH|{hޔp2>F~S/$h}u3߼TmJsum,ȭntz`J9/3 [*GQDU31֟;+VIgŐ)go'Iòc1z;Ms7RtUEe6S Fk6cmU ?fe絭UIU;I5&I{~2|vL ,~*9Kta1 , K$(QEYy!C}_R7 0amº{{o $Dc6ɬUDJ/7a La9U_㱲PGEuw{Ȧ]yN_5?Tet17)1`u5ײPkRH}̦p8 M4eHc$]$~]5kB{² \4fF9XD9%l_I*& 3%!h-#^`okSܵSת}O>Z{ y跹lq`\kCxf o*PV?C1IQgopcڭ?ungҽq}o;c5(!>!=E'.ۘpQ(w1!pͼ6\qnpmڴhZjLƟHoϸN} Or8>mt:> [7&Qjly0>Nx|ceoG'hG;$Hn=b5S,(]&@4sU>]v0ŅE}4uP;\t`7qX'Sf/E<1oFi2DƁYX>f8GhdSJe1AD.lSS++ЦB(V7 ^mx}2~>ɒX\q7siuerC}%?Cr^<\c9ܸnGWnqc5-&E(PPg&!~lD(]8#~X$ ˦FQ_Jb욾>Ӂc8qV:3xL"1nG;邮Ԝ[xC?3ǷzRzE8&/n~-sF,[ƽdq&@urzDiʤhw0=g&r %7_ؒ zt~ngh\r!>tQ^6Ïg(Hm57bO./p1wfexq}}-3$D lX&x<wL(&ݴl- =>=>k̆mүhX3v/]D)c>#w 'ZLKxA.`9Ep. |o jsAcCHy4{2.z3xݥ= x5^_g" $-́R]|V,=xno Cձ̅LfV6S<7rgپ̮??G0ńdS:gA}yZm nn6-; ,,'ǾrWv/GplY*ig-.5sYPL?:F[,ma X؏猴Ju%?WtbЅؽ=;ձqros(ئӹ'j3N?*ֺorh{۵R@8F yiIQ;غƃAjSBo-&eUe\c|JKӁ@w޼/_v `ͤ|+, F |B%p\nG8--9y-ZY|{_٭%62as5fF! |~K$aCgog҆:ZT: t>UIcJjbDO_T_wvXOp4䧀!7HToL P>z 88[Yκ(r-78.̕d{T87ad+yV_=xbJuҖhR`rfK]|2{ ,H[釽*- 'ݿdma>8A_mś=ppz)@xRCr'?/pkĒ(mp9=|E}K7ڨ*ӆ@W(u!o1,o V#myT^7)&=ú'|BmH)n=7͙W?6ͮz|}cdg ߦn.qu5zcb[~NaDyκ|$ q,e]!1J~&ܥH`; 5]Ld9 7}v~T`<pW?0/I.^ֺ&_5\6ڿzWQM\.:.g4Iw»yV%*DcLDzJh4L:WpaWsBh%[y$kDn?pw,0 IhB8yÞy CjA8]tak;")C~&.cK'o?(MӮq̴/y4")Bh nf>&CF nIɖxn \~Lj՗ߛR8jsC(Ǻ(QCįL?k`d.ȴ_ñk(-`E lQcvr:Os 7 q1 Fˆ[Vws|*'Fa7&q/|k<-FX=lQ74Ļ> :#FyS`=IiDV& +ח(+,^Vom>3CrAdFR t+^P;t:w饗@DDDs=G]t`C.rڵ۱c3ʭe9vX?z=ԧO>qڴiS9=8p wߥ,CkUm駟t_|AV{Wm.=,iӦ9眣\?i#G({E tWtSOSd4sLuVꀠ/ 6ڷoO#FGy֯_Wy}{.e?(s499Y[n4qDy V&B,{V>e}R7LqqqBV'nIUI[զ30&).&4?>~e c8ؚ6mjcTpk8 9vb@[/1ί]֨FgT88'L·`\솫s۷OqVQrt_ru˭8ΧtD ݏ?a7[UJX͍sLlwͫtaǔ L;lݹ2USttسgرc 7`>޹sa21}c/7?\:DmѢ3  o]s`˼;*CCpLkz)(Yn*gזNrՙf˖-<椞H4RqAd+a@o F 1?OCeX^ѿ /*N  Tԇ: SNO ,P88aPe$%ogɒ%J|B*@V"ܸq2a(V'nD1 &7S U[H V=%h?b1\/(1o?D;/R7B=``cчo]W_o14_he>LE3$޸q7W^ڍ I.n( ]LJCy \Ię &ٳ"*1cuޝ*#~ mBs"Z-akD^@g@M>j pːP@2k /6ūq 3\-zq.pU H+ gp%+ZbD,qP̙+V8#^G71cs @R3更pBUCU?`(|F1G&MZ rkGO.X}:X':k$4hQ%-Zijr4h2Ol;+Sj! Ilo&U'n>4/ VAb]VU9k(ڇ9ӱ8odluBʘ~!QKP &N8"8D<[gEٶm[C K hD?+FE;VTP!6Ru!ub𴆀Px q|c"C0ɠezֺpK|^Il/6,͂(THbɼo͌W. dKS +;ٵ fR6ߕ}밄ٶmEډ2f7&5p̝;װ늶`>}E~w}J`Uh/Ȼ/f͢|̼o0+ac>j.̾.F> jY\C&#}0%11QkIb@)Xkzդ 7L mE|b&quuk, WĒ`"ۍunx nBe˖)KJ@[pܮp5okb' qJqYBmȞB86hp[eА=ucVq24ڀl8[F*ƒ!ԩS]lGY`1du-[.`.QT: Y0Q/?xV p-E\s#G4R囍5~an5 LM[0)qcrh'-":[jM(7 .&@3]7Fp8G]AdئM[ahe+(@N|CK#U8_f9 xATP橌]4iԋddn#f г3fE^;/PAmЂ9k?ؒVmxR&@e%G~s2߬PXOi\aaA6mFڵ8~if4" QYZ  `^ae Al5mZ}7XU`lYPTע-R^N&mWS&-1oA@ 6oC!!L~n"@] آcʙV.CusQ.X'R:#0#ag_U;h 8 !@G tF h-G! % (5A@DWS:#v tpJgABv]A@pBN A@Z+B@Q);AKtAQ:j83 `!@;h 8 !@G tF h-G! % (5A@DWS:#v tpJgABv]A@pBN A@Z+B@Q);AKtAQ:j83 `!@;h 8 !@G tF h-G! % (5A@DWS:#v tpJgABv]A@pBN A@Z+B@Q);AKtAQ:j83 `!@;h 8 !@G tF h-G! % (5A@DW;! Vس{6#S2#V"IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneCaldav2.png0100644 0000000 0000000 00000216622 12564151525 023364 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]xU=B^BwQT_. bCEEw@zw޷& /ٙym;3s73xg.pGiކr@S}_-;TN[_ʴ%WKPeZ{Q w궔6zq=WO=vV^fFz C<}UnK$F 62IYZoz=r98]@rJ2l݆AA-1d@xzx#3HHϖX?=Çqf8::U x{,x ii>xz Rw4K͐Xw-X,{?ژ'<8WCq¥jy ׮yo¹s°#oYB]իefxxz`} l^ow:!ťbLƆ0;د xgxt,D=oh -[y`ZJKܪoӦJtvɷ_}C#55Qg?>-p!ZֿO<#ꆧt; lO_v^> ##U &\D桩Fr‹=abbXir(--5r%0J Oط{7޿w )%O~:7R0be_ yk5t 0yd\z gǎ˿dKc oxѧG$e"8$YMC`gVA6zñ2<~ ABdo-:陙8|R߾{\8ankg^}b2}3}{xikUms 4d(>^XԻB&>cM0a-]Ж-R0y!$R&kz4.M7_㟍닱cƠ5{t MhۻrP#=`JÈСCX*ѢuhHЩ;L$$gbdcH)Ð. {Τ 04, "A)(x/2|x< Bu{QUx oʟa`h)Ӟ'/m5m(nQQE:~?0>Ypur'T8x G׮HPoڈ!5B2e" t{2Ǎ>CIu7n"kFVkl/?Gŋ+35]#FłG 9sߤeXr,[%;u8GXJL:vo~_5 +2j }}&LxAIw_~y~(.Qħ!Ze*y\)7;3OקLE#"ףac?NOOGMU055-[]477.\ZGDE_^HFitKs d䋡e:wEך0 yyy(ۜe6oQ)_s#9v,Zǿ7bRչsg :LT9v(#}K$aC_dKG((*ܕz6tMڨx%!2 f#[EïQorik`I9>[8h?%ŷnMw4[>Fŗːlq1cO?;8|hȒ!lVeE]pB?v1Of"$.Ϗpu~nC\JyAʼn()*#/JJJŒbXdf Օ>lث  -(($vE*999 6k#uF _L:Űk=֧kKi D,)C^XL|1Tݕzۂ4p$^Q%gqduÂXp#wqs?oX K̛fp69͌QZP|w7aطgV|-4u$.LI `!b ʅ|I{4(;2<ظYkn%ߓ !67%,ʧQXhnkYXb8,ŜKZ3s) ]R,ΗWffիWe<6q"V՟dH![LL*|OLOOФ&qqq)K*Ǜ DxFDx%8iZ֍sr1ߧȁ}/_ƾ}H>n^hh|W2eAeʓ%gMҥK".'=.5WV,W'`\'xX!?e_FzaS};7j^/-+U+pJ#'#mwVYBc/޽s;ix饗0̯1P >!^*5V6LaJDX -Za56qƒa-x`S&>ڷsoS4EhR]L|އc%0zX:sIܭzϬ%Frr:WΑrRL37 n}q,0 +&c]ۻK1W5LaTaZA)"܌/YU;-ΙxR} {`4Iݞ[kyMBFJV4@q vU'h'kO&h@O+QG+ "bUyܾ|w8HDqmKĤJuwW>ߊ=ETaQO&@KdNy51.% 5Ԑ]"=t"ZVލGU~U E.vځf-ҫGr 0`cc6셏I~M펵Y4 8chxa6ѣ)Ms(t En4{;_5/BAA} H]Μ:)%XPdyׯ?Kê_%?"K3xv@3FVߥ[ǎyj9sɤ|لO9xbQt&J ԄACOoS[7M:m /w/Ֆi |r]{xB[" ?9I<۶nE!Y,#K`]hՊZˡСCY}DYɓ5pvX.c|ѠB.ȔHJ͐$42S"i4oUOwb%{<'h[ +#?nŖ:6l0O|fn x>qY(%D8]Ijǂ4;37t pK-múQ1^pUk=XXhnkrKkR2f to>S25kWDi#\=ڷiG%հٳoVVH+עo44"d%F~X SӯLJᅧ?$ L&w~ ֈG=;yŕwe> цMž0n 4ƾ0 | Pٿic* 9!4gL=/_ xjcg/T:s7U7w%4u[8lV wn\s4uc9~־Us=yȻWTl@y"H$$Qq'ޓHAK$b=7l9`D@" zy %@m(t8YG" H C9DۣDAVHAkGFԱAhdgV1K{xS^h'\Q$/DDDcdF7e{Ћ$ _ތ:}5XV'ɣqi4jNnfg!=5aU<еg_*E" ǎiްQ;̴DDMѣgO$Q8^A^Foi69ɣ!<6#w 4҇1Hi4' [N^\}:u􌤷T7A? |a6.kȕ;Uk%^mV䱣jаލBvX"p8v :RDb@֠EuݪaDI {+ucǫZY-` -akO(kGWm Ispת&zjӤ#[ ܈PkH,φ.ZsAK*L^Vpdje+>sr_TTX8Q̡ vNPٷ6vcEU+;BW}ڠjL+k[pJ FMu~ZŭZT^Q+c">H+F -z0g:446kuVoXW% YlZ7c珣YNZ C#^Jf G_fXZNlFJMK@`mnxs,Ri ά*\r}RAKy I.vN%'daeCv*7#oZ_ 8reR:V ^@E*f @B;T;kSkZ1}Ҩެ86VD 5XZX7^w?Lɦ͈U q^ˤ~0͙dwNFFjYLbx}KÖ慙U+ӤjLbq&xntjsB  8-/VNpPPe#"ѭN;*&Ny > (bpdԄa_tl+Lŧ'MGK(KbR|~~.ll[ *5qxI #7bJwh]׶~p/уE92OZr"ƋO*)e& Tms%4]7|<Uѷ,2;,Xcs 镁*k@0qWvfChօ t(-TZF:f%*ڎVddbЅ3"}1l@WP9/kw_Ե:tuw.[`߹XXSzXgj7&>=Z^~';K2+ l}{v8 &$<ƍo/89: <2 AWq|#$@j\/EHJz"b1ڶ¶'nbFm zu+6P0B#ѵ|'m[5Eؾ.HC@hDl( X+TdTYs1?_@^A1Ow Zfj:moyǦ @Uѩki`6tQu ^9;Rp\Z6r~]aMayj)a4 \YT0TgXz1<|{1nձ6<݉x;/Q5UαJ锡sb\|: "P[-FU6-magA~*2&1除aڂQi>&52UH]T 'XaX=Shm6hqvR3bea.ڦAŜ%:!/#a49I1 vǁa=yڎo `)1&o2ˆD~阳l /E&BJB=]:B} ,,㐘FH.B?@a)ӓз7{Tl{f(ʌƜDCIq?H N"BP͘BCf 8lPol?vU4]jqЪ m*JxRj;K&櫳ScM!ÐPU}+?BQE~Abг0CǼ2@u3C 2/ʀ*Ex`p+޹%-VE'q~Aj0&w¨~%tmⷽhڬ>{f("xm5/!cء;oꠎ|.%WX\+N6J|5V5.Oj Cp?|?ԇBL7ϣIpɋh9/|q$U[tH==Z1&s֓Csc }I@BR:~s+r2?nthGBZeZB5t\Btu"޲9] ,XE_0K222DprR+aiDdp SЪEM-TGnTGuUS8|ݰC0,D:bCq<(O^|IPL{O'{s}.."9ךwmE(4OqvTgC*i\w,B-Ѧ:w'ȏ0cX)7sLH@aA[8~:a!+ ѶU3GKU9R';tho\$~DG+%t]Z '*W!Mld#4ۼD11CS)sX1=[c᫃9]")Aa[:&E`X6)guD#K0. KUɦi&;Oq=R3VNbL41sC@2~<> $"rHQ|D%#&A؈75Ytn *O\Dmagks4kbޏҎ\VG =eyt62ޗGXb툀T~82(bEpatQl-ĴB|d' _{c`d^1|I7\)zz?ШD ٿ)Җ3k'gbͲ4S]{ Lf-ڈPlZ5LBX[S\y;2. -<+]; un<ALOckWuDQy#hh_|!+B==I[SGE"ho=' 9v*=ΆɵDDmC/cYY"]SJAO8P٤@]#SM):ڤkvsQQLS#U)n+6E evqZgfYBINgd#&1|v˘0 (*K4۾;ڸFP&vKںRDm3ĪЖa8bWsX+#uݮ I8sG2HNw@Vѳ?ŤzIQ FjU梣ytW>o3(#p1D#-%qQ<{TG{ /7GSʤ G'6rѫk;u뭰IJ}~ҤdTw^<@36O+yhYƥcSQRK6 uGYt6yMwGqժ2z|AQWFgBƆ(b ;WgC?ic_ʣP7=5bLS^}ӄIsڳ^th3٫=+$ ~#qŢY"o`tgg1X/; .m ?3ײO?6"4" ]sdF㔤>4j,2-qdO׊bb4۴hDΎpwshO|f)I d)(,ĒZ& cuezum[OyPٿA4ܙ^D{ jYʀްbdLUAOgO[ bS2)ėd5iz|Xޒ{+C9ᅉ?nxoF?L"QGڧ`?Q=GStm-MbK\Ǔ]1u9Ϙ|U˫ָ`sqyOTK n-5݈\hJ/'9u6,@6 ^ZM`M( ' :H7kOǔ"IY)ҹ9wȾ7ź 0c(^Dɖ^;{\Pgρ٧\zK)!kG|ܹ@y GX"p4/AօKoa2t)=pe<`@"z7a Mu1pxIWhjD (M 4Mv)}k}DV#`lm&8z9Ie4e:֦=.VHK_3?YulZZ>(cOrs| &BvI̫u0P9@ Lܭy~ sAƍ1/ID"o5r񕻖H$ c۶;#D@"p P |tQD"  V* ,E" ܛ:Pry%<O]B05U})d1FesNfQK$#PD@"HԿc*G$舀$@$C@S9"D@G$,&I$:" PGd1D@TH" }+;)iiFjR } 05ܤŅH':uhG deqD@"Pw?J}\VۢOn*-7$ۍ+`}zvGvq\r7 5H͚NdaD@"P4km#=)\s:JgLKxGR$݆+f.JKԹk:`aAxOD@" [`b g": Ouqh.m2D >AœHh[dD@"pG&ɺNuiOH$wf":`1lmuiOH$wk+JӉy4FD@"p#p3\3탖H$7$ELHZ Agdd ((QQQpssC6m@J)Dn@N |,X8-h3ĤCbrE" cx{Tt-N#-3Zx_f07T.+'O_évw@Ѽ{2^h3 vV wxh3ϯ܇2u͒VZU.v%K`Μ9(**m5i(,,đ#GQF]%1^-'1gddѓ\%k -a\ں<ڏ{ -p* o>f(PZZW>\[Ov els5 ]eL˗aBMU糊P'>>LcȐ!삃|P"#rM" d|>LRz1)X~<<~_4(?Ia!u?Bn~!~^Λ?=+47?ۀ|Qn+8W&ϧaǓ?XwRKVn &ollޘ1c`gg'֭高trryV?+W' гgO{7oW_}Xp+8탙֯_\7m&Y5k&q㭷ѣGM/TСy9RGyDhsE@@V^ٳgcر2Ƨѱiy$dGG?<;/_,Rк'fM&߮9qXC06%ƼbgCh-Krѽ]cLff?y! pvF7*3i\r=q> ??/ƚ-pTi ,|Jn_GŤp]jzZ7]жt{ՎL4##;5WޅzN#Ef#`+42BM0>0#FQ9{9{j8ٸ[ əJQrM}:M3/2m݈4/\}a100C;WI+ }#61]'Ӫ\m$Of.mKV*[!&:OOOA.rss1x`k͛7ǿ[iOf¢ED1p ٳv킋 "##}vx{{k׮ Mk6Y;^z~Iݻ ?τ*y?ĺl2L,4TS\ Klx)ƀo)0,7jK~n9># /\ Ž;"%C(Q4z=?#Ν;EI&k&7nDi+VO<kz"U?Gڵl}^YE+p-2 >LfnL'qVXBXv:gtDȗI6DOw:د臝h킕Nu/XSн:5̀ enڿB Œ':PC:wVi\`[ѕ4˚d#b.B>%ę?Z1ok)$ `ktgcڷ?.ǿ|'I;v&KWM;iUa91EIƪ)|#3P9Ar`gcw&7minX ϡCKYݱc&L 7ִX*ѭ[7űؽ{wQתb޼yD}GE-[%k/8Iš$K߾}3gΈuNcsX,Æ ѨQtm[M~< >ޥzP ɞW 9&>Ŧ.  _, B#p藼9^!d\h9ي!a1f:,)Á0' kdy @ҚB" Os2=G~\ɟ&8igɯXh~zj\ U_$MSSvmt'YtoNSqI47kJBq$8LϴPťHJ-h&8`W d H;Ŭx"" _UG>ͱ)quS#܉ aթ ibg_ˤz r)/LmCK<~_7A6Qq*_Uǻޘ[h ?ZNFDDť91,Ӭ^wf捄M>]*HK)[ޯTV ,dB J}憄7դj:&ؓV7,\ICJ-gf|ˊuq18VJ1~%SktmN[NUrobԩB#d?`hh ݥKUV}f4k׮hѢh`ga)\}y/@EOU-s/ xdb͏ H>(>x|!Gq؉?uXTX>ƳÅ_O,&e-`?LhK}f5SK%͙SLAl֪:YK⛇"` h֙ٝQUS3anfBYo1 R5sYg9q!OqEc R}r$vwwdž DTwyyof &( ۶m+98p Ξ=VJn#!faU0 f%8R|GvvϞ|1i>Zn<&(`w5w.H6YtTy̥GM`f<bX?rȦf|͸YoJO)i(c]&4a$Дkq(!3M;!}( ́+aݳ U4H2OqƖo6,|ÉNHKumKݰ~ 7|S$4k Əű66zhGH,Onٲߋ. qaaaODx '_y0ryc f?/b \ #Dbist#2F,=_?D )1jJj k.G_{r\wZr]œ/Sxjҕջ ƅ\Na*r$o ͏p9/F(w _eźC_)u*9 e[) Iq I Ka%MbSU(JRmYuY[ @tmK߮r>ggg0ӧO(\uW^sn*8|r 4Hl6(RoС3g cc}z覻̏EDD <<i(i$ANL-\[-b5?f1KJxkFU k~qH iߟfYGGy2pm|iZLY9D."1oLSx&z*_k煹,kD|caׁ6JhTiErIZ7:[ƳE<&a:%[9 ݃kz2aP9nIЏy IDATwOeOut%[fiL2(ت]MO.Y̑X"E"Pgp}>z?H[> F_HI%X02Y" $1#Hj@@` dD@XP" I5#%G@c9BD$LHI%X02Y" $1#Hj@@!H$}B@g (9D &MsLeO%[$[ lN" ?H?JT" Hŀ$$sdO%[$[ lN" ?H?JT" Hŀ$$sdO%[$[ lN" ?H?JT" Hŀ$$sdO%[@ѣa``ooj]`j;a?8rHݟ={VsUʓ@GN>RVV_~"H8ΧNO?"W%}F@%yyyϰvZƢM6ݻ7}QnZx[8z(ѡC<39r#_WÙK051BMh|`hh 곶yj?Bb^p{؉2Oۚ3}l9ϻq>(p:bTuarG+p?`ff&MСCؿ?kRSSP"mXl{9w^$''i~#ax _:SN/"xW_`B ǖ-[`oo iii+Wpi7.#00M6y APh\ Hcyõ+(ĄQ]l)v FC/'1bPX e>yvi&|&+4&nDNO}xz/hU `gmcL߮ޏ]P "OcXd(-z5!ҫ6:8;XÉN]_mAc"~:_D1 d믿 AƍI0Ǝ;Dk&?&쒒dTZZ*4<5IiX|9:wuD_ $$Z,[N@hh'kLiӦ r{'D BYJ,Wx8E+X4a 4*_WKOD?" Wwk3Sc:cBr&LmNJlb0f`;56a =q.0 Lv8F[<jAu..Vy?/x1sY |pxG|}B3dmM>ѫԃ=YG =3W)&#h|5ϐ<{0qSZzE+1by3#q[Z / HǏ#11O?۵kXW9su4eذaXf OFifոM8xW@DD?G7mjY̢hzJE###|hѢE͛;L,7;NQ?Zz VkiLD6XZ\hyEE* oQ2*l.9jqz Qq¤fB' kaDxHYy+HsE)ڵ]c<)./6ux,6o? kƚҷkSb\:Hd+:1Ybfzjq9ssscaL6O=>)A m ֧\j&^zif Moƍ裏˙+411RY055y>FET%VbIfǩY%p$d#H3]Gk/ą0Ԅ@Kts3U)!3W sS|X܍%?ԣ< Vf30VUL.6bNm殦sIIdf>X}E!fdW,qbյFNE۔899Ta>)XϞ={{np WfΜ)L\v„ Z^MA |MKOOOۘ5k :rǎA Nc)SDYf֙|lllnz7ey7+4Xca+P5^I ձp`dL@:ڮUEjmPP.} D 0nqO7jK,ߊWmSnzҥ/Vuw8^۶m1h ~ T۷MVTٳsϾ[%<e˖´lbK.ŝ;wgSqǩfE #~ HK_s3 B݄mQ[EXbM)>;7aֲj;vhC' -0/LaK}x͸yVZɱw|fcQ_uU:!@ڵk'"kc 4d,O09rI& ? Y¦0k,`d'H*SW\GF%fWmmE㬩/7Jg38'G1`TXm4$BDZQOe{ "&߬/|)Ҧ(06KWSt8By* _o'ڏEӢJ]*#`prQ*UH'8KlX ⯍VĄž@4q$ի#VTnbggpͶo:k/_a yqVSf~_bltFDY NF6i^b2t2EŸD t]e6k k׮Ellw޽E[[ӧo-!!!xEo?X;1cF{pssCǎ>GAff&Ν+5ٳgcرHNNð?TcK!8y!YhA=[̴iWGgktkklxjN&v XVy`8Xdņf>^^^V7.+WbҤI_D&lnee%Ȏ ٳٳ'ElN3Ɍe„ ?`ff&M ((H8wx,?/SNg͚ ޽H65j$bll,V^>޽[6oc"ݷo' B2d@$899 w@˖-7\_NW5&e? <pvVp%,o|I4r{`~4^mJɍ:A٨%]*vX TrKטn*Ə/ȏwdu>[ddd 44TLNN+򘤸VZ BeRemf˖-`Bdɏ_ŋƍvG9rX8qB,4;V)iӦh޼9-[&G\t)RSS RT.a._;wZ.@96/۫ Ãp%T~42J*vUTA ߆ OWMURe5DǚkʜDN Fh( k[ciΝHOOTva׮]*4ln޼YL&4ho +RLPP~I=Yeq/\ 8Xs=СfBzQ׫[y{Y'{+th@wj5ܳ٦v4^B)(6hrssώ58Wǀ \8A7&Fzw t٦|VB+U̓w: pyݳ>+~eMɆ'M6u}L`(~C-#cZ&&&B*$&3LCUVr8i3l`˗_~zJIRO`ey:v;1 8q>Y#7LVN>ՈD8[W'?N2mꆧ&fr#4:! kq<ɹ&Ƶk\Aooop}SNXk?{W`Gk77B\BE 8{9p 8 ꮞyﭑl7]]5m3#]Yl p @5qvqeB~@@~Eh96F~]tLpl.]/^Ix+i;P\@@ZO],C=```-`& *,5mP X XX 8RA``-`& *,5mP X XX 8RA``-`& *,5mP X XX 8RA``-`& *,59 !X X X2Y gxGV&.7Z@@v >!7X X[ 8J\A``0}Bn@@%@prj-`v``Jl+qՂ[ 8 V   d@od'r6l y"xTn `ߠ]@@ 8!+X Xr[ L;oZhA;hQt4_}azݺukСp 4tPYs8駟ҡJ;v}tq6w_0`t)>#$::sW_^p1 ܹ >ܱ7ߔQFqGnFPI@Zb]qvQݺuE֣:ƌh"r'oqnQ=hРA)9TZD9o)Hkլuj럥ի׸4D” AvGӊ%O/_K]='aМ9g!sM }~\딌@Tr@#2ǔXAwJ/-}) 7uΊG}4]xᅒ'ӻ袋[o4N6FAԸqcę-_ZlI?~7W駟烍 8n:#Ǻ; -!/)򱶺n:'ϯ*6e h>[şH'̤gz?舿sPkv}xս[Ң%˩yሑt?_ҝ'}Dzh¥t9IϿC"l o;Zl%=W5ӽ{_ ]W 8vݱlڀ^`m g-n"k_FM={wvۚ>jyStP:I9cԱmSG+D6. 0)7oNUTI&FCEvL,X@K` IDAT9ծ][{>&O,?lT9.]J\p@Al`Z|T.Ё#kp̙t}G͚5b}C]ٳŨ7]ZHN;w8>ȹxb:S/ qꩧJN5#۶:ӻ(pďi7;GVґmTZY68cBiڷVY/ggv Nދ,Z* [zڷjL9责w/8dQ"jVaE>e RX@=!~$:pmܰ~{8;9E[tlN~_GOGo>1n6 T\d8(SdL@jԨ!S_tr828ڴ1O|8]wUF}4}tswSOTcH~1b-FgJ Fk%Fؑ%`tX5Y!?נSѿvOtao2m4S핖~nEo} qٮ#[ ~{Hν~$Og {6t!;4mԇ_2`NSO-<NiMjKItx4n~Mͫn!Fc wXGӀlWTjU ʺX'y;߿@CVGZzuِQjժIg\CIW؎Ix^}eVQCv6`y;ܢ*2=<ڛA_?ymP5ҿ+zTlagvq34ԭ]Z7o@\&`?n6Z 5K/T`mLczk~…vyg<8Kl> `t6E^ uŹ3E_~ۻSWLkP~}j۶a}Ragbp~6ȫNk^]dm./lI([zUڽgz}o/! ky3cV}ԫ~^~eWK 7y$:iBb7bkcD%pC@:@8=tfnf͖[nI=qEe*u6y q 8RK.Dh0 C vZ1uHP$?#4dQ+Ԡ+*6fԱމ8Dn;84xŲi`u9ѳi |KYW_ԅܰS|ۈ諑/5~&uZIe쾵Q|zYèS $"{ |4?$s! *I_LM#p,8kTay7 hq=[nEFXPgѩS'q:}d}( GftcEAxtmѲeġb3Gx4s1قYLyشiS>vKɮSu]2+"uԌOU⇣3ﵭ& <`md$+GԪQ.`UwҞKn1A( 6ihbD7Ybd (uWQZ7ߔn \c*ZbO96r9:uotGJZy^f͚%;Ip\o;Vˆi*F`X;]KqrbfB>8doI0X?A8|-g+oYvUrj(v\q0.iJ|dȎcujP/|WZ-rђv=l0jTi*l1Ù>\pPGG囇F:q>Ob<)l~vcuG6^IKmNO(a[`r)+y#Iv`oae@p(6o;J%7X4˰@=~<: ^3!o1FWE#P Inc!䑦KWBT9 TORJ7o!Wot)-Cr"tq[r&|"'[ k"M}%Bϣ}h\K?G%]G>|&: 9sX%8RR(J_g$䕑)KAcs4.Imߘ>M tѶx*}Z&+*L\Bmrq#J:m$ J֠qHH4Sރc|Q#CG/&D_4 A㢪E̯ ) -ʤ<+m)L ˃VMʤ<+m)L ˃VMʤ04uWV-Ae_قh؛3WeX8UetH94eLqxD?hk/q5Gh-7c8wKӭG3/FSϦBa ?gyjPo\@{oZ;Oq_h{vvLN/ >O;[a?h_/Yk~˖-kXwIؠ:"Y&-[j֬ţj@5k*U܃+>-J.xm#!1ĭ;lQ3uT7A4De*?|h$0A{VCu.n0C=h[BxB hHrM iU˴Q@()o:W䯢oY0 ZCׇߟL!&)c]ͤ[s@'drDG+҃}P lFn| Y jP.#r 44DlY-S oFLPAPpA˫?ɫp:BDA[yJɓiX4Ka({%L_F` ^ *EĊo:Ohy'94-XH+X$^O+Z`5ENs-O06?oYTPhLSg^&"].!H12CBO\.2:D4, Ͽ(t!ܘV. Y `b{=z4]|飏>+W"م?]MveZF ~OH?~4nxdԧ:{Ic_,{#@( L MD|@_h4~CT o@}*˖.es^p277z?=nҵ|??œF|%=S^yeŷ rh"4 uFӞx=ܳxbaPZ A}u W^=jU|\! %#L+"WC6y2gBBΤ =yڡFɗu4{;:Ə?3rz#|a êժ˦BOY/xM)S駟{^|9?d\0C^j;u ~QW>LGR9dcW_~~{t1P͝ht-73gDHykRG+Svڮ׫W/ҥhd:Ǐs(QЌ4P?dR/2lnǏۣɉP=N;Seix/7pa'",@V o&~ Eq( f7c m,g}ߤ*vȯ8X{o=^kZsq lx- 3TCPhΪB|N\yx38}:Q^ rI¥KI:֍/SOвTE4)Q1GaA0$hBа5Jj8HddIPho!,2 Rw|s^0G1zLnߎ1Ð]aHo&!:zNΆ;9^xAp|| 7cH'eoE7tKH˯'r@иBSrি*]@?~ZK#UB tYڥ>v4QLbieu.J,sitIԺfrpq$AȮqv35N`i,J# 7]?ٓv>. +W?%oN$K#K䑩,Yx"_̏&̙3~m]΃n]TI[E)YB7Xhd4 ؑ0 V#&itJ;L/[UcNGF k(CaLKtUb;(^:v.EHe< LC6X wCO<6tN39RI|T27 0`t)| |%џ-o)ÞǥxG%s\t|1M7ݔ9܌9̷Oћ/6˭GQA,uU]z}<JzAmPz#~]wݝ|<6իjfo&NDyA1 FYC=(k u_͑˛SE+97=2+g ࣺ?{8o$UZ;TDF'OٳgKҽv(AW_(:%wVΛl"5/ x5e,E!}}/(9?ҵo&5JGh,;l_)g[m]{n&OY7͹~%'& ‹/S推WM/"5YAJ NGN6l) IDAT˻CM}ه]`7q@QD$foߗK2*, r? 37ڛjyr2~M?A/½|tgR>/h9%Q/#51^0:`],7?xYܽއ#^{ G/dQujqEY 8 d@jEvabd 40Vdi}p5)6a !ů[gIJ>' Ff(g:dV 1= x tz$ϭ/WFYVhͤAl9o hQQj J0Ӽ ǐǟ_QD Ǘ Aul$?k?#_?vЉ_7lg\LȜģpqYJRPs׿sb !67:=Ws_Kvԉv+uܕU~;G7AXo168Ԉ^ xn4;+r'1f~ _xfpPZj|J!!$qM"|{#G6[^y\o.gB?X_G׋+Ye AMSD>d]['6Q Q4߶f1~B_qw=-K#]R&y׿cA ZI% ~ Qt㍦&FW=+ɹHo`K^ rm3?Q pdض)#kS?23ǫ gmz`a2bM6ɢ/ "_}sh'OV|R/&(ILdPXhV3/xZ$k 1^ ސG\ 6 >?Z:za%i~μ΍%/A{I x7:ƆǿL#莼2+`eo>{)5)嗟4g&eҪĈdRGFPŭy梿5XoDh(P\#aC0LO2}9V[ɎdcZg\ćw[07"Oq""2F|>10.<".ꖿjwj|KÝwޑuu`tS9z-s3j}&mM tl4tW^7M0K[@U^{ʣRA&g[ؐ0X_¿Ӈ~H[lal[n?eQ[kjZ$7F4?IE4\u/ɹ'iSPM}z;ސg{% R~ҳ/ࡶ@|al\[ra /{53B%1xCq=†u֍ڶmuJޙw2 X* Z[subj3jx>Լ%'Yv`F؎7%!82rRW6)EFNk1e4etj@c:mB0ő׆SE8D O$+@xwUob-īWJ?_Ϟ=ڿwmdR|E4?8I_eCgم 0pGE꿂4Xoަ۶Խv2CZxŶ7KyD_<g"x skИقa7)E_*v@-5HB+f fۊpCPRf2g~)6hsnjC 4hufi`9,qi".FaqX";WC W@K #-Vw( B6-a~(iGŋһ}$p~J-b?{{}&^u.q~< ῆ/e-G2Iu_Yˌ_&`W_aR/{APo|7%_vGY\u89JXi矪Tu&vZav3  /d Ei^iO?mgAPod|: 8&+/-#)CGuiSǓ|SB3;tAy)'bJKIcE7?a.00"}il߼ lкV|C$pKY>^b0x[/I7ndi+sOxż oږ?jeC)H?)nq]>;&)hQ7Hqsgj\ _"?ˬ.2J:DgG3&`I;Ƶzb=)j4?7YӢ^.n:b@}LwUD s{J#Ɂ 4UPt#<+17fr )523/2u相?8Ra@Lkxvͣh<9ߋ1=iw:W?֟X0H@H44A? (iJC#k!kbĠ`7S}35ds.n!mTh]6h{{)SC"hE+4!I\ m`啿P,<~(Z  ޔvYƱ_+V{YF`:3Uf)3.? #I+6AlxMe8&v>Aų/NKAUmSd)&M >iBByUA˖5M2Rųb ‘ ZJ&ėib - Y'{;[K{DmsJ] 2~ 66&5#,ckRHFB1f\Xz,44;/y=Ai)}a&84.kT~t!u~E!r>C ϹidRv"O1*bIX ~JW!?  !CGoowM7Mɢkɵ_,xr@P1Y}1_ w70-WN(O) ?%8|s MhRx4}\|1֏LLk@lP\jpgy ÙퟴPSqM?Ba|@Ȳ D&%NRFT;5Q1>rwQ|;g2ZHϴJC>aA톸R@2E;W1?wןm֒zAIz-M53ϿJ'McBhOR1o ߶<0O 2?cj APo\ko>CڵnNx8"T Cr}RG^= c'F} 6-G+Р7_/+VHh O P" eB{{;C?>Y:@7/`weTZ5똰.f9zia ;#5jԤU#Z Xk/Z(APo߭U^Mdj'qTǩUf> Zp N!?p #ڐJAxgr5(2A*d ?ɳNi*lPqso*Fp _U]`kA7Adf|Lp96I]kt}W6ot+?xI0c1HE[!(FyahAP&+O_ uhkך5@@ ΊDei8 oݡ%/ PQ+Ro(L?F@ &wxS3Aw6ύxm\u@lJwJ$"AQZ ; ld}h4gXFoTWfAtTjDj6[!?YXWde?F'qϥBW~Oڎ- GM<7(h7~<-ZiK[TqH;󄋦b+&_.w.YBFF R-mW} I&}|ֿ,MӀdj*U"SVRf̘A^s5+tRJ6lC]=ۦKḡg<ǝ0<"t6l0kiіգgA>7|aڬcqtM_ܺukj׾~ԣGUtՕW*۬Q_a_͝;Oiر8~+./wJĨu[o;NrQ^|taro;Whh#:ceWgro)Jrj?^!=3\Nߟce.'|*国loݹ/6A/<0`;Vc[xBߛc08 sW^=/Zd+*ᆪ8;x}>Q%isuHp_lAJ`~DS… 瞣N7(P3?Rxj/,=822Ť|o&جY3օ72?_#vgyMwaʕgIgk+L_d&lbD7'qhҤI"E k%_z?}t'_9e)ys.gu=ܳNs9N9TZb2;6$}J2!N-tߢ`<j_jР$f_v])4̨=1y@ܳϦ%?:v<"| B~!O4̛7O>O>ծUn7}P:Q)Ht|W_#?̱È߭[7:ujJlՒ3WB9T H1!嫿8i QZ'fY-Kgq 妛Ӓ8 61JS |GPM _U#$pl}״j**#)? Ydnt% s':: /@[l[ȟ«d zJ|>Եk'dۨ5LtU^QڏTxJjּYOHqR3[ψR͚5]}HB:;o4MFD .qhӦnۊǔr 5n(Ngr?YN0ȿntN*D`#@t08M\:M7H=8L8LU uTMo 皰)~Oӽ{wF?#mmwS'_ ]L#_c40٬--X -˖<(#?)cxp&]Co/NjH_i8{9g3RV$I/l ۿvp1 %kj]xD^G6 i p[q=3C *MSvM#1Y\t+  Bmlχ  g>^{50aS>s/c'6,iaq-0ߧc*;y(YAkDČhpP'xժ՜..Q#ytK„^(S~YgꬅUX@>%i$Jz$@)67jZX(: |ȡ3lwa1y,՟QT*PfXk'4 ӧM?ZߴIJ!x)?l_+#~E<:a`F@Ѓ} ;c.x!)o_{flŲ{;> .hOe(N_<\8 Gڏro<ߩS'ۣ>J7xRrFK<>s6wte>krtۭ:{cUX)}هg@QŦ|W^eAEbXU?k돸=S\@7U8 7O40񢆣Aw F;B( 6嗮cz|ܱ'n?X{شPZYшXaę{@ӎviᅮR=̚=GD]t%JW# ._N8^WpBCSk-G0ik:}-aoPK[maWoZ׭ ի߀ԫOvH5U=Go穿kӦFmW8/ _Vd}hYSJpvxp0șg $l)/cxhIǿ4 /^@ѷƍy99N ?OKa{xEXDe_\@`nӐ?tM>x<" U| ob H _\0O% cYC>crJv!ʈ=/:FeG֙g%o`>$.v냘:>yJ/ mf:Z $0M p~xXt2=G)d+C1m P4J/ mf5"'qNPx;:駟,oo5#tHa %W)+D%63SN!Da7ݛ;&ȳ!} ogds989 )q(kQA;6ZF8/R"~\u# YH+bNҰvۛ #rq)"2hkNbz^uU2UE?y OEs,BYZ x'k0 x "z UoI;+;3]v$v/]_ Xl?ry~﫯J,h2`gn8.ePch2ɠAWW\!X>/<˯A+zgvU6h9fΞ1or5)%Oo)Cy=0Ļfi. /c(. {S 8f[$v'xu#8=~7jݪ5YkOmC&lxwh_v{ 6;6mJH%h>FCPI 80c]4zGב$ˈϟU]d@EO2~ BȒl lezͯ3gr̙3bc.=O;s]iaKat k_L3,]Cc3Wz/@I ..9r\Npy o=sUAnېC{UwOojxz[jf`=~: ѳ'tMl66ԠC$@c+2^:Kd9#TpAGKP7 N1K> e-i뭻i`!|칂ޘ…i9ユ8S^f(tjKc{qaƬ9J.j&(ZlKAs){&yꏇ{0i2mfgGD泮8Ѣek(HR쟧3p'#?WٱW|opvHqu'\@H8QBZJa|ԘmˇG+2UT}-ֱH ?uѵx͎߯[|)͟3MDsfyJ6nJ[M6&|i3 *Mߐ׶WC3~Śi]b̿b2YMGI4ɭ|j֪MUd+rO{++<聬%>FPUu7oF>{٠ Z'5LV"Df$< T2*k5숅G_Ғ^^^k4#șCM d3प:/G<:S<`ZhUF|B\$;?c'"`FjB3~x*> *Ppe4a#-mB% ?]_N{iB? ()$IT`Q44)F( !z(jUuUmv}gC*Tu (9ލFBaMNDKS,U@F&[!t Ф)tAc+8,Sס6#K4_Yٓ$>L⧎X&%9ŠN@VGiB}"x {ѲR *S PAxl oPkF{)Iw1pr X&iBUH2+S < {۷=zT<&50_djWҵm*OW.)~Dˈ0MʤE@&\߭@P"Wy8iϰR1vx ]-oGVC (X;4P8:?> ˭~_fy}~\ǡD(Fbe:dѧ4EG4 =8f+@Bvm kp5neվO[d{ g8 H*ITepS\׸\ʃF D8>&nPKx>?*;nr׸\ʫ`4PcW?GhW$hُc惥$_Srgs${:x >P0c6mT iѝRp |a͚U?J^3nk׮*)0Vfd0Ob9Ugk<) 0_]$sKLRܦ|jm ?|lδ=pHLɯ_(_*?;@ө%|eoaT"j̣?[Ȭ,4:'Br$SbZƔO+4;_F 7ݠgϙKC{FD8F+_mʑs4jbOlirA|h/ T@&M1 ԴOaǾᦛ~eTTep逛6GM>,Zʍb kfSGMG y8_`~աMқ| N鰙*,UFEEeIމ|;oCy \VZ@SY='Efm@ȫNZ4'(#1#۟whWծAcm7/]J;r5:3}z@Τ˖sȏ CƯ4Wg譥W[@6kMcM00s.HBB64S48 :GY L !O8)(@0UVSObLW4>ꀃwk6)mڶy;1ܯW1* ~="zk?2vˊO:i9n+QD9#g$FAlXy@ܔ5F6kd 0>!HHij\!qSf O=WX!kd(Ti+M IPT++xUc:+wk7mU؅@ {Б4[{ _YQ H7A:CA1XM9w`֚]q>ƚU+E]_4nh1tA%zj)JUrf0JqCLeW^J*?Q7s=RֿiÙڥK͸c!WdD* !ۙhAo˳h)őeS!% x<(o@KiS PH,1[P縶Y -u*jpQKE<*?4C4!7G.F*Set$~ED4{Run2*d$17A2:t^jj  *A\ '-qq!n2AZMJ99(B_mm*FXvS;Z\LH7駜WTΡ3()48DA՜ 냵<詰xTJ[Љ:a|򶏕dFxB")iRR̰V$CAT\_+J6W&ꬉozxsu ]4"$7l:/yj(=y'lE :#)n\?_ $ Ҍ?_e⪓E1BA֖B03[k@첕ڈ?~_Q'қ׸B({vU|=% 9Ko<wK2Ѹ肖D=zL=TqY()j($sHiD"Q_T;aYi}d{jW'B ^4WXQ~Ex| zv 5Ul2ӧLӦPFf6tX><&L:QOh)@@x$kѧʁ ə1`)9]rկ_ȿoD \d>m4?Ҟl8II ϟK˖-5$iM+ 7WO`p@4sq@ L_c/d:SoQSmiXCUXG"0])x*|gLWq[N >3讻E?W { Ɖ(>St}x:u~ kvuwE-W^&M'hmu  /}pLڶ;k IDAT,nh}B3iM77~MƎY@Vh뭶zSO )La<_w}GǟmnjC'{hn?O+dziNu-cM6$6d.>SYVmzv)|`!^!%ڴLO/ɶ@K4ȫ}0%G} 5ɯ]̞Nғmk8O5{I!3cW X6(̊ʫon<&!2Ϙ26G^tݻNtw7kahaղ)=+IH3(2ْz+HfKāf*]gyMmٚnzs1cPv_|NFt~ uԙ?=oF]혾XQ~&ӑ]iYs={d=Q{|Ո؝w)< -" _^zEhd>ed7G~wT^]'?b<6KիޥOm*]4Ъ{{`{1FFcl1h1bIƮX ( @@wfv=W}¹3gwvٳgyl{{}W+WD@|Bɿ/e[oU _'4|nX+a?ky_ SCR)/ l\!sg+{m[[ٛw*5~ l\9_}2clʃTQmu3i;?qD sGaG+~o W~ ԭ[Wf";R? SuH_:`Sgc>ȕQAf  EF rȨQ#hP"ٯ~K,դ;d~" &%}?@:(Οx>\y\/,(!$BG-^H?lEU6W̝H*k?ki&3fΖeWɉ',7V2gDEITte?Iگc%o&2# G"运=?;>Du'FO?'{-Aͧ_x]>9Vi5]<l̄B=r(fJ .!~Q:GF|4h@~kd2Y[P!Iuh"!@DVD B9þ}&~駣4=gg$?/VZIϞ*?f9Yy23#}͊+[om̙r'C;<{秈oLO{X'Bm-ZtT ӟ cgu>5y:cz nzk`rC#SkN+w'UQ20uC^mWR~UWsΉuS?:}G;IBKPG1?P$7Z;e=w A+|GyqKk}5{O{]F(6#ڴίhx3\f$?`΁̃slLiմ\c?=~QcK&M_#e3& ܮQ#zY?4C*뛅)M42A*Of#^.]qts]DFԼ-B;s]qn6mgX3 jm9sF+ zG~Kg:oz,;c\\Axq-Hv$'I{oQU폌l\e䓏}e&ae*l x.(NJT\oI}tl<'w?(",DzOKG͒p۪z!ߡ=qw:B șg[\eUW]'-HJy{鋦Ǎ;tuquے%A]ʓeDA4_&X2y$ ix ʹ馛Jm1+W/_.=y!۞8K+%*^_O^}ҴiSͺm՝T~2-㚉wvc^l?a>8{u%!o/8f7 ˖Pحkgg?)~rC\q@$ JZ5kzT-7`"PУO,S͐ ZL!]q/(U S\3c湝JB!1ߓ#y vO?T ;~"mjk<54׌2"2Y]iJPZP m.r.,_h55l(/Iel041,"W*c#lp=C~඗儞N8̾ b]EcER>BsD?a5?W吴E4yԭ`~fϞQd\^W) k $Pq?GbI-nICZ<^&M'UɻfjBǃ>?D9C뮽 u䉧nM7X *Æw .F&N,]??Ga@ôvj@ęT<؄ۼy #~eP\7]Gl2W^Ynt"^,&]]r}NW= /}O-K<rYg^1&$ G^Q )K?$>RmyfdJJ{8 zlB k#?7?C9i͙)\y4æXOnw_z+w ԋ)B=UYXfB=fzQ2Pi& d Q{ӿҋʄA?6SOt.|eD!EES&^1#;v gLZgp{Djʲ[ /n?se~H S- 2h -r'tJnW~ފƓ9}Pn|@cvo T~fΚ )&9dԇv_y)x nCn$d:Ty:⡏@^HM陪Bl z+W8{ɗpu%5s}5 v o__:Qz9#1QpkwxW9+N@tH` {"pbyc-G;~zҮmX'pFGZ:vP#U"كW&ʞW9ꠍh%lN1yz;z']-==շWӪBׂofbעCQ7Pfɭ8?3 ZN8V[o?/ZBҺa[Ux0gz~ʯUvaDu!g\G :&1B9K5X\F9llNzw"_񠏩Ĥ:y18[Fg-x"LgrB?@)ぐ0ų:_劇Z!32`iݼŸbD#䂟HǶx0b vffriW8ҸBmH"p,އ2rx2!(8Ɲ/[g{_Nm~ʴsCfr(B<⮴E"WvU+f?/9=O'dGwavډ,eV½g3fЃ\}o$&`8Lw,vӿ?>axhF;<;졇Ħ;uSd|LqyY|`s]闾IC `TJQ?k;G}<5v=ȣf~8& B_85y=y}Yϗl n[K T\~A }l&i⿤Ù+\}17:~q<% ~2 2z+bh:j6"?~[,e酵Ǖ+V%\*>XWW_)=nQ%owz䒏X pw˯k0=|juԷR^ҀL{ٱ >\GΆ7@l2a*{Μ9r)IeO6:'TLzO9j7xwY>7Q f yf' T5M4$_=Iw=־xF0fLTJ>ukFۆ tu QT|M- +6l--O~i&zn[_%GE*@beOۃ#K.8kTuhN._YF&|{8GъHEI[']L@ɜp5l+ @c$?~?aa+erEnYZa Ȝ~ԍ ,:r@K/ǭ0?ND$LwYBbٜ?+x~7_xP[y34+L-xSO:]֬$(RU}͓eO_sw!9` R*<6z'fϕ%Kíh>MΐKۓK1G" (+8ѣDp^ٸ OǾa+ǯ^,#CuDe3b\qXhr˫'ԔVy|ܡ­4m,j j<*)?h3|+s6@h`evNX|h^78v-+?iǻKir›jPZx)Yrd2yJn o Hl4л`Ue#/\q 9,pUL簸*:e:ChOκQ4"~ȏ8nY)C (/KI7%&QcM}}1Ч['> zgIpT|fi>f% X,# av9;jayA2gّyZ@ r9 ʆ+UqCh8:CT_% wH5C?B;X #uqoϞ>}Bx1 ؇Yz^65)`(^ 5c j\@ڊ[0!.9r&eag~IRYqgC& ԯɕ X;S3ؠ!뗢/\t lHgsny2A$;P4~c{ 3B@&dR^IL8Xu%Rgr#,t|ՅNP+=#+;c76:,C*}!ŝM)_\o'(tKدK<ųF80mƳal^v(pQ,v}q}>sjbO#FA8zMgV)RCf1_e&!.5X*MxB>4+H64s-GM/11*Ў;](pi IDAT2HU.cilծ Vڑ=%$p\\JЋ@і⋗,vToOi 80C9z qinL<._cPDqB@rP `F0Ž|̘$O;dmYC!/cgt1ma7,Q3m߽ߧкJ<@G?~E|I5+4؈~qo#|l>_>g [R_,éf0B۠+o!n|jOok+}an$ FID V|ŗCci3y8u^,crℎ>?'7$T6y*#}!#óQ\`c\aݎ_gK_-'\% ڷLi`lr"8])zZJ1u">u4j~a& J:ayIJ39$N/k'oR~WJ$iE ~܏M~-@|~kP>;|8`gD_1}3Jkg'LN="F}Ow%ВE7:gB߂1+ꯔѢUkiӮ4k AT*8arn^ذJE-'ds +r@r~uҬEKG^ԑW} <A8k붔O/*{C!;+)[wzVW`CD6:= poy9[r9J +ꖽ 2LȔ)ϜfvQI >)Q?}-@4'[}W8 RyH 2YF8jRKyq@ly֣{k o?:.2!:a^}ATrφ~N}AKRa ob?t_މG}/ ]U Y9ZQ\ROU.!Z*_$-h/6empqH(&~V?a5}(t͏[`l? Ap/Ler)<3BZjUTnZ%dPH<>T-h"mzVWB&RY9j~CN #Z}, <=WgaMC?gsX蝆Hp=mPqrXЄnCWQW*,kre1<8CgS>=h漚>Vf|you2 `3Z0`Jsӛ֧ΓW(39YzZSW U$j{|gQCc?^% (ƴI’E+3JOI[a-0~^aVR)e! b/Դv_W_ m  A,y'`Ly2g~;] cFv;t_5hv|gsywNSA:|†q`,dgrt"g I},AЏZh@g:(eeb_QR~~Y}"?{eγu*?/[??{^Qʳ*:gW1 \@Ԥ#Tվ,l,yE+*<w`_t 񄁥ef.;J Y Zr~kEȂEV| |Nf6DWx疛!۵TG=/͞-gcl%3os|Tw[|Y2B.^K~pFF͚{).˖ǧ4v|gHZCXJ -VƍU!p!d| 18W6PM=6/_^o*Rޱqo;1-!uC_k5jڴ;e G >՞GŽGf|iҒed179;<Ck]e-=:F2.#4#e%!m( S}2sT=weV|5~wWsu_JwZe:NT/Q}rm[LWͨW'{ȞC*ʫc5rŵ7A7nͻgU[]^\}xTоmF rAPy/!/m(:p1{Qoɋg Qifop(\p~.]+Y鷮߂E ?D֬YoAo_&BKF_ $ IFE!ikh/Gݠ3Y:ĺ05X;f:NX41L+nͯ]c:AG|mʏvǯnS/دywM"Y0C 6#d?s)ŭ/I/֮]񅾢jCVżՌ)fʦ*O:+2rki9x:GxovP4 8vߋSYxamIH~cjLeZ"pk`E ;ղ3<|ZLRaH 5W׫Uoj߳XƇ7mWZP:v 帊9+^! RqIK!httwrV,")A$RP( \e^:^ƒ1A_G?B) !+[(Q#-m7cv 7*,NE>$fA\8LY;/!/WVXy5\CKݬܻ3H -~Bi4eMx$m{!T@C듦aZP~a?pPftz>tp ցpyn -cATERP'Tr5c࿯BI7w֮SGg4m s +i`ԯdYyL p,oPRVºLЩH+d6W-YnЉmgؙJ\һ4e7^E'd*,GoDfB1rVu% Rr $[CJo"u ]1\(u\(0pM4(|Yd]g~msC'sz[9T Dq|J0_b_ "74#p+m-ef55xP3'hgcBlP?B Q#/ 8`" ݀ay@zyX+ћzi 3lbJTF%3vԇrϕ|€Q&[W翥&]{&kW-Y3ix8y")8`NGZCŃP ]Ӆ<yء(;;Ly{5%x,OR^o6 KN븗}ݰ"}Ϡ~i&KXtfT< Tn C*Iʪ␊h 0UIJD" "u0, (gkf6Dm5>C,W0>!q8$}a> 2y]B;,hf!NSg1YIpD6 S-?W:mf14̟?w,]kl񀡕︱nZvEV^)ӧLN%:(5j":w&?ʢL?R,;[|jD!^y-n˚zbVL\nv7^ ꅍuҋ~.]y~Bgc.O|gSoIL&'"SS1ǭvj } "E Q0K;s*C[@OGHƃɞLZz^K,^(noɤieysʤMrʖ[n!/ސ[o/Xl[52s)'V=WR>0Qyڶx,YCU~TwreЃ'[n 3mhOojB$ogZ31* ujI eZaZ?0.~dy d3<yJ%g%T?bpL8^.YuNSOB//$֥+49=vU߯/_]N2N/KDު˯1nC#5"D?cf}!#"#>BYȖ=zȦ]:w'N?L9y1l o ~_v赵M/7\cKUΦ.xBC2X5&{02Ȝ|~Q+X-5 ޛBWLjH)A )@gٹX?ZbHYc?y=-7ό_k\m|o(ӛ+Bah|<ww>\WaV3Dd{PNITp~Pǝ+D#1h?OBqzӃ'w$Ֆ}m14U+Wq l{7v;gfofϿ6p_w9屧_ur(~kPERݺ3H"I(Ky3Ķ[Ȃ%+fuO )O }zr R%-IK/Y˜Qzx???ؤ5,zS7Ni@5NsrCyVjxB8rl?cB-C v%W{NahPIN۶m^yʧcK{mϭe;(Ͱ?} J4lܩ#CSW6<&ֶ: 6߬`MXo\p'?3I1lhISgʏNTVat=iq?:Lx09$HEJYI, p[Q.>-qZ^ Pўtymx 9seweVi5mycew&jpǀZNⰏFYSvx4z4 GDM3+f+iՊ[̷ qq0h(͖ƍI]dk|u$PO6C;Lfje=wֈ3.z\'*yL{iE` ퟪK6zUv SYεW_&usnȝ>,ƍ_'1O~/,'M:g9#ds]vɛcIj/*x/3gbx2q$:~F Cm7` wߗF Țx¤MGh#D.BphX uRZhB}^ԁ p\!+Pob`,)]K&LҥeYG( G" 3ը3U[   .|L,SaT,ԓO 1N?s Gyfuqq] ~)G:ʩga?zkOzmt2;s9 O4e+?u7Ci1^N).Xڡx;"OyaJv6wUO-}4t)>N^}rry྿KfXGbo]܇`G,C1YYx\H d}c~V+~U@U5CbrynدE;sdq]\p5Ýkp^u;IDAT{#>7^xYȜ2үU˖4Gz@吞 x덗:y y6QjOt"g'Oϳ"/:B&yS$~Š.!vy FTSz8L̰<]pΏdؽ&o yOz<3XW՗,χQc4m__.X Oduv7AaI.sϗˮ,S://<[9F|&{;793F<К`;~d}(,/~-3AYqIfۃtG,=I>9bG$ zm-ѻ:SoӺy ~ǃzq;#և]|p#[y%y}PmSO:VI\f͕#O(:qxyuCCЏ6,&Ľ6.'b LQ0f)5i9*st>MlDMzn2v S^4z{`BO[ ^avϿ6=V{׵: 4mQߏܲt ~AGʕuNF8qP1XlOYk-dh"}.W2k[rfɴf]eJYM5~S9F/@iBOvΕFJS l{u޵?2ԝ F u^</& *ܫVQ_#9@[iDIblZ!L4̱MP_咭tr)2er 呅uO繯H.ͅ2)G'`gٌ)rˍɎ;7'[򜊅P+jۮֿS;LvuGgړ`rIp},~L6|6&>,c0;ങ uv9Йzn뀓e<˗Imu izE;< <`3Q$sPz}Rd:àKl8X 8R2͞+wo=NY_0H4k$猙u3Cd\ yyFxWi؊+Us+׭& $c,D6a}_ ޚL$wLkWm?kdʣŌn|X;p߽PŔeZ˽H<9 `cOAzzP_٬{/F9d2<-Ŀ2Voݺu07IwY?!d k/(aW\!ㄚV0,o4,uS@l7 xP,/"_|V Pԋuaɋ8I e朅x1&(\0-o[ 'D_.eЏq Br2rf;*iV MB>T_^orEa{QAFuu_Ol3Qun}jzRPT~C},?:hy7O~5xO [ f"p[5E>cwiXKTe j[t%Jt-|O%؞'˙f<TƸ@S?9H<w*]} ^iP@?d"^/M$&biyg Y(t֠XĀ|JTC5O-0"ۉp21*dQ{v݋xˢ<#w f8nͺr.2 Z ;*L,B=я ܆s7|s}mrݲ|jJvV-[ȳ/6\kt<2l06u)S)S,,94RP,G5~Wo PO׫B}gy &G y_z7 V .| _ᬐ-fGt+ N\d6UKOö{.!g{aK6>}u&xb9wp+#O>9L > >`ma닧@u>VsЫv1(˳doӠU ?m#Q &Ðgоa·Pv >Bv:En;hH"oA9'?{)( .JH3}eP1켳e/;LZՅHTǂ [1 lLՃfۯY!-!g01(O4mJ;lyYt\KUwO-=}yϙLr*F!U~ǽzP=/ְx<ۂA[o#F| Y3v;tbVazn7jϠℊ[GΨdqfqd G9t2)0`@OIw+џi]ӱFgWlpBo` {n9a&>|r>{,Or>3N0xx7ԉ pLoկ䧪>{&s^W kt9}MB~y|W'h|5ø8xAb]}> ;{v27c_,y'FISNUjv3 ~`_d(K);k TQ9AkǕy~_>=mY횃N۶É:x1Eoݺvl#o+77!o<˸i#W^r7yT,̛HlӺ 8y̙|sYNLק2$ߖ[+J*W^op?uʎw_i٢9|m=ެ+lv o.9ȶ3wMͱr称Yb4!oT/ [!FHG0R!2UT=4?a2:LgkPA ~7{u٥ɐwޕswO \~-&7s'#)_(bji"sNAbvUg *hู9&{=܊,QiwCǭ ͕ ye'Q}rYy`EX@&0{6{^BVr&Vr}lqq0['ȀS`ZHnqNɆqBMaXU"C١t00O&*W~ 9#YSG-+׿Xy玻m4]);0/ ,a`TϽb3Fx(USiTF(Vb]hwЅ}еhϷLE,<'C@_7zo$WΏ$`P6 PuCu0<3E^~\zٗ'r;L )x% 2UJ? TzΨ sn> %y0Öfr<Xr^r6:Cktb+O~1w(H6C}PΩ)jjgt̆߼[a_4ãJد},fn^ocLtb_Aö/w\+A)HYF- | ($=+9 (e~hn<7ƺԉ)_|tY0(g\TWL\ zz,I_b`@~P(D@&G󐩀?^31N!{WL^?dkbGo[6>,\D1}6F'Oaף;( 4H׆lmD1~ɟziL$vSMOD pI.3TgNbso(O0 Ա:; /U3 aIn@_ ??g/6u]$p vւ,A9A}U (ӕ+FLyzp%QR~Md3>_CTeY^]"%sW$tr" >y42ߺi z씗):u XިK+Lr7~mDr󠫤s[rQ+ euV,fNVpe Mg#AUX?KyL<%ع rf2:&3r(ɨ]'oާ̻s}]#1 :Н"s_:;z W\cw8rA"&G"әqZ =/mYliܤRx@P4YE#.!Y'xx:P*..UTKϞ{4/<4wxfkpz& G!k摇'VO!˼ aJWY<ǿ4l̄o,>yG}1`amd9 LM~k0)??SKl@\-R~>Ƈ0>cou˗*Ѡן }]dF/^Bgeڨ4*G|B~3?fWkd5~~|Niv)g{ jOU髫ݮWUI֭KCv3Ii+)P~:SUb<aeBh0%h Z}7]hhD ᆖWT?~<[sIyN~pRiY0۟u+eiyeLYyr%Jj`oV S= _항!>/[:_#eGC5Q4B[I!;)kpEL_Y~Wlοn{?˞WMeWtuSUY}׷~_-XD̚&S'V&OO/~IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneCaldav3.png0100644 0000000 0000000 00000102352 12564151525 023357 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]xU=J @^DbC"XP~{-@B{&K[=5'G''#FFF )cl:G{FF:s7TVVJP_Vu]՘=w\)ק\5/dg믖($4߷XD@" 0hb`[ g.''HKOÿ6|X(rsshЮM[>^7 $6c%Gy w>]NԮ |}TZ\||n[ƛQbF$hŢcb!5<cgL|"y 9u 669j4^|U6 +q am#1{066lIooظ ;و!QZ^ 1'SScϖ-Xq #=_G((zyMԶ~{;ls]gj)3-&&ppQC֘5M %_ٍ @]0pPL„GߛbZy&T< $X9|~Y?}"Bd<`Z㊕ء=<ݯ9W&!R\ѱMG!ɁJicr~;8߀1Ly_,GSSϼc{ .\$] W1%ᑘ=.ѕ- 3JHc§/*Һ3-N?k ǍCIi)كU+&= @ѶvP/&5dJÈe߾}CBvؒ9?$[OO8aH.i/ä#3#oO 8פvQYDR(x/2|:{4> Bio{ǎAjj z),\X"ÌA&]</&Fhe?~4DUOM{޽ ͶOϞHVV[w_{ULhx~ֳD޵ vۏ=d.O?>}/_D+WxhDf ""/_g_@zz:V t=;t^:կүbg2i,ǎq.4Çw~|ϘF@7HGV VKtȩʼb-ô:`Jb,,,pwaWF_[l `SY\HJT9?2I܍ QWM{YJ%vǫ듑I=B[ go&J[)581QI*ӄ 0ڪLX%+ί٭^ZwVVi9IA--i!iii'-"sߔc1_?drkK+diYY2]HKĢM+ (e:ܹLt?בb ϫ{Jn C"**Z=25 @^Q))A t {iv޶5o;uo$dbᬿp`CHpv7".ǙFdXⓅ|nu˴,MoO`yECYY'o=Vl+~ԌlfU]Dg*Cgh" (Qw<GB$^8cSUD' fr,r u%@ӅǕ=XwO}Aa2VƗD!:/5*V]_Exp q97˯} \m4{EE ST7w`-صck<%e;|pL#v\߫ Mfߩ JKJsa HE_XX$\I)1>-b\u~d*! c삈;9}3[=&3-*z2 ^9n pBQT&u#S,Ο?]v3;T,44W6mAO&<ۿ*Hwv~ 0s օoЧ--Se(q&-cn|RR Mf^-6c;z&giˉcG?Gk̞&9a6X31:2>@J٦۫kWbN8dRGkU2/_etCYWJD)W/Lc%;v?@4&3/+>f9>͂@tt <zH.=f~R=Hg(ӫ>^T܋ӧypr5=. /Y) ?K邞}8HV)@m:xGÿew;ֱ740/ 98n]ZO߾:IPp_~5=lL05qp)W3x7 { $k~!a)61[Zo^Nɫ UT 5>vx?u;g IGTT&`zuǯYDz"p v!ȉIĈH?5z}93'mu"Z _uLu,16#a5ɃfIksD`(1 2iF71vquA̬0|Bؼx^ P)_#5)^N)^shGdwpt =^n7!6JeCcWwՓ3EWTҒ^ickR#Q踩O[rӸyԨA^CC} ~U~||L:ٿyKVQabGw87Ie>k׹N98LӰ ފKIGĹhۺo7WrT Ο>$ }z?TZI/5buf;|7RFf2B# fm&l2zCHOˤW*(dg28r^5̴dlȪ3RW[}ė?(\%οS+HKnacPQWGsм5 Ւ`iaiN% xa԰ԤW_w?2FpprY0^:/]V0mtvu{or}[FNxbLt\6QQJ_1vXeV7&_u(HP/9*+!yh\Z_?-]&%xcsKP33Ѩzy|oȡlETj ,os_-5əh[k8^$Y|JxKÞօ(S帴[||b'Qqc'`2u\DO%F"/; <ػ7䚗B#P\Splg?:*&^xaxeCYDƧb /.N\#<:e2>GXYۊy~N,/**0U]=aAVFU3/)V*شeaY1.1K9v86= ;'QFLK$U%Eۮ.t\D!/$V-L鮷 yLQ :Xtm`uR H[2+ػҮVggulu 3%\ICc䐞0saQ >kAoY=]j *7B}WIigIRJaQ1kz3;L]D &ҟiL7>pqvBTL,B.y_ Ih_T KHzV.0aTWؖ&Ek[})`c~k(RqIYyZ!rW-T4&Qq\N2.BRV>- 1ѶJ?oX.+tTߥq IC-SIt|z)jS g_DERN+QF-D6-p"?O9>% Y9aڃ{QELKdVHnc\5Ͷ sgEXt.H1fw/}((UHNKanV0EFA:66p*zI Aiac_~&㵁{Xh|kcu|VBG^#`cQCҲڒMx> Czr,g0zti|z asIX9x'&"%=^\}:#," o:rseb`g_yׁ!X,Qמ 탚ӋSÊLY߅ A}_AML9Ud{Zf.DlUM~aՌ{tl'4őc󡋢 c YisJ2MIzy5*R) w|z$aL*ҹ] _L"JŰK^6ȧRT1Cq*o*kqB3Ga8ns7бNkMPv(cc4|w8s:~-Q;/BD=S5R[<~](pQη\C\d_LPEdnu #`^8x& t=cI[%u/I_| Ѝ|QEX7]<?q8<KS厣gcЦ;>z}yGg5BPu<ƺJK TZBzs}Nodﻠ(7+̦uW*}Af/-\Xjl+|1hrzZg3lAʠ_VoVR rDnSi_ȷoO!@oҖ QQƠ}:bO HOa; :Cdr)6䃻sHGˢXY}Tb/\IWRNUv.ViL|{]ҳ[0t0Ӕ4"@UJ;K1bfY]^ϧmcڈX ?C~}Dǹ0?wǤ[|k~xEDйLA~8p6 Y BzCQhˬ[S=Cй~qAcNقDS|?<D]-e{A*9CNĤQ3RXt4t,44|{i_}}{t¥LR!};ì4%sеSyь^oLs(\:{qQLOFbe܋;i$ǃ[Th4Ξ>+$h& tRCd$3>BjejF6RDE3X] ss +Eeco*;a>4. 1b(; oWgbLՋ8ўoO$\ʚpm[+7Wi;b+r0y|}/k;j::5@x>o{E~G{N\ƖDkv;za늏ek"NҒs [2%MSQo̜2AMO wb~"op:fba?y/.*r|P ?+גrt,{.mT&c@'"Q0lⲖ b⺚4@mgxzq1q[O>3iI~58f<'7cӥrs7?տy}[uzvhnhy̩QD&-4BRZn2WHKh؏W_ICԷz%'Uϑ+E䗵3&,a.CӊKJ$tzs#2NC'Hwr>9{q Vs%?H!!{gKLj3xiqVJ!OZ;?8ԹKX-kAMjK%;Ziea,?+lJwՌ?2M*]P3x[[PLf\@$OTPbԮy*Nm)f]^:yW2| Hlb:weD5r*,7\OwLL6%EuO1F a1UT;qTEk=Y99=G v9cUW^ IOWHjl9|0]-HKxx}H-:r[cZ׫,|y5u@Wx$*Ҭk].SԒtf]5@khͭ*Lh.<=ҦDRti\-~*- Xʻn4„PLMQFv V7ϱ`ϵ"̤H"s"8ĠaInFt]:5@szatguA[p"3nʉb]4l]׹NtpgjzeZNYIlucӓS4nH'4Ez8uڶZ8\[ Fn=nnd&NXu05}qL ~}ҫ9*z`T~^ _ 93T kVoz)X2G([:XXMGX"p],Ǡ%IO`2v9pÕBc=~ʢn:kOMyНg/D҈xR!iG` ŜFVs!SA"А|MjZI˥jrGC_ڢuhf= _F/|\,2PƊ# K%b1D$ &'X"q3s_ED|׸uA7&f$!r Xv-H܅֙H" L\)"HS6MD) @&D@"pk"`ԱPɁ汗?vV\oy|H\4yNs9a5G-HD@@b! D@"'JH IwL$='PD@"`xH4c*g$艀$@=$C@S9#D@O;J QT<6*VH$C&z`Iq2RPJtvqEV;[[ȣ '4ܼ wĀ$i-w$+`F.HH.: Aod/51:wE-ԉ,,H-[CJM \]M9w$E" lbH$(y>R'Z[YӦ,#Hn)Y??_}ړe$ E&#z /pvvtԧ=YF" PxM2ߘIeէ=YF" Plm+M/٘'R$͎@]Jo'-'Hꊀ$"&K$@쳳XxxxCp"D@"p3 (XYYyaWӊΚ5 >̪ߴ.&7$uAQLŋ㭷VZs]N$@m4 ~'#F ==]w%ҿ+^dD@" hlf7!!A{ܸqppp666ULb ˗Å ?.D_/",X CŮ]`aaիW[L,+W#-NJJo"إK<=z(_{/rrr0g`Ŋ={6Ə.c(~]붟FJzt b X$R3rѾ7^~l$=M}ղM{Ή6ޜ5^n8x2v K\Knyv) ?QpuE/*3ebr=r:?>όa߱*)X066R_NFee.1itt Qyu /wa 6>iNsK8mZxm;=1itӀ wo@2{i+k3F|,v>i;NƝ#b /:#/&:oooA 0|p#((7n_… Eɉ8rv؁m۶ 111ؼy3|}}EKЮ];l{!Ol㏢|q}& u?ĺd<"}ΝHKKCqq VNmCx]zYD<+9*.̴<ֿ:a8K1~DO@5,7@n~ Gz.xf0:w 3l4{_qw=!H(QK޾OkFv>N X7.Ƥ`PpŸDtbѥ?7GWQQ]s ַ =G#0so ZL\ ZxaaJO:<ߝgqY,_4.DlG?,@|R;b݇SDݴ<1g筄?߈~v)-=Q_ļ/E ?W RQn4 N<><0s_}U1r&F&iӦaĉ077Z YΝ &3g_~m_qqq!GY{r&=a֭Δ)SK/$/00k׮Diz!arҤIor!^Z#6g߾}_Yݲe &O,7ִX*---ѫW/c޽E6_˟7|S(w(_/8Iš$'NmNcsX,#G3м/UWM~< 6_mzt PO X /,JKU/bS ŗbB,,*X$aFD !%KhgP>nCTd+ICdcast&YX L,,:[]Kouٹ)cӄY/ WcvV5'lG2[ JWC#2^`,i2g+'2w:bILVɍCQ4@.k{I۷_%l¿Fۚ_ɚǦ0ɲ>;Ŭ;"" .1dOslzitvZ=uo0jP9~Z6*.vW{Qtʝ}9Cf©-cti'drC,m7S]l50iLdIf۵qL2 1%ZnY[f3ZfU2-TVp[?%K(ڏeruܘf!ӽ\FLhP9x) 0}tbt=d46=}l6֧)={D6mD{lMpp͜9Sh"C㫺 ҽC35?&6#9_lM?"q4:*,d:lT/zۅ_OiW4Dy"E_J; fCJ֯kٱ4EOjnfJZ|dS<)*.>F"iFF3]nĚ5kDTwOa>1:vTE8=ZgϞ=XlNu^Wx7oK0bg 9s-iLaRm^\11=[C 54&U"O(r!1yՄ)MF%>Q @,- luS6d̈́$hcuk|,bƑXֲH2 nG:@7K U eFrD@O$ ,& I$z" POd1DhxTH" Iz%I$$@;rFH(YL" 0<$13HD@@b! D@"'JH "H  >O6$\$ 41#HI lN" h:Hl:JT" h`$609D +9RD$$sH%F@`*Hα#HI lN" h:Hl:JT" h`$609D +9RDh;v,[cyY#z' 2Dɓ걞:uJ+OH$MF!Kee%}YD@@q>v~G)2z?1A(,,'|? С۷Ww7xD^^tGV{9s $$+Vٳ1~xu]666 16m$L@Ss΢o^^^b|_|9nݺ^ѣGw}V<Յǫѵ?lniO@<1y v՛O"5#[yF[] IDAT _܃ЋX055Qi9ƛ R"Vm<^2 +K3|pHdž!s$qIh& @~:eeiA˖-YLdK>}LQQQ舿 pq16.Ç#44Z{ G$ɌQ <-3oD4my:᧿hHt Tz Hcϑp<ru>o\LHcy?PX\czP l?soE3TTTwW1%`X6Xe0{mq>K"''$1<:gZ6s}1-[sV|/Q 1gk<M$wi+?&ʤe䉶D|#m Npτw"}/Z {u&0/"H(>>-Z -[ly/`XKMMQEEX#&I&aҥ޽fm?GDDDrXjH믑˗/q)YYYx=C"IS!k,D#:O@= K3/N <<\=  sSl;19-LNFBJ6£1nhКXr1ɢq*4Lvo?=N[4^kEGrO"f;kw 4C9M6=>xq"= ˨td((ߧoL!~lSZ{;YcE .H\Wn8,&=sLAj=>|)))xGE޶mE',L~\GSF+Wbƌh޼fU%%%xkBtt蟣֭G,fQ4= ͛6mhok׮bn8%K])*+0mDkc9yE/,9AB+-Uix;Ȑ D_as !Lj&yhoE-DNZB.HNVi h}JY_Ÿ́گ_?,]|0s9}ffftjssscTA_}+6 :O )L.v4Ay99~Z6*|}J;d*bei/޺߯ڇ~ގ?n֧ 6Vr 1qVU~ݜ.]M111璒v1:+g|YcU1dW^VWU[F!@77716o⢞WXXc͏L<;v6_Y{{ɓN=ǤױcG 6 _v`S];i+dP۶m+Lk6/vg ֭[3)}\y*嗵7M0ÐmM_Ѻ8jkC)>'UGc]$bB ,,*!SZٰ+|unwo׋g&?ǯ4 ,"kc~~~ԩd,w09r)S? Y¦0k,`d'H*P+E飠@QGeu۸ھ]y^m,Jg381`TmM$ZDXVOeZx!:>[[9 eR0C+QችaFKm>yXZ.Kq\^"r&Ps0]L 6e*YTՎޞ={I#qqq &N(5k&"em~'x(wm5}l2ᱏիWk;s=ZM@&L!7{ee4kY+Xՙ2dɯ#rv@-H%6 I$ pdD@"`H4+g'ԂCP[[K[2K" 4)&>I!+*l6-'!IAM֑H Iq$$ >:A D@"P$5YG" 0$aHꃀ$&H$$@8r@}XdD hQNB" 냚# 0IH$AQq 033Cǎ r~rRF!@]Dll,VX~!==]W[.eee(//.',4*#$$D|v؁~X7%%ne-DNluA]W^Xf rssqyM6!22ٳ'>tY]ѣxwpi -rРA:u*ؼf),,'|? ڷoǏ_e.\(#""OW_}FII v6k,;xw8ၮ]?c ׽ދ̙3G?kg㑖cŃ>Ta"pLr :yӢ""*Nչ9{lxN&^w;[k N+))Y oqqq<==Q6?cʔ)Xl(ä'mll1!*թ*A6l >Lr&Mǝ0&j*_l\|YL~~>v)򘤸v BeRem"kWL~, Ξ=xhBeá#G/CZj ,YDhg!##7nm3a+|ɏtRt]hed->a;N ?zlb&X7JKU>ɢRIr Si&&?Ƥ:&AQ cƌeas'>!C`ݺu?Z9zf3lBCCE51gggQn̙Bcrdm="oWΒmS+CpYbӏ?F$7mZhCk׮c֭1qD%fߡL6Mhg̝;W!X,--1rTiSO cBfab_iؼӧNǨqDYeَ=DW(yi 7Y8)7jKd\0jl_U+5 \I̗m^ %@9F%@6[`111>B,FE? aX3c$/ka͐1,ۼtxm&KBSȒ뒷zK,a&/ v9s#d>|40ÛB$;YaΓanfYLl0Nmg5 QO<}`O=Q_lx4/-aS^^긎"7dM82>6abb"HBRl2Y{mAy]E9EXke6Lp/#<$p0i 䲼eСBXS^^b9I ѺUVE>8ڢ_@,PJmꇧ&frwL`]DZ/rppҥKb/8z˾@Mg%'dP^f/p͵lFƩDUGK$uC@_T9vfͯzTW'? kymڴ7?ѣe=D>lJ" IuLVH Ir$<$:# ΐ  PD@"Pg$2YA" 0$ʑHꌀ$:C&+H$$@C9r@XgdDPh(GRC" 3   HyH$uF@`!$CA@I9D<@~D@"`HMw}![E" 0`Uؤ l'D@"P;kGJ$$@>rj@H+0 ʩI$# v|dD@"`H4+&Ԏ$# ЀD@"P;kGJ$$@>rj@H+0z? 1КZff&***`eekkk4F'T!(رcadd155E-C f=zNxEڵ 'NЪ_jwz7#L{臭)ZFfH2B)//Gdd$~WtǏUI-YC YSiڴiu:ud.#zEuKEyժUބ ޽[pGoQ:t`/}-M?X '|bȭl23ac*H IF|OC4]aaLa ;l]%L97)Z$#+W֖gx_.T Ɏ}d֬Y`?ꫯуPmڴ<0Qq裏(dgg˨QLD}D|k v >)z~/77l K,ٯ zJj!QE$=3WTqԓ,57W{/+ nߕ.Wm!;z73d*7 Qמ!28!˟K2_'u &f">.Z{{y2_'i!#B\|{zsܔ/;s\"4=ek}?~u9A/Woi]@*C@bcc9 " тA"2Z`l۶ԇ8"ӧ[f|W}O~ B7QDcǎrM7E-[~T7{t"vcH!= _sh P{4{Z&": |2i}\lV)(~(xS<؜|#O;\UVkeG`˵yF q1f[ rJ&:84(@Tޗ#'ui!6{"Z7Oڲ\{|"yOwҥ&rB[θHlС}v 0 cdƌ恈CU oypr^AN(fDgXW VxCb{ԁ{e˲ 5t}"k9S#ZdcxTjv7KeҷGBK IDATK㏓L.c"=ët8.:'#~ˈƭ{LQ -a iDyh8}: 氍[p8GλfJ_~jDU/]G &Ɇ$4iDEEy_o\n]y2CpBꪫL^AB4&&Lxu6}U14-r`X_'}_&"\[ IJx)[srgXis=;7*6 Fw٥u##͐Ohoi eN^uk}+=0"JUSUtk'ƙmy%1!^|7ަrk/o~ n?m cO8t#Tz(bD0)|&PYWܹsyB1EAtKϞ=K'J̎>A+ݘF]h¼pU/C~[ ĉa*[b_֠S:ڧ,3&:PYAݳ/_kDi;V?7-ʕ"cn>[:tXH}Ic-5V L ?H^i}\}Aw:guUb6;5xp7,lX"K/%'%-HcI =0 ء V )ܝyO8~ذa>xQ+s(5UL@ԑD:裏ڛiks0y%norw> ߜ,Z|`-i t+\:h 3،9Pq ;kf=ŷ6?D^ނ(}) ٦Ks^xk#`!a X=zԯXraZ;̦b ֻhqРAqL< v/dw}gE%3ĊX'W_-O>AdxK/5-t>6ht>fVZϚ!}hvMS*z~ O9Hm@F:E#$~׸dĄfk %&MjDzU5#&= \_rvO^5%C l%łJ~~`墋.2l>ܹ"Ua& ڶm[&7 S!w3^.1^Dy͛7DbzHBb==X(6wIfV0+F'꒘V*V^/2fdkZ&:uu~AȌ<T 2/-EQ(5zWXӇGUO̪t" ⡳{4mǰ3#D}DhxTU0VU`W.[lr`1n8mǾ:1wd3>FXMbfȑ&'YMc~wFv61(\&Op5w ,bsP c3]!) `M> 1C,$@$pVHI<ϛ ddfIO)zʴve 8Rv)06\t{C$@G&ժظUS>0Q%. 8Z dժSs%1q+?_x7" QЪ8_4| ,%m[eŪ?eHH0Xflߺh&} `dt$6%b! E Ij[Ma2Q6x|پcUoŹYH~@vn*@jGXlZy[,ϕnMɒw-W$@BzFY)҈nwӲV- iTr$7;C- _+  1"MDEo\j4hx$U+mŻLq`Qo.$k~Qyo5IH @7^ X @&I @t% @ PiH @7^ X @&I @t% @ PiH @7^ X @&I @t% @ PiH @7^ X @&I @t% @ PiH @7^ X @&I ?O?E?Er% 8O )6cD+A `~^ٱM˼ֲ,'YvFHVaXE|O$@@BdI4tO%u7V j,ٙo07uE TGVVflȬ'StʔnIXxTu_`F~3Ra #E;W+w)Ϭ#hki䁤yRA3_ 7NKP%  nШy{y_!?淢UH4yuR3eYf3;ҝI&T k~u^qQUYHlؑn~ _CB"g?@YH S,/4J8EH!Pt( "@􅉕HE3bHM2IX$@tWkdžIzҬvl,;eoo0 9"s{AhX+L&\/c B܇S,K\$#ɖww'ʭʝE٪fs_$D-MQ1z|\)Ќ}>h$)\Jd2TKZ 'ɓ{>=F{u /FKΥqrهE `!ѵ\9i:Um'J 7'&5Vy<5Fc]XZK\TokNZ|:{KhO|}u 1'!!$ zP "n$hUK-M`!+NY|\Bp_l8?-Fw_P 3[喘HKQrshy\ٝj4@ŗж~ㆾ%Q"{`߫[&ߓ@ !3H^/-AXrw[= ]\ -tۧdK~ pxhRy/_ v0yxeRH0pE<]8 Vji],7=fAp87M Bl-"$3Oe灻MTC:,E@r 4G0J0ٕWO'i4N^C-QovV@䎡qȗyBF| G3B?,V= |ҥQ|̑z}npAAt=m[")SuDҶn\#+K"[S7Be ks։!*LUdr{XeiCB\S؜V$Mj "$BzhE'ybFzu|qFs(SSV 3ڪ%n *>O5ڙyKiԧVu͹V`: B98#(&=ENn!/fάI<[F^4|V՝ޖb#xE4mM,T^HOhΧƉar^Dzũ-"D* J]a'Dˋb:u-rQO3Fג YS3(nM"dc#dbNgGrC#cOب"kjg#"0(!Z^ Fru&C^ʔmAσ]>FK% Hq_3Fɉ*'hvd9f߿gKLsNpU ~qi\35Lj qǁq2$`|r}-hF~|y7~0^4 Nz:]Bg|\ | -!㘢CUQHr+Wqt6coq3+De2EhcFGN6*gIx @!#dɝ~}2m+TѧҺ~asU^{~h~./-YNusܯ>_.+?OJb}n頣. E9@Pr Ck>nkR35=DF`^9uXղN Jĵ7K<^YBPwl s! CM0^Q(~9Z'-4CG, AbAM:J6 k Ì@+_B[BD-Sc PsE>+\DzFPxOHtht$6hȪ|:P5^e};Y>G cϊ3CfT:ޤkk #(53/e~ Vd .5_\=F^ ]MkH<>v+ ^TuM?5^!Ola"rp&b lBCNw E3#Pu/a]!B V05l D:%d{v+K0N aW+Oy.,w2'Ԩ:s2M4CO!'o;ԯ #neGy[xbF6Q~8B^L/MC f9ϷΰWTc6ζSq{afl.5>[V.T ]+FF0y3xC3}?YggnC o_G ^ՈЈvL ZB;`!)*^;WgE9$cCixs0k5FQ ҂ME2K \[@=N*RDn%]}ErNH@#q2ᩏae*~} @?r@oO~*0 '׾i$oӵmlH OT ?%I'h4o+Ksԋo%̓C _ʐk \y4 C5 h(e'c&%3 ߌE|s$5΢^2\tqzWWmі窰jaH({Y !,QL+K "GPAڲBE/&R|u4 (kRb!ٝ9;N`J,Et&QMnOB7=!ZWY9CM5C?>ek_ҳYYsҥqL!Q 4j3;gE_CWxAS/|+Ӊ y똾 ]"]m/ 2_8דb"D́|r>oKTE ~罀ȯ,8unqx ^CcPBۂ{ l^S- o[1)2\ CЎL "Td0:=]W1;J+_'vR1 (}E/ary4.YS[Z1\8_LH ^=2mk=DkHa)8W?_3WQܮD`X[=T47vdطO|ٴ״DzܠS7=hIե1Ʒ |m z#͒4^0_'20 rݛeKwI74Ffw=UQAhCj?CG#4V~. ~/}u̹KLH)@ĔC˖eͧ:i1ADI,o UR5XEы*.@]tX]ErxRs j-3xe~q_yn~,whdYW1Eآ`|^q[mciK¼'ZKZS K 0qtiܲ_)CJ.2C&88%[f[SE gqW>FQ]S7b6S{t? [ w<a6!_5~+0Ώ$ on" H/'?ϖ;y+^/aV! #AZOU+6t Xf 8Uq|5SgQIJ$@$p@b+SeFI&ҵaTfHHHFAcUe>q`RJ\aܻD-k෾6 8bKKUnWk1ұem}?b! 4 ԥmCU~ &CN')d6z$@$p tm+wZ!'IU&Hx{tn&-RWɏeƲlg-$u ~ί~btJ͐]n&TVt 5@ACu49+{fg?$*yL$p`:cDzIe7רI3%^#)n[1q<!+ʁPJ5y{&FYH\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+Xi$ 6IDATH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ @t# @+XiH@z> X!@FI\ ~$@$pH _VDR4F$pAЇ:|jyIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneCaldav4.png0100644 0000000 0000000 00000213105 12564151525 023357 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]|ݝ(!@Bpw8ZPھGګRRPR KH BB;gn&DnhB2s<*}IX@ц WGlM ju:J|u⚛ꭳxQ7s|}ݼ>7l|J\ VX" $A'5-s9@A -= [@PVYXX_wL?\:ޚIʓaϮKńI!m}(  cFeeС]];j&Mu7v14y\bCk ko|0jLKlk>s]~9C ##P{=/zH4a u6eݘ4zD4=zciwq3zUxtN'驆SF <]=L0e5 tk- m ¯\Ư?(̷(SL5߻At&&&괺K3|;ӧ3O̩SxO`bl sYOO^^(`h?{C 93aOiֵ+gcek~C89:6#~AǏrd8쬭ӯȓ'!h%atڴm~Q_72zܦnSc鯽"lވq&Vs}L_Fu9(_e 5…8v\ 1^/c?/I/?_6 3OGIi)<8 6[AnԘ1* #.Caݯ`DZG `ݮT]" t[e40Caߙ |1xF87r=?O?Nj*GEEE?cG/2 :*8u(i^xa _8p`yL<%괶8/ww 8*߆?7፥/{xɧH0f>w0<{Fv>®F~ Ξ6n% Wsss_oY܌cG2ż|HP}gӦc' >Y6~qsy)4ǎϐaˏ?ŋMF`xU8N]oV_JtHuW$@n}Ϛ 3Dqat3DRzHG?. 4ykd`Tb[IcA..FF㯠L<>z*:Tkqqqϳg–-[PI*̙3{3ܔ4T@k|X;!+71 XIq̜x*x~luhQM>N16 v藗؟8o۶o1h`|+( LH^{)IDW=ʹ+o%%՚,@g̘!9gͫޢg.ծFMAcHe8ƍ9OH]؍M&U߷is‡ЫO?q3䐯իԝ_cPsg4PC|MJV@Yە ad ?77@c Q@f; 6ManyqzBX3ldb_ȷ#piݻB!/.]>YNϢMNLWҒR5Vl,*R >.,,7m@RJ2xj[/O.?z{gYe2ó=^G͠P2qޒb!Hꡌ}'9^W^dtwz]| o1x7E=JsLMMp64r}Xx[aˇǰ3(OL} q^_3LQSgNFH$7k٢$.rTɪ4#܈NHYfu__H}@2}n4s-F.S8.vJN¿|Q .@/},D!=,p , uade(,)d[zUn,[fLu$&6ׯ/&̻ :F033CVVy`jf.xwi4͏,ODrt0n{+Zlh@?5Xq/`/) FF>i ͌OR&zHr]<` N#QW/=5շ[7QVc܎>ŝ[g_~ &H#^N]Ͷ.%9q~.#.ؒp;CP9y_a|9M%sSZI bͫS/?c/? #Zx \6?mx̺~$%}Aa6?eksip"{[Q<1o0+M1/Ėse(3t+骩>{46eǍ,nB1FY~2"&:J4ЃFLK_#'."=:o_|f Μ9ށUүCA~Ni;~O#C1 Nsv5 +LrՋQ<I>R M9'[S` V :4K$Mľ ە Owz8W7ޞb_/Y9ym 'k6KJf/8VΩlpe#i1j(O%·j܁#'N=]tOg t}N?T~SimiK~dJS~9N}~*3G$E p715 t(XT\Rxq;M"?hݓq~aNFڤs6<L256GoU~z[QرwB!@t}zⶱc$4Z'NK2R%"`ANlLBfJ&!@oL&@ $-K-|~e$`$DF@$H:"6 ڇPd;L/1f"}fɽvC[" h"7,bhOMn;(l^ ㆶɖH$- m[6bШqp!hGkdfMrzpjݑmH@A.pnN6vnلU|5EmEG64ΞB'w6F Dy/o4b2u¯XvByЦ m~fe(WSpiV%@|{N^wn-W U`!.t'9Ggvz%⫻^/6[F1)Et$}h4/E0"W9/ŗYH߯E^uZ']@;SD{Nܵg(x4b~N3 Kxzw]9dbdlI0ëkv9D8=Ыj]:a`q<}X㤺ڴ5:".a}/ ?M+*3/+5)WE8:23U/31Wlq.;-M5MitEۥ[Oqjj=7.o{1o|L$rf=\?k}+7(9}N%uĨ`<0g4f6V7=p _=6D|6 R|1L#boMi}/ԟ|'Xڪ.މ#~AljL'ʼnXyuuXjdA2rXQս"^lS 7jN},hIKW=r (RZxXZn@NOA4IQŴg!ΝBn6v-4݉y.Fp"(.Pe!Ѵx w{gj 9~}1c,xzq غc/jo0mhOgZ'6>Wh]G!06牚z^yiU[“"/ǡw'Z ^t]۶uG.}`bR4o͜4B8>)EOw/Z*_>qIs鼹?Ӏc]Խ  q'i-Eڬ3Y]NAqC{f=DPG x2i "pUWA4'\}|&(룢\sH)cէo_$kь<3Jm$q5@FUυqi/x\In/$4pi䤣OňD!9bP@lwƨcR\^}IhܙJeoH_g8;|gC5UYix;hjcCˣs1: n]`4 ]'aiS#C҆MMM}T ~M{rѬI롻1_/M/cFʯ Hh%xͥz01CB@)Ԩ֚4C ?H#fB!g#i=ڶupsQaUƼ}74޴zzęH N-~z0 q0ur}_yqQ!-CO9N9n]g_MpSqi5ڥ3nqN>'lGEԵ]8{zDܨ3EbJ:oÿLM|=X9\yzʏ ǟC7ЯȆ_>&Nڐ>$/WbR#M̾]D9r|7nC]~FP)HMy-_Aa1I+IHm+J}M8/W{uYVZ:4"VKX}gf |Lн,Mʨҡ*s89FM܁tTN6Eh'Lp_g t - Aʣ7M]|n'cgè)JǡݛH9 9?ڶ|X A FF:BKatjhx@4wh̙>GGRs4U7UQNv6]C|#];k"<_w*v;b~ڶ fY2#{° Y9۫;΅D:" W$ <"XUx8ةn]K)=NME֣ԾqϟA*m#6]K*ο[D)Ctu֬c$W݄2q}S9sҳTK:=߳Gw\ *.2:+Wo_Άzuۂg #B>*|xУ͙N.8t k7/izZ542iЫ9"*I*PIʹ_ĩ8QŰ8<6_5Lܧ; U =.x3#=uhQu&/i ;w6m?j8_4(u=_o߹Rc`2//GЀioIxӟ5| 7:9ۡ\Zr]A;19Up1`i$8H9|v:ox;#>_SI=:; >%FF8.>1&uRW<=DRtL<Ν9b+*g=[ͦ\Pg:dtcRڐk (cs)iKViVMns+c#ndbuqM+]Qk2*&E^OREF$l+JKʂfKDJIK_ˑ1GUڕ^=oǔIcq>8i[0to@_CVё%eF).L47gdH&mP5qLW=Xy x PHXˤ:dªc3*KF=y<:y%GtX5 p!Ȍ/\'ȅkB@eʰt TusQ^A1¥6??eiPVv6zx4P]`ít Ed(tJdzdR "QqGSycp%F]NLd(i#mma|pنݫ(5=S]ǔh\  (%qMb<}TE>fdmgim+ )(eh wUDD#>$,~puq2kkql.=U7QQחf@=ZWBiy(.>f-[!ט$W?XBï`9=8ϵt\NB7/cF ۿ{nۍ{jC# 㰙̧rc1`qi `0uC^F"6zXcGd"hկbB]AIQ3Zf1}ı'vUc¨AX(,Spu૤Wg+@4Mb 2M]ܻg꾐y"8a#5qz_`gNlC( ?o7$S|!QrF wii]$0&1YxRSk}BKWWHiL]̻F=|KMD4ӿALDL͕V!E4n`hD&>ӃadA9;/2jh@0i'M44䜨JG,0Im>] Aau[yҵ> *TRŞ&bB>?|H[[t>w3N$e.'TeQ-~P.đy ٹ7*4PT.V=CҨ-U_%BTlsPU?h/+8q&f>@.ădbMppES>=R#|b@?MtaJ%!߃H:N:i#3W-_7JSLQ[&L-U=& RM9{9n<,ƃ@?z!WUHC'@3K%02ɐxQHh/՚XP`s<&B痘Ą.ߒ{D3umJ1)PO>ډ2 ~Sn}LXFGB#o1&ўy\89 FsA\P_1k =y7;&NUحwr_zwDŒ1NպdDbiN]ϐ4۪4j͞VcMVU+)2 \=p\ I)xfM<ƌD IeZsop˜=bEC#J"E䃳)vc3 W77"@{{GfNH'P`.=jN]_[}Boʓ\|*$x<>uDԇ7+=ZSC\Mi6NԢ`H8=GChM>%{g\Y|wF6X/{iB/\,KJE̝4@$`@QCo,}gi4GEduGŧ㦴5+r36_9+VmFnzS Ս (;zM=~wْR3`[8q4 Kh/q2^5:|ci$_cA#Œx&ֺq\<8DDR,6BI)~-Ij<|FUuTߪl4a&S5˱cxq-?o>DX3xxkd窦(L;.`sjDizbTZnj?|~;^%_SښKD^.6&f⸾4#JWN]/ PH^9T{]2xȾKN0<pKk!(tEȘdNρl)-[>`Y~G Ѻe?q4alJU|.ӴA-;=҆;9X3_,X(9S4&=l`cAZ\-`]h%''â67&Fs{fZ.|aeH6< #¶u68)*D{'t#K~ 3W}>P|ӹ&t<&LƤ#k h}3-\)Fyߚб;r9٫v@/NLNw4^O9}z[9-z}uoˀt}Bx L4opGܒ'TBjbw$f;apLZS(qMZl41z #;-mJݭ,ɣrKe;;M 9يAz<Ϯv+Ǔ8:ϽIH[a3(ֵ>} V#xmmPoo[k?3~aߦ%Xw[;Z5s)8xA=YL n篣9E$8=&)bXZv!n3{z`hb+s7̖ɯe(7{uA)}ɸle@ @R(JQ*~5yt\Bod$"+G@ѧ?T7v'I" h @#ñY^ǐ+W [q$ k 4eRjؔ8H$Ke;%@}G}\2^" ܂#CvI" @g&:PoeW%dKH$J1ϽD#sTp-XA)e\LLc$.&5Qh?D75iH$);I]HF@ q@@@ pe%n\dD@"dEDn+t'YvQ" )EJ$$SIQ! rQT^W\.$thʜ6AWO&06!-iqtC)I(-)=v ,7O" 4@9-_L!#5FutqCYLke%HKS' &MΖHD@"D p9$٣ tt j{M=1b )jA-%+`#F^}x-\ryMj5 ?_&U"%@K"㍀JM \Ui-s2S HD@" hkb )Z7M+XR\(<'I" UXF3T! Ou^Smʔ<DU` La i)MyG" *n$xn6<@lkmMyG"Oŋ+8ħ,/BeY>, K0u=:;:::ַ cpuum<'_Іe0צ<#Pd`k_+k'xyz:'( $* PV{B|Lwr"+[UqhիWb„ &oi%z$D&o~{fpts׳,v*X+A9Tg{ÈCll +,G6("5O<H}ga }K[:-ݸSZ 4@QXXjíAlz /4ťl3*e-ԅ%HƅPC~3}萜37a~ Jx ") IYND@:$,Is7. JTT )0kl~)Ҏ4ɥl3*eO3ǟgjb?\Ya*Jol=c2o`$ <vzz*cE5G?R >TX}egg܍`CuQSx/:«*F̮]G 駟VW^u&S 6lmiWKSq$th[Q"Kz +^ PQIi.F0ru$1u䡼6Ei ֦ٞD;u(,̙3G"+2˿Zc nc@1d}#`ʔ)j<eWiD ˖-Z!G__іN#:0UI\3 gyC€J!=j'4b[%TI2ӤQr\DMm/B lNmqiHiY6 bڵ0223:s111Beddq[lʕ+xz1aAשS'!^u`իu۷AC@Fhf/M!Q۟Qyq:yM3612#г={L*bD vX%h?IadSfWc Rs 7TZZ~~Bpp0MIڵKdҥ .^T,ZHLA ~[$ /=S^aE(󾹨ELb 1;;ŧo`ǃ/"Ta.\PƌbΝxgѣG={VOӈfzWľ?ƍhGM>.iu4v]qqq  z6YF+LtIʚ`SL_NEٽp|$&0NJ WXc$XhJ~r^ [s$W)iqcJklZ]4[DΟ?_ಶ |, e)00P88qndbAȴ|rL<,Xxֶo>1̸ ,--K/᭷͛@*yͦpYYx-˦֮cxM<(um~y~`&zWMj Mn 欇EsG!9=>N0i.LNWT%lY@1 `퓉g+h8JZuL#!T AZ/Z495%5B7~%P̳S *ٳEOOO5G}?cȚOQ zBO! @3 ; SUo_1,|Zs<3gΠ_?s㺐`s(x8bC~_"$\CV>#a.EYQJiڻ;ǹU~쐩S6yGC!tdDX+r2ij=mių"$)0J$m6I$7)o ̲D-" `[<+MMA@ D" hHϊlD@"pSz ^FD@" Zo%d_$ 4HZ)[TYD@">}'JD@EJ$)yHZ)[TYD@">}'JD@EJ$)yHZ)[TYD@">}'JD@EJ$)yHZӔ,X_F^> Ço ""qqqbо}:dވk)y1t\67OGTp4ܜm07uvˑI8x2 9Q}ablX/&!C|R&-M1F Z)L2B"p4 Xf hnYV\1c'A6 A!sIŸowxHMŖh8t:B kă/|w܎%ףLwB4[lyť{ϽV|[mʪAH-*qtt޽{ajj*{HII_~^zIa@t\ƙKXg+VAAQ ؂b,^p#|/X#:>_zw^8A^߮;'->늇`jbrb~~m.H Т_| ̐us;)S:t(>q)L[lɓ#ʕ+Xh&NKbǎ-<<s._dzHCĵd!Ĝ-*"-m<2@?f`7Sa<$1\]F+NU^gbj6zww0ol&mO"LXeeeWE׭[j=z9rk׮`͏o>DFFG”f %G}~~~"NՍ@/]X+qcDG';,pI->[YO мBB7>HNfۘ{&U"y XTTm۶My桰P4700x駅cɓb0㩧<,9&`)oN> ~,6e(@H!-lm&ȴzjarMܴ4 ED%%% ʤ M]#4'13 GqD%cԫ3 $<I )YbDY1)K3 K)*;ugyF~;z%K8=P}dM… 6m44Y2ԉ .wT~pTDŽafQ:\/ljЯo e7Cx [儘s|MC. ]LSiSVDEM`mڴl27Z??0y+gXjuV<쳍eZ sx5h‹sO^c,y+ON/d273/ŲϷSo>=C-L)KdfB@?B-tJ^eJ ܹfF1<=~999QbdL1͆@Iؒ6qhOcwx"Ɵ}Ϣ 7ڕ?уՎnڮV 6EAwԩxk$,0***D ²e˰k.=ZM|ϟW&5 @*w)|^֭Tf>=*66Y3op֤gϊx[wFJJz,丬lfN荻 Tp(@Fvx_ K[kӦc m۵;q>J`֓0ÃsuWPt*Q?ye>TzɹX||mDZKNP~֖XsrrNJ`䃂 :8 z{{Ӊ+G}$мRSSϋ4LΝC~~>~i!X;y$SO >۶mjVV΢6AX[U|FP]0xbe ??s`)Z;㍧g ߒ [Jz..'* q*r;'I>)n^fM63 H.|M7B,k `r}V@ $/ţʟ#HHkOq`X-=<ԟůrf^Дv fS~!Mh! .]\p6$hSGC}_W,l^'e?o`5} ~8>r|.?!ȴf ls3n__ruq[3\1nV-n6X|(!! )+r<$qךH -*B5'6GYp͞=_~%/!HOO4^BYyh\vBgw,|>OB1s2Ib308>1?$X)`kN.|q;9-G cgH+}*kJ؂9lL/"诨*6}k+c+"66ARFYR}g f%<0)|<3dX̯9|9d*//Wd1u2]Wڍ988liiigY§3R_|UOC)lͺ+L2mVHy@3nN+LXWsߙ|Ax|rt =_%ӕ(I}Css 礅#SAQ Ҳ 6231R$h.njkPuȜ8Y/}kZܞ{w=YJXбL*},&s>j_#E|ldX:-M- `om(I=5Ikq8|wXQ$$AY0LΜ8NT73gp3|3c9d9կg{[Y7]]k:R/dZb]mۺukY - c46bD<쳴FI\w}6(>?8l$}ȹ68?b gɃN:)"i?uEޒpz8Ƃ'5j$wޙzMAň}{p؜t6Fp/.ƍW[HFgTn2E?{&/J~!81~׸]1MjҸBH=8ӥyț2MFڴjA͛6>vggNPcW2b$rFbZ)9FQ׋):#vR/ 6wRܥ]KϿL#>҅,7a_EnN;SNn,c"W_oZyUH)<-qqTk^d lHGH=í5iާf2'c &)FMڵ[Ϗ²83h  bdqƺFpٵ4Ç:%3r SN+ Z:tA','͛Vn9 67-*Gdkje0=" aACe:bd3|$>?W!koa^68~F62nL}A77Қ];x<Lp8n%P8f4m\v|]n+%#'9Hc4D\JaoП5{~5ݪa$9r]Tӏ!` ֩6ן%,& JaWYkcUp.P0kUE|80J-%@'8e=`4a;U 'rY-}ժXI>6Eps&$:ӅCQB>U ?mĺd6Tc^_cZ; xxۮT}w.Huu-i[?LАPb('_sbzmXS":X-k9wIybbxFZN0 Є hhhe.˵e(,y#hheE;^ emY_Ulبٛ۲R&Z Z7ifSCWU #UE+G D D /"`VL(6[%tT1"N@@jQ쫚5oY E:iIEHέ IDATj_ E9&MS&/^̏,_դ~*Ar ҪM8n,hhhh:OW˼hXѤ)aU/ bXV,_~N:v#bCq[%6C:ރ ?a"mq/vUXa"^@@@)g_|IǏ;揊`"~[k4.\0ڴk\?⏋nB#Ƣg|q̙r,'S9ۘG|V$оaP/*тsiޜ ~Ec,Z Z Zp1#mrgj1U:)pvk1f2Њ`R\ўfIBlGi[W&H$#f@@@@te@te0j$--P?,`(e@@,`IF D  DX?)J--P DXF֏zRF D d@@@te@te0j$--P?,`(e@@,`IF D  DX?)J--P DXF֏zRF D d@@@te@te0j$--P?,`(e@@,`IF D  DX?)J--P DXF֏zRF D d@@@te@te0j$--P?,`(e@@,`IF D  DX?)J--P DXF֏zRF D d@@@te@te0j$--P?,`(e@@,`IF D  DX?)J--P DXF֏zRF D d@@@te@te0j$--P?,`(e@@,`IF D  DX?)J--P DXF֏zRF D d@@@te@te0j$--P?,`(e@@,`IF D  DX?)J--P DXF֏zRF D  neIF D D ,hK\) --P T 1]t)5hЀ,,ږf-omӋ]_Mړ)QeRU Bq B_.hǏk[.YZp!k|vp!_ۿy[{'Xń y'SBr^Fc5| g5Jsc24c@56G2v|i\ںAJ{ly͛i \ upėYʍ*Kw@r'4*ق "="ILKV#nUGòӛ 9(9q( %p‵Lؽz'i!C*Ff_^I]'uq,ֿo0^lITk5zwwH 9%*Y8^^:SX|I .Y KY+q7 ]u9EQi2nomlgcǃ9ӛ @OڨX  3Ws,Q*h80$8~&r7++g2,m2y2~&r7++g2,m2y2~&By}&4jxjܤ1ȮsK/\H;B/NL'÷ c_^r?ZLKxֹtp)pz0zDÆ HMAhna0ޢi!:(\xSCZU2-Z'k'0XN&fѝۿ=~gRc2tTk<9gSZ)ƺ ⎁僾H"NrHN,9Itt2!=Glh /ȍa!~A9!q@ ^RrD,$0 KGdEZgUȫb} Z^O^%&6$魌PNHb ,.0}A1x1+=?ֿvmW~ wḩ !ZM ^RpHWkKdi5/:`u?٦TXhu3/qìK1!ZPK歝qo)A- EASN/e/,uVc/\#iСԾCѣ$Xe3GljԞH_C`vg(ڷ `DвG373a/iG b.]FO?lA)0+U_ӑGY {9i}?3:o+Gw_^{m:gϵo!Y^z |<(XGse^wܱtpmzѽCzǻ;i˽30ݭ VVou晞;CM5vyywgX+]UW]IO=u_ύYnRY3$:[?>jtoM ,@k c|/ Y? 6Y9Ji5פvڙϾ Y'ԟGP2Rq7|>cCGih!ހ}.ysҠA?Jb.-=w)Q3ԕ~--Lԟ A>?nؒ:A-Ѕ\@CyāpUWxSpkQ~}&oX,X+U9gGCT?͙3Q1czz+ N8˴ s?wϟۜI<𠯛|fÇ0焏?}~B=o04#N{' |OC%ZE7ܴiӂƍq$ؗlL,3tb2 Ƀ:vEKW_}ؽ Tw& EZhVRh9u6֙AAs> ga/#Ά>|: xc49 zr-yj17O=.cؙH"K2B[H&rȡaqQ\x1"nD7n?G37ij!)裏HxP2] rtҥpȲXw ‹QD]$^{6lyx81|>_~}=b6)yl M3!tz?@PCZ<_Ytܱ j&St%?@==:x:m.ȷS-`$h:kql(F\Ԓ`G%ׂGf{&L5,< ŭCzh(0xQh-(LF|R 0w쐟${B)B #~ 9[Dg`PTg۠ >'N<oQU6ȥ_s˱?t_, E4)PQj x\yƒ B> ˺HXE^Z_2/MG3TE/S%eK#)`RO +:1{i~el`!N: #F QD/IF"O"~+ {; ٍ8Kpr.p~-=S[f8'e+/LW\qOHs'}ZY9 XܠwWW  ;L+UiF͛7뮳!vo4Iøaioe{X XpM$:#K$A\uvY蚦Xa'q͗z 2V[іEat)~ˁĐu3u<2 ٳ+x3W% i% MœcL Lr G:/<}zke6lYS뮻r+@p_-pp.b]ݠ7XՎcoQ8_v٥^O_pM7紃?OzMMȑ|yv}T=܋}x1c6⯼ɞTwML})G"@u.NDnaNFksXhsԨQ4i$I[ /2=j:+OEm3~3 ޴isyLf ~I_zk5/Yw]9N#״&>dZ~P3ra_L;ؗ7!u e P4熕:;ʢ9M㛬 pKs#w2lkJW˻8}8rш} `qI&ވ#!Qa~!4;d#eq0}8ac;VN. QlBAuXq/Y '&p]vl5 _ [h 2q.G,Xeڅ)P-NdY}prӨnzHEI\@SA$?W9*/eg/(?Kp(MԺuP+ O ع4IC6z _Zص y";gkEjRݺ.m'mbٲ4C*Ŀwzv*}pT "ï!.ɼ4rT\^`ţ29_-c~VxUعh0aM^ mf[@3\fbZ1pVIi(D{,bȄ*9^.YRK`!m$;a7@~H1YBIb"+74@ u5Cn-OjU`e %?is>KMOXGoXQԆwSolkE0!ȫK;p?=r~}^skoKs,oRڸ7-\'F${.jͳ]tj@g-`s/͜9S ZY4jqJxYH w-ݠZeih ̯a|&HBXK?Zm[9F2cƓ'M._3p55}fy)$ ͥwziEOʄB:ίz;v?k~ٰ馛wߓ8?cV2}_ d1{a` l WKb]Z;j5U 9=#ݙ"vk Jqn|\Ep"1/&|U6XHGa ut+]A?>eo(̿Z:tPLy ](:hP'I~s$4:]y܃FNs Fwـ18x_h̋wApXsV*kz[zcW_}5,7 ' Qѹ_St_O#&MxZcc;ؒM8YZAdV.DZ2%q,$\W b@Y[l2%NԤ|N?`O'Q2 %r9>?n5 P"~g܇JWWY7Bw!p8'׫W/֭BygZ䪄7PR IDATPٚ_cLjSSĬXWGYfY篸]M=̂5) 9M!Բ_&IuP9IƔA1$^l har G^NyCUH6x0'B;WB;Ԅc7 4iJ -  ڟy7q6Կɀ:5h@^=€H9G8RzFzƛl*#1xM@_l} }u88-1#d^+)E_ꀿu@-« ]$꯶ YbvY|qƵy~p~/?7q=/#ٞ3gW\^兽r"`k(%i wy1jXьYmA*"2KIΜQ~(^bFc\^y38E"l4a<uM7~*vպv+B6b{cp:+oy* '0j;{L0ٷ-eo7τkbEjKOCà39/HF7+|7g+L=?77ɗQ,/=GN:E0`Fx y0ƌKBRb4qoq})`um#(*HpKY>^b0B ä:,K|CtP{Z%Lw_̛XڶWm/_dw.^^2!EI\=2z~C-nHK/Ae6}Be  @\}rq^TkOMV[MG,WCt4YLȦbW9tܘo)52;5+@C2b: s-ommK~/nF{R=wTܫ Mu@lr|`H3 'X%@yhTdU.F']v_esUK [Br:? LIW9$t*ڠ:S&q6,Y-:7Ay8lro5 xSbei |9nQd,W{9F`:*ݔ\d_luS V&Ҧ.wPlK; .kRPx@[p\!_,[92+ Z7ِFȡ¦#Gj:ţbhk+]d^"vdm-&Xv$T<~ m-uU*%uI7b`c5O H49挄b|8z,4,;/y=h}&8m'X Bwm+ǶDc08 s瞥O:f͜ _{E'57|GK0`F 3f̠| zשJ b!p i }DoV:Coug͚E*J_6;;ƍŻ`z|p? ɭ b!Ϛ=VR< up.?l0_D3K[ .7noM6|kKѣGySLM]?xzǽt'x"yQ`Bd;W>WZPh/G`꿄J~+/1<y6"P6m Ka&kN8fYf;F}G4rH{i5֠N SN(=D-VhA]~EA[ (ߔߨ)$kKO>~aćի3&;֙N;팂PggRoL ?kJ]:?R7yC/W!*^B7:Eo@ձ2gu&=c$\qŕ4{\NM@Mč/_4BBNjg~J .i"'^5BME7b0G@x~[s5驧[Omȟ«d GyD^yˮѺtuFdy,J{4y /\'c+*葇#8Bp^5vO{gN8DZi!!-t/|\=#J͛7! lhS45)\G>,ϡk׮Rzo)< x\}5~ԡC4͐+Fl99R溹GR:t,jR1ݿSsй4R4Cf\@? KW\v9uם>#?u~s:BM T5?s_Gd_sl);?Fk{cfǟu]gJߩ|M|ELC_z>P+}=un4}Lł̜9̝GwqpՕK%xb‘/Bۜv~C;㏚8NF3yD:{Ο:zMX w8e܉&4d2gΚMݻAt=w϶V&O#`HRgP(#PcPdm NnMKa_62|啗 џꚲRa^b6Ok0eTXQfP]C ztu' ^Jgd& qđk:  )Bsav(}ʳ$y[lш0Ta@U$dH,l<%.4r d^4$V4G2 ΎUW]!_TS`m OBEć6݄c~}Ἥi-bYtU $BU kIʆFZE"]< G n}ult]^ś]gq¶jQ&RGTJ_$w# +a3" o8/] Ӂon7  N)`F G x^y<ͤY_$+[hA?^8C-FúO۷I&ч<+ % ||Epc .L2j*ąRZeU矨OK}pBǒ{ewwH|堃X J0q?"k|W۠^Jm͑?gY4yR~;œ #h ;j: Nc*7yloACp=L@b Gq_MeW%6s<DCa{⛇u~[f=V^Y|;1[19 נGOP<ꏺߙ~?8#xu>102LHrs 9fOA`b\8H!jٲW"C!=ij-OqxswN7^xy6ғr> 4Y7<_?}4QTg'\ED/H^7o/-7tj٢euǐ:`ެbh&@?A'!(eV RM7y x Ա.T(a>3X«Oh@ǍG۰L 7N6 `\!vkذX{~l@hvޥyġ?d?c!,-6p{XA?&w糐ELee Fm>/_={ko}w}t,)'Y:3q&*=xK]Kn!oS67? n .9 CmքeDbX3U?kꏸ;Sb@U8 7~74>#󢆧Q@ :A(x.6|C!ЭuǦ2F%[nAo1m_Tgq&N#O?p@heRxNK%,gYpYwi5_iZ \>zSqG2|*C(~"V+Qmeky\+iXtR-svz}]X߆%qsi@kO%և=o7|s(#w1M"_~ `O?аa<-I D0 8֡a-y!$ =唓吱{ 7^Il@}9\@n'C(p|!p۶m>x<" M| ϒb JH _\0$t1JWᐏ=orJv~ψ =/ -a Ok %/$OړN:߷e\{I g! Lh!H!%?dYuU]il„+"u!_kֹ:9g.`L AsK({wR PYvqGwTp^w.w[&py뮻g`a]mfn2 IDAT=zXi75#*JmmLGy># NJr3f4/8 /iy'8q".(ҀwINIazz뭷Q#HBtw݊\s2ԿE>svꩧ ?~ԓׇWc*[>+۠W4'HB5`x`5?Nq#t6rr?|)|gf?mvRm-~mH B>T&ևMFp#18-(4h_6ATRVWFSvhwxt[n6:F*#㎗7RoOn2>AL =<%.3+|8?<,g_ BXa 3/;hEk;2BAYCQ$f͚yY 㖏dS aiBZ;?wM7Lۿ%LȥyJ:ē!hyŶ3 'MoWH;+n-}~ RNƀa,D6F\l ~ٟqǃ*~矧,h6`g+8.eHmNc՞h2\H{lbܳ>o-mr@6ئM;?;{1sI$KmH9q~:%|kHrs]$5Ưśu]9_!)hQ\p@v,GOp  i=~ne.xNAϞV U2aã?n/6f*BHsiGCPCIwx ڻ`]4zGב$LjAȟU/^Nd@E2z B%%٨+?M+l6p0a,GL0Al!;wu7=N~WZqo(͟wBרct3tPYJϬY\wgЙgI?܀S30ÿ{2 ܶ! y q-z8ng enl wak]n_P1 :p\AHpIu[6ܰ-'L"9Θ11>hJ3eA! ~`&">> 6R7d3qaJ.jM WM8[R99*zs5ϑQ`&A2ւvæԦ~hdS# /QCF-3 "/A~X ~X7xetRr}}}{@m ($S!'sx8"8~+iSC$ ~A,/% i.3 (g<~jy{LA;@NG&'H^{4#ȿ?Q<߽2oYh[i7AT*JU v~RH[eO)ElRlgJ$M"&*KN{|ȓ텤XhPQѹC@Ԉ;Ntbh;t{SP`;Ou!(Zg^jx_kŽ{h+0X}2@d̡]_Ys*vh;? u!T7/k\LN6[#8:aZs~&j#DP =W4L&/l uQ@_FrpS_C*jh9(qF=Q WWF<ϕ_l\3kp^WsC#ǥ rq(zw?4ĕý58^WE@gڠo*lh hV(3]y5yhFm@,9J> pv&yy+WA7ٖ2߄e&?t NSŋ3ęLH& -mPՑc"0:6TkVK ,yՃe|^^kԑgL͡Gc|^æ:$ 98˄ṕdG)CAHb'Ox|!-o_gy؉(:H-q8ATypʯʁt\P愅+ giFZ)!Ƛ47K(?__Η{Y0 qVip ERT4My)MMɧ0r@YheaPJf{2jQX&}ڧ>~N9JNpcQPXΣI0IhiAp7,2g`ptfGVaqX0 Zױ6KU7_Yٳ$=X&a%;JN@<ф,4Dt w=2 &STfJ}%ͫ_T; m`b9Y ^ IScx&A\Q|t}5Vc1if[R]Jixa<_ F$Z 2JӒ}z 5W&[TUJW:tyu, L`m!WX1 z.c 㖯wh{`%1\]70 $ί!0n09'X"# yq ip\n h 0uv__ø? CaȺ\\2HE-R\Ġ0mSy<XZо7hZ֖by~9f^@Rhq@QHEG3}MXg&mgV {}횦zMs4nQgOElt\;{2K;wd,nʖFOy*4îSk ^.?̶o.K_*sZq\?ZsUhপ NoqŔB!\Hp}8ќ5nnJ>?&;n?ķbʛ`_,''O?U84 p4#~T<[sJC-4M;#-M/]Fp@AlMyU@NFm;5Rp |a0_ie @%KSEEch#Xh+րq1YEb\X rN@oO%|F|__[I=d/m˧sFc_.l*]6CUN/ ,m۴lIڵ 0uq4y*އ4e fG`9#$IL]2Y-WhXw8kt#;ڷk)պAO<~q<}&_Qy |Fw-#'!#=s[_(T@&oGs!Soive¯L2*@DftmV;qh9(f9l8fĻ͕uFjtuD9ZjIWiG/8Aa UXL˒X+rܑ`BZpa{c ȡ ;&M7Npr1SuW/_a׬h-O>[mNL9sqǴO CƯ47мyMw!F(L}KF hS+Mul"aؐ}_9e7 W\@xb-dv5w?r"@Wo8|׿6mm 4qSB>bW?9MϟGc'LP!v7D /U$qE`vBmɴejД -?Q06 $ I+G5/Mӂe3̽yY^:w[% ׷t3-}ɵqiam^h1%,~e<{GX Q!m$ JX;Yܭ&'nB28"L6k-j 'cu?꟮Ƚ~H&\#hx,+~ڿl:s ?ā#)0DisYS%.8-Wnr[c!$&6x];)0};aGw}:bsfKy9I[̠oz?~\' Һ+I/'$`7Bώ&m}7{duNɹ΁]y *cbq $@ 0[~ZApiQBA Ҡ"sH:7'!oCø姡5X}Qe}oDn~7,X>-nfR#@J3A-SLr0}A#'* FRϝ7,֭[b S귯o]>h|ڨ 㚛{p*K3ۯ@/L6Ν$당9%΀WNu 0  F50ǎI+mI?> ypZK7)0 gGH+ey.R1[)s*7| !jV‹"}[%wI=^O{쾛 /vء/⇼|K_FiztY@aytALݺ=g uFtCdpr@Ͳ7rOiС2 jҖ[mEGu!K?1@87^K.S{K׮^dV B9pw?oz^~ zyHӦMZ=i֣C9VZi,/Q>}bē-[>{x66P,ĘVPݥ{|ll8/W,ZL'm6]ӟGPIMaK<}y\r`DaVT^} ENz2 'GUڷN?Ef-nH_ gV` 1ȑD32a`Aq@aoDm!]~٥8:W]>~'SϞC_}%G&x1?$R I,[J]W_vy'[|wy{b7x|x<7Q|iz\;l:5J~/?z7W\#zm.ZHXktI:Ls:#^{(T%k"so Du=֚xoz:r:t(M2E$[pTq^(A[( 9XZ&MxhDIkt+@/W4lUYI|!TP xRNa8\y{>c]xV*Dy8^p?8b>M$*0[~P+3z>ԓO}o:uW_|oN-!42@@;yxSΧΝ;{.DF_8q}ޟgl-ԎN7_|N'x|Էo_ر'3 ϧ|yv-x6{'B'K/|rhQ#(yÑ[^8WjʲU)o2!Q&/;1\8|3E~! !8}\"U_šr1׋S8nLC;'C[#'*'|x{ U@ bBaI97voۂ>d{ϾDo8ó84XOJy@Y!B ´_/ 61Cpog,Fz4Hd̞M _|!.~v+6d/"9-[` 7 .1i֬YGǼ,{UY+3K/r!E<-93E>m߾={,ÏD#GnIF<2dvVW8z8);h#.̙3-bO8cǑNJ~OӦR,$?[ZJOʣ|ꒆt[P7]+B_bq<';޴&Gxϯ>7 / 1&XR B4!ǭj:(dӕA ďϛVjAy8gއ_|I7 ?ΝΣiIyS2/adQNC08=<bv5u|G\ ؐ:~w\Gw}%!M8dˏ/CcǾ;Ӿ]k#Gy8I:Y= ۠3~-O\xGZkh)4!F쳏гn D;eZP~!'KVjN}w~o:YftEь)iL u(mfo](p,7#*94Hs&8BvqGTI:>0ڿ C ɓ'Kz۶mi6t$He@۠qK|;s56vXJ9=K~W>zBhT`y=Bo^WdXf͚_/O<7V4KM~==QEoh\&>/"j)/vDS8?d7`1pE~fqcqGr"h+?@o! b\qiKs8܅fK-^b'}E/F?^-tv2c*5)ߕ>}JpyY߮}{9̳s9oD*ӟŰo=?Fr+.{\p쳱dO&􏄑w۹D{Ǭ/$"_RcY9~t8NPeȁ9o>R* #;@>OP {!ڷ2brSʰ.liذaAcI.Dd3T2oxҺyC+tkb=m nS0u=b6\'S&-~7!G{% Qw =+,}U(_zM8|"ҡCG,o7L98(PyoYpwg/ wUWk+xy:_/?f̘ޱc(g՟˒%2WsOt>rLx^Mjر2iD=rLŝh-q|vP+ /䡇.C}cOL}˪_uF9jβ?t,,Hew$@U_x`vHi&7\~E!t*<@?]^?,쥹ƅe˖+ܪkg- ~NrC\q@+ -x+0skӢQuH̳m`,NN;oyL8&I:?".4Od yU˪ mEhȓ`0OC߇c>"3qavw>!^w?oAv^Q6(IiH{k#ܘ:#"~\ 'g ˽.„a]e"Fe£BA %U?AQ4j`~ųgQ(rsXׅ4hFy~B\[lQLɲzYJ*UYmcRQ\N-zR u|"S 7,C{G?#!J,V:d _~v52a$[|U.l-:wx>SU|3!KB,)+ý;#F|N;rB&ΔxGgL;3ޒfeQ݃0U ?Ckf<1w~^g|"-‚RiӦyԟ|q`>sGo<c5T|wXF8ekHmϼyuߕ c欳P]a09 U'z0},w~iBt?9f|%xgcw̚K?NGz)¦Пnp={"S03PK~=JW_?@}g@<9G O pMv[ܝ7VC{(|͘9dz 5n*'r@ ܥ>ꨣkL%/7p#no]DьwM*8`Pf)Y2UQ ( Q^\L'_³Gmld|IƵS'޿aa#bєVV>CN|W E!Un6yB&{俒?iL3n6ynFC\ CDG'-iBZ77`X?"Z.Hn6E{2kfY*w5.XJ?K } l=A9 ҋ1S}ٔ4}qO*{4R%|9(>d< f^C)ɟm &B\(JїnN+xڶMDUkiy87_˙g;DA,syY&Wǽ{>»)0;AGAn&?>#OB:h%;ժsjk7vZi'm=|ǓiHܴ#6qlyBO\=iy)cA¡r˯(ށxI>_M~XP/'*8!q^~~#Oɥo9ߪEX y2OFy ~;KH0j;L=-^0GO>"q?&*4ZƺWJ?o`2ͣCZKB|T]oF:i8dA(-]^&>:PlZ4MlY3{$<|NLu(ݪwKήCmbN<&mO+؂֍!ggq^QR?y,jSܱ Nӑ:K!B' 0ZdM<5C g1RӟL0 G둏WO0U'w'?ԋumL4U{rJRq,yԂSqxLK̢4<)kDz4t*)Oc 7G98>ivYyLJF7(r e֡'NVFO xZ/lqޥsւG`Eg~BӼ eB{6R &O*O]Ψy)֟4f͞+\'y}%4+ ęWw@oX2iʴ)%WS8㐶2O>hkR'xRɏ}d).sdsϔIS* Y#+䣓9bV{iѧTP?+x҃t>/O*ǔ躒KFzQW%m ]1x/xWp|LL4:+7Y6itM'g名*ߨJ|ӣwuwaKYzA%-ehcMTIqVĿfyWWR/Zuy|>\Hp@$K` oxx4󐌕 f4 IBQ|Č)u0d> ɣݗo2ݫpdOؿIEE0+y+d~  +J_W!9R$CJ Ñ";ZrBYAX-w! `.5$*shOh3:=vTq1xJc7Y]Yho_Jt%:Qx|Г9.5Ƌb{[B$1ն? yVZAڨf/sPQ{ sڄY"?kJ&v>;(㍾ 3яVQ  zC',cR WVՍ+dH]q  (냽uS=9z]]|ԸafǼ3\dQlG A9݊;-Ltg*Yt(G#*!Y6.^i}as™r=7̻~Ǜ:Xyz>_ǁ  ?d-[{ 85jU\ 0K|.^x2Ѕw.Hj 1xsE3 6%Ƞ0١Z0E$$RqQ'8ެYY`o('ɤxEAXC5zz_;dXaf#H1h]J" #Nxb괕~@DC=-hc`g|o<@4y+ LjE:2I9$ {U)j;JD"%2#Gmô.Z);wL!dӿu vOJ m|,Eqez>6.sfOǻ+Nm0]T0o!`A@|-f[7G6L*d圏a6tRI8|zx~+>¿6ڒ <$CkGGx?%ɏ-`7y*c^!_fsSٵ(<W]'%WS)npRStɿTu gMLvp?{?^+7NPZϠ:iȟu >&7r6J8@@s:nC 2`K520tB\) z&s$7^#Rh>yN z6f|^% (\e84`K:*T<9` d 'j% n4ae\W>PM>5rp<l #b5*"+[7§>/应f)9-Ӈ`밚ןg[ o9HZ]#м"dJ7x@uF0IԿ=O-ܴ'ί.?s1 {lH *كFr.OK Z!!`x@SMN c8 Ayy)h{XWg7H6o򘼉edR EI۲Fuw)_V'4㓦5W_LpJM{CPƱ [4u52eW~Fz'/oTQ,v]ˣ~ѦM9-yyiAu0LT_7C@1dywP\Q8rJlbs-;O1kz8(P3vY{F?CuCv\?lg} R!p AM`fe׶2󲫒a*.0,em&zsX>"($R]/opL~$#B?g0ú/oa:_yhe5yXx ˂PA@t ï_c+mWuN;5"G`;>p>~yJZl‥ 崪J\V ɠ^]1_/| zZP2]V;VOH#"u/UF ҆ XRI"s&$- IDATyPHsTVS.$Ee#_x<" mKѤuO vA<Dz 0vwh};̻8 1iOZ1L4f"&۳ː 5ZB;v*@Uk`e @ h8oz/CN3^]{U_s藏`3Z0`j|PiV eƇ"Yqʡ᰺:յ!S]E&~Tl:wn% L,QƴԈ̒EH+.ii+ ,c% ? >* ;'uwl˽Kd GN;O6uocNU!֍ g쳂hbϝ'd"/ӂPys|y+0#t:Ǡ18f<>˝T2M8[=l?W_,Z!iϗ}5$~m_Z|<<~u+)_*? ҆b3/Out˷#T7J=.01}CB\XZDcWiX?UZϝ.Z$oYh1iŋaV\Fŋa?I;]챵肳Cv~.Gu!>k\dĨO,*~n=te:=A '_%`}mA;Ϛ=GQ,և2@/N S,,F|P.^K߻H!6i!_PʖLN/tg@b|+7jڬiJ~g,\H!\(;6ȷ gqق=k.v^&9&"ČqG{oڤhL~s7oې适^=oa W>'k.t'gM7-t6V}Uw7ZN+q d8 54C|i2pN_hz}OH ~cOYVBg29}t0Fޙ2yKUJY&2pА8WʐPgoYl+_sNN>gnm-jcYŮwnԊ{'WZ-W\{CسA:!n:]I^ اXz\za:c'`}o'GȺt𸰾>h6m_r̝2pL~-lYg+/$x8y7 Y6 ~˦0 .n+va]~-XP>[ d|kol 6v8kR;z +Q ^Jk(Ÿ⻡ ' ORܙx͚ [NkV1P_ܰqLQ|Ns&W@<$c̿:mfJ_J/; mKRg*TXԱَId*<Zhxĭ-Q~omi%'yԠ I% >)"Y<yf-t um, O6x?7!6~bdՆFVCCBȤNc:l9pW-y"A!Y`}XoxFVcVPOqCJ@ A4X(ࣕtL ?) Jv ˧A: ]>ZL, 7^(KUGQe3@iP=OIL 81@!Ճ7L&iCIgKAB_Qǯoy8ã)tg a'VB9+< hrR8 Һ-97B&~H[(0BcSlK/BThvAݩ><{'cT0 LK\(pgw~J2j2㫜zGV g R'U%(A[Z248Ӿ]'Ciˋ_Ds%0Hb\]'CbR1F*"Q&`A̿/+m!~nNqghIh|uނe?6+=",9G3AE񋔀 x # r`KE+ih8aUDBnhqK7w,2i4ǝ=w]:m?:@Y~ ?AlMo(˪G<(SrqmHUtɂ8p/@/qv>'Z_l:^Q7rub#3ۤ6STw|X pIVJW<~BAszV(6꤃-uڟ|tߩ4Bt~e  [0zQo4_Wv,R<ۅ*4ߘ$,˽MxPˉ ʊ2$4'6P<*-YH&O#Ky3'/_47\Z{ c8Xora)72sRii3S"Ls{g`1 C=ho*i֚*N;wjOȬ7p =++u;~)mnпͧx:ߌDCe/%эF fڞtR ?@~W]9Ⅿ120{ zO:=ǁ:ےCjɷbrYb{ןjpl62a007iᕘ1'A+7|~ fx2U|Tg߼D2P͡! C2OȌM2'ONh}H|\~l1︄CK˒C+O>Fur^ CeR'q˫=4O!Xf 5*SV6>1yP/|?5|(mI>K'd $A#8tFc02͵fwYG ΑKcn06ׇɔi2mDjBv)<€L՞44_P(?FY8@Y=P(鴵9,P0;%\:3e*?dw bgSfC'y]P-/Bu3d4h =pX/?7qKe|q&ҴyU8U_ AEH zr6v8΢€Zxq7WxK&N7w,iת=}[? /3^OޯNlc[$` ȣ Mq7vL"HF9C1_ ZF,A ʖʱ|KF >#GMm+X":9sly'w~V]b=sz(_pǻ43Fic:"Ra9˼ŀ'13ILl:}QxU?Y>P;_ SuUU []ͣeՑGMDܷc cYR~<[ *#Tۢ#X ToL SQI'=kGȃMhIB~^Aegdm+COn2zt9C4@]+'|pi]N9;?E\0\Z|:}mli!5hv9i.C~eMwy7y3M۶KUQrَ4PQ.'>EaywS,mA9ի( ƃqGݶӺeeq |2i%zj.[n-p%H}oyIV]~| .{ZU,_JC^FGYC~fhH li;}WeثltAު}O5~koѧǟA5ҶeS 4o ;@ 0bkd\2]Xo,@&=p0Q6MвSfORVXH˧BCfAWqB^cD-=Fem z d0<)4YZ>@i|$մN/ٳtʢ._Ah`_YUN"w݉-V٦m[g}C]~E?͜>Cnf>lZ,ݺm+'|$9ȣow?*^,/7]zm.&MUF!lM.^|k|~j_q8+A~?ɝ/9{={cFȡ=X'1cƎ^|YNu㏖0Ι}W}O_?T̟5E~zE}\Ǝ O=|6zlyK__{}x)&!8:>N=eq1Zݕw; 1=ʉ$v SmUET1w9춛mx_x k;7{4k9Z]F8ߟ@06>e䰏 j[QD?x>KlwGf̘jw 'ʐwcswiڸ??twqyGb;UO5n#@ƌ[;rመ(^O a Wj< >ho*Yvd)罇 IϓuӜsi&K-C>֌N_1R"g[Q?M8AX_rNly ֛)3Yg~q2mԘ;f n"ӧiٔɓe)?U >>G){{k=Q}.;̗ _ы"Gs-l;c$q)XѰx.ܯRvq ܌=f<3Ҩ)K '_צukiܸ<ʇM7^V q(;_u:n|ш g&Mv nekcD 8 Ma,,rHŴDb/ylNVx(>LƚkyXph~/W/q,kZ)Osݻs=7M&/㱝sϿP ~Ĺ뮻֛&^9c]; amOSq曅AvgG[nEYe-@젼aY^;`̘9[ڵmyP>d8>\o^SN8P^ Q;5M>S|.| g3NZ8PbwJ-eΐ?ط rL" v+0,DC^AkM?RXaq}2|?)UEP?&^&v+5al<#tLd$9o9&xۅ ev3~{1͛ߏo߽t͑~Բ{'}[VNdύW qАo`PgUR")۠lt4xetphSŎlS׵N/27GC3 55]yV ໃ)%^GJ1cF&Z YkV[ɜ+r {#V: R>< ,ʫt"pgida\T݄Ğuyc ݫJr L+ʖIM7s2Q.U>RRh @,aKb 1q%Xc<=+ ΂ BAթ.jЖ`]42z]ޜt8&D޹Ab}UtR<j:q-3lFx-C@uy%bdBqzAoQ/>dر2{L=A+VbܥX'+ZY/[ 5R'ISwyMhM0aT{;v-,wߟ,v\r m" >"ʵ7(LeθЩ :ЊM K49^ZXYK1`8B TɘA"'l|=K'k1~c၇q˛s<V Y˱;˳/;(w'Ma$GΚЦ&M.ڷsZI.ဳqjnj MT6?$ywG&B<*: vpBj" fAhǤ)ltl_,g )fA%H7cKKKx+?"dr;׺~/)6mnpӯ&u"EՁhgv͓mI7sn8Έ#%iܔ)STp#+׼9?΅Ļtli_Clʴ{t 5_(Pδ\tY+V*x(|kE HheW(BaKm1g>N.@:glݮD;_jAǼ2IDATGm PAewY;*q,.LlSpWM.?gXgoܸtS&>J#y 0jU#[~TD2J~FjִމbQXU%&Nmmw13t{9M4TuLXg֥|п%z* ؙtbB4$? =9.=0-c>OP80Yp6L9hR6XN.I숷6߼tU&LK^h\t񏄗|sO?%x.oxpȴ]?-P9,߬W.- 0O#谒 "miݮM\S-w"D@9 6kJKad-0C4et^{A67YHs̹far™fGL^x w7#?#tW >ԠHs d(!n8Y(cᄮevh|lޗhH~$ZV1rYAnwft^om&AHxoL{|fxɚ>k\tVy%ٶm(,2{rߡZ0hHq3ftãqca5*ISy8ᄏ)d5߼$.~awU<=}ygT~\N(H>gO+gϖ/Jn~8q'Y`iH'~vx0׿^Zn?Wbz)˕Aڳ>j=Zbhy;P(r: qÌ2R^YY)ڜ(i^}.wi'T0oZQ^R.3R,_N$\.c 4P_[\OI~w7FÍfY1W|ϽdtRbq웴/*l?K#ǯx 2x4c7c}5v~Sz<Г۱C>!?ԋCXݨQC<7k)QQ )HX|Ě3|i9oʀߑ#fr٧oo(Ю.1-wʚˤ#.}&ځF)ah;L>4=Sk]Zi}vY#m"&g:aZ~a{3_p}IԤNsRqN=*B\:EȘd8<\k1b֕[6t&ↇ]"ΝP noש' & J &#c/7^g#ٚIZc|u+,JF&yx~[ozgkdYj8OK _x^bӓ&XvJ8_ P[>Cob<C9x(>Dd%jK`͢vG^v >gS ;ַ+gժ#4G79w4]}`?a3o!sgM .;N_~uQ`(Hg^i;S|;샵-U\_h_|5VF?OGD1դvefU<S:Z?Ztb^v}jV'+'Bm |/yYRr - f̜Ϻql62o;O9y{;ž!Ue[^LOUƇ١XBș>@„x'>kG8@pL)SR/Nȴ?7eQwx9Vo}Ip09 'O=>! @ Ш$d"yF|E/Uy9d *'=Z^|I5{yµ>;׷zWI>N j r;Tj;Gg~K̚PmTM+ KCQ  CSu?7 G)]반a&"USa_1LqyCir]0oƎҢTu|JQNUyc:z|agzUO='ݪ6 C B1)iVj )1hdjy@cUCDa7SM+㱞 % |qcg^zMzmCvq;5=>K.f.ӗAi]چD$,ù5yx-Т Q)};j'Ru4h0n3#fzy^)|wjZ'K_̕ջ:m'nuka9{9T0fz旌8J,~Ҽ2ҘWH[ʳMfh L0t"̇jFR+DbBڣaI7MhLVerqC]L3^p##ѺXvzgYm|9.ɋHCۀ{j4|uz۔QnMS8$Ϛ ĩ#>s _Q'易[:w||"Sz YLUv iwl@tHԎEM#HzTH!ӟ) ftܞd gveB&ԔLZsjY:1XD5K>>܍Cqh7+v[cjg*-tk;YmK!}P2xv Q` Uu==Np{0_)twRK`]1N݃}3;SJ^J*=-҅_؏巏,Hjv0ⱅa2 +BJ)Ly>i^A|mvө<Ĥd 2\>|5{>! |Xr $2xY2oϏk}SOkee''!l2$$<2GyK Y&&8AEvнO%D뺡g;U((~K:nLHtӌn>6  s~*HY /؁4 wz:2;p6C;k?HR?A'u4f7u.A/濆yqIe,]g| VȻc>Pk#UiJTPx 9բtȳ#=1筘=Q*_RC<+Pe@4VEtԅb1gB ښS`![@B澨kCZ*~bq7M>T C}6 Gg4!崖qeSduDw\Yl#b;<<َ<$?4C̓C(1@I,KT[3iLG]ױ.#=y!N00qȡIft2zoK*.=k&|m:~cǎ `Fk63712~b NO!!ڒ7!>*_\nް1Nu )xBYXNfl(?$s!,yW#{M`=lb` xY!6tL}a;κY$Yx$%DM"dr,N;PؚtA\䫯K SW^{c։:܏^y-ؚ6~b,_^qGPNdZൄc;+*W ŗS-7U:>_JfN4l[Gq@4 DgϚS^=I&K>k7kqfa@,,# 2SD2TC5MQjr2LJ G{ UVE$4@ ]`թAFu2=;=7ha{h~fy}7dgDSs!ܱ0_0!ȮϿuhKeRJ4g4X|;mCaa}l"Y8,ŏ|VҲͦҬyK  Մ8j{G>)6 mͅSDve>f^_>H4ߤj.=0+*V5}U\j߼E+թ)|! 2ѢϫjRx#0FO>An6>1~g[JT/_h Ni;Z\ge5@I#>!̏ER 0 2λpָ>S)R l@T>|ǿ||U9L? O6[C,!UE'ǭ \_W׊>םוgT<>oGܯK/2'V /K/}ӡoDN[Hϝآ^1 Xmr_<ɂP8T؂ٌ֮+/+[L|g~iNܴ N0d4aY&@,+LE-Pe]6+}T,/6lkeY#sP% !]-ϣ<\rk<5@tr)&HL'/ZB{I&"n[POZS^|״0&X R%x?V;EE噳IIz3$™UIyU}e눌nu œӠ*-%p?zX1;oa-ΆcʴƛTϛm)?;N\'Ύngwr\cڴnfU?VJ{ mj.GڟVa9x`ѵg4?2cxd!`][c qfV`;b_U5b> =lg ?~]zBCCqE(֭[ʯa˯4߽{] =}^Hh\uw2)56~^x dBPPT:"fO?eU鰵N"ATBx/>m }+.~/V\ [x `cknE%?}sxgL2HT} VrC{cf5~?O2n"<9lV./`q;xO@xY_ZĞ; hY;"p݋?;ن&밯n%NkeU*CUe$ ]t1]|uL_|b֖.___t 5+Hr*΁./9u꩓?[_Hڋ=Ey4/hлml{a?#~IQIXB]:UlPbYGu]1vCeӘ:ir Q]lŕLyEzGN3mD MutitqvqfHu}k&Vw"Wou C>m^t\|:M{YV>NxQVQY ځ3<]Ђ _Ċ7EnO݈WƕW!!8hUMC'=i{l;NOiWQCe;N$u>ĺ_E1nx(,.EnA*IH|X3.޽{øCD3R]H;#iw>bRJp@X05.%Hk3|{o:AS&@lRrSGdB ԘsX~&"uquUqzDGǟTqԧ*\ jl ^yɅ* ʟlד`\!ctC[@W`F#Kwwxjwgl}=^irhf/k3ǂm>xGPekg8b9ٶf~2<@OW/t.{n OPQ^agFLz"r 1߯i1Ͼ"zc%6;Ϛ)+'qCZa -//SWJ$LXI>_nNQ1l0k߀Axg3Obï0VᏇ VX8? ͕u ,/iLN\JaaxZIxxބx hT}qDp4K5]iyzMK-Dx`\yuq ҴH[c )&F;׵0S[&88'p ;9T_WU^kf|_tۋ ̟=n9Ŧ'hf.Z67_5vR~ЧuCPYSS6%]F+WJh^_2"*ul:K(me?H%ֻX7cbl #ghR^^u4 `*ybOS!c/al=^\'QT =%7}T4GchZN'q?+@KV:CF =)7~߭X/"˔ e:cX}KAM#UsPH0Ʋ~[M,̜6 E,-H+#RI6%xL0Hm#;_ ycO"[`}&j.KJ䍲)gF^D)  Eƶ 'Vbs*0|NH҂7S?O P*o+Ѵ9Ҿ:g,N[+rU0b&[Tn pDEz);L'g-*JP,rlP&/\˿·˿>#|6l*e3l9%K,F@Zt",qh+;.E4bwO+Zm11Cig՞{P!sbjZ Nv3Oxrl!C=fMsjlSw#U\SXR>^{Sɡ!G0!NtZ:(nԥ oIyE쨃+ i|$V:0L VM;1QȡgE??ګ&OA@h-&X7φOZ"E_M/Ml6$hѣpXvM] @8`"G͛^)ֽ7vm]GEBPW*5rX,pA~֯]1/ XїoqXn9'Cā{ЭGHh4B8`LoFQM|yYw/ ҫ-PThXdt .A=risi6ppP"v `'PK0Sq/zYmHO>?t58DL''鬂6QQD>ί-N m;N_g OIcѣ0zu{zE}bR2bu6#ч51Ö-wڸ|ϝj }@D8[Wcԋ3pk>ɓ7 ғoLКy,JH;}'gW853O;YfOD{ o7^Lgl]HO䉴Ōȥ-[UIR*¿P,kYEA#[Q!!6NIq%1e# ŒR y=%U r3ȮQ^DcQj|4igh*θ@s2s6J_9 ަճZS+ =MAE9ד/ۏ q1?!:={>ys(}:\ O/_7޾ß]<tp!<<;3 hHJ#M;l7iC:4$‚|ݽ&./eiv]VR7c/۾L2iuΛ:׿^x s .-N̼2="1!0,>Fnˁ:a ' cyN̜4> E"jQ`Ġp|xdi|w oM m84 p>B d"aǍW]@8[ƏWP_FICֵvQ7?AUnmiOdfpm-j]ђ~cw3qx8BIHą3`;#G'd>h\cu7UWNZ<&ĥ\G]iutd_v쏍WcֳBPgo`ߩxxGAÏu*8̜8G/7{AYi ++W)1wA.z2?әؼ+ Ct{cCc֘ ۝>GG,=GA^.`8Ʉt}wt%~ظnT~-KSu8M){^<:݋щcCC3&͡c՟Q'%)[eW_HPMT\{׭?w߄rUKНX ̘2ѻW5O;e='''=ax߷?Ͻb TTmMP;>]<#*6C+՛KQTHˇDzno?fmLZbQǬZT8AzkbEā8u8:7\1;0AO(vBu~IF*JqސCA1|瓞_1b"@К1цb{Q*Mao #mUQ'hJV22sн[Jˑqia&WTI$[LҘXF7WmiSE#95^xӹ{M&,Ŝ⓳00<9FrUKmRCQnl+1kT2K]P\ǩ 's+ˡ)'JVڍ]`iPREqW#%]OZXKTi3kg¬(+"G;Tdp *cOoo򍧔 [_l?,N(;!v@K5WlO6ݔfm(h"vBQE- i|U/IaQɶhW9SFwͯ"n @j_d엃d/sfN7GhC/w|7 IDAT?E5gHTcN]{b~|pZ2WDZ'`㖝1yh>W>+薫/@+0eDu4Y՜d[4)]wZF3yTVex;[7} <!VJ΅^'.<~qd9{ӧZ> _TZV4q԰)l HKqfgB$D GK8y\NgD2tݘzZY4L ʫl1ellwtқ^p v0 94{0{|?L<[a(q 􁋻wq66lN]c {ժ-<^AX6FfWqFDC$IM>/ܸd}am)ʷfq {H~6\ɃKgl _BDSk+SGƣ݂>Ȇ|S<66M E~>;⌷\#"{sŵZ řF {OfiNn{c-|5Dl _̃I>Wb=nc:+[_co|_{FQѱ8ESGg7z-; Okfƥ4grr .$cE7/yq\3riYbGyR6WKg%uoZX[n]hYʭKg˭bR|Mè!|ޏ bH-wDYewsᎼwh\2"^VË5\U?uÿnPEs'"'id+D%273҅[J krZKY5Y88K9.Z@c$gFN1eyK1u#焜nџ9Q-sZA@vA. iM" ,]EBA  Y(4 @'@@ tQL# h N`'d F@4.*!N0EA@0i\$T:B` `!@ӸH t; KA4BqPA@vA. iM" ?XYY dWwKΥK[A}!ٗptwq-ܜ | N&ZG >?oRs_!+;Ǐ)c) 4DͧNujINI7t:sMpu1ekc'; @kZ~J3KK@2hqZZsUNcFz ''qF:S Y_rվ;véS ˇv䯒=v ;wP/  [A@,Ce=F;.RU)^_~Z [BBb *(}<߻@vvJ^AՏf"   {5;M;o/itYY9Tawܼ_">z ڢH4E-CAb6斄?ɍ3uO~QѧOR 뤗A@`Pv@S__?oް6aؼm T3ylQEy|dA@ZU ^y|y]jfn"爱$&⧚}g' p(*.1N* Vr ~ׯO(ȩwQ=//OM{9gO_$@j0 SaL|B=q<:֐)" 5V]ܻWL-_4/̘''GDAdd4/aGOʐA@ =VU-/%lq}i+ҳrq". n6jo2=  /w ,%zIGAHȁ=QPTbх}N"a}Lęd1usB0K6| M/:0&R{@ BN^!1i4Ņ#OC=7X֗LZ?y;DFfhsl&TWQD A *%  ж-R CC%ME@mAB@,i -Bm&B`ISAml[<4A@8<K*m@)/-AiqJK ͕jIi C>akggw8zާx%oEX^VTxQ)  ?x87YD  B R$&$";# N G'gKm0eLM`71 .Wjq+% &(.)-@zJBzƶr~E6 ғ0pL8NĀH 9XA@,E@R$ t;PJGAR-EL @A@ YYY׆JQ@@| XN~)lllԯwfw,//w5S d:>}=ܮ:y,XP'>33N|S.]_IQ}Ѧ6k)n :N8͛7c߾}@k@/ X|#A wJSNaǎaJO5Zjon(˱}Vi nVhU|Ս;j=RxEPQQqHЪ-[(Ybꫯl]h1FFF5O-6^p8v9;E7K19xyyn=rHЪȪ,ko.kFuo}}Yr%fΜ0\r%`mєn€0f5yym i520a!LaM^ԩS4|В`ݸՏb n )S੧޽{TwVs qu/@!ZXv 6plj'*|5pϛ7/6Ί'|R?*|ƍ8ոǬo߾Xt)VXaz!o*OLL juSt z;}it5`IUG?>^Na!g#Tsrrt=z0O5'ӦMSu#F T+R3ԑ⮽ZCaMG6,b֯_?#cs_5ԩAS7EݰaᴳgѴ_51f,2/2C_z%nj0!W/\P S3V::{=nȑ:8Nۺuz-O<~>.66"0Ր4^sHg5 pϞ=s ]ؾ^SX_R_^ye$/:i$e;d͇ B^TM |X>5Mf +":[s`.nD{vK"u kvsl_;x (E\Y~wr),XcM611Qioźuxba-5\_^˅]Vڪf?~<)))*ߏѣG\4[?O9s(ŅJ7e+쭁"ئZMq~vvz9֨nfj˜tԒ-F\i5rjUX0Ѵ?=4/iϸ޷7c"9O-qGGGeplڴIۭ}1oT%;\]]U14iIq#|S&?bd2bmɓxLL$,|ApZ= e1J 'VN]S[nEvm<]4Y-mk-c3Bppli6jrMxڼ~uN'&G1hiN3chi>c e=tP0:ՅJL~|jrZJ wয়~R_tEVU[;M5kZ̮M}y p:^9],yLt.Zg[;616&.Nr{cԅV7]*99Yi<%kLx;XL-i,_kY7O75Z[f[gEk'dꍸ?~\7U~^4v?3yٔ0͖VJgnXLj%V( Y-:k&{ s ͧ-oA" xfA! ؎C"g ٮJm "@[;{}uRgR(E5;fsVi  dr*V՝ޖhNyF@"qYm0=bZ*"@{EUή'kYGg$^ssYm0$OdXt gVk$ -D )$*2 A4jϳ%~^^F wZ .gDg?'d_櫖%iAC! ءS:# h ZV:Bj83 ` B%iAC! ءS:# h ZV:Bj83 ` B%iAC! ءS:# h ZV:Bj83 ` B%iAC! ءS:# h ZV:Bj83 ` B%iAC! ءS:# h ZV:V'"gJ>ԡN hG`#غ}KT2[[[w)лWHSY[Ғ2899Ϸ/ )*8 \'cA@8˯ 80i&bHBs1|jkTT^^WU kT!e @5ظD:|\5=g0J_#)%܁bWõ\'Ghfwqv2YNmNχ 4 o/OvxXOa*mbb*lۥ4 t1z \L3΄q#kAp]iJS ܲ *_jZ& &En߱y"k?b'`{^ddf=#w FRr"vӒvw´PQQIq{u$=(nذ3A@h)t:规"*d tsu'<]iY9VbYa"b_bR*.t -2^N'X(++Dy22U\Aa1G¸1Ce_L/~1HNQyYi+Jrsk !D>s[0v*]U"7/%ŐOvA#PA[rs PQYJ!ڂKĴ,Wmiܩȯ0ݧhTi٩0&a/ᩇo'C'$܋d֯O(~5zBCe/cΌ*O\^cd M Wmy{{# ?drݧLL" оh[ ژV&=MRRQPPϞbˍOY᷍jJydT(i<5\ikk'ZD&+HKT6HNV'%&DvUaa=`Cm+Вrd>>jMK#Aߊ5"mӦB@mJl dAGZǹ?\:7k$$&qI$ kndcR[)iǚN;nl? 7n" l݅ϖdMx:CiYS3Ԋh3hJkJÈM= \"={#C=r&g 6H`ɢ*w&99x= Xx-jߞS'DPPxcd3^WHK-_4wbCf8Mq6n{)[ۏqt0^;>buP6l'\ӔJ_?\wb|h9q Ɏ ^hS ;5p@ 5~Q'y$Fyhh KPASL;.^0 ?HhIDv%.#G FNi'eJ4M.u1m;"㰐Ȧ..NpquQ^>T&ˑ8ٲm\k-pSO/fa\B\/])MS=ɩLdP&eDDSUlg8082pqr){`Y#kvDxťe5k[78ZUeZH_\`kkšx6?a"mQ i_]]Eh:E.S]ZZZ'N 2vJ\-bYc4;mn4IɬĠUTY[gޚ}~䎗K GpWдS?N;6'"!@+e:Kݸ@@;@mOA@B@,$ tD;JA,͂I @GD@#IB@,$ tD;JA,͂I @GD@#IBUO BzJ%" X~.pvc+",/+Evz**K} aٝ^: J^J:7xkAa!P% Π9:7+-!T!350j0k = =% A!Q G,R*HKOAC0y8!6@)BZrn2lRN \EMec7ܢJ$ Dox/ :dӿӜ& v W$"@{C3n(I7if`yYrxODskB1yy{]A" W&+S3 =zt7nȐ!M?__~Mim筽=zk9>D!44/AҘCq9r$>#TWW7T@Knw l޼kMvY@II :IHH Z/SNaǎfRYY 14%LocccW_aĈػwfmݺO6c`ld^~r-xIe:ظK6]b }1}ty2(// KEE#A`||W"##8K.Ŋ+ 3zæǎS{0 RFH0bOnc꧅ LB$sWBիꫯ8~~~0"Mn=z ta5TKG ]bb O?txn.uSNUÇ.::ڐ}ud qt#؁X눔 km%{#.LGo4v:29fp_.jHgeK/4t#4\kacwww]``4hC\{ァґTGUqrrґv߹uo'Pg}VGEcWC>x-b!4={ **[;8ktRcmYYYJ}" ؾ}(8X^ye$egugm8ҵkWãl5֒XX4h.Ru|ըzX\n~gРW)<==ѳgzuqq1^N6Ma ;vn믫پq^Y>~wp_cKMY۽{7ƀ[oU2YC2]VmƏ֔Y;yNHM\jUlV#@nH|1-YD/t>Y/SI&wUb`7n^x'/̹s'>_Ț0QhmUE] --iVb3n͉X3qx۽{w5e9/?ꪫT6$Uݼtic5~=Z:׏?\7_sEk{$C f.s W\qAhN賘5 lcaj/lb);ۻ4; XԒ--pZxí=jX[Ҝ ]űMt٭Oj48>؎KhZE odK?MtiZKÎM/&?n۶ T%>&M@Zl;(|,*??_ɏm,md2JO׿ɓx!&@˳i5;zhu|r=(q-fmvlit116-sXQfMiiN3}hir%X]ɅC(u}S򸰧>Smgc Oa̟?_kyLe˔]'䱚1c:tH柩)O4?m刵4?C/k="7/0{pB๊\t}rp8un*l0Jtt+ISEy4хe#*^/0oڤyM0rpH1tNr άYT}]h)/mKf,%,c*{aXr,rD0$;a<|7זa U^`{c 3Ϩ0NI 5ι_)/ّud_nU'Κ5ʱ4VלAh^ֲ)^D(E.hX`mBP>]lJGYj-Z_+isíYF_KּΒTkᬩFmga5풧JV:NݼP)lcۍ٫66;O1?Nk4V%[>V_~Ei䗴 dz/haVڰXjh'ny)(uMGlJNN?}ӫƄ]|Xh@-)[t\?칼HMݏɝɓ̦I\T:sds|3 r-l5ZѮa'@0_d6HNA@5Bzxq `M-!v=<8A@&BDWv`i X!@k+e @F@]4N5ѕA]# خG'D@КJق Юl#k" hMtlA@hFh~   :R/ Ё:z'S``D 숣*}0{ LoAC!`>rHBA:# PS!iA#`v`k )0EgtZtMFl PM) p!`>d | XBlAC@3i xr)F ˘I;A]lq< Um##nK]Ħ2l8K2X@-S刏ʮF j TiGV4'Eb*l4q-cLg,D~QD/oomMTy:$^R4As8= .pVe]VM'ǫ\qd|TlЙs8 /a)z(}]lծdog_D ~Ws0`ۙ]=6̽M͝t6DfM☐]b ?n5_snhV9Zy-ٚ70YF'ximݡ hf}ga7^ T277\;oM7fn6ƼsHt9Ϛк穖֬*I =Sֲfi3FaͅPJƒX>WHd5.t/F3e*~ߌpۏ%z!FQ˗z.Jvsrn5L+[Ɣpsԟ|+Y|Si*9f4>l׳շ4˙q0Wx3 MIٚM:bKVJ*tjjeCHjXe)~N@!$nFc0nndV5Bl02;- R~sVߚj-+!ڣq&Ön4o-vU2U*I]*?s\JW)L$f2` "quՏ ΗGTK9+*,ld<7q"FxAcG <#a|C7Q{ѽeAGC!3Uk- D \vnBlgnm]I+ ~ɨ`Yۨi5DGlqS)@|9{?%/Y/u%T&ؓ:5T\o㙤qyдXn>"4<wQ1\I$d.^eE3F:#G6=39穽~i8fߝ'r>y"<]4P_ޘ}=;+P"CVlZ?!b\kƶLR vW3ɑ+i/t]MkGx;!Dtpғk)ZC"{i-,tLSdMӃgM]ځne+\lE%Gġi >\J\y!vRXdnߌ[S0kR\FdXOsqWՔ^4$8cYuGQmC)@衄^I&'Xg?O}6 QD@D#{Ҁwgs'& !mvΙ[NۍmU?GA)tj~焓ɛי>ylrseDS)C^Eǃ⎕d ~f փc)K?ʡbr\e}}޵xL#Lڲ<Fʂ, C a]}-{,+;?ٍ,]XN01U#MM $fftS<+)` ,9/☢_7c3~r{ /8zY)@.fsvw8 /#kt`Ozu52k}v#|rXeb.*F2n X*e@z$/̵=5FKB(U4Q&VR]i,>$@d*kϠRL?poAfsg4[n EW{bɖa?i'kH[-xybZWȟK˹^@6{U%»a\:-vr$$;=s[m:@7yeWzN^@'9.aS7 IDAT5H@ ҟ#9ҖIS^L*-fCekiZUi5p;i6@8 SǢޱB^쐉U|`&2.ueX!}IG8oJ,Q?59.d˥&$k7-CqYte!{p3 @ܜqo)Hev^Rgef̍ @cs^ D kF^48:'qۀJ ז/eLRS-jȉlޞd/NͤY%Vg2>J}`b‰QZ&:6v[ !^8v>-9jlA6l5jx)"}ws&Cv}zpL \X~0nawEu 8c=WcO7'6XI dŏNͳ2]/Y3E 7IpC ?cYѱ| Y^8? n(˹ ѦSvlɫ}q9MXygsm:K-&ApOofA~ .4r>v$b+6y4'gחuk'锆D Hko_Yش= M-3朾3\R?T A~|S3XQMy.`ʶ +i،V -Jubi' l)"ʱObר)'b6 e2?J nv|u׎1[qV _|$rx)X1D́ȞC߹W42<$krx".ըJ 0 Jjގ[*g{?:=RE#0~;,"+8hE@(h93EV'E@\$g\SE@PJD@ DTAP"WͿW KP"ZT4v,. 0*(6d'E@P1*mnĕV\Ծvm[M(qC\TrI ԽVd<-YPr*r޸icb[\?+gV%E@Pp*&/P+ VH#ۮׅ RQE!P-΢'-gjW,@V1&5Av]ʿ q**@':/\A *D2d)T3n!]՞k6z" hdUtrD&?oXulLЂ'VN_Ǩ=Z"B&X>1FeSz { ]TDgD=hVFԯF&FYO+oIѰ+"P"[9~^+FƫZͺ\TnƠCM\'5)z}8Qr: RUE P Y>*@HP Z"J0KGE@ J!U+Up@@ 0fI(!A@ 0$j"(,iE $(VTP%p%"%*@8 }T XRE@a"CV(က`8̒QPB`H`JE P Y>*@HP Z"!'Ck^:0)փQ88TR/SFFEEEQbԲE.-tn54a)ǘB| M ܩmY4m(@!&4y:870\ɖ&ӂ< JxORf,K^U>k,Z"F )tԬiC+qnϘOh]9Ծ]+_ w_KE@(=A'!IEP趑hSq<0V^O]iʹuk֨N ԥL*vd څWО=ZBUj԰=IwEKJO-)(?M jӺ9UPncʵܿ?׫C}t9Ӝ5gݻ_ߠA"5mҐVΡާu}S{t66~1Ԥq{}tr+E@ A%@۷ޫ+mٹ9ʟ-JX`q4'ʵh'GzF6M+_rM-p2Ksyr1C2h]i6>A`CC;q~#ԪY]k9^{ЀޢE HGHkԬG~8E`s ,k67]AJ{ Χ#u΀k^u/=.F&ON8hJЯU8}эWk7o|D fdfl m )1}A8b_B~͚$N Uh/hʴ9X:ӧm,K_NZS &i3\WNI-pPz7А f0O@LtܖF^ 5g_*5JKlٺ~gĻs(ykϊ""J1}lCp[+r󯧰P,2#^͖Emw9s-a%6f\fΛ'#+G΃g_Vop,1.&X.kٸ)E UٟasQgnibna7_gI%-BRMk@PB@;ڃUVIp}L޽SCl}&-9$#;tVZCF($ ?5''dGw$:̒أy&K#e*)B.nm9p p?K\Nts%Mc`7v΃hG:C>v'vZ ;D]NK"#O?("A~@Z7xާn΂Bbc* Q_~7XId˹t:ew_fΣ Bs#u# 'jWɷV`]&󱿀 FYi;M1_XS}-s48GFBs,IE@(njoך:e]dG&b[zK0gYZL|oeb4I ϵhބsoWL,RyA^ըWN4fr([ o$$`I]R89/sh֝cy)e$iѬ!MeۅVq뫲%$aZR}z^PJ@P-@tcThgs6ZÐ_- Բe3kۊbK lYן:wl##Zr]LKs8VwX\Rc_̦kB=ZE6GHY.gq *Q9I yxh ?tN⽄\~0(@ Pae~w\Cs,^7o7 :k}xFZ6m@ llݶ7Ϻ:o-Q͗X!jr̯%o;Y\+Ul-U 򖔝TZljL*{1fmި5p\va N71yz)G5[gLbH4mD8غy#RGqz3gr3 _k=dMm߽m,,_2|Ubv#{ <آl4b;vl8aO-;8K9y ?ZY{^Frk)d|e "g`-q)jԌL&~rT,K<j_r{{Ȁ1.*+NZСC|bb">R+(\U׮]K3f̠ E#ue7n\` y_̙z.qB(NrssE(ov#7x#z뭴sN[ôdqvy0п 6L]v ~̙i&CSxSTo~S,dHK/%qu_t^u0`/O:a $XV$Rܼy32(XASONt ϟO4k,:餓$u=о}MtRy؞yVAp7pC6 ~XgqM4yJ0;>|xsE}(sUT_<^:1j8 eE!%@8x}4h5oޜ` ${졑#GRvGꫯR+sUTu&ӧrO# 瞣~Q&Mj5j-^XΗrԱcGyۗ?/AN"c`~'N59+}͚5/5"Fٳ .vVxB,GN;?t9s̝;;<ݲw2Nxs94dK>*zac-[LI6m8}駶'C١jZjUC#QPV-iLHpeVW5/yL9/@^ޅI ńf._쥗^<^k׶˘4EfVƍr]Wug ʖn{n9q>ftDo.'M?|)c(NJJO8qMl1gO~Xy~9(eJ:p;WLGWv-| @wtc591v_xv.B)3^z[[o)btbcc-9pz׬{L^O?ܓ^zWa>36{~2 ʕ+y]<Ç{ʓHBL\L&@UX֠A:VVc.ϰ8a8tgJqa٭v*@xie.` "/,}A| TXaB!1w]w o޼y;E?'ئpV&,O?$.\wՈ_^dM]4*Lj@jĒ7`mM8QS,X!#@CrȮpEIaqB~w!}7QT@!={$.W% \w]oiqmqE60c6l_|v#PԐba֭Ž7uv@\;v쐪y=JΙL:p?0aKWt5y7qw.H;~K7Xp`! qK+ԏCÆ q(+SghED.`hXЉyBܘs(1ez\]D cnddu@NAP{w}W`,1cƘb{@^ڷo/$/8daAj [ w {qFF ͰGB~(k֭br0^Mo; Է} k 'M!1^`8E| $4lHDo s[7d>[m]W@(%y;Ta>i.+)"Pz`~ҷW*"(iE (ECP%6"%`u(@X"ӦV`  E@Krڴӊ" ֡(a`XNvZP`0P:E ,P iN+@0P Z"%(@$!UmIDATE@lljE $(VTP%p%"%*@8 }T XRE@a"CV(က`8̒QPB`H`JE P Y>*@HP Z"J0KGE@ J!U+Up@%Aٜ~媏ٴw^y(m߾)''Fp<8t;6nXf͇{=PZlz` J*/({WN>bpҲ,zꩧaÆԫW/3ΐ<>|:yigUNyeffJՕ+W> fS2g·~ׯOIIIԹsgZ*u҅~G>ڑ#G\_wic~Ge7n\` 2~z3gX;1^ $77W=Z{G%;]uz9Vò6l`,v3?M6'1, cʖ.qOtDm?Ⰳ*xխ[>gةd#z/@[re+:v lYlJw?D?6l`޽[ ZO'ڵkE.7sz}ef,7?]vulW̙o1f 2; S-bW 'T^{z/P|U ͞lKrJs') 3.l%,ߓ'O7OyAbv>xH@ϊ*Aݻw5jgMEYn k ㆋ'M,l6n !'p>+(A^ o.IBi?peAlۮdQ[@%"53w\3"1}puYnB/qwy~'P̡T`(|WF.IK0HTOj`$L@DI޽{btAN!GgyQǸԁ=GXxb@T׿WA̙t@6 1(XVH믗6qs[MLLM}wXnl3JD>ޑ5 -7s;DžDY C 3*. w8kXqfqeFl5l܌mbNMFX<Ȋ/sXTPC;55UCl[B!!AFxZC@(<8>ed!Xd5b sh]oN kUW]% +;ӵ `y(;MX^Zѿ! vn̴|Ǣ &ؖ ^cƌo$Ƀy(zLLL*_X`:ye0+acC=䬮@ ,l\C#}4k׮RƐaEŀSpO;#!kHn0@IRukrO~+bIV>7<@p7!Ɗ5ٳR96{iu +}fh92ˈba"2gEdQC8@`!* #NII`<Țc,-*{˽a':@GpӃḻM[ߟ1vmm+Z H&ޡj-؎=ly#@űH}:v8AF>mm=/sf_w#X3~x`K H-i#sE՟Q Ƃ-Gqs=+Q}W7 /󄉉a} `z%DoŅcnia:F㰵s#""={k/Ou\M>W2u]X{xx,zv _D,}hc8i~vX|Zl7Wכ~Nh_IGL^.]u"Y}#ԧͻ66N`dl_Uf3ߛ EWs329}v4WC1~-LFX=%Tyb\ PW\41 mظn-|}}1jHbX/`O {{W p;>>>b}4h:<-C2:TVnOČbѾ;L?HJ/I>.¸w/#5u2)nm K1HPJE }٧t!roխEU?+V.l,wbd6AtwU%eKVo/Z23ЧO޽[Ou:\zеS'$~k֯'#z>/ڴWѡ][>x\=ꁛKFe Wxrhv-s5:Ѻyy8z-.Q#f?a޷WHYp1\ Ā~pӵ{,[)ss3wYHNK~85¶/6ֺHn]]`Yq[%yʗm' cƌGnt[d ssDYCo* .9H=‹"τ.q?Ԕ PQch 6=.xxCn5nAw4_~lѹK||d!-3K\ E^/ !:`bJGgҰaChG=J+ыQu"WcsP7Qwϙ, {\&~ 'hDlB&#'(Ǣvvvx7HS]LFǜDzRp58}8S}hժ cѶOQG)ڑyZXvgg_%zmjj7.d[uLQe;"WlҸIMi,cǐBeccbj88(rYxǐ25c?|m?F! f_4m*Nl_?'nv>1o;*wݲ Uj̄_ /iFL Ҷ"c'Xx;9v#ÄgXDw&=mۋ!|.^TÀ2B=cr!D4XiEX۞NMMD݄s3EN_IXuM67o|+&75(-Lc>D{(64Ra,,|[O/(Iw:;K\k8qnل={!=+qMT٧Ȩ?lPoTD۹@b,Yq 1F~ 1o8:2 5eq,.\+c8$ߦ}nӚ0߬>= Κ[6ShFhh|4i? H%iV ̭0l~/NpBk0/ j/d`xuھKJ*OK.`8t9g0 WCV>C" DECz###sA:R\u*#tYV]^121)\"X -ZI56r؇n"4i2-o,dbezbQ"6mډ1G\#Xf!ð} ST5 +rM4H62I[NSk?]HuhH[5_u|n/:!§mF,gP"X";.!QEGW~zS5BYMs˱w6]Ĺ"&Vڿ Ș8Dzk+isRRѨ~=V3T-Ibٕ0e1^O'},ڷT=SOW;q5,B:6| 9Y:_ manGdEOjxJNNADd$iкܿ16V$ӏ%L r'iײI#Q1fq@ 1~cB׉"7W5@ ԣ)5vMky`/B{KWRjU78xLzB/ZZO }&^TT2ڍWUf5ڶ ~}c8")$UM+ik9~lާWECIU4IvE"p rw0Vܝ˽J$q.,H".J]<rC82gD@"pux{H7{.uVE" $`M*ےHx+SD0gH$jMP MA"Pw!(M&^pȵn5]Mg}^|(Re'Bva**TVt賃.h޾N=zte$uGNa[RH[!Ju"fz礅GǫJߌL14=}7Ύ@n'^Fӂ'H#7"((>fK곡\kĄ^1o*)g蹘Zي0 C JofÆ^ng;G'rmݕaF7q2Rz} VkymaMP0L2i)J"qi~zZ U/5OtQ`k#B>~kE=zQ-}Szkӷ=|X` qѸz 5i-g'DFE#^314i^_ʸǯUo͔}ݍjkLUUņ"^勦-ۊ)U-JIO>$>ʦX:XHJxT9Sh' + *WdO?Fޤ?LA8RKJ~]H/;4Gi&g'*gNn.G\΀_#շ9GF _VUeʳOߊNX'"ܸuv8{h䔯wk튮ګ]슉>AߢiV98)H Ca I˧OvBV{:_bf9** SL[wcTQ+tY?5 {&&F>|5/dO61Q&bN>0 ΄ѹ^J{)Iq껰JZV8p.>H@G'717&UHQ=w D%UWg'+E+=t}+\js ŤPd'W}YuwC2ST҉^f!<,}'>;S:^(2$oO{RD8qm^3S2}Ѯ/xvx|:o1,,Eܜ,_rg@@][rM2+3ׂ΋:^> ~kHIJ@~D:HXj4aK^hhkmV6Yz'/h=n0蟦 h ٣bJH4:E}<Iwݠboa1)Zt` vd ͺPxCqa.<4,31f6wmVddbЅ3#=0o'qu.8y6Nž{a=SsbxbD ߫+S]AA~Ο8zEKk\ uwC:ӊ=)RxG%wo2{wmW+qW&u3?1F_OGd9!qiTݪyc KTF*+!:~Gg*r0n>6~h0\-7-۔Q-b\(q]۹FgE-㣺cX.OhA;sԸB3yҤ5}GhqA0kAQѵL,Dғ(z/-m`Ea6AiI!ɤɘ邴4f?BԂAvnC"oTEio\/?q6<ѽKG y?-8݊ܧg7^ERr*-ѷh`KJ .*= DT,Uk;phK #;o7 HF-": vYXR0C4mmѸ7IYxke"o"m#>|\qvxH'<}A08 M^m1jbO\=gafŒ(X)'O[(8O "vgХn],SL?̢" )YZǗI.9yS_PHкܜЪI=E ێ^MkoIc"9Ch t޾rrɇG;+x{V4]*`qmUH/LzfV=fAcU^Hs+ipqG3FX~7an6z4M+):-۫Lc @~[̐EWV\ 1f@s,߱ )A8??%8axbtO07i$|21nH?l=gz8mg4:e.!WXdC._QE db8r> <$m?& ѕ̵<$fZG;wCKEVn=nX|xy4sŜO,2ew!uGncA:lL\efSo3%M>i@FZ~vQ'J__lF;sAt20/kem?\ύזme'$q"=[̌4<اQ+Y<孳 IDATJ(ߠN'#3-͛7WCۼRts8|h aCMɤY /"x#&?ǂrffLp^(B\ FǞSA;:;U.'I9d9QsUYTTIR_gG;YA*!#2׵ظ}?wlέ|uEőn>7ـ"omb %3ӏn'ͱDZ]vhPKWo+6uFf4tog&@ui08{h^7eg^NL-u+٣c!ڴjCтc: V%箩ainDUxdtvXD4Ξ>j)?=:=F0'*>ɩpv۶nR^HTC[Lub|TdaS~ha;]xEĐR:&\~{c7阷.ݚ7r|RJ4LdT=-r(i4/JYt3ȥ 06EuWrGJzN Sbu3p<^{A2r$"2tR}6UbzVzF6clD#i"*ߏk xb@rï9p.Zl}]Ǫ ]2I)l9fİzEmv{U7n>*mXM V&Z%!tnIQKWWxBs_ŠY˫Buja|vKټR ih@09kb-ŹUھp%}>Lsb4i%}\R^l%-K:O`D:K~a)#=-T~82(bEp~Q8ڟ<|=Nahg.WH7DMrRvi!*LAT?՝C@c fNLin5&} 3_}Lfo~aa!Xjn+vDl*5@vjww=H]q"!b֮nfо'I&ߞB4=%=BİY{w,>x:G& <&c, Veeӹ lB[+ yYq=Mn|ˉ<&&+e)z1JU^uJ}\̩p~G$ z8A7Nu_煊מ'.<"BUWDs1i RH rᑁm)eCںDrh3[gE~]rۯ54$u 1*pD_8}ㆪβRLNㇴEgѭcG"Nʾ0C7ò3.@Y+^ Z`>g` Muqt1Yr~D~,x6 5 6Yl$|nAzK<Q,f7b >əaOZ!sw{/P]hT6UCrb ""(162rpoBnl R5.pxk9LdT.ehI\6OHH&c_c6ydP5VҴzZdl2/ݎD UAᯝ + 7#g4yzjx5J5@B>ŝԊ&+b,41 \n3zL7Q5Iڷ_wO%n?x HNNDR2yJn=y4Gs^ffu]eگlF'Q Oy^.rڎoVV]ݲ>Ӕ}Ҫܜh5݈rip9k͖fpoy4|v#xR{Lnl*Ofe-aYFnL & RܧVfa ,<99 5}ՔTFH6ڮs"ݭ?F@uU4(?gKQA쬵c.v9H,ocXR7<׹V8Y#8YNCGHRf2:vN]@g)V!}eMl܅.j% ^֍->o 9;TVRJ8EtGȥG4wW#{,cXw졷0[:Дb`i E۲MXL/\ubN%})7zP6\JyҔ[S(Hx'>OA"P[{ \ATb)MJ*[iAG}Ctd +|j/,:6|- ~s<4~$/:x}DsR&*/uOw\kqcbGcflR" /h E|%C[=؞$]F&]ܽD@" uD@"P' XD@" ?0hթQK{ XK蓆Tb3FysB,y1YzD@G$,&I$:" PGd1D@TH" I:%I$$@;rDH(YL" ?$1#HtD>wRLfQR\|ɚD@ `hd s k[L}r[X8g%Ѹq`cm #=yu*I$@1>3+ ɩBJb4} 05ܢEH'ڷmM beqD@"Pө3g w:z{[-ZgΒ*-7$;+`=uAm~\rY 5iMNdaD@"P4i- -1\s:JgHMxGR$@]C3wOd&5 ?W<'E" UX*NS](kiaKD@" +Og0g":`֥=YF" Uxn.gG{{]ړe$]E$X[k]ړe$]EJt"@=~"E" unt&>h?D@"pHUdyD@o!:t!22nnnhٲ%A)E" jKKK1{l|VӂN6 `bReu1",(>6Uj]HAݩ ,M+áSqbеmW(oaٸ<E!7~xhH{8YV(K[* g{qf>|79z֖f8y!m8&~nt]())k[Ov el}}:F.m2(se8PSURԊ믿8p `aر"~kE%aҽx?iڇ_<=39~]yP]e+_6.v8r&:$]Z7z̴tcjX<љLݕ\#v k`#bI^xg$%%!??_+'>ʅh[,FmS"O 3)5 z4GK"[O K"z}a h^ kȴb߾`r3-^gDf> '&0,7kKC?5N}Сv@){//sxV}"yE3&3HuOi+,|!|6<gtʣEȗBc" ;kLNWh?(;_7XSۥ:5 ?O .ڿB Ĵ':ϧQ݃ŏa4.D0qD5~jD+iн~YyCzڝN3Ґ^XSdh@& }v?^hoiULsBcK.| HMG}TٴiX3,I 8}X462x`a:O2~~78Tͼǣ[UIٹœcOZ^aXl0Wh_B7fUZIYjzhYي!a1f:,)ˎC0' kdy @GҚB"" ҏ?ՑcgI!?N#l9 +D7 ˰{ꋤijJN՛7K.4%Nq.լ$ifZu(**AbrhA5 MfX&iyAq3H>t(k[p ڞba׮]Xt0-لe5^:TkǫTp%qaSVSdYSdbr1c`kk+/!i~Y;^W' =uo0wK?6(.vELMOxev0e|DƪveQJzn)ckyL2;(٭]#Jp.F>7_zg 76zv,'-oYT[SĒɊo( 1(,^dW2`OZ6ߠ/pF]+ ).V(Qǰ_x̋? Oѵ ;5NUr~g!CBB; 4<73}l6֧):uBӦME{l? ,H:˛:u@EOe-s?ޭ xdb͏ H>(>x|JcѱVaJw"zJ=eɦWu҃H?T~+3-7E8(A$M12WO3֙ٝQYR2`nfBYo R5sYg9~> MOqNc P}rn]7ݱvZe]nnY^*LPjJ`sٿA ߿?,Y3g脕cH2GYD9lsY >D5Q{>2c/&Mݧ?nƟ 3/]xa] G6m-4w3h2F0{ J~E_YHCrȦf UoJO)i(/4e9A$)cQLf:wCzRSWBԻgh:G9 Αd)- lX &uM % ږf^{'C4isX1bz)r$'G7kL_DX8ahhPQ\VΙ3G9xe͑(S)+7G`-Y{LLp=% DkOw6fሾ &*^Nʦްr}Fwy8|x cu߭ iczRAD<͆w(^_L'y5; f: k4aoDYR)>>l1< IDATSTsAsxIuԊ?˶!襑*LyNŧoV}x^ᴏs_ c֐%f~1 N}0S>X*)vd}F^|֮?'D8ȤCzv)\7kK]a@\agΜQٳD@"p#P+x/RZZW^y"H8'Oŋ5RD@"B!77_5V\l=z>-ZwGAVVڶm{Æ SyG3f… X|9OQFh[Bvv/V EEE/uVa7l:u}mӦ_~Ǐ}xwq O>A>}e·ΗkЮ~9$$gkx~|/=vkAbJ&Z4[ WGX|C066RyK GXrs[ksu~ sL}HKI}UDť¯3&65GpupM<1nXGRhz{K=>N7Ge{qRLMУC#_oo}vwD@S/<8 ]D'zwPtυ#Mw\Ph1axVuarW8qD033CFpA۷?トAx)))(ccca̟?/H߳g{4^0A^xQYi3`ɒ%" ,sM6WFjj(:uJ˰c Dƍu~.G#($D2#b q'faPhIDz+HH~_}'.kۆ꽯vy <g.GX+WB`mi&Ҙx^J`Tb̿gQ %%xDL1߭ '2_:6mq>K#_7"'%f><;c w8M}Z(-ب΢.ЫSx_N$wh ˿,$d^>D|7Ǻg7gk8Zk`7ksN]C஛LVL~, h4hЀ cl߾]`ca.11LF%%%BcPSƍ:tҺb"ep*233j*pB#$$DG&_MIKKɓ="I]!k,D+ou-c}ջ B"0xAx~MpJC035A='etH괛$#8,#ZkS f>|/o}g#dK#E3AFDZ+2iOW f;kc!kklOMovdX}8+v)zO0qM@v\]]Eq&K[t?y VkiLD6|XZ/B @t6^Vn>aR3 $͓0{[ "{lV3v]3Khz֭ç~*\d_ ]D򆩩u1*bg/L:NY )LN64zYp|hvEH D7g>Sb2s07>Eb6ŤLUZF.F>ʕʒIFl٩M##Cq.)i~6g<\+bu/O7$XeNL\ qy ''''k~`ٽ{7v믿.L\vZލJ-===⭷DYѣ"is4ipC4:-VQ,VCpk~L Hl诹 vin¶L⨭" Ʀ`0kُf56! -07LaKpԭ] "c_:ǢF!+BnZEիS?X8ar:&L~@MaX88dO8TnSW*GF%fWnFۊ6v'y,|A?oPf ꜅[iI?w4@xt2~ZO9 e/R0ec/Q]`BSm[L-8L.LE|9u isH.kken9,*oI#QQQ F-ׯ/"emo(7h 1MT&i}yR)}AVD@"H+G'T$jY~# PD@"P GfI$$@>rt@5H%7I$ pdD@"H+G'T$jY~# PD@"P : Anm5m,D@"pO!3)4dg%@@WMzq $A@&H$z$@8r vPu$@@^F9Dvx;:^ P/D@"p;HdD@/QB" $jD@"Hԋ(!o5YG"  $aHnZ! { ׮]e7x&&&hժ^OJ"P6RDFFb޽;JJJPTTnr@+.\ wލzJ7!!?ܿD@"p# Qo'6Zlڹsg]|Hg/֭[ SNxGѦMu'N?ƹs`jj*޽{cĉ`%77_5V\=zZhSNe+UK"wA>}PPP|M6 #F@~~>>`]vDE# ##3f1j($%%q!X[['Pݵ奫18q> i9hݚ̴i[]Gq5,~Z-ۼ9ZwC'/Vk N+((Y17B31 bm? dQI!++K[YY cB|X,?.LG׸qccB{y!%%[lm3a+\ѡCɓ@&9s5_窐w=26/ U>ɼB|@ۚrvTi&۬H~Ie<9MJAV Ç鱙 / }}矫TQ,l6˦(kX\/00PDYsttN*:&Gܳ>+ &Dɓ'ž<6}Y֬Y#L/ !C}L.6iGQbjʤIi̙3I\#MLLTL/q9&d&,q] } 9RU(ڣHmZ#rF%ivzH*_YV)P/ۼJ&N7.%s4Jocӓ_0ydひs!,,Lh舏4d }q遦i I ?Uz &.ٝzꩲ]_lphGK0ŴQh!Fl:,0G\uR2cZ ǻ{q.!7X X[ 8j\A``0}Bn@@5@pոrj-`v``jlqՂ[ 7A v=sSxTo `ߠ]@@ 8!+X Xz[ L;oj0ap ?EJ-oʕ+i 60>A"ԮM:1<_B=N c&X`@馛ov.*sf{eԶm[vmΣE @/ :P׮]cÇ˚#đO><@֭ 8PsĈ{ҠAN:c!qu9C/?쳂QhL=$wql/Rz?>~͌4|ri- ~83DO_{5;hv}Ґ!CRpcsUvz#z_S־uSީSҹ?MVviτ)5)gߎ}=.yНCW<#ϋn~|/r#3';qBs朅Gޥ6MMr}(IG_1E)2C|1R6n T08 $?wҭ*iX+6m9}]zEߊ3[lk׎}Q믮O>)p(6 IDATyp ĉ7ޠ lƂ\ci;pGqNyԨQB逸"8. œ9s_=SgϞߧb 0`[n6B q g|8y~ٰ{܇zHɓ凍 8W_}UBqq12"}iQ@k믿^™3g>Cp8wnZxbMu_~Btk:";iܹ ŋ鬳J)? ',Ǐ~)7mхԫMo{?YIGnm{PZE QShρ g}wq۳s'n`Q8'n}-Ҿ=u S؁n<@vl飯pWLr~SzwN}w\ʍx{Cى~q6'?e4{cf@;%K1E4N:2E'#A cGćqi!`w}GӧO|8GOO[cJ/>`vu|'^f co} u؂:wh#gywFɞ7\L/+x0]l8aAԙet6oA1@x#ukKv}TNq/1mҨ.;EKi;IihDmzw 7ZݟYFNcNJ^)̘1CҰdl|ÈSULo1:SZ(5B XS/0Ŏt.3 Ǫ *'G=p5tuT|" H~i#2{viG?р-hWIGjռwp9׏l!Ց>`[q6K<Х} cJWe߷mФ4mO~ɸ8%R7ru4 x͆Fы/H5kl:]n֬{azu2h￧;NFLpX+D#]l(NZ$MALG|!O$Mp++lɎiz< EFHż&ۀ^imԌ F~p F^qFLiO:l{͠/xD;ym'QuSu=WFj_=; ^֯M4?FbK 7*u ~LÚ%\"g6mppBqTo=Q%60:h"X}WQ"`taV[m6J$# N]1Ʈ5BƍSN tI= 5~Z#l*";])kko|􋬗 taG:kz:{}sܚ=h;l޼̱73fiפQ=@+X6H5#Q0-еcK(Soks]##*A*3t7m6dzg$c-,SY< GN#-XǑ8H]|Bgi(ӊ#Fv'e!"| Z>^.@7V1N,!"tMN.q8^6pCc#Q r8I8y&8Q2hlx/ʮNN6+F7#1]YڟqװASA.Zu r:^@m;A"mP#c8Ӈ_ (3|pH6S@'5:8q7ݵ)Z{'e 0B/[nf+Kr5ͩ em Up6e~od34ߠlrY-4n͹+kVBٵiX1c'e \J._$G[.=mjiw@eT8PB@@u@pյf^Z g,,,[ _,QD -^   ТK?tK*盯B4   Y/"`ЖK֩׀?.:9z'X X XOdUuꦾN`C7g6]!   (^沯SwʡCNVTVV\jթ5rrԨi 5}6ៜ```*ciƴre,UhM?Qk00oEN_kmRfH яK3f΢-aO0   TѬӨe;8QN5Zb9a+W,͚׌ɛP#ዻB,X Xb-?p"9)؜#f oF\+{`AbRZV~OYm!,,P?tƌivTYM|5N0~=m+Pl!~Ew9oN2`   pݨ e@@%X 8J0j ,,nX 8u`+d@a׍z R  T\7)H,,P H  pݨ e@@%X 8J0j ,,nX 8u`;RR t```/^pk}5*E&LqtKJJ46U*Zފ\ Tt}U4՞O/{P\:?qI I ϯs?ൾ>Cw_:B un0ў6V>BiJK!x@.tH3@U 4!treYLOR?i _/Bָ!g'r^ɚ5fXAmt4쐔/y7vHB}C^ 8x.H:I34AјmhƠ9*YoBGT=Ø%!$5MYzPu qMLjP|i9u(S+Ӛ7^QAEdMjψ/S@+% I t9MA YiKWJFB^aMy ?q86A!x8[Naq *^T_TW!{}#3o^Q]Guq,Կk0^hQ02&#qs(:JUpFȽ~L~y"$%ѻ$,Κmĩ~輾76`8Y"_(aPl?O$~2?_4A㢚E̯ ) -ʤ2+m L +VMʤ2+m L +VMʤ04`I ;}ۖ^PF A?`D`"4y +5(Fvr%kۊ$/M:S1 n?|j5Z6-Cagݲ9tД鳩Gpoÿ߷OY8⠿?hW!qtpxܟVSaܗ4ڻ<Ӈ5@NVxVҥTv="ߖ!Q^Guԥˊnz< DZj/a]VZ=j_hkOR0BCܺ3IvQ\-/,=- !*7HTeL@#QۃEswG/Xڿ=Aۂ4 [!8D E ojH\TBHy "V&]}΂Vڿ>gRǤ$7LNiuj&|D2u7|72C$+$:Z#]`3r+oXȺ|oNHPz,Tw;M( bȒlrV#5b} Z^O^%&ʃP̭PNH3"i\ C+a2cbP%W|."VyB?5@u`ΡGPˇh:-@z^: qwz^"#Q,ťpkyIA[:B݇G g:2.zv ATե[ї: źvizkk@gAܫe2AбK@1h`R$Wa Q)?\N8ƍK[nݺQ=>V&AoLY8uѦ `pBe_}5j޼d5O|z<|&r} :˥C /f"RX?tI+ 믿7u܅zAGyuCf_źx'F*D^zn3N?!iD~!<@}#R\BuzW}]ݏ>jשvK/>BA_̲ oy(=soOƍYn咭 ">.^ѣGE>CZb]ҥ ]5j:蠃$-2(_x@FƍGVJhܤ1uڕveW:ؗ;˞JF SC,nӗ#G*_:A.!5@ cqҥI\.V=޹_ ÁU*'1{n: A:?}:ZACXq f_wʡ#s[iIr;S>}m_dIL|4=AԨQT\\(-\= gϚdҥsd_8˗6%n?XzGuulN0/'=K#!eC/ai3JG>gǃ4 JԊTí xov5k Q/٨IfZꏧɃ<Ȑ?Rv&ex1o5o\KQy4~ܸq ֬U+^6*J|9ƛnr,NBO>k]>!믧UZPˈ9o}h(D\tçڿRa=ʡ|&[ 'u~h߻;o#<ڴiD^[nY작?c'D[:Z"wQF1o.G #9~Cf%Kþʈố<"?~Kgl&'"CBAprn-O-ቻ{;p L6 d/DY)dBQG-xŅX(f/VT8ӧߌ3x~i~苟O>ĕ%#%>kyDE^geX$Sң>KwϘLC*m iBɊH(oؾ}]3ѿmvR81cG#Mˢ?kOe˗O$ XNiEwj‰Ba4gt(i:^xrHlge+yC7Υi [ѓiqNV+a>評Іws3G x2JV#A N<-[Ͽ,-=>yndn|ӝ /Zs<>Fއ<˽QcVeox0^yWًꞼ適?%q^s##QxF>SFR5OE4`9yd={${lBr5_&}gHڈ9?o&_:@{袋 ׮]WF.1)>1Ȃ_wrqbzFp8i"_z?}ҭF~P>rf馛ҵ^K;3oB}5@qӜW"zk"<9unۮFS /[oPoc=yhFPGp1ReL%!Qa~&F{SP>UNO> 1<0E> jx"]#*]@e9 Ff/?{pbwm7P3A1JѿA"yg pHC(.LLʀ,E Xr=:vlR g`a4`Z⺤X0OfydQ^FA f>~@k|S> ޯ_LQ Ьf _>IZ9תLb/!>m|_Vm: ~K~?9iNM}+̉(K[Ek ߈P5z<Ԝ"7^E9A-icF-Nא^?#bv@MW(iuT-i L~>$/f`ml[YF2csfdx:L 5K!'h6-o\[I ̑Tҷu~hڴig~J%Ö[nIÇ?9?ea zdJM7Wd y&ۗjH*HVUmS!ENp{w*>Zg\ćw[07"Oq""2F|>10.<".ꖿjwj|KÝwޑuu`tS9z-s3j}&mM tl4tW^7M0K@M^{ʣRA&g[ؐ0VX_=|@oll[n>eQ[kjZ$7F4?IE4\u/ɹ'iSPM;ސg{%9 R~ҳ/ࡶ@|al\[ra /{3Be1xЃq=†ݛ:uuRޙw2 X* Z[subj3jx>Լ ='Yv`Fؙ7%!8 ~tRW6)EFNk1e4etj@c:mB0ő׆SE8D O$+@xwUob-īW?_Ϟ=ڿwmdR|E4?8Y_eCg ؁ 0TpGU꿜4Xo޼ԧ2C*ZxŶ7˫yD_<g"x skИقa7)E_v@-5HB+f fۊp#!(Vk33X?^~]hAm?i ky9cơO:V4~ O@injk0z?zUҀ҆%? k[| B6-a~(iGŋ~(p~J-b?ֻ{}&^ .q~< Ὶ3Ŗ#Mܤn㺯eƯ[_ï0ը=׿_pMwɗQהOᣃ'"GI 0mSB^k7̮1cDz!~(Mk0M㯼=?ZDŽEe=6;`N0qy xRsbY_yfG.(/wDRCL=z "I}l1(C~42%g bH\qa;K: uFg9A\܁%˫ A3!eRHF(j4II\M?6*wfͺͻVkɷ?DQA2 '>k\ %3P({btLM "Zh;Z*Dw_̛PmOF/^c&^۸sxq{hB%qい1w/jz5i%X("OC>Ayd?a6[l\W+oۓ"FCs5-ZB#DHǤzWE0o4NSE:³"qcpc6+HRqz(?S S~c30!e) ĴgZ8_<ڊCcӓ~zUa `YJy`| i dMLI44&F.F G]v3?SsK6ҖBFeA`Y7A8>uH 1 VB2OeQf<\^+o qHᇲMmeGiA ZOlm3Se62Ø%a1O_? bkh,1q*-xqeuZ h2/} sH7im9M+ ZQo!B/ͅUKTuiVB6 DH[LXlI<1Zڣ%jTJoձ`1a+ ]Ӑ"@54dى|))JK 4lŏI Ǎ RtM8mqag$/V |-jS[}] kI{Ic)5 7A4r1O &!%+n@,beWUon͟i\%tkM"+ei]kj7sJL8I!3t9C>l_vuM-]Ӥ3 # + ǝhfxΝNK%{CyJWY&#MR%S AŏaH4 q?zK lMoJu_/HJ%fא4.fɊ9bkipB!xJ!l P)i|SP]hGƖ3+⋱~d:5gJh]+O-`S P;˛h}MCh/ CEUU| 2)qʐ54Fک"cޱ ;a媕?FzU *o7$Z/bx߹lE [hyvC&7Q+<+O=24 AN>Iż93<0~?s'tꏩ-C~ˮ? ܡ |sTpRe BK y=S4 Fb"`%;;R?'XpC~B]a/D;-_GByZTddqm/5Mޭ}B_B9˖-ڵjYDŽu13E)$PNӘY_S.լYS8*䏯^aBYU n vZ'SC8u:N6V-UU _lL??ty_3N@ֆT ;Aq= 6hT$+o@IE0wJSdύP1R#jCW] _ 9h "7p`$AN{(q^ 4%^KՅA? !OU7 C 6Yomj&toVC[ƬjuV$h.4N4|%-ynpUB̈ZUz}UWfoFr_0 ó( O)d<rynkgSS" {ԺMI8/Կg#C7Ŵ9Ʋ4z7sXR $Pc:] !ºZ5%k(1:./FHV7tL]C|4zj٢uh#UIvoI8hGE иiѢH'jӶfLj@H'\4[1|Gw_d ԼY3jۮ j!iؤoWißULMjёY$}J ь3k^zm*o9]wvm4z3py#rOHi#F믻FmШQ#|ti qf_>:{G_vi:t]:B}Y|@W^q 7oF/%ƩܹsO?Ǝk3kѭښ.JzJ!oxK;xFq{EЁȱ׿%x^m ^,U\o'|2t1x3ΠNppA?88V1}'Kk[f6r1l_Z# enE8'$9cKC":^zE:shE&[w}裏ۇ8Za6]74єpByPzgͷޡMg/J!2L?I{北> _x1) nݚu WgNӧ]xXb}'RZ A1/YߤI'=ǍG&M.Z m=]+BԻ ӧ;(Lϛ;/?t93gvҝ}t)'ӊ+aܱexU wpv/kدwo |:#G"PӦM 1 JaFɛu-iB:uhw$LOiĉcR.]謳#H?7B a?1׳gOy睩^z_G}$ #SBO=LFt2p f<0o޽iԩ)߮};._ Ry& jK@*J6DkJ'gZVK.g~aÃnJKrlb A\"FHxx1hʕTT7S#G~.R[lȤ1JO~u~]v{6xcy?oW DO<:&m=WN@ɈQkD,2BO3^x0xq:wަ9s氣 NQ(ӦMQ_~Hi}YgM۴ )?nY{&cQ[IH\Pgs-FרBZu%8;v{ qZ<#[n;Zh3S~,'G @l7wbHL'F@ Q w :WFό H^.{A 7҃>r13ίiDbOp\7#2/IyC_h-cY~9KaܫW/)lkFs,"ƻv bdѢTt2CoJpĄ#_:;h]<~~3|=h޼GKA[:(~-%5N6 ;lKs.o!N=4<3᝻{);{\?@cy$>O i4r)~}]'ו7_xCGpozf_@w>gtY)3b/1\U3*̨HS(6Cr{4\Y6 s҂x`Lao)]Y2%b p( Tޘ)OJ >)z+d ~# IDATtsg4pǁ}]1 Cf6OvUI@,D#` Q{\泂G7`wM6<\n 4C6j Ht`9G>񛭶K3pvX*Ht Gv¦ e}y{衤e1x.h!%i>=_G} ͫ_9C̝q¶tGR&Y뿄Qv]f2Uʗa[+ %4wHJ. lF!տ-:ԍWJb9hƲO[aQCogbK4cgem ~b+p"g~kj޼9͞=>Y)h'ץ/#Q$1GDSvm#.KUQA(R$íBײ'x"!&/<>|#X JPqc?mG6]Uot 56Gv|bYs4,y2r߷ 49: Nc*7yl;C}p@b9GqߛlW%6<5O}~{t㛆Y_9~zZl)I(_-ZX׿СG(YG~i <_Xƈ|U&9s 9ΦOA`b\K!jРS"C>=ē5OqxN-7FxOty5 :#XEtϕc9/?%iTv3R=e.%"$TL/[+:5 V_:Gy$oVP=}¤ x蠓2|\-|<+4gs>,ހ|JXa$vtrsWN|4 tM ȦU!7mAnK8ngq*JӔ-|$F7측k@nA;\@-͖cA0x>OW^ &H1\>c9"1vbcRq 3}:#nKDnLhGp e~׬Y5NQ:!L8A8H2ñ_ƍ":ur!a&eԹ. lF4|U2qr JwChgyVZPSoHGiabsl|r;l8;f=p뭷I;XuIB eΏ޺^}B#?}t:k~UNlanSA}aB,)} [B\DqE.njt1J,!>49 x;dĈp[ -&.o:wI? e|3q/F2ϳ!KfI #c -[L_i5NXsc ,]AU|w y?tVjFwޗy[`.%vb.A|A@0?n0?vԭ[7 =v\@eW)`0/z('|Teݩ57S'>iR$PfYfaeE xؚ{$Ow^fB-5)SF7hHC\ d>3yh><$+H v_%UoMiN†2  kgy,8u#/nsp x#~cAS|Qh33ע 0vl45)ѵNq^D#TGV8a-2_F<%S`EdѐyŶ3 +e,X8ǁEQ*ʥc=N`.58zm2x;: A/v*WL~{RI$J-.^_ Xl?ry~/L,h2`gn8.ePcUh2ɐ!W_.X>/</A+zgvU6m9fΞ>T9A?狔Sķ!<.rdxδhH v)P6 [axSa$1Lgߌ t*^G ,#>V?w7=iTvL7Y#KQ'IWׯ?f8fΜ!3gcz厹~SO>)w/)y'}M2гt}Ǝ+ϸ_Y|e4."iԨQ2*Fzs;s);k`.eTmCчW:,ޅ?gm۟#!6Dr<5i۳kSCJ$@[n+2^:Kd9#TpAGKP7 N1K> sMhzji`!|칂ނ…iユ8S^f(tKw+qaƬ9J.j&(ZlKAs0qrD1 瘻lˠ ֎"sTސW6uC#;<O=Kd F% _UW~?WN*kss}O 5Wu!2 rqQ ͍c[xUyUemWCG[@;8@< z m!:q3zlW2N3OMpZ|A>?ئW|w!P-+/$'Nבq1Ӆ 1y>h[9"SPOcZC_^~ˊi4m$3;UVЬE+jӶ=5iւa (Nd3_:_ 5r ׬u2eKem #4%iDd':Dkӫ[>F֐;?8o>.WAWJoߌ }A NSիW3ęDH&x --e#0:6TkVk $y%|ßhF3Uy!!fIt^Əxu4$9yʧ z!"r>҅I|w?h=cND88"Eg#L90T}T:ai7FZ>!TWK. t~j1h'QRHv*0DЇ2iiR)5PjYCPP(%=0AP&DͷϺU8j4Pr*&n=:-'Y;ƍL*B45]ISZV~qX0 CmޏG*k,| #T'H|JO8LBJr &^(<҄,4D0'e- U\A46/~C>R[L0LcԱ(L:Te?W>)yO׷o[{&0Կy8FMRmk`hƿh{Ԯ2kTZ9y5Wj&}C۟:ڿkS7:Sql?ZU঴ qL_p<}8QM\ݠ}z Tv"qW)ij!>9)d¡Iє؏c惥$_Srgs${:x>P0c6mT iѝRp |a?J^3nk֬)0Vb%YUb\'Oު35ߔwZԋ_J9%&}On_>>6vg8iKp//QxT A4pԬYS*SawsG|Ns-dq!9BCF1-cʧwί[tұGPf؇@AnP̥bWN`Y1A\|M9M{} (alp~Ѩ"2-+4uhf͡,SAmGZ?" >M+Ba:y;V?X=mpy-e8l*2ϕTMh)mQrj i%f 6 DC]%yynXEU NU9J>x(9@G7vZƱ6?$Ҷf1^%h]e"¯caPCCMF$:u#HQnKMmt4A#S^7+$eP\[48.. V:PII6U>='G"S?Mh+ؿڟxjǓV &:~CJq94S`e9%&|/!a}=VT/JC| :Q'ri4XB9߳'k\-QXIO_}ٸt\\▉]G$v&3eB(MqUC!lE@B(MC&7* 0˪M+kc'ۄPBt8AmW,Ҡ׸ª+›勍+S@}/jO} IDATiFpHb8>eM65oA6좶a'wa?q0 Քg։|BN"#L\>PlUpOΌQxO,?˩qFLӜm%'wm[d'lIL90\Z 3F4}6kB^=MG'_1M%0}q4si'R aD_}-1nA^pR=XZc|o=Wtю;̱E pҤtܱ8Zژ翄Xȏ8Pn8EΝ:C;k,nh}B3iM7|EƎY@iM7mO$)La<_~GG;njC'pû{{՗t9HڵFݩQGCM4Iǟ 63K/O?Dh֯Wyyߠ~7-XWH`7xh@m?MjLdɭ3Q_Dg+kV9;cvo:f͞o}@wZU{H`E;{7FFh4K1Fc]&vFDΣ|޽}93gwvٳ Čd~ +k0j0 Wh<)@=$_/2Yڴj"WUzw[&0FƋ`w%d"(Tf1HH{G)ēN_iЃ}y9)xTv? {䚫ayɓo.}P7i']oO<]Uwߖ3<=%}wމm!fw^og qpC}?dJQ9Hj8Tr !f~W\k ~=}хҲi}UFń Ke ,bWU.52;3F}x0n2x 2"lb@;K#"TTc1uEp5r5oItuE͜93;cYg%;8a+&:|_M7To?i׮]ݧOo9Ce…%k; y;/w}' [dE4vbyćz\}k'O$7x\]̡U(%߹n„V% oS43#AHZ!r6^20KD匓^mdC(7$(*rJ)ʦO,Z4.T/}Xy y ScLsH7Z>ЍHwwvt[Mٝ^m s}0.Zx9RjO>QAfcacg$j+[oאgg~Zo寲h"90W\ljL˙UW\aUVҿ0B^ 8q"uI^:T)W~jܽxg﫳dxȬc}1U?'E4O6]|;wp]0QLvLGYb^gih#S1E/^_^Gl<tǍ48,SN8Rvї,(R^}wů-bd|峡#qVS΃`Cf&5:[@(&-՗,>@#҉ٗR^=sd1/By'Kxq¢Ln7ȉHpcA}ݗU4q7c/yI'8;= y3ZfϞ-ZV1ʓo.Y&rKhӦMN;%/vq+7x8?E|sgz޽tz&?jkѢEqFu袋bgu>5y:c:.{o}{r '@t)̵IJ핻֪nw+d1 P+)+Ӱ;⍁p}lԏN&v,yR7Q;oi5Te<'2*ͯ9@k]C|lڸ,B^|KޖjIV-+0L a47.s seC::,>MZ4#z|a7ʰQFe).Wx[rc=!v”& էHQCN:DaCjo.u˹.H1+t P}YS#)oԸ\^.}`;l2 ".?qqcqSϞ=wE}!Ն̳~ tw9FD#??wNj}w~;sqAa쏌rwW^.Wb#㏑Y$;l|Sߓ=ѷ(G@v2}a#s/ yoiv`xR;_g^a+N3@?vC2с_[uuMJNC!j9zeҮmWr4Ky8N8:ak&wVl0a۩$=9?'`G/5L ;'* V=SCs(#(".uM!?ϙHu6F.GˋXS RT&hvC"2Yz26vþ.{YNO,/&hy]~Bn83by,bfčJ^axiْ3I#3nӦTCqUtʧ~7<1Ae7Y>pEN1XL>w4e :M6*"/T~c ۷c1: upbp|$Hn1L[%Q!gL]~AwdA>]r}NW = v%O oȈQcߗސaG ,K?_/O=ZmyfdJJpA$De5؄<5Gm#o~}1z4 Ss̞9MRib=u=vAX)THb\>S/(VfaIS yFeǦL$te=}jW O|~ʽm ;: ] bC6ʧLk2l}5:U= _:N90QpkwxW9+N@tHuc {">oyވkfuͥkW~~z>O9y6jVYE4WYPd7媚*{^1^^69@<5^{E~baxm_+riUkAfbעCQwPʦ-)q~g@4+8Ӗ[mW{z-Ni[XU1_z~ʯQ~DAȹ'_+cgօrF+`݌rx8=Aމ|Ǎ>ʶ^lWWⳇ5:kA,gb>ȐHBϒ8G< drH|+O/Bfd?`>=ҲiCE?S _Lm#x+i `l2?C. [WMI䖰}tvN4| >@& =|?iFKgkسX̯Ub7eYn! 9C!AqWZ"Y3Tb;zL3ӝ yNC <]X=j7o!|lԩݶ D 8.Ŏz磏0nf[\ wu=cxhxÎ8FT>Y:_2Syg}lW`{M&o땗jb0*%(xqD ӟ+>y駌Gur {DDC Æ}!o'wT\1s/Y*Mxki7{A.?_uCD&ۆGgt9bqk=uˈ)7ΗC.≮%7[)aigݺuٱ,$s9ޤC'ʀj3giO.~ʶA=н O䯥vwvs{Eˡ`Ihgv@UNJ++qbS/OO?^n첉A ǹ5K\% ^3gaaZ!d=&W\˒ź-lXKNCY**V7u)2\Iv5u wx }Unҷ;`7BXĻ],iJɧ._wM|ж~r:: ٠V+H>#?~Hr 嫍7[K]|.qdz__HГO>?T-Oۃ#K'p"N8+UuhN._YF&G?GъHEI[']L@ɜpl+ @c$?~?aa+erE.YZaq}O<™ÙgWaf;|}؟:14~đ&:OA!F (ΊujevB;Ν./1C\Q@2Я~W/n&L_ƕm FbcBZF(>MYR\Vk,\%T9(2BMϡ{qPy5Hr# :vDjFǻXpG ym`yN.3͘% K㟜%lO,AĔdXdrHr'Gqyer [9{Q$qbg ?$"N)uz9Ä>d/F 4 ],̱ >I);`{绮y˵0Id4UD^J3Tr7K6nf' skɧ[J>y7=j׬wwע1:ڲL7ZTˬʕ_UY.m+?۾*_k'*.Sy{\/$*%f"Q\8F mUUhr5fAEk_U0^4$=aW:Cn>f$N RaQ'9&jxy|"hwg,F^ , !SA@sX 88]aqUutƇў)=&uUhDq\ >Sd_Q^"蓀J>MԭO4b쯡Ok?N}:ΘuK`[JI|3hcCԳc/t?W3 9;-xu @nh-7ӠlR@Eqp*4.aCږǺNh8^~=Co<<ңڷII93h,CqrgO tKxxU V\\wAŘɜ6 %Ju.gMHMY*: IDAT7=K0F7PJ'W6@Jb`O6 ),X^L`|`bG:/E_IYg2=_lY+fw~g)'b  =nye\%f+n;O DBp1"Ak“:-F6!Jfbk`AԕJɍX҅ST:A2_ X }w6Ykߦ|msmw?Wʞ.E_mz,m϶ jφggxF*#EMp1%>W#<;,vGi}i0C{nn5x>UBG:$y+ ףX㊍8m gΘwK՜"xphFe!eLNO% 6¯/̄0AiZ 9[8̕3/Ii1q&ĩ`~]|^nm:DVvu?^#uFPoVߪ||1_;# a|T\+;o+_?q`q3{Ο&;#c W(YҪFҤi zQQdz ’E9yFb*F͙j U|WlUIRv1# ͑"/pxiyY}זR>Z|ᵿp8vJl k\-_TW\u u8ZnRAxO/ o%4S[Po"P˼2!S58<1@#|CW_NS @NV{Ҽl9 n4J^/&EGqEi55Ӝn8q@$8;@ d2 \ҙ,?G3k5`~)2x E˫**s/4>[7GA 23g^U@YyHG x>I[Z %_gԡf{:(ϺφolP1}ڈY}.Col'?LrdXr 8-MBy=RCpy|3vq)[NZ~ڢ\dғ'J%?w>Ͷo~~pt.|bi"H xX*R| ~Ή YZ&$#1v~Vs`Oj;HUZue~X?ǿ~SQk< P5VUJUur2%(~Q^~@2bsoY]7\`b;ъgsV_ڇBG5@oY8 h{a"-COТUS΢&p*!EByB~hAi*2VaEV+zɮ~:!7h 6j^ kXa_wN# o^>;TWĝ=+8aRhCQ<{ +2Wۯ1HەnN>vXP-0x"gRC9ˆoj9V0 qaR]̪:AW.;A]˳)~uOu/U)uS&-_c0TZXg[v PS+Cu?QUbGLqP3hrPI:Q2hAp28$qw{[wQoq?~`?K' l %-R$BjreU<8CgS>=mPqrXЄnCWQW*,kre1<8CgS>=h>Vf|yfǣ_:d@ Pga:7UO'yePgr+е@I=]Uy2Uqď U', ~I~,KQ1i N!(B%WgNf˝ 2[% Qaì|ץ]ʠC0 xn#4*qu_3@Y^bd C6H着2iFs˜)t%`6 kZvXmuW jrcy3y;M92?цCp k ǁ9gEW1$A?whu󍟍Kԯ}EKue9֩,l,qE+*8/K?K_,g43j&էeegg+_Qy_E) }X7m";C4U-g͟/̝iG[dF?|ՙ0!8oŦϒ6[}g *Tf̐|d}_ y 2R]YƲמ{Ȝyd%# tPz-ֳBz瞟jаhL̛G%oܠuM/—ᛊUgw@w,sNq}KD]x;ɠY.0'"&)SKd˕7Vm PyDR7k-.E qBK5P'5r~kS:I7?u:P]I0? -(?ް[rw8(3:EJc=:?\pAB@X9TB dJZ.^y;~yI;k֪%F4`d0WC<@z&8[TϰΰC:SO6t* oAq֡tbu4v=Wn4OjOQLȿo:>Ćgo`GNg>i=)툵ē鍯"b(fy.4X}>F:tLoh[SjXE19T4|= }N0I cM}3 TXA6řBbs,Vo#jzC!OfgAz!9T<,Uo[W:>,H$A:`^yCX@KZv]qBrFd* gP'O_-% G5X+B]Х8chEx BXǵ DfΈ2~3nHy庫~-7i/ -3gkˆZʹ% .s=":m&4sA)/w՝G_aF UBqeHK)m.‚Q.%b1.Qsw}CkR(}?o:\xE՟?sX'ok;P:'ʡg c廞_c8%h xC3 %mH<~YG0 %- p /Ć # 53O7(0 8mGeJ03f De[GyFT~SN7|[_}|1K3v<ʃtؤ<=j">u67C꘧*Br7:LXt%?9T<E7<]()#^imۊÔq׍PQ[D.U_1mcP޾!{=~BvZ3{"CYĵ4+1{Oֻ_~JneM1SDP?cSǭ3RayΚlt_?Q &@tl @!R[ ;!RX9W۟ af$^/{XSGI㐸5^$Hu mMn:ۏN b2ċmfp%.72Ġ%KˌSdB FƛtڵBÔe1.9ild;HF TdQoӏ\Ϛ!wg}j8.^y.oL7Fn6evuÃҋ%]y~Bgԣ~9kE HQn}ӬPZ}e8Me} ӞJ#7& D3}tj8q ]M;n$CO.],Δ;B݆e<}-^jJ:iԓkucOgCiبJA4ݘgђ%䘣/Ga,[l7<ʡ ӧO7n'MpΝ;E yț/>örM7GB 7H_=q#=ԽLri2l2b)[4)Ӑf>1pnG. V/h|Q~տ?=Kj?$kK=ϵ! sPs&gd*^c}*g&=;~`@],@!\'/gy!;LKJf~U )6E̞! Uތ2eZחꗯW.;oYZh,_]bՓ99ۥM֑f-!(^~MXGjD~2jY- |C2Ao 0lѵt^p6me̸I_yg*6fݶv9KrQ*Gg?1dXJ* ԬX s)G`\zbPCJ Zhg}^bAc|LL/՟h9e|_p:C{l19T<=Rݻ a0yb , 8XACǝ*`to깹 rA(Eq170n=d5խ['0desoBo&~?9U[8 ~̕_{GĉG"MeN9A~ rv?(紐j@83 ۷g˯&7lL.\g0<#G/n>)Lli#jCrxױc{iP'RKAV2g;'s8bgʳӦ[`IksvEO$brWG-[QǍ;=)^/[*c.]6R˖/Y*ƏŸD !lWW~Wÿк:vDys̖&Ma9o>K},KOh_`k8SecpN3z| jZ=paٳ+; /2*iٴ7jgF W(7>ڞ~`>p#fvv!Z5o/c,<擟xٸ]=O&?9[FpGNW!QvJ*|UZ.!.enGjo'PP8>e3QW:XnE:wDy4Y|g-q8賡2m ٨mk܀]p 8<6 ӡe>6ѬiciRZपy87xU@t [d-[4ߓ&O~8)7ie=v֠O<<-6+Ơ(=8`O3O5n%i5c,纫/:=<"'sr׃OQ}{AQJW_'IvulVrvcfu~$DM\|lՖXzj$nj^x 4'k/׺+ a)ݷJFۇCrDCSIiu iN"*3/ؘ~e-P[kȇ?q 1jO W E<X"lǎۢEKdYy'%8F09ģCaA (gIDATb̚=kO,!͙;OMӰp^'ϑ j '|>s"g}fWz9G:ISAYo5;Ͻu^hLE6}|Peu ۟YPU||(-wH^NIsEvyg}ݺue <1O~~Ώ#W* wk%#8v2z w}FΝ:C>W,GO65~v8ٍ:ۮ!~ &+)cQϬ~c|*jWjOyswE[1$\;`v-s̒/q`⌏80Bf+\6Fg{Q47APzi*_1'O=a~w^W]+^]M|f d}Nt܄)y:UXBCD:1"zK]щ;8 3,~<'cm2[I7Gb& Y|>l$п(kpVo4S"#GUX~GȬ9sk430ܨmQ^6o/:WsFF|%{C}ovl~|ʱ2i43nhG=vsUs#5QfΝP7Uq k=o)&x!mv-q9+oku:fg<E';I 7ykar,["~OṭAnPxĿZ|v_eНqTgmL4E>:BfΞW ?;d<U_] WE4s*ӡ"}&g̔ڵj/gLoI 4vv f㩀ʱ4>]iBO0dyٺ^m/Nbx{.ko(4 xշ}p"NݺjIXrjs0(I \+䗩9򫱊\%.;EmZ_ q sW~T$04c)$5o/쟜.z=򔞽oALцoi3&qɽJ/8Йޢ'hlL\c 75$ I~ԋRXGE(pJ9Ni>)UkrPiqdUHUvT6c㊧;^zlu3];Sӵ}z&M4*E e(9u ]+d̐FP_}€m` 7JK%&eekcdIGY$i%]0ijy&xh~6 d).z}B oO+R#Sy=&-fLl^Owm4Ÿ\r VZ`MAiQ/N<Wev:OO}y7iX3y ʝ% 3t>t^i edFP!!f߄,<%GS^ |6'0'x Wxr0޲Kf͑X' X,Ri2eAgG~ p㰃Mt_z lT3HO .on!pY뿵kt&݅Hg(^t5t'^P~-./689YC'-:^0,g M=ݘFxʃ_QX Pԋucً8IeyE d&(\0-o['D_.b8MkQ968q(pF[ec+raj[ /Sho7Nָy2GՠI:=zt8Yί\~r1.Q'5lPWDkp'>Cyׯ[Le\u(3M?u9g`kꔈ@ (U3ݼ2p<@=]I@`P# M)RuZ%%cA\'/WX7-o_`y/v[wc8wΏW^GxE )e"01{>^YV@%7ĶF63yϝ2v/w{F~i7U:l1N6; g򞇜N<0=BP]SoWG<fGSd@~2PN;:ɰ6vϐ8c1M1.sp}xםw.x7YM=2LN8lK.r-v˔Fۓz'>֠XĀ|JT?j.YYN Bx$v2%:}5g;o90`S6ɹi95gLF9TPrB9D,ofzi;%K>J{fՏJb9ez$4RP,G5~W>Ut9ԇ~GH,`t5w`;1ΰE yÁ l 8p!dڴs'm/=m j]Bٹ׫c,s|xٗhg:,7H8 ^~{ktxnCѦ.~MO-8^?w焅r+4ޟ 0оcΛPgs<3`˯Yv# Z{xDdA H#*O?{N /Jnisg#|2SmXZn˝CE,n EA' Q:92B0Al<sHe0sS^a>~n2[l E??gO]ez[n0SL޹uǟxA6ͩ/G3n^0w8&~܂W]sՁo=vG ^sW kt9}MB~y|W'U4>8*Sz 41{Dڤr1Gie{z> P\ygԶM<{WW9R޾۶ϑx֓ p~5T}VHv;:!q PrOtX)DѣI*qfQ;Sqĉ:3~: Rf9iw:XpM2t X("7|u)ҼESy쩗?UϕMGxָmEM4IiycߔY~Bƀ/(L 3"vծx͆-e1s`ħ[ay_țP}u\޴+/O4)S1cvj\/9o( p }R^LZ&ND>co6>t%YN'Nѻ&$ߖ[z_Ud%+\eGԫiެ)|\૦q>$-r%'s殉\M;%226HwY,Od0K`3B,J%q{u9Lc1fGI0" U7{u٥>(.oo,&܅5HmʛX{~U_E8*73d{=܊,ÆWAN3yb[ހl/>|9c~糁|.s exlllܸ/e]Cq&+./]@&O孵?^i6ɓDm$pٚ kw@EoB) ʌ믕/26y\_c9+ǔIəI,Kvː?tB:Q~sYÏ"A,:D&99')!:2ȔV(oB&ұjN? \CO0/O rGʫ/=_xi4X&/.8O8w(.&W^?ʧq8 ĜvF:P u;O(X_K˙7*C|DL EǟrcX&HY1~Vb3C0p8ancU!%E^ γ|e:cO?//?;=6dwH_X[L ! vvrX@C>lՍLڱ'XJ#( IL|c9zCӃd =< +O~?"/X&xXoTppj `7o2>s/Ss-ǯ1aFi43 *D-/~ bVT e2 G`Ŕ$ yLa.#5w.Uݾ~|} VQgRPO$AoRK~A/p,6D)u8 2uoyO:d?0 Yq mmmL? v6>rڶl&f82|v3ӕAulH&Hmqu6> +e_M ƖS]蹧 6Է?'uC&wU+KE?:65dj UH{РY̩}ԁ2d2ud&x>! |w8`P_i)2 pRU%(l3^J=/X>Z&ngaHh 2[gz ؘJ|9c@ROaEk+rC Jܧ߄ m 62*'d",æAP }B}|9` 8{ tn`K?5/T"yuהwNA+Ocg,8&I|cG}>CK`'ֈV2L,!|f)iUz6~A, fȋͽq _L:Pex7ph4JwNkeFyYbn%fjݷtaֿ3 ޸֫W UGZ6IB8'8?dirY?s&U/QJ(v{e3^"RI:oJpqS> XިtjaG  3H1`ftJ씕rL圙ynuReA]jϵ!)?px8AE--K狍jD"]Sw2#7^㕌G;.- 2*!5 X F<7sԤGer:V]wJ|$4C**b}G5}ȯ`kLSx 3Li\Cˍ)JUVHC/^ImHjFFa03!.!B! R#Ku$9E?7{` >zhzk+<4wx1D,A\@BɃ7^C`i5 e1";DgZBl_51;BkzJ˘xA޾€j%xߞŀӸis}V?DR 6oL@s>RVA4{%[G ,!(5:>e~8IԎߛKNkg )k<IC.RVEx-_Ŵ]6A멽ugȔ(XQʴ?gͷձ1cν}?hGNFziE޿ G_~⧶,4֘d|Y^뛵ly2}D}Nzx툟 gAܓ^^hS xFTȞl F/;;_YYzJm)o1./הXiS=粼 H8zCy YmtS)?f̲)2 bwʄQR9\ׁCÒEeޜh}^זQfҴ(~k0)?VZKm6߃R]{ѨqS\  B1>`qǗU~oh':v;m_d]|ֵQiT&]>xkNúԏgge*_*r]ٟr^o}UݮWUIk׮K}e;^q\S{(v׭^L/g_ z_fLhZD~7u0gV*+F^N륕;\!5BC#RGdeiESzc4 Ag”o{+?˯屗2ee˕(UۿƇV S= _항!>/[}F ji<ҵ]VmK};o)kpEL_Y~Vlm{?WMeWtmSUY}׶~_^-.]PfN,ƍ ?K}^3IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneCarddav3.png0100644 0000000 0000000 00000120652 12564151525 023534 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]xTE~lz=Qޥ `UbذcOE( ґBo3$d $a23sg TcO̅=}Q7ttR\YߛOW]uqZ:kQ-Wīz.f5ܘxիzoLhxWcD@"ЪArvDnlD l F1zx{4j$fHlV#w>[^jK,&6'ΞCZz:n5[rg) ^fQ%?||EaE<:熿aff^#wc޽UioI/Jf~Ϧw^{T> ť())V a@O[b1t(Ǝw7v&?OaPVV+#RaA,aLH|9r666@( \y==5yWsg ooܿ?ӳ]D,è۶md tWz!\G;;t^#Jސ~"wzN%u㠴F*~?=vNm6#G.g\G{',,3ڧh?Dh#Ī$OF*-CyWukɓ&{CelƴUS#>\aMo>}WhU vrk2}hkW'#%f ;3^=r}Lx\Cr%Rb~~=HçOE3?+V\,gb#HQCK~V'&ʴ\5r}ѿO$g~k֯;"j>g3ѫGwܷ{\:yJ-;u®\B` :] {zG\v 5CqQ} 'a͟w_fY_#q,0΅bԈ8@?p-s\sT)zo[ gcOǰo͹*a{ʱ/6Y: е3,͑}!uSSSLv&>t ҥKQNkH>]y$GBC4cHO\%?dC#,DK9\]s ɆDS_О"]%dCt},ޛ'tU XGSގ 6pU4 VaYv ~itEk|]59l:?2?/Oh3C v"#1t@g堬b؊2s.3cS ;i{@ljbdT$ܝ(q\e狟E.w0''?nnx嗱ߝ“oCdSPLJ8g?@aqI:(f6gZ9ٮ[z?إ9Vv&YK>[ >;'qmJTJKfwznzX;uZO%uDolo~E+@FvxJHQKmDQY2n>U_ҡ1|<1UDuy> ?t 7hT|j! J~ a(**‡ [[[<HS?L'OלӰ7 [ <, 9pSL%agg?To|UK[]Jʶԋ\]rIV$^6կ۽q1'LV{GdEǐBpWWW$&&"+3 q yyybͪ?pϽ"/PϜ4آH,y=D ]ѪQ8TxJl] K1IL\jk :Ej\ZDfO y[69c7**F\#moڽxW5 UcP;oaLPC|U2R֟fb|XZHg&+P?=i+3WFnu P^1엵ׂ}>xPjhØ[`.61EXO\ᖖV:jNIo2BqQ+ DԁX^ I1}~yZfSarӾ.q4vg}t,P^]w ]u%L2;Ų?Vwc?`8^(G9N\=(Q&JPN[%M,,_V4S;GRխxǿPYG[N[O7}q9JJU2r0zΞk.OA] vfҤUDŽgMܹs;D&ƍGįog]Ks#-E*e Lי,ږ9__޷zxYyY ~[edht\O@~zCK#*  'uS;56#cLo/jimm%<++ddd~yǝXI/#ؖ{ϨcvMC/ @i8ʽӵeq!y'!~kL4G)8y ǍCuOS"q>%Ӗ Ews8yM\egIPOu\c'{~v ԻJU%%N=rH+Eqv9 PEGf{IV JűۻjoHsCО{=Λ711Apę9j]oK>˗DZMZvF,D_T`PK'k|CS Jz8tևQ-E2+X·U=}|DpH wH,lZ۷l”;c e|b r~#_q]r+0ou!ibLB_;Lcqr7AaÐ["42"6AD=ɺ胗F:/z#\!_zg\}~&۵o//">-{Cȟ9z}|Jւvw_WW܃{FG\:ۻT^(P{gCWh*iKgI^RƏeF8nqr \LPT@,E)|T[&Ne~eKqzTF*D)o]yY52,d.Tl6ؑ ^$Ҋu͜膕٤eGr1-Óc>4~mixU>6,A`_u} !KkOty?q2hCr:~m|p`^\`KPcǂµۣ~&?~8wŻ/D8oQw&8,{˜?BmDmuW.t~<]0j}V]{ňCk^_v\@;Ay0=ĽֶwB"./yC ıƖƝ"1cNI@X{8´ Τ&SBr y('gwtۢj:_L:6wHca10|UH+;ph8kCvR A^'=,JoWs"B-fg_6šlG;~戉BI~*cՅ\S0=^R-u PZvKy>g#}+  `|],RX/[XXoxEV-bckcn;c} =܈rx8 XZX"B[D$>ްQdq%FJ6Y5RH4))jegbbFYsú?E94pOV` 33:S'a a6LC=S[OV{gC'NWމU8&!5ю\`F&_ԌLDƋ7[n]P/h'rd园[-r돉՝w!',:.:~5y{RdJIKG`oz3U֭οcvUddǵ1n.ML/*},zvȻk ?ؼb¯F1pR [6 %/5\dj!*:4kQY}7mv6ְ~,yde;Iԗ_v"0̑:jl4zN/\TLBǛؒ4 %no*xtBZZSH ]R_4HOw**waȥ,6V%F ' D4RGIllez ikV1~<$Ƹ_o2µ#@_1v)%=T@y#H$$oI$d%[klD@" OF$HZ+ ,]vI$u# 5@+F@IH$"uQ8zh/Mʏ[2PV6z6YwB 22 BM"M37g4i>׷MϹ t!ckD‚i $DE3`0S<Ͳ E9^qf٤s2 I:?c/E 5 4!lH~u,{xic&`k Mm4 #!>pĔ&pm|`EϹ{tكE y:Aj~ |~t1ꅘŲ4+lѲVsBw4 @ pqt'eȞ MMh'K"hs=С5񬑡T0Clh݀f j [{WnӁACq%"#W"6(*:mKi=Ysš" ERXڈ|jBRQ#/nզrU0EW”]utvJ8p\'yqfLA}/<Qй'-DˈLrppr+\aTmUZr""ha4z akw6pjų460FP2b#E|.=S>;k[7|q3R \ZRMU126s[X9W9 sLĠg%G)0vxSs~A>V雪.c:W1V]蕸F$п"aV[kI>*6Q=5eŹLXXjZѕHy+}ҡ aRTsp7=} { ԥ g`fX~JX|Ker}q\|b16</GL2`kAUSbiԂ'ײ[o+1"@GchB[+EZ[kmfOj٢HL/acH(]+& 6zi`01~D?jh6@G?WVOQHMVʻ9"/@eL-)>;xØ4̔8͝(-aI0¼liFڞ.Hb//R'4@ԝyH\rA?qֶϥųi d!bRh ":')@Uީ/~F]LZ{fxcZ6 .DJR<1CVЖʛ6y;w"͍ҧWg??s9__/9Zx8itjAY1m8~^QF,]'͙N w!;''C:-=%rn=d7Q kHJrL/z3&8<FK\Zef [1pC^eCX:C\M%_L,aޕ> RJrhGE, 4+)F7/%.,gsx!hK7&Fл{'N]m'`n놗tֿ._9 -;r= S;g@P{?ZH9?-y9(5qyC^ZPa DכA56&fEy-]KWVjQH=Ċᡗb0mf|J%ȏsh!.bT-h֧g7 ʣ,? w\QL^ZgwXͺ,Z)oIKG*WB7#.Dk 1:Z S1ZYnY)b>`3Jl~١Wm3qτXry9oT?,qr>~?Ҋ{b@G"Z|s8Jc %O=7V8~>x N/^Qx-]Ϲ^2?G|R׸"gKwkRNGWaH_L8 ԣhi%^+ٹHN=EkFG{7<=ND'#'L77W,^}a.9~.X<Mѧ\In!MZNeO#eWGgEm.FǥR&r\N%TB=[]-cy*Qq)&M֮m“'OaMsp.1jh2`gd5XU%;mG,t눐1|$z4R$;j˻0ժc8mc+*y.Az"Ť9Eek[8Xó ?6I8xCw'aʫ1/osŔ7/*^"Tpƣ_&AejSoݸ sV3v|NAխ:9͆]Qi0  ?؈A|\ '/*pC ](mi[Yy}fAdy!T,Dzh'IHJVNjA[kg6$PJ>2mǏSgCq~ >6h׹( &#/3Nf873IU``6oJvO'Uq4ywHI!YL `M;GgTŅSS2Ei)f!^8V0(X^Mh2>N4Ôx X%;_/q`ʄ1(B\! aii kTI%4TT&q,VLOR4u<#׳ruR?Ou̕SGQQz( *-F[bv3 -nteBlhF)LՄǰ^P3"1EYWP^L,zQq{VdZcԱ~+~ǘ!oV2XYY"gN:2qd.`mEG{/#aq]hݰq;'CTlPwUCuS5F:n<$x{bʸ1WUrM+;@P̳?s'7HiJұd:8=Cvzu$$"ҋH.[!BN w񛎞+GDVyչ)=KRzkױU.ggы ˆ45ԚExr>xǧ%L ҝ=r3֝>n8g{#Bkt\(: y|xn}c|;WEa}m'{IkKa'hH 905eHc!UO>&ȸt,tBt|d ?}QpDw{qljnS۪ : A(]f&m,Q-!ҝ&NÇ : ;7l? 'LG Rgwކ.zN{d6=diWUs>4"I kᲜ Ҏ(WS[a#Iݓ"40Wxs6{amŏ1[ .'\=ɀfhA džסc`_1*yԙK* Ѿ*׶&?l'Äl}ј-Kq8Cdi\D۹ h9g?!ފz 鞭 9M&T'x,WbS1~x\/s3I:++; 4@UU6W1auf|^Id/ h_zC Txg/9 puؑChJzǾ}/UɟϳWGëxבIS[SH.EP疉k΢Deg[#D& GhU) OhbiqC(ulm%XT=i"<jJ|Z7\4zs'3jVǦm&=GBF"9ԝP_P;c+_4ٹ -ȋ%VsrT"Vͱ|NsŴy y^:i9z%&! 6k|F>/b?a5zKD<6x% T֞:{uD_[U}y~ʭN2 ޽nzӖ7д%6}e. 6USh-5TE@sS4! apZݦ?*Oi 7Cӗ޼KӐ0uĩy_&)}:C Jp@Ϲ)u=: Ж&,MZk͸Ь'V:iMoszVi>`.@fbp%.lXVLKD8|u^Zؑ\gw}!޽ڣ/~W7 'nR$`:CZ]haм9I8-Uk9{?s+{O=@fw',7B>}׭XP5GX"XbhPٗT4 }2(%޹]^#˸&4/Dzn2x~ HkanBuZlZ%&&L̥7}`;<+h!fD4w>缀&T9 fbO̴̔-@k ص͕HnQhiޢ^6["p#P |##HZ=*k,(Ԃ@JD#`ХlX6M" GV#2ZZ=uQUdC)qѾ=!+K{un~D@" Iz%I$II$z" POd4D! ]S"D@O$ &>$k*[$艀$@=$և$wMe$=] QZe8D@"ДH3s+YXÄfV&,*,@ZRiYIG'm G{{X[YLt@!PJSg 5=11HK{MSZoK  gWޕ ix .Ht" 6;qIp h*Rw {`-$+`Cy\r9 Ț_r|@v *DFH$M@@t8r] WwOpAR$@sC3g7d']50_txOD@" h0G#TSo>y8D >AœI9'?G" Txl>8@`gO~2DC 6)āS1Mm1JQ^Z\ؘaB_'Y7meee033äIYg=xL2I%'?G"pK!۞*ڹןӹyDq=$/ N~x{P7M94ʕ+X~=FGX[YU^0OH$Ux/'}EdPcwPVgSb(6O\`hhI * eG#x"2`pk> H y(/xfl 31MqI72[ p1JeIVеMf*YϏZr~ Jx?&ID@e Ϡ QN &%}hJ=$x3, S335$? ePȌLDD#c32R"jv6$&>E\ym\k-]tÐӎJ yu/ .+l-\%\ztnE~O ;_sD|`osDg`W} Ta?ʋۣBJ.1 ^[z믿jb8h[΢E0|p̝;5M6oFdAAǝ"zrS.Mݓ )(br>@ywclPʋiE~r.,[z]5SHhiס15&{nosO"0ŏetB'R>d s5/oG}5Uc;aodZHհ:)>@CM|ؠ&Nb4e˖ 3I~߿~8d8vXxxѿҥK(q툇; /Xjn6L2E;)ϟ/ο1qDQgFv0sL,_\端͛74pn*4&֚Gl3kjO,|ׁ:r_6cYA]F?z(J>S%Ldx-ubS5@&v mzP4ƺTT &ࡇdM6U!&& e| ݋[nŰai2:uJv6Yܲe rJ{()Q*Jl~3DDD4Lr qӱDGGcƍNmۆ$AzLrWff&̙#>@T^=:t ɿ։!ЊWia|8XVrR9\NA'0Lqg.%Qg`zZDX!RNTA6ul,iѣ gY[bU+yyyx116&E1q0/0&'O> ?BBBD3<#19?b-"k  6-k_~(((EkIϐW+cI9jg366DghlNsy,]łv Z&peW[ka1 4@Xsbs+=uT-S&qAΝ*СCya>Z^||<^@^ xbAJk֬ c{xnjkJJ^S&3 ܤ'Y C\k Ȕ]Fncgc\lY#d)! PUhrS["xhH8n8͞\bh'k}}g󗥰{G $_O}ˢfR`ǎ}m틧ݻ03UQ6G [- *[}Z?]דL|075&)k.a6M7O>ul0)—gPF/7Z(L)Ft,MU!Jr\߶ LW_ޘD`VV/ʴiV lРAx̼ydd166LK/^, ;v}> w4u#2ֶ{ eQzP fpw S0!caɾɓ'kp<:D>;5jlj㏰d"!4*^___{CgXSҺPQf 1w_,8[!(S_V~9)<Pm]4縼4l+2 1 R%.WDMsL@7'R*XbY5bˠDQ@˸PAP(M(4'npu1/^>F6z<4~?HLGO7 u  w'`ALam,U~9}v$JVO4B͂" P:/Pv5SH8 w*hŠi&͓ՐH$#C\efOVOFzj hpD@"\/@qu#z ;FMpDld.H$ssYՙk^ȉm응 aikPH$7KWDo .HD@" h.bvq8J_ѫXɌ;C̩HLJF]aan˭D@" ؉HN'_H`*[YT`qQE 8H$@xd w! Ve7l0\ Q34hYi J+˕{D 1~<Й-R{OzŔJj \柍=OaU7Vc2/hK)1|x~bWJƔHZ[͑HG@Xɘ@+C@`+9H+S" heHleT6G" Ic%cJ$ IH$# PdLD! ]PD@$ꏕ)2$ *#菀$@1%V$VvAes$?V2D@".lD@"?JƔHZ[͑HG@Xɘ@+C)*P/T#Eje7lD" "HfV05L_z te1۶ =䲘@!bf 5=1,fZrXŝhkؚ\ \Bk$DÙ 7uI$׀0zR|,|``h\-Wk4ثyZD@" f.]#>SӠ&@*U IDATܭ: lP!2D@" hJsp7d$ǑkP&d{ "H9y ;=IEEÃ}~R$@sE95@Eyٰ^ ss}q$MA}<29KѓsO~2D@" xWd}D/,+->8D"cJKXk+2$DʒT*E}~"E" 4wUz`soD@" h(/i2}[ . ::ܹ3A)E" 4{ᣏ>Bnn4pܹxal\eM4#HnMbx7Cm۶PT'|g}4N"HBI>e= CFFqo몘 H$M@lʼnzO4 bRI~AGGGl2x"}qwށ߰ak?>cW1bvSSSYF3Tg`eYbhwBB^u2XbB/W$rX=Do̝wg[~Nh.*jROEP;]{jҼz-~0m҄kpy;Nm@84ѶCp%*>Ġ^x|C^3s>owQ&ߟwԅ6&PR;b$o#//FB׮]Ѿ}{lڴJI/">Sqx9r;w쌨(lٲ^^^˗ѩS'W_i:%K 49&E_P+(gbq Md1qx;D<)93:a J =~B\EXl9A~ux8y> wAzV$饏""|u ״\"(/\J>jDt.D{'M7CWVVYsq9 =!xrx)һH1 H)/-3'xm46>e gц\GvŌ eĹ("mJZh3נּ聝nIͨn)_{_o:k(wF'@||P9#ԬY0uT-,ӧa򖵸zK_LL <==v=ʬqr:M m6^xA_@@֭['BûaE+Z30l0[+PmϪQX8oRH 0JhsLe9ANs~-aB8Mfk~A1hi U%MS[i9t#Yk9e'gjɝCI4@.k{IzUر0-لe5ގ7Nk%&&j $˚"çM" .iZv2鬫4j6wt $m0T&mc@@wdcңS8go+IK[QV׎Jز/Ԫ29UbnHxx^C*q^hTWPbB#d?+W޽{0QiZ}l`olfO[:  ,ܑiؗO ThU>05TzunGrf$w>(>xBxd"Fǝ, > kK:2FDr &֮]+zec &(s'F..yewZoϞ=Xt)N8$sX|'{YD,6Y2WVV&_ԱzL>0wgwQF|Rth<}_~ L~EqeX魝?WPo낳 EƤ`c&PEmxΦ@ kOh_wwwёЮ]; ĉ1x`{b'L;5:044DDD+i,Xve͑ ĕ`3|K_)C=8%ǸA'''0cǎi(ͽ,Vs='?~9r86(n̘1"^ R@`uhLխJ ÂE/c&ٰʣi|]>4R 'y5!p]UHM`,ӄ{'c>zߘ2G=?Xp Ԋ?v#{IY|;/>T/g}{9 Σ#4d6?Z=."wygk_\\Hp'x k$99Y'k<&D S,沤\/\'zUšrO5*Y)?<К%,̓'~Qq B"kgу}\m2!2nm6&fwj1y_GeN ̿<)I5(H=\)iyɃ}P>khK7V鑭+޵qEc$f#۫MLrhRl90Ț@ udݺui/|pwwꫯpS *BBBwyÆ ӔO;5qO֠Gl-~)$f<6sv5[N 9-Am=#cakm+ R<>}NTF79'xc\Uc`ce[anf'.ΥegH8bGf Fޚ4%%yAC?`jj@۷w7| **J^ZZJRs6lE㏋/RRRPXX]vs_0A={V+HNWٳgcҥ"_SN իظq#"==]Ŀx";&qX0j(m۶zS$3ap%D2w񀧤`̠NLDfo>=~B\El9i9PRZ 睋 0x{% 0sBo[B‡eexDLq9 =!"{OD^zJd,Q-E`Qqҵ`ke{&i0/ߍ!}{SL"6,'%-G{+C7z`'~q#}G/Ὧ7ŸcȿM7X~WAB'-C[^xL~L0%''ɨLhxj Ҍ3ߢW^A:,&R/5eggcժUŋ+Wz-xG"IM!k,D m<~0|t8Jt ?= =O %r8}1F0o{M)Y`2mHg͹v2v5FtZkS_Ͽ","Q$߰NF&x ݅NDZ{qR3ם;n"4C9E3 jL*2hb;gQҐ_zdx)xsDXmH$n(7Yrpp~'ta$%%a۷o!CǏ0qm;v,VX9sO;}{AQQ{)׃{,fQ4=%{=tСJ~oz!"3Y4"5u%L[%9kp1)XVNr aanB&f{5d򟣈O&5har !*LLLDﳏQ[[,dlh;/+: -{ H`%:* znje>_~d5} ,MQedcңjۻ(&7HB;H`bC+*v.*vv+(" @ ->.w,3wϽt[)GES ]{Q[tI4~0GT#&nZ%ތ~t-}d_KѩF#655"##ym^b>z,Z.\H|v+ u*?}PZ˫(WW=C)b @|7t ء58|BCC]+(]tUoL w*Б&+0[gߝ4cJ:Ʀ'``Jt!%WqC?O^t) Ѷ=U}> ܣGc ߝ! סC:t(!/$y;|)ٶmi}QQb_`U ۴iLk>-[Nhڴiʷ`L~zE~8 G}ipFaZZ AcmO|Z`Vإm#&DUY:J eS8.DLCS{~;|}d,"֩S'566lH;vT!LF~@P_fܸq 6Lah,NJ- .GEZ;h, r~0iVW[O:McTzo_ʷ(0n`JUcz/LlJArm3XCeʼGL zzeҶ.*dER!BD<3f:oܸ*ܧ~"v=êUNLT|tDʬY_'H/rƒ?k"BΝPߕMzQEj 6.9{mPnh 29+\ɎMjwu  n 3tE_xȵi mߡ1wKHA_Fn@sp fs-҉&^|?2Z5sDkn[}P9qopH¾m;_ ={}޽ƈ|RIڵw]nݪ t6/huHVt&L:tEhYS(ujdurid3aҍRۥshHF['n#*h.r !^6<Ͳ|V2B8LLޡ{o2/u0K[F=Ж_p// 5e9BnN߀i}NjȝyWgI"UH*<AZ{}ev !@'%A@6B^_ 8A@ 8rIWf'Nt\k# h #AZ{}ev !@'%A@6B^_ 8A:K.  P0M>Z!K `Va-wt5i#@@(wt5i#@@(wt5i#@@(wt5i#@@(wt5i#@@(wt5i#@@(w^{y{{SFkݻw3VKyח:t`ɤ3`ylG3gΤ}RjjjyκBϧn2aAt#QSmڴIm-cǪ&%%{w.Du'v۷7ٓ~GJKK[rh?*͛7G͚5s9jܹvժU3І Oi}b IDATo`^ChԩRBBw~T_ڵ5kc=k]讻Re< 4rssilĉ4j(ɡg}VsΝM]v_|QYu/W\q֭݃ g}Fƍ?\)`Ev uQ>}(;;[ s dꪫo!j޼9m߾]~z¾vڊ|M{?ǫ=+R^ThҤ?Vc .T(Et ŋHK;vTnUXmڴ1{wIߧaL82RmP[ю}W'2vѽke8>+09x"t&m|VrB*RJJ5w\䮼JE~ w}Ӊ'h޽`222?T@Rm۶PAA6+] _|m޼:DM6UJWu_rڃ4WXpEԪU+z뭷ӦMGoak R5.~a.u]i<X_z hCoDyyE>êp_f_WL 5qEָ$}P8pANN;%@hU09R| ͞=[-[1cƨ(1|rM7)eK,~Z!| 9H@@"FMNN6L[wܡrBCu޽v & /Pi;Z{TbkM"r_ŧ޸z_Bqu"q\9xo ~Hra09oVڿ8rg/tRԨQCY<@G3&6bo4>M(bZ %ڲes]G_ ӇjK9T>'rzzE+YJM%8VRx`eG4m5hM ,Ǐ;4ةS'?hʔ)9 39sT2СCU/Td8`՗6AqO>D] iL\ Zx7nܨ>G5ΤK.2~Ngm=qmHvY+iwkߘB*;OI?g0Y~ )=]VlذC|vയ)\EP#~?̄I f.|h? 0DZ 4Cb 1RgPA K]8|z,Q*t% 4 hy 4 hy 4 hy 4 hy 4 hy 4 hy 4 hy~ 0("0M]v-s #`Vao 8G@9>rU,W&t\ # hŕ s#WAZxqej !@UA@0B^\ 8G@9>rU,W&t\ #`aajǎB kxOw"AhF"///LJ6mJ_=Tѣծ]y{nZx1]֡ӡ*<G>?^ Fu PHAA۷Kҥ Yjպ쭷ޢĉ<9L~!hf2PA\us=C?:T]humZj.\hGy]vu]G۷iPDzǨ[nzWО={>qpM79ϝ;|M4huڕz2u8=ZЂeFY2qнS l! Su{wҨ[}H>]H9~Κ礗1ޡ[R)w}Ϥԓ/+~~;=w6ݍCSWgߘMvrhԴyk韵{Tov.'g˃+x@]Zt"z^{5U_abb"\-ZDEEEѺueggS /Bm۶m3Ϝ9S 4@ed׿[O]M>>5 Zm'}0ӒGLZQ:׋g-hhtd.4i@߱051Frp Q <cbbFR\\A|"';'N)88X+Qǫ 㯿H!33~?A_`q>KSL . λKuU &CիZoy_HMFGUćq]wUX0oY]߿?m޼L]ФzunJ!Ar~:M29$lE~>?%#)'iC4b@{U;n zat"-S6J\ԓn?ph&x{.~8 9LoK5h!GtT,ڠAvhs 듯cK޺;Q]ݡXSN*Ld eC"@aA5* 8PH ê>^>}hƌTk5hjO<3ƾ14p6moWDJ ʧYYf;v[0aCK.Q B5h\ʱo ٛ mfI]Pw ky\]T(1 9#3x'Ǯ$o&]i&$Wٱ7Xភ"jS͔v`8 d«g}"-ztq)|DNM''g>z[lQ _޽{9p9 C%K #LUt_hhHhg buM94iRAO9_\~s2ad;wݎ؞VnG}5gmpum׈k.4=wϔlzS6躋{*K<;/VZyK$ vJ}ӵ9E V9E}71UMKQIN9l ٳg\T~/! hܸqJcBZ=Ls{kY>c۟Ix * )}r)v7H&h~ qQק2i_ޏ#/kt?/@s⫩)48@}ʯg4,>e3Ǥ[34Pر^ZB?)"}H E&00Ѱ#(ІۡCɓGؠ,|@;u+nՊ4QL!А.r޽(Q\|aif7֐5kRll:/3њ:>oF5kk5n|kުe9Py_%_ܫQwW(sU4vLo<|vsr0#07VXA@@/¦]vߪchB0a2egCȇ~RNP)-p# ?@i0CAviM[E7^K/Uၠ!Zៃ0/+ *3 u;!B^|E6Or38XU Ӑ^N_;՗r ^_Ԛ}nQؒU;Qa?i$Ԧ;řsV*N-c"h>[DԜfEH9b"F}@_yM4)J T šCW^yEi(4YlR6?dApQm!eFVT/ nNJYYYP@ J[Ed}ttt>BӧOW&}Sqܡe}~ڻ|W~BlHhXg] 4RQ# Z7%?JQ0 @NdΡR',4* c"IsoB^Awۮ^Px-[%&F]v*KrrB. A-L!Rg/Ѿc/ƍ -4QUZ`rW/ IKO"Z2nw>[EUgqsD\)1MϾ2"^hH¾ǹy 2rd(@,PHL,iGLA{25|9@H!vgt qhoEI0k)"؀44lXuVϝkKfܹQX9qRZ !JV{W$+jެԩ%"Tg\ 2Jmy `$'2K)Wt1/A4" UлLK?-A3țtbFL ?xvt*uA@8]S7ӟA"\XWZ $ұw p"MG*M9`/֬p[%(p_@)4L z É}g]*  pع{/IW\e ϟjEեn$"RTL,̊PIqo4nN6#IԭK'~f#P  PUfzJ>Hu\#S,lѳrs(oMᑵi ([[ @"V8򐙂/k|^?ôx n݀rs(;36# y_/G DgXuٙoC]K&p;gO.K WO3s䈅3A]JMA@Bcd =t)!N2JA@BUꁀ`X' x!@*] @@@zR<@.Az X=IF)@@J P=$ PKA@VuQ ҥ T:(AzTRBcd =t) E.T=[F)T{HccP 0?'dѤo1#o1[H"Ya9*CNǎQ<-C0# r88ѫl]#A@pInf[05CmԿOO tqKNNA@ppP>C.x`7OyK}&@h~ɉcԺesn"A@$-7;v嘾i((ӷ"222믿CRll)5?֬Y3ӓWm}vձ<١CJo瞣S^/I&Q^^^}Wϧŋ eݪlڵH{Akצgyơ\N@VV} L8bRZK>t'6|,Ш0Ko=䓄oK[hA>>>7ЫJ{KP%UVmz-U6qDLO!_⧊=JKa-_ԩSUs=RSSiΝtqKU;CV2|+K A$5k֤np*(š_t+(ۗm7i҄.2h/#F u+PZ Ц^|E8p 5jHi2?0_hШQԸ6oL7|3lْ*9s ޽{qNО6U^=ٳ'w}씔u6miӦwZ_BBs4`z |lLnV]^~ezGy]vu]H0uWpDXqt%Prr15k֨>a}6l0;v,}GhTK!7Hj^ls6Vmܮ6]>81ׅ?]mLh?S|Vc\ulF߮];U6l0=Q??,FYHHqDacߖþIUDj}]U/''֩S'kz|UX#2Ijwі갏hGxU&Uw\ IDATL=ڼKիWRn?6|p[׮]ml^r:K,Q/UFunGT~׌{鹷j(cU}isF:b]o>}R۔)Slsi"*gזhLڶmgIiUp#Z Œ{UyΝ~K*Mڽ@Ь̙ʠ)@ƥ&>!m~2hPLĪ~7zheFΟ?֭.~Unذf$dJܴi7\p˗+lƍ3GQZK&+44pCݻwZ;k3c¼>/B!ВM7wP<쳪)ΝKLeC l۶-ǫ A(_2#=hemGۘ{5ɱE"1cƨqDDܾ}*&4M1H ) ֺ!:L;H*e6\6aNԥȑ#Ho/&G^9.\PβgbSSiPh_٘*/%- ~-Ӈpˠ=C4kP .+B!~-Gfh`| x2rpPWh2@:ڗvO0AAZ2mB&[N"h _S:cg/վETBll,?^}X@HFR٘T*x :uwBS/0"S  bǺY m[Zq*yH^FV*~Z)?{O;/b Dk8^lvW +TJ^@ ; &4=|Afx_ sYwE<.헬hH/AV_cWyۘ=֭2a0nʟ|Gd\]GY4t$ߧ~jh~:sS $O?_HŇ)'O&Ƈ~P>>|zжW^y%!m@\ !/k9+\@*H_jӦM>H_kb/ZZ)gV6c)R@?j7o40z;Ť &?6> M:!Q^yCkS\| lTZ7 W娴ņ n"0?RiSu:Lٰ+i0Lml 39 k6>l!31!CbcPTN=I\s.V{9}6`slBu沪7a/걶f<.qƨu6&Cعkc"3 2DѧáApPc=Slh0;&6me՞5J1NUyEi0fpp4nmq֬=mHecs2E,z,j#UwA !J$nH~\_>~sW\#09TB^}e5 Z`Æ p0mk_gUлLs|5A@NimM` :Z5) fH@i3#0 (o?#iE * 0L`(KMLNALE 3+2Weyc6E~@km()A@ (zHHe2E$,<'rr]S{Hb*3M>~T+.m޸p#A@m\bb \eV̅J{C0$qsڴaIJn]:QP<,RO֬[OGN}k|da%C.zB^n r)<6ua? t֨aZ,VA@0@AA!$Jw )8ⅾʭwf'kϗt70U?}9B.EH;a2 mB)/!ZԪEa~~e)v={_p0L3:t$3CE7gM7i%'GCC)sgViqm4XAtL`![ut;mtx6ZkdK5k҈Vv]WT^8JZ s%&P,2 f9p6cn֘<lӺmЕӧOwIGPI 9Z_6WpC=oQ]]۔sW5qt{kz,=1Oo#J7_Xj|8 nMb`0طw . A>Ԁʼƚ4u-f8?o /6.=7vRC_1a \/MeOnʡQRmE~v>1;q*_ah={X9Z3Qp_ ׷A9ܷ9?𘓋]nLBZ$ɥL'>c\xfAu$/Uy e 0IgiI߽RW,}G~e?& Png6&jܵj؀Rh_P /oF_\O"bB4GSL7׏|#(q:I^mQV 6ok'na$󌢸_~F7BĀT\ `+g7qvߟ7\&={i3)mN#Ta[)u I'i-&c]bhyxmݚ"KQΝOFSVcK]/.gdԊIr祖)Y 3r$u4j7iB)ѿ~F;v(lT'R'@~5AHZlsB;BytpBj>zݧ͘AI:-5գRahQ3&%:fmGl]/۶շ眣eLpLc"/;ӴN˖y⋔^ftX ֨GwUD0c"@416u19=;rSOQo/)@-d-S_#ָ7jDzRK._7ߠ~:-ZÇgLEG]m9y]7&4}_Qu!yM5u*^gDrVlϺ*dC6Do8e~:F8;Plڮz:>C٤mܭ;%35f5#ڐ?ΦLА@^~_w2}LL;&EqDmS`'&̄&T֙ XgGzK= k:)u}Ⱦ0O66I(r7W/ՉU(s65Γfa_dp R}I>LV}8|C>0ڭW3Ȍc,yhd} 5*/Mbny d_$o\jULmo"-T khӲ㥗 9\kUrI eLm ޾~ QFQpT&t]cpbJ_<(>UZq WG}QOK2k<+!ؿT孃n/{ `3ieXZ'=~2i/1 Sھפ=kKʓ@ps%S #>|E>Zc ů8`3CyPAb5$׹dLQ5H\߲Az%p4~EK^kcе$ow몴{T#q~(-#ޯZt8/QNrq OPҒZrQė^G=A}8ki]YorϿJ-JÌh|9u`oe 'ofĚ+WG9@V>8/4}uݥc ?pk;B ө8KXVrD+ְ33:{hOIҚ|߫k)noׅ^ m[K hqU䇂,N {J[5K*n_\QnF(F<Vϲ1xNq jkY'$;جr5S_'(v;@M1FbڒWшq[&sIl*0V$QBD#H9  SRk.7f:l?Qk06O$JYJEi  >wEl?,[9:W˰瞥c:Ψg(#Ǩ|iQ݃=4<68/PK܇\X7g{./&Qb"mW'*G@41-9[a[ÑƸQrZϩ'=9ٟn}>)EwޥLT$(o cbsӥ+m<ncn_G տ/l /T4 $k.8O9 UaAH6UkhiӀy`gӰ'a?uӦQDNN^8 m>䶐l:>q7c-2$:n48Ndq %)պ1Ku`qDYhrlq;icMnТ]<߷wh :`ǟ89 Z~qM~H0"QI/ }E>Ј`yb"w} 8EX=$k'6m4`˓fŝ9>¦R!ҫO[}he.4L[E%ԲvDj\wɿdȢy7K)paQokZ׀~̅>VF'rPx-[_*7(R﷦KSqD 3Es&8:a䘙+}h? Ll d MЛܼeRPNu Rg~|0"NPNYqtSn3i,_|Y3nD%5ʯzupK'_JpYB%ɑ sDShMB '@%DA@  P4@C0OʛF,iDj-2A,G4zqYn CqBj!r g21rSʿ͏."@6'9<њ"Fhdz?oNa*SG 2#uCvj-zRΥ ~-6)ԏ|),ysjBCT'5E4Д2A@8m$l{V8?8J ·nJ'?wvS&@U!p}υ_ 4BkS6}T@jPhpm\0-T>e.׀I y{ 4zODפISܵef3[GpJLP`pٗ["6eTGk'J>yC?͘Qph`%䨐EY%Uߨ3̀yO wE{Қm#A@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BE5IDATXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF ;IA@BXF i'mA@ۻ(˄޲IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneCarddav4.png0100644 0000000 0000000 00000056033 12564151525 023536 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx|V;$Ha%wZGjakm_ku:uBETCd;?yy߼ 'h>\- lغ 1sƹyy'xINd*wB՗^ēϼ"ȑ9*]'/]CݺwǴƍjps_|Ϛ OcL?μl^7W5D]^KŎR$aP\xFWx686WZHڵoiTU Aԑ;aՈ4#n;w#55SuB|OO{u"/x20Ӑ_IIX,,)Apx~]`mX*~V$t¨C> bJɹ7miV"o$O-\lAMu5%=OZ18's`'ݻSpˑH.콹MCGミxG;WKtW P#Z$8;/9|l$&&K.AeU.]y  V*8@{j8(yӧIot!˗ݷ#^G6Zyw~|%'@.s[Poj\vӻAX _:-"А@H.kГӹp]Z\]u_wyr__یQ8ON^}͵|P**t/,/7wo6q"r \~~M=w\NEW`4VKi6޻/\qޘ=rIJIFxx8 lZ}1V~;%-:-BbѸK㹧}1P<׮^ukVaێqZsSOi p(_? uw5Xꛈ_7y o)quGh,EKieg@PP*\rгt(s+'CLL x p0/_vǝ&.@Nkx\wBb舮Xp^0:,^_K_| ZIߜ>1[|yu;!|zzY1g W`!d=Cg?øQVQboA H_'bYVZj<¨SZ$X؟gq Q{dJt  <fxD@l[*٭uSQCzG7X~/痞K-Dxwu7@=cW_[ϖx_*qAg-x?A+!! s2½+{ =lWTFJރ'-yH 6Muۚ?x{m/|}o~[Jk\qJa_|G`L<OpQ9Ž~y&n9T`֗b9Y .gO1'ʭXIe8Wqq )Cf˛ѓn453۝ d4k5uQYY<t?NLK/ԹޟOEHCBC.?Iw=j$ҖO4O_zv* hGdT"7%qC\lד;Nǩ+Q&kdtW"kYO. 8dee+7 pJ*q 0rjw cl[XYS@wew wzS׸R=r+wQұE \m~x3n9 W_hƑ>^&N!$CKu'>Y__ו!".C{}K}pv\ J]W࿼i$ >XDw2m@ݑi4 C=_?O?LPH(ޔ-5;tJz; =P(pǺ\tA >R_fyvg=_`9 ξ,??&2 OABB7--#Fl1~`Wg't/"p9ۯeDD]'/cuW]w"sIkkmȱQ9{&ޚ;TuqۚUNm#E3eB?(F| Mŗ\a|6l܄ /kdf¤ɞ疒iթ}6|v{Չ;\ݢO,)6(-nHߠPl+OUEu+EU4۫ kQ!Wcֽ~g`4}=Cd罿_h1z$.^.=ʙYӻBJgf~u 0i#dw n)EPuFYe ~$röƨCvGLߪ7Ruf#ꏸrTz耉ގA6]u 1}⽏dboǎ=d30@E#xiMT,Kg^,sY(ifjq23"㠫kb$7Ɔ<~$NٻWGb,99xVk񚏌\S7S<c qΔ~ȓւw޴.; XsD?z0:ý~iWfPFK:O #FJä5X\?Q&_I.P۪J*\zmn*su]pE7w|e4i+̘1cLںÅG%5dJsI64-|]wq2U$^$3v}Kq]ɎRb1N$k0gc5*vpN Y"'qơHߟ _e9S'h׷^ {pP:HиӧLc=^x. ?BIEEG:)~DFaȑXr"HA-DtxٰG@Xhx˭0_OBoDTiqeG!Nmu=@r64tĜfDДA5=w;xfH ]q .q#d?v\hUiGEOvG?y1]!i_3vū\3 |-ûX%ȝRijBjZd3f`H-e@dxB駡T~ҝ]?7r@cuBUj473'0v "MB󔙑ߟN7˝ބ7 lVRٜ٘te@y<!,JkV/LG$:, t 2Ҷ{ 0oG8K56~I`ㆵljdHSi4 yDナ#*&N4.="o NbaI$"Ц>đ֣ZmIĤ (¼ã q( }ɓkiCf~yiEfz'ے}g;V&%Eؗ,"-.DyY)+'\?8`0B"Stɻ1#={NYfkȻ !7|Hg'G8Lj#.}{0mkJWɛ>펅ɞ[p8'==5ݺ˸ 1p "Đco]Tx}c{BLXO:`ԠcW\VźՉ%x1+ޱ9: ROMڌ]j*y!8mxKu@B|9A^|o.i+ldp$jޛ)$eO[]./DKs !1} MW0vk7lźٞ}q|>MB@`J::y0ojCߩ:{z_߸QClS(WtjZx;R޺V.a@뮾 #/ѮO۳C+ 1Qeg9#-\\DˑD%jx (GؾlF*Kq&g{&׋lGZ-n'㔚-&40vYzl!yVf˻+L3j>5w}Frt'iʫK%ǥ!}dgeМQ]˻Wl=zɛ],+-}\|o u-. 7ﯴ$c~ΰH?]뛃jTL*4N8hQ2GSNs\~;fz̆ 9GKfwXɇM^ف>==Bݶq+}ƕ7<"Z\3w uqQ\T`ሑhCQdy!s0dqcmƴWӠwmFjX^7bo1ݤk (rr[#NȼW.KX㯈`^0lr|Y1ߘ?<;;{Tϫ-B2팑lv`̰~FDcP؈5p)1byEd8؅>]<ՓA~tݥjږ( cFޓdRr*ueظzF 鋋ϾT^D ye]I#qK0ԩOk/u5˶'Un)p +J.&Ln4ׯZoyy` d>iVɶe2\|Y=@iK^8 {C>y***+"mI?^^R"og0X^Ym&ƐQ"$釪Rj]vT㌃'0nXJvY~E>8jr'ˀd546A(\syW>o6?j۵/G7YQC*/t˶*ݼv/FO_A /ɂ>AS|!7j\J - %ƛmAٺjB£g,uz`itv#?;r\lDIaB3q"cPZtiס[ӡ*WCMⰉ&iIN+ǨJG=n9JGj6fĖ=Fuä1{Sf'RUQOHwк+)~Kܰ yDz\k%(*.Q\\$yKw5d\~1UkRo3O1&!%-y;>#\_+Ӣ\޽z?z:~jYO;?,7^INF2`bwxyOOA]}maM 1QbicYed?x=2`ܯzlzYSЫg}KgX?|9}dqr:k g`fYEW|OL>yEy{D[2stո\yWiLx : 4h@?\yXn#>]II ~]v7lٸ9oDgj \8m$v&bp娐揮9(|1Ž3sGUByP,MǸt4h?M7w݈)–MkQTnxΫwz.y 潇L~>7}RݙC59͖0?{Ŭ1Cznrk۶i9ػ;B]^`rFtAq8c?+-}*_#/Q 15o61H$r5-3@A>}1ui^쓧Vㆫ.0ic}HIAxyvz$TZF2{ˋ˱ig q]#)^=1s>eؚa6^e3&aؐf|lj%{(޲mefԯ4wOCeb Evf֭ZIw5BXxl(WU7S-;#% (]6>YH*4|zנ[ۻD!9#eǽwQY5*պώ*DKMغ3KS8+A&x5)'۶&Hu0t%4-;G Ϋ Tn?N3yOJ:BMu׭ ;,Yk-\- ={H5'@Wb墷`N=,$_4 ]4]=`aMxύ7qH84S_Q2(s$m_>ix\K=BI/)IaFMJl@/ E{ij&b*%]:yz]|2l8jO~^ c'iîBrz58Wd FMDalP_I;~U8T.>d(2cMΙs0|P Zk\8z󾞪yiЖ{{4㋊Kwģvo/,)3-I\Pw.P66m݁-yGhdw yCVٽ7jP[XvT\S*o+P*G/.5)0rP.!>(Lz'7Ͼħ֢;}'6@ gyT[,S"M]wZ1shDJ[V/4>~4늰^<Fټ\8 1e0yh:[` (/o/W<.MCCҼ@Iim+Kʫ]MtLb}ɱ&͙E{5G-[JP?)))%ݥvdB9!(4uAP嶝* ߻$+Hf桪0nWr}t!kXwE% ﮗ;e Mg_X%UQ[[#=ׅ93PԎI}B)xʐoe-p2]3%2. 17fL`vק $Z˫F1ٛ4 gveyIa*ˊW9'c<)PdQ/WkN{kU|{{3~m2M ?X } /)ЁgNĂ%gL_<2deן䞄daLV\8tl5T gMϾBvŷ"!qRWgP&map5+rҰW:hOm%(n[t]i{}ߑ’Ja4}IW_P܅GҞ$l؝%}Ob{zo }z-LL삫Mr@.VnBl}IX>2w1t_N2'UcO>12"7]G SnT.!2\K:iUR`ur2?ﴡ/۳1_<~pL>mdviU<~ hz<3r.?gN_qX&feH`3ZEI%% ҍifY'Zw>^}bebKsuӢ۱Xfh=>T_:;Ht]Gk?_IMܱ01;7i6:.ӐZ oK^ux'i}QT^g4zꍘ]pєt(֣}ؠ@tT#Ώ8s+ϝ`F=,9c[`gZōOtɕA?YìW|/_U_~1j\csB(>Z+ +$rKEC踶lktx/KHw{995:+2f=@ʹ闫 \#$9c lؙa f9gN\G=ԁ*J=$pT1,*Nh8,sP.*M_m*s 礶zh$8(@.^rS C#ۖꀔv.i{mKqٖi{o%Z8l)[ %\m^`tn;h}uaf#MeZ@-|TL뭈 [u'il*gOؼcH838eIzf&<ʛr_G09۫5cz{+ 硲r%776'e#Kwr 7#`N@rv'@Nlֹb,MZS gw6 .@---slwMR$A7U&71<*z:]ڭ}ڿ}w ҖoDn]hzTF_BeVt$#;-~o-"ڷ}gIVɮU:3јx-j|bܹmejVȣF1%vbu2eɹ Mrg2//!V5;Fo˪*Gc8fmvb#NI@fQ2#W# 1{'J 8V qp? 8 |&IX^fH<1e. @" M` |FM<9랥&NOgڭVޗz\'U\i. @' @" 4M4n%(YD P­$@T2H$4 `\HvJfI&@l tHce(/-ByY15|Qб$@6|pF P^Yq1]aРpc # )t@@`bb{"0(]kՕ=q?n BC~&s$@$FeXa#33У4JX%_v> 1 SODk$@-u>ƌC=%Wܦ X z~9= Ae,{I6$@$p\ ҹ6jNpI6$ddgM.9/oǨA]M9KX&uCVZK.ABBB9zcMjDFۤGTRa杳PR.QqH9~Bm׉VŇ/CXIX&?ݻ| =\ L0ҬP3'0 4$K_. ,%$?u*Q#cLACZZ*jN[\Uz___|7- `[ZV;HY!ӻ|tާOUeetxmzk4۳)N<5c:@Q/b"&$c F||#:}~Rf΃GŰH2I?>""~>'y7 wD]bR]VO#=Ow>ڳIN<5c:>I=?}G[Nq${ s_o@Tt}]8pM21bOY<7f" 7nn6\xtAoҥY ã>jBݠzm׮]M:xL6AfnbwB<5Ob^]T?,+w5bYDQjˤ37s'$tYŷ !7tf͚ 3{Xd +۸q#T#x2en3gyq2Q7?1cƌ!C?oo[lȕNGWFhG2ij* ѯWcѪ|9옜]-ɹ5_G\-{e# G⚉dx^1?ٖP'Ƴ;0#\#~o["##z盔^ 0[lANNn3)R1#l)6 & JpWVjۖ8ЏLqL'zqQƋSRҌmb4y؂~Q&^AO "&6VK|#n) 7q뮻_3UЭ[7wmbfYGnG_~e#~sŵ^op7_ė_~iAmGuʕmm|w._1 ֣ GZgѭKS|F܈УUj]琐 CYXE[Kp0|N7Bm W.HW9Mж^uG{ `xi8N?" xu{w Vk48sG܋k)8/:,c'x³o[l=;qMF|D m?W=j=j?TG>aF<ļ*5g֚:TT'a_ypKZ"~(oO׏ק|x -:Dwn[mrzn;٫ 7`#?<^xDDDAOm-[v=NWG|5^?6m2QFh[[lNB#Sp˺G=y9@A:Ͼ>u\\}zϱ;\~u@vR\:DmLYD{XvW&𩧞j+O>i& kݧw`>Ti|ͦ_oXt)͛Çdž O?i.kok~̞=ی&}:a9LsZcŶӱ}ƛѳgf69ʘN*!A>I`[ޅrn5q(VmJƬyO# $u%xkUc>V?=ٖ= 1H#^oNʠ6U z[:SOPР]mj=z#DtT3}T5v2 }h{D@t-sEj<^[t8F L0WXVVaEr'͈} ސ.mzoRd.!I@B<-yp۪>*8.A<~ɋ2ׇIDAT)d;|XE̓X-]W_mت`i_z{MV!ڳgZSjk.6YGmٿ?ۇP3Eh*Ŷܻ F@`iT7HDH:ymt=U=* Qr(;/%9^wy}&&GY~&p\]ւ:|ZU;CZm*N*-S_[lsb~kxOn Tm$-lk *zQi,<׿šiW=p{ q 1;IB@Z8Il6_wS7w"'Bgy h@DyFcēi4*DFݞ_{z^cZ.?GI) I2IgX_^  A`hvbҨ^)7dzr⧿j 2 ܞdZ$p"ѹ}SYtyZפuw~7һq2!iu [OފА@TW'?{}'Hi5Yn$c С`@@Fi>=󈈈0ܾ}'+Wą^>} ** ~:z)s¹̙3gnî]p-T=u<ʪ\oi#vc\y8TV૕.jS%bv5S|{עdw())/~ #~Y f?76*wMWR?aݺuɓ'Szc _MCLTX{v.16P, #},.9Mc]icx}ᇦy읈zy*v G@=46(qiiJl8k͖ek/ی$kwރز+|}yzZ}.!mRjbߠ L6h7!!'NCh^[pp0N=T,[aܸqЁ"]MZmj;!닒4Ů~=M';OH3{ʄx=`FWm܋3dJMZ@@C[n?~ٳ'n۶m83zmm-vamtC``Oɯ#=5Xu1 J5F]rjN]>T3;kҳ49uzm~MZ  |KZSOPëjM\]l -|UVV˨=!^e_ݾ{t(f]jktu&釀?xه͈l\&oK `||<S?ݻ7ƌcKtq뭷ZF45l޼_|1ش3 $¥s݃|iϿ1,yHD]<3v#7_}I{SmtsV)16$ҥዋelj2HHC6yzGGyx}noƌx7Lt:طoΝ]oA@( ,^"2-fT"B:^_<.~:Aw_2PCxX0x zG>K=bjّ_$N|V'zDȭLRv; 1WXX%޽{Vtm~~fw$l!M2O=M}:IzhGS'EdHWŮnMm_hL@ GYm-ΌzAzBLL;9#78yxOK6` 8}6 t `Ge$@'< _E @GvYK$pU tkqQa$@$ڢUV¢  %PT\_yhM@}[Ûm |ul mң WU!VyӜR |JqH*88o%A! ƺ ZK$@$pFV7|GMs@92;rfbn KIHxؽg/2ӍVZսn= (1ۼq=Ljm*9;[6m@VvƏ#y =HH] hߺ szVUeUMK^Hy>ᗁH:@MMI.2tf5.aZx0&*+P^Z-(ښjnz\":O':k4:6^yYڱ65@GMlYimnڪ܏ϣjϿztVlZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX,  & 8Љ2 XZa  PX, ߔ{ iD$@N"7ߟe!hjj sIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail01.png0100644 0000000 0000000 00000112000 12564151525 023114 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]|U{'Bޤw`[vk]E]k];"XF RB $!2//Kys~fo=Ό]]+++sᢤ36LtҠ^7ދT[t:a5يziQ$]s knrao^k)/?/Fu V9AF 9>V&otϥs@A 3+?mOD@ ŌSѥs6KViB湕^qvºA (P?KLJc30{6ޓ&OQ_q9JKJMfÏpttj³sgn?MZ'N;1cl]l7 ډ/Œ)QQUjv[[kX߰0u$̚1~mhqDFbJԹ3A}m7B &\> eOߠ*5/\;D1oc׎Ά :b䩸&,=dS~w̚>&Ԟ.UNpsuъS|vLW'q:` o[NxbL;i9>u ۈY&S{IU1p@5 &3鉁}z<߻Y4&k >imXU?xn -]g ?~=n-BBBp(;`kgko~th?(S V2Ea$Ek.|JL:B2)>*>vx d((ĵGN3Ǎrl6:C$(R :yH֢w%tիaM+? VXz*QٳI3?[vA裏¿[l~nv̘=%e冸ܐ]1v(d~߯_g{T5}+{%bÈaCeW8vty sa53ܴhX^t9{ܯem\ *9&bA|||;ѵ[Hl.~?q`ߟ8Sb7g˰r; MF9::`TԏBvJ~v}N{scwö< /k4>.Uyu0.;=%Řpxtߊ+PVRZ`^NRrZwޥh]{UɮSOF_G>z?^t/£ҐCFζj [YwGǝ9*d` >11QhBlذ:U;穙`Y{QcY[W ++ ȲXiKKr efdR7_z%s6,&T]lřLyEzGPvh6dzgѹS'm,1qG_cݱe3H{ҽ:Gέ[НOx7" :od~=euڠ899ޙƤdخ[^f8v,Sᕯ3CjC qPĶeS~EOMize1UqIL`3o K[@S ^b̞;OuB# <<=1al[KJTK?IaXA=WUe.yF}}ԙ|QW1nW[) *+ Ẍ TO|\B$u#5= 4߯XrՍvͽf C:bƐhG+lceJfo_n՗+>S̘39FW0];q)iȺ^"oh%91be zKo믈(Jhs%rhDp4]5UiyzMdUn"F'vں8 4Xny!ClʫI Ѯu-Ԗ u'N2"<[{*jN|eY}Ej{b+?Ø;gf1 r8o`'' i壢5vH6ae#ݶۦ0tFѱBPQM)\>M+QFWPU@y -g'RIcM}/:iC>xǠ M+ԫ.Ii=w#:2ۙRF%zE ۣk8YgJ&)k܏z!!PcRUc"u`W4 vH,<v*lg,X|5fYe( tcLR 䠈vȐavD(ij p~W̞ͤ,L<E,-ҺO+#R~I6%  !|SC8M<&{j.ۑ6_!vC;s yCBCE㶱.=U:k$-Hm{K?zF^TwF!WRisbjꜱ7=P#|/tG8mEF9Q^Jv:|lT;*ɼ/ʕ_⛕+A [[$T0Ve>rrl-t֖ *%͞ C s\qvlSׄ3J]Ay15^`/7xy{m OԱ݃֝: -1euu/".>pңt&X2S egQN^UB>{<.4JT'1cՋ̥u[Ӕ-OM6}~wj_ I/.Sw|~81{Y8޲õ0'8fNFo Ĥ|Td᷇㡵)Dtp7[_>mVTۡk,!430+^[#7 x饗ТT)7QTƜQ7^z6Y֮Z_y!`] {1i*A ..ȩі9)!"  OZ?O34ҨX^ލssuCfvΓW6}d~Z֭QvȠINXC=ӊV@̮s rxj#W"e 7dNLM;cCa HS >YyOJQwC0Φ9Cw!zоÑ*?&TTrh.lk7=is2s֭+MM1;|6 0O]?IiDBx}ypN^ۧNū5Ѡ>z;AVx,lDVZYYوOH@-5}:_-鬧]]LS?b94Wހ^a*IdFCn7xdd"Ɖ&kxL%u%5dͥ1Y:B{[af4$~]!s@ Z^ZSFKUDv-8~2ECœScT" `}!@`+ "@?\ kxYIqXQ;[lXzD?lcBO `kDA@~gA@`uXBmBJŁ t8a]Q;Y BGk'A@.U ,zr_ 46 %-?'"@GD༦=;̩(3"E ̤AuleR 8gL}.=1d yxu.nuS)Iữ1|Xݸ ]hӣpظa-FOZ/_l`"Gœ^){wl" (8J %9AZ,pA~~ݰ#'χ_z/;zb&eec7/? = Gm]A="`[Ղe0e }Owkm2{x ^ߒwQ* m7]BS@7\46A;mԇ,݁rX|i\<卮!aj`n2蓏]w=tb.rm<uEߞa:1D4XufI18{8&AIɈ# M'PVR kl~kbv[VyAb!`X\TH_څᓮ$[WwNq[IV͗1a,j1?! ~pkҫv,02̘2^l)l/ f7}GΞ>wIi/KkZUX6rF$ǣCRO=r/?v }ŕx 7{CKJ-4whv |AT"ԯ c{Ga~6ilGш>>&ݻKt8ͭ8O3}/Ug;q{:> 8k s& ;}._w#Naθ^UD } ԉDe)=ѣ{zvLt$r2…pqs"g_*!-'O8{(414)s dGh q`~w9M})K3벒B7 kڌ_"2@nUg;{0?둘SמTVHK\!+CzYl)97:)Ȓc_n~m>[8HG D0mx'Y8P̟_?Dُ0y\7=.a)2ݿfMF@J ITo۶ߐ=n\&ldtwŕsb"Oaӟ'7\5W8KƌWP_FcҹvqcFշ>AAcT.OdfধVZZZF j8˶F5PaN]hɋyvQUɻi`_{zys3p@̝~7ҳrqчkIǸ=V?lw!8K_xxt.?o> AZzf="b;߇'>>PU[0m\L߬ JK_^YGAqrOR`^e4ZOZp6FaPzOTTT")X5& 9={aoo3&`kD< rp3 $#4З> }X).T~-Vu8M){^<"@±"|LVZ\gvk"qC{۝I\2ZNcJ&~l*JͽV\]C|轷">%,a艉ۯԉCxoqD /888D S߉GI:. ڑӫG0}UbSy6 CTl:rs_!To(.-GQ=-j˺mʲ1Ms h9Grj K?ǜp,BH7 >CDG8u4:KOT~ԯpuCUؙ|翿߲CЯOOٸһAkU/6f8|"5hid+YǶ_is49[OPm7<#1岑tҮ1O0 j>ГI1NKo"[ᏵiSFrj&<=UQeEyr0Yc-f]]m,,U25VNG e ]TQ^S$L0BԹ_wӀw](a9*ݢ˧L;O)G2#wǠ$VM1Y9u'g_X rq1 D+ N4XWcPd:\_CBWCS8wIVڍ ܴdQ܍HIד>U{kZ0+ʊȑ{6{j#l|)e/6C19ftz~ IDAT+ТI Aŕ&S|G7jY 0<~GPTQKp|Cy)%3_kRXTl-ZlF$fcpjčAVЮݟtؐ쥿ƴ WX-y?{!]SqD5;ud*kg %xu4<ԎSI5e,6m߃+~ƾi?Ax>^9)#ɪ<#a;7rocй*pݣ0}}*c/,8G~Lr.:1pLSrW'./;#=ICؿ ita!#.RN!^@(㌧΄ɩӧp0:^G#"Z=#s M׍˫w%[A@C$ݭGΈ3v3U HH1czcʄcsQ:P, 'W&㬬j5.؜vqxU[xڽ4Xo7EⱥOã!f|h4{q3"?l;q}zt܊S98g B8뗐8ʪ[¤=䃷~G`C=!}VV5zUi,5c?Nx?#NX0s /]\H֚L?,66:5{Lspk?el\ ")ls'MZ}kůȣ hl~ Vz+nNE M]<ŞaxzU^c73.8t 4]|=T;؎f,v6 qY.ȥe!-e,-}V ̚_։ܱd*<\,6:.+ׇQ`` fȷσ\~Y/>(e\_>M;Wͪ}jM%W?:]mp҅*׭{~4IK&[A$&5@-e.=yn)-$iiZM*R׶ǁMŵN4Jrfēql82YRynl*gA6V&eI-ZZ]5Gb@TBMO:tg葸l1Rri,uYe,ة6.Ûk5\ȥo|S{ 6?6{r^GLd #I=]5kԯ Owv^!92|.0v()@ )r'0 ^J͂0 È%3s¦]s==f#s~G*iH)=7jpTЛzZ|Z^.YhEi Web8v21)-%E(_5b8oYsGS`* =ӻzNjXjY}R h~xmVjFՏcA@:IA@hoh.  p p^SK tLl 1^ %MEA@X 5U8c{  YS7x{#&䚨vh?DgiA NtQL# h `8EA@0i\$T:B$KA4BqPA@v,]EBA NtQL# h `8EA@0i\$T:B$KA4BqPA@v,]EBA NtQL# h m{cee+*T-iO헶 @B /$C/q_h8۟`8>dldDt 6Y>tRDVv.ƍIG5SA@h@OԒn8tHI=[[d(J;۩!NvA@0VJ}=fa*8== %%eⴴn xR%O0"VsK:A@튜amc G'W8:ާx%o驈uFDe/DF *KM- pX~Nf{<3-.X\X YX7G][\dA|`Eq0C{tu>"`i~;B~s% -K'$Wآr+p$>͜f$A@h)eMe`g`Vf`~N>r!?D pA`nZ;#լ"D8Hм ͪF  `y"r1ѣNVhR݅SF FǴ&x'" eWdw5L z9ĬV( A@$ s0k Oy"gs4 pq(*24Pu}/n?vA@ y#A@hsS"  ( uNA@@OF.Bjg:VXOo.  [EGRb:hU)w{u#>'30.ZVX۷ٽj^GdvU;|~j3(}n/l+SJCsŭ~98/`T=n~l'\qp{[clRgD NgmEWT\-שs8>Ȯ&5ō K3uky [-nhmhۻFۃoLoϣeo.h #7;+kBjfT%5aC>FҖ0|5GIsI Lx5y(87D ԯqZۚQ9獛QYZVÈoom9;K m+<sdsX tDgT +e<hnfk (7ӹv=neP#–"׭ /v¸+56QUf`T&˞*\5PoЗSC1ƘjM8T3mOԿ{h~Znxh 9[T⧨  5qS05~ӕXKfB&CQY4 qw*|so.S%'j:e:,\Qe&TK12 M 5Oq8V2_͘g <^qRdXT b#zIzg,[麶M8e07l3%Mq M ay| N=5$.7O\8B]p|ǽn@_RYlJ`X"4#-yJ=مҹ>MFWVû[an;D.fؓ|U~ 3zځŇ!h<w!@$8Hp-[3#[} ,@L<[h:Ů>XeV3ZkR >GVe!"J&?/o-EW5pT:kZBJ4!isDF Bnٽ-kd.^Sp=(NWXõ&lk;)cnFō+,~)F"9w#)VMm58C=&z>i ,<z}I#~t0M?&&Qe32jO? F0MQmys13if48)xLW[|@6@i2D&=JZٜE>XZefe3BR8X ImdXؾmC>6 ) gO8OY8_,t!rnH^)6`QWX mT_Bo y9v-ȡڀҦqr1gR*yZpbE7ZlE45:DiCȀ?* cn;PZ!m:rpvr03WU?H85JG!;eԔ vEKa%KT74==B7*WwBD&Wb(cD՘ASw0h'iإXLםei ?iz͜+L}$DI͹20#ǁôtj6u F3owEKʏ psKs4S `33^Ae--y|}1tj}j^?/}hiɕdDou:Y QZ?s / #z*mVŒwi?lcL~4bq4_Ҫzce׸\cSagBjjSizXMvэn* tC#8A7!%1#p_G2H텟֗D[E ytwD/emWI;ˠ.pX %_:"@o~jN|[L=G*>@vzy)NQ<L_J"xSZ'6&ue zuկ[_MZjn}i~B"o5p79 #25v۞ n[U5D=ȃZ mT1q6=SIe[ㆣX)=6Xӎ'lcl֧f /M"_C,LZ+iW3HM Y Z_(G#؞KKf8\6Ϲ+ɏy*kr*|d˲zkMnֈdU"@ 1 ֥r2R8ka=Bw [s*Ԯ"iNz ~AL.iK٣DU?/H?N6D2&]vdU#gM ͋L Nq:y$"+_Oކ.}){C>-OMڲZa/kNτ|_Lz-5tMIEG/@K~"hQsµ6֜xeR4~3I# PZRAm#`6 @0AKA@.BmHAE6X5R 牀 -bYLYf Ψe/l^A"0Wf| aNFsYInᝄt52hI$G͚ͬ;8ax`9}Y5H"A@.QU @e fiCY\znID6K{#lv4[{ ăCq% `q P\enfk\ ;Csc>9Soz62I'@k#0s)nw|ZI-"@nͭhH.8Fou}f>]^:Ѯ~9vE4~ފ_~i ?ƁI#4ou _ޠ~iiB @kq8rjzH@{31 x[w_089+\Se43͒t huܶOE~>Hhxz[œϽMj<!Cؾs*Љ} p1D8cG:w)u7EVVVغ}bcTԴLq3ƏFSa/eܵ{?PEi_vPjO5OH̆3B!GWt DRrwGhIU0yhTTTRD8}vFW<|} ydGJ:)))ec"zC!]ɻ@WCZV)X""LDL2KLJŵWUE+^$p;~ee6?(OFF+(,9YYXb3QR\B:3ksz$77_?"pWPN#bg Uy6%B c{bI* 5QaLtFO_3E OHVW{֓Y!X뤽uÉgwg{SǩQFK|؞BLkFdPLJD2 Z} OMMF<-./tޝ< ĕT8i<5\ik]㐰2Ndb?1) }4De$n.uR29jRIdWEa9\]V朼-I-뺫/D9;0mZ5rSSCU c~DlS;LĈAu ixժsӧG7kO<o/|HI;luqc?mQ6Nޞ_D=e^|Cvxhy/J˒AVDGSZS}LD|08dKd r0cİJ \$LSϱ1DOS3fSݍ?oW44n, ~BXz8Ez*F9Txo1菳g6ZGۺkZa=rϼz5ࣷVDˉhLv@jܩ~}{b:cօq;^ bڐtX~->QgԲ͋ۅ :9\)4xzZ6b1e0Yen$=`/3K5-aa/-{w90r|x *;56XF6ˍlGorL8 kNaxO< KmOr}+g=AiM?u:e .lC+!gF~ƲGDnAȏ0tV>^:Ú O{vFNN>v#zV̅,uL^7,G^!Kqxa 3摧I1#3i`'?EKt"EhI0{xL0J% v YMkT5A9-U+uO,l>D&3HV>n+ @+p4a!ioK-4zV6wF6trr2YE!Ȗ|lZhZlCS"zq rDv4O!"t'J @Tg'bßEH>A΃Uѱ  C 'ZlK^[5BMhCW\ZVN?VUY&o*X[ۨ/X;,Vװ-jA5M㫫_e:9NyKKK[7,Sj"&bfGm20Jx}*kge,RB4\4mqԏӎjJhR7&P6 hu`4A4 &I$"BY> Y$K!KJA,͂I xVO `Bf$ARD@R<'A@0 z(-.oU*Arc6ptrˌDeNOEEy)}:gA7,KDܩ?ZPXH/TAbB"3d {!T!35]0|`Ɠ*A@h{>BzJ{ۣ H] /=)ĄqZJ p+&"i20 5x 2 }zI,% AnF24> 0?' `7 rnYX^VlA" P1G"@^E^gh m ,sL,D׮A'iA@Wds,ޞSAb!k sL;}MD}ܧ"@0VRD@Kll띖  R[K!KTJGA1I/ B̩"|'`8~駰R=zݱ<٩߷~d|P8p`8r޼y-{n2Nk;ommmѽ{wtMȡ5&:!!!~ :uo\ > 5pX7Uf[;}4mۆDiW ())\򂑠 x`fRYY 14%Loccc_bС8pfرgϞ5c`ld^xA~xIe:ظbmĶ;`ʔ){n#ef#P^^&A F%xl߾]u&$ѣGՏW&-b+i}޼y3RRRLe˖>?*-n\ XOIsi"ၥK‹`P$hQdU7'zOYk0חիWcڴi UW]`LIff&nV#Gěoi*Y9;;c7acǂM7|3VXPeϞ=;w.IK7Nc={6,X`U??S*|ӦMDJdd:Ͻz’%Kj*L/)oĉ'-&AV*U/ ;rBpznIUG#P|nݺ:k8矏!HS'k׮i/Wi`5TKG ]bb >lxn.ĺI&!CImHG:qD8ԉk\uDʆ򵶒U#.LGo4vƌ:29fp_.jHg5/4t#4W\kacWWW4hC\?l:Z8s'~mO?~ucYzjg?~DEEu ugM.juM ++KiO$vR˫xG]1.BJΝ XXKbaCV&qF㏠_pwwGnnxh.xF:yd%ko gOY{e+##<}a}ݧ۷tcޫ}7O [|k_E@@ʴae۫f3f XSf\@{vBjڵk-bj$Gws5Eh"'|q((п DǏ{ァx0=/"ؓs֬Y,σ_Y& ^{ +AcϷz a C{ƭ91k&TUO{ԔnPqWuԩjS>o]ˆ# oHs}5x~@9s&,Z$l2v\\\pu9}mz,Wf)KqÀ5 ML-i2A Ո8Rǎ3أhJn%iN RU4=I_~x _E od%XU$ h+#;k_L~lݹs'xʹkLΚh7iADq³|C&? kE(=]^3g_Wv6wy9F|Ǐo2X6܊4d EMc^W_x^q^a,2.Xsl6мܮ4-MvNM vT@!hZLZ&O^FYsD7'a.WSNU#G3|ʓ&?4O[9b)Z n5i=84x#6BMEmFZ4UT!xx~S????& l* CGsE$mvO#JGKLtMy}LDKҊ5TCpO!$FAS7]-*99Ov b /i9leTSoer9y"m^4v?&w&O2&]r9ڊS ?͈oP"#AоאjF"چɞ 玀"soAM# ئO4N,%ѕAM# ئO4N,%ѕAM# ئO4N,%ѕAM# ئO4N,%ѕAM# ئO4N,%ѕAM# ئO4N,%ѕAM#` " \JMMA@*l2ngS(A@"J lgI(A@"J lgI(A@"J lgI(A@"J lgI(A@"J lgI(A@"J lgI(A@"J #G=/i p"PTTO>qqq'O?VVVףG;;;;otl2q|t+ _~8EMm4x#F`͚5M9ߴiS.\}}}QYY T@su^N>m۶!""vM_|r F'@&111ؽ{v"t:]iU&i_qw --M BEE>yw5[jܾ1Y8pB9X[Oƍt )r=':TyL2sO;Il>Yx,^((cSͰ|j{n \XXcͫvB޽<ξXMkGšCqT[|M[A5݉'?S2뮫؁9u6Wxxx`ҥRQ-J⬽999ᦛnRMV^iӦ!44Ti;-Lz۷/F &?UƏ˗8q{XXS{1i$+-GQ߆ 0{l~8y$XÜ9s2oZ 0@4kdzKKfؚ%KThNQa„ Zp[sBS찰0EcǂM%7|3VXBdسgΝ׀,o|>,XP'eTSO=WڌTU^8ZPc=f0:u 7{^E $! """*"m,kyu 6Q,( =t$I/son$ <|s+7)߽2ZdIHzPu@W_}5Ie1!i38[3#}lo( |Wb-/1[1!=ckڴ-c[:۷h wG:r:ԩS~8;ֹ{e{衇8Ji3ӝYp-/^)dr$!&M$(py'$H.o{Par|QI.,f͚QnnЃ[x,S*222xxҤ_^RQ&~)[qƍV+θ_*t'˵ %cm6Z@81N8A yz) k"F ˋ_>++(,rX} =f{)<)'< u۶m/I2X`MoРA2^-e@B 55U,ss &6zCv. ns9G 7_~> E!2p@qKAbxPFW\;H3++K\߉'[ZHKUFuwXTEa'''۳^q63q?Cݻwp+k .Cp{b*^z4c23/,{Xb[o8^xU/|Voi,K/0lF['!!AF}5ⶾ@~O!qM=وy>P- ?~w! ŒhHT,@&Ȋ+"U7ňP ٠kdѢEf~]w'#ڋ\;-0$"۸q$j^9j(qt,-ň鯗k"}? IDATwrΦ^ 9M3~Su[u6C^[]Yp݇ K$^d+T<XF иH8܂,oly ƍ  XW #@zhPx,.:1 5 ?{x`@bģp-,da!.dww}=n_2=6jbQsǎmp3S E?{iϗMdA.hw#2ǏkΜ9Ba1ɓiȑr=^xl=,HX9j\7N:$?UPU|=y 3+Ge^dDL6tOi6 ~a9ɱA[ֶm[YB=4Y`~Hl?X?Pri,0Cc<=dx\HXvM_ wFr[foYGTul,i3 Zvb85"iYs!3Kl yE6&6֪'l9Nh3I6laڬ-!ÌaP^s [\/\[/!).g+Ԟӝ#ˠ䄿*\r%2HNjTMˠ dRH8_!zXd%GS'gK=0lM8ΰcxc2c;ՃCaTUJu@|#L 8FabYR.bC6lXZxcÝA%rpbb2j,@&nn`9\nppzjyĄ! t)gHEӈ]ݻ̑DoDZϕd>GW֥zE6FJYIETc(@JQWz"(C@ 0vXkK"PPaQ!9^iK"T?\ҎП%d2E@P@]{ 0\+WEh"0)!QTGP@sURShkfjV%E@Pb@|\eOX%$Ѭ95iڌڷoGi3kʒjuOPWkseYV 9[--ȧ5_ lG)?/OS˛~[`" 6iі7~[FƖ|5痡:{.QbD|ϟ ?AKuE P(j:u0"%@?h" %@MFP -U@!("(5:E@TWP`S(~P*@P t`EJ~R]E@JN"A@ Z(B@ 0PөQ?(AKuE P(j:u0"%@?h" Ν(++?L ԍQ@)Ry̙0YoB]zKSgi3j"#$_L%?z}$5{5HKhǑaӇ֣(v p JTZԱ-j߮Xw۴>3|?zڍ_Kw_KE@<N?&11:ں,XFҨ."Zt%qD/ 6XK[YIFԺu ٲeZ#Ξ6oJ) ]ۖ4XrrJ[nN;Gj>L4~ev#N_?QO|xо59gHle(QAZ bfftAhݦʹw>>vh'$'+ONCgzu.Է)k3rQH;OXŐ%Fw>\Қ4D u;qE@>J۶Ҟ{׍'A˧]LzqLeD_DÆM9lẽg^ZaSDakn\wy#\NPfg [L'DuChcӵMK{ m۝OآtfKΤl5{ZEԡ hJIi@^&7VK'k7#ݩ1w?&g%O>j*1׺}E@~&5#qu"W ^~~CK]}ï A$dDY4HXytDj.]J}'C wϮ46IV$ Nvq|g==箆:$!<&~%Vl&\4\I]gekpԮM B`;pF(I ]< =V(!PؼyIn [r ֺzl} ų8aY]v,v-a%Vfv?oNB:Iq-C/^Kk Rlgv,'sVɐ>|Jj405gXMMyԭkG{(@t(W=Xe-H2ᨣbd]iaJ21@pڲt{U.!%Qpi(EE%:-aK(d4nX6hlNbw[4c>FӵWɚ>uw݇kw!=r&L ;D_~OuuZBE@(A Zr^39 ƵE_';8O@׋nܪM_"Zu ?j k2~ WLjuw'o{&sġBq,IE@ nj:;KXdwmnלG{8ܪeU[ F\1}74cںm/7&"_5nJ_8lf> FBMP'g2֬D9"v+.ҷL~r6mZr7dKI=.뵢"Tjэ-w?o.OLd .g`q) "j$%%y! nn&b4HNK}/2!ĸ$oܑko%s?}V|^"K,/BgyLJyX3fPw͜n'.닭e5U|Cf=LR^(U@cU^(@LP)ژ"$klh_E (nmLPjJ5i6/"Sc 6(5 %4E@)J1[S`M "*}ᑟKwwhhc{mLP:qu)~CJJNJ dm=ִuއ6i¿P~͹E@(|>wN.dz ֢5%$7 aoam޸ ח7_zNP~Dx֜ZuJuꅵVAa/kjp2x_z(Eؐ(sr/;s-9H٣FTYPh"У[:-{:gܱ5ZnKhHEP P,]D%ၘ"(5p,@P"K]p7~}/u"(2E<Nԧ:"P1WamDGAi{OuE@8`M2E<^JMi>QE"Ұoy"@&~(@MGWy&>h"(~P+@`P T@E/J~S}E@ =fffRzz:fRu @mD`׮]+իc૯Juԑk׮}vWl|Ar-wᇗ>/RVM6Էo_jȿexGW_}V1[3ΰefu֥.]_N[qSN7xO?mΟ}rydTJ)sVM8\|94{Zߠwr݄|ݺu[oŌNwʕ4}ts<)**}`ۋ\{t7ҦM={h޼yzlyuV7|Gf͊XԩSi͚5CSxP\\}嗦X> ȐyG ^/n\y&$'|ҞylM6eLq3}<\'l9IIIr=m"e氛dgg+¶qB0?\'MN?t)c(NFFBcf\;Lr=aV8qlԖUu&eGWv|K@wtc59>ˏ?/R[3&MwV<$ELo6)Ev‚ݍ$h f͚QnnƐ4Ab)ڇɤ ZnmZ[`%A`5ݛ?|9 -O>Y KX^_sPHO8 XHmSOI__C<+,/~fntMba1cƌ#z>6儇?2an۶kIv>LF $WKCRERSSŒ7ޚ0aLYu}F ! 9#/`W? 8p 1a Uf#^Ў; ?td-jXR}5@psBߢEJ]];H. v5/裏$#ڢ/XgnӣF)\Xck|7B1b,1K~EF ,lĐ͆x%Gءm۶K@̩;4wΜ9D04EL'OL#Gg,Wd\\tI7x*S#ýc,?r$ZqIFdKgMd1VNi*lI 2*~`dMde :uh `&.$cD,rgd wFh^k_^،5[001K-7;L/11n֭^2s,ƂᐅӱcG{q=ik3wrfxZ]D3 |~&=&CYs9dfPq C\/P[Jtq=[x8I:5 LM75WbVCXlQ9~^BcaK 2: аo+hXp>@.!.6k,? =^(ms,Rt 6t,Oq}gHf'x^r%r<^seM3|p(Is2DV8e/'S,9:A[NJJ#OCl!@^p8/90`Y}ezsIKaaq@~êŲ8٥]ĸ6l q8Ge p`\ˑXt)%K99e Wog)t LH:/t?p# ]Hz^L>g>{Kj|(w4jtLE@<^ d=E+E@(iN+@u X(j"P+PӦV@@ :P:EV"X+M;(Ձ`uu(@D@ VNvZP%@QPZ`6"TJՁ֡(%Z9miE@ECPj%vIDAT(@Lg*"l׆>*@TP Z"k,iE *(FVTPjJa"V(%0KGE@ JQU+Uڀ`m%"D%*@m@@ 6̒QP`T`JE6 XfI(QA@ 0*j"P8h po~6租~[ֆǂɑ5@)33өFp صk+z5u|WN:u@PՓ>([nE?rpqzm۶4h :㏗_gϞ WxǤ}? :Wfd۽{T,}[Mg̅/"jՊڴiC} GA_}Q{m޽be]6v=7x֭[GoVH0AYr%M>VH<)**}&z){ox޽;խ[0O<tMkcu˪O;^{-x㍴i&,^@ͣ38{9[^w@yY F׮]K? +oOJÇqٲem6,?|r#xgҒ%KdKJJr˾{w7sLˣ9o-[j@Fk&MHc" X[/{HyfC3<I-b 6ȹ?O! 4~N=T`C:,9v+VzVò9r$}{衇O>⢞p t]w… Kc!W^y%sNwH_N*qG'N3fИ1cd waw}tGrssmٸq`ܻwoر#}٥=sp;7ԿO=XzA}Q:t(uЁN$29ִiS[Ƥ)pڷoou^Ecw[2&n}ٳghS8mϣl:o /󉉉nYfqa(3V\vE|$ju}*xhž3ura=o@ُs:g[w[R/]gJvяUV9RxW>q˗-7sz뭷23_@NVV\ǖޖ-[ʜl /؎y7[0u/5V ᘪ3vX{ @*|fxmt'j \ŋ󜓼IhKqAd+a@4iAxˇ btCuxGyDTq 8ꨣq4b*:Z7\8XK7\ I@IXKV?@LG*),4lseV'6bus"I ϜE)ߩS'a+I$!>U# /_uk-!Z38gq# >c륞?\>̡ En'L aSV]Q#@CrvisΑ~M i\0PA7'tqSB7UJ"΄O.O^C_={[eo09 ҆ ,y׿U/8l L< KL[B \c ?<'xee Ϝp1r B( M,rJ ĈX"⠸g~W3"1}r)nB??)3K4e'R̡T?0>c;B#_|$-ma5ԭzBcn.X}&`X7:ވȵH <iIAezS$M, eF`AdAB𫮺Jge5 $6?az`cE?É8}|"ckZ^}w HgT8\@6!X/p9Xe&>,vY5,sy7Ĝ~wYYg˪# ?ĺw!!6RѐX #! [6O1l0ndn2YhٵF["ϛ}ņYpZ @YC# aƃkԃccmKeb}{1tpAg͚%yKiFgҥ٠ ؙy3ӎ75p|G֒}6n8n!QFIPؼys֬[ ~ {,;Յ웺C ױ$?4/:7܌pk3Ѭ."6++~="%{jA]Cp!BW n;.XSx\Kl7ֹ%2 1V~M&"E̷ ܯp駟JYa4cG{ȑYF7&69+& ?7>< YVE8QwFFAc3gNY݋Xg@8!clJd@~ǏY9-$#b&~ >1OȆ)c[2hȞAduL%=/Y`ض^~dEE9V- un3Nd!L<6K n0tprĎK㩢?&R_@,0 9.K&a~cL?^^L08m g+Զ <(Wa 9GvlsgƐ!CZ`.sR#kܿh_븁專{N2R'#2ya5 LMى.)0or-"{-5t bawhtc O?mƁh!~B736~8b5r _X2VUl^ o:Waa dRTv o)KT2$X"-):w9zp* yI@<V \au&u#I8&È@=I1:ft)Jk=ëA6 p9:g/_@[ ȑ!&>S1NbmK,UO^Ǎ6t'W<5JUB?rҦ3"QX1SEx%$A*mRP!;%E@a(ְ (@L]%E@P*DquiGJvG/SE vEqVkG 0 C[RE?9l FDI yZTGP@sUR_L*C 0l<Ҿ"(5*)9S=`Bb}DUIP#W%$Բ'DMMSLZ,А"(5fsgS֝\UJ׆dHh9)+Kz"T+͚37eR ?|Jz\ { (SOM6Qhf*E|gZSE\Y)Hci6i~ Ɨh*Ei-Qan˥TE1"DBgxMZD&_JialMZpQLk~/CuĿWwźfW\Jp#g_U?h" %@MFP -U@!("(5:E@TWP`S(~P*@P t`EJ~R]E@JN"A@ Z(B@ 0PөQ?(AKuE P(j:u0"%@?h" %@MFP -U@!("(5:E@TWP`S(~P*@P t`EJ~R]E@JN"A@ Z(B@ 0PөQ?(AKuE P(j:u0"%@?h" %@MFP -U@!("(5:E@TWP`S(~P*@P t`EJ~R]E@JN"A@ Z(B@ 0PөQ?(AKuE P(j:u0"%@?h" %@MFP -U@!("(5:E@TWP@ܪ5 "(^XrM=R(@PhlFIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail02.png0100644 0000000 0000000 00000220540 12564151525 023126 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]`W=q!B\ hpw)R/5*-J(Rܡ;HB=}l%YhIx63l;3sʛ_y_AC"zzz})oZ{{i~~_kS9m})..֖\!ˡ~\=)Wa{roʕ^u^Zj*~i!.zܖH$ŧgiAIj  ض}']Gzz蕥%Z6oŵ~vC/6%C`\&?/] š+mc1~$S6؉Gqc1?HtPzt mݽwƀ}1t žpѢ 7m-u,8krC07+cXHW8p@fHm8r_$%%o:MtaZ=گw<g=u;9V{ nv{^ U 2.sp² #zՉ02/o"Y7? 0?O}B#`bbS`߾}xto@޽KGtΌ2xgwz'ł^mMd xqݽ;bp3 Y}6uC,] mZaW0>y׃`װ!4URp $}u׉?8N}ھhc?D࠰x1xpuʟLlg#9|Gמn+oTrf0&-BP%;Zob/MʆNVi|EXз>4^Oغi#0ᇑCaahd86uwAnCI'ё#G譡uhNs}x=8_GBjfN@zf&~p əLޣ K‚q/+DR"O9_҅: _|1ߴ~[z?0}=;{&LNNV,z~Xh(Exb0%g"2 }QgITTWըwToM糾o:c*:uhGcGrd][hRrpƎş7 A@ۖnuj27#a$ t|h&YVI:V'q 1Ob2K=& ^Eő Wtvzm;}/l3=uE;D㶊rX/Fa^14ێ"m]8=|rfgt1/3d""K/<#M|t<]IeSCihkIK1zW2>yX$S,o]b(.d=hl=;i$W#""cǎ2K WػGed^1&=8|ɹ_ )SADSI%4{6yJU-,nW._Za;BCѷgO$edڊR3sDMLc2I;L`[CIvGvvvb6q6kn,]+ k{h>jxi+jgg|@71mWG'eFN>)A(:/D.tMZV޴V~yB fߊ9~8haa-ߤ=]Shzm1fۭshoؾc<ݺa q1zDC6!YR|],>>>܏zdVA\H'D`4DgN Ͳf8Aâʵ&7D!$l+ǂMV_x^hqEweD2@G%9ae+ w!M|,_`ԩxI,k'|p|d\ 1oD/>'}5yǸU&U(ryT'F9NDäq{.%LV+;edQlGB|'''"-5 Q ax'+iy!-#zbe,ہI3bRWN=Lx aȚ m+Ȅwc7,4!pp^,)ж}Gq1%J5 *1(1" ʁ|ϒur+T; K's4w7u0Yd;ki S=ދi͔?쯛7oaawXyḺ|[M/,l.iƍt.ƛÛo%L2&@l۶ O<8,_qվd6 Ɗ-#&vvv_ibbSc>7M}0iUyEu9YF]@cEVGur}&9]v;mQG÷E+ }fag}&t Cf%t%˿.\&U}x:򁦪qBE$UVFt"tw?7j@>>Zrl:I*m*U|"l6T7}.Wڵk8x 'wVm vSi?&<XӸz*ED`s/(ū\~Rch#»+c\ U5iF7?ppO:EEjڵk'HjSE'dQ1_LNHt1Ooo|\P * z􂛛 >t 41rƈZb`dHēXBhy*M@1Nƍ d:aU}55G aj H."m=ɦ,R}_|M2׀A4=.ˀïSWe,H%/2Ae# k3`n*xb$~čE7&Tܯ]{[&D[ 8q˰Īڕ+w( x|''g$a xQg, (_%jBxS&u=5&󞵿{<1N5l0_?dfX8̈k%E Q|%MR@7[ȗd3__VUfd\h}mŏjLMp/o/$ǗQD}K+ot"$|l`<M,PjgAehڜiXDӔGguOL(;eh6E &Km}'f0 ؠ|E9+V5+E N0aڶm+u%)KNg&sА͆牺"?rƚt2SFΚfaP;l2н)MƖ ȳ3'խJvd!KQ`̕}NX~>crI+ɠmSf!44ڶF^H2i|(Lm"pg8!5Pw>?sZ[QCj~ZV3ą9BȢ}%3iv&X# d?u3CDd Ƙ1kg6UNfT2r,` 3lǏd sdSgѫ7Ν_ߓY |dܿn={ğ͚5˖Y'4BXX[5D֭q‹E4R@ïU+40om|D$nАK=:KTu $f366%ܲi?O}rhR|PɟkWa֧ 35ZIc4=M{Q4mi67 + =7/ xjYKg"UswvRWhN0%b~bJ*"ŝk6t2µ:籜PzgkW܅N_"*B>8Cm߅} ލ`٠h&nZPپf=d榤1Nv4W_s;iG=>\fѱu rL]HWG@H3 S#[08" Y٢􇯅-vةSk7zRÑ[HVbbÑHSU%,L?,2xJ񩪽͚"Wnjl$N*_)TDL*՚)tMFhMCJݻ]+ޑ3@֓hCo<榦x .-Oaͮ46xEN4$BOE%bv&y(biem0|@r"FJ 侀k[٪DJ,ɑ5  <$渲V*] Г *IvE" I??FD@" x0\DzqrDzgK<$芓H$%zXW*QHU=Z#qH$K \9.DrX9>2W" 3}R$@&pXh0Μ8LÎ@FZCu( K+;:v O/`w]D^#O ^&Nop/pLt^^Vl9U<}0.^8 玲N0HGJRo^Akң7ïd"TpMx4+[wY4}HAZr$NcޣV(k~7oG`N/#4{X8{l<$5k~ǡ`hlB/r`A׹Ks8zǕkFbkT T|ɣh١/,mUbאW =g-lвc?>qns^rRRT$[\+ q$%'%Lc5Fzj2KUF.CNe5Y#zQ-}) d{hε |CD5}~̰(NV*_JRrRS)&zy()S\O}'2=I@.RzKݑf!ګKu wV@q1H ~M̵jBZ4.fuw{9-`Pէ@;)X V.6u{ǎZ(!{-^j Wˊk&JH˽ *\Q7>@*f; @񑣂<2uCsbYלb3?Ru> IJATeUpn/UQmC+L=@ y#Ov< /ϑ;2&kF ̅t$@qBt02RV 4P?7;7/Nh:c&&q;uh ws9MSJA419!Y=M{5mA_̣ uC;Rĺ-7k%ssXokW{ QMS–}`=(T,|<ƾ4c J>d>iUĚ4QYv-mb$ܺyUl;GP mzHu&'6!2b聁TX1&-abH?<\lmzۄ|uEZ.BУ߹`ul4/; =& M,afrȢu)ta0<5"N<>y생k;-h> Q:5cUD 5RޘXF{`&r]>s V-3}\'<2 73Ԍ>mPh%/T'chD4RżwمU}LTOvV&,%ˋhzڪ47s'EGf5h IKaM5H>:6/ƫ Q4;Vt ;F( ?SB-fdLS<ČtATMDC"4@-T(X ܆oKo7vAznh"f/>2>Dp8:ء#}CGΘ` u1dl\ty _j\|"n<,O\BQn6T'{Xd .F t臍/AEAxuܱ}l ߖ!+'Gά" Zm2yimćrS0PiÝH=  sl [/ vvWE&E|:H7AǶ*MoXTvwWts7qwu}?̊Te+.*` ),O3Oꂟw M9Ϲb9B2n _#Qa`ln`{腼x2a;CKQuc;"1khE4ɑtAޟ/!,)g˿W}ċx~ܾ%2g/^Ǻ=af^d@r>uo!X9>1jcbN_Ɩ`iqhMR+"̝Bk#QqȟE ԭ2ʉ] }Lܻxt4>4!Tc- /*8x9mEt"{ϡ ar]9D&DfgA*F= i(WG6)4h6'T1vT_ZF6BcloMTO#b#+wuZPq#*1ϨF0iɰkh?FdfiO/4Q=\T5}{Z`$2Ӊ>p `{OHD%s[_QtQ! g r^P{>+BRa –tȾ=хtm7ѴYs| IDAT&>gM8byQ~վ31_uPGK]ZE +YRXTQB.W]|xhpWB&W}r(L{VHA|r& F3^:1c ;93&9]Ds?|^3;cR^dܗ܀#,--ЧKk\ NU.cajU&XPH8.ݤٱh厖͛b4>KG B&H{ɒ [-MAwJt\ct|(S14E"7nE t_oD~ GO#1EyA[] Oa:iA h6GsWTX?y)O/..:ŸTF5H,WHNIAn~se74 `y" =0}|3|G"g'x|-'gL>ѕx4\4Kv=Q# ryd!!˂sw؉FJP"rJmU'[e4" ~~8,&-ވg6ڶ1\*( wl~ oھ9dFy鯻IsÔ]05{{mh۪ zvh bX=DH\8 7:Kҫ[Gz/,)࢏|XYTVܵ+PjB,,^wt/"!QI겜dNH  dNT2!lZ ΥQ>=:_sŪ r XV [Bb8:AEqMLTdamecGOswāwWf6Tws._f?<~6o5MwEb[hlZJj7_!sF*&znn.\_PJ4@CV$ Utd|+/ ˔L&V9/ƒ_09z-GCEYceax%0crG00Q'b:ʕlj\ Qɩz ǩTN~M]ܟ,|=s{I E+ ؊.!3"f |, i]&qDqlěүtGRj -Ro#v6ĕ,z[2lc~:ˆHHOM8SڏHyqs4'_gNUz0GšOuhEelXʳbQQkBVUUuR,'1^?qOBJKR  2FK}"9=f0Ą=Ev͝,K"9d'$Vk\*mI#uvŚ?7C&ڽ)bT 2~qLM. *9EwsL[cУ"d'bxXp&:U]>Ƕ'|L"KSH*m!={%K?ןșn/n*,fdIǥɖ4ݽH ?UETlhG{Q?zuf\A~^ců1"ER34H8[myODyYM(djCs$cP(ؗ1mZ6ġs Qにt9`ypus<1qԈ!MyQeH&oG. ,ӟ-ȏvŎ"HH;Ȓo30JMJݦm4Vm˴2GRJ#,O;ʢ:ˣcF GnDzl=,{X%5:QM(29MaV8a(R%k`Wޣϛlm-AZZXdJ&npNgbpsu}J)5s4Qq~ ^D|KQbɍzqQgCMU2k&)zŔ"uBLB!9SҔei<]gJď^OoYB@dGoXb10GIyMrPڧ`L}s,}5=7=.m)k::0qaS22tWVQRz_\gcs=^7175ML%ݚks!9iwq]Zerkz)SilB~Ĉ:Vz;!E[?.یTTi]頗FDG0?_Y)F\ Aiʔ=(H"b˚CbCsWR{hKi`B h| ܍ҀRvH`qZz`z#wI!>uN/ OW L<$y^PzvMcumPT|C”q}ESK:5,aY6'n:#{5CגgiCA]M)8O*E[ Lm[Yf.+ikgM`gcK ԓW-D@"Psҫ32$G{M`c? \p88cݐ;QH$Z5=qёpH%ߑ04l{tWh!kXݣڴm@reQt&@׮7krG;%@M"ЬIck(r+ 0-9N.nIH$ V]st"l`D@"P[`b g": Ouh.m2D >AœHh]dD@"p_p'ɺNm6ԥ=YF" WxN2?HХ=YF" W,-TNȣ1OH$ڎpX-'HIw,/$֛CyR@=J !COO8vX?^q ɍWѹ8qΝز"?-R3usg/*}S~/|9 ;T/E^UZb8u K\x㙁W%d?0KK!񰶔o̹5J3g`ҥ2e %U"0vH{=]܆V;ӆVن, (@3|nР2331sL?VVVZ[,((ysN]tc=vډ:-Z<fٱcG|G~8}40{lOQȠ*o^3buRl,X篅K(s&B֞e '㗿+a051D.jyг,bI^z7v.֝lۉ7)>u|/@T{ƭ֫S<77=inM?6AH"U3WLm|eJGF pԨQr ._>L6HN˗,&ߏ?/ B mАHY~=鍰,7nٳg .rM 4 $ Eږ-[pBK"])E #34ݏGʧ+cп[sus m=Gac0ä:2oF"(,y43ccz  [{FFw?Ǵ7_xt!\ Qb"+2&+6y*x4}٫p5 {4>o|hL=6R   ˂ dXv_[nxuY^IIIs='yL΂YKd)֭['g̘&?,[TTw}WhF`KL'bܰ޷mo$fQ]ÕlLJyS0ylw<5?iUD&)wNv*":.EcQ`dXVԣ~;潪ۖED h}#//of 3G7oތ{gMOȳ?s4o޼L{1:tiӦQgdٻwXr_x?ΝD6YRo6 }}=tkX1~i¢Tڶ޵7mJpY*M^)wKE{/]@vN>z)LV?4X=u ̈\L?6;yVxؤ` P&!dٳ,mڴ _~ڄe_˔ ccccTZY#opIP!QƖOzO7w 8(I ,*S|MQ6GD$ꬽ?mFb}8X#4Z&ݔl<:Q)KLl-Mtuu'|wyG&'NNc_G[n-YNy%LLLp4iR&+[>}\=||:c)>؄4uH<G;K-iU  Oi"v&'k3j*, ~\BQ)K Hy0qXhѢѣ9ϟN:aϞ=BsS%-[M޽=z@^D0/+ՅLE<őz}A˾VHYu,ݯvO#{乁B4e1G?lAPfzmA :J5|Qj]???訉}qd$&& ^e2ľBl^9zr{ <6РϦYy"~nN ?mc\ m,?wOsnA+0=+ k~IsV#56?Z֡U٧:!lV%acBW"ַ;e=>X!J$u IuJ$Շ$R$1$ֱ&+TKْD@"PXD@"P}H>,eK@C@`;`@! -I$u IuJ$Շ$R$1$ֱ&+TKْD@"PXD@"P}H>,eK@C@*حcݕH$E@gWKH$u]6iׅ)(kV٨D@"PXD@"P#HXe@]@@`]8J@ F`J$uIu(>J$5$U6*$օ$(kV٨D@"PXD@"P#HXe@]@@`]8J@ PCOOO|||tDjj*oڵ{E6mTZNfJ$MjOnݺbHT IDATcǎZ)((+-ZTT$VZNf`W^-Sx衇ШQ#?yd,YV0Ŝca۰Am?'X$<1+6;ǿ}}7Uߑ#Ggˑ;v`&;OɁXoFNZfcsh &FHI7w 3#3zРyElu陹"bL_Ep ޭZhheR\U} NƂep#8G}Ku~.)㝯֡ l-9f7<'^Iux .vVm; cC-t3mqpݎmpFQԿΔVEC-Aуډʎ'>ޙ/<A0ahCXNq×FX].Kjm`bb`4i '''#o$&&b֬Y"]vl`˼y1i~:Ν+(_Vf"8q"~gt 3f˗SwEFF N&?+Wƍ ܽ{_˖-!~~)m۶Zkf̕PU?[My.~w]pq#kӞ0zv!R8sWCE~br{m>5ܴ ßNk[ohsݡ19V\&}ho|ջu*3$[ RӲ1뵇18r6=:q^nv/;`i|&|t =Z? ʷq = q=;}1mBoD)RG ۶ůZeE|'NZ̰>qr;wh)'}8Aht;7' M]&&ʧtYlV^U_X2#qbVA/xC~J&CfMD¤%Ogy0͜ n,#/(.MtS1 Z4ZS'ҖXm-0~B < MEv-5O/н9'M 3Ia J ;ŠɆqTI}0>$f-0-#v25t&Sѿj_燉|o7!.1Mh(@ E[ƈ$-*6kۭXfgu\36k{MIhUHoVeaST,8HңG mJRHSUYSI799Yl.]TO+E SSS̞=[La 5=^~eSL>B`_#kL2 S qSPP1g:!لSĞI6{qqlZVšf*trL9[ks2O Rab}}=杓[OXX#~8X b4&:E)]HYdsӲ0yI0,aNL Rk4A-ɌUnɜ}md 2>D&XSSղ'D0+Zc_ҬoALJ(7 vI)Yby1L?|sqhX^x*z,C޶1*6]5%56KPP> hs=++.kU2N>%_[Y%Oi---O 5;6 aX8)ܿ?)ey{d? kdsĉx U6Lkfd^u ~P9*cϩBi LaBUIJ) XKbJ׍\l`x ~A68K$Y LVKay̘6DzY3RߒCo#i|Q\YS+/(>|>a3WS8)bC7Ev& W[HPhNVƨKY16^ίx*m2flu/kDT_kkkch*Ç*%@/^,"eSpM^8 ۺqYa69@?v|31v^&k̢ÇG۶mf5Gw2 6ZZikE)J{WՀ(a*vU}qqlk 3m7Q؇=_R3 $ Нw+Lv`9]pYX+T$nSMǫdǿtK(r,3{R0h2wjRX68o Umݏj'@61GyD_(Xnd@7Ȳ`h)L7q[u;fۭsЄM\.]h",3A'>DnK.MG.=GU+qJڴ;R ~'n/jHU}ҫ8sĖ}$_cǛ_!M1MDxitN"JQ"zG|U|zvy6c&(' ScQn6>7[YFdX2s[;oqX462&1 Xju4bbx*j9;YR:(z |V"TX1y*ar@6OT&\yWY9ǿ"XQK$(/-Y <H|`D@" P$ˁK$9 <H|`D@" P$ˁK$9 <H|`D@" Pί+HH$  pir,@=F@WM$CH*G@`\D# \94Dr$V̕H1CH*G@`\D# \94Dr$V̕H1CH*G@`\D# \94Dr$V̕H1CH*GF'^><<<#00^=@o6ЦMhrځ@#<<+WDϞ=VTT>pcojqeۿ?&O,_~~]_" xwv[VWڵ+6n܈t\vM3o<ܹA.]c]v꺧OƧ~/Xh}ų> 6Yb͚5իhUV8{,>CQoxWEᅬ~!//cƌkg z!b٢7oބ:t9s>τ 3g gwŨQѣGaaa'|RvߖWpRRҳ {q"+;# $6Z-۬O{3WH ` Q6l2]huLqiӦ#F&2ѱy~o%M_ 6%k&tذaj&˅UV_]D6X{=QNd?vqz?{%T\ķ+~9ulS EMBKQ?.y4XCБ=zaPY-t]N3ΙlE׳KFKݻwؚ׫^@3|{ic:ي+d#8]A֮]+v.65n&±a ~XLLi,12.ƨA $q#Cl qm8KȮkz,.\wur\8:pᔾ=i'|jVkFuԔ[ԦB5W$a@Ӵgg$Ʒ@Isvg}a#A8Lu1>l&`T2n3>L51b'W̘VtAC:taf4`Ԇc6prҩI 6sp8 \Bodtq x=acwJܾݨuHo4nje=sG:bn8fnmo\TW8"8p9S`֭ X Vc GN0jή6Op^8MI|ph8uw2!?X X ? "W~#i:&8_Q^.] yp6`g|]w-mP.X X-QQ@*X X X o B``bJM=@py,*d#X X o B``bJM=@py,*d#X X o B``bJM=@py,*d#X X o B``bJM=@CJs1UIK@@@0 ,,fO  WnP-X X n,,P-`ܠZ@@v >!7X X [ 8*\A``0}Bn@@@pUrj-`v``*lpՂ[ 8 U9 … iTvmSN,7Ar*dxaQAAAWTTD:tN:6հ뮻R&Mn[qO_ulYh9o?_DFw=p8!#Xl q R\\L'N~wN_}U:t}G/ 87ǘhڬO (*t ܭ[7qx >zڷoO^z+x 믿҉'H\s u%&V^-رcYfԣ{h IDATG[cǎB?4g:sW^%KN'|r 1Rz6cR Z7oHmC~Hcͤ;89.o|#wtCE8~b}TYzH#uaga'c׿ SQ-Ҟt3݋Ԯ!(}+ ]GѨ&RCv:w?}4jԠt(G'ߌ3IO}dƩKYd$lذ;>ftֵK+:ꀝ9뀠2zI_z`(/m8jT&}TXX@D&g u= oȑHNAZ!ШQwߥ#FPӦMo>}ЪUUVz)o̘1a`#a2[>4ez7u8mc{^0m.?䓴tRIӂ|gc8ϟO"g-0Is͚5u:'~wޡvMh!yg*:O?Ɇ y)f{;Ӹs[ u~Xf7" ;' }$=r/5-]JߒejtaZ{@C:j\('ߥ#F+M9}[O,c:.Yjˎ@4Gwh_mP׎-hʌ_[v-zt/qt,[Z(tyaP:9'Kx$,;Fa g\xkɗ?jӟ='p$- *I-ZPjfQFEvL/^L~)խ[Wȹl2:R>g!&MQn r XcTNM#> FO"828VRiݷ݈Oc^,^N?ˎc%?betw@t=ELMLkC{Zf5آ6=tӉB LwtŧD}Nw\~ sIy ~7f*,EppͧEKV8ZN~A7_t$ت>M¦iJw˗/s`i0ƻᄏtr8280]E´N N #@[5k9b3<#N8A Fj^{-ONc'ܵkW_"H3f̐5͔Y^z%~GL?Ȕ9裏`KT_V):1'ض)Q0=X԰fٳb- ?$wi'"]i!<~H;ҹp6PLP8Jk5bƜE6CFH~!|;#58 y5kR_SixMx[Oֵ-^@he=WU-]xf͚uiGEف5.XJ+VzwMnJ6M o\s!N lde<+Mc9CTU׊s~$Gomb  #+µw*[R]巾! Jں$J0 M:b?ha+3XwQ~&՞{)?,؏!6&):l+ݗ_~)M/)FHe]Fdyҩ+صFhРkNzق>GsI18?VyaD.O]GY 絳x?U:o6tqblû? 4L68>#Oʹ ^gØ3$w>Nqm>vL1>{eUd_ߴ,PN?8o]~矗8C0`l4`ꫯGy֬ $.r3{wi*qLSGqLkw (߯_?tԊ985ta8uwb9GaX`Ұi`ʷӞ|Sڏ qp -l`'ևސ>w&L}uiM/QY˸c26l( XDY={{W:wL/8=Ä?c0|lP`n/5h 9rJq8?^Fplؙ;wf a*0NW=2;vo駿*(>7燝 :pN5+wsx]Mm!7^x$mݲ1 aO}p$#J^iEEnG ߟv7=")}{ 9Zyzo?YNGvx%NpIrdIIeCƳ@_-Cr5v3cq*H]ҍr8.]me4#0茮%8x1ziҤIl52|pX^$ut{Lqd, _mlx]=ûk:T\`<򅏗o>v6smfxޚ߈_dcD6--OI6IghTq]O;ϊ8L~B.8(磣l ЉyNR;jFdǛ"7K%i#~j̎ۚt<8GkҕɔM2 xfsFLyG]|~XR.e*Nof,ys$7sxx b^] 4M-`e=O++lRY-٤ 2  lzu 02$ 0 Xa 6u 6u rrՊheA```Zl9Od`5~ehQIB~@@F|~\BNVzqi 8WժV:rt[3I+iV\E Wժc;/I`zZ7ߕD/   l4 GWըU;'rrTaS;k&<ៜ```Jqhire,Qlڜ~-Q00ԴE;5Uba3֝ᄀsݻ.greXoi왴U+8QNGšok]3õkVQMkƭ[oI㋻!   TDKosXN`s:7k)PaafiꕴjR?x"C,X X",3~8iíZQ f; yM ;_}vO"C`3i8YG2bkF|5_``*cLUE@pZ,  T Xe2(,,b?X XX 8*SA``|-` UV   kX2TeP$X X _ ~@@@pU*"Z^mȷP (x 5tE'Ow6l@qM1MmV7Z뫼U$~J}xi<%Ϗ,wMeHRM?o~~Do"XZsc$HSZ ٥+rCyU )7+te|ҔPK[Їp2}ƭ 9L>6_o ߦ>IOC|c|C?hO4s EtבO0< lF3=mvV z"=W, ye$i҃kKm"fRۅ7૶@$O&9]+D(J_ּ *%SWoPF| 8q[! .)tB5h\!8+:4`X*_AH8l? =<&(]߰ΖS"h\b!W$*?U!ds #*WTQGi <&Lk*? ⺻z$th\GxD$G/r/:_^|I.I|/Kfq:/ N֢GEJ3%O=';xo?jbM$ p&G.TCÃwqସiHkHYuhi IAaPk~R?YZ̿ZU?<S|oh\GGӫ4.^ PjײL +VMʤ"+mL +VMʤ"+mL 3 O np:jr+:~-A=`DxRƻ4ml+ՙ(Fvn0xZjղYA_{>c8ac<| "?͵qbZ#V-NAs# ϚG<,xMaC߼?;p^nw ,??>p>,_+?v 7_dzV\Ajֲݓ.mAquDXVmZjծ]G5Hŕ9 5`APBt?w%6֝IZjyq(`Λ 2pDDM4Uk=Xd:zm}TPbMۃ-H]an!E!ҊCPO𦆴*eZZ@( 7@+bEW7,hHAPo>8&u@HG%iGgtJ;XW3i ▁惾D<"Y$ʄm-T/_yBxsBciB$0 MGdŔõ +?Կ8\**(1E@VfnetrdD)A?MRo^ ӗ$J/CpCڿnnՁ9A}/y{EFHVI| &Rm= u-RڟiDa%ISVo F_fH贖'nڥ꭭qA. Š'I;`"^%Fs8;y8a5iڔ:uDuXI3fDfzO$/! pAҒKDg}&M=.AALYG|g(Yg)triӚ^z镌ASaV KѣOυ\{tG_} _2Ѣ;жnKud|uy72O3è6EW_}nsϡSN=Ͷ!iD?=G;u{g.k+V.]qG}D5kJ^{yUwWRߣ.Alo^|EDi=,rMcc/܃qK/?֬Yd:t@ +iG_;?M8 Y) cǎ~Sٗ;˞JF SC,nF)_z<,  1 hOjJ嗟l.uNfF\_ KÁU,>?74t֬yuz ;r <@z窿?@_Cj<]Yt9u2~M7LדO?ܣahVy4+mn 5`$q,X`6I kAe˖ vډ0<2.n?Gi ' -b"^o'5\UGk/|+M`N;. 2f-X#%Atj ͝YVyω0ﷆ?cѧO+dmd\FpŊU)GcҀΡu?@MGT tQiW ?-_lne[iލDvik9h\)Iot5X~KH'qMfFf%A{?|\4֬-.%3ɁDiwbT+ae'}^U8xM k 護[<|8~gyqQjJV 3Mv:+V?C_yqTB Mdz)l4VBp'y %ABN}1Ұ{rJ>E>馄-8HAe'??cy'a+R-?=W) ʣ cFiʋ IDAT_jC1.26r+YP$޴X#ĚjZ|7y说aԤ_xyHK?} KĈ7׸axSv1`>t,F)*J=d]LG7SO:Q־Q^=}f:GRK+V9ǒ9d HiW^xSoY M]vԕ'/R8rNѮ, ߼EK0`s=[nveÆW!cED64ˢ3&P En[iPb72n&j joٲjqkHS>cy~UH>)3nUU8Q2Q1 VK/ѵL:z%o&۹! >sxKxYn? bߗ&ǀP jv)^U+7{#0eTOǮQC%l> `4ݻr_@^h0xS_Jo0:禿GF}t|T7?cdJkWhhsڴi4o/k9ׯDDͩssGԳM/oջk.A 9lٖoMyt]ͻ8}odE#0:H% /dhY8 ~go7 _dLq?~ÃS_0sϥO䔸K`D ȿA|6@{u쟷gq8 N 3jf 5F ׫[Ad/,\ix #S2 K?pf)\.mm:vlR g`a4`Z⺤X 0?ngb۵ko5]镲>5)6a !ů[gI>' Ff(g:dV 1= '^t}Hx1[_I@м)fߕ` -!N:E9&OTC71쯥s$|zWB'_~߸q;p2!s*Mf+JAa~]mDkmx-UTAuYLdJZsg}W]ZQu<y@3XXkSCՀwq>M1B 0OSc flyfŠ@uԡMjfC*BH(DFle 4-\g =~"ʿ4ÑWE;2|FE/CA >/Oagm|HY])x } k,tcH]Vo_Ў.jB$V5D27Lkx]KqxT&"qbKu`,y1ʵxFw.$v>nllhqwym1n65H}k1S1pZ0L}ئ!#.UfSO[^6Y2DdЂk߁mE$&rCD(,4ryVFӅ/EKoȣA.O?EoWQ:(z0@L~?zO^ƒ {c_. itG^9zH;pcDߞܦ|pҜÛݺDkט#QFqA]晋@:c-@闹5s1<\"7ߠK9A-icF-Nא^?#bv@MW(iuT-i L~>$/f`ml[YF2cdx:L 5K!'h6-o\[I ̑Tҷu~]i̙姟|B%;LC<9?ea zd vd oP` =zk9r?*mUB>ai`?wOpحU(qG|xJq,m '/r)<` 3(#.2nvW4sݙJ['\F7#w9?#jܗA mҶTyx. @W϶{}&^ݺ[P-]xÿ`,G2Iu_Yˌ_6`W_aV/{APo~[/ã _z?}z:x%a,Oժ:O; yQ0ƌBR4qq47oh:4婃tIYk>ωz!eI1%$ŌӰPp&"i\ peƅ,J`A?3 (,Y^T 8-B"0BQIJ/m4i@W4o~߼ lкV|C$pKY>^b0x[/I7ndi+s%Oxż oږ?jcS`~/S ||w/n/MSBТ$n<2EMCո#- E~Y]d tB'6g>Lv`÷kJ}m{RhnE]ht2IT愈FiUGxV$3nc no Rj4Neg_d7qlq& 15@3BT CkG[xhsL7czom0^oX"d#XRXcC:$C !Y@+ e( IQLܒ͹%Qu٠}P=XM$O{ u:8S&q:,tY-:WBy8lRk5 x{Sbej |9QZe,C?oekT h0P0'B4qTi8:-U{ MΗ 946 yRTE-[֨7GHª%G:ƃbhm+md_"vm-&Xv,$dy~ |l-U*%v7}0ؘOiHs  LMpUcqD@]EG$MF [)q]R㶸3iId>]-վ.?ԄӵǤUZI\ 1k|Wϛ bE']7i+77~O4SVyb:GTh&2Ǵ ʹ^{Q&WPkGx/QiRhI4x3F)Zd4AcK}DsX?23)PCsmMgfҾBM!d4Mn7~~eLJ2d49vjHc| Bwc?*dXnᏑi|‚ q= e(?wf#0?|x?/ߺiW[( k!g_x&MɄ 'b]Eq8M9d~:C߼U7Ń|j=oӂ8xqD9*8RZ!}YN#10m[Wa-8BBC<#=V^#bb-?8Y1D4A<˄h CpG2|~_?uPo~_wժTF 똰.f9zia-;#+ӵjզի#ZXk/^(APo߭լYCdj'qTǩըa> Zt N!U8hmHZ39s aFJYs4J69#U8B F_.m0嵿ߠϛs 2z>&NtJi+7P: AS$X]T04Ѡm6/o@gf: XgE"2A4LCȷPҒWaA(Č?W^j&3nfh{ k ;<ĩBƃ ;q.:|6;%WJۄB{6>XL?P3_l,K7+{3 :Ge*"[H5vr,ZSv JhKBldkCu?ħOFƏ6NlC5jt>ڎ- GM<7(tb8i-]iG-ZTqH;󄋦b+&_.wW,_N+5iܘZjmþ+eH6i[[7MvX/Tz1Eҧ͞=nzzWiŊ6 wt7SϞl4z3py#rOHiÇoƍgP~}p9 _536X]}Օ1~zSiӆwhOGݏzaW>e6iҘ^zU)ق O>&L`3k]vٕ oM]woxK;uFq{eWQ}XߒwwGXxpum7{Clgo_NcWwRZ A1-_[< vp.?qD:udbi_ifϚ5ףΎoy?}4Gႅ1sҝtgКkaܱxU wpv/ٯwo& pOF"PÆ  1 JaFɛw-iBZh&OO4e{駨Ct  {ݘҥ TN/裏>NgI>|Ft2p <ӰpB}i[.[3W|e@FM y[sퟯ_|1ױÈ߭[71cFJj݊.䲌P'gRoL ?mt>~k0_ZdCT tr_ erzg;SNMi̔_.'ɑ&7͝.ɣQ(ul㟂3q`ѣ>r13o6N+E!pU۟¹&oFd_vtޝdߏvnY~1 aܵkW)hkFs,"gƻWv IDAT[K2deb*zGd8oT#&"ٙo@?Q}…h)H/_AS[}ymv"tP<-%5N6 ;<e˩}[o!N=6$3᝻{);o?@cy$P i4rY~}m'ב7_yCGpoFfe_@w>gtY)3b/1\U3*̨HS(6Cr>p}4xv+/-|1?a8ԱPUx?ٰ~kYԨ%ovs8&" _o1`%dM1H4ӇåCn<4 eōU䂣Rb o͎M!_TS`g';Y",\?hKm'0Pycr0[ &"F?))KܚꭐEQ[u X, q~0ڤ<V%52Vq Ȃ5}^p!֫k Y425' Q}zƒ@c=^>~=h;׻woIb^ɟ /Hb.T6ZؔT;/ne1x.h!%i>=_֧z ͫ_9_?si\-Yq~m{QC3ii0_c$~%6#ߖPVƫ _T4c|ɧ-Ȱngb˙4cgem ~b+p"g~u{jҤ ͛7>Y)h'ץ/#Q$1GDSV[m#.7Pfͣױԍ.X!PI[eO]y5~Q&~)z+47PCosd1oǯXB K mx_/rdH~G;]UgSLeF8әmww˂/x|!H,(Fd2/)yۋ44KSJqet$ɵe_ +cנ|:/sL>0YmޚKK`/ʄ4 rC"? G4# A {)DsJ#[`٧x)P^zG><yJpoH/D'_Ӡ3^dI_\93E\2Fj2:#_""x1JBʤUxiaSb C8|f;@ e(L: ^9_(WʢHq6 g+IjM_(9%n!'?0 nKcJJԺoɉl*Yr඄&zW4M 4hvmv Hҭ00!(c (r<묳y?$}p9i?:QΝkWoO<oX*SNhigR5.^LGmﺓq߅Cc>oU6hnJG栃Уrop;=ٳ'a(mPFDp#n??gh` ;?{+ /IhdJ /ƣ>5xLO:N Zn%=8O[#vn {Z:|Ma C4~[R ^4b2k{8VoS׶mP$o&wI? e|3q/F2ϳ!KfI #c [mLB3S ;as.Ug6`r BsKȳ{~ ]2oL+i$*G%I'^{QcN:X75#*JmӘ8/|w1iR$Pf¹sR첊"KklM xGE/_㚋)umA_,d>Sw#μ>$+H v%_%UoMiN†R  k qYFeGֹ7ROn3<AL <%63-|٧8?<,? _X~ܣ?ݡ 6F (%63ɿxUT9 )|'^;}%xwC@Qv>l*=E{H8f&Wrx~$1L= t*^G ,#>V?w;,=u vL7Y#KQ'I[Wc^$3g,G̙3Gl!;CB&.w/}yCL־MiYH>&Lg/,[u >h^v]~4vXa 50J?{2 ܶ!kyŸ ԀYsz,ngO:llA]'?Lԩc'X/n%2տ*# %(g͞+ݨGX3o7egd2Z)Δ0p||:6RE,d=wŽڤI8[R\9O2-s]6?EkG9 EoXzuR;: -XdvD',*LϜYQE+qlF> ?'lI~.0iTڟcԋd㟇)βX% 0Kd F% _eW~?WNJkss}Op^k֫:qw(:v-{]Sakp<|AcʲP-l/P>Og^cq 4;D16@4nFsX/|@R>?LSV!BПC3vx$w<}vHiu'\@H8Q{쉧t|-Àbj|wFm++2T}ֱH ?ͬ F[f׭\͟G3gLsShe 6-[Ӗ4Q`A U<[ߘ׵WCs/ANzax:Z_X/^R0BQM@Dzr#@@&;uRM`d5}󊃿j~/z iI{m_^6hC߼q֡ a*Z\!d%BOlF2hnh!@Ռ,Cѱ_ZώX'[x%-m+Q5 h ϗ.MCG?v"ra9/*tI3 MNa䨁PB)졆\UW6m' 'o}~_A;A%ǻѨB(l֣I1?щh2y|☥ hȤr+NQ4.?ol׹`:ԿxdBϷ˻:"K5{ҁħI$ԡ$GXirʣ(MȢO#@pa/Z֢YPeʕJ?o_a?h/54F0@NA¤C0 ^ IUFsx*BAtx}UgZ Cc$նoL*SM1"1ҏrXqߤ4@k*[TIJ1?xy5 V =.Ӳ|3k??ڃMȿŠ~7ГwE |qj{V3GçqЏ;~,ӏ+8uŷ~<ˆ|~\|[  :2vH__?}~<’J[@?ac>O?X> ˭~ d/MTK|fخ8Z9R{61]\ h8=}幸ddI[؈BMahiN<2:E'̘b)*iڨutfz/B.|c(.^+n 53=~}1UVOb w%['υy:#_qMI_|E77$ў\bҗ \6Sk;1/~N#]2%|kM—XF P޻S ;Leu_H}-XYXhtNIcŴ)WhXw8N'GM7Rݠ_@C|MJ8F+_m+Ğ:A[_ȩ܁Lci-`Ž}KF[n~eTTe?kXO5O8p9k-^E1kfSGMG y8_`~ ףo/N鰙*,UFEEeIމ|;uhK{:Y֬]@SY='Efm@ȫNF4!(#1#۟wl_ծAc͵m7/[-j=vztf<{+M1V\S# ?P D~@\i(VZ͎o1ߺ 8ٌ¬I u A 4NU@_+~6uAͻK6mۼtW+ҍ?=MϯL̲bœ!(ιz*9g A6Q QEd[$Vi$7e fΝOkXi!z~DH!|Wxܔ)իeL* u)#q! xj5|XVYg?y׿6qӦ\K]AKDIűI5bYtĨ#9^^l(Ք|(aIݕHZcYM^(Q% 5Aㆆ81C7T oj֬pT%WkV 7Tv,j0LCH!qg?׳d6]tЌk;"pK}^m~E6A]0O F_<2P^6pAB[c&(95 4E~ko ܒ<X˃ +x*L\u 9V8-oX@F]o'!-,&%i +?^mEr1oN}^*>%dOhOPyl*~EۿlΚ{8;?jO!LL3Ά˨󒧆SOIqV @;8ј5PK"8! U_(:y)Q4S\(it? hm): $~.[ ψ;i4XB9߳'k\-QXIO_}ٸt\\▉]G$v&3eB(MqUC!lE@B(MC&7* 0˪M+wZQ\H(kLXbQh45{/X * @@z7~s̝Wvٙ3ٽcgǾCAaW,\]Our#߫Y&O=Zw-ݶ6'+iQEj׮-[llեvϤI&Y'H9 /+L>_4$ϛ9k6$+4hW``)*xMS΁zH:@?}$ٰE#һﶋz]272^C.!@!r5yFySJyF>BK*ݺu;~ұcx<e_[t;côdw{0ȓO>~]vrw߭Ĕ{‰'~4|哏?휔d|v;؟WؽrՕWȂ0<I7ߐ}Ƚ= 5.O~'RTnvժUJc`rIwb `'/[4U|%$塇m W8};n?4gnX+`?ky_ CCR)/ h\!Yf+ݻmS[ٛu Փol\9PdfT$\#)r!ȵK~O_.4o\FM'cbBLF2ɏDŽTqb1pdi+\L*YEQqDX\;r4h h/b/>61 zifL**1𘀺|"Nze7z}g3gXvgȎ;l>.šfa؊ɧ~:X.7yoM7Oڴie[8PYpaIn1-&^rG>{G΋w߉4wLHP6V!ns@nנ Q>s49ģ*ƭ7li2;(; (ʥa;#iS'IfK/K>?_zS}+.HjU[3leh,#$!V:t#]Vfvyu[#=3r ,^,#FвcOn'A|` 4@{ȷ~O=ǷwYh+yRW_gD.ڢE ߿?t.oL0:P^{VG*S+d?}wj5}3GBZdqLd1ڟ"N&͝;Ww}|VD1Jڽ"dŊzuڟLH{}exygu_7X8OTN>q{eAIؗ_W +o)fxVjCLU=(-:F7;Z6/W^{ ~}pSϤf͚r՗ʥ1{|JA)t$Ϧ83<}+:>0  6L2C!CRJE߾i.T|37rQGiun2x ysyު7YMeYĢ)p/t\OfwigYsˑG$ҋ/DD* ITB>kxAqFN?30y_ׯcA6ݷ2ɺ@>*j?ki*oSΐKˉ',W2)DEITt?|0n&6_*;JL.eGn)Duѿ=?+>Tvyf =SW_˳/ χ >25!p L3j(t#r1}4oRW4J'Ͽ:u_|,3](GH}Ҽ-q}',H6ڊtW?ftg}YEg|sM?ꫡx≊3ѣdٚ߬Y3e 3'+OfF~Yd|qM:UN=`|X}<уw/p?Sݥ;ga-Z*nnM . vVP[#ؚcרU'2۷(͒p٪z!ߡ=qw:B șgK\eW\'MHJy{鋦G[nuqu…F]ʒeDA4^MhQ2~8Ix Ծ}{֦c9B}yiɒ%cDZsg]|qW~k5W^) 6Ԭ~<ӔZ&u\3s(ok7#IƯX\sG9p_^7~ ;vh+^a+N3@?vC2с_[z>c`u ސ H R&!]q/(U S\3bN%<;W_}Y ;g}"~cϽ\3dw]Ss&~x(A]hAѺD"|,TnT' b]ШưL^ ze/ =p }-/NJ.4|K;x O>G.*;ntO\5"^QUtCph屈NrYb37*AŽ|'ðknzd dLi"i[,mܸv?òs(ʛYC7eUzM*b<y`1HʥH|n0뮻L%Q!g-.=| .9_M>w= >v%Oy[ߔ#$ GٗߔF Ϝ>Yo|=jS/(VfaIS yFeǦL$t5ew}jה O|~ʽm ': 5 AņlO=x$6 =jJ8 `O{.HMYV|+3|CT pOc܉'Rۿ號w&l0?1 {4И~oi3UXN=9Ӥ71gLG+_r~/k7xW%7HHCq3*(q䅤d*!/d`g(Rq3'{kX)AX^#Fq-W\ w?|5~.XyW崓DEY]48 ֍A'l$" 7z#k*I-6Νm9gJMc}ҟ|ѲӎimԦhn,QN3ӣ| 5R<YZ?iǶ),i_t4FӉΟPK3oX -].]t<:`?^ykD)K>c%ޥ^*W_}VwC6V53nݺ`v{;בMu; Z؟ʞ9sz ~vYSdCƇ/t<S mڴs9'M-%廢H UM;+W$ĉO$q Ow ~`M lv8ݳU"U8sB#m"~,Y|ʆ*1pi yhuS;N.å` ^Yyz6upoaP_?;!}v eL|z}߅8`‘f1|r5WŅu֕T5SA7UЃZV(_mZZ>iF8[.%AO<N PR4P+Cʲ?mv#\:pY2]Csrڟ66S?'?jďV@ʓOڊ?bBM+`^V#)#AS\(3+B< Epr u/ʸ xжiEI<\\&4w.jrcv=-;S:l#"s:? cY"+u0x2W;?bS[tz`<~OM|CG|2a4q ޘl P ]]Nn/gcے_i?t);ox"u6Ye\ԅ:~yCQP@8s8,nԉh\Gh[L0?T:)5͞36/8?a0ij|@'eUP gΒN._ BO_ƒ^*Ϟ3WOA~gm}(:e ,Ob)_Ig*%f="Q\8F mUYyzj0?&lC*g(iHzدtd}HQ~-O!sL*$)D"@6Yg=*syY@BHVq3qz?ŕI)jG{xhtU+F~q)LjEyYO/4Q*?싱>:i8c-5Hm}+i'mSjZr̠ Qώ22ow";˯f>`-svZu @nh-7ӠlR@Eqp*4.aCږǺNh8^~=co<<ңڷII93h,CqrgO tKxxe V\L119/7mr{/ >KBϧ\Κ8s9ez+ز.W*ڟRO>4zcO˸BKV<;O DBp1"AkJ|u#Iy%S35p J FX,S.uZ~yrgFeC/B]6vǛ:} :]lRU6Ol:L۠Flqvo<2 \G?x\a3\⺼jae+цz4^Ӡ&vУYEIKp Jd;-:uj 1>; ŜDQsL c~GW]oʅM>kn!vdDeD9k׫"7A% S@"LP儺2qBlv,Ӽ@_X:(N8({Cj2ԍՈIr睃m3W>u3;b6<|6LLf }i0Cnn5x>UBG:$y+ ףX㊍8 63gLjN2^.1:QYov1P7L #U|C8 pSc~r9¯n564%IPGa'$VE~Xv:0yB;:} ?$U6yʃ#}!#3֣Ÿ`c\au]A VүcF.:uVja6Љ[9/mmd=tV5|hL8:Zo__ aҴArp+g^bLSɻTۯjR$-/}{a,^#FPoVߩ||1U_;# a|T\+;o+_?q`v2{Ο*;#c W*IҢFҨq3:QQdz ’E9yFb*F͙j U|lUVmQRv1# ͑"/pxiyY}-)~]T>O@U߇Bv8g{W;%S5/_* ʊ+:-ZFo.k{< ^rt eV)-{B(7e^)S9͠/֢ |(S~6xl퓈TnB?_O 0թWy _T~V^ZʕW ziݫjt)E '+=i>[q|%_n" ɇ}j iNo8q@$8;@ d2 U/3;YYfjֽ x<}p-c?AYL(7lxoU‰ҏ/b)_p[ Ai\q߻dw ͭ`r00FF l)_fҖtc̫LrP1+Os?SBh}'iK+?#⌓:Te+]lM7z-x՗yiJ2~ ?lCȔ-G%᐀T^-:@;T5YەfLr: ~L'oV_މG'D҆ժ,9ZQ\RڮSf-/AiA{K68ۉW?>:ZUǿ`làq&29a!-ZY5,l72@Q$TG^*46y=O+!,OqlGor{ÈV0ikOYXЬep0z:: YA3عCueKٳRx&Տ65̳R,sL }]黪~ -1tpD  șP0"$[Z;^0`)Y.ffek+q ɠ_eٗt:)? V)k$H#B02=dhOGQ8|:T2v<ڪTRஎu"!xDe%x5Q}/ϴe1ʴ31)ER&iӧr0n0~^aVR)e! *dO3(@b+̴臯:]U?.[l*9 ٰUA*b3#_}=c#|&.!c}wŗ/eނ1T;kalҨ2gǯl?= UI~1K=wY/Yߢأ30o$c8=O32;/+Ah]8':G}WYx_׿~7]w9>g_@Y*xL2g[+׶%~}F>Y}ןRbkժU_+:dh:z]K͘aljnI)#gJy~/-'7nj~\g= 9%!%`=C^X*AllҳXڅzV\ ?XNi%߰+1#{O;?}RnŦ)"){` m):)7?^k!yK.Esgʉ.lZZia SZRL-?;$ys}e̘ؓ` @ӍaiyF}N?-YH>P1j jvfcz2m4x6O~=0رXT_{[F~uYr?Ñ֐`AA׶qOHd75`ׂI?#7B&^FX,e&ow݌g;&έ=_j(dgrO҇OڒhuxsmbojB$k꜉ʮS4X_ YIώP?KσP\tcn(` ;]ZڵCV67wt ~3g͖{x9䀽)Br!h=g;$N8i/z o_PŰӔOu 9p=}|Da>?Tǀk@d޾{_y<bMd¥zzc:\})BĖ66$h,yw;u2 -udU/s6T` L%Oݬ;(Ivœ*7R:αfcv2+оs2Ç|<;lniMX7m5oڔ2V,_-quԼņ{Qx~˖诇IͶԲKqe1. ^Ueİ/n~FQ9Q&Aˇ7u9> JnO20ptwqycpmv̷'_b6{ի}#CXܫo4?R>+̽J7AfX•$ʍ`<[Ny٦C;-6Ɨ1@OgjLplfC=M*??޷{9E\9B&D)(Ui= 8{-Ku?V{C7sL>;jKK-:I(q'ɇc%w~>DN!nPI#6\ IDAT|6d&4n(mqbۭf8jkNn} <^ԓNVYfM|ISGeNʍǬc{5ch 9_˼͊1(Jħy+o lSgM[AZe"BM3˹K:rG&2f09p=׉QckoȨqe6mqٺVr2ZnA%DL(|Ֆ@F+Ͽ2i8V6n^uW_u{W,$Gtﺕ Ƿ=~~ l.)Ҝ9c`^l=gPYB,rݕ*F<& jqؗ麿ԩXYN>;$/'"촓vڲ]mPcVD̓_39Jr㭷%&̐}GOh$ء=>Jz|b<нҸgvnԂ]w,0YYx;H7?:ve?*}GX n{X9akZ z2g,fb9g &ȏ ˤ[Ҵ|=rH8{]B&򘧍N$qay͹?F^yns-}tyf ~p_+/z߿/G( {n'?$[g ;ˈcT!t2k䪿) 27j(-˜zQ_ vl~v12qT+hC5f>s *£0*ar F Vߤcd;55 qǟˑ(SQFKf\yBG.qO[{<}֝;ɖ{^Z `ನ}iAf~Gɲe+D'X!e9zp'aiT];wѫ"9Asx/Ni3fJ5/gLoA 4vlv4fcU@LeOd.4X2ceټl]/϶] }bx=oko(4 x嵷}p":k17C/,o2~Qx_f戯(k4vɖuɚopŗ rϏS"yPpL&٬ ~cF~%g'r)'j(,0'M~qkZj#|.yj)]#W닯AI!d9`ɘ i4뎺,f6LMZ{^*q3u٢Qؘa]c-z$_?ŎG),#"nb8%'^]krPiqdUHUpiYrC)xU)WzcWiԨAT5)/C)SgB@ )o8lc^k@UZ뼥` ?7l2|̢l{laId/&Lwd.vf #MYJ^_e0kkdʭe^El[q3oM6i+}XM1vo9+pOAiaQ/Ý8iFm@ˉuxe Wg~twO/q+8`+d]w5l3~kpy@XSʫohd9֌4'!Dzm(bqY8Eڴj.fǠ@ƌOgϚ"3pIsuNݺƿ8Y>Yݨ~-D2 *w*g/Ly."ЖY~ CU?=s&dQ)QV?ҥ8:d~?~rъ;:>`Yu͗_aF7k Ík8p=QŔeZŵHA)Ӧ+ }W5vCW6N~k5QE =-\]˪[f Mg꬟ 2=]_+ NNP 5}y*gFnLc%Wb.nwKW(źqۋ8IueyE d&(\0-o['yt]4Џq Br2rlpQNWH$+ VJ_rUg$6߲;t.xx2GԠsy:=zt8Yί B~~.R'կW[Dګ$.סmDj<.:z_:pkꔈ@ (U3ݼ2p<@=SI@`P# M)RuZ%%Vò [K+V%޵ nq ǟ}Yv,~+!/S0SlE`Kxeg'}Zwߏ;ȇ|;Se W~c`>P&irk*y TC; # e^ڵ?vuXMNpTa6x1uhN>O# ʩ'`XK>:.'\ me0)5@3! ixf@64[cҧ{x\Crh{R$OJY?HM7zfk,x+{7x<+2p@nnQbaGL@ S)yay?+k*H:ӀC?#$f0?UO;jbp׶gg|e1?*1N d6AKc=kZAv=qkt >kNKo lXx}7~KtvuA2ʺ,M6>cxydn۟Fȭ Bx2_ +\Dln2h`O۴n'>~Vq\"퇇 N]}WgTEW&सN8)! S+S#{60iU"IRi l,`1ּo | h 9Fyx".VZ9J\XEwO-'XbR"JnCd=rک' .Bnai{ ζ%|<3mXZxBIf,n EA' Q:92B0Al<sHe0sS^a>~2[lk Z_g_3Jg]d=vza-7:26ӇOn{72' %,g p#e 30nL\~CxÝ`Ru{]c!c#ߋ}>J}amT. SZX o"[bXeS1qsՇHX9H ~#qC=O蒣Va}ʗEy9=1p}܏gWt)eomH_d7_:U_:GH\Ta X_uvM=pF=gy3'L3 p32ԯ];\,#ێr˟oQa'䆛n3N;Y6k,>2> r=.ϻ2Yll)]6QO&O.uq|@>La9m.->YN&L֧&$ߖ[z_Yd%+}W%9ҴIc૦q}6IZKxd[pϙ&s6w,kKdd#mh?iY0 a6MgYJ01xEs֙|b̎'\agkPEP"o%_(|\=~#Tq(J's2K|BM0uc9NI5QsǍyp1^eLn=k}Uh$M[&\>)Yͬ8 /8M*h?I}?u-`r*/ch.c,g?H}q. EǟrcX!HY1~Qb3C0p8ancU!%E^ γ|E}GzA^z O*= qT/.po=0.Lk.Ic U7vL09h~c_(0'19,=NM6>_:,$Rp2pe._"j8')Pt~`A p_s'ۘ~ {Ed짏m| mL&KqKef+Kn $}L2m|DAV 8au-5ZsOBmo/~NM $?WJ~tmkΡ V6(gEA!S}e*.d8P]:M.}B8EmkA e q*SdᲥxc#,U%(l3^J=/X>Z&ngaHh 2[gz ؘJ|9c@ROaEk+rC Jܧ߄ m 6mT9NDy1 XMrp\&՗;j^Pe?OEls)7m'ֿArqWJ\=XjYqL8h.ǎrl}hN? ء<+k9te\YB$ S3ݫH^lYg=̀p {: =O~߆ǎ2C(i9e⺕ڛ w҅YLk3xb[Ƈ_* V*jv$ DnXAz37Sdg:/|s;\'B/WM -j)p^8_lT#"{|ȅV~d؟<WޡffviYQ )HHjV0:!&G?*$ױjc[dgx6˪GzDakbv(ŅFq.1yo15}-K>'=Sa㦺V?DR6oL@s>RVA4{%[VG ,!(5:>e~8IԎ[KNٔs{!\)+Ϟ|/E+ f.N֠[ɺ3dJY}~wQEڟVwu,pLs/#ڑ^jzQ9z-/ 5,?_׮S&[@^jLGU]oڱ/>,.Ư0? Q)d9L*A3OǏjᚽxkNúԏggg*_*r]eٟr^o}ݮWeIk֬K]e;^q\S{(v׭^L/g_|_fL`ZDvWu0gVJ+F^N륕;QCk ݅F0p2:ԏ~iNAi9ɏA )U-IDAT_1}=/Kc/#d˖+Ql{-g+[?C^.}_?~aG}xuRZlVW0$MYs`ZWwMew]SYY}׶~_k/[ڞ껶ǥjq2s$8v NX{r8IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail03.png0100644 0000000 0000000 00000136104 12564151525 023131 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]`U{bžbY]uײͶu "һHB{yyϹyyI^ K~s7{go~Hï[xxzB W$eg+UVi^x`λߥ嚭E8\U%2Q+WWW 8g@P`P7iϬUNq$yoe9;wš剘hb8r pլٸjΜn˭UVa%%ԏ[.2+/wiӍN8^xGXx X|'/> v;,<oKL_|GFhh(f͙'+~܀vai^oUaECǍ1u*ΞYl;wqWzVH#f`yvagN gh|tt|刲3h;QXX ||}1e }} m*msMnfC}:?דD>O_e #K?NE\r%R/&z[`kkyX]paW_D3ߧ+V_Wk穩qu`o{,͛#=ô3ֈFjj*&OnA"Ϝl̿z.*+*dɽEuWOމ;nǏGNQ)4j~p I~h:$]Go/p\=<0tC)k"7:yֈz6:~?aܫU(fJi}{ēOCwqq'Ê%? ҧ?94cq!ZXVV"~;^~߰BxhV|lLOvA1cW]=gQg/<1`Ԉزk7vhv)'%oxw.ZOWGkþ=q|O㉨{{9}k!4<}I(_p/8Y3f`gI|'x𡇌e1o" -PU ®oO5 {ͮ#a2t$@pj8/C5 mi޹Y$ zR[3~+V@MU˪^}?]PdTsx7"̖@t# ,ŗ;J10;^Ly&=ـm+gGrPDsA;>:10쑓~g~sIN` >==]hB[ zϷnYЯzqNrW$ѕ@AAŨ=̼& EDF!D#www7,v?cĉ(*-qي#J*El8r$$QmIAUUUh5q6 7wccf8::⡇> SP۹u 躣\RÉ,˫H_gR9MfI>a9::Ήk5+aZ_ۭ8Y9QWߥ:]eLwN(uzwzyTbk$@Ӽs{D1v8ƛ(FqY z?0wj+, r,}i9Ɩ8ٽ|HNcR$dU7W[cTx8V!+OfxНy;FtԬKF 9#[Q`io~X:|cHc?眆?v::9 ܴ'$/(oĩq ;wN)5]j£aͧNi]᎗-'N&ZcspY䖮L+M{x$ דBfef d"`|$ʪQ?$fԦ pOgEk淹uqXsLSK`~*?Ǣ1K|>ҵ6L, ҵꮿɰz>)Iضe>]Kð#``ӏ>PaVA%n\(˜|ɆxI8QKP\00Vͭ ;TZ띬$ ;ҵ@C_fZދ{ `ٲexckhwtd|7V[7pPqGq킅xرc7{jkkiWrۨfFg:cY3bVE5";74Wod,6֨r|1F09Q qAxD6ГcǎaȮ9,A4A<>r^|l<(G#B|qD j񷛅w+*qH:j=9 =/ P9:}I}zWΘeqE%#W4 N<ӧOc۶md̎OaBB2N;P,i:ufHE]wk5zrg{3 ORW-k`\s;Qm?;̼G04X"11wݳ92 d /.P=MDbԄIzR@R/w"o6vލPc 鉍#u?yv.BsqQ$ik8-F|EFi;t m3AIZi$đ 8j_Wxq\7",!ӑ9ZW-z<ϗ#4o-ǵÇp~G҃q&jFgKnɹi8? '1lk1qt7J\[Ocv&L4Yuzos># IҫG]YlJHmחPCW/P_F7+ؔO=l}ݣä=?&?|0bcyZhmoI\_CkIR'Mx-A!Q^n΍:Žg.O:~Mf~ވ_cpb)(4];aᰵw?6H>/WY`OWwxzf! 6ss=Yؑ]ZM.SҦi` owCB@PC!Ps$էҵ;jSHÐAz"4zWА_LMKf [^6mڌ#:QŸ/$1F<u8GgB_UGYL(|D/2)6UL꽈"_c-+ow*3Vҷq &cҥxwuGk 55&{k'xzy1nV~=oݱw7{v^d.j1z2x8r1pvrKZ\IXp(Qi߬|8Q]Gj<SٹDʤO(-q';h1t0{|q/jMViF[L/0E4WϘN&h?$ kJ:D ~$iI qe $@oD]8|2INGyiKϖ g&"Z l톮3}<Əi+f{\>g98d^hk8E'Plr%UǮS:Dm6@ӵ«cc6t:]햅u/ZC`4\٠GMG/7ܼ`h򺍻VldI\/t5ͪzL~FMQ^7޾nXHTrPSUG/v4s^iܸؔF ƭikD7L=֙$s-|\`K;ؘhۼ>gӒ"a+6G Dncr)e_ ¢۫]UY3'D܊R8R\6-p=hA{!Ok 1eg";㼸3^><!#5 @Y \hXdUvXLICX1RxۓRV^`- 9}1b(aj1XA1tz:ŽiɬqnYZ$ҼTܹ`N#:~Uu-vrA ĻϾ/嶪d)ADj7&7qjD4bh"&r} +Ax'ĵs!zеu22q1ܸm;ǎ#mCЀ,%gP;nPP=]mUѿ9¿?U2,%cؠHTe,Wَ͇11Bf5HK ` sɖ} ^3Q pJݺk bN3 Oe$M 9nJj]6fEh#dЄ`l-$m?~  7ށtVƐ^Ч^B*mG`ghz-p ͺ湴VmOf uCmU5i`,x0tT1o8ad ǜcB뾿endT4#ٶ<Ätȝ,)iO^~cT,DiQ'<|if[ 2hf/C!m*릵O3؅&܆bL@Q(--D7"3e+? "8zc$>^ ,yc "in^>ZS{;;C6,-"ԌlHcG`prnz(99L5sDbxiI 5~(l!N+/SlkèPH(==/IqOM,W_xgNMO>(/CIAܼPUQ;qid":%ƽVmHto4l77Yp AǟAANiF ڜб3X8_/BnAm\icq&!_nO~;)!?VQ=N`֣B]i:zDCN bW)lJ×6 7-_!ԄttF%57-"h?Lͦ0!95 }"O:=`ZĩQ=ekƧo^9qbj.S{<0h@_|v I0aPJ˫p>>MRCށ=$~{fP`̞<g3&4So ;ߠ hlٴ?p=Uap:1EO+X̞Mq,>Y=lHr" jQ][o6?5v䱢6 oAA8pr?=8g!I?#&CNNIGfBJ~=|]E qVH3Dmsa0*Ӊʬqcubb fǵbR i7D>!?*e+Lt1 Fe-j/^znRiT A/w}d3\In&b l?x!~puu1Cp<fS`\Jh1{!*"U$ IDAT7?"9#O GrGmRA*'¢xydrF6vYy"NGxBtTw.Pz6)C  DfV3|5"f+CABu:xΥcxtxR>-/ၛ1fHđt;zy*ˈLrbL#Hpq8LK `j1mN'ben! q2OKTLLNǹ 5NI‚4 X10&@N1۹0F}A$V`C#.!s+~:x.CDu5qqNmվtfh|bj|q&âH>MH5Udy?PI$]mI!Uw6X% Ѐp@x;ƒ7?/cXt_b~8/:wR a+My8t* yVj)n&=H<ݚ 8)= ǹ*d)ُUY'5GV7cB,}[`zz:9fviilıdk 7=qDMZgn$UF!.)KHXg+oo'gi†;5OĥK XW<}kV[SǪ2s PSo^Dj'I݄ O^SSCm$Ihe-AO|qUL -5$%Zթej#$F-<䅱ԁJ+$ϡ5j~ ǡV,b&FR2&49倩FrIeB~a1|<0y@vjR;8'+hi`LxHJwg՟ktMZcӾHJrRkBM3iX|!rEMÃ08vNƽgE[O!8?|AAž6&߆ђ,f|)HHw/KOŸxDLUWh߉T;~^Ls݌yyy-Fgr?nq"/;Yuv7-ۺ"޴e9Obo`Ż;j{RX)hB_8$YfM'xWMޑ%dTݦkP\,{X$Pm|`:c\4ـ,z&DgznRs\Egp̝<\xsLR幮2őt%linnZUWU4=Yr|K 1 .(!zlԷvqqWir~wsK=e[$)~.oÞxM+ŝ,o܂z'<"3s٤fЃ*p| H0jcmmo #ke1ao?m&ksNT>95H)5ykɕ+BDVnS*ZBb;c&$Fus&9%Tkƒ9ʻDtZVJu{&Gz-Y4& Wfvq>b`ie,Myg'FӍ/jpQ?8ms:"qB"wc$9{mw58AMi|^IMƾptzwzh1i\LYa| ,a "h QKWF.#-_y\3?6Ϸmf|YpY5ט=E_;1Nw;^ ޖ8J8OxXI (e[ܬtC4V@ a2jJf+F38Mye8gԉBeMu}K;ٟ";|rY^~'ӔHWk "A€`1X">ElR~/ٝ$dx[+FlձģX!mF¡SZ 1G5Nw?vfLi[Ck!il+ekjŻi o%:~2̤%7XBs2xY:-]D&iU?I-C?o7ؓ[Lf3ƦXR|^Rm{-vZ /Ѭ ן6]p˺Y2/5/jR|'%;^Xo]-cZ^̭uA7OdjR~8~lq'T#`n^x=%ĠI@f%@;ZorX]Y] i[{2tM2W"`87K4UC\eroY5VE`0P@RyqnV<[o~T?iUe=j}㭧MG"pL^h[{1BpL}gSrS6FW*U;0'hKgd%qNf[ />7Oߥ;y6f3PցMG^B!Æ[(v)֋v-@xA8[3 NJ}v uJ*\ mt ZǹIƍ_1̺D@"pi`v +H$  y I$@*pwD@"  s]S" tHN" N!9w{j@Gj-;;eZթaŴW>!DXl:D@" Ј$@@h@C@`ϻEF$jJFHz{=-H4" P#P2D@"lD@"I$$wOe$H&<hO sCvYHϫDAI5ed%wZdEu^[V5&lhoSd>O UŌS6F"Z:ק1zXztͪbLf9e77mƍ]D1O:,DhM*hsR|uZRw85jUU/>̊9ojI|TԍΔq!\>]aS7+5Kc"HN{7WjƂպfQ/p/wrqR4Sga'p.uG10i&T ǘZ\\j^MZcz9jX}m %Xh(^.^.WU3"33Y  N`ހU[gCSh+ӧ3˸ A&@= o YsP*6+GGGxxx ,, 8v8lapR5 Lu{;ߝŦ :uG2RN3tŕ†(?=gPWeDI}=DA)'ٳ΅Moh"@f9 amc Kܙ/NAe@JV;4 QC}- :{Zs)Z&] Ec4h_R7/MZ&,cO)3mY[MgE$( wu j- Vc9u\k Ȑ-% BS&2@w/M$(ͼ4㹨Au$mĶi*/z% 4 LflM`cM}Z` ]hsP` a!H| \=|`m =I Ptjq<7# -qj <& 7wi;kA&鉬C"Tg?W"pq変IS$?ӛgMOhy*%.$CK] 4QU^VHf^-DgwD Lܧ( dP'ħ$FQa[ Z q$5Gԙ({ƅ!`Jv*iU*j棖ʼxR>;@T(,,^x֖Vdrs D' pJBV<03c-|$0/zy14ѓֻ=}sn2Nxŧ9b1:0~' ߵPd p=6^&7oތCupe>|8+]Ν;eee0L~X?rL ZT =5HnVD8b}C2ΪGU.oPW{!'mAɫD}oJ/n}4J| ^̤h  l|ۤprrjɌ7"??SN59v 4N_?9}WNm6bΜ94R1q: K}]|z{3BeutŰ>n h*t:x5 ƴ cFҝ댏W]b^$qU2ζ,?e05">>MY{[nz6bzz:vڅ*=z#F3}೤;wOϟ} իgЧODFF!ε*{v@n>|xQy&q6XLo),ezU WlTWLf7,$ƥU`RnLKI}׫FxLr됚Wq(?|#S&R+#.S!@?Z`B g[&أ}Lg-8~*kJ{ T"aRC{~VkvLx{pŋi@E~-G$?*6^#75 !7'Th6jJgiǐ`kOm-q65qX5*0uX_t% 6:@EM6BfcC}2u>D6[4V[I ,)VsFUX1;>V96Ӱ:<`XQQ!&Gi)4%bڤFe0x;U;[x G~gq ]Fh5u\F<Stӣt)=׀b's]mi ,jCdt,6Я%an_/Hncum}sw' Tc cl-sz7775DΔӓq7D(#+#ab3NN%mjo$PWI D:P b_|㢔MӲ6Q-*#!WOOw"Ҍ* vĬpg:\Eb;U bHFyn97֯" L~DxiЃT<e: ?Cf1œ#<)Y%f0h e0,';SS][lvĶ.uZpt~ԁtҲ|hOh7"wBj ]C:+O\+W $ F  y"e |DZ0"HxJHN+jmݤF37J*bE| 2.{Kw<8y_ܟXY-jǎX1c8|?mÛ?2^Gi->DTgL%mQR/7I)}ǒhBmЍsUM8^QU!($.1)#W~F+jO~eHR9֟P`+3 |Ƶcuj9&?nHvVKm7[|`1,1ye0xx`^;1ٱDיrLOK4 Ďv,6 flǤ)֍$Wc<:W)MrZ;Ɏ>MnI'ۗHPi’L|bgz0<{=^K]1iZꨯ @VmϜ9f&T1  6@Zi\kSGXq$/01bT4m%)4e" Ws%(6CIbxnю Fy7ekzmZr&*ő$L&ѣ/fyKmmXߺ㵃۷oEɴiӌuK]Uu[;j"@V}y)%ebJ?c%>ծh|]"vG2VNH4 8|iM{gZ* q!,Y VzFYH2jgU=l/jtL~ /7<;au;;vL1RHdZuKk&gƪT"nn_f{V>WP*kbm]h9yX9K|JD)Jk>kJg)58Ӛc[ڦFk)(0E6!P#OUйiMs_g d[ &g|u9^@m -͵_W{aj>j#@`;7h!NގWu`KkSZ;koƏ'A'@G}pGMȶ^h: f"-4Cl$ы!ԧZq#R VxI ОI*PHj]O8)c;$-")D)_U= 'oΉ& ݁:.o6{+ O%v As:*K~auN"(PP?&;T`kgFm#]SM rdD:j-E 7w/"B?S+Dve-;M#;=j]ƦQBo7s FQ5L}F7%T&}q11HRV2ץ MiLc= Y Cl{u]ajW[!5mAޅ_wpћ3%Ou<9XkQ< Guil.Mc .Q3\j"*% T!k3Zv'4Wc$.d`$dPEӴmUXmc#C$$~e$662D" H7X6O" hImc#C$$~e$662D" H7X6O" hImc#C$$~e$662D" H7X6O" hImc#C$$~e$662D" H7X6O" hImc#C$$~e$662D" H7X6O" h6,CuU9m_˝.XH$ Aw]J_H6"`mM5 sQW[ /ooOOvR!J$"[ai(ˀ=agnZsVl\{hCg?#c 5W'H:@eU59ܬ >Ӷ-h:%Ց䗛C1yXI~-Ea:H&NU@3䗗ؿo %@W"пoĢ8/Ls5LEy $D@" n`\UD5Ubƒm~I$sKBEDœf{)H$+ye s%?G" \QBxmydD@"pE5bpsuђ#H(.ΚJDzD:D@" Wi&hY?D@"Y$v1_" 1H17DO/W]eK@aeekkkٳYU9"8ѣŕCঢ়0w4Is%m>w%t6so~/uS37~W;OuS VS~l*h?jSkK_Ɓ)ד7U.o=]J\Gaɒ%mAK:D`ќᰳm]o;ǻ_0A"=eE^;;;O?4nFQW^ >}`̘1[+|wxxo,Gp>S8psaڴi򲳳E{>8|pϼyqIsJʪ-8r:>BY~I9$Yļ2qd*u:?eQ+b>puvW?Bzv"C00*Y^fP@$T{oDEM{HJ~F7OW9ٳ{9D?qIGK p8y$N8^9H^XB1m۶M/_cǎ BLIIAo|7(/²;{,:pv5kk*Pt:n:x衇ӄ@yE5zChϮċZ#?*D{=psqkG8'3p.5UX|h"(~?~G`k{kLçR1D+=0Beedy=0s_TB&fN&3 \)&Oz6]2 BD_GBBd<믿JJJN֭[q ;S1 "d)]=j*qcɏ%K&㼼<0 <B"#ދ܂2,-zak60~ 52uq4.M ’Jxe Z4w.R*S2셿Udɘhb)x1k }x"8Iu[1눸G൧oཱྀxgVAƷ`)SnCmm-}VP9fΟ?\ڵk/.* y /6oF~~~":%M6#ׅ9|{:̒t{$ aA^ 4X[[a\lPJH 3uAHTmHx6N'We)GUzIGUu& ,ad?Im7G" 11HJTV!dL4'NTő%5k_4l+E]]]|agg'mswwWO< $(OiN7wrt+TB4% _b:fi[Ҳ*ʎыq)"9Kold7lP8@_wDˎI =h'j<Ȓz)=BAAA\)Ƕ8-2dP%89絆6‡~/nEddd+kJֳYWSrKI"y iϭH2 aIݙ܂RQ?<^̈́/Hx:#4ᅠPxх&kt  ޶{n ˖-èQ? MM{1GV,ظq#&LI&x_KibʳLE3ő_|?Ob>+du?+tlYk]t m'< G^he$MVyqY %Uc 7֡kڴF pUZ^҅*Jee`)x3aUcҥbIO°ty׊e6߆|ڄgOYu7FlG\1|pg̊57@3֊:j|^hglh^~<{,x-UnׯOQc/@@qO>1e2/)((j2uEY''iyrC}`ֽ%ϥ0V}hg3Y=)`\۸h`YE -vY CEo~Y%’sttͮ,;ͯnVGd'` l6^lD@"`aH&+\:$^:,eN! nD@"px鰔9I$$@ aC@R$X-J$IKD@"`aH&+\:$^:,eN! nD@"px鰔9I$$@ aC@R$XkaՕH$m"I$K@@&U`K@ K`J$$@KK@ K`J$$@KK@ K`J$$@KK@ K`J$$@KK@ K`J$$@KK@ K`J$$@KK@ J飹%%%tӟDCOJ$S?ScyIIIسg^544`0xƓ guM]rZ=+*Z9'RSetIe]@`jj*o.R >L+@aqodtX6ox@|Jd*m\뷝D2=.%?\t4GGGy//0sLDFF?Ң9 ѣl2sp7㪫Ž;|rL4 k׮qE… ?4˧ /bbbiӦ+N:,ށp"44u]Riwu.xEpUz}8>n5xoq]slʐ{}!UksVXBX`1^{ lS]JJ mۦ^1bҌ~Z=ٺu+,kjjy9KÇ:N[o&z!ח}Ů]4[oѣ Ñ#G0eTWW#88XëV[͆?(.īoj>a"t6Mǵ۟F/qhgp,. 1BW`hdmfUuYx94Q]Ҳ'q69Q>>8̘K~P=睨74W^.Bg5էn OpK|t6څj,=Gv_o|eic(PRVaYv׻/ Ԇ]10*{&6>Cx9R"y3%=G)>Sv;$`= er}qڑC#pl:vP<COh먍j"#˔ߑi+Y"ɦǗ¯o/D2aXHXq_'G;Kzl4[IŋQk<dҽ+?̙3Xtȣe\[noQFډ'{Wt'x8q]O< DEE ܸq &#==]}YbVqyy 4f`Gך˜8N>u^'_pMĠfc9};,Ga;?rLՅ}O"}⁹7xKN2S#ꇃ()31%be"."IuGUm $ZC*ET "*Az$ =9I 3w=r2#0+wOnXS; قf -D?B[eeaΛҵ%׳WD_/}yk'靯QbR*݃19kqcL҇$obrW?FoC:Vnʖ-KGO>~w6WjUZz5@pchZ=z6ynW_{홴l+$F.\(ܢc ?@!{/ի]VaS!]vQ~h4`zgMbrAXfcRtGn-fhִaaY;/ÃnOBH£EzA [.I0ßw9./м*0 ص7k< CΡ AC q#ws`dµ=% od BӤ'f]7L_xQcڷoQWά-AV? us=c4h Hڎ ]1k`Κtz5ȑX7J+ p4rǘ4(wr7d뻹/h uh@w[[Ckcw <1OSq5Fly[:CO=?7ced҆n~ _k}94T)ȭ!h}o`B`-aaar A=ܶ #פC3=}N>]|;?d(^xA@C-wwS\\8qq_#4Y!4YiIlJb5>7g-'==" g:0{׬"ganƞJ7ס@Fn=./ؔ RMB* 4e5tϚ)\ u3FB`BlUS lBa>u&I-N Ѷd3W о51IBCSkԌհjņ֖b) ;^y{!EhF\=(yQ-oXkT=04;掂 7xbZh!xSyy=-~Mk֬[ ,g9DAm';TdZ~m9e15d]Q|vJTI7 IDAT RP_g8q2+z]78j&/_0s#dKA[=3=<81SL};cdH1p^P_kV*xd׈m r#wؗͽf)l*>< !Ǧ ,:2"Ȁ|W$/|;\d0^#؋ Z˟A4z}@cӹg`ڤ[qΘ}[ uŹ ᯿*ckWy( XM ޓ@D7 |k3uRhV>k޼4I~׵kW6mm[_`n#HD  ~>BSN%$!!.6TvY,Xi X!Ji0;~L5)/Cz3"$b?'l̚fy;Lg#z12W Bdլǚg]q&]D9LJcLʘLjPeiak&` G{rߠTz}/XLm(c{4Pް9GĺYP"&0~QHn&&AAAbNBz' 4 @ӂ?رc)1@} &n۶mxӧ! 2fΜI>T5J4P>lɁfAyʔ)v{7ʕ+|BV׋@z|0Ng HwlAptCWN|W&Șq{D|/&\dw͐ٺ eғoaߝ/5[1 At!ٛ5+;D}`Gk `$"p"xz"(3(-Jׁ+>"p"xz"(3(-Jׁ+>"p"xz"(3(-N]AEP҄xuוqXE#¦&p)~th"?J㣩"PP,7W(#?>(%R|suh"?J㣩"PP,7W(#?>(%R|suh"?J㣩"PP,7W(#?>( cmhO PUX1[ZaO^Գcc޿ 5g25pn5o=:rVޝ7%ˊ iĝyh0H7 ,EuOVH\ّFp?nU{ӌ_9O%~X'd .hCs1k m^ܞx ӇWM}ǮGȻ|91l2,&R;@ȩSH;e!@:SSScFx矴h"ڵԅcwϞ=*&Ϯ]$`#]|; Ւ]38MMהҵ{Z&S".W?éG,=şKKHN'rei.u[\$Y͟m7c1Ԏnх8C63|x){26 T / oΦ5v  l>B!،n>͘T@7&RKԦKԽ`*WΦ=@&;6';gիRJb"Gҳ/RHD!/*@RHLL|P :m3TBK/˹~B 1bp>c 6xdf|ݻwz&{w)66VLHH9!Ϛ5kDKi?Dܳմ7,~c0OHwK~%S 鋷H;Ro{^ {k|MBt7:OfȸuQҧh˄k{.<Kׅ~Lڑ^z_\hHsS)\raZ\E ZV^;2dorOp/_$˧1U&~/aLBDƏ/0?|'[P\sF`[Dnf+菵; S҉ , bb)1)jksٔA h~w-ÃX SqB&_rJc%,ڛ&8`f~kuhmf¶ G CAHV,g?L4z$iF^8GdDջwoyAYv"!b 6d nΝIp eLW݈ZCTB 4cq'FӃlo֬YR g`ihhNط7.j$8w-C+w?9S hQHxI5{'6z=q:>ɖM5m>rHLlh{[B~kʸUz\(02VZя?(؞bᮻ@lO=M65{ ZM$ c=&u`Fl b LGh&]a寽ZiFkRøM06h̀;V/ o^ڟLsO1g5 dٺt'LeDr_/w %횇Om-*i7IοP4lYL[|?h~Rc{x&$ { 3ߗ9 9s g}FwlYj(A#4sU@Pd[LRR*ed̘1 1I><4`ڵk ʕ+ŤV CA~A=r7M7 Z(7gLpUbN_}Gf5$ ׮F>?&焭7>wh s-%GL9~tZ]csӵ~dA2Nx_iHpAjz!Pf1:!qiDR5O ]hR ܴ ~9lAiӦm5־L!_53 ^hyקp$U4Q( h H$oC|f?AKF7BXs  Æj p:ƚ^je|dܵbmN1,XW ]#ƿ$C#EDnp)s`wGXsYVtis=ž>g]1gsAlk)n KחJJ& NDϊ"Pp3]ơ=REc(z ZXP;N @EP⎀+\-Eq }?E@P(>ʽp ).MWE8q}+V/p>ͣ(@"\[!i)' ЏN:_[zMPb@bR22WVyAr}*Pyo_ڸykAi"(E8 \[>8E?Ŝ8N{~ǩ5"(}Q*gt}j ڱm !E@P P̶mD5Yq.TY!)*::uh_ti!g|" 6nB1Qǩfk|guZi)tLKMjیCǭ?9qWEPO p(3UU[>wfDB(5%i;|t~dG" aԬCf{: #. :>B\eh-ɃcLQn ګ"E XjnDP\E@ U4"Kͭԁ((WR`:E@p%@W"PjP,5R("*b_PJ JV@EU]EL+@A@ J"i~E@(5([QWPt1ͯ(%Rs+u "*J"E XjnDP\E@ U4".7AJ $)9.\@QsQ2/eIԴ)ˀPN%|{'wsutՈA%ٯgLQni@t9qTRECaG;*V`?`4&3{ѧϤسԧWg8 bQXzYҲ~ƋN[S>]MS n71A,،օx{۴>YBZbw<mtD9@>ΊeH1_\`]agՠe4˵ūSkE>"7uGȏ'$&S7Z5ҩ3u"6i cbb)))Lk5iJ;z$]p KmcLi{L[Zv+mڼrQ测]@8Gz*Vӻg'66шTL-e|aM"d,UfqzڴUhmU),*FU$ߞd24l߮%mܴIժAu%o-X\/Om|>c'S͸c'P. P8s-LFJG۶3lF׮]F@?ϙ/~Bs*H7KOl#GMugUm\nUפV-P-k!Zfed\kG_钹FqqDsa:>|5b %'JXn۾6mE'O&Rۻ/L4G?Ƶm྇>e+EDӖ{Q#HHHe+ѱ۶mS%PA Эk{yCF!o L{R ;gܵ[98&s&:<7B'lD CMcFRASd|+:攘l(#׸/3gNwL2 )'m6RLg88焘q_;k0/]-xۛK'9hۻ|wBu(H$.f9ҰAlUs)عOr?Gk4i8Iĉ7ORmAT7$γ/{nZĤdZd ]M>3y<78M)TLڍԡEKlFFFQ)5b,|˯~a4dpءsg.?QpNLx ?=|nN$q1Q.YF&eMhG//<@jVcm%6if _F=qK:eLI<E)ЧmFzG;nkڈ0 ƿfk!ZQ[O3[\9`A5m\Oo~z_%iü_{{nøNcL"k6R+ IDAT\v-;t#$obb-]bM7?ϙ~v "n\a4k[wK=?8a| R3Ap#Lt^2Qޝx1̠ N{C%F;ё|#խ$fbP/ڱ(6K[19@:%&'9YH w]ci7Ӏ]īlP{Peq,|vp_1'<ϦW5tI1U+KYg a0O0q;$u` -|p:}Zf0? LChL CpPMsc///:~֦xbIb*{_F3Zɓ'&+qSeSYCIKOV[u^ f!TDHC6sYэtl$_ cn\Øf6] 4mݱXO;vW|wOvVB=sDbwb+w{6.Oңk[fEdحRM}PQ%#@؄1*x9ZG@!Ǚwq l$M(qӔ ;b鹄,3M8RyRqG@Ui'/̾L)gya<IBT[&.|aW3xLYXHB:u^hқ5Z5w9 em ?ym>E 7C>TapK`,T)YCjע[8׃H >xĐ>fXH6Rt =`. jT';.ǘ$?}# A)or gze$\7Q:o`CkEԸ0 cNasn]L8?/HAգQ>9w;HU}CNYfY/$uƽ2ehz,Ukq19e YEIȌhcaRKg1\&<6 tՆ'L,ފށYF$PA3~eoٳU>a Z䐱-,*_iؐ4o rc;&v6G +ЦV1՚$9JP-B$b#FrxMXۺy0.~_gƱVvA4>ChlG߸C,6Ӆqcj[xpTVRa۟sd?yk d"<Mx+M^c؝jT3]6 &&%+;L:=dT`f{ a L/8cT7*Z:oIr۴TQZ4oBC(+m۶5?k*Ybfg?~>Z!:DOr!'t?{+ ?Dvo^TPUю7]ik9Ƶ*>dicZCS)3Wʬܰa:ȍCv)8!@qWl4=]B7:ׯM8Z=m]h)ŁoˏM`w#1lm*Q5 .s0DHb=[y $ٱuS9Fktn*SQ;sZ";qs5Uq8l%yfƁ}oxa| 7,WJfzL(w<[6*Z:Ҕ#սxfQ#3tl  0gA>ۋr/Cv{(JC@"=A:|s+~DF]܏'Ơu66߱qδb>(iM"롵cDxLMUTkD.szR}_<%0EsN~dk!,^>\0i"@$|w@C+w!lug-t>!L4Eؘc>X3}3]qSS䉣Sv?t1ͣ(;0mܼz ;T}9*!wiE tS-MTO# ӳ;iׁ>.?QPN 4GmdM WE@d6iD۶31s*4ƝZu]("PD@1TO;~mrSS$"(p4@PqF"@lu ho S("P$'),gILߘ3jE@P *MvF"@lpjrg*<"ؓpF$tg*<"%~WS?QQE# W9M}?E@P\E@ U4"Kͭԁ(x?Y:t萣?|!=,,,G;.8p.]J6m*Hʖ-KVʖnٲ%[Ç$ۦŋcDD=11`4G!,d6{u+.\*Zji=pj-@T`aqڰaM>ŵ5k֤.]!YO"GP_^Y^xڱcQ˖-oSj\~==uVXz~mF0cx 믿$[n~7onRJt9z'#\󥧧ӛo)moܸ1uڕn&j߾_iڴiLwqn:ԩ2q,@C¸ooĉoՔ_W>|=@ժU#:r䈘 .uqLUy#|6mdMѣMgΜ!PׯO H \rFF)))nFnT6h@ŵQS۶mynɓ' }øԩ"";ƍV^=y `3r46/OsN:uhGݺuJ*t!'y5kF^^)%bbb!pĽEA*dtdÏ[n- lM1Ղ@ޘ|м0i #بd?P4huqW% BΝ_ AԉJaƎ M 8YB83A0F RGvrG8` Unݤ\aIbZ{aFlZj C0# xhak2ٳ!+>a+24(D/F]|2xUaŪdv5WLJ^b3:yd1UpBD_"8\Y[`YMTdaAkdB@xAp0 ~0 d 顡B0G񜁄2d\GDqY0cGy,V̌Gk8vvl匩EcQq mޱ?(cbŊr3r^{8aZ8pFrt+V'NoVx=sԮ];ziĈB¿sƪh/B} ( HGfALLK< `$B9rtP${h̘196l0ǵP)4,RA80K +$bs A~?*42CpжLI4E LUŒ1vGA[7k+cs,Bx &8AXQs.xt@fUcpذaACi ·U@FlѢEʕ+:TK~0߄ (0xi/^@CIp f+8 hioțXG^feǘ.0FlW=:4Uq&$ 1LX1@hljagqM"HW!%h=( *mH({E .XAHЈ` InP,2/# 7{LybQ(.׊wa `{Ȳe7xƍ' H HrΜ9{0p;|y9/:6h @L*lꫯ$ZVCpϜ9S&6ǃm:&dM-0 .37D@{B E !04U,8ƿ١.hp @ wP@+ ߠ bM9bqlj<0퍻Qq ADأG/nS?[6[ybW  > L*@0)Q'"dfXhy=۔ +>b՚I ׀ 1h1X`uh( ma$33t萩V>Qի)>>^ΣE+OMMM6Qxx8EEEI>~:rH'bavm4k,14i"jٲeGɄAС H^^^rmܹ]w%ח,Y"[JJXp\5vA۷o_||\L4f̘!i+W60@[nƍ7oUZ~g:}9qFB0!  1BrvRo Ǐi40HbŊ-Ab01— iԨ'7KVASN #4A Lgϒ4;/~Am.H/z\(r o~^A3֭O[qruGߴ@ skʪpBɈ! ?ʕW^I?y԰aCkRǨoȑ h/LkDyh4=SL{yرLjBnxÂ_ya p @]4*@XPDXF MpRJlZ%7{jYnjp5 /A`}ƒ9azd7 En }L^'L_ ^zYd/+MXa ܴUH#`$8Q;H*U¬V@\Ȟ={e͋cI8&Ks$f^6W83>W?IDAT=gt#y Nj(b1!xYx8αZ|䉼cƌ1U?<Saͳ>K<8ĉŌ kp#(ӕ6\͋}0 )F f` hօFY\g!_n OT< m_pߝצM4hDN[Иϗ ղeK[BtA$rFs0}*[hïrJ)+ \48.8My}(1[v-D0!$A*{:(Hi~!C fnk% 448mnݺ!BhpQf_0&$ Ol3ن@ ]93m@KAڨQ"snfpJ`K9<2&H ' 7E$)[O+H8LP[8/D1 AjG-Ia&""BB`r|6m L+pSL=v8d9s8Ax!ٳgK]|Fzg?ƒ?k"B$f+\ztKt`Ƈ'4@DV͖<\K9"u 6 8+mOp(8/\x_؟>)LZd"Pfaj0 #x@XYM8p@6̂@EG}0qR ]vx@0 Zehre01M^,4g\t_֠X iڎ/`[Y-9, HV$W`@#+?A>E)0 evaW~1 v,c;zLhX4 nk "\</ZCiAȽ"P\P,.w2Gny [XP"x%@⫵+@1F@ "x%@⫵+@1F@ "x%@⫵+@1F@ "x%@⫵+@1F@ "x%@⫵+@1F@ "x%@⫵+@1F/C0[[Ǣ]SE%&~#K̊"g65V(%%yߴ׊"V(%%yߴ׊"V(%%yߴ׊"V(%%yߴ׊"V(%%yߴ׊"V(%%yߴ׊"V(%رcL2^e˖z7L(hy=/_ڴiڵJE@`n ^p=J3gΤ^zѩSrv]Ƞt:e7v"Pxk֬I۷oŋiܸq2hOzھ"\8 ]֭EuFs̡xڵk\o_EaaaԸqcڵ+tMԾ}{{?O[n%ooo"Gv$%%oM?#EFFJ۽{ZjE7nzJ[~-q߿?W_M^9r$ / ܷoժU:vHY*n'裏ҨQɓ6V\I+W[n+ϝ#ip:H jѠ-;cJVT=2ukߐ5 ʵZgx ^YaDžfZjj$E&W>ԩCA AAABTk?~<͘1CRJBv ͛7SϞ=)99Y9 23f͚E>>>ԤIڳgegՅ}G_~%M4I?#oڵk{r u4lPBl1h"!mרQCDtR\B+m۶oժUw@-싂5ݓrmLƣR ;A9NĜ_c/ys?5h 0=F [p9, NYWz?O?$m~tY:t̹shɒ%B]-[BB̛7@Ю@~ovAǎFI}7Q>}$ϪUsݺu \fMMRf>.ҟ)u)3@~L;w->P'@kVdй ?t;RZ'F!符4y\:0qT%@:F!/hz0s!0G.P>|0`o۵ӧOK~D!0arwh34@w=Vr6|'OÇ˧At07l m4ٳg'H{ԩBC4AVMJ; rRځ b}$$\7#1uQI߸L2<=ICg=)rL+6/JG(1|V8qh|rz#A|}}Q6&&nڂFCW]u5v(zn4h}VUjKXIk7r:jK792d^kyDd)\r(/ӦMo]|t(L;E#D#** d?+WN|,aC/~Ho  f1? Akjժv FܹS>͛1iP>͹#Q`P̗vͪR-Ng^M>kyc%5œx 8hAkZ`9s&[Qhڵ K/$Dhi0]Ν+ $QoVȰo߾R1AqbӧK?IC`_1m6?9O:t kC`9+뉴=YmCީu}g=:sɊg9jQ!PXm%&&4]5^|E¶?^03a҂,"  >F# 43$!1c[gA K8|z,?7ygez@݃g}_̽#RE\ů=yp._ΚMVFv_:mϳ>pӚE%8\쳛2e&il- LV2F7fͣ(@"\[S}p(@qE 1)b|+9Eۧ:UfRE(G}+8ռSjP̉gSj&E@;pGW9۰CUkюm[ ("P\bm&܀UΊs ߄oLQ1ԩC;X!o vOP [(&8լs>~c3-5NqiP:;rohN+RU)"8&wlg˳WVm4eUU h*EB(5%i;gt~~KOE@P܍a3,Ҁuțc|>__"@S!xK3gWZ)fç>g@A `$g2g?^u)ͧ(%RwKu@",J"E!XnHPE@ Y4":K-)(:SR`: E@p%@g|"PP,uT(",ROPJJEYEJ)@C@ R"8Hi>E@(u([RgPt)ͧ(%RwKu@",J"E!pQ Ri{N/8U׵+ O'%Ѕ W9*_ߓHԴ)ˀP@s~] Y~`2}L^R^iNJEaMffJK˺^PtؚDX..h"Pl h5v&$,<1\?̕WT)˻RۦW"W_LJkɑǣՁ:GY]L)+Lmՠe>OkmW9ͧ9n[v6G?8W9sw?A5WҨ]|]*jg"?򞐘Lg\-)v!DMH11B&Նڴ yZ=~.XۥD6&ڴ=&}-Z6mI}zw(.ivEW(CM$KeRyKbоkJu_Ym߱mCgl :HL=vMX<>bZժN9O@g̡s M;هCݺ86mRڷkAe25*TbO5iR?s9hܨ.lLPns3JakmfIZ4ZOȮ=h՚Mq}K*48b"ݹ0߷t׈*m$K{i/'O&ԩ%ρۻ/L4G?Ƶm4nT-[JyPei#!!XG"Of mԤq}ɇ9.>:AumOM净 05HXI!@ǣOQqx!p6m"0@: &tv?.x NZt=-.>bIvCf$H~/L7&^ƌC$ )'mr  sTLڍԡEKl422B &P(kĕd_~L)v@ѐ}cVr="%px?GFĦT񳓟2<=LJu Ar|85^4v&*VmZm:[x(5LtItg Ҡ~hO-^Mn^DŽWc?'l_"&r5e"yo 9豳yApq@vW$w!vcdlN)(1&h d|O2C7_?>lp._KĿ[6Q3^pcNl3on]s !_@6o-%@co.Z54WܹsIt 6ۻ/:tZ!?hO?|;/Uh&%PkTpׇ֭RՀ*WK?Yl䎱ZfL$94enŞ;/ dNTȁ$sCaGRzP * !!XZA;6ȑV&;&*D$*Zg^ =X\@SNcm*p1|W(zH'fS7ÖB槵P!]PР>b#4Uh[~UHv,ӗwoX:zDAL~ 1Q4aC66+cqn{ZWϦ-"璙:kN]D݈ysY?/Se~L&~L>쓁K0qWsA #QbrVj.?P6m@Ѭ0մY_@3Ld_y.{6p1P'c6`B;AUL4d87`1cа)6r\aX3;f$Aӄu^qk`. y Ty/qr|r4UQNc"?N1;ׂȝږx։~eA2xVǚ>va(aלE-$Z ۼe7uN+Gkl$335-M|}&/5A#'Ort4@NeL>@EAf#ɇO9R-Z,Tuʭ?ryg _L$!>@Ȱ+z|~bˑT m\zV]BY#O-! |4-U%s@ʈfJj9Ol]"xlïW >xĐ>[R4%~Q.;iXP 4IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail04.png0100644 0000000 0000000 00000226154 12564151525 023137 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]xW~.$ZPZZ5*_{m#)- $$DHB?nf%$=ϳ;rGOC>khC:::dBZeHW/ma- k/uuu-nvI-Ielp󖛟|KYq'r7͞XO4KKOKŋ= K L6,~"o[*'{+v߇o)ƣյС)m6L7ӦLz4l;Șh$r..}k`'f\Ƨ >ݬ#i|LPtMfؿwrss{?wwœ릴ؕ[ŴcQyG's0Ic?x8Q wC7BOO"Hɬ{?&"21e0Qv|W6j[V+W &,~gTU )TVV#GRxqM3b2 ƏI5X~}}Y[_L~a!9{cЊ ګ8H}knQǟ7Iu5hQzҩ6o\ISݏ>(Rjm{K+;a{S~%2@U_M-bABӅf}%ܰ^^^}޽{ߡo`G)xxx~O0R&ڿ?VKkz[^! :BvA%^Z聢j_:L!>rv3[lj Jj@]}&L1`nn>Mq(R]i41e_-EpPfκ֮=99Y1w ؼy3W嚧g突@eux'0`pUT,aug}%IWH?IAǏGjRR7j QK) JT&c#5gI(ض6bo5I94ӯg/F˗}#<ݽ;wG{^>pvqƢ^];Cmg*I̲ oq*?OͷAEUu>(&&ư049iRo7|+٭>Vv7[,vT,:wc|ѷ7A)Y_S}q*p'i|K=H|\3zYw 84e˾_ c%(.-G~Q մGu1K+ 0+@!iBu&;Px2v"& Nwewc8'X!-K%pٯ ٤6yħ j~ b鵨Ļo+++<䧚@gϞ-9u055rLw!v?|hVVO7VxD o/,NƮ 1nQyȋܔJHVM}$q2t# *D7-5U6v(,.8NNL* (,(D* CnX*v(-gB`Je2jҠH9RFv.c+Nn W_z -zsf7.Zv騖X4f_-o鸺zYcneȰx> qؽs;殅#x 1 VbLp&6q ʁlَHlO?l+cep2E/wQ6T QZZ=c$:W 5S ua,4l/]=ƈodb'%#t=QWb|JWʈJOO_UUqf \H<5!=3և |Z֫ṇVG3:Ǝ2WFe++++'&lLױ}|^#05'b9;&~[Y7E;JwLMMp EPM n=Ubw?!hwΤ_]?,V㟹BהXjlK |.f($ppxPok=ů?(vLAjLNBZ vvbn{C&k i+])# t?=}"G\Hy* xL nմp?i;<1MLVIkL>:Uȍh38wגpW72DyE`T<_IoO>Th|K\Yp~a'Nb%GaÕ ->3 IqꛫB?GC#6TO6mގ4~5@L1Iz5*^91BbpW֢_8AMe^ʶ__<8'PR}GO=q^ATP H b.dg{ꥏ5@(;D2]߾e$ɾCj9ݰhR<$X¶x:E6"8ISƋ&8޾~b?LUXޡtvEE]䠈PH_I5~$,L?%-RD)*DDG |1䩎#[z_>ɀ=E]ms?R2Ewئϖ?oB>Ĝ4ƶ̴*&Wcw.Q^s Ɛ[?WmDž ճf(&%mNԯiҰ'H#ń:yKoLe[U GCTeӱ86Be6* 5&!+4kLۯX8N }=}$*+LppZLi.1`M"x(+N`3Vk( 8Rbl)fMxpY1FSxy6F)J@ʐ_GOi()`S1$ =mlϗKpʲ~yAQ[uc6p ~\B8x'T_vԝtϤРbҢTQD㵔yN:Pn+0`P=|PDl;A\5ݿw' LtbEl׼ lca[+*~^ |oqл{5J K/26VwjǜR{_,\``ӹIJBI|tl$ &PG_5jS c%Χc$lyuؾ}Ž-cӦM $V i831)ie[ WΉ {i IvFTT{<1).|4qu~([bߏժ 4{Mfy-X:g"UO`)FSBrQ =UӬn1yóujprz%+g{8˜@|s &Va '"jtDֿOO i1cummȠ %C[ewa/w7X̓gZMZkZK 1fQq /d瑊ܜIO$48ԷȨ\S s3ҋ9Xi[ و:@^Sh+]j繰 "fFOj8Hs"'C!^&OFp_ս1#'i, OSRJI+$si*Dxj!#G 1iY䝧yP[J>SUNRcEv|M{k/r[ya`{$O.^xqŰ)4W=qxSQ9غc'"QRZ*kai0}2#A@gϑcvV@Xɑ5suP+k`%em!3zD YR" h/+>IH$"?ӵ8n9fD@"cg P5~RZk 9hDC@_D@" G(QD@"  /d⅗cH(DF@$HEZU}:dӋ*2cQUfjDr \!-c;^s5Piqs3A0tbJVI@[tW:\zAs4­g"+\mt/<ׯi! FW݀jV6N5cz eVir,KFyNS ^]C3K1ry(W=hLvrѬ4ݓFtEy߆wA_0]@w -u|~kN<+J0r8Yly(7}7Bt*a^uJAV2U1dCs8~Qa>Rljq;Rʼԝ|BE ^HK#`+.cUW03oCc=Pmk ]軱S'Խ?y3dV\{N}q.b; mKU\"Qu%:U"bWbal{Nn1k]n˪t~@w2>@rZZ[9Ő7oۏ ]e|-J- 8;-ٰK:b>{gO:5V5q`lu>]->4=ί?Ixb3ۻ=z:˿7}1#"q&+k;#9=6طO@د(/Cb=}m\a@_|ӤAؼ]Z' +#EyVcIDc|桲H{Gxǫ]VZسEޒBP^6-ll\EpU&"=8 k[{p, r~Ñtz`:/,&FV]g!]3'Fd.-_`- >2T|}ѫ`߇1'ɱZ>C=dZHM`npBEF,JĝsFcڄ/+ľ'sצo߾ Vm ZcUV:%S{cƶ;n%?W=b"VG0Gaִ= qTDg ރ>G؄>xACBR ֕㎛TP=2SeY|QY 3JJK0vT<`VݮR/̞|<=P^^TlٺL`lJL%?fN'}Y98FJݵ'f4Jsgѧ9oBbmڊ<X=ބrHiD?xcp;#3QU D}1w< }k: 7-e̹_@m`ab\0WؕcdF&>bX2>;k5{=^=,QR mEؼ f~U<P*pQ1q82rDskӦܬ" Z/ձ '0/x7}lPTQ  D"_3eÇo.+180u6HM<~}0uX|o$֩g&C^O0F6_~ ɫ/)8q / vvWdoGVzbPJkQJ3pwu!ipwqP](MH[@N`} И"oxnBHI, kgC1{8? 9iuFYI|h"cDtF{m<Xj@33L'Ǣ%[ټ },zy"'# <CA }ɳXoLCsGHq6&!=Vхؼ]QUE܄!,OdSce 2iAm?~WaMsv6v'~×TS 7KG̞f~&é>Fn /sY8j-_/78ф*/̈`ZƌBuF ]JVy8 &fҵ-@VN>{a妝$<ގjWX\pD;"鈌x,z.5󋣱r޾n02LgʘAJ-Gzr5'i0#vC||AEQ=\T5ӔǍDDl KD8W9fN8\ )&ScnaCT*ع$,YA{}zc_h|O 3ZɒW[-QL_ƴ|up $(t.9W" BXx]3EjjsP>9yD s>q.9}aC}d:GbS-:x"IHymmTaDy@^~>Lp8NnA34s4F$xxjwmm"ϥ"Bs%JnՖ/< 鉭\5́\0~@d䳝SHk;Rb@D$bA04?GOFZqBm u VuCF%5j :NL'߭U,oe IDATbԐ~RkTSF6g?݌Rbr{z  wa:Bl#ɱ a Og+x׵⇕[O?Qq"6[L|j-R-ap9Jͷr~VN!྾=c /RbBbc٠ݯ)i8Q,U5cxtQ$GI5kx5nH2:??6$KR/(.EQq &j~5y>U|ӌc-BN`8%3F>?"sٷc僘u /?cڸOBdCT-5v~+_hBT2ꪞi&eTAwۡ(+#8tp Pwn$&6aHqhH9}]4:z*.A)c9XTO*[Isaok1#1d*'C6Ձ6Y1~PXHUCGb6ROO?13^rb(%'XՕ!`OvzR,~_M6;O!!GΤRܟ==K]Wu) Y Bh8kl%I%N׌T(NJwh!MH/zK.3NvSQ;y G/WS]=Xè&524 ɦ?0}>H}z'{a(Q~3psv+>籍ףF)Ei9> x$fᱻo 'wآCqy:XT7>>Izb[J"SO,;*%:7̀AUl_s/ŠTMe< ,щ>r:L8ab/R-K`V'Wz# Tj6K$ ,WRY'DXVԕd`Ipsu}?-q>Aͽs K=3;1ms_OŤ-iq)$l։27]?U*NET4,,?sÃEH!` 圲mpoՇvq1[ɹq|Cیͬaba;CTmĹ!шJ*ĝхQg}a <3YVQ-#t6}pDZȩ Cэu_pnS~u:~Fع˞n@d\4铚SkS+wƜD:HSi2 aiGxO#Z&dlJFۇ+̛6D&O9J'b7=RI $'8W{↩ 8,_ cipLh֡wWlCv^E;uD/3m /u>߈>y(D֧OIS3?G|b^5.O&W|ڽaMcE!DM*u{[Ztfgr]#wMX[ET!8O5M]=E?~#]fO/5a212 QF ܪtvxA jy6[Q_)98brh ̌7N%FոN>ЙRVӚ]̹VyΊ^ΪMjہ3jo"X:ɳC( O(PϾS{ωfuOkk lqf4\_Fvz؆Ix2q,*ujnϥ<7q(R߯ {'Ē/3]#8DJ~fi6y[ ƂIsXDAlR ٝ$d>v9+=FgOB,(y1Lz(yQ8v&^Qշ3[AE|ݴlf當m(ZWOW7;h /jw$^&QMw&{nOR0R&~wv$;X#e&x!b%HM'Hcf9^ƇCTXmMr024=N ѤO^?k7֌:.4/ _xeā#qlKӆ~?mCR8[ۀnvfjѦyPݚGyN ^-%%W˕\y!h:uVzQ$- ӢU"}|y"2!VsUޯ{Zyue9l%l&*tWS] qjெ1H:-:A7f ٥KH$&:N<ڼrkGÛ0Z!QI_ujL2hDWGt|D@K$(M"  껦rDH%P2D@"p! wM$- PKd6DC@2I$Z" @lՇdW5#HD@2@-$k*G$hdZ%I$W^}TH" ,(+@}3@_-e窫km6{ GQQ,` ==y;PY wGR 3']AuD?y>?&Uj]o+6!1)Ux#.>I}wD}NDd,oWdyV 7cF 0TU5IAbܘZLt:\fBcv^DG URy㹈◔̴dPZz1'0і4᯼47k9z ] ,9;C'txGAxHѥ"#jjl,yYY(+vq5էbIiIN O/TI{Ĕկ9|`!^_d~@{tPLI=rOaHJN}z4{2"I"+;$}x v|,m E|BC; 66V"٨81Y5ǎKRN?n( ɮ9S*?&~^~}{R[Taؐ`IaFoKT\h:}F:b֌ XQ8'KNmO<ã3gdf?O<ߨZ.LZmD0ECȡ㨭Ms]ZYYBbLyTsfNDyyhL }(?Kx4!er1 8qhgIzbϾ#HIM)cԯ|=E>[qH3jY`SŽ$w9:VWU\\" bL<#ϞCt&" 8#99TXpLbPn4job~d_\\n]0 . 'FLy'Y93+3+Gl\FX'83&LY4i={b5ٻ>GL8_Xܹ¨bb&уŶ?6'xy!!1U;1n猩lGpwʹ8XIYhuX"7k7mArEwԐ-ODiY9v:á9Ni<Ο!>PYQ)kKWӕvRawj,1pH"/vzGc18 P=6!(4I6nl ~AnÂKtb!**bvo?, |pr#iaZ10 /zD䫤:v۠vh"^7yeL3D҈ >}y<Os*'x"1)5 %D&<&ExŇ9)XֆAz+v?z;K FUpĹX@e_&Ίb"Lm,Vԡn)򖖖a$>Zy'£EQ|X|3bᴰ?p![fyס'Ia2UW"TƎDa-v9,k #}k!ppYE:g7f@UCy+*aCv,?Kl9zSm`*e>1gGqJH c?ISe41*#&G̷~H Jl]jsJPxl[s.d?dJJILޤD7Kc(((ld %%e-sYIf%MNGa׾PG S| w&f_|[&nIPUuO& R_{@n plL#c,>ׄjiAt40$I?PE*B,h;<'i͆_b X ö0$q;9P$M !s|0sS4`_y5 aə/TM>NH%zLl{d(j@f9?>R(&Stwŧ[QXQxĮU25@yJk$*3?'{afrTJx 㛝C4aF6*p[u3bR-_?yGQ;2v$wU$e$O`?`0ZEK&J$/t<ic$Sm5d/+-AWڪWK$ˆ@G~V*暾 КeōsdD@" B`슢/pbe6?ID"<%@PцbbC^Smy$AmC𾾾:t(nV_ٸq#-[j(EOhߏ;pl2]S8m fR HSL!33`I:["#Pɪ4n>7 =Hb7|S09QI?8ˌm[t3ĄlٲڵkGoe±cPQQ!hL̏ma,uIŤ#CD9NIEy93QקSX\_} f xmuJ}r,?I?sRۦ;޽[&y 7eTl~B`eocNoT7ǜc-a޾.+R~wF,N ?Nd;cҔSs(fzM]\MCo|'ؔ!£!ŁpZ{3f0L9XzlJEEE?oqڵQ|<y"'KL5!3jg}233ZXكm0<0 y!I,Amq1uLC}\OD&a QlΓ☙aiꓗnA?|bfՂpڏӈkfi]͸zύ#Iś a[et7ydo}b7 *>itǃ$i?O5/.B~Q%3SVI EI|jI͒=]9j/XJ&if5Ȕ: N wG1ӳ+R2@V#Ym64'Z{Xu։2U?""B2ꘙ)̥m݆J<Ӎ&6ϋ￯\IO)o>5{W1p@pttٙY2m߮2s_x\}&VY( HB`՜א~^&f Pm)$N#æzWWj[%3?V"cjM`BVVN&^ *L1kJMOMU6`7#q} ȩx}dg[$!1s'ߊt13L0\ kJM'},lc5>n9O=1ۙ_XTI P/IXONJ9ekUi;.>LMC}Ker(*v5'jӴM #iIY3NY״q3Ov"iF|G3omdU; FZe4v<%oMⅈaۏ!3?Za`uEL9g)'=K<`bXvvW$ӧ iDV-߯ÃX4Uݻ:SSS|gB]֞vaLaѣ3/J{ r,MyL7x/ ^ڞθ;aXs ;LX"VV}j0~^~zpʎVؾi h`pJ0-o` d*8fךe+4mcw"?iI'[$p3־[R=f7 ~B1nR'o ɏCgyˏx5~v!r_/cWIutlhys\Ef iL/d|͚s^<_AöV^t>n9Ҡ+W߱K}!¶4>@1E"c& Bcv::{4i$|j/@fx+VbI_Ν;c8N*gSwߵ/>TM9>HxizW8̆غw'ys˳C=jf,YӄUgHJ"&{`قDc ck5=,eItgܝe;ۏ8KD=tw@.s`qYN" \*^*D@"m ^:qDR R%ndɎK$d,/t[$춗Nv\" T$TeyD" `t" "(K$H./AY^" h2廵vD Z3@~$D@"V`*pw@ `*+Hv$(t v RD; `wJ@ `*+Hv$(t v RD; `wJ@ `*+Hv$(t v RD; `wJ@ ) p֬Yс{N"㛥_&LEHHH}=qD4y t:vGXO$k5ѣG|r3rW"  BYY>c^۷/F[o+(..ƀbƌKfVo%1}bz=mNsE%p!H4"Q]SN睨tsx~{5**`[!xlf:獕ĘR1id/Xƈծ^.[Ot&v)te=;s 'ԧҘ_(YLOm8(rx ٩0z^ԲIMhT1nMx=wtLJ~ #1G({ac-g5 )mc7=Z\|mޚ`p߅t-F<dT% g܌+$N0Bj;@J.-BWFO&MkW_-ecƌ]v_p~nݺч~H]wE馁W^g[*T,Y"{<|p®6:ӊyS tqljl˗p8KDJI^5*S[FipD0ۺ}ع S2ۻ׌M4$ހ"D(Sj8dNFnhתnp'W66G Clc4m`QݠAgӻwoz'd6*֬1#`<>ucaZ ڦMHFz_~%=c2E! ǝho,n/eHcQCf} +L Sq&c 8e3r%m7OkߘiM_Gsd-Bkg?Os5*^~';c;Ԁ< )T@;kͨ\j \t1Ŵ3Zt y[ҼK0ci>QtNlP~nB %8[=Oj d,Wȁ L2\>)F~ؼ7n;+Fozy. i"r&§W\x;ѹplj kW^yl`CGp.|"i8bŊ%,g"4"aA3Тq *Saǃ}ׇ6÷b&6W0mŨk'ͣFLM<ĨXFthKd粛zW5 8/FM9.|F\XH>5-S-[>sSkw^4iB;w&~k: Sc1S#oݺca-06lP._~En .L/-=:Oij9n"1FQxloH|˻ 䣎'6P.jh#6 XSs{2:Xw<|V Xes ~#Ϡ^Annaw'AgLQF8矇ϊH?0T8+4%g^AM˞N<+py-}kttc|]O L". lNeq4iexd:j'˗\1.jY6p:2"8,b`Zlq0,p0-.[6;Ξ=[䁃ώp$K.pd篎 +CԃǑe-ZhJr:f}u|p7;rrp;&3}p7v6v3`JFv,_9UNibg!P;1)FY9G:l9jhV~cy3:5u}kӀwG]>q 4*?7rVh[pVh_ky(^9Eٲ S0gkk _555`n_/׀@ xC9kk gk;ݾ^:0r|׀@րw9}t^^14` "svzbh;E^^9[y x @Cп[/84LG6<^^9B8G4kk  x|sD3z!рwh0G4kk  x|sD3z!рwh0G4kk  x|sD3z!рwh0G4kk  d)W\aܹsSթW^`dx͑un6ʗ/5i$G85-0e˖ѰaèM6aÆh`о}h:ٽ^[˗/O3f̐߸q.y׮]Kk &'L7nT=/m۶ٳ%~;Zhծ]ZjE={͛uwz衇hڴi?~Eoߞ aΝL+W'|jԨt 3<#ϧoQnСٳ9n38vM?9ok /<N8ٳOV.C|k|UR/_cX8*L_~9 2D`o."EC2e nݚv%81CE]D}(PԩCL-K*ESN%e˖ /7L JqSOѤIO9VO?]~a*T-Y&رcG>|8=jӦMcL1T#,ԛ3g6c$Vti۷1W_-eݻwuptB[0E%Ӿ馛đz&;pn?뮻NFLX.C|)Rg:2)s_A",3v dĨ S?N;4qBo񆌦 .,/Rգs=Wvv+RFG5B89 cDuS[8믿^3H]X!?)<.O0=h{ƞp"RnO~ c0]>}d 4`i/a3:рuCtYaJ ;0eƴSN!\/p8  lԻwo `3܀3q N:;ڇ-s;^Juf+Z1$ };-Xʔ,JmMgun&P O|:51lqGQ9?YUvo:`Ԇ#]Vl p6jL1r44\rh"wM?b4h Xpɖlx˖-y x d`Qy x x $V55S4`NiI/׀@0a ^^9E攖rx x $bqºUq9ym;}AOkkk n l۾rGNr0mx?7=>kkkpj`nA[x x x Hݹ6*XX\,(D?L 8_P\rTT9Zz=Q4끼-XHkV-_/`d4sT! ``6}_TRM7ķUba3R:4cZvl3*\(˄HFXsTZf痘?{!ܻg7m`{ReבRiN2֧>cy8|<+SCb]FKWJ{v]h}3KV|555?tƌT*/ƇcO*BWTyΊiKωzh_L-3h!g24'WՔq05kk ^ x<׀@Ӏw9I@^^j;x5rqMWƫ)554`kR/׀@0^My8s\zՀwjy x 8 x 55WSkk i;פ^ x5`p^^9N&y x īՔq05kk ^ x<׀@@&HFسg/mܸ6_p*V(-S LeD#wM|yP|!ǻo~{{hv_ܰ_*Q8/W"`!ו'5-{t?h߾}aZLYN֎JrI4嫤ZI`Rx<3v[S'S%`6.[໩eTHO7p9.\(=g}hٹ祁o jۦu[V<~6i jۼ8Ծm+vyb˼ dxԘί-^N|N;VF|8B~klH~"7EC'-R8|rЪա{\ܹsj,Z$c'jlCJQܹӤh̸_ey v dp4elntWQEcGqYgtIH]/T0Bu>G޷['Z=K˔.Ix auTNMnFڹs7iY4GO-[&?gHM]\iF{_:i5e=e @;_~S)Tv;v 䗎r:itrTtq7zaRӦ-dtqکx)&>-tQ l!y3fΣ3VY//j +e˼M 9^0]9"tG<<6w |ķgڣo] Eunq=mXh ).|%|!|&Wc7OP)^/Q\Yo6VHطlYz &ՐӋ#i؝LM#F aDy7\3}v?hDPu6VaJG`".R5F/JԘҴՓOMq(!ƟrRhA㛠ǥ|8Z=$iWrt\( b8yKηH} "q?|$m(iQ}XMICIp8h:(<)M{Q8e'̩CK[',oq.4D؋A&Omh*UƇm~|/ih).U /y\r˗XdǢ|%G҈ŏ߷V_,{찿HE}5~~*:ϦSHdW#G#ft߁{8{J tv6XfZqFys=`>f_WqQc4Qogu-u凟}M+V$$;{@|*13>U3?p^~տooC 3gڱ|Qg8_cڱ ;;;152h좏юʭ߷_ ǃMܙʟ6/h!'] "F#B GCSP< yg%,+ϗ{}{?H|Zܕ\\d֝I^ ixڊѿPA/ &bEbpsr^f| Y1{Hl ?f=.BxǬĹ1;D9r(WB8Nů EfEvfLxf'}/oo|&E݁qLꀐFr")nr`]ׁiK@݀Tˁ$,?I,YDF>r^wv&vNՐ[Rg X;eӈ`(bz2kCJ_,X!?ow$yNC0JLdp88H 9(y$&A"~8!:$V%,*Lvp` P ?,"Y$^O\qC mȗRsѴ`^~ֆxrGQ$}?[ b8px 4# 0 #c%Abh7p޼B 㱨}(oDbIȿ{.ôU򇷅*Rd IDATz 'K?o]*UeUna0|gB~gCo޴+vnBLY9BfzbP~>+-9[n 19ppiM]C[(,]0"ex i)oZ3Ϥn胎 +?o/_._fMBn gF~7ӹsHUF#X3#Υut w<*~KD3m߾]o.]顇eÿy?;/,Y"tWNs.qThlvCG?VX!ڜ|2uԙZy IJ3;># T\!ʭсA™;w.]:Dxgz;GKAT o,Y2E?Ygܸqbtш~R_}ȍˀ>:RJ-Bw^ԙ2e =sg^N8ހmݚ<.') RRROW~?rHjڬ|nݺIY~Yg-'Ǐ<]?m߂zH>e&6 Qnq9DcIR`P+T@7~  x\ [ETRtEP6nTdRYߍ7  "2%A_`^5 ;xZ0L-\h>7bYVxOO}H^w׀5,I޺tB#֬^vhaOVnFsH_~ԧϵʃЃԛD p2Gc b rȤiH֭ȍǎ!vBjxONxvC4 F1O_q > ۑFPpmu/2ˆ,hxiժ1=Dĉ YZ:Qpţ5Q۲7oN{.ިFv{(Nw|^xŀ֘1csϡy"n7?#roي~nlnf+pzȐ/4046 0=lzw4H7ߌe⍌n`rMN=4HP.f8ŮfĺKabq/apG_w1֣49i-{A@1r!/0  |[mBy@4E$/qmcNǒu k`,T2ezl<`o>LxfϞ)Y)mۜ :o+xtVGlv9! 8;ҨR/Vjk#]͚i䁸7oq]CJJ Eñ'q!\iз9Fn)QF:vl?#tO-e6 =}4:Hҳd߹s7] 9Njwh;§-@XOK1g@dÆ rGФMDzk(0cW8;;@ ܛrq]av5=w*FfP۪zY!Ai򑓋{ _ӦM#~UTQS9Ә9A>O=9,CL͍좯ݼ¡Y-#Ŵ ؁}Pa#%%ȏ(u~R6cnAa q|SPF '.?h(xAm_L/_&Fzbsaj%'N;K8ch#g <#zkiy?3ÉERڵE~lUxp~H~yy vǤ6 Q)0>0.]<1'p=z?lȒйsg*gt-ha BPzq/~ƸFG!d\!q l0(Te@츱,xG 6eeZ¡cqmF13N.q'D /$/ ˽ׯ_?qxJm`Rw oL_v-y0 [ΝM?h >Z~ ~`(B։7>7U_ o-gNGɴ6Yfj!lGe Ԗࣿh x#:/I糪Y-?^;}W }~zŃVT,z_a}P J{K`DpP̫jʚA 2y*+Ju5k@_}18nl/1 d<5`LfϞNO A\)o.0&LU#: 4v= F~&7ę*ocAiE &l*(o[Q~8@7{9BZI$qǵzJɍ;F>W^%)T%22A@/Bt:x܏:у47Ģbߌ3fԩkFa}hR/PFq>`Ρ<}l}ƍCߖ%"?xԿ湤ӎŋaF:qw@ee(Hg^~nnsP8Dx=OEoVy=/Ic !@[i^cW+hh*?N;8'N?tsu(#@ȼa$boiluBnR6C$jptRRR( Eԕ_{уCi;Fun@g#ݗ`r#V`s Jm2\D&^uy;Hc/zqЂ: {;Hǻ Lٸw4XQ+HA"*35y#4#՜ ~]7#4kyVG$n~ lJx]a&r~CUVP{<AA? 4%xa8zw}iTށEɮN;j&"kɪMk< +hyPXF F$I k0l\.}[>8V5 XZBB[Ȑ~oK?pzN/Ǎs g0= =ءQD,'cu3C?37=숒f[aw]vx@!K qɶ0AL~<~!5 "s'sd"7bi'fXs@T{ $$PBS`ΆoPc 6kZ^~4>gUo6kߛ!؎n" {8ǡ1@Z hyRb@~6MI WzhP>DAƒ!տose`Bc4'k!_XZ@'Z33>z9+p yh#@}V3Gy{_\1 \=.F2ky:t8;vX8;fh^/_:@Y]s{eYN`Gc6~9ME Z&n,Jy( NHbT_LAe;;NvK?#_T,=^;^~}?|Zy/bzb+s<gQvq|5^wt kFuC| io8MpuGFe?Nu@pL7r(8?BJKY` r% Y"{}{w|O'E: d4-1en#=Ś^hDi8:|fZQbQlAѦW9`A_l׭O@'E! &6j`>!`cD RsZY}cj3XLؠ͈4Qj˚gv- }C9 Abm3-ͥQ'ikjW'Ni6UV/*ȷڄK?wmVeXb5.xxrF`Fcz>} IDATL-.>sjS*m;DIOF5E+ 4uOBb?hNE Sm#^ƾtŔpםJv fĦoիWzD"ѥ!9V9^~U;%blOji)2#`ŠȢot~E]|ʖ/nڐVDj1JybC>dFñ14K iq`%J8eT).(Np>7o>1C Nt@t%F=6(!GUI%K8,ItM[҇K;U6 8CBR(?U-`<|Qjgd8-^5_`1пϑC?2;Ca[Ҡ)TQB'Y]"1d Ij^<VwnLA;!>i[ ["?^#MϼC5Á 5ze hykGW?〮_10м0tn6>L{U9)bJJ.JNKk`H)B^=S g6(SFEkp+nZ*/s֨J"!A߄d'10^ßCC^Sg23/ۿv8P$m鿑͍%m#0'a{u!ܨ¤XYI=9Aף >ߕH(BI$B_cӃSN@Sp ;k쌃^^ai{VL@ ,h C?򳼣w6%CdjEan\9p?C}WLfn -3(2Ē4ith:HZ&⏪-֠\<@Gy s@ʅG!I8d*Ǒ"fV5גGk5Dn=O|4{A/" + n:4l nX My+m=m$ļ3oiic1,G @%uoM-OQ~990>c ? ;""@,dåhBAN(2ȒkPr/60xpX&1^ iÔܲʺPe(BP);|Sۆs Cá{h9#Wk]4m>7+ *,Bozq`7v{cʦPQ.! nev:׶(I-XҶSh_к:wtNogE4MRHpo9kqpY<!{2 @c@ BLX?V|. gL}xuϑڵkSUU$@hG!~1u^BDJE._\?H/zfGAZwz>!S:CP*wJ SZ / ;j0n:<gyf͚E6lzz O=TnzT\W= "<+w ?6o$|^}͵a̫e24vK@Ѐ#t2?E QJС#.\*e\GUW^i9_b RE9g+B'N5kVSr)%%.yq>; kKf';à}@,Aϗm[abD>1˵V8@j##JC٦4T-`le{CtԥKjܸ15jԈʔ)C+V_>Cj}҉#!|>/ \&Dc)$i&ڥ-^&L@K>uE95)'fҕ/ *FU`:n>^xy/T/쪞U(c?qڴit֙ӎ;p+aٲߏ?NW1~7Tx,ѿRF_f7+ސvs@h:Vl? އq6{s1@sl `(PXaG)Ftq^ڴ>Q߅^H)>dPۨKSY̳Φ~,YB~: xUz"d&т2CPyrmXve{?xKw^7 ?xF˰<Δ- #qIuQiQMn1ށJߙ`H#uԉxoo6!p ^'d/UP=\TRPo1!k6?pY+^E? 3boEfeGMM(aS\eDKOgQŊe:9p@Zj\*U,0rD! #GSNFGN;MQ4p֛tR裏iϞ. ¯ p='M$k`lٲ4uT*U4̽C>:Y=[X ߴ:Ӟm(~`ڣ V0*')z4? d~Ufe PB("VAbLUo*vC#`AlܸtSm;hΜ9ԫ23y'鮻W_}EϝO7:t(}wt-VѠB\˜L[bw{(c(%JH |i%TH12e,Y0* `$?*<80DV%B2;֭MēZS*UD(JlL?ad^A}dy=P%?_G".ݻw-m练Գg-%u0u4 3{ej',Ioz*aAMRVyڋYX[nzMYXi7΢7!8mN{a|FD7چHCB$sOG3fХװD8c C\k1<$k.*Ɓ*\DP1#L͚:ek?#+چ=H X~p&we*^ \|8#"Cի ;bΜ{yIGG5A1lJl3 0/Ab,_Z..7[F#G~Kt Lǎ8@OR[_"R4F:tैGC=;م(Of'N>dλhcDW^QOQӉ:#FTo۶U'|Bw|6M8!_u8W<#w$ @;2N#AV?ϕGx֣|# Qj;K6l9@i T *TtiI9SRE J8,927o^k׮: \֭y~A*T{q|A@\w-8<)U=y$ڇןv-ta_|Qh?}oCƑcQY[A-qҡ2a$?l]ԺM[j׮=Q"߱Sp}d ^vZ53m:3mޔ;'¿v8RS < O׼ysNT\!#VԎJB#/dgg<@?t{gszKD-F؄1QDQieSZ@m@ A; 4Cp~ 81+Pld>>QcK/ lrq~.}=bkIDycu9sWL"(nV7op9_#Tzw! 9"X=ˬ?Ox5@rԥ-".ZAc70net8|pQ?>Id( av uBT"EX"g85 ƨVަGPgTq𯼡Mgg<#|-[jE#x$. ,CBg:9+QL|%lf2/vbz8`˔t)6`M^oҸlJ&3ٞcB`U9sRDk5+ʵD& :GcVi0a'_~ QzALO>Q<ݼe#)).p^EZSOSƍ~ƒf+Lɿ$Nߓ?yAN0 Dxr(++> iN'ɿ&v~1Eo߱e )+|}tO2zXXk,{ ?+ė_vӰ PxSS_sE 6wWAк1>e UR# ȑp|&I#v +lA !C.t(ezAjEGn ʚ61u%ԻwoҋN~))z Lޕ>c:,/⯗(=hXԧJ"4_45#M#ٳ'}GG%i0;~nYfJ5Xcm`uᕥ[u_[7yUVHVյ KUiy-DqPal! 1Bf͖P_]ڻv÷h8L΢j.bdͼ6qf1BQ s'JӬGr(mp=̳0uRqlѢUf4V]OxX `x՚l΋ri ϛu>|(vz.蘘o/Ƹ"1nfdFCV9l%ЗP+p2n̛7Ox# vzԿ!` A,_e182mtjr15熂56A9# J,3UPѪ]YM}+{/xH@>NQ*\* LfFrg?WX%׺uW?I~ ruy!N.~ ׬Uʤu;xN7_gkbG̚5q؊տpm~tI1@|D? ~i#n)g'r}"^]<*Q_\ Gh`!  Hp&+GTX0i[\ T6 /' ԌD|FvD5^-.}T$D ^CP2?co9 k)cuc#+S ߔ he~vD=KmN._`Ih" IDAToѿܩY]2W&F!LsBq2 ip3Rd BrMLN« ribl¿mFZQÿ\Hߪwdǣ JTLW.&vp{gC6A(u0ʼnD+8%l[Ğ4!\ʘƑo _#63<{vhǵO# oĨ"?[8Q?ocAc6.Hge f޵Od'MЯBB - Hқ ZQTе.ow-ZQPDEDT"DtRIH%s|νx̝9s9wn7VK_["1m o1ꭠj*ʬuU@#A7>PS,>_PZ`D۔ӋɚG|W߄1}i7Q(P'?uͤG迮M]kx9oQ)Q}н۠SDZc0!اzM0> VLb3"ye3 %)9~H[ -*bFGP>Z[;L|ɼ;%ƺ1m=xuBNU)+Ly1іyp5s9okw k]EtX?䶤 ]:_6$o2nDd`",OAI|ėvV1$;bR1el%:&'5'I¿}M9~㘼xgi-gNx *sH~4v("|hq.}Q0|ӭwqc t_Q>B$g rxQ&u[x<|^O W@ZːoZoqe{cFїkk<ZeJ{ۮ!wǚ:Y` 8n <\܉'{Fn5K8jV[(OUVM qwF e+ˠ[4q=;'^6bOD$cMάg?<0'\λ:UOoH?Є <=>o*L 5Ba0)DbuR**? :[ ۶ns_'GZ|bhRgFLyEޠXn)h',ՖR 6!S}K5q6~tV1gI\~úЄWV\ʎ?Hu:?*MM*F1d77 % g:Ċ@طo[+?#ߪ.J5F<ʛV ; \U8y!~|HpZг_/JٚUEG}5I}2exךl1J=C@ ࿚BH(0c.> # OxQL(_'4mH?`u6uT1BA>szk!mtZ/үmज<:Hr+h^_#Or]0/s+oW jt$lGYA:cD3*y FU 5g( / N_rAby<4V~[\Q & Sj\MP3"Xi]sH$/--a P}[:wN}F XE+j+Yp (^ />j]聆vlS;#JiFFP XuZ5\\GAN[;x}N%[[MI/-W^)<_ů{y g$xK)J/ǣ2=&x d=Y2¨-kͲM+2] flNm P*%3v{Qy*ONiΔX|BH(x XEו煑@v#V)~ s|eLa0\gVNyۍ0ϧH\rny>G {=^S|VL~"$''R/ܠ-ԧϾb{47% KYle˒Tyui>_>U^Pn@R]w˺?u]}ON\IOҗ3hB' " V0ȡ4xP+:h Y Uf--GSw"8qVb2~izhG*L_}[&>5:2 rAœE_Ek_c_c#X[~?? ȎۜD62S_U}s_*lf^K/:< }.`p&1}?Vy/?׏N=Gi,3d+/(\B&KvOژt)EcO<z $SNNV{zĆS= /8t®g2951 wTAKD,z7KY# 4_}d z6If|h4o 1UŶyzUlWOؕҶqA:^uz/C[KfF˿ U}lHxw鋴}h%SXuZBuC0]ȷ\#rP(C-QM!˂E Jyw]tN[n>0bĖX@ä:85,\xBGbl(O+7t8 c9=l5bx 9nHuMtn2ư~N i]F.j:mҔiXK!_6"v].L͸b\ zǮfzn6|<"{<3m ea",XԊ\8|ˡo96̞3?,YҎX B. ! $z݊Fm#:΃/؎-[n^ >S)<>ǰ(\]dI6"+9%[U2v^K>}zc9>|A@ohDž/|E̯o?#Wo`<`.)[n)S#6s_6+yE̞la^U^c+ĕ^zE FGvpxeּrjõl*yc)o N>!R!W7!- ;>L:gn..Z(Px'ζYYMaG|VMTWmPqvl\MX `v Ԣ-8;k],g " X |@׷Gyʘd`3I&+ƠǽҫpTbpY!le:M3HN$hJ`w-m(cԁʰ_6Jyvu*C#ke1")_ASgR!d@HBrQe$WzFtzkPH^rl6^2m I⊘HG`c6"+/H摝KzF1`<yj -;Q8rLۋ2ب)I>$B1abuLxc Y"_`VbRae\!mr:ttA9ضzmT YD<FbmS=mг=t}9ZEheB,Jۃn _el*X2+u$c;6ښi㴨+/җ$J]YgPr#ȕY017Ff"\QP[ǀиV i.ŋUV4X5P}7K>bH⊨`5g~~UZa 4Od 5Yz,qF~ܔtȡ֦2+P5asd[b[ r/4#D W߁ΨZ>\n26$KnVecUovu%QQ\ـW=̟;갰.;WX_oz")1sE>\LcЄmU*jTjh䟶l5iqXh"(2gdX2EL՗WY p˵ST82* -r >%0'ޏh0?`s*2q7Lfs+?P╂K^Giy|oo2 m0hp{b )p,@=6I^,|3Mg^dYss筊m+ xIaI;)` YcD鐔1zQNwv/VmTG*/6 t 3BY>@K,r%}P6w:)f2KP|qYygYWثDĬ+{ }i9Cu?d3zukX9JJ(I@`/6NQ'հp dž~X%9.ǿ3<;òeK:щ)(Oy!="Yd0IQd4h#OB 0Kt#=2oevܩiի7H*)i?5S7t\I&<h׎L/^|v8;+C$WDċVU&M^GYάg27?<(y2SA+Vb|a_5{¬97sƩiO1<\G5a0Ayp޻ʳϿu6;uV?XogoVGfArsÌ/")Sv̻7|SpDRHUr7LZi'@W{ZK,o8d}pӁr=ЃѡCX|^rA΢S3Sj"oAºI< 3I4c 8Uj+Ѽz5S4Eʚ7V{e%x#4I}<\h]7cA~T6sfȐ*Ab7^b[tFubB%~e wtb8 3zi8bH0su$w%{󓦆U+V,uDMscS>c{$/KE~-lGn)2<^&O93< W䷇/iZ!LlR2eS`X6KKz C!@%2EjZ> |ZkmA|Sʌo+"veBO%m;J|;b(NI%dh\EW%)vlާ\赽e4i?M۬ОR>rh:Rá{6,(5E 燓zL8#TT(ypѥWYs_LSXr%py }j'A_4b>@mSzЎ 1HU)lՐpXgE8xsuV. o9#m:pB+3^ӭ79~ʛfK1N)E9RxYP2Amނ\Dm# qyc3G5lī҈Έ`05[-!G?q?\8;ݴ\%m>mmRSmNyK?*^Ra)&OO29}ٰa%?c27B SEvm0[W0vzOy?{G•W1L9/X0w]Y?q[HXW@B/s?zQ ;[rZXPKGZ*Nu|`<:#J&H^ Bjog[TwY_.f&\x?6姀pFswߣӷ/JVAϔ"~D\3CL9wٗEc0<ۀ0r?eǵ~f^a튆WEge*ck&e sœNx3əo$!Ka m]4H}1Ɗ?kc0 )/|ֲSXaaFҽđOk;}G*7H|ż5QZ~]⋖ Ϲ~:*#rqʮSsTQf6U.H.>[>B"O?`o<5|}0'7:xo }G|9 DgWwG=]WS3 weߞ C{[xg([ K~[n>(ϲ4 R);q,{)6j*AUIT)ou4J4;MT W:WlA< "BіծQؐe RVIhA2.r '*Ku?gͲIB7frT!߶Y1gR[sgx6V3[u#gv<8~l<]51^pǫq_A6c@[.8o[‘XRF<3";Ј[?RE>6μQT>I!?E5 $l}Dl޳%vc&)`3sw\]tQb~ܸqr^Re̼VI*ns} 3G,6tj?vۺ8-\l9%9@V)e!I{ON`\eN}DhM(#ִ'O?Y2CFV2! i˶FUNzmXBcXdfGϞ/YkN#1P0׋ɸ,)P;f<`G(a4β1r+/W]]Ok5Nm 7cw< QQ7'äzH9`y9 kH1b86(*z})q +Mo`|:Zs&19W>1^!O 2\mw.]xx@i*\kt(S=l/S/;mTu\2djX!tlܨ+Mk-/;/TxHWZ՝Z3/V Zmsu"BfLQ=9F '} *c%db1㰍[stӂhCf&o4txءiѸ誫 t'q׍K i6JнxMD1_\i4>(C_.S"Ea+S?Mٌ/[-KW˂ƬdgYg+d_. pIݬT jvrj6RAJ@*io Ĩ82p_x,l b/'T-z y0O#3+rعڥBd%[6(Ow]X1"]3Q6fm NSyzޞS䕕8(k!c\Y,^_#jSrx$ɓUUd3}R7%K]$;0ЛܷqD# c!F]QE+r_NYP`M#&˘4,lPQ6딼?-Xf-G]yP\/$UN,Wdr ]^.8!+ƛﹼ*c}Cˢ|<{*oq 1/XC>ƫc)x+0A tSX;qȬL*g}W \lG 4(dXeeUyzdA&NቯN罾,kN5kXbWY/ g2E|WmV3\͜սC"ƤBl'K:[\xG}-]EI}^@rChy ?plkyl#=b'|ᅉFP>1e0(0 ?%ϫ s?OԓE^x1QBwuh3A~@G4(NWVX\j0\*ҧ_ӷzGk&^-,3,WAysgC-"pآa<X O_w-aDžxXLs>澮LtR_> |nLQB8;rQ_˖- A(fb3hq!?֕m&_72acs68VcsӞ+Wt2w0hkki/dkyKļ^_5>NvMMìSô'cٛJٿ9U^LH{e #GD`PleW֐h3o%V}`„~\~ݡ(l&%\+šu`/zO ]]f +!A|5mV(Ǣ4fyºHqeb+=+`DV#qf G/92ڵMa5Z=I'Di&o1,HCL6LQZ긃 yf <틃'QՙͪoI4(|1EsTjNV6`Q Z݄"VuO}g~6 Klkg\DJTi^[ =G/ifv5PLnַo ,ȃz9VuLr%O߮da'mDF9W-c' ~m'Tޟ.7fHD+O h7^@[_-_ۋL<#U#aА z,uHF:qGukcr\SQhFq"Y#vR_=0hK3[LTLٜt)??1@._HWUFgtKW:f^}HH{-;acY-gYZ+C/}ar|Hr@<8/OJ~@߳PKi@+%V upZ+]S47CQ}cG$#B]-dt~~IUV_ 3M'_nC@F?TuŅ-JHvz~f}`h$D)x =smdedz Pn^h&1Tn/7Qit"@ќj(Ԡτ'H0# ˮ+̕աTT;WŶ #uX\KInno>>0l̦?})=3&~bX1ʧ0,elD4E|(Iǒ*>@a^FD*^fw-{bv$-?h<7>Ԝ?wuc9,e$<!w鬺}4IYE<1!aIw:lTdv=188NIMP8"}]Ǖ\Bj7Yj+})5Fc6[=%ߏ#|?E_ c0xG-C!VnO#d?tbV_/HGU7AtJK?3/}ԙ31m)EbXgED+3`wIm0v-G z]Omw)# Twt춿:MWN7fb3$Xih1kW u"9:RܯL-j@:ft`KJnnL'WQ=q4ᫌ5?1!8pE5^Vǟf9OtįԷSs-56U^" -l)UEeЛV5KyU~Njv|KЧUe;&dgϬW5O}K8޻o#ޝ.n3י⿥[oڷTO8fBTl**m^}~u-W鵴+tb->0 iYe/Yy䉰hR,Z!4-] A=9-!ێs~$?VHϝ7?+/du`1T)sc.&\酉/!@E_\ {S%Dì{5_^A|M4~q:Rėb,5_tPq>mFaC<<,\8\Gxx |*\e.;B(l絵^-8h`>lXd|& cp -l3=w)\aXS5R@Y;~ I2yQYk>5dȠA?hGNuǮ-(4 r>촼K؉+l58Ƿ8Mco5Ϫ8`[P빦lxS䋘v/_d|M_xԳ>mcS#|HXrT#*S9T! Cgt@ioŠ6-xJo~ b3grnSFMlDd jU r|.Մ|_NΔ  DGǏ[5Dcu᫒ -|b|l[:hlхWSGAeU:W̖yF;p`b'2[4b3Zc,G^ĭ AFC:eS\AKlita^"L79/b3<;[ $L[ HQ&"fUk} ߀[՘׭ }zqaKeZ#_`(Lu]N{6Ykc+QE||lk;( ppȟj``4'⃜ .ALV1{c/|-sEN 4qWW(/eJsP@9Yg ya|Ȕ3gCO(_.ڣ#kaFcY$ ڀ/Av^w$`mTډ3<)c$4\"q_Ϋ`k x[k[弱4nl-*3s]B(7K2qO1 Z+a? %A; ǯZ~A Q" / S`9_* *TvCMXT֩ϸ$km?~el1>%Oez'? 22?T!y44 ]KI&-R l@c+LdJe?1omYO$ZL.6ƽI6ƢMZGal>g5munI/7|.,[<|vOՈCXl;kgc Q4*wϣl1T^ LVe,8ʊ^qƜ`!0|2Q2tefFF"&t&9~ѷe8f7|GHn&lD 6Y,q=M'GD,0ٍyByo4cQ!r|JLexg ܹO vg`@{>2ٓ]~e~5-sfbQMEg!OԙCن? T/<2= Z>~ċ8SP} g! oq0[h$.(DK~z]P&ƓGc66n'w;~ܟS|P`_̛9|`Z5cFdfRk[!SScư1[ݴ*]$\vj2.;fG| YzLB <#_6|=f#y\(C;C=H-퇶 2_]4|Ck%u ?HVn[T7G3'ϫϼ LzKSp#<NE&#M+hyYz2M d"Mv!d"yL`xy)>X]`Vk姏4F8 =fQkCo q1-cBO?V?fb*Ba!~ցadez-of_;25c!=X{i/(cZd"6oLⴖǂoV&.3oVÆii|$6B"-IN;ݝ˗/ͻods?e$RlWm+豩 w XE~%lpy_^n)cC/Vd-'O{A= o.7;h8qR[/mٴ;FXY$D \3ȼ%NjۉI-jŰt[0yI'5MN$NXI^\̪5Ym;ţӮKAׄHO}!ث5,9g`y5@o'`=šu e##c7 M ̈aa,o ׺cݺ=v-9cE}{ᜳ ј1G~xɥ)3q_a#>":Q?1 x [YXO=֯~vm0nvB˨c”3SM [ #a•q,cKHT t\Y jIcKjLezFx+=5_+yS^e{h֮mS_uiMkk_Vѷhڋ og;\{.΋oMM5%W& N})أp*ώʦy< \@L l,)$?wbuo2&R>a ]?f/GZw}zwu҉qm= :  no>dO2|>}&ƈLFD@:#XDO>}zbGneq(spg#G # ]'j RT Or#/@Q@P+oUTy ۪Nt}#43IA偢EN%jE}-Zd(>?z,r{/eudQLNdM\T+[Պ2koRu+a{F)骹 ػ| ;͙}?Қ&;[6ӧNƻG MW);5ٴ8EH^=z;b[n}xy6v܎aАE Ls.7/<[o |&jN~G7A|c~6&<V98wẛ C( '|Dcqqlu8}q-?KFx>,'2LJ`#qJ^g'ӎ!; ୶W_ If Cߙ2֣Â%S Mxh/iOKbP?V0]_9r'>騌Y0kF|˭3T;2O8m$2|{ٌE^LԡF]qeҵW¸;2cFXˆ#›82p[;g gyl-e]?pzxɧ_?#z 7p} ;S'> ~_|>=|k`1`?l|u\#j|#g>%/aٞǗ"ﰳ\Iχ="Ϩ0iKluK0z{JxӞ{\t'<V\ΝxÞ{KO)Sĩa[\"Xo/,]I;戰{&N ?3%?҅CY)uH~m1 F=&vFu7Сavc%щf5H%R!aYf|&g/4%̜JO4 7քYfZٌ+3g^v|õԭ'Bs$}eKO}SN2,ma[7Q<}^83w? ̎ w呰apbl߾{K|f &h1C1Yqn[+oEGՋ?9 oXɕü1r{&Hk#NS֣?v{i\^@[77܅V"7a/ `ȱpg{0Z+(Lƪv÷2?7WPEq}n1:ˎ9DۖN"cfK*3שff̟)5:g@8B&⩌ ÖՖIDy|yuȼ-j-"[p}&.o{_I SI}[t٥Xu]_o7gΜnO~*\[#%\v /0\y_N~=ti]v5\_=Psꪫ_!7NSGO^F ["W 'Sf7?Ώy"QOaO{k5*|qpď~/Ml '8o(Ja?o_w/XG[q[Q bȬ#֭X/a{^{-^{wz@C#v?tupT g<d27{Є-[n9զ8iQv>c6+Xk<˅k&;V3 w>s0!HjX V|wո*JF4Q! vd \WYM*NM|*(hjK8ynL%:Xno}[~v_[{ O(:B$?Y^:;ο,1]_I&2ЖP4=spjꂥ_Gy8n=SE>ae_CC@e^RJrdBdlD/)ft{އAf fx%3ؿ_pcC[|SG|6 0"(86m4}ݙ) Cwe2VMMkŒWfbEa"F^xaMۏŒc=c0?+WQ#Gy ,/AU\c#"eL,b5q7#vȯZ)D^QT.Y'GH>\򎐉M|OoN? ru)xk\d, t.=x-3m1lhw '8X6=xp6ud<6o\dB]b,Hk|FVsЗFVܷO!LoC~j|3(bs,0|8m?rz`bsn)ͺdLu^Mw HD@e}tԴMӾh?:JM Q2zÁ']{D>?٩m-X Ӧ!PTM< vגW,_f (\2 _A?u|ꂗdv )4Bk&)ϲfr饩/nVQހ ĢͭVZ[<-fZbJ5<,m׭]k߉C=3QK[vwn,?cp$$#mXׄuM8þo_:wv 6t/7"5눏0cl\7<l.{?w7ny꽄J" 1=S3n A)B;"@` ffԗ]Pe_UcfXY/>9St>Zle=z1Uzᩴ1hLG HGr·h 4xO?㌰ 3F}1ԩSq P8ÍƗy}:|)^{~pw=~ & 2 HMòJ!Z6,L͏}qV4/=0g|8%>þg'Gw"d1C6cfKKⱹo1!xibr™L^//6XG2&L~n("مiNY' 7A&Z[#OƎY1eopᡇ";yO7ޞ`}_2Ih? (KV^ .v;Ns_oL~VZNO)ݤȔ3V/+)&,C-K{T[Oi]wnsYv1}Y;m5U͜T+^8tOM{D?9yѿXቂ&wg—۫7+ Qg_:3u駞1:.FJ۷ Xx'e'n%bC^&Ox GhIyokF;V'޼Qc|%/*š*uA? Lf:BoMmty yr )y S?e7&zpUYw#??1zsq9UE UKrR!2~֓ss̖LJcGY+S-qrK9԰.;ݶ3 ];\AGx&YF';4+~sMzƌ ?&>Q7Yy1 !$!u@?M#1N_eh$дʸ|{omd(g6:#oƭ>|/aukW`{8h\H?K~ra78mwo6E~ȫKݙR?kݲ~ rb{]/a*+ۚs_p];n5;Y?1^S\OLn+mNM[x2xL^V6?wLfYx~yzL>v | 婩iCMY^_WkP9_Y}7!/j<>%X,%x1e+FaYUY0_?U/Whopk11ՍLqjN2>Ew5̘y,2,]3 `ZMoq)?_p}SxY=#.=za=@ѝWtJKTG)WpVuü xa۬G⮚ROPJg IDAT^=B&k6wt[ptI/8/gFr2>TL'L;hýgF?6%?e9(ac?BK>[9:uȩ2QYTZ_mA bXg#qD #A QRNK fSyDVMQ|@`[U%]Fe{%UEe&HzE 0>ƉTxJLH *$M+mGhP4(E4z Pm|3iaִf~+Ϫ/WS=rX̣}1 Ȑ;V;v f| Fi /3R>" ~q_G=̀QAzVc7iX2Ѱ82`F}dd%E XBXeQ.vuH2!~j|Ԍw㘩w\>6U)7$?+i;^J3*h2Sz}\aw,@䲖\=_>¸'tV;fk%w%76a|'ܣk ~郈WL1 IIqË%GYo.]obexsP3خ ˆ[$Q3x]YHd#o)X {w2 >)/e*3B_wY_,# %%~vdi V$_\\j.j'o7y#Hva2ѓ(aLlgj?X-3{?)PuEa;GA]Wf[.Лg>sKC$>+-bc|WGz`U x!w{ 8x3P9A"Vr:_ P {ΠYGN j~ m޽M&c-e펻L2zr qMiLJ1QxQ- nUXwQ#,H5¯W_|)+^Xa#Fّd5aVhfdۯ?Vw(cL83ΐ\ @f$dB߯~x#Wv]xs71 }d&)(_@צ[@tGzy'9 [6į|NyGUW_wRE~aЀ}O2/JǕv}VXaVx}O~blO'(7ro8LKcy>2 lPN Oٺ7}uL>?#3M =ȍGVX|IXհ_{#ð,Hoak1:݀uMgO0,͇\"TA0?LEVh2xac2YGܼ^^ 3—iu~ M\]4a#iB||b{o];Qa5l³gУ>(8Ⱥiڛ<*">!̏| $Ţ5yW%_a5US5>^js&S>.QփF߼L|tQ~H6U|sƈwS%ZUy4 륶ף|ǟ~0o¨{{V E:~UPk'0Eu>2W(܂6n\|UG6-SmkSsg0n.A~Me#PTӆڶ%bAAv~lM|. 3(cVPl"LlV~$I#vagS`a A&zAlJ'|Z} iRGw/Cj>S>t棻Rq}' 3BFPEIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail05.png0100644 0000000 0000000 00000221662 12564151525 023137 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]`.$! ;E hUhQnPSZ9w3M$H { ;rg\yt!===]7tҤ]-߫O[_jkknrQZ{(wk2zniM\|r+Ƿ_}аZw/}DF %! z%Z$,l{ ·P {¤AzzmvC/=H2kQup؏7{C%%'s 'ɓ;H:oRs۔z-ʚ$ܻ"#{3K{;N3s:J˴ֱf_055k/N;+k+L2/ EޖқT؁Oڿ͹ ƍEeu5jD GS语[?f Lh6vaQHJM<г{ꭳ}^1㫯g#/>}z{I=|[p'X0ϱNN=v<^хY7Lڕ [aQ w1MXo,Vܝ]pw\xŕ *ݽ0m]##m~`"Է 5773]#JKKqQX[[ A{'Y3ɓ &6F9߫oEӕv:Ö%ys0j0 2* !25 ݻc:I~v6Xb% sc9(8ڢoOQ&F6ͽCxe>c Uפ Pzҩ_}lڰ&M;~Lsk)4FFaֈ)=|kbq{Sae2ǩ$D} Vз?}h7_ベ7ވJݻFFXpp lD 2\q* #nc1NXU[3O #:Yxa `yb1MD>[}ZQq1DP 8|©.4_@Lq#֮Y>xI-;z q3lH,exA}ӸS&v II-Ėcs Ҿ:pc}l6= Úd.Ü`^'q]5e,עugz77oώ_P^Z"dLJ`iٹĈTR}>$Ҍh-7y9 iPP&#xtS:r!s3YOA_r\.#|RR㦛fcӦM%\kj=MuCCQZ^"E $Iz!-+WH(I :qR[LU^G߹xcF@nAjdN&bD#O>b ͍B9:%nMR9繁` E&nw0#\\oNqK{,*$!+8x㭷Q^Yՠʁ)iNZ)Ɗw-^>[k=s)>;0j IIc;/H|\3:Yw=q`;?"0 >E%e+,?.Y {"D~~~lG]΁/Iulv *Muew,´1.5+EjJ8 Ѩ6y% ~ b񵨨;o<ISMLf3gלdg:Lu[sYY-{vy;k>4^RO+&[[чFx7-NƮǸ5GU!/rc*&[|67NJo4fT8ojJPYPPT;gqS Q_<==?pm\nj$xD5HӖeb_ 3KŬV.ÝX-WUTÀ Kt. ;Gzܱ^l.Q)dgRsgcfPNdCvDe5==Dٌ=w1FI Ys&Q4O|(O)օ4Z'33/" vbtɶOrzz2OVXZt*+*d͈`Yq)9xLׯEZF:84E~X8wEGh]rgx@O< ;\a( )]*yNy]DP kY+o*7W(177,<*l$]tۙ.?~Xlj9aUM=jP`,t?;CeA6>rR+I+cZRJb~ե|l27{wٳ8Lݱ $ɾEj9ݰhT<$X¶Յ8=slDpBB;Lu$&Vua YuZLlWTaѕt7@؈ IuxR>c*7L&⋄)uȈ4i7P/H}Jv(Tƒ-idQWK܏,)/|wG!_bΩ l4ƶJ$Uaw.Q^q A z!`rJloL, P;gQDIڜhXCӤ!'G uW]3飆HP漕s6FeF,Td>*KQalrlPB3Oa_pAH$U0AAAn<Փ_)[>ϔJ! $Wd3? gb\G!\G0 -S1}_a)ƲNUtoo Ieȯ%\~IԿ0(w¨b ÀAp )p[l_Hc`RzMmXi#n W~Axg uⰊTDZ4Q5z{:Fvm4o_xz;tst,m߶V@8v䐈5z-kֻnqOmiİ 6H yv6Ub;{6H;_+em(96X;5Bs$TrjҊJPA^ub۠">$*$11Dzנ6+UFlnlb8y,DoM2e f_PRlR }̜Ƥm%|^9'2\Qf$ٙ`?)(']}8G<6 I*g|T^ZJ= u"^Wj^ Ι|H<8ҷ84?\Ma07'Rx7PPZAvfӕ: 2SBND`@,['-78GR`i\$Q1ܛ^BVNˎ.E'&) 'kGHLuU颢uī!>M o7Rx\hJh>0 .S5<9qB){[n++)dx r@'?RzFoEecˎ8]+kKǑ ih$z{ }JZD.$Yc8$b\Y+.)m7AT*W!KJ$@~AOAc$I$e?/-,Hw\A" .0LLmx]"!-\wS^wÖH$*4JH$# zr= \;}$@*p…8;>"P@Vִ'3[$W paD >Z{%mMm7a}y|A"`ȡ}8}8v>s-PIQ!r2y}cQUD@"DHxuk{OYڶT䪤 7 Q!Æ ǒ_dtFL1BJ>}Z *8y Wc$K~ M/Xvz+{B̴\H5CЃ-;hicr:BWĘ雓f7h7j-a0氶u*; RNعL#ZR,#f0p!⍊6>;iZ FV<,\E0\j(<+@{SQ=+#ddr&I[4.u:* a0Ҩ00B%+:@ZyoHk{:X' kbf!?Vn&U.Omu%2$PVZ2ݽr[X b`2/u*0 {ъy0"baubۣ#Έ}k{e =&Gh #iRlqnޚqQLO\a+1xSiS5ul(/)-/*!:,)tkްwR/7{ut=Ν:+6!ogJ+:%H ==&QԅՕphVP C+YiZ sJf pgHL7Xew~X[l^l>ݧRtǪ0 Kz̍mϟ/~^O: 5DoM`xaƔ5Nbr "híwa05Ew\0/?jDe}f|Z@}qDf~JK1zD=<^]R] ~x8=0slxSBYY9Ryb09)3Ȗv!OoWoZY8NKڿU3Av%ǞǼzҋ7>!k7nA^akcao|294z8bPaq[B/Z⵿vw7O4e.-FkMbZ̜zߗLf&Ha[Z(c[=*t讽6~UX)p7]ZH3i-jt klZ.ney)n9Ezv!C.L)n!)9QKE(OMX:ܦEO(OBIN8z#vY`j;"4Zm"` 9nccaea[ٴm4NOyc1oOc0qs߄\Z cCxTf**in]ޣ'>o2HgU"c >/W3AHwmXkWrm|>:E5/{gMЙxRj0oX'iİ(,.Cfn1& \@k]Wΰ}p&.wuO8 R`1bzuw_OkGB\r`$UN|ۑdne"zRv;5fmn )qE*jsd穖8,zy / IDATչo^IB?QNΣQbș7#NF a@ѹ  hOS4#8v>I'42 ,T9;XEXL (IaqII+;U-L[`D K~&̙:nosHx)mC/`Ch 0s?v݊jaǩt8ɃY%Tˉrߕk'*!/pS.TT^uCF&6jHz:ᄴ<|:u/F !Ap#ի:Q< J'PBLO߈!{bXL%5׾JcLޮ6vok᧕ F SYbXǪTx]T\Sd?mq2* IeM"jKOHƩ*' s1rID#?Ê.-Δ@nj?Cq|8..-}puW!YRY^a ~XbryB)9|.!=_IB^8Ex R7gRK] ]3M(&1S}>E46 [F+::öuWUAo)wtEM[ .b7)Xdxx?y=Ow`.%wOFX\.:}׆ayES^TRRy y"'?^ Sc&~ ='B)~Dr~)RH=QݔBZ4WR3sTS42PqId$?}4xL\.cՆ.e*擩nϮM 8+S7WI*ks!dNܱCyb!.d$Ux#,6UHXfwW&&*q\JNذ4NYSێRQiΙR3gVXuW(%=!ILOnȜwES///1 $4V*`5E~yU4ZVn;ZOpUmST+:65 Hfc*Ŋ?OD He#e!B{<-͐I | #'ҰfW2 L*Ɇ)>N)ZadU@3T"wX:0+xVLEW ̞p=cEgLx+ |K77`{  ~]B.#@ih G:u[]gKP[LK=& $=1uT;/W=Ix *2$$V!9#}C2Fȍ>19=0(I#D~=]8 ȤAUtu'pߵa'5[F"KgdU_.Xѓ#1%l=q kiDR`7ǰގx{1|P bsPqUfc^X X"TwJx^)퇄ƒ)W$iJ@%{Tt6oۋ/?_19]]_<=TH53|#Y9yi0jq>TeV\N\K?cG3LM'GEeEr18&~m}/`j"'C"onQ}HZq{) YM!4Cx!<<\ǥ_l.8%%h^KMUIeus ܊Ca{"6  ({&?gj2<5ϕ&ɺ\jCQ[0s'siB+zʪ [ ; F:}>}H}z9{ObQ~ݮst9aۊ.ylc C yQ2ISJw̏N '{Kw ?~ ?Cpl`&f:/jJkp%5&_UfXvTB^uy Caz >|9s'!USK}I]hRk+Ҹ}_hh9  QСWkᯣx+%st\9ڜvJl*`1ix1꺕6ZjWOW+sBtyFpwTh>4SץVfZNv:;f9N+]*e'E`aZM 'u}l#UR[^oc;bt )l䉯@0?J&-i89 ĩL|j'mRЬCs?7+o?{0~݊zwjg[w tquFThX]*p1vא4s$+龾겍'5{EsFÇBS!95HaHR=t!uf6';[z͢,<~?l tL?uSqU^ZBUARErI2a熆ve.Ul5k%@JM̏TiZkѶ_[GjJ11)y9tm]ʾ'ÕyB?{N5Bj}XK:a33^ҳ$OǓd7WSs#x) +ӊ%_fܻoPׯ 42 Rs V@LPi'0`,n2 f[_\/!yηh(?V= q0rcd@ڌr ʼncUT;fYL,2Ѕѵ~q+%k~%6^dUGЎ=GZ-+ X@!7XBv #ILHa\@Ҽ1Rf# ;;XÄݔ Zl#;qT[m\6N;E$p~[!yUݰ[3jm5{JmNjW;'7In>OLD.3lO5?)u4j DN#}).و8.&FY;ݡ)PؠOPb-AnP+yiH_2¡)Hʬ72+Е|ICSQ9rsG =r#`̘>d 3~⩮R u/Z- TA"hS&:*_y^F_iiku0nyͬUJ$Wk/hu\E|eD!`+֪lH" t.w.H$vE>WѮ%@ET`IDD@^^Z"p#wF ƪU*VK ܹs{$@@`p.lG@K4ǟ$H::U:1@^ה$H::ܩ>C W.<Dj +Vԥm%tOH$W$Uf:AGhE Vg.NLD/25ҩ1-̋?pYZ$By*cSsˤji̴TGF\!H0ѱHOMJצufس+Ξ9nHD@" (`v 8/Z+Iwbgw7>LҧW%I$>~;ann>nn|X4m&< +AQ#bN𑓨cF &Fh\dD .*ka5s"ɏ'S\|%%%Wn٭.ߚ*ڲ0o(%fcV |t%ͺD1Ӻ%--Zf[`~\ tqilyP׮|@Kqy1~^x{`cm)mځ}̜1Uh.nfzi/y/*)CN~4-Ʉ|Dݙ9(--ן$%f;*J\)pi8yF,]%@3Θ࿏ݍdMLHIĮ}!8w>#5Vմz>Oǿ b T!Cux{yPŹг8<@MM-4U*K3sQU5}<*D%%jx&4'聘 k{zDuED ڊp 6|S}}=<{Ȩx:.kף{ErJLY* E>YaH5"|)`~GG\9 iHN IH@jF6F   / 0.>Qܜ={tӂXcTC̱ Qxr9'Xڹ:? /L$3_o@U7f[NHɔIֻ8"{WTcPLTXx`sMQD IDf~r\Tu0RѸ5i?q\8eJ#߉gq]gIk봷FNnl܎.n&GTw!9CH;wƑ3c͘~s˂i†[Q^!+NL;viJJ:< pb1 A9W-WL52*'€|RR}X6e*iBGAc4h}M]"O3$?xH%u&{#$Pՙ%8-k&p,_ Ĝw<{' ˤ 4aGqA/E1rf{kD0b3B,͌%^l [k+%_Ëedb",*XpF i:t†{`/} =(ßb|32IJV˷̝o Ko~!N%?pbziBfɕ\qq)a2dZTyLsD0?_zz1=Pm FsמC*?8霙(z [;f+}Q[UcF5//yk.2OXtĨ}I7QNu@JVLMZ@eG!\.B **QRV{[z}A!3y1t͟ jR}J̢>)w[V&u  !G)ZerwSI1d$F^戥&.ijq5A֘Ic&#zz#gEl7V.\9.Oe]a ]NћLV#lL>{Tʻz6c~\=̘ A qH?|ZtU{Pz 鋿{CȁWb*0GN iPNum~xy!~SE' H=f)H5qirCM%@Oi}ٗĄg0L,-7¹؇\dC %O`ݘ؞'[7wL8S' ol8794IcGWo_)VVmt{9v%]k;,M$6>426&WqB#BC9I[)tf0+Zlk;bhkq:Oo-#C _dz辅:uCxV̶OÃ0s❏~ J>lpi7 M]Fe6 Iu9}_4T lRAxS IDATdEtVXyۛ\="fL#&o)Ǝ .Nܯ7VuyR@ 6+-@?x|\3 ]knn*)sl K>WOz&t8̙̚6A}Tؖ$i;fs 9?9G0:]!6^k:8š!jE@͹+d.irK%&Mƌf юu@PK618_cBP/U8@1zawQ oyw\Q-9u H>Ccuoqxts )Zn6c?T=B!S9P$R0sbR:9,C*~ۉN#'DY10 &~:P] z(S\/B3 8k*aT+گ*U1uPLxT`&L8\UCXMɮ\ H *;5>'Q%1(W}mX@:cFvCTUߗK`I՟`GN1lڟoq?kÆPy :#~ڮ=6s316>yY-)Q11W:\x ?L)0vcWX~9Xsf,+/SKV5VW7f9Tl96]K9ٚX:jL&k4Nc[Kϥ׸M'\ ]-UDV+Qp 15yHL0gs̎< ɓ'}=uT4y t~څ^mX 0c{GtJmm-qZSV22D@"й&^cǎaҥZ\H:AÇٳ(((@޽`kAx101cO%P;o##UGO絇c3r1?Ey"5#?7֚-'CbjQ+F@w,6}=e^t#=l6!=0@u񿟷D1Ӵ}Um09 YҀFG">M!XTQً6Óz)0ߑV~~>6nؠff\iժUUEo'?]?E&7zhClW_XX>ClݺldիqgΜ)ohh(x D%~/,325ߗ_~)23xl޼̚5kK_eQ^^.HL8Q{HHH /''s6m>8?z1/+DL̬"L}aB OL~^s!O݅@aq`~{FS;'l܂bf72̘} X8ck3gY,8;Xc;~ى` $a#8y.?s(S$+Eo҈XΒnYG/7÷#zivE4k֬$x .$a|oQ䧟~LC, :99 ;f0oС"Q4Ժό g}Saa!Oqo3XxvjP$///?Hc&*R"S5jȌ駟3?f̌333L>E6)![%,{d&;oFv6"ұ&M%G$YEHo.Gfɚ~;!Ю HV4 Tq'ZTk׊t//SBeUnj dس|9孷ފ Z?InnO:[WV|r/8CjkiY%kHĜ ,U%ISF>t% W㶘R3N!Ю*o Jh"o8s +^}U᭷/)ﱺɌ틚RoUXfFFF*5}QrQ|u2LPaIOOU/MPA5ϋ}1}s8z&#m_<]U6;IBbIu//>k`6*3[Mt<*-,q݄ݍ3&:\SI do%N}D N3kXYYD~a,\I]6/4)̉KYcj$;*=F"B:DN?V*oRNi8WsۑtYefr[ YY{woLyekY׾rX8Rc;!I*Uq~x(TV^)lD$= yuhWX!Ǔ%vp0M,++K+ԩSj"W{|a,Īի:sss|B]߶m.eXef&;s&:rHLa j1) ĈTz__WWAFvrfdG&Vm~GpDLc3;hv$QZY֬orļ&Hgɶ:⓲0/$W73J؆Ť$aV%u\:dK-[>E09aѣ~n݄8D$#0Pewtd*Ϙ1l3l ʡ+TRR",O!mjVaa60aXCKg:le!'m2c(;NX;N9܃I WSHL1\/{_RBw4,E~lI#[7+f/F,EOPg{T㟶>~-BoPOOIg/h9>iP:.W]fh~fl,)p Ҙ}#v@$3%vUQؖlki„ 7o9>ފ+DX|sNرCx9RHa'O?S)f.6/MUJ# //&ٰ^XP" ^yZ"  ڿrE "d5#H.dFH}tnD@"p 3KH$]6w)(  RD3 `gJ@ `*+H:v$(  RD3 `gJ@ `*+H:v$(  RD3 `gJ@ `*+H:v$( g̘===xzz6{'8=..I>1n8}}}9r$nNKKK/C}݇iӦ̟?x+Vg̙3yXXXX㏿Z[[kˆ*|زeP0x`~26l777ѿ?GEpp迥%,Y_رc2NuKy{ lq6/G"ߓ)D@wwN+{Bhrѵ#/~TUU絇pd 8@w,6}=y^t#=l6!=M!x8q.F9o Dy7d~s8qDz7AK/_oFdرciѣGoRN1gJv28!J:Kh]Ѽ[N^ >~H;踿xrjN/wAVv:aխ]CxλZ>㮡>M~4ڬU#Zf-}vLh]ű|os?: -Áʺtj׌SC1{peOR͚ oY'_6[9dG) sR:ә>d}̙Dh{jˎo>[Ы~Ox4nXнȯAؑw"gI7 )0SO=%NhԩԡCe;#y\p`d7{l3Zf0"QGEwm~V8x"?~-o4tPIh…4~xG8_?,X  ㏗,8͛#(a5; wz ^xL?#c&4~SsN؃vcSCPcǙs~}riLNI]FMMs1kv4vL)>ѓ . mѩ;b,~Q)c_OCedњ>nI7ߟߒN:8ˉS҂EE&pECAFG'ޛ< ש?(Tֻ(jM7 $N /f͚Ev+~-!2~w}iȐ!tgPq;c;ZjѤI?v_u®6:ӂUV믿vwWPϞ=EM :%BzJ^wk-S[-FipD0[d9-]jתS.2[Ҍ8C8\?›_dJ 7<0 kP;4a.^Fi'Ns ]x*C:>_qc&ˌQN @LoF~VǻťmitE"##"nrc4nf͚Qݣ>*?8N:,},t74X+Vw1\T^]M61KW[aZ'J$S8?I4mTO.q9n[L_8l׉Ge-YkJg5Os5ԪYБt폽K(]#PZ5Q-X>݌ʵB8&֓[L;LwPjiK6n,z~c{44nm JvBhլfG 6W!V(ؤI۹sRF^ IDATcD'p<>{L_1z?!p==$Gy61?lٲ%]yt>s@O9ٰf||p>[|x$q3߰VQu#?8L?yf ԙ bMl`ڊQ G|1%'FeԐ7KIuD,C"^'i@L{$Skw^zks= ~iNo~mTr-{-d~X ,ݺuOO>ڵkӝw)kÇ/Sb/}ߚ5;uu$Qvm5`4)튧eZu4Lc| ZǶMely1Okߛ#~kFnnvrXݎ<}CP=Z-µ(ZE6L1kӦ m62"ĔG?7BQOu@"` SaX9 g'H*U|8 ʣHdhT(n^Gcg&Y֕iҢ`XЭcs~->~2Ivy۫yp:IS}(k(LjVvBvh8p.pĥ Z7ΏّYO/~"{ȴ4N/ldҵN,G:vHL"8p"<߿ofڮ];b47o}3}aq|_/H<)zv!'FEx7cܨh=Qqq?gЮuc:wS7f,A#ׁc68~y=| xtHy_RB >z]Ռ5xbn&&tరўNqh2bytQôq >c/>p6=Q<{ii0uqq SMj@C'qW Wm"8ۭ+\)SIy%ñ,} Xe ~Ҟr><.p1cķFK78& >hmY 8?]?q 4*WZh>6粰@heaōQ*e',,P-`ߠ]@@ 8!+X Xr[ 8]A``,0qBV@@@p~vY,`ㄬ``m+wX 8, YV   d@pY* b?6 ,,,@_SY#,,P),-L+Eu%JbKbP&X XRX 8JQA``X 8X- RTcP"X X$$V e*(,B``Ja+E5%JbKbP&X XRX 8JQA``X 8X- RTcP"X X$(xRAAAWJj۶-s14nܸZ)˜TZ5z+~A` )vZ_>KZ)S8p ͛7GO@@k- oAp]!j׮-W_}U;w.1p)Ȉi}]}F'PfMq(;{l7<3e]xppXX& ;SNƨ\=GI8Qp?/Hl ??d%"NBNE[\ 0Sz  ktPSO?&N(#Blt̜9apȑ'RjUY#c0}G됺ވi(yaZp=ȈO 0jb kѢ^q4~IGA1 iٴAV.-VfBV<ĶY3 9iru bm Çӂ bE1z޽;t׋#4٘6L瞲kO3۷)(ntcIF').tyGI:9a&[ѣdc]S6ft3[c6jPztk#mկ[3#^#:fz3LRח֫lt"YN`+W]M뮻ppX?C4SZ8K 5@1ju@l`d5Ik1:EGgy@ǚ:K W^y&"6pG8δur>5gDujאMբ@իU$A;@Ӵgg$@Isvd 4`i/a3:рuCtYaJ ;0eƴw}!\3<#x8  lu]tI'i;@ǁc]bG{}Yz a&9eԹ}3:uHo">߯hܤYԨA]]G:d8fnmeo\W8"8p9S.g[nMؽZpl8rQFpvey#,'7l1ƈSwU&  g\Yʏvcc5M0ڵ4իC``2z],C=```-`& *,5mP X XX 8RA``- _,۶@@z@>*'Xj!-Zlӷ ,r%KJ|p9:4/~n&!=X X X`}Z`.nA[.!'Xv]~bJ.N@@zU5kI`=?w;!   l(Z汯Y^N"רEժפo!')X X X`}X> zZ9RMh4fl9Y6   TƎO3O_+`aԠIsF!   l(¥&-|U!K !-6D?͜5ѝj\x%{=s:5m痟?{`ol,^As԰Qc:rkڔF}U<ȆX@@@wq,'S9[G|<"5T`iTb-/ZL?>׬^?d/```3f jY>0~6V刂ʹv+6+hL |5WK``Jg+]r@pZ*  T: X4(,,R/X XY 8JWA``\-` xV*   jsT t(k+VA```,P[J@@@ISVk׮D8Z޲W6+ky˚^п|-PUW{?> 4!@q | & 2l$)7?x7LȻBXZsc$HSZ ٥+rCyU )7+te|ҔPK[Їp9R}k][r&|"'] k"M}IAat!h>4%ٟi #D ay>CMTf zڜ9 V))DzO3YHRӔUנ9D̤ oWmHHm&Msh[WBQ{ӢDg}7q&r vaP@S]rŎL5jLۮyw饗R/AloL/}Qe]o,rMcc/܃q />BʫKZ6eQ$r$M0Y)aPǎi=#<}?d$256#FR+4`.!5@ cqecl.UVNfF\/SETFaÈn#㟯3fLH:*#7LN9tDa[u+M2Yw}w٣'c/_.鏏ݢ<;EBsL:![W{'X)us҉'C'|Mo':}Ss—_|A=,?^F-F:tiC' /ʑdxZ!<ȃ 3![!hg_&<_ƍ:YgI'L̟90JaSleSaaaJ~OY/xM崩S瞓{_2zZoU/ 蝃:BEWI ?|ʨ+E&#xWa?LR{\@G}4h‰Ir=#NT&u2Eԩch~-]r)֙AFs>H K}Օgw_p . =  t y]۴i(#-u"3(+B$m< ݻy睷{hww#8zָCLF<iJ[T) J}Zs_ ~/!|5EN__ht@DhݺLxM'_~ ~r<}X65\ KDp0TgոVX`6I kA%Kmݖ0<2.n?Gi ' -ވOj vȯ9X{<^kZsq l╼Fbu!(4wFg[ >'.\<_1 o߾7^?$WaQ1i@кQe Zb&#*Z:(Vӫ²>FU.fi1j$EJߦn%a$xeyZi9 h\)op_.Wl?-_* :תUvɁDCrsWQ(y~\1|ײݻEny9}4N>djv3rѸBS d8;k4TN㊛. Jvi'ڑh2\MwK=z>'"RxdꇥK8HGxW8564Aw sΣwyGoy`W|8ƌ#O⭷Z7.JM*"b @#iG;؊y#/ U(8Xa鯔 N:QJn;WPMʀ'  im݀X 9%"_tSB@ $栿2Ó 9jO[o%"p%ʷ%rG^*ta]y_vX`xQ_m(xYn? bߗ]_}v{PZKoבǛSE+97=2+g ࣺ?{8HzTDFSL9sHҽvBW]}8HY96b:o[."'5jԒKLDJO 7ǿG\lt9.&"q4{}ٸ$Jk̒(0?)vIG*'`'"ˇADMO䔸K`D ȿA|6@{u쟷gq{N{%3jf 5:[+^`Y$Px #S2 K?pf)\.ߥsv9[vq Va.i7@%SNqp8ۮ];~1J/xHx-L@)~p?KBNJ,]R!&`[*x>0pN&zb<^Cg[7xXP|8yS GE1̮+<-X@,4p>C‰"rL8Lncf#_K^IzWB'_~ߨQc;p2!s2&d+JAa~].]#6z* ؠ,&2_]-عsg[?w7ܥU-&`w27ohc km q;!~i6- !扸yjpl,Y$,Zv4Tj6="$.iB$o~`o_v@ >O? QEQ'kiMp,k2_xtĄΦL"QFKQb®AY(_(Ro~3is~~?/͖| )ڱ S-P0(Xf獦?&kx]K)XLEHXck\H|MGЀ&>61cxmG{ .~k1S1pZ0L `1dŚ6kFO>eE!_xAD-p>N(?_LQ J!7|К'i_0]R_p<R9Sdq<5g ,Lwun,I|(sOjȻѱ76$/f`ml[YF2csdx:L 5K!'h6-o\[I ̑Tҷu~mY>Kێy) CPD$cܗ[n5B6 ;fx<4gϞtŕWEίOaźJ[v>%ПkBZ)X#G~,ݩ"vkJqn|#h[4?ʼn\<5CLt<  [CF?9, wyGf% =ƃMpψezB7j*KH3ճ-{Ј҉_{M4.R>ox?+[D +K>maCZNc}_@~!my۲u[n>9eQ[kjZ$7F4?IE4\u/ɹ'iSPM}z;ސgY{%9 R~ҳ/ࡶ@|"o0^&>al\[ra /{3B% xq=†uޝڵkuRޙw2 X* Z[subj3jdR>Լ%Y'Yv`F؞7%!ǂ82rRW6)FNk1e4u j@c6}B0ő׆SE8D O$+@xwUob-īWJ?_ϙ3ڿwmd9R|E4?8I_eCgٕ a0)OELg_v뀫pg%ἰZNxRt-$!>>3CJaM~gV-CYHr_%v'k?he/z;vWKiάe 4k42 ͚mSͨ;q} |SyO@8UۥK2vѾm>{}&^:&.q~< Ὶ1%#Mܤn㺯eƯU_ɯ0U=7_pMwɗQ׬/=G=`NωZ3;tAy)'bJKIcE7?a.00"}iy*u#(*HF$>}` ` x/^ nܚɷ4WD Mq^I?Q<&3Կi[Sh諑K?cMDHLq/m9d4!O E@@B˘;5 =T㚏X`,Yfu'T! ]_?<0Hځ^6+˷IPɚ-rws"$cR"ZK7TILHWY̸11k$HK8=៩qCl?]2 bZ ųS-mmEK1^܌I~zUa `YJy`| i dMLI44&F.F G]v3?SsK6u-1 zo0%q\}@c!@h!d2alyWʛ%ge]Sߛ.8Vq*`Ac/k5^Lgl@;e1׆a<&LS9xi)js`mp\!ߤi4MHȓ"*2hٲF=I8B x6V],A8R5Ck[ o$#mCl1c%!S{tgkimR)KWƤbetMCiH(flKf'<"(-2,G?'/hJ7Z2Hя5 DŅIlXE,L'A Mmu&=&%Nb`YoN4k2(?14d&M ]iTsDlO7 q97.F<69ugEntP*݋2$̼_<ڇƳ5tOΐ20ԯ(DwG{H9w:-AQSYGʢ0i>/U*~<EBip;[*]`MmzS|.FrW*1%^q16TLVD_] LU S )eOI#&_c$@F871Md_1_#ө9S@Z!xjb85?׆Y$HpfF'k*T@Fv׿8@(YVWaȤ)CJHj&4G1>J"{>6BVVi',ד@ hY¿}窆?C7o3{Z_`jI}&J~EÚ~iL rI*Qە'?;pOڂ?hW/xPmZi'-H>G'U\__z#B b$Q F_¿mK:ģʕCGQh?hg/+y$X (NEFV M2!Z=䀽ʝ׏,u h_c0y|2QuLX3SDBr4 舰&e5kQjs@5WVEVC8[QN0'g&:Sͫ^|ldյW!=:_Chp #ڐJAxgr5(2A*d ?ɳNi*lPqso*Fp _U]`kA7Adf|Lp96I]ct}W6ot+?xI0c1HE[!(FyahAP&+mH_ uhk֘5@@ ΊDei8 oݡ%/ PQ+Ro(L?F@ &wxS3Aw6ύxm\u@lJwJ$"AQZ ; ld}h4gXFoTWfAtTjDj6[!?YXWde?F'qϥBW~O2;5m҄:m9U^ÍOk;VG$4 iĉx"~{hJ^ScQ $C.ҋX>KY뎻/Z~7jܨlՊۆ}Wʐ4lGͷ׷e?o찾_ ^bT-:2OYI!9s&]{kQQQM%ycm뮿v޹M&qCx;axDN5 #mذatuҸq,ׯO<8c !n¬'Yu]7~q6m}tGPϞ=mV 7nD/㔍l޼yt |BǏ7uę.\+1qݾ;+a*m]t 0-ymmagYX n}?SO+g D?~p‰'rlޥ9v׵-e|.}9L }E<0`ps+±-WwLarwK.qoРОl&Lɓ'p/D!]n3|={nSNqϛuY ;9:uiTb2;6$}J2!N twަd</}aÆIv0Ms>f͚nF}SNH?$駟:+F'~ۧo26cίk׮Sڵ髯?X:F&;} y)3eTO# zOSuo_qߗk5Ao~9 IDAT՗t;PݻwiӦ֭ ._ Ry& jK@*J6DkJ'gZVK.0AM7 E8 61JS |GPM _U#$pl}״rJ*/\@ī.fI bЕ+;:vH/"m~o^%;gD{u (6jh6S;QڟTxe1p<-,gyN>dywiܹ6kT! fh9{_~'@>{Q:syq>!-Ku|l=#Jjr! lhc4=U1\K.ǡm۶Rݻo+_S'|Ru-t'S&4}f/HNLѨB: 6xOA ӈqE8HtÍ\+bie⯢(j"~\8͈ׄLKR=z0im{:a_}0֭ϔ~6B5FSV9AR ~-s]AGd%Tl9=C2̓oJpĄ#_:;h]<~|̘1&O/<"]۶nKX3-%5N6 ;%K};OG}$3᝻{);g_ i4r?~>Z[ț^ yyCGpVf_@w>gtY)3b/1\U3*̨HS(6Cr{tmvg &^ZA*LoK壿c& qcđ:  _Aa=(}ͳ_~!y;찃1ah*+! o fGo߾<..4r ^4,(n"h& _hp|3vln( ˜c-o"d+=xbvF}pδ;,fU <$Be㯅MIvEIb<\(CK g|zcíO=8+]WrsG;?O 77K;fl5j >4V ZI('F Wra38ϭm ՁonWME3|2 |-<[ʤY_$?-h^?^8CECn[RƍiΜ99JA<8.} ?$x5y"x8x&zjnq5ko<-u J?*D<-{)oh£LzAIGP:hىźU769|dSYOM%ɵ_ +cנ|:/=t>0Ym7یkK`/ʄ4 rC"? G4# A {)DuuJ#[`٧x/)34|z!> Ɓ߰aD'_Ӡ3^dI_\93 \2F5k4:#_uDDTbI˗ Eu Xq*vJQttr5]?Wg>_E*J# s97 HK?LWZ$.Q.snJB'?0 nKcJJԺoɉl*Yr඄&z74Mٵ4hvfm7s Hҭ00!(c (r<<0x>O/M4I ˹ 8䖊cI1<3&:+bMܘ>? #<'xj՝..Q#yt+¤?&)TQ?y6u8ؠ&"ڵs!a&%Թ. lF4|UuQr JwG!lAgTa(dZ k;_`iܮD8sȡΰYk1y,՟QT*PfXk'4 3Ϡ?Zh-.;U pd%B 6b*U yu $a?d$;c.x!)o_{flŲ:&ҿ=42K_<\<`Gڏro<߹sgQFz{oX*SNhIgR3f6.^LGmv+ #>Vec${dg=,GAp~7ѳwޙ 6H K _g|s??gh` ;?ɽ%^p42hT%Ga/5xL;9wsҽtǦh2F %;@AALu83{\~3]x@J+_qó2h $.~9x]M[ MAsAXCA-oֆ!_qs i_~IC[zwwKD篩9x[>O^۶m4oC-Ĺ4 xI ׶'r$C˂WڀzExp0Ƞ36F z|Q1?@Ct$_qZ`/H [&|__֜f'YȆEy]Ka{xEXDĥ]\@`nӐ?tM>x7E.njt1J,!9 9 x;cĈp[ -&.o:wI? e|3q/F2ϳ!KfI G6m&u!穿_k٥t X\^/,Dgy[`.%vb.A~a@08aڧ7SN5{M /iR@4&a& _rsϲ3F{757mT_; p@J_ʬS8{l:H[{nKW("eJ*>sv ?vmW:C3# cn]|@g[g_kqt0<0šg y|Ǿ<G;^5e]kk@]w# ۷VP9鏵>l2AhiG1^P b$5Jrʘ:6Pn#bG 8=YC:l:4,y##F$. x}SC8>OEL_F;)>D8(lEw:M q@EL_z-U$9s)|'^;?S%xwC@Qv>l*=E{H8f&Wrxzꩼ|$˄d޽c ˹ q@?<2w\׿g^x;k'v8wp977vd<%63- 2G^]k֬YJЏk>N5q! iމ#@n{5AaD.S1VD  yM\+8]W\!SU_Y49,*UU.ȀW~~.r$1L< t*^G ,#>V?w:(=y4vL7Y#KQ'IWiD5k,G̚5Kl!;ُ< y9y'u+-|iJNX2ug"?^֟q?ҳd 28K?h]xEtرceT6vsWv\( |˨ 2pۆuX +P3fR?G4C3m?yk צJa N;zT/PAo8.A!`$8cl$T-NyYs zvFp-LYPxA G/;kSx/GB +X^ܫM_tj%.Y"~yS"ڈon`!#z(S "G%Nlڰjͳ~UG-OLLNrُfP2 ߼ 'ފ=Պ h茫2TbY" %HX<'0*q@*ވrBWX ퟛ{ Wرo yW8 rPhnocpk*l W/!olPQv?iLo+o\hi̴8 %8dy+8]ER*Àbj|}ږGTSYBqB7_pօײ5;~n"Z0wM6Nã24jҌZlM 5!|i3 *M[߈ױWCA\#'Az*Z_X/XL0BQM@Dzr#@@;ZP `dU}󊃿 ~/z iI{m-_lCqCTtU q&+"b3 GwFT2*k55숅G_Ғ^^^k4#șCM d3प9/G<:S<`Zh!UF|B\$;?c'"`FjB3~xu90T}T:ai7FZ>!TWK. t~j1h'QRHv*0DЇ2iiR)5PjYCPP(%=0AP&DͷϟpR!`'hx7UMz4)#:-uZ&OOwUTni08jB:`L]ۼ,UXhyXGdfO:2:cq:+V;MQ.[y4 Yi`N2EZt?K1L32Wdk| ڿa`za# 'נEa!/T*QO?X> ˭~ d/MTK|fخ8Z9R{61]\ h8=}幸ddI[؈BMaưzJpoh% 7O5kVSaa5hUo+րqW1YUb\'Oު35ߔwZԋ_J9%&}On_>>6vg8iKp"_*?;@ө%|eӆP>;RF ;LEU̝O9͛YXhtNIcŴ)WhXw8NЩ'Emj1%Aϙ;yy7~2>y |F-G/oO" &6@N`-@Mkv|[m`+s-,4pӆish"nY3:l8jȻ͕tFۤ~]jѬ5|8A#fTA%y'ԡ-7T*.^I+W&TVc dYө^~#Q.FbF6?ؾb]k'nt_g+U{x٩M6-玩A(_"?i 4[C˗`Ƿoֆ~0Ɍ¬I u A 4NU@_+~g 8A궐 IDAT1u@B@-`p#SPf+W.:Јs1+pG끿:]ĥMJm~L:+@F v| ϯIJbœ!(ιbr>k A6Q QEd[$Vi$7e ѦϞK,SA GZ?" >M+Boggm.Ϣ GM\PЖ?*I-7JN0@!MlAfh#$? *G/%X<k86D,LAA{U8jHqhֹɨXޔWn8@ӭx&c~*4ԫq%k˛ŅWajc4)ֻjܧHDx JSi(=o;C'DNq>V>#Q mg IIH2Ê>Wd[\ 8w"(Rl( bb5h4Mb$-hނ * @@zfv=WΙ9vwΞ=]j_+w@zmLM^\o5`L)N382olPǃ5jƔ jW" 3ǜоq^y(<|f䧺d۔dhsZ,<ml' Vc HBXR0GC8Vv2ؕ$i\YwqK%k~꼀A!/yi2q&Na'X)sZPYViG*ZGP6d2YV_+~"u~_?'8>r00Cg'/_ !Fq3ũpԙ6yL:YZn#w}#}=2,O1%,#[} ATS_5(~3?ź≞eQ%T_X/W,͛1;F$1 `v/O!q" <ϼLK͑KcItB|U6i))| Ɣ#][ㄚ_ $):i]t2p2r8qgnGpr.p4pZ'wV@*sfJx⠥߬wȓO>՚5m&/2h2>s]1-vxCWHt>,}QB"8qD^ݶ&wsr)3Ouҹ<ⳆX?2n2Sʐ|ڴirß(cUF:Hm.*s>Ou2Hwrue G-gH;nմ䗿8#ח-6BMN?ҢE< pW^._y6nXxiiܤqGy_WHE裎;)nD~~UD/Ɣ1c0W@㱄+_BfϚ&+|iKI(7slIWk352tӯ0T_}ST́zH:@?}$٠u3Wһﶋrd>ұSG9;Tb=eWf{ߏnv휔d|v;ٟW=rUWʂ0<IW_}'M5@~'RTnvժUJ曽3m`rI7b `۞T /[4UJ|)$?mW8}o_"4gnX`?ky_ CCr !j\!Yf'={lS[ٛmY7j$/6 qpC}?dJQ$5I*FRNCkBp_\iռ!Nń Ke ,bWU.5*;3Fm=`peР'2"|lb@N;I"TTc1uE/VUWF6hH}6s XoegyRj|ᇃ V6tSo}Qv># &R5j"|p$ӻw|Hs'o麓%ff K epY3kW/4i\zrUt2V|n'YJ4&M#i; 4{ ,3gLO:zkn6&c ܐ\J)*+3z(6u^\y%zӧʛo`xeKZpfm ĕC:ъAnDj4On6>^{FpגŋeĈZVtL~B F@dn>\Cۜ.1=?ˢE=./_Γr]:o'2.g^W^~֭[KpyWe„ 'RlҒ%e" WLh:u6w\v=*ĥR0{U?2Ȋ+$?OCJ/iv(h-I$vHe?!Cp?"mUM%3gQx~(Guȳ}&ʤ %WY(pH2Y3rAB~ n]IEWUY;MS1|2u,^\N:iܸq`N<%,)vHg/{Xq_4:P!Pfr,\|4y|*8㛋og <~`NRA|ᣤI&kSR\V#zY?4C*뛇)M42A*Of#^ǎuq]DC Ѽ7\˹.H0+t P}YS#)oҴ\s5^.}anl2 ".?츴1i=qnmgH>twQJBޑRٟ;x'DzŲc9.u?1^ l_v1ryD7%=I}үjd dkm/ӧ~"O<)#Lê:U6ij xAIIiy}J%^. GgI?9 i߶y |>-qᢟ%+Lc<ŕljN0gL"-ԓ\u~ک;~Q΋ 4 V #P*JB8B4 nL`O>LnY]7w O>Xm턳<&G`aYr.[U/;'9NGu99̳p^_y啸ڂ瑾d*#ȑ]QI Q-\8nԥ"Z)MCH߾F%ǍS1;L:un[om:V"_+;W,Y"=y!x=1qy%TI~uw@ꪫiӦuӟog^wR]yY䗸k&vmƼ~$)+p!B^[]4/^Ta?=(9## q unB<:00s[i}]ӣRo!!8FZ7@΀}0io\d¸ RS~FNɝ |v* |O76?3:;}BǞ{fﺦL$MpSЂRiu|%taYaFN*d\Qa ,pR;a,'t'bUr.Z+i<*ty2VM{5qYI[OGz ̯ی3x_3ۂ jq"?8na`-䀗*N>s~!is7i8"O^75KT=:a 2 2Wb,bǃ~}ˮKS#%*UL?!7wH <1IS\3xfF%p/o0N0<@Խ{=[22q4wD}ƴ-m޼v?òs(ʛyC7[ ƫL߽꫸#ˇsı)K.&OSԿlyN5gtTӖ#)Et8ezY=mnuY爷O]!Y~PH&BCռpxlOEqBw~c@.>We1QxWe谑»3O֥GG~9ڶO9i퍎6lNYA4WYP7媛*{^)^^69@x^{E~`aӓO>(^}vZCZY|gFw3(P 3ӧM!q~9g@4+8Ӗ[m^|m:uoc9Wgo )Vrǎ>#4;ܞcYy\~wv3ify'57JLzc'%_|!>{HZTi{#39,o@G+9xqL<=txO gL1oq&l6܅% ~2 2z+bh:j6wIrfK`z`qrŗȿoίB{%}D)K!c7%e]&oB\~xjoC f.)+؟j^{볐|ulx㎝qNf*jgΜ)g?i,)f2^CƇ/t+? i3]>1^s8[U&U8sB#m"~,Y|ʆYrZRy4Tل\'LqLB NuWm6l(cĻ3okQ&Xz|駟N8(7Yx=#8)CHb^ =حbbk?s+Cg} ?sq<к<.|0S{=q%m[%=h8eDnQ* IDATx~GyS׆e1!y wPs^ʳ ;E)BjXQs Lg̒¥hMϔK' bJD@PV6q,29$m[qe9?熭{׽TFNfŸzpϳ'ԔVraGiҔiѧ#gxTR~.VXm~ʤ픝xn]ב I:7Qt}γrz=JGr)Xh :Ll^p29Nl,:OҀ('+;ؼhGea^ñTD72q:KqgiM`I^յ+ #H]M϶_?JƋR>;JGvcF脈z0 o}c2P鮶GX'M!逍zwr?Q|e 2D:CW'YLg| cYW5Fگ|@ǥ03A)> DjiO/cڧAY^ u-ķYOYh16V0D=;;BGA~y~0kТّyZH r9 ʆ+Uع T4! wBc;m y􀊆5Ϻj7gc>a<cjCS<=I}0Ƃ?|/w@籄ǎW7P m%p}dA@Pyi,L/ =Vs9kB"n2A_ڄ1U9RkxaHaǂbw;ұ~9H*.8K`ڔo^1ki;KY}0[4hǺ 歓q g<1N EJ@<0AOdFلL+ ]8!+Y(:a  .uZqeA^a9P! )l>NxS'=AQ]~X)ow?6_ǁiφgxF*#EMp1˫ t1@kW8äNz4(3 q Rilb_hР~Vٙdmh($Z^11*Ў]Ep`v$+14uVڑ=[>Nŕ -,\^"parh-'ԍblL<._cP8dJO0S7V#N^>|'ɝwYf}Pev4lxl.j< ˧m CZW uد/\b+6⨟>>6X /9c -]/Vs,éfuÔ0BmP}*o!nkO7GՍ0:IQu4xBh-<+>+N<f|˘/8=g|^XʦNC〝}DŽ0>\ǷǕםV0:U=e@ otNyߢ1+"ꯔbVҺҬ &g85% KspĆU(l9!3/4/7W?]F^ʗUڶf-ZJ=.7GfsK_[|~I<k ]qO׸[|,(k&pnԯ];(xeK0iXqP HDyeB\yP7[J2HLx-O"R p 9 >ORޞj(נQCk%pjIyyi*WYybG2 vҝrç|yorh _J~;K2&k1jd9a Y*@-b{Vr]JgvγïX}xֱu7QV# Bj|65Qj}v/ϴ1ʴ31)ERd4 ]|VD`KA@>*:uﺔKt ǿ~;O65oc&Waw8}csg\yh3>_ GP-4nQ|iUձ~Q]^>Ց׽*yy:Օ痯?~ey~[?^F͟\@Ԥ#T׾<|c#|&.!}c]wŗ/eނ1:halѬ2gy怤5A'5n$h!oGͣǷ NЏy]onl uS eErP wf)o YΚ۫Ђ"AaY?մiwcJ{|W{wޢ*WX1KKƗ~$Ey垻,,o7waL@S{g@ ,^կ _Z BTyj{qB"~󭕵m3_ySO^yA]=yTF.++W忽1N6>vo8@b=zqQQW5/җ_BP1u߳c6}ɋg Qif/p(;o~.][o|Յz JIY" gl֖6"OG\yRPzoh{C\C/ '0!~ @YqMHݭeyx)/YW~C|C +hl) 0FI݌!/0pހ<h:;_xヷ rs2_0!pN-w^B&_VVXy5\CKݬܻ<3H -Bi42l֦ttp ց<pAB@Y;Tb dJZ.^y;~yI;kש#&Myªgz02+ۡ}Vd ="-… gX gX!':q o8P_ : ;C!0S~:|Ӈa龜8ٛؑYOZsJ;b-)'$rzȵʥtޥO/r&aA4;w Er ͔XqtBf$J 9x`]Mf͘.Ǐ&s;J I=ܥ]g8H~2t척pѶ bٱJGqcrh z `:ǚ}3 TXA6řBbs,Vo#jzC!OfgAz!9T<,o[[;>,H$Adl,%-A-.8!Sq9z#2 y S/yPce#qRz kR_14eq5Ѡ0Y3L9Bvq[핿Nw̙{uMVrgʂ {r7Z ޔ]u'WجBP\pqAJEX0R"-fz35Z۔BWi},!>=,VE,g.8Q+udB%/1F/o(mGʴ/j k}]e׾g_Z /A 8amF SoY=@妝0ĩ* .S\D$\0n R#͢VA≺0-[TV./u;^[o7TƎ(?B4WbF"rwȿdM1SDT?cSǭ3RiyΚmt_?Q &@tl (@!R[ ;!RX9؟S}0Xh3d||S=, ĩCqH\@}d󺄶YЦnCvRGOg1YIpD6 Y3˔Iq.72Ġ%KˌieB &MFwuBId1.9ilFMdÍ:J&M Tg(ӷTG.g͐o>5f,ꯇWvK-.aJ&-7xe]=zȺrE?KZ?3OQB,Zvx`uXFxFϊn0)%@KB;&K@恊8;!u׎b{HbNFUcHq2*Xլ]}[4BX<-Z +"E mLBy4UO-O{ȏdܘ.0ѩEǵwQ7ҟʇ ?[t,;SN:fk/dǞ ʪ/Vʔ,]n3Vz 6ҸI35"h1S9,-ψђ%䘣ʐFa,[l7<ʡ ӦM6j/p.]:E-ygko-nam'-7.i $ }mDfRZ0>r#dReR>iR!yy}[}ֱcM, V/h|Qa׿?=Kj?$%K6D75!w:gbz>@ԩ%M1WB}aҳ#ϒ,dur92y4O PdQYS'˜31ޟ^A&O˕[oV,=_b499[e F*|\rYUԈ,e^@wz"7^{0Yd]SnNF(|wƩҫ0l o@뱕tEYFA:t&ǐa) [PRk#))py LłD.r<̫:T14S]oOyQi!խ1`*TH IDAT;e75qئU p^lأx̾2 '0cǾҠNe&=v<@xlښAI䮛u'%d.Ω|Sm´qU6;d-]%69>cy-5EyӦLX^Z|^Q( cG=(^/[*?&l-_TƏ-q7A,PXiiܴY7wliּ:k9C;gB-u & 3>vAvޱgr57ɧMq͠v/أ=›)?? /sVihhperC0g/TYVf|VفP;r~{եR_Gc]wIa3rrЁDf1KȨqeulm+eӎ1zfAXZ"sO_^ttjK,=5Q}4+u\u_|,XIg}+o2R] hO]4R9| Y˕+ګ.R>7x@y& jqؗ\w{wdi,'p7N[Hw@ rc4j@V&]9 Ab$~ E bcѰR)OO 3UɄ<1xw\!+Pkob`f3nn-뮳<_(Vsl?n'C{'-;lm>eX; biy2v$,?z8y!p3' }xYc6_WxGVyc8y fzg_΋-)S͔=\VS>XbS7 { ;i.;_ls[X'"ɏuJfֲ-MFM!HХs'|zryy3[gݞv{nԃ]w,0YYxGH|l}c~VQR{*c,ZVƐ;rX+A=[̙%_._,Lq`0QrV4m*%O=kn{iwuڵד;:ӱ'T~vR @ !;a9d? y:;GYF cYsȥWIif`a tVGy6h#\}o[?o4t.;țo3rL2UZlG7tn3wH7cs2H>g}KS=Hys=S/7>JjVaݷA0zOg[5[OnG{!z_\)txԁ?{Yzmpi2e-ZD3"2zޘ}.Wi2mL[rfɴ߀AJiN`Gc9 IC3>& CFz !TX!W 粆jfLS_z]'أ֘」"Gz~ay6B~N#>s/-tɚopŗ \ϏSY_Q \M8 lC1#?~=9ԓ4o0GM~gڴm/7\ԗSO8\vŸO/ZKN&ӏ3&c60ϦǮ;c96a:oܫR8^FacZ۶ikHMB;< <`3Q$sPz}R~ >d aiYr)xUtOzk}챫4k$甩3t3C9zz2f<{KX{<`Թ bk$yoGw0'0iX)j0=CC& B[Ff-`U"jkMȢS~K pCyׯ똉Lex\m"A|5f~낳O:@)P%:g)ex>{:<F!S@A- *낵K$ǂN^ XRoZߊ?~ݻac|8t]3$N2XxS\e0yQ~gՏJb@ S)yay?˫h*H:ӀC?#$f0?UwԻhbpggbSќuYop, >}q7x_%:v=MUe]&~sZ1p2~ m#V!h?/0ѾcΛPG4h;۵ӓ\w?j8.E7据>s/"'#pRy'ி)x+{[0iU"IRi l,`1ւUh | h 9Fyx">s<3T`/Yva{Agy%T"pC""X^O;Yf7TrѕrXkX0w=A[˷?҆?ݎ;ޤ嘞[MA383?Y'o!N,#t9,(q:N^S< q pwbS}nȰ5u.8ӯ}Ecg<^fmfrj;{?3Ȧ92w7 &>~Cď[0Rʋ:p.r؁1!c#K~zJ}amT.ׄ)n~-gPWkuB]eロmCq25hH8ɹM;l$sXaCasʗ">mA ~>T=+?K)eocH_qwJț8qW < ݕ@"?9~g_Q*+Ϝ V 3"vNԮxo6he1K`ħ[ay_țPz\޴+.O4S0cvnR/9o( p }R^L2]b|@La9m7|KLMwMH-+J*WQt?uW%9ҲEs>WM؏}6IZKKN<-8]@w,kKd#mh?iY0 a6MgYJ01xU3Lc1fGI0 " U7{u%;'A\$;.?TfM$7{$!=W^+a*QW՗Sq;R o4VpϜ O&e{^X7>ߝfP^|xyr~糁|.s2q㢡Lz?Iyp|2i2/oqJHd'͞#Q, n@\r-ʏ5mJAgUe|X~htb66Y?(=LM\bYD0{^k +g%?@<_OPTp<䔟L SX9 HǪ8(pYY?D"#ɩ)/="~yQxb׿'zyzƹqY5Q>0O d3`yBS#|IsN-$jPiXelHbzD}W0[D5IϷL<|SqYq@^nqU~{tj[b7Yj_U_6\:XlT#bX-:{kWt7AB%"1Cp $+fNuC` y.)Bq嫪ש3SnKxkO> z`r]\,Ic U7vL09h~c_(8'19,=NM6>_:<$yd`}ޟQ)jjwtڲ߼Y_P+Ss ǯ1aFi43 *Dʭ(~ bVT e2 #bJG{<0ٚLIn_M?>f}VQgRPO$AoRJ~A8|R~C:Ly׺ȷ<Im 'iv䬸e~=\W6y6FY3czx?;-C1~)z tei-$s</ v[\]fG4dQ kly0e5xк?{jC} ~s^7DhrW \ZWm3]3&3TsOXBؠffNE`#Cum&4d!0dF6^֪㕌 G;.- 2*#5 X F<5);QY5 qUϹJvgysHaPuRGd zKc8.HazE05A,/m0{_z}WYGBcJ0>ۨr/w[ܗ FȄ18Ä98¡Yj$;E +mMІf0"t U.<±:P`Jѯ+ITQFIn=;+<4wx1D,A\@BɃ7^C`i5 e1YCyTca WG\n| QؚgqѵDfoqf eL[ j"7׌a.NCzgR)` xmwk#_zuC?$HjG7o5³3=Fgw?E+`iMkzjd2%J>VTc*xכ:8&|̹HމH/5mWq+_ԖŗS̟/7hxMVmu jLG|嫅ϥ޴c%>^0}2_Y\1͍_aP/ABѣS2oCsUO7fN,S/6~'){x>ʯ?,Y4_͙)ū*pM4k!7o1>J~o17[_K >>4mz:AAhc9]=%Jԯ׳vo۾tq/Dh"KuVJ2y qK\ ~vp֥~<˭G 8k&S)Rԏrեz*=ե_WvkOJ_n}^/ʌ"MC>nեz`:~9{t2c жƲնy> V[!4 Ou^/G2 | `H:uOҜrUSW_)}=/Oc/#d˗+Q|{-+_?G^)}_?~aG}xk 7RZoAWy3$My+s`ZWMWvuS]y}״~_n5/_۞뻦jq2s$8v NX3]IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail06.png0100644 0000000 0000000 00000132720 12564151525 023134 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]x] q7",w"F ԕս}uR(@)$@Bun&&w53kc]ocaX g$_ }!_M n 㯱g(_M}9~xMOP{Q-;uZ0z6|b'9=wͿ/;+ l<ުmpmF@#Ь8ozzp&@jZ*#''G=uyǣUP& \MQ5q֮_K}ztCpk%a & &Mj#9{gՠ@TY^z[}7^{})ƌ]6}* k祿Ącxc6{'㉧]5W%YKp޸()+Cii깝-l??1~DGEU.8(:wA=[`#f|7[ի 'cW&7 o gG?~][aעZ1ƛT.pQUZH1nu'?;GT=n[/k-L!"U G#2:c_5m7x+ǂyf2Jr )((-[" ^3.Ç"1i8|rR3ϿPg{F;gÒkqa԰aHFDd$V !RƎ;ch~ޞ^r|u8ݼ G uUe2~&ɵ7z0H𹧞Fo+W:~e阔ܔ~u2:UWӏ?,„&ߐk~^dTSeY{p*ɥ~-|nZ+(WVO;n²>.^ck֬󿇝=f^} zppՠ i۶q& #^NuaaTa9 Lc_$`@z՟RUnhR|4yqX#,JqR9~\H)ce0ZL定5KN?>lw_[[p- .7rȂ`[k{VΎ5kע}66x0RL~KGQxWq1fa`~Xn=ֈ|}8r*K.7[n>Q=OZoK~ q@b^!O?|}` oM$e]۶lo~L?dow}y`$'`۱n*ilʶm{,sPcvKǺ GYqX֝,捣#.2\x%1\~sEQA˓f$e ;of/g 3#J;U Zl&zb=D8<<"}ri2$!d.d_f5U"@ >..Nq%cҥ8.<15 bX-ZEAQ1ssA n!$)ݺwGbjP:cEZ37v=1#F #;rӠK +2pw4Npwpke^. ^\m6V.t}Z/ZzظHߝ?> =^=o4=Cc]$ qd~ ~w0 w}UC?+s/2MBg?|\D;ve;*Wզ8ܚȄ19@{g. sRL 1:AckQOT |Y\X瞁's.L1g4UW/-5mšT&G˧D)iIE+//us{<ÏW'+ĭ6IDKh܆dIq2Ҹ\+'KEQaބcǔ|xle(85jvjs 08I؀ lU,|Gm*ڭe`=O>v'|e\4Vo8`YjL£WΥl lr3 )ݘш:իVs\{M7@] ύb(pAW͸XmZz,Q5fppA`{U69_h}*~\K$nN6XfjԻ WL6SX瓒e-~G!ķE'>)r<)u?n"Vkcӛp|-Z<&ZF$Bp@HO"19 k/S5ѣdeo͜?< +ƵBe ;q,m$[w@ xL"t/='$0?j莋3vFoGDt#o|X%G.\\⳯hwf+-$**6? wyf[E"T%˖I_"Z_~lKrp\ef^>.Ǿ0c/> zUv7p?^<5}ItHLepͷ׵!xS;%achlhk֔֘:꿒\O/204vWjS̱8܉NH2Wge ZqNfHi">⯦,ӛz {;8ۮCꢻLߢ-q̳.rb\u̪8VdhZQsj7)kHkSF$C8APXT++ ϾxMevtl۱snL<[%P3pP JsJExj,.r\i>߇/WC~6z`=rPەz[_gM %9ѢPH.[Nr mI^ Ṿn^ w*=>иe^>kR b9Hcqל;uPv9 Yvc+WUvXw lho~(MH1儵Gj PRUKFG!l uhx1`Ǒ(4;t Wxt>t\]]ײ18Y{&WoB(U4XoSR c"$SäDkPk(} ~HTG9"^8$&t+'r|, J@(D9A";GX }.9qX*oA3ІxcZ^2-zK=?{_ADr OP Q{7ArGMyKRaBٶW婎(N-J P쌲4 lH!ӦNw}ٵC¼Ä_Fo) b.Qh6x ^ʪ͚292 ؒg}=l><KOs1Lq+](uۺkiH29fny>EEBׯ+|2w¨"ںg?_c9B>x,$z Qʏ[5gԗCWO>xmGfSejPXQFW}ٮU0줮moIցt}c:VO,Z0 ƶՌQǩc^We֬V焽 LΡoPfvp29('}<-P-` ݭJuj()NR3 <Vp½ ŕH4\vB|W-۞(Y-+wrO͔mMPXb%vn۪X"Y@ЫF1Ҹ}*I,#VyꌸlCx %>97rȪO9hy,Sڋgl8ӷB+Ï?$`.ER Q4s؄'HAk4v|\F@#8њs=fF@@Z<7F@#PVGDok4 v|OF@#8&x5&@}"h4,Qsk4@#87+`̑;[Mui24S X/w;£Mw1}՘i/OtEzv|(w:+3馗h;A'+cv$oF"'ʗLo&fyHNWK""Uwy|Ppy5f ]qsqD' +Wyɧ#v:rߎ RyQ$3v 2TeFj ŏ#/᪖9j޸:;P\R#ALϷ {ʷ%j{sFNmUK=!ݜx+슂.F k&BDZv U&p]5`zJ}HJBD񇽝-#|iP_?$f|NU/q{cp_om/r*9Y?i*'H~pD2R[puoD | _|= AH?VmжC̝9$zMHwGc#1*Rso_4}MmYI+Ckߩ;Rp}n֣@VYpov>-+zB{"},?đ-_s@/所sgNӱuwum/D>ZKֽG"nصh~C*U)J [:M/0]`@DAVs*v8:֚wZL;,zv@XOl1"z#z-(2Oe/[ }1r`pL s.Eow4/+A3ƌ _ſ.ΦJ_^F뢶{Iy)/FIB{T,]5ӯ W>$N%ѫ5Tb ٶ&Fno||4c܅B U*2YDVn!Vn GkoZa Tb1u[bK;Ź'd2əlxys[v m9a1s %0^{Q Ԓ[/7 Ue{t^;#'K/T%Jvԯw v9|}qvr ۷ض/ cG$p9hӹ] Ǝ2[vԝ'{{-;"%*ۭKG  cGVA:?^zxੇc(r[6tVaqp=[w`zs=zy!M3pl7ꬩ~#M/nt4!$^%ctwA9'농|@[4EĆJ !į2XikHlHChQ" u72Wq8:}X/AH`UD+7WdwɩM5ޑGh&@n#٥=@R;ܬ4td<+76)ija30|?b[xʳ7"[J#(),L&sl1CLl2WfDMjxMg0|ԅYi]E a1o\2- C{bEvD1)zZz\UN\O8i;c$܅H@'[Z5(f $#``dL"@6IuQ}}5p?۩ r󑓛'TW@;Ύp41UXk_g=v/ii|8Nr $ᄲ{0c)1p+CbG3W9zWxxy(6k(c3D,c7,\8Y$~c[N)3^{C6d^,י_DāRdQbr T*z|/D=ǒZY&:3(ry} i2Èi}%B4yK`h=R C`=+|,ZhF]X#ؖVvi%'}F۸@4vAmTw@iރ(`(cSS|G|K+IMW2"lਲde#:w7*f&x(9ݥ4'IKd~5A, ) hq!<ae- f$f_L`n2@Tr ;;`"EbgD|e]&b"xU0si!iN *(`,Mb@t"@oˆ2oIBf1If,fܟ_|)nȓ9>n9&{znLxdOF폤7"VvR6>|$0F20!y&&Z1 ȩK!-/줴d]|d_<a/+֋-^a)!F3dUhD։Ke[Fc!Gy_ݴMA|,oβە60QйC+x{yoŲ?VC^RѶQ~c^6P8F㘓I> 9XHK{<0W,~*j~89)`J@qTM?D,Om^8=t/YV\΂߹g4Fi~pŦeO۲ї6M2?J<}6s]KB@kxg_Ō5S[ӄ*M-q7>F(k.9e&5#G=N2}& R 1HM^CeH ;{V! qrrANAtu,ǫB/9 А_ņMw v^aI%ֆE ;؉ˇWbP6iN†1}` #Nv[<n~k#hӼ} Fw6jIBt'A8ioQ⟭;DWߑO$gV( 36d$]VvY|煽%D#%5dӺ&K 6 0 c;Q&iN0L3K2Ӓs=Əȏljҍs{WD*mW|2v_2u"?!9S-ܧ }gXaWgt!bqeGsAȓ*o<!IX44$ AU=7p46^ZwF۷m>4t}G@kǬJ9wkf&?ݖ{>Ok¿ϳ{בPn,}AM;2eC5#jD\dOV+Nϓof4Qv$H<}#Mϊ)CZ% |syVϽîG P 6G: OFE@kh&-F\D@Qchj F@#87XF@#87=xsQkylo F Vbʱ1c9@#8;駟ЪCw|V9rT~r^h4ωìԄ&P4sMaփhjB5ZSQF@#hNXM: ܜFy#`¦M}i4 ptF@#мؼF@#P kG'i4Mi4 ptF@#мؼF@#P kG'i4Mi4 ptF@#мؼF@#P kG'i4_мa]FF ʄu@N6 666U~vvv TeРA3|8}YoݺUwV1bƌֶR]~=^{5UV0ah0@յtRh۶˫X{9$$$/Ǎ7ވ9:u?CxUݬGUkO[n'LEEEj|,/:v 7܀dq*ŋ /^{mBV8aԠkѥ?%GfήkaxrTTW+3<v޿#nBذ?,ۊ#1rȁpl$mt+m2/ۂ-&WLy뫕} >.*S~[vMś=q>?~KWƝG/2^>Z}(c}xKw[[XѮ^6-k̙30mݺuI$N_! h˖-XjVX-[bΝ=z4 Ѻuko͛ȇ Ç /(;v,bbb 88X<=zPr+f;s"''G'i0ϟ+BHIKKH{뭷*^gqq1HކcfXr%:{N*/^?*`2L04Z3MFv2| $˄6B_[FcXJ^*-쇾] [̚6%Rײ7Cm ޙ 'bAOwK6cg/VeSs@c磭y+v hb(m;_6~11ұfK$v ]:s'7H(/0zpq8$&<_-7=6Wa3KC4w&x9CDU$ji^PPZ0iԺ N8++ 7n2?ճ/B*..N 9.[LB~~>>%ѱ~j Ь51zH4ycwKjaSN ?D``j{$37tPU/5ޚB~m+c?sssq]wPy6mڤnIGGG+-Voh8bh|l IGi!]FbCo0)5{#qh HW A^}h"՛#Tڧ JJ8;f_: w1F%aLzzb&n5|>KF9TH3DIdR? Vgc1iTOx%/]6$4df!Ij]{=4k0a>-MNyyyMd$C Q9$BEJ!%iHLڵ *ɑM^W_}JOK.}:4pqm)ecǎ) jٱpBڧO}̿ Ij$gKK>PӅ`1^cK{1x5ض%:Ve)4OwhI%%e*iUEF,jV>Tc=޼I#fkAa [hӿg[e^EYFl^7LSjv- }rHF}4UIcU$OhbL[yQ` Ye]zi!p p߾}Js" 9rD!BMlʧFM?JRRZF YI}U uqҏFbeyBMikBb5:YO4L嶑Ǩ>GC,'rűLSҚ&'饈dYЗG PQ6Liu7CLVf/)&73y PZxW,`dɏgʤg;4ϻM\q'j^eIsRZ5Ĺ.L,hL4 K,QHVK\U~/qMBDfϞ4&apRHP$RGG*A(Sے Y_a~Dzܮ^'5ƒB`L旒bLѽ)+A j~KP;89 yGJjFhxvpT{Ӳ! J9إ6Wۤ!4)|ԅjP5IU&y=#F$[&jȑG-dIg?! _u%m۶MqL)Ԑ8p9PG2LW݌ZS<==Ѿ}{nqܵ?iL~PH~lmu5D5 úaXjֲ1=_|gD%܍5 }uDǥbI|4[h)'L|=:U%@<֮ӷ,eӮ#Ħy@H>'vPǼFjuab޴hT$b+ ,P뜞b߮ =Oѵi(i*$I~aU<3dGV9MST;$<4}0V($5ʚc INHNt `jiL3C/OismxSWWS$ 0˕7vH oWSTJ$oTl_4˩LYNuj~Rszl!>MysW.Tŷ>r,~=F[[sڵŜgaU>޼UJT쨥O} ~Kꨵ~XzlGBqkU/Q-\W?jä:!`~[)WV\aگHSHR"դ1q;w6OTj`rKc:Z^vi'4o$BS/$IVgl?jɬF3|8"ݭIHhLw?'Ts^xѼcP?}a }t3{H21Ef Pu7'L6AO]To_o7Ѫo'Ye8vVe5qN5yXchW4NɄq}#w6 FFΤw>)ҥC@MIjq"1X,]M )WO cjMMeNLNVV?s4)s]8OAL $hi-MMd)tـllIFu5>7#F@#hhl4hu@SGj h4@}*maܦ>n?F@#):e%##-U^TPSzF@#h"]y]a;wUNh4g r٪>XEû%Rp jי4iB $%)I ^-gؐF@#Tbg jrb]6Cu;BEY۠Χh ܅&Տzwk!M,).8X>n9߸E#4eFl67qf RKm7٠O@0 P RE*k@c 9~Lۿ5cgSz`t?o޾vD)eh]NcN>uT-iQn>;껢"k4MPh4E@`}5f&fs(@4" @A@`9z @}X_t~F J=Fh/b:F@#llF@#P_41_#h6hl6RD#/님ί446CMELh ͡hꋀ&"k4MPh4E@`}5f&HA㰷k{{rJK,(.)W4-,/e"G>E@}:gŹ?c_ Wθpꄳٯl  =n3yżÏHTy?sfټ]JCX_*$n?,1>Vo܁Mw4vrпƌ,Dآ.4@AM`jLw Ɍqp0i}nS*KՏ;KH6GJHfZFsbk$e]U-Yn޲+Vm+:F#QuɇnUy/DzVnZj|}t^NIIGAA*`D]7=!>6Ǝ0je^׳K:FhtV\D9|O;?uQRqI4t1-tn?_s>j6lETtCƎooO#bi7 jR-1v`8_ﯕ \hh۵ 2ECnѻWWi+N''G Ԅ*N )ftV6e~^S]1 22pTSZNqKf* %  %lشq%\-..Avf@"yeepS_4u< Uqq6i{Ď]HM̀[(tt4z#. ]ҋWZ&+ƮT;ӧMP#77݂cJ3%}zwCT>-eJ5b)+`2g+N%%8|$C\^F8g e+%6y%ɵ *Z.2|b$&/vŕUPKI#Q8˅ȋP)u%)e>˼~-7^ bŔ"m6&R,88`\zZ_\!tJЀ2z@Z#:.J@M>Xpw*a">''\n*qP Նy ۷B /;Or4>X&l޺Gq"f4ߏx9EbusP}%CڷʿM;`ir@SшyK_|(L8 Txܣ 🎕h9hp`u8*Er_gCwpQz({/?x>{/}E[)N1( /GoW>(/88ƍ6or a1p/$_3;8!R=ްqZ!{=JE `'AuVQ%v :qDmy,|Sj V P,6ynʥCW]>U/5h/ >y*RǛ̖m&s×S7ܽ_c'1ȯb qOaRJK&TqF 7rg"?ZO_yㆩ69o԰h&IZa&@XhQbr䋏LN_~A"}"OxeS^gx9)$Xj߿,]O>AiTySaEZ<(DY]: 6抟s*Az&,.;裦Owdsfpe0qm ];EM`WjTEr6 ädROIbxhťHӋA }`&eCPϿܜ<󺝝/T\I͓Z%拯d0Lm- D׫$CJl|"# 탿jR.cbJG CF6d|DLCX d-PJyR& PIF *tqp#ydg4E2P]!SJ6 IDAT@X.jCd3=19Ub DT݌r.M  IRhH|He|7_!J,TSKK+L\FG" >A>hQmq+`!QMR8:Udlb_B#"Ύ⢰SId X((*1sPAച!לq(Z"qr|/S8IȑB?_ؾHNg[5J8M 9LQSjPss;w ˓$kԙ"Ca'DLޟ'PǺ}$NoLfدT173kmQg*UkJe%6TGX!o&yR Mw)mO4m[GLI 1 +]'kد&M ^GuvkF8 5)Ts[a">֢!P렃rDya)_iXZt^bP @V/R(U 'UxDL I5Ҭ]m :@p\ ~efeVv\hFq [(ȭW0eUr ?}2ʒg^6/3wh |$Si윢 *֘uMP1B}{[2o;AA&-pn .ݻu¤Ts9Eh.*+[9F7ϾL#ωH~ 0<%BeIgIX͌r'*k5ٳK{xӄXhhwSԜAiJX=Sձ{MKFPكK`C $2@vuq'$X$68gddV,2猁U62n}Pa7|?mm'.HBEEY{ r̎vH35_bPW€D968;y24<֍1]irzM;'S2-OV^(%jDIkn3\+eNTK/KW*sx=!'^ o6 *MJeɵPkNT $ l>:$IG &~, ,fYy^8Gyzg8u5Mp30$Bt(2ѓ9"9iдR#V}b MĦdg,:F"d4W4&{lt4FF@`#h.=hM ^#hhlFL#hd4砰 qjo)n5s[yV6'w87-OB:7-7㢇42|aJNnL#qqHOgǪӶ+~BiqRc奔0_4h4DoaھsضȾZ8ATDܵn={kh-46|_C;\OEվH/%!}u^hN]:WL9&B;y7&6hTZBNFޞCV`qQ xE#4UQ9C9[.ԩh43}BβF$\ƄTh43@p&[#V '8x>TnM:F@#8SpN2̰F$Rk*y4D]hSiV B?Ѣh:* ZO#MELh ͡h@\ A~NG}ҘuBzC8tV^;vYݸqTlmmaÆ*wi] @S@d<'k'˱|M O2 Y}W|x˼ W=Eb#洦(x{6grq?Z4g   Gy ˶GMK^ E5O.K<>a ~' cR,wcoZo~JqJlJhȾl۶ _~%nᆆVץhPRluv;C 5On8Ovvg kƪ}e=јV8:Ho~v];zv> /&s]-j' ukӦMxgl3gw߭P[[n3<ݻw1cƌ_>(/_GFFkO;cpuqHNšIl]޽{s)ST1w\DF_# 1::˖-<=?#C^K9x oߎ""""0qDΝ;#&&F^zz:dS.] ~o6p[.izAwv^4z a\+&kBzmuo4h?v 'P?["@r~{ w\Bf2$^WP,ۤR]@`x?/81u7~} z5ۑ) ֱ/& 麗dHx0zPUh y\-쇾\̳ Rx-{2{Fzm;sWaP̜:nf^ʦ iq 7إv7ᢉB;=/}>Տs,+´LkGi<YS5컿K{̒1V'@woj.gDEr`ȩ B[b۷CpQx񾋕DMRA-dBL-D[i>5]c1m|Uljd2Ԧx 筱ZӾz*n@2cjuoroi.X+充ûcÄl/$,ɂ[O-i?$5o.J~ULSIz.ڂwnM\-Kv|>jj?y*Q=`oq`(pL z6EiTI׳g*8PKH01x8P/2L_p*Ӷ^4[]^uU(..ƽ[p=zT W^yŬQ3ҟy}ZO馛ﯲ,)+V H6)4Y6v!|uԻv}A-(Hs$5(4u)$ /dhԚBTj0D;Mb6w1[ K0B#f}t/PMRFl )v5c[,>*Pk%E4NGꯇx[[Ҧ?3Iڥϗh<40$$ gRS# 4k׮5 N|سg֬Y~O?4BCC /`ԩchnh_j/Ƌ/h6aIB%YպJ}xzN|nN WA W]:m-M:O`^ʇeOF xE-W1|e~⚋(MHW篺TPBdof">׺p |a2ڙ] o1iU oYI̬Kh&TIZFs]ڽ$+PR* ~^VhEt?A*>a;T7h˛5of#tVRW(m? nV~[@}3oƊJ羦$J Cۧ4;n_bw{cٳg+USkժTDgYb0B'!K,gGGG#;1k֬Сv8y`v QH OHq>1ߍpPe^匥}Mk$r.MF~̴t:*mM.jBVӶ TOKvJSi $O,"xcIէl\ .q05oKፈ?vgEy`ܰhjbNH=NjB }bj 'O=4-׭[g2i,BSTw~m:\믿v*T/CM 99RSx73)?'4nheSd!Jdۧ)dG MG/8yv8kj -rf$YlHGqS mY?`Y>b9wSG҄;Vgh jpD)~&dD:hn-hm7'd.~;SL3Sqr5@JHk 3NԸ _-/^mHS`(]tQ2wIEj%1p?$O#ϯ"Syڴiϰ>BSW FW jiRlյ41> Kl0Fl3f0|smx_S=& PNhپd.hNY8MJlPDC$SbQݔiS%jz}7v%CA-W=KH4N!9jjmIW~qIHK/Wΰ݂D˷U(5 V>qWhr{Tp7H7Șx̪9o~ψ;@NztZyy?FșMQθ LPcF8=S\Kj $I0tϕ< &/7G}YIxS&cժUXrVsᩈA&MRw} 7|gRu>]LK:ķ8͆f# 6|]\?AM'yUSp`DҌr%&4译ιuDMs8DZ6Dg2o_!8F_tpϋ_b%>{De^g1YI{ U$}LLV" 'o?9@=r7Dd\j/?pY`0)UF?_]=us"4ŜRpjÇ Ο0j (NFZ5PVI 熪ۨs"9e=bC57 .ĞWF2E+2|y%P[bĐڡqs% s򊄬[9oZ192mu2cOT?= 9q*~FA-[N ?*à 0 (1ï[WNZݥhFoRx*eN?4?/y2aBtl~DtM k IM <ݟ[@*VV7?k.j.ir=5tf$@hf|6w8KF pƧ4 84Mg1=hM F#8x3cF@@j4Mg1=hM F#8x3cF@@j4Mg1=hM F#.DA"\pi,+g6-[Z~+fV6,4Osܨ *l}8@|x<}?w{! XXonm+ PM c61KՔ5 I4 2 KU5 I4 2 KU5 I4 2 KU5 I4 2 KU5 I4 2 KU5 I4 2 KU5 I0 Ӈʔ)C>>>-z֬Y\ꋻsμ ڻwo郂k=zh:9ҏI4r=4iYD\C/bP" `}CTSD9-]^Jקv^z_NӦM}۷q4fի̀(>>NJǏŋӔ)So߾6888Н;wn[3JOOO?6l&hтڨQ#zjۛ7g:x 5mڔH'}ԩS'|S߸o%rfk0E݈MhZ1c^͊4yt*dG좐s賷%K˲7:cL؛NF>BO~mm>iZф;sY;~qu,E\j+e}}/<}Zi`Ԡv%}^C kG9ZujY GDVe]j¢ v15:y xR:n˽YXIKaTەjFu{Wn G{zGݩ~mƬ_XJG_|E?ƆjԨAw劣;wҷ~KҥKbcc(KKK.[v-}74~x.߾};PJJ رp A8qIsƌLr9r$-\@dsRpp0iݺuB˗/8n:|0 m 9^ IDATԭ[7 5kO^S">0A,_ cnSvu"zS+ҫU~]S~Wl|Z=L&t3>Qk=6( yZim݉}3W 6+%NТ\]]y&L`RtQFqݖ-[C\~1>ңGZd 7UfX12dkv_;;;;x"Ϗ5kQmM:-[fΜIu6өI&7ntܩ}شպC"XdBvĬZ^ZN۶OG c"klR`S'Z"w+yêL05L_^HY~\:m}A .ky{@= Ќ CS<ܪ̷5|Mi_?;&1MAr3= ֖}` huf *"#u1Z= ԶmVj*E%|VVVM-N1jRοs + S00 $ddXǙNcaԶi /ѳB>Sm֚;~^f/J_пk:4[raDOiZ_ħ0;sRsh2a~1Vp*P8A*yhYϙ8h]Vg9*nLB7n 777N2vl۶nJ|믳䉶 ҏ bhzX"4yd&:vs1bl489899x#g[YPiV 84?i/eJl&+0[g@( )Z ~s!+N;/s>Oj5߬)P}`D!saeEcy#`y~O]4"@z 4]-ZDjƍ dݺ:۴iQbim8={ޞfϞ;͛7?4is>y -TUƊ:9SBVhC4OqEl~u}\f~&%*S^X8?g-uϧ]Ke> jv! 4^Ehc+W F! G6l)  ''$ J>mD^#QG9\ƊsyA0$>` jŇ۠O.rx8xoSݛ.^A/ɾED ԯY ׊T8EZG*D0RǍ("Y_Uyq> zw雅ýv۵k`FDDp*UpdjժlB_92:vXz뭷]9&*>:"}eŊ/h6Ax!buB[D[복/ȉFŽςQk<7r OzQESORV{_UB+ٰɛ|'&nC.maN|A\;-{;B"_ qus8ͦ9鸚o79^_uIsDV`=R r5,/@+amh8"Ν˗/ƈ|ڢRI0 rw]O:B}/huHQ6tj eEmMVpdmRhgHםsyshHF[KFT\jL/̽*VWۼϲA&'\o]9?\%0%@DFى!Ж^WฬyHp. X(uKVr FsrV)!3 . %c悀IC!@󾾲;A@!|*A@0oA GA4+|F@мNA@0pJ!@󾾲;A@!|*A@0oA %U *&T!@XML`ܲ A@( BAMY hQ6!A@0IA@0 2&A05#fY\Fل ! &}A,4( XԤ Bfqe P @@,.lB I瞣2ed{XXX/ 2Ν;We7xAf?ٔ (#`mݣ˗/ŋm۶tƍܚ222(==޽ۻlX(iLJtq~l۶. oZ`կ__ߵe˖rJJHHSNq9O?6l@aaaG-ZSF}ߧ`f-cǎ/kHRR}tRz*ݮ];^ztam?3?{,\oSN(55z)v6qDӧ| %OOOjҤ }Gf@0`ԩSN2K1119CkJ٫x,n&$RԵ?XHLJBlxU(H-Uռr]`/_i_4O29%sCC;9-X6i(10ɉ'DLJtݛ`B`?ŋ`Νi͚54k,v=l Sp+0aku Ghsh7j(ի? Cxn/dŊ ~WHqO$jq=hɒ%4n8 7nc` ַzqE1[1(_ӗ&ΫGU2lxfG ={dXgmhժUl>֪UQb eĈ1l׮]{1G21ott޴yKC;2_40[n)|>VKѴG.T ϵ6Z>CTKXD2;pYW= ^ %"Cn%5ōI 6xiFar3Y#D#223ܽ{71@"e˖e!4Kh~0{gR7 2w\4D6]\\*:y$?k ϵ6ZvyNԂAIE|g詫Wce̼PR<Ǽ{J)0)>hሆB ·itl]=Ж-[h̙L9 3ڵk9k׮]hax,ʼn/\O z!0qᯃh{1.P9O7nkj̯)꺴n.ؿ27_mlۭM82f0{ )-)J+Wֽg N4]5f̘AHk3~3&-!BcD" >I@3D 8F a=dkFh&R0HaZSL3ƊOC6\\ɎEVe q+ 3O }{=Q94GX`rnyvcǎeA6HFj L]C0Zh!46MCd>Ԛ@j$f5{i߹'HZl@ 2g>|VOA0HE:K.]"]i0wfT`ժIChA>^Y|H.F#mG}pJkg8< 1G4`A"@Cs^9WLJ/PX ?RNA{ x ̓j8H  c P*E_Ψin Z^:u_ցx( 2޼yv~ P!C  P` tsA@\C `! `.˕}@0V:@ P2-ZR|>}%RH},rH,K9׀R.@I"pC}J1b;oVD3ADP\ekh$@'C;" <$&%S*[{'hZؑ- 6jPi$@I WY5Q˻Skt:T~(d +.P*c'6-m݋N;JHDG(fǎ!w2V d`wt<8"in.B  P;t#G%_Ȩf-Li)tCML*# geTf +G n䎴7ϊyP.p4@mPLC)I@ >3dv,@Q#?$:"-Q=6r~ù*ʟi;=`,3 Idh%>j,RN!@!A@0!@cv `v% C@.lHE@X BfwIeC `,B"%A4K*c4)i'f]Rِ HI;A@0;ʆAXEJ ! hvT6$" h,RN!@!A@0!@cv `vzܾH;9HW^gZiu_n+Wom^plшjլo#>iߦ ]aRZ jۺ  nJ` /:H1]9Ϟ sÛ:38kێ}('=C&Id}5]Wtaqe<7Uux3E7m|]g]d"Awԛ 9} Y\vzV{zq>Z_iiE2aR}ʺwЉ\d>pGH 9?< פ 1];Sl\<-_Z4kHUV>tW8^wJk۶Ǹ X3~>ԔT]y"U+kzj$9 pj)A챪_R䛢z6wkOMt[͏ו?#FH 0IP !.ܺ+Q1t5hchXkKύzD'1IwN묫ǗFh2 P3i7z3ԵcK:,"9oݶF؟,3) Ai#("rotS9豱 ڝ![OL.0zFM;i\Q$ W ug&ߓ !{7?,f]vw+jSm!}Ci:sy='2O ppI[N b+Ν$:Юɠ;0AhZ~Y6+ܾs?W*>84^}ׯW\ʗwRidQQ+7I1j/,@A'/7YE $7?dH^Le{xJd9B%.[ psp`BCEĕH=kxޭsk:Ayi ~znK\c8f^ =pM9MiO߼O~\+?U_+S7C^aBWW:th! z?BBBWZN Q3}g΄7 6" +4Gք_f5 &ЦW-v͹8"Jъ_@jNL$( Z GjVTBTQbrhg jV(n*RзY@3LT;ikD IDAThIW`<ru*DH5e&KWm=@MIhsWh̞ԇiBs >q'_@ee{i|}Sog(()"N9=T|?R7Ѷ.7,@kԿ yU:|H!g.H5)' 7 ;Jޭ-ގmx# '<֥ {D%?.h#ڷUЛ>dz^EiW{NVܜEfKXQSM 0e5@,U<|h`]7U@ ~_\۶S8N)[O0᫑ 2j HၯOH6MgzG+ 8@i JSNjFM*5L׾;F|Rjސ>:Ef}2?"ukWgaym]2Jӳ#!G;^O;@<ԴQ]zy}-pk-I㟣~} {2v=r|raХ5 ر3dNP_}FsavvTÞaCQu35R&*! "' '1,KS~J֤1)t+9 /R|pM[4P issD֩9|2sژ:/J^nKwME0 㫮PLHxs2.h<6/W sΧ]5JpЮXid *IK֋fZZK^@B,C0<$VQP{?>EGu_@11r@괪%~n=Mm*<|9iaq?l@B)):/|ps($ i曘#g<$G:m=3|hK=k\X+u~EzqbLNIkV9 Aw$Hcp;'kqǃ${0o9% QNISf=w)Xv`a쵅_8rE_ ս[;ѵ PcR(3I@]JP$g`|h9y_'XS{9Ҋ@'@LիP@Cefi u( }=uTƂHbVkA~̂-90 ܿ)ZOV`~_IEf(4ܧRA@=k"+bB@iAC@ѻ&"A@(& hF=k"+bB`R(91n{>Ti2 b,*-݆lމs+F_JMVw:VViyu7hl9a"  &ܾnG#(6 zxM6f !=5b_V7HMИɤ Et8(E]B^~DÊӔu%k~!r,Ŏh6A@cvre-h}5lD*Y+ jT 5Vhy/h&OJ= PB@1sH q9ox"{* *(hP1F"@W^{;;cƔ6  "3eIoL~˜A %*&#F ]]t?bn̠FB9b1b$3A$pRiҌ"@l :* QߴO" XPĤ  Bfs)e# PPLB?)2Ըqs/sю;ȑ#sμ ڻwoAAA=z4[@G$XҰ|7b8qKwM4I=HCA@(%:t~v~ P( QM|@'Nx[. 8^y6C9ߧ`mRǎ_$mذ={y6mթSG"gsM:}Yrvvε]zz:}<Lx???jѢ <5j}V^M?#y{{Ә1chΜ9tAjڴ)Q8^<==yߝ:uwuno>nWի jRϗ\9Кu?;8pVl W"M݃9Ѽ%(5g2+-jî<۽ @VMrmU@u7#XgNNCg##TmkMVVqѯ+{%CgUjt-}ֳZCU͵|R/Bw/揽yժH{5+wjXۇ=ѢSZ4W3}-t2©WTٖ!@p)F}i5AW_6/^Hsޮ<'׭|:B]{zG1=YHu-ZfMA\9eҥsϩ.{Ғ~?'סCJNNJ*oFxg}F6m"!7nܠƎ@۷/iƌLr"% 7fLmޮ.W|Zo"}EzӯRpjOPd&C tʰt%Z8'*2{|*yPMNR"@:濃\coQs}]-jQ%"ӗq]_}nA~ɳWk:L$҄?I~Gg5z*2* v2 YA}3^w߿InΊ Q߮4wsr&D?}4L|=ֶ.rPQQݑ͜W@~ކKc `RғO> @zWڴiZQDD~z2|&=hhAwww&@0UVܾ}Sz @kShٲe\իm+]ex7k֌?lmu_b>O:f/LfQQQL2,?@2dkvPvn8/^dv;k,izZGdϜ9OONM4QF7YBlX H6!0YO櫣" jETA Hp@dGiw9Lj5kIɩL_g g/FըJ$?=3Y!:0adA6 aR@8)«VB5oXf&BeVtUY5-r2k1e&%Q ^V}BiҡEMҹUm}\/!`Rzaq-jj ͛?7iGA-cǎѮ]{Q@@&ECj*&,HJBaS>u5)WN9Ƅ@{ j$`LnHn_`z >@<ܜ5,cPώi?'0j۴7gtҐ@NSf⤙j, jK?ْ5i; 5> O٤n}4~74|-NI6:N\ 3A3},W\צ:Fea2%FᢢKؕ~d}_)&%@cV@&'Od0׃hm~@h7<_qذalkZ#w,Ŀ+һK'Of3s!ׯ489899 'L@ ojXOAa4frCDAaҎߎ^JC$'VټiV"]뀙4qra3u.\{v̜_;г5RrRi:8><4INIc#HR xcX.%IM`c-oz48 ٓ=0-wޭ"4C)[A>}={p4{l67o̚[a&3sm׮Sx %)eh_v*kkcL߭Vgsv5/"SR~ ̈&./~9}Ff27(MWŚzp*TP'IͪtB8$<"5a ת954a".%Nи4؂ ԍW+3!RV-FEĀz UJ *dɔܧOϰ +9k$&&r`Zxfkuzִ1>q Ki6@#LY3~+QR=0'PN`#d֣{HYاsC&]Jx_*%&rZc\D_֩~Z8}x'Ay *;{V}mK̈́"Rgހ:>LEȾ0HbPVG7 w0ؠiC_O>AiHtO_قJ׮]/#?xb^4?m6ںu+GGX{<믿΄O?f"SqN4v>jԐc-b"B ȷU4XubWN'y]p }@DЌ AJԢZ͚ ͘?zrܷ\C!1?&DFM lʣ %~8‰/F5KU<֐2y~0ѯOJJ7=-FzKnԐϳCȟy0h(`LDZ`Dn  Jh9tGN$Rf`,ִ+i_*S=itRQꊬ4ߟa[Dd-!Yڡ!`ئǩiL wRYswaB?$WcO֊L6:Q=_=E!b<pU:=iY|jgWk0 8 H٣@ dKJ A6XV$䏀`H[wg3Db""f\^17 EsA s١C<)G@P@@0`X!@ƲCA@!,,.ܹ3‚ݛm Z=NNA#`,ܻw&MDxBСC/ȡ 3FՔ $%%NK.WR]v4x`W~ׯӴih߾}tmjܸ13zo3`Si4e۷Mnt:;;֌O? 6 G-Z6jԈ^~G͙3Q>@Zk7ѷ#'/UYj׬_G(vLNB>^԰N%z[#r/m9t0;zҒu`pUvQ^կ[)tўфzwj_17A _|O5jݻiΝ|ot%&XҒ֮]K| ?˷oN111B;v2?H@'N`Ҝ1c\n}FI .*cܹL pZn)..۟9s>kCHhh(u֍BBBf͚F;?ĿW딦HOLKoԽ]]fTE*{_Ժ~PdV`(Dwqp&:9p[JI)4ws6 A|1Tr{K1]m0 {`P4cCТT3;/{ _SZ$ "ŎIL`hSLO2eZ>|8}Ǭi EnH!h֧5|f5m۶UZ>C6sQ _zekkkk1|+/\ f!H,3L8CIx91qfpgtXmZCi!KT2s59 җl!ںߖln'ctZW{):)殡-k%(Z~0󁇻kvL\-NJ.Zus&N ZcןY;7Mӧ'4?/@<۶m[0_yAi9Z+VH.M<ΰ92G;4 ΰ}AA>NNNgAsTկBn.sKYAƻy3 Vhu8J=HqV`f\9ut d;ӿZ7k3T_X@+7QiAcqQ?r^n޼~_|S;ͧH/?^ k׮E|yqF)Y4B6mpA$/lZg>ٳgoqM~ŽOmނ׸kIɩ?8NYKnmviErR ?6惚z]E$ - sXʕaÆdDeF} ~@!A` CcAp D  b+9E#11mTQmnfp1:״g^kyP9;)*(?|y61*TWnwoQ`=)kVfC"+j3{6NA푊r?Tqc?AW:=lc\hC^]f!pqv$?"$A~J*YZ*~W;z-n׽{w郉 ƒH_YbEi @yXc~l r`q k"9CS^TS箪kPJ6ofr&<߉ɦ/s[_}!)'}K^~B@s\'N=z=3{:á[|lbhbv]/;e:*2yT\ ! #Њ@XB3Hsˬ1"0hTBc14SN~@Ga ZRfrT`"ݥ"D-8gChYa1t[i<\8:gԴt:)Z(um'F49Sa0 .s6糬g 0k292`2>5[zuxW3}>c $Q`Qvb78.o^ ܧKCj9JB܂i|JjE" `(#F@мNA@0pJ!@󾾲;A@!|*A@0oA GA4+|F@мNA@0pJ!@󾾲;A@onm>cI   w.UhbA,0Va,.lB `aP> `eM@a, jG!@ A@( BAMY hQ6!A@0IA@0 2&A05#fY\Fل ! &}A,4( `|L2KC sff7 +++jРYO6%<s{˴xbj۶-ݸq#f JOOw.J?~۶mC~/ /G'vwmٲ%\ԩS\O? 6PXXQ-hԨQ#}@z)88Yر#D9-]^sk׎ǪW>|p>Ϟ=K/2ԩS'JMMzM8C))):CCCӓ4iB}P @4uT&~hSL}RLL a={#=Z{>y* T'umO6,Ri:E;RFըv5\-c>\bG̞C'e5 e\u5, rGhTEDD1xyy1QA\` 6.\m@ oc&;bPPiӆyL 8|h 3ȠA?$Q>}MѣG *T`ꫯhҤI4|9r$ Uљ+z-}rЧZӸ!e81g6$糬 3H:ek 8 .[7oݺu.\sھ};ׁ0VݺuPAA6֭#"+~'NЕ+Wz<ަMɉڷomgլYj׮M| k={6c5 ;ga}5k֌\@AAqBn hڗ)-MLNIܐNAN VͻuQ E=y{{NXkz3/61RcJLJZ8hAkڼy3ݼy3[Whe9s&fN̆vZN&ڵ+Gm-ZdءCK3Aqi Aӂ iL\ ;v| ?kƍs5!09k.95MW!gGoM&& &!"IdY ޽;i!~wn f4ֆ4&̙3`A mҥ khDݻ 0DyҐ'ZW־+ҹQHmQ߮Y4OC06 $X퀈@0䜗 qy!Do 4$VφhmAvE% f/8gA f44N->R/CX9 6v3j$#?WN~׮u ^< +7o޼ݥ !%,}P !C&A\4+)# X`Ȥ  Br%e P`&@cq P"@O_ GAhn!yu6Rl5  PP_7fEƌ'mA@(Q"W9# ЉnPN *Iɨ%E6vdemKT  PUֶvFMob$}57 Yi$Ŋ@ y-؉&@Kkrqǎ&AQAٱGݻ*B%!]Ȩhj8[v kQ W0>2~Y fZj P&Sy >~CYdٲF+Yʑ F ƫ;#-)Z)ͳ"?ke5T \ PzPjJ%'&quό-Y<  P ΰH{T"kuM|n"@m@Dp.gZNehG$i8< (k(h3ZbC@.lHE@X BfwIeC `,B"%A4K*c4)i'fE]Uِ < b_ `F}IvIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail07.png0100644 0000000 0000000 00000375132 12564151525 023143 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx ^Wu.%j5`ْly aJA.y)#KU**eJJnR77%! 6ϓ$K湥nVkx|笳9w yoַ>W^sǝnvlWM\ (P38bu=e-fBR F,& ƌ,#SVD;1S.ֹIiM0J+i|e/+sz1ʕ9c#e{rC690+0<^M:QǙE Ve >VJ_ b"oqڈ1ԓsy Hu u ,)cAjqQsqeӧOg6oM1Qx1V|aN CtU>^qi#]r3UPDWHGceԴguv:l:W["4VA08׼߯r,XjƧkC2O^ǪqZ=㈤Dževz1\˖.s[͛eS2L:-e.1\|9?fC|`HmK2yGuB s迟)8t|}rģ:>gpm1ڐz[xccUc<#3a)voO=]?if?_Ϻ#q3gWoc([νoq/7>?_ߦl޲LܐyWͪb swˎ܆uȘ;#ՁCM7X]'_t+V,>> iG\㜮.YzQ9>,rm\$X~!wXbO#n)=^{+=w;) ]no{{dqݏC)gt}'KrTdZC eu:\v}霻nVK:.] pbOh!Kr4xc ^LqKSs.\n*ewH×_|w掛n]`Amڴ0)rnvڨ;H_zu}AzM=}aw~{m ܅ovڍ^pstdb=kwkeJ/$YOɩlǮ+1\m16a%$|y~]7~?ğewY{kn>,ϻ7&anEcG:V4G1CB֬uØtvp}1vj)۾u#ɞL_["۷]Y͚5˭\|+QY.#1{Z+Wv|=nEn%A/wUSǎ_?);|[n|wȱSwV]]"=ܾgûz횶8M S^!; fr$A-溙:܅3/lј믿mݶ]8^å>+|Ð|kttv8FGGrX>^:8.;׮==3sQnl C#߼r eWcA [G4龢-# 6m|lW~C?r90t~4n/u]n>e0{.29E ?~ W˝l 0\Gk pIϹ׻ 8T3.tU˗Cx`^-ztl'LhXKPArI.A"aL/-f:<5HƢ{^W-Zswy[U˲ ZPMS[]/X:g̔ fw=Ľ_7}9}w0m߾%7AH:L5sѿ $3ԃ ݴYrtn29%}޽c[v{w.ɇ}g} ׁ81G:xb 7ypLiؘww^mfwW /koj0i+WB̿ROA+~Y=J]>$m g0U~{ݗ/H.]t!7{lwݯwcuA,۶m )6#ق!Yno7^軋/k3fs<®ͦ jAc?3_ρc5krB7 ʂEsv\G:;CRɠ\] 7|v馛ܸ-fvpι+g7t83?Kr,-_0su۶SMt$;69 nxa"iC񭪭B;dBw}raܹ>'[_)xleottԟ  5/~r~c13s̾Q=-?˗2|C859fuLs8Ȝ3H}Usmc.ִAH6^[/bYv˩xӛȢG Y> ð:/1XLx!t ru?9KqnF`\e\B!gXyN7$ {-Ս7(b.$=1A ;XdX,E xBlh+ԣ=0WWʩ9nμYN.`"x|Ԙ;WtYaI+&WLA>^JGcT^{9'_y $d]@9e4[<GbsHy= i! v8UD@@^MrME %rsӎeQ+̓%3sK4[,ٲI#.ʎ~Bq dwv~]ޛ{{;' 5c'Nrg?ɍ5I% n{6ӋS#ϜvG)_ٳ5~(`g̙-Vݯ6nXSj)&%9k|=~<&EYdq<& 갋o~nHw. qK[+2HXt-굞rG.CC_Kze_<:,v#λ]],|~Y;p4!k9rwpwS vN:f%DW~R!6=?He &\_;u\$_,6ZwKo\HG:ss`\zelqk c0VemX2ڵX.\3cP6=c|y?pm޴/Fdrl -kH?ݲH.zVTerMW:-%%r18|޻D}l\|׻!!kC3[h\ 9_ :d߁R5;#a){heӟ hȟ}|!tE"@.鼌yR\W٥Dzuc;!ysϝb\kiT~·ِ.!M ,+#7nv/qtA;6>]Kl/ȵnO_pLwsg]tOH=|ĖMu["e$J'}ViժUEyO}~?ʗZIc=nK Fk<\Pdlj\XLq%2>@v?+ew=2vùz>(t1W!Ye"x\ϸ]do\v-1߭ei)'l!u7Aqô:uK*^vrUv|W%p΍\,@}rON eoߒc#:ç[݉|+nm\~rFuB[RvS n\}n,W3AQ7m|/p/NWvy5?<jKf=?6vf2y.~M``|/h"GC6|C}<ւo|F8zp ;O|;ղP'˗ .:e8$!WW>پUqąȼOb,6k4 ҈\6X0~lWpa<|З(3.p zf<"*o#[v{[ί&c\ -)h|s[n|K d阷`?m_H~L~Η`a+:DEsg?Xˀ ɿ5'.9|y>?zT[)yqcNTw͝vk,C[C:Z"@ΏSR~(}̾eNz9Xq: `S:/]?cvFN)ٰWa͊ezDY3p˱Knr=9G=+60K&(;K~WN>s:(,P:?r n\|i'͖]w?pl|p1ԙS|IFy:ۉΑ3n~,Xpz/]ΗușO5'֋&g(~p(r鎢l2=)˵CMJ]2'Ƅn$ډ AE,oD=?p9Knе cXm.Mcq1ޔ\8owo֯_ZGw'2edy>D}]+*g*HJ/lʵCtA~'g)G@V`+umrg*x._n^#Bzf{>95Õ]ݔ9zpuXMB{4>ɜh4,O]\&y/e;|%ȨPt^)-c:XgN9Sʁ'(񂌘2f?pxCnر},Îx~cǞJt *1O!WUtl֕J)S)apAzm*sDzABK?ڜ3ձi1lC_طF힎dcLu9ؘPx]8ov(h>C_}SW'_klEa9IfMB} PmG EmQ_إXn$el} P9s۶|`0_1Ke>2 zj箞5Zwa>BWt*#TK%WinB^㌠LwvaQ.#Ϊ,,K,g$UHbʞB$u0+ӏyJdy2+̻!Ƀ*n>?3{6"ۺ ߶Z\Yz'H=@E~SyhTRWbe0Ue/rUy amŤhL灰 ~er'I}ɷ$GKPOFe/(1 #\ʀ_A<1ho[e9~ruݯaJ|r5HX]W BqT3(CL"ikpb]zY5-U A;oAF -فd#4'b̕*^D[uY̵,ږr$uuI6Ad2EOѯ"3C9#}0Yzk>mu;>8&)WC€Lin3 cy`0 Lk!XL8.#:u$x1Ixإ"1F~lda۟]>dnɧQR=6i;b \L16.֕7dTLrK:ǓpMb\"B-ꓚ<Θe7kk~ 0fB% dQPVD =7%%(.TJlrB0߱SRrr)m [0 b ~[!lN43Oɩy k:*hK1 r¶jͬᜭ^kr1%=G78{ iY}Ф~zh`$_:/W8CG IDAT9)e<!~ϙ=f"o0-\^:oK-Y_Hݸ~y9yW,ї@\*_=w6Ny.^ԒϪaJ2q8M)o+ׄ0WE X}yP7< Md;}}ZƦ)-Kd`iW)n 1)̪bC FZEd*'qBZyUN cDKzґ1f>] :5Q9*̝u+iLr|Qy27W^ yQuB+ r+TucS=/-mу<| 3weyyidc3\Sj:vlo78T́Y`_ `xt4˵|\F!;js`] }_#J^>9s7obm[{w^{?>tø;nJzr?O{|rqԽU7w{S̙먓e嶛;&9S_8xO;m]\pr悐e%{Nkҿ8'[O͵t~f4]~ \`[DΉ YGIQiR!ؼS(K@F!_0,mI|KsMkT TU[ԡ [s?n \H^c-J*;XxUoUbʱdDCS\co\&_._/SK.uy  qG>M#@ ,z4@W"A3u ze(l(ZyUnٷSy~ ] AkmevOwl8x=>b|;ltه$h{.,um9n@^`τkskOv9h\L޳yٺ:rz噞y~:\nwz=|.\,osgܦU;#OțŸuK]͙;/ ֳg;ndCʷ!/'ɵ9ֺޞSb7&^9k?. &M~;3ࢌ(X|^;.Ԝ)h,[eK0q c\?)s{ nralԝ8zmn[|!v dC1z@|ºTM&sNmrm ;68ռkCr?ϟ+ﯕSOY Ҿr: c)nzχ MnOUN/;Wvwpǿz />eMEs{K NW, #8ΞJ#lNeqtQ߭k7}Gz}?l\"_}ծZǗ}eJ]xv'#Sx#W䚘,WegRYiB}F'G]/GsLN2yu 2Fˌ~DzKI>>+/0# ݑ3ݘ\Zlpz9s[vw|ٗ;nt- K+3etHn>p \s.N]k+- UಥXt 'SOwwݲe5ɋrNq}݇1Ybۼ>$O?XXK_)7eР p  ҄[u m mC&2pympPrDX xGe~Lnmw׌}F}vj_bȨ\OcyIv8 bΙ=3qo\T *+.rgs;:·u$=5Ї1Ǎ?sn/]p;3t͛Sݟ#B(1yzL 3gLr/`Xf &okMF0c%~c>c`B5Ϊclqx+w?6o\?:~Y>qnhd< 6K]TDEso8C#/pׄksewwI)؆Ƿ q'I/Ru.y¹&bt ;١rCE1w7c ܘć͖ވ1Rl}дY ^h%gE]E>vTn6(\7+"Kh]eP;YWU-ʲQ#͔- poX@Wܢ]npMs[%,0,򜌏m`x,_h|vA7*_9x?q?#/Hyԙ> P=FI:wNq7}Fe3orkqC ,G7pK]R/^ZOAmX(Ѱ)ƨP_A7=)ћ*[UǍ 'hZ`}[7H"D$po`;YaIlԚ*gyTn@]xoFn=04688{;3(ugΝ9!!pKWm- ?roU~j龡E<23gNإn~UwcYQy+v O`g ?SϻY]Q9.lRz҂hE;3sEG*0*1#*NC[gHW#6$2YhZCP͡$,<" mp$EyeדF}+Dn:'GHJELS)\s~oY)oSRp ϾVz2LѕN9箕Pa#׹tkx8uvls';\[Gcp;o?Ǎ55bqqa.D́r c'xnN1A_hbs 111sFNXz+ܶ7}V-jZh,ǎ\?V3.L!/ZJ73X c i& eLu+ZfܨUUVقb!UBO/B * Dc2F'ň9U%": =v#?BM@'M[׹Yrw'wJ59⎜u#O(9'd DQgɞ>SH lNfw)}B>--^lf\O e!QX3DPy2ւAaȇ87/PuH4U[d:&_&PBg"!ȫ` =9rlzcU2&r?vR~FLf:o˄ãJqGN5s<t;F@(>-H]^F}(  zA( #'L\!P0AL`ℇz¤m18.3vosIlEse3ӟK,+ s}eW!SnUFp^Z._>_O z⅃oG֜xG奄"hߴNiMZmSa>Ec)wLѽg r?_t8iOvC={6ٽ+_؝Exl"1 8c+Z12ơ<#dHAՑB]K^)|Y^V<}TldV *¤E4بPoBN CũS+"HAe謃PQTed(%:)*ٷ@cݏ+|6t״-Oİk S}I9e S<qy`<ya $:r[2?n'?AБk)OK$ 7Y oU6Vr9[ [淸r1ELeLKMmEb j}9 fuM-Egieq Uȁ`&b t'p23c胫EK`urycsfYWf|-7dx-q0-ko3d+;Ln΃/DhCtKXtk9}s.S(QIJR *4k $nm`_m zik=o&y"&0$``AL0>-mmÀ}ܶWPiu3-S8,?eΗҤ%29N+x,KhdySgß*/vL^%&ңeEAɢ9E)F<mط?mMi(\X+c**@ƭ_5;:@> l ? NwÿYt\AU19r4g7HR}:8k(S E+6qIX沺:mo~Lu E1`zN4i^HVnIsjQи85do. EHu-8(TTv5y9@O]4k09Z5A> 91;&2̝7W9-rh^o1a9}a DHnOݷGp>YPO!:/,e+Qbh>&PǪ˅y~lɿxԸ|aY wB$U}ؼ9)*/Ǣz̬g92So^ΠQi ݄o{2s; x"rtGwIU5 SG8vVb^k﷊țT)rMo96 MT}  j%'Xox4xSuPE]/!8a&VktLY8jKyUBAS[ ܒ,~MɭOȗM׫2؈{x#ž %|c)(Ҭ&t[ӨC1$"PJtVl+J+r #WI_<MHWL[*a/JҴ6 mx_ZˍDuLBbLQg堶|37IVjMs.J62V1S!H[c]AXӷK`M-\PEZ(HͩDsLTav8oZnvRUv5N9NҩZYw{"Wf7YiOpɗjC' O暔s]Mu9u!0[jo*֙EJ]Ca\aa$.3pZukL nC*^p0װ")WA&1կU8{tL2[u9` 90jTu@_(q2\pb)[B`@qC&pb .vG0r?Y3\&rֿ1ʴ/pdrsc՘?u0`|b4WrhN+ }+M(*`)0>G?v[IE[~T/ʰ0A; a1hYK3S ̛$ďEXھWxa<#&uA!FRqSR!12fj+;FDǵ7m 䉘\Ȃ}Z 9x-f }%,4E⧫zq7ba].r ytHKaP y+/8ܥXI"Wfpnٖb[ {|]1iy Ǐw[0(ǝ]9 џ <1F5*܊Sw[8UFEE9*-؀2f(rbvBatlFuuii1U'M3NP3[} #&pMѡM\; OGṒ6oq7pCYto U4 ͵^5NuYcXW`=;>MisujʏR~\rP*V۵T[)=ea1c=3O@>'VsYŸ46Y*^RϜr11-sʙ#C=(c=o𔑵 `F 5:%CYR:uc|bkPnsb oFgY䧌viZf)L<'?6v'G[gN,z暟eM0jEbb:[GYsPe'֎ruGl<̵`SMx)0编!Ɩo6;t՗IڢulL ek)9quGMw&_MprmG}&QMS&8a)]JۖPkStN_Qgߎ޶6}k?Aa> AcpCu/7:n~i\srJ9X&9::L8]em+',:vsgEIOUqj]aG r^ '.OȣmPӑX>f |QX 5`,2.czSy=udڗ.[:ySv) cؘ űΜ5'u̵xmɩې%<ǰGG r u)G^eOp:+z-:Șm629fOOal-.ӡFAbzbt){mWZr62<,&6)LJxtBޤ4إ|[N]'L6[-5eo֎8ʉCnuFN\ c퉇m:hg1):=&7k> r(}/:),M0){N8->l]Q\)|JN.S2c9fmY&>k]؉4Or.&vz`^cu9>VVch~brk*+Vi1b&k9O*.XtSa,S`]9m k,1&VuD̆1]/c|h.IKN`?OT\6).-׼Z>rUtX=0U1j,x,^뭎~5!z֥l i uGɉjcU~H{X+bXS8Yk )֩3׶,t1)Yӯ2]gSikYe`RtMx ڗ.\c61ʘ׶B9sʙl)#&KΫ|8ͅ[n։I䚛#uy>kWގOb'#eCNU*HcZ9ǎ2iX=숉țS37ڇkr[?q/eD굎xZʵ=O*v}K8.[ǹֱHʙ1U\U_[zy]|1_U|%sRQW3F=z%U:`cN{:0‘C}!שJO1=)\ikZ,iN_azʈu-։KUNmqk[]ViZ<̫8N[:ԑIgr暯?tX2[&&a 8YJJ)_KDA$ɆCbZA׮ʦ]]wGux&+GmWG\U=VNbMeu1:]W6cۓ*_NRe8V7 ֖: PsPX=R zͣmP.œ|ROYʆ)}Jr$+#S \"1sjYCX01cXȑb:'§k;ʵvMeU. SXyL{`S}2m8֧l9X#ı=8bc"JG l4r-Ygnyb6Y)|gJ6AAY@|baӫ]!HB!TP)9|Ubeϟs̙n֬Y1h촏U~`]ecmLNY|3eL:bzkK=,xXNӆ>uN4G VX 9:j)X>,3f t^Y!)0y%DrA}ӟvw.O.\6l\ K۵<Μ9>w;1ū{zzܹs|֮]{{o}{{[DΘ0 -ȩcN/|Iwx[lM!ktOtX:昺B/8[GLO22c.[2qڞ2rҎu⭜uꉷrm| dOcxȐkߔA#gb zB !|<>я:,LhubSrc:+}Gܷ-i&˿ˤߔ,9.:'u6;yfНqumՓʉy DN*,ۭ1cu([i06Y>-gYoNΘ2`4/3VNm|rrPN>i,i;/Zv2ե\ȥ/*lp! XVrЇ<`tt8p}k_s}}}oo//yu~ȟ<.&ײs.]rsTZWe:|| >b57U:Ei ̭%],~;wox͵%!\?T m`bڭ`=œ[egm!KJG90֎:+'_ГMdA>c:ڎ:xLY% њ %cа2mQGGҗN8﮹~g=H*p =z}+_qǏ<7nt[lqwygv=;y?_֯_}y>[h{[oEݭ.Ϻ-[̽usݾ}ܒ%KNin9ڵ˗ц˿t[b7ym׿>֋/u>ug>ݽN:y722nf{Cd1ݵV]ӳ }'ܢs܊q'N7kmz_+ܫG̫tٱ(10}?|?'m֬Xnݾ͗6 ;աBmk}>^wo}>YT^ߴ-|ԁ[̔k0[Onw1GG ǂ {, ^s\ٸ;O~~(ݻ_[rꫯ:Oqڎ O<<8>9,l`C ^pBGN0߷xzǂƍ>s9Gqwoo+>8̕*/^!ajwq=Cny0)8nabY{UwYwH왗ѱqPNϏ^ps3My$>^uԽ_>x/`bsMݹwe{47t_@ ]yusf}un,_zEl;>.-] u1bE.r⼁|h<Dθ4*!Au0~i=vhWW. 6e?CwJo <>/ԧҥK/~U‰ٳ~7 NYkJXfwv{l^tAm*7c1Ǡ,GOU;5ul pѽ_ yr5~wwUۮq39Yt:wwq.{ro}{}H;v\de.nXnÚQ٭]' v\p؜eNX$[=׏f="H[eq'7\+%sʑWɠcRFc,k;[scse),}j{a"sbӊDQFPZFZʰbX; СCw;Î #vkHa %bB'Nq'' ?qQXX,Gn :\beаx1i;ʐSsy5k)8*X\q0N8#v&27oh3Nőܾ}X6CNnZ) Im8nl 8=K;d̲P@XD_%c[d~d2u©3y/[-{ڄ>+;˲?_nvG:MqK)>`hgc}䔁!ܔ!:.5y>AD.1̵]L8cCaݟk/sA{k_ppJ^zjw_# Q8 OK|x8^DAGHvPc!g)9uy`nW] .BbWe!M:\.vbabS=0I',.H/U}.koCfk,H )ј68EG?vrrNфqyà סONH ;_XNaN}y?R*_YNٷ@bsrغ[=u!pKY˸IWAT? .t)EGQvL9k^Hgv??w9sGK;µ7܈n ?yg qʈm$즰b3@F:Xx@ L8&2[rą83uCc^c6^o&1wa^f%~-:.;6N ;r9+|n0_ZŮ3J)>H6qΙp {.Kq9=͏N>aw%;`/ZC^6d}v';98gWSL^'_×վ(Z*[0OaS~blCeTISpfE9Lwp% =찃b>"3 N7mpOtM!tЋ/mQ Z8HB;pz-6=䓞t㎰N2>X\.!'˗qAd(pΐEp?8V˂B @>Y닻3gΐSN?N/ˍqYc z+‰lxhrpZc$F-B֭*W.bNdπ\EF t,Ry(d!p'|MumOC?0CYcbh1i.,uʭ]zGedP)I^-uܿ[բ54<S6oSYeE[$<+~]d$. ~_x^Cy"U07Op=;I͓kfp-)~0wpo۴ip!}7Vz uLxCՏa{ O uq#aW=w\c-}7?޲]zY|i0)\#;]wvg7//BYcp:9G<s #~wvkĀ ƍ[:)/Zqx.__sX;c=ka ̸%3??nki.eyY0]+>  N[.N8ss -]v_}}u|,'.(8qVN7.>#\e40񖻶`O[o^TXuOkg14Ƅ槜2iOA?dy}\Ý! oїr)Mdnm† %*p8e~с'4. Vqww~w\)*]m,vXؗ7mL"n !A|LK9'2c_~ڝg?ZcF!c<@ [&qwSq*Svж*軻3'k;ƈN/gr],? Jƣۡ969B}Su9R$S0v氷%y\fy=+ $ !sNF攧*:9?S =O5X|)E2+M$fV!2,di,1-xVPy}q]2p01"O[ʀu_Cige䭒Ǹc2p1WG|`Bi*]\S{pi.W1r GrtMlRMBn.C)??_b0'_! yEU6Ĥ^asYV镝,I~¤j r[-e(p) J-SJur| }Ln}J6H"te,[Sh]&GLFsub2+<0nhɇr.&>xi-Wa~kl3"&>a백2['͵@qRG[:`6:Ǖ<<fA95r['rR8ꁥXht:rhƲlqdKQN 9"gt 00=Z['<魭-eeb,VKZOVtU|ied1R9`cH&&bX-epzL1(sX9cqPmd)\P}ƖiG99cX2ȭe(V-JG>NnJU8ͥ tV8,Amꭍ'>R1򱞹*oeZ-5 ˟i  b' ݊t1Zrcv1Oӧtan9)Mݘ 0\k"#139ocN?ט]/ 1hY4qXm֩ sS[g6ھI<&7pg'vrodlT?^'A,NX}z2h:0k1:O-:vzY[:W+?˯֖xSvur|1K!g6Ybhz,чgxqdC[-rxgqK>Pos[3;/ŏ(蠮Nέ֥ֆu洳uȵ e Yk.e(׺Z˖6Cy O͉OX&7!cYfN=r'm Y kجƒO4G;6ˈ~,ІXieҖvil=:=9X(pX >^0N3gv#C]GY\uhc:v=p֖u,k[m˴2u]Y&%#ob6IOɩo3&b.&Og8ʴ dΘ,rAI3ͣuٓG>4|2#^dq!57)<8uD$mpGw6n(  iؐڷ˥()cN_Uumqxb,wNn/}ؼrj&+s8(6@$_LyuX,V:mbX*ͅ2l긬^[deq6wVaʧpvS'Ol60!z[RGV[,0!SWeaMUio ::`y;-eU}8uk,3(Ӗ9p2dM֛r&̓hc1{bao)}''y䯈eMj>" PYn梥cnhhX(:|jYNc\벵:rPm8ej;kk12g)?sm:Wሟ\eeaq3 !ӉLsC7-;}f9O(hJh;'8 ! 0<N Odɡ),Nfy;SZUmCZ[ZUNmZ_³R);Y]V{nۇ㱍KR/勗Ϝ9=:_͗ IJ:dj{$599|䑇h.Гo%1Q)on1EmqOes;ۮ^uae-u6kKc }<cB^sWe.ƽ}Y+[N3|oxd'rd樱Yȁujkii_eKm]Unʕm˷MՋ}pz7Kׯqھl);Yܼq&;n'󯴡5sTuR9~u±q17[baDSl`G#&R\'(mHIXrGڙkc^ m[ u%wٺxoɥNnĺEԣ]ٷST؁:<|5M?*&)KIE6xNkwK 'wv嘤>k~U~f2*%%|_7)TPNTH7ʶ maLiֹ>G]:c>盟=ڹ\²(si~.ы&GȷK闦[pŃSbm!UZԺ2%zOVN>s_*3;ɋ*&ȶ6>s0ӇlR>aX|u5[K5 lvE>8Yí05,X۾xt?irMЩ{1Dn3ǁOq4oפ mp Ίu 4b5Ʊ3b.i3m Cs{Y!o9I\v` yn>mͱƍ4hlR}H".̂.Ā%j1T&t9JSsfa`l%n}2F8`-] Rěq/I +޾Nrqe8`b,ce}fPS5 6"\֖8ت_k> ;GG*{COJ[ÐeipV{s6^[ZƮrpe,3j MAsW&5>)J x:gNmyA9Å'fo [Ow_ ><͉VV;[qCI_-'Ny=̓pvnY3T$;o? *>˅e2Bs2oE,ct ZӣZ 1ιy<7!u]J?A:9αP,Pui;Vݜ˾[sd64&RzuzL+ !wLc}d<%h;^5<rd=.e{ T- #. [IҾT-mYM:ŤطCz/bjcTYR.beu|6,om ɕ7L}*ǂ~YfY̛ˈ]`{[ߛΓ41Ue#AsE /'DEDp-ΜQǎZn/W8s/Lg!qҎF_}վ:'[ [OƭkۺYk~|k}-5YzAr"r0&We5䶷]v@)sfYv7\+9w Bd_JI**:\۝qՠ(XzyJ#ܶ}XbAj|]_}tu&1Y$2^2E9#vB2x+r"sr(8G`6'8.<Kǁm Mk떶xJy"۷]Lna u-t3k 1<ޫB^Ld耰 &`۲@y<9E8`Y .݈s3gσ}l˙۳Uղwr,&C1{:[ͺx퍪ǔ/bՃ1ɧPu.wr`<Vd6{>2FN \uLM+z"a>clgi}R[ۧ8[ ӹF`t68K;W[I) B"06?ڹ|+v/,~ G$g6/bl6}?RQ-D] R[7뾭icΗaUboqvcԹv=c8n!,]9\h,L3\x/P^'g.rkd3.mzb>vT9cvĔr0)SXR00n93`ݱ=@-qvٰ%ǼX:cFFn_1̼B-\c^K$>;y+ƹ9Fju!-4Ud?پ;͒*hy Yxպ\txRQ*q<&&sDСO.XnҬ|X"7ٌ_?eMi>3 g;F]r֌|;k|K.0Nk`6A1'6wD̹7<A<;4%(SBʛƱ;U(P'u*޲e&mkF3H[Ƶz}CAt^쒻5I3ζ;v{3:Cz,ɻD pl8]qeh]2|AE*sU 1U-C,gՆR6!v= W"5mG w諎u{+`rNppooǠc[;gf^ֹAJCʌ?Gs+B\8A <^%i~}*q]j.s۟nܧ;m֎Z\ QA+4qxoAٍonFOvQX0m]mŤͰʹ\">rvf.a#Fcߍѝ<]=g*(qcY{ش8klY~75 8[9Sbb%,xY.wbs}kc XHeHy1=JqW?Խv am3n^Fy2۪7q>p_l"*eV6ͼeSw; 7B<"[Rƚ) a)gs!d)uޝb Ko\K]#lE!1-uMR14ƒ ۝c!'zy ƍ1OWY.Hlo @#NaKc e-ncֻ5DFvDOKu];]FY9#ʹq]`H=Z%RN܁w WL/7KL[cJX缓- C(+ - Q>w<_K42Z,i`!CWyFLZ/_}}C4 iqUs[߄ALBn"Mju=-2a'I1rۻiF4NCS9ڏs[r1&$-`B?/؉vþ9#I o1@v5[Fܞƾ1m Z<8^&F-io~K5ӻ WڅN3EJUTŴ LB}O.L>ηYjmz2݈1aKtON{6{ȴoߞV~b6<3CK[ٻy[g(}n׿9}]c?kw]Ice.~_K]7l/vkQWvbpH}!y mq'vi*gЈkh`v "Ylz_&-ЎG 7bxæ`̡=UEf~yBq./P \Ȍv>KP-`]a_n3xͱ̍wqRbCn]-/9#]r]D?Ge`_i3ac4l+'NFMF}h0-BUvZ=E;,с4*R}ߞGo~|k}-p)6y9G#a/xE~d;K!OS#DKq]Ɣ=!Bگ fTL 鐁+Wm\e6aCquJ *Q% IDAT<(:1bUm84.%qQy\<*pkf)Rę[@ڟE]3 G t20y6ö`\+>th:}tu1'[o=4N}H]۱k܋u/O }~}?p3]|?~=|蠎Owh11^ևk8H6kqjcR;ˣbwדC hZ0kM9\!{xHG1??'7 _ߊGb Eygrs?o{эhwG}N;/w+>qO?kNuZw1?L {t;u"׹;vP5{>S?ީ-#c.C7`OwvoHѿOiwG}~t̙Ev='b5hb𱢯xM$gpC?<_tQɟ}%Fha&7~_}uB;Uh>>#xg~T}0>|`)}~6iRߪ,Wa3+izߢ]4}Q1\҇WB>g ұ3߭)gM!-N'޾PԐD9kAoRǾ'UΣ[4a_CSWXƘ\5>F4SAa2GY)< 6=cLk* `y9h$|./yiN9t7Q:uv;dSSIh}`zE-4;n;6ݯS;ڣS蓞8%rw8 wL0ܥ}4#g[>lF=/E;)2E. ^]Ү}VMh\SnNNh]"仧_gu:|?uABcB.tj=@r1# KW;_ߞ./^тzDZZMӯG[bwtdG,1޵{O%=܋MhƷ>ůOwu{49v;tcΟ\YmC^rd`lL6E7qsB6a9nW>ۂs]ږrkZ=W1b}LK [U@J{lx!0Rx>sxM,PU)Dk:EK\7K%Rh!#cQ#sڍzk^"rv'N^tY|~zNT&2E-pŇz;y,Ă?Hcs|G4 +]CO?zءCN9nIǟ}FI1kN)-5;N}l3v+Ms2\"FVe.I 8Q#,6yG6GEގ1DrVKٯ؎zsky,p j,Ū|sZrâ~i&%7"8<]8!7ΎhԏkI/i` 0`t I j(TŸXԺŹ&bsHMM#fIL;uCGbȫZNN cȣ'|$:߹!5@]uzypBߊK*#2g>NM7VvfM#H\s;uL/kGυ9 ^=rZ0Ʀqc)xSw[mH 9{66-~?83U-.\ǧ=Z(ŝnNr~>}_V?4Qz 부b!~Ry}Uw ]=;ϻ=axf?Շ^%:UGVwZˣGOt}vםEC9W58qi免g, gYOY?#Fu?n\\yv8[\oBJ?7DtXJsIRȆ.ow}HՂhbnxߊ cWxl JvmK_HBp:w+(}GF|J]sRo>BǣEp-=0:G~IwY[ +?똯_]uBCFɺ,~cڝ%|]K?㪷1vj0ZcqrZq#r\[V4i덯>v;R@ˌ]㉾G]Fkku.Iasm7;]8T57˶@@NN#$CG*.\kW7,xԂ Kq N]"'ϳdG[gug;;un,0xر#qgt;0N^,:kN 8XAo|1BNvt;OrF 2&#RB?Eq]c%8R ܄gKTx 帧Kɾ v3#uq&Bq4%$Ng2=8oiqz~Ώ~_,ܑnwmC{t; Wl v&$wyC&Jۧ]!/]IGGE[  f,䊛a4mP,>mɎE8n``7/j ?m6ma gL8nj@o-z|\V6(DḮE6a$wx?4{ڥ4)ǘh;yJ;d wNqwNkݾ>˄_bh/:nCj?~AP^Bvx|xh.<6, YkCS(K;d1VR6ԍgLʱ1.+@"cYymCؕq9i_@Qzo FuŒr.&^bW 36c7s>  ,|ţ9F/.p1Cy- lpl#7(~;>E–?bIPŸ[/)jvɘ)j6jy1i0 n]-d:NpyMSs vc9; MS0\Lj>dk=I[bcNnL>|XxHwɔ<~P`E1`44]Nq:Ɵ??8- ,f`=[/- 'Ceso7N"ߖaY뒭2GջC8OYߧkqyg'uwwOsN4a :2W᧑vv"eX]qcgmcS018ݶi`t;pi|U3:Qr`wqZ=li2H#VSC@i)Kw젗9Oѥ*~ S[z3 'i=4ֶ{;(>)"htKǴCX:8Pڈcڲ$4bi5ǬV<:ZHk697[ܥq nyp Y(:ɑ3E=5ߨL8NIO _I;bhڠK9I Jh?y8aW]4iTwmܘޘFx؝ڗ}1ҖQo:>=C;'9vc!#.)8Ϲ! ߦLx$:1]),j9&>\ gIcg ޮ/+ݦzF s2ȗd{:ߖV!'%{Kp5KYc,czpJlܭfau, K$m0A6!@\o2: Ls,A!{c]0&F@42qc0kٞ<3 qe7ef"0l\bْ;]f(WήkdR^ahN: q9Ք1n`?Dmb a![xC+#Ѱ=ѶEzo~͟;2=T%Yވ_I,c6vڮN=15\7t踓35My} _􍒃ږw5XƗAZkT\-SlFTko.=:Y_bN89㑮)׸[zz` !s9(ndCm7bH+֘4*孱{dozѨ Kb-QǗ,=_gLgǶ{`E/K`{cш Ys#я^y3K?B@)ޮy 9a,kbjC ap0*I/`NY^mi2sضfGՑ XJC]z X׉qgc%϶N as]\Sou3E, g}L[˛fshDٜP1Q_Ӎ>Fl,:ݶ:gu=.v0 y0,J|M$Gr . }-4aIHqy'e n%ثiÓ1]0S.u9zo^gΈmv 9ϟcO:۲9- wr06,\dFe_LjŶo/Z(싸ߩܩVް1X@)}qo"ױ2kv Ѡ U&f&c+] p՝"/}Ƣj>kMu7\Fߔ˼NZn. L Y7nWUto-N"+grvcKښ(kyɋ΃'cjY;0mwͮ'eM IDATr|$;tm0’yG_[p5)1JoX )۝{xMdž׮3E40+GjGTyBlֲwөN;GA&S`lylַjfgV>X|m 8`w> ]H;unp[.ɍ؛J=6j>tҷ-*ԉw{irsG>7dR膠3&o Vf9ǍMpcY}mwm0[E 4}(:wA'nv`4#sȅO˻]x{)FE1Fl6%8k>PНjӑWmrHg-1|e-&yP&j-Ce涯17le^\MM2Oܘ*ߚr-:X˜W{ѭ-s^ ΗU~5%9jnLݬM619ؽ{}_|8XIul-@re 'U֋իuӧťnwos 'seѺjrcm[|wf%fɹ%%eY̷X նd{8%kٸ*%nTyUe./mkȖrםZ/˺y_M&{AMuV_r\ЉB(׏\q:~Y")AJ 9u\߻vtz7߷1UmʍuK9*el޺t۔vȷVݦZ,`I 2ylcw?9|3M~mIUoX\%#}TK]n)Crnso6Zn\gŗ;>wv[O<5|m|Z~ vq\5/;\0U\gw+=O?˘_d]%Wս~W.q.ƹkeƒ[F;lWƱ|wݹq-^sx19kHWclzZs_[̱]\|S`1r潙6>q:eY28`7A4yxzǧGiT;$}P@O֦Ԁ@Z~[;\'e97K|oXb87)n>םo'oʗ!,Į;1P7ـ.lםW[˜WݲlsWlʗ6ƭq|72[mu/jY-5ܦ8˶_wF2o6Ǘ.ۿs[glf-WZdWmu'f?K8ˌ-RڰFd%Y>)p.tDD5*]tA7-;X@k= zj6kesy[_=u˪55m|;5&Y/2VN-˱awoܹ;9%zr㍵nfd87_9-Z^e[պqk9|V2cmξIn?K(cǎMO?zX&ۚ;@+s-Zȳ7M~lg[[ۤ| SulYƼXx]^Yz_mr-mn9Չbl-Tj^dNIΫ]"<~_Jgz{:ztca܋|N5:5Gc OȀDy(W9MX+fY69q!-)k8ۑWn)e_l,sɫl2oEO2z򚪾k&{pU_1U&z99*{ȗo6_ ֓'O'O7;O{.lKzu/xÄ;@Pdoz`8tƄul[=W=8}kk?O d7xŭ `g NَvŃ=iێftowJKLkS; K D}^8lzt@wsb6lk>ۚ1Α T+1rLɓӃezE뚂;u\i;S M%lΝ;EB,ZG6 >v.]n#G5P~ƒIG 8tQKN\aN]&_fpY1 c OmHMxzwGm?03{WBl*:K=߼bv)7yƚcX?spIt~-\ytY'k-&=}V;ƋLv9WP% .\ʅrM޵sڻ'71ѵCq];M}vzчcq]˼QQf7[ck>V Zx.=y[vO>g3߱!׼HAПpWfcᚁP2:kќ_"^I삃,.]¹gO> k}U?M7K<-ĕ&lO+n^M EG`S1櫺%>$VI9&QOy@z n's\,^yAv6W;&d:e_!#U(R۷r.0gx4[_زq/隟plk}慆cE>}]btX)Pƪ';vE}h"n-~g$O  ,fq}^$<gW4NΟgQenݻr\cw=اEQ K:ӻ$|M8NקO뉧_=4}{wK_B,^'SKN"Y1x}4@Ȱdsu???顷ja2}OO_ӹb2mL N5_8X(W_Jb%Ԟvپ_sKәgzS@Rqbl9svV |1|@sqՈs(8M>ca߾}/C϶{9 +HEFoھ_Ȃ_.óW9V#xbH?.,ٳ)}{~Aav k7qEm>t@;챠4\6]™Pr "|jD:;dC=| {Ťҿ.G/\_I0i^q?e19Acx%8=ǃhภ|Y1!={j156'ƉP,`b,GZ֘QC" GdSpYDH[,Vk(("nrJԘC̣={v&hܹK" %@įmyw~ 73=/}r,.\Wd*$Bbh@^RlN>N|5 OKw…J{NOL䗟(8S{A7XLsnŔr ( `tLW >fgbi&'g@E 4 ʇv  ڶ=gi~}ڭMNS=w^CÌ>>sVcc ;Orl(\ԯ ۽[w NjbN1QrԷ .j1CWUrf6 >-z,4^YD}.tro=O;C.ilrI)8xpLNZ9bg8,1wHXL~ݜd:/;;>{z9ps,:^E-%:F$s)imف},',cl_BG#S%vg_f|wkqO6$&ژs^+ o 0?3a:|:{]c @@Y(aq >w"t&ruw~poH={V]MS98,켪~ݍ:OkpQ\4u]'W^y%ŝ싉Ġ{;>H{> 3cpO9xvO;\"`'LbcW}an}X&[ug'wY*/=Z,: wiAݕ&0, >4vxO&X,Dg3У;s|=<-1NI9nuJĘ:`[ %/+YH}ڵ[S/tT,۟׻.z,=_3?yvO:>LNvFj^Ӵctžc"6^3tÃQw=t>|={nыΑވcVbA6cq #5>cg ذ#7c\n>,دH+9 ۶+_t v/\&;ozɶٵIA0>O>qݫ4ON@_;4N)h!"?P|ma=9zkة$o.j|"#eFI/QuI   :R u-Jy-ΗΓNS ڱo&rv,$nݧfQ#FlYwt[ !9.ʔnxAWq aB(m: 8`9ʜba [#(,v"烍z&E&~vbޝ$Uʖ1i:0vq~級R'2m`Ne{\&!KH>anV2v8ݟp1!dK.q`Yb=w\R&d~pS‰\RK9RwEvE ~v<b$]fELuL:l۰4}ǟ|~zwO0_tʸ_K$r wyD灸6m /ҧA甗 >%,>)T&άs0y|˫G,@,Z\[۫] ^1eɖ2. ] exd[؉Z+{pb 'j$v}n; , =H.PkN1y^ ]SaM\NoYcȞѕkbq5zU3bIvK 5v5S_yi!`qɟ} } - A!f0ȑ+f'~t`x8j%݄wM.c!Ky>&j[cڊNx/ WL"R$\91綣kH]бi8@lǓKX8&Q8GF ,\yXo=vx57q|M_e.lMn˯'de Pey T,>dpNYY(y]'gL<1?`1i⮖du*tԙh'@ObX(Ӌ/ˍ#EgnhS>,}&Yi`o,|:S-h;A[׭ĸfG_&gGtc1a;k~\g7DH}:|#ć{@fۆ<X/ <}Իb" w WtE;b0}=hQ7>vr!^esӂ*Pp7ۇÇhicaEjd #J;xes39&7% 9x+UzB żCub'Ʉ ~Xxq+ba.dzNǛnm#,!x}\`dܰUo\Z{=P8XIKP1uH~If9'1Qࡼb-`^>y"L4Sz!;DvJt,ڐTu-,>8«{늝sAq@iNSzrb0m 8,$n/ 9ه}Ȕrh"h_xT]W`g#7/sIĺJ;ltTq }@  &;B ױ#0"9m'd{P@_VəY]w(6'wi+{WpZ x^i c-x4@1BLܽ %'i׍ cMO~lٙqxfّ!SI{1Q?mCKep6c %6?pQ9DF!wjNks~T1#_kBʖs5qUY+T$έuj9sryl. ie\ש'k0crw:(canٜj\^9~bh/qE))wzEDl3BX|v\Vб&(q1(GXr`y@m{%s=y5Ir/Q|!.,8f`21>[Nit=.Tzc ,XGm>Ks=q^Ǐ~lqI;u\ho̻6-߃WD&e"n $Mhŏ2w97:yXr:< cu~"`"3aSydOx4@1dbw H#Y'!g`r*.˸^F:냼H]weXt;L$vszB]\ɬ$TD#}tLk "#!A92IG_Ec ,}N V}c<2\Vyr qj vȬsù堓3](yl'0v",#x wuf -|eN3-k-')$Uvħ#}!Y<ңG*HK:|?8;"S8?Z|N zf<q))wxjp.^8Xt-g$k8j̖qaˏ!q[wXb ͎3 _OJ1Du/ףOSr׵Iy-}Icg-`(w|Zm^ҁ E }!LW9AQk,l] xNmQkL,>A13>s t} BƋvK΁qv_)p ɈDfv/<;ǁMpo͛,.|W|JV\(RsQksA^=¤"V&N[ *|ֶZ],pr, z,0\܋\rbb4PPPQWsʦh"UoԸl]jQcũ(rוs/ 锇$3xۀ%X_)KASUrJoQR_d `V++rs.?s{8="3ItmCްS:.TP+uëEc7d_Z)N n?iL3k7"Hi5.;8Jļwص(ˌ>]VuN_"1NpWO[CεMLXU.:Nd^/rcq]JK<>W_!7+ljnW7s؆|p9o;559!b6_#0֛esny ٲ^qٲ -7z$|M /?@>QU=CE,U>yE]=ꃢ#vbNwPM.XVTb/>݂׶RSM<=;Vn!͸sߓȧP2'?;`&8|#xjQXrn0)f,)i>cj?HArPR~U.tID.p-ym'}agJ`T\jp_zy: ө/LJ[_3/59u;*u\ͼ 6c~5"SnK9 _&uʹgw(f u!| RWR Nuys[Ao Taa¥ tµg3ѧto~hzu>*ՈS;Lr?\Fi}pzbIsN%m#yJ>d矄H_ɂ07~ qZ -@3ߞ~T 2Iߐq|k)Co]bg_%6rjLRu!>ds%ٚΝ=59}Bӝwz=Mpz?5}9m ׿Ctk~/Mҷh6o-:MKr8mmt\t#xhm7|ruwOo|ϥ?5w1q~rGŸ4O?$hKѯ#[Q7Ǔm๖:pPA{#]9f̳Sx41dohkAT;guZ]ڽ[9)I3L].rt u7 o|O=oN~y_VCG!9;ˤ^n1pǑM=tV"\[<hmw=8}b,׾旦O~_k#?˷w'e6y}^OzdN؂9:[n}U{,g ձuϾl?k7_| _oO((콁T)JwRI!B {wmI@Onfv洙=;mϙCڷmv[m.K5p%oeK8 8Ѭ{),,L%A[n^{7x[_><Ͷ*3S/ABO>O(py#Gau@m L eݡ,8c&1< |2+@{2WUFrsst8>o5 ²)7} oJO<B>2n~)˵ت1sZh_o(M~YgFp5ZF:Z]TxQGL!xc寱߲ehSg΃LF ق<6zö65amrUN #Fl#-뵀\62\CKPy)0 ߇?;K ǒI}dCaAh]\1f Im!˂>$Mzr[i벘Ix #iڋ_8a5藟KQZĪR^?yiGפYW?OR]O Ti?2$d"<Ɨ$G Y9w佐uKr~EL'j+gdY8 c %Hq'Łc>g>LsghJtH<Tn;nݚF $ZBä:F 'H5( kBWBwT5oȸ{('3B("ȇyUTdEiDvf26ZEhUA2fvS-juͭ/d8hSfL?~^P~*fȉSJ-;tm!pAǹ96p_I(̃oޓUv*m_|Vo3Ӟ1(5R󣶭Xht:k,PX:`_zw?'xiƇX~M`;~_lxr-FO?7"##u?麶Qvn\LuiNoZj%ۮ]of C}nIȉ/IiP86082£c6SYڌ}٤І h͚5tp.5iM{ۮ JHL ytt=m?yONKx:wtwܙ'tGh/ uERr bkZ{[rOY jSjt>fX}ebWG=t" _^ZճƜu?pt) f?>.FK'$ouF_O =o%K/}Y &ۋ=$թK=E5 aJKWl,lV3$ڀh[ yXA=}G~ԩS'z饗hKc(@;#ٳuԡC;k;czgOhh|Z "l`YN<)u;NgϚY䵿ôy&Z|0F Y&P@|. n?]xCPXɐ`I{~dE^2 Wxc$ x.Tx5IYMX_٘!ȧ l1B;~2ᰑ3ޚyr2.n1IB<3T=pF1^xk~Kyy>_kw?oٯ7}g$'`YvCXfS7_%7֬ qVbЗFqz㽩r?w6ģ`Di/q[ cb, 9Cxy [օlzYJiƽi#,_| ڶmGX*~iY'QPEv* X߯Ow]-[ c9pvhB>uKuwx}BZnq}||hs'M_F.3h}g=`h_|Pco+~;7^7bEFhf>IZ'=9 KI z4Ul]T(? _U.}H\# mݭm̙3)##6mXC#=J cx#/o0)`K; e?FhCt:=2sD],^?}'%v)f$]4gRR'XJϷ "ߥ Ȓ| `Ny.3ų8w$nYA% ۩J+EPד"RÆli6=G0edf묌0BçQV-!8.d #ȑ!3+G-ރT߿jٜ6]~-4}}'%y!={`c߈#xw{0b4*I5Iy"=4>VgK}V'TMi> lfh{c9(^~/i4NG,˄PTA)* 1غea<U|6h$ށśޠzwgnҒGcԦ7EEO#hTUpj/bNeقM)_kv":q?3TJ3dMhݒIՓV1ק3#L~#c_<d, Py?/VȆ6ʱ*P:x0۝G9'w5Z5mn̛&Gvht>S6ɤ藟~AԸQM: ?uFx8i"iq?2 sytnQV~G=jU -mڏ$|&[R{V䵄q[<)ITiȐb.C3hͅ&}7m^9RʱT>?J<^.1}mB;_K'7Q^&q4y̒rdy ž=xߠ{ȿv&1h@~HRrJ悂YdJI_Vm1{+wo#y-nSB:t.ˠ{s ݊S# d9z"Y,n' o s}2Έ/$ jF >p}%ϩo˯sh4v[D\ ai-+ыh?ǏgmoF9eسy;E sxq=%:o`6H96{ߐdhq^n,^ïu(pzez&9-$aF̓."ߢ QKqGo4h[9INf{V=')̷l,*LBO=(8NɩY6g(9ҷѐ'[cyD<ߣc\1UNv\^9'9i΂JZ\vth%Db:햵l9r\3HgMe }.tiePh ^~۷b8F)ORm` 'msDӕ 2d ; >*ͧO' en۶M# N>8Rm,=#"Chat7c:Smgt>͘<:n[JJw>!LC/XH{֮,xvN+5/Y%N_[ܼ\Z%cE~V6Ws{Vb':..<Ȼmo؏ ),ﻕ֡yXKh >9t][sUGpY&lغ\~h={i2(e҅6BΥ~4w\ڿ?n|dc%ވ~ҴE::ڞ:u$i$a΅ "6Y43kwDV6mw lV|i5!>~)a؉5a֘itxl cilvloY G=@&ކ7{Wؗ9AXJ:ڃ\ϫ>[T =|S8h%lM71x:luTozgcaNXF1 iUfX=4O]6Lzc|_j* l> {oUAP"Z\O2W*^A9<|I$*Tl,(3;_INAW"֯4i"haDʄ)ɣ:ovP"'S&BImߕHep7y6,vC7m?H>YX-G!zGES+wk$YL ?cCOPdQ&,$6STfIڴS,$Vcw=fp>2SPߨ.dbǎ!6m䍕NbcV* vn墻h+/;+pfnj&܅7ҩ(ٵP iBAgp?7ں8ܹ}3^ӭǣtޕ?E UvD^|SJ#<{eN X7`g;Zq璄d,H>zll23zA^KYe>Q/Z_|F櫱Z(ͪFGUDI WCq'<]y@מ Wrc>d؄ϝ i^mw諰OŇj3AKIWW&>TDEϷf% 1@T#XGe6D #`6SaBRb()4`Ux8!q\2pGǙnb5]QbpM j95,7;/~}yaƆ*Ƒ,pVQ)_UĄ,`̓׈eڈs5+WymQ3\h 'e,X1䩈L5ֽ2iuTPQʦgF_x<)X)/AfWp lw`%X/XWi"i:-sZWQ,Ocm0SFk#Cu@Ӈ///Og6`#bc]YVF]UO7(U:FZIIIl#DZ5 ;$$$ )'y;WhTFWTelZ_6Rښ";±Wf/We6Ԧ9xn=푭,:oz GSԴ1˓e5[ gKS4JrR"ݻb(-Vg84=:孯#(a+IL3Fz42`l fyF{lIN& LtS%mϳCK¿-ƆF5U7j(._2ns(\W9OY{|QzGR@X{]$Ṍmš5egw b֐>"J/1Zal_"Uvr90;i_TJ iyJyO=R`ۋ)((HCZwN^dO;!5"ARQ7AN!eժ~.BnmpF>˯au\>UE No8}Z7hֲгϏ5BᇶNb$Ի8Jw **`sU1[ΊFR5f%Vea:v_=zg‡T/P+%֜r=}è}N6*u ȰVy*b"-3_tv].%SB^~aT˯=gX\J96ҺMru:/ɴbZ:xPƢ]W I `؞!գĘ]ϤjyłT J)qOqoΰ}Bvn.$L{R|7͢nB63epx"OzL~_J)(+e`Y1ёSHMtf:LJ'{Sx[d1R^1*)bVҤkДz~{0e_Ծ)I`ԅ]d.UzEXʆG+ܻ+bXgr}ƽ1L؇È4~Zr!=ۄLxPmZW( MJL+p\u" {?4z` .eK2\,>oվ +? ͡=ڬ<բl`5=jE;u+.?pS$V.fh \tzgՊldԏF{yq6F<4- 3-z?zGw.dſb lΫJ,(G1OƲR;H^u&{L=NÉ,uXs| E~җԻWOԹ^O%м?R>+G?LbNgki#wPeL ~pK~2 \HQ:ɘ #4Uň#?1%6G{8@)&ج-Lhtf0Mlݨp}4r((xk=9/ R6m^ 裏RbJǍ/\ %pҥKi-x+rc7 g/h;#0 g J詧Kk\fCcʟv:EAϮ-u6J2Z4 e˖Qm*:x/_/tjUȣ!3 CkFv'Quש^LyK뒈G=mMO;XQ7 P}j4rH4wvU]IӁL.sbok,e}8ISHѢ囩G Sr<9(N8NO/eMcF>%NH7;;pd}ÌioQ]T8~Qk#ВBCq/HZY5õ`k|0%NLLqPnȗ#b馛hێb,ڶHv餽Me>FmG IDATTR*mܲW^a'ڬ\C7|xzƖ)$$C|u%|kض1Ap1-ƒ<0FZ^DDX  c0:z2 ]er* )k뮣 ~@Ϟ=E#5m"Μ-IؘfZRlzB@љZ5 #dPyk^mxL, }|hrժT?8 \l(+p=Wh-;^fz'%Nx/5i\UOH 3:SXv]PdsGq)Ʃ/F 9vMem.\,[h65aG]iP(lBM&tlۂ"nXyhO]&+VݪK(Gv: a.Sh.b{}6~zaW}'(=3Ey r~Ʈ!y4]հ me?OS՜|Vcg=>H*-c^XFսu[ж6nx\k;55ڔϛ"xvmƀcTyW|3<,׉d%~\úV]V5f#ƁZ%팟f?E.8OY]lܼP$eO2Pa ZGEP儫LL]ѐ%ņ50 C51Y5?9* pg%P'~5#';>wztk/cG+*{Dَ=cWHwou뷳*Hhیqu\i;g׳"MI\*J ŬhK }se um޶bxThF7F[wY;9Kf/kirG pjZM{QqJ*Ut <q^߳#6XRD4:{f # xXtjUc:g&GaUݒn{);,+G}Z?l8cHKG/_H?t܉4";x8b41.TSW.RU]ɘ$msYDJM::it1 uŔ bYnM^/5.WOyEYCY6J&]))U;ʴ\ETijצ%?Kө 约a:n$$QDtD[eBKPiYJ ctq1d\ݓC9y{{hbZ 8(KdoOwiIw'MT5iڔXј @l~bs[K6F| 7D~C};vM u%yk4սK;їk,ۢ St OѠAxgX>Ƌ;uTvޖ2bVRҡE]顇wN1ؤ.\m^l -/\O#8c3ըv~y%0lF9]_WONˣ,ezuj$Aq(Y͎S~/:< g5gmZƽ-Fl oGZ|5 'b3;嵐OMt!}5x]3rtK4ß{hҷPEgJx3mA)?^⋚ )b>_N wǍK;S>}9d䧶,5c'y9:6Gt}?3!X$o*E(>u/mێ.,_Ew M{y2d4w ,o~пfL/ϛpt}%eӰ`,vZg(R((fJe(Cm Fщ|5<* J?#(--M=4qzIb4u ͻ"Zu)#Ҋ+'Axy`!ˆm'7@&}X,l ^$ؘFXZmш|C@EA?-oߴwi-hگ9i[oy4i:, r .h{IvԘ兌NCKyLi>A.u=c)Fmz5yAh͑o@|iѢE{nڳ] FDz2V7So~1]ft1qloC3|V6ᯝ}T\RРpfmmIj4?w͛7_=WSO^.^M}\c.WÈ]ϟ%[[҇^QvmqCˠҒyUu3ay&l eppeS#׭\@<  kr%5޵kIk $7[1R Z\K wBc@ǔDi܈o5A/a b;+ApZ٣Uמ3)3+?Σ5`3*9gY5vJH&⸌65*ZW+:!N3eqv1JOKG3'\R~0X^(<[?Tƌ&t#ݷ,=p#O|R߃QJf1#8e ®(rsC vמcjp݆1'QvqL ;'2TNFy|i#X&R)[)Lq& B ^.'vucG hs/kq_2Cf4N'zӧN>it{ cE"M[*iY3Z3 'GF ^ #ILW4;j'yT`GEhV62:*-GtƤ4aHVvxGxʤ\O4ס{tmEXi&>o3V]ƼSCe rۓ{8ApDG)BBWXIJKIY^\\ XtcqeL~I)le:;} άZOWi,_p"*ӿ-L~6;m_@!(Nʚ#+NaFT=<1:~85\[lQǎ+ʉ.D!vd_V?a <9~8QqQe a:-6c:6!]xJT;&Qtoܶ˳UJ-[k:}e~k6Gvۃ&mN;By:GZn#B:~iƌԽϳd1QgH>#6"3?}tm7ƎN;U\.T]|h)'WM ^3Ya{zҲ?xywt[Ɣ+DK"f{ؒO.:j)OsYKt iˌT^;۹CSZVPp@Y K͢{jJ](EgNooz_XO^ ֟` ¹l W}s>f&~MZʖa{o/h#I߲i taqڜt*=]PSϥ kͺgcP,‹wǎ"Ҿ Izɶ$b֭t:JX_E\_طO:~?sZG~ݥ80Ѫ]򃛄_pxW8ϮиV02Ã2S`kUJse4DLor .'p˩JMo~Ϡw gsh߫nY00b<;vy sbi_ZmϣM [nFnۦ衭˹<ʧ=iY+¶Jp> {_AN\ P9&OH~AeԱq V%I:o ?617SYxt-c'w' `5eŭGjV:| jl+W-%sꇅzvm4UW$a?_<2tYɩMYZ?Q~m?q"QDs~3V[AZ<=—+nԮiBh@_q/;ǹjލҤ+ {hՂeں/\;L.\GEڦJi+aC<("CXԡ%:-W__Tv`#asvş4=>SX&~!T};v4%Ҙ@k?6ikmD4] 4aÆ_Ffm޴Q|{O4vWϟNJSN)S'o~̜9-n5w:7(MFe< ~flYN\4gVìnbLŸh %zr`-PB9:6t uE^) 8ӿ{&=f%Դ=<=,~ (2^r0vC4:a Ѐ9^C~>ʌ޳nnEvi3:<"4 #@䌸_\J\] R6(.̤F:tON&QF`+eywH0+?OoaDw4j(<}fUR>P,RrI8wbk_ SHo1';O};id^Yqn m+\8RCj%nޙZ6B6z[wU\{ivm^P6|w^Ա@hujx|b}l^LY9kp?5qIΕ=Z ʙ+۫|4+tDe4#fҩSG6)D޹̣gٳWL+Rvz#'c bz هv6MՅ?/+!c7 :a+)p5).)ed^|ؙ-JZ,hѴ 7o>,v\Ԃ7@n-A+)9>1,.^#=_橮 vcptPyglϭ&Q^&oh#Ɏ/#Jv)܌~_L=wՂЃN IDATSSQ)`$L82 XX:&oMH*}ӮHg+\`sEѲER$>b[|_|ށ7{Զ]{z{'tH,~}/);c:凹|Ư730Lz;ڃqW }!(3f / pQpD"RT3H)?/ :J5<"_;[JHL֫_}gc3u?FB'A(,H-[1Tݯ{rkg ĿciӦ맰4sr4JU bA +,L{/ CEt)o7^ @7s zؿi)]6DK^4D[-]- T͛W60tSu pp}WNAd?Xv䌼W wwr*KkE?c@G7ʈk5 Ƙ+@8 pI8 c2— J#,_y\|YWCe*|6l)IfnT~jq1tHzW+F}z|:=wlʏc(OJ͡>M~I(70Ú&LH![G:`'>Ÿ1g؀a16OqBȏk&%,B_dpHm} "݅M׼q8oX|ÄdX!FOw-,rϫl:>4__?0xP&m7l*P@hm66 scޙ"8{ h|t$<^jt75j1}>ix zAZFU;E[!%ޕ~s`aYcC ||*HcM|b5 | de0 Ri?f- }XZzYtbJ#;=b5 x P-aj\2{8Kv82ͨ: g0h0Z&[жw)-W+ߦ\JxML%pV}lvR),!wYvriVV3vlgpaٓ";9WQ["_ioܜt% a`CRZk^Qn^~yph9|Gef]U!L6c%)-BuaeFtl3X*ͪRL +S%W&-{<嗇=ɣ=mmL{o?ٯm ˳CP* 4+7˳-{fg=Wֿxj#WVu>6qZ2+LݡUU>QqEڞܒߙ R?g޺* e l8;j[EdSTX&lF d$VBeZQ5 [*ǨeTX_)|YN쌖ݡ]YdtOe֧2iSuʼt[9;3S QCaQ.\Vaavvp1ґr8*0|{t_Fdq ~L&Gz^+q 0Nh7hKC߁XS ) i^QQ: {9aOScL===uojU8)))갡J`(TZPm`-#=MrugIIIyPҐyV8LA|``֕ PWtA#3 lH2bGNjle_/_a+E8^ݚDl6z1MvTFox)&^*Ȭ4E,C֖fu!JK"r˜f:5 (G[Aֽ|=Pw*,h=mTm>^fAdh;eUxȮPZgu7p {/{6bv,48JdL)|(,(bFB@A!눈 ؜;~PFP0P.PJP4A EFFyG>$b(e(^(@(Ji  c@|hCPHKH#/66V(yA̻1VgR~95rF"C}:3e:sʫB(hl@f0M(CVYa.+`+M84h*rf&4u4AZ)ȉn!r_ YՐT\ pansuPwy؃G'ۓ˘HN25@#1w5TBPLz#BAa  X#v ePPt(C*(HCBBRjܸ!B\xʴJ#OyBNY4AK~ =b6-(kW\3e`MVL)xKkU \kBӨ YVѠQz՝HW.Yn-1!8cZBIaH͒d]`BPC悱\dIz3  rl6@ yEb`lC +c@').V=0n⠬%/_dʤ J *y?qȍؔDq(T)vp8~dx\z 1T1)m3Ūp%v*~7^gȌ/?vi÷d+ЩIp9F+k VT8N eƀqIx8vT84aws%9Wέ!0!M`WN8/04qHX|idR GnӀ:p|%mǓ^|v/{6 r6K?Ǟ`!۹N8}\%{́=B/K?'ScƇ|RDm;L:"[䠩؊;j`yذo>-yx]%1kkaLߠ\ʪ-vpL>iywU =<4<6ﷁs[w d< rZ0a/׮iYk|P0R6iVi܎MvmsI,5 n7 `c΁VE297NY(Rec'jK {ҖjhwZCC1'N x\׉8 Ӧ qZَǞr 88A JN0|dXVsxaPl9|D&!+L߻D/ Ea3fJs箝2aҜ(XCwڭS<^de4N>WI}SebaMip+"HZɪ{;Z”m@s ߺ5>6Əq6'|FtH|K8K67}.Pu`fV;vJ45"F#Xp{{r,m-T"f&/?pIpXxX¯;%`v_eQմqE 1;t^eP)J옐S42.&/Z$%Y d Ss‡Ot\쓠s!_pN?ai G({]B? 7fe&Q M!g]q|m8zzѬ/ZpZjYKG?Wظ}XW"Hz#(ۨ3act x'|sF޻wb/WmXljrqaYc[-o۷z A͘0A:*{vȌYdR_xT[i7ȴiϰ­jQ.2lٚ v1۔zc`mrӝJz2['g @a2Gh \VŌ9.e:^n% fww0\y1X];`vn)mB@G>?N/ڠ'1-[:%0A19R3Y3r,1Ise{HcsrH+@P);g+X00_Jyʞ);)@cҁ+! t*I ce¨rp#hb`Ket ⽃Ál/%Oq;NʫC08qDe~`D +!@C9Xcpj 'yI߷Nu0n)T'xd/uC;.[sR"v25Vk[:NOXd*PcfK^)& jS\(#M҇rt16(s0}r#e8/0RL޼R#˳<*m!WA9ؾśuuζ0VnMAqb%e/fCAY r7M%ڃ_MsV)bRV8KA{׊E4 5Hn`t-h:160ٶ8[7qi}`ۜK8=hiw[$6~2,wqbs`<8yΙ5F݌4F. FWvML)O%:4| i/ߤ>AE3^N-N4i^iB!b'ݔsl0L: ̚'q^y6( &90i,K$D9l[^g܎ZkQM64fzͻcD9cㄹoiț^"tC|I^ lW^n4i90}_Օ9ɴ@*9%$9: lz/ZU;svF&Ak(N򶾮y_!獶FQg4vF עv/u4^U&9˥>0ta=uܬ)7vݬ|Ct>CutƘgȵ+'?WRMy/xO,cEH6JK%~K~&u5qIY.}>xH}(l="Dǵv+Z |<\v𲗽,}|>|_ ^x [x8~4t(|w諿bŊ׼&uo6j_pe_7\qxG/a.[:=@LA也Gbc:66;r{;yFimÆ"Sw֯O|kaEW\]/};B\r/WEfv6-|kbi(So4\ 6knذ~g]5Hވ/ MBM 2njp?|x|[~nx^p饗6n _i ~knmgsEGGaO?`/raikOOzHdӔ `2F $}6W,& V?i}-y];jćVV ?ds3.<+,Y$op|gZݢ&A6[sEI,6QJMnI?GkZ'_+O)S *!6:DDHx!̃>('',}f L 0Yu6F|m{n =2}*W?7ɹҭPSk/=+H[wn+#z)a.{+^p^;nυˮz~43l,k'*7Zy~rq&ߞZv u26Ս/ dh ߼_xm'{9WzԱ/|Ҿ}gx΍Sẟ:կojZ)[X?y#@&D|oq;-t#kXlSg>>4,+rJ|>ZOE^b{>X&~L rmv=NrbOզ~ ?Եz4o'7hThWQY~ᾛ~+ʗpm+7 y$섞|{0{ [^$yacem̻Knr{Ŭ;;E]ܼ| UV-xɇLxGʣE7@ F8&qrǎ G٫xt uvWQ'D93Yr t L|"ZQSnHk~n'3f̎*ÌYx6о?4[Oq]!Lrm/x ӟg)ۣ!fr%"+ۮOnC}&16nXe?kePz^׫ -Wxqo=lCGy@Ryd/*i?՝~V8r'Q ^UZf6Ph>_=/4ax9m1s[qSkd~MU>֭[e̙ l߷%+F*I,}Ώ3%HafyzJǐёӟ2&a5sB}|`BCp{)k0 YN%JZQHI+Mg3/J"Hੈ1bk&F[;Utڻ*0‚/WK/ߛ}i'/&̛;+\ۏ#GҀ젦)9X6͟(\4z~L"zJ2`Wx܋\I(ו)FNR٠֢p. g-YUdʓ߲2̘8ldxsK{wF ~J|~iUHb><.iȲU*y )U?;>:*<AJ- eȃ4|aY5EO `9 b~'X0nٖ rw{ի^Z cׅJ߸ik&_ԣmH[AjQG9Q&.ޗ9Э $NN~djYj[dUOsr:@J6(#]Es6|?D1G^|?VyeUEFޑs`.de?6dr/^ |;//սcd%([ܣ7;̞>φ?]6\wnybƒ9*+DpR! S6Bx葵=⢄>nWyoy㎀A--!/_{v )ҴmܣuUoJ2 +2o ~.|)l'l ~Uotܰ`LyԆmm"vʞ*Zz,큌dV#nW_i!S||T ̉[6yj'Djg,]%@h>o:M)-[w7{JhzwpeG3w,cde7ȏ*ORF 4a c](X3lkXb4^nYc @ oWFvW]sSr/'s )DyxWGSf?lGuB䙚cݑEmAj"tRnVM2&ȣ$n)cuC̺1EńpWIyǸ1Gz.J Fc*B$|JB=4)}G}؈f:=GfcjFE;ѰS5SӔ-rWzU2*[$u *zQ()fV)~9@F&{996sw٣ 1^LYL]yyM(OdTS 9{LOhNeTU_<_hSDU?lnhUu)?]bF8ߒ2禭2haH0EWPo Ma]5Lt1i+lxUP,Y< )]R`[CY*NH]0!Z<; ԼI@gweyJEqzC0t66ڤyLv4=B"\'bU[\؏ ^US^F! @JE?93e;, y̆2t1aFFq*~GI LVABJl5gz5TgĮ &9H1@ =KMbqH5pԶ jNۙ|IҹPgN})6_8AZ!X2K^4^qU9yRqzJl]_N) Ӝ*10:]H,zNḌE;+f'0ҢzQYx =w㩊SCL6ȋK2lԘh|DVgNd/Q*0cf R%;bUh ~yQTi}aE;$X]`y0Ѐ ]vDk33+[!PX(tT`FH/dc qTO._0uvv6H^ݜ&v#FC_](x%#Ϧ%&09% `dIs K7_(){|xmBDh W>4w=ByJAchȉ ;ꡧITfc wTLm ] b/ k [5?\nʠ"i3 5{ZL? %~ Xb}Ϟ2^vxQo:IqJEUJt>1* C+S'&RhRțSGSV4uȐ1V.}LQƪ:sT\^J)3L#UԪ>v>N?$J̨U20}IϜ/̜,ϱWԟ8;}Q3#*;Rw]\˼89VvOayGT 5/չE[P#:MgC#Qy蓲%(G)_}Xd N 1ThX4o?wf"o2i|ra˦Ty]smW%C׳%\ NΫr}-Ӊ$W#/E, $otYC}09sy'N G Ç v{@w4u@+y xOPW^z^Id .aQQ[E}'qR?Ӛq}aVVٓ=iрZV΍CmaGcѕ?g:Ήqb\ ?i{;W&A0cq  'MKN/8lټ9߳E_}b.oVvuNXô-:J{ c**HqۼQ-U%k gMtsΦUn`C ~$^%K/[s huȩ k7w4Vk${Mpm^m 4]Sbj0I=Dُ],'PoJ6 ,$/ M} J}e`_n4ijXlyؼI0K[:G[k$\͹6BF J?Ȏ@=wj[-tTapޢpsx,sAYK'GQLWWZ͛ś }9|] ^6e<2PٺQNsK8{ Yܷ`囲3W#֬x7~G5k{dHnbZ!yayʆ&|ETD4R=zV jj pRYIPЂ 2 :uR܎֜:HKYLDUU ce:,_{]1 gΜ9g"dÈ6Ƅ5kׇ͛Jy՗7z ~d~B>{xH^qm?U+NU*QLZXGX_Dɚq^ Vix iC>/U՚s 2iޮuȰmo>%>AtKzRa. ox #97huhSZH y[ :Cp.hC2n?@q2jt\Q*Mϗ+;PT0̷OuO4)V/uG$" ʕǿl IDAT{de8(dPU= ̡elO߃B}IԈ!8Ղ UX<Cg-o}Og&zt僺>Cގ.GA9yKI%;+ rrR'ܨկ~1\=+7+Co$9= ~1M1zsr:ӑ#GI*&!>'(-crdL^0Ӏr1=oa XA2r?Fc;iD]Zg[bFr 6)l'p=!0dLA^+)ȱ3@@F (A4A'O$}o C'}=~|n7(rDghqٞ6䁉8Ljm}bcGoa?x{l-ƀiKhQ dyR@(!^A̕41a}RT'&ar˖f|߅˖<-{ ~sbL] H5zw~<^iT$* in6Ɗ,?Unq=8@wR9!d 0?J{m8T6>(5׶ ` ?b mς)Lh FB~<$'d{ >A6:)c 2BǸS9v pbA:&;0HЇ}kd+D@S#b7sD˴J#j$jQ M(DDExz\Jݻ;|>v&Mq2^} ]HOU;M|\H0B\ՑjP4{VL!>LáGK.3g/gK,1ŌZ_lX c0 4A%A<$L@L@1arbJ1HL|0XrȌ@- D c4F>SjID;-@yq\nS~?p`X;-I`ń>DƋ,[Foǝ6YQu78!|΢_|BP:lGkw$( +O#V}kլV> z=t_xhlPVC2pҧsIdžlpXGQ#>~rR2?@O B坆\t/ )y'Q'\yJd=zN^2Ko\Lܹ,LW=jXq>nƄKVȇE+6Vz)l}$?̲ J4C>:{l^]da;wVY­C!)Y٭۰9صGxG9r>+?nnegvMA~˵W~J!svAq7[lO߬W/ܰoYlk\v<oтzH xξ>%a)ӕ"[^*vTNXem͠3Zt>VVfa;Lr? ydg9U"ٲmlc9سʞt+ ߎ]6 NO=fܱ`|C 4Vq;iH`@"/!5^ diz,vJhX@Ƅ5 e$bG?fORI$C} V3Մ؋1NsEK&TO}"<Q؇I@e@kdiaDÐv޽/>lXY1boQm \'I%1p_9 V˷.\~FJ[>ӷ9?ȶBk{Vi'dƎͫ%d=YOH'oyᜳ/}]ac;M:I`&tɸ9.mSd/?fLEBٞeKt{qgOɂ1/60yr h#s=lɂc5Df2c*y GDXyL5(r'T^/W=WnqhSvG/K VXE[Lk@tPI@{Oc%lQ+V2>0.x#W2,3W*h+ˢ\q{X0Xm۾KADxF\3nnhJ4^&%- 8Eك[gAntl9ɓ/fsr~ &ǏM\ W&|B,M=$uccN8a;Ö@ZC (ϟ7;[YgԩSG={.&+XWf LRL?mVh89턬ʄx{C=<1܄uYs_#wMe\%;$ǟxRc/Y<_|\?KyE\I|TSN f 8|{Fr /ܸ@MO P9,6ag2N ҄:$ ~"@S7en+c I q}XPIID}/؎'R$IxP`pD;-tWY`tI1vŗb"\byg 8; ~Ęc}n,&Ec G ks0t59SXpMsq\vnz;naAUKW h#q(|జ:,hgV-FD$F\~cr~pIseb z(Gu0+8bޭ~<*⠬jbAx֕ȡLBi+V&}}%MFpP< AO1,DH8~ ;pwv0ء6!WYڊΗN5sC?#Ν;;NgX7oݡAXe=|j}9$۾40P]@ܞv+s2uσay?szi)S'K.@|'8m5qo!虜ȩ yDp}Vnm߇?Caݺ*+;YrI'Sk0`ɂc?RRP&`5qr1] bct+V=r_ً^~3to߱Kj2%`ĵ+­ߣAbH Ã?!rEf#+.[qc[}].&>&2ݫ_tܰ}X#\@ܤ}e)'6 XbO+ G$8'p X="x3lظE.mUpEaI]Ab!8?/q"CD»t~H }M?j9yLϾ; =Z^e<^|a=΍ZBBsšxai3.>U  {k^yrai&ļp?um!0sF,ܱ&m`hm׫ICUOA- I:'u5Qw/@~&g&E+9؋A,@x/m硺&o+U/qU=r? jGj@ c}PYЀ,G[PS1QC O Y{y=̐+S' `Zb[֎g9/%.9 x%&r5sa'Y͞<ܬIV\rn`jc _ gLxK/{rA\A;I nq}]NPA{lzhxDYI?{ΌGN+L.+u grzZluu$QDιirdd=߷G}6Svx[P0H_ ?f.d/}ȪT w*OuL<9q,ilùr8iI9QNb-ɼCNls$C`B6=7:=1 DF<@ňm-/[3V\tl j*ڃsRv YѲ>iQ@TX婟RML}qmOl7$3$J\WWjm7v*S';Tm,I 8䤦m-S\tC!Mrp$ M ĉ%PtmW!'h cQ`ᚫ. wˉ?$\Bl20k܆WޞDrX.3 p'=9?EV L} z6v4SB,I665Xŀ;W0#l^++nTԗ }=@ ܜ\dN 0!X '{,thdĀaX x+˸ӔMOicrB>fJ/(..B|,] چ Ba`9`UD d-$Dւ1y+$z۝cS%j4\6( B^#Jm?FpSy97>J7״‰@R*y%rk&B7Vrkd\)ϰJ_ПmpD2n[9xb1+'(Y}eR'!EgEW+y9A| Ȇ51l-y a۠[.#ON,' CۃpNQ7B  &nc)h>p//UjCro҉[7? #"F*sf7 \"Z)i_aߨ֕6'|R|BlZ򪸙t-ؚff :`."Ae$9%~:&FU 'yɜ(K;ꏓ0UӠi=Ҽ磜ee玊Wd"3Ѣ?!mJu3j%/h'w-J=tYQ Vn@Y9e/G*Ps4&Z E) !:IϠj9 z'ֽu+4Ӏ'}{[4Fs}ӂ% :tI761,#pj#6Pg9΁UhO ClE,6JhޓMoyA,H)j63qL=GV_o5գMQUlFY/R!WU-msdǤ:QnЩf.Tef=94Ŝ:y" N&:M+c&C a#pMrgf1f_c8BXF2pH_/#$~tucW@7!O#$~v I^MF0/bEX)ۅq 7%6 Xz Aϲ4|(@Ҷ)*-Q%~'zz}'Ċ=/~C폾(n6*x.h]S{9+> ޛ%>3\A^@qj SNd@"`T^'hJXɯ98`A~S52+&cԆdEdVFdlTI>RbnoSb)*'<БOVS&- D]UTR^j6H=Ky~zE]dL`2=&!"h[ eey9ȗu*&qSYST73U^i D l'BFX3I%JYψ IDAT2Ⱥ9*YÎͲhG qpLϣLFfiq&ԘZu*Wa! 8G] ]*N^C)(@#UqmP|_c"ױM;pW SSLEJ.QyRz*]qb^ _2$N*$}娀R?4br]򲬱Ll'؊:Ydh"K(o(C:vZ25qUT0ajM2M3SվA WiYf$|)T ǍX/ qfYʤ Fa*ovY)/0=v*8ѽo0 /ph15Y_|ôL̘̓<4Й틪Ъڋm2-SGYeElKYIA#S拆A[2GeɁI'a^ʖc :4$Ҙ~IcCY/ːl׫/w7 a60Be/o|asO8>;hyҰ+(u6^&mW #{62}8e^GX35yl[~I~b_:J2eh=0.::y)Ӕ7ɑ^M8gNHm pN~N1z)3RKdz,-)V#tދydN<,\k|9`@c2eN{τ1_YoS9嘷>/[9&#y{x~OiixMey[aބ>eS2&WޤDg6GJg{GǶ0'>/yxegwM7E##A%O+H[hsV£s0XfGY}Dm&G^tF 1弟џ:r>zieN:ġ)3 ^Gmґe3/Hg%R/﫺2y˾?2!O$մ̱rĂ ե:#~R˓V!eG"NRL&b::dK*i(#y?*(?~/cN\✩eȯ').yu81F:iI%E?T|WcُȋvK1q Qd:lq< lF:sx_g8hh)K^/y^h{ţ u^~X~Y:>y̩:s˲}ֶiu<Ky= ><, 9:u%n)tò^ǡL2X~l{:?ȯ e[:W,^( Gܟ!EÌm-_2Y=$PhdL]eDyX56=ʔzzhLlOQ4# Or^tϲ!)/4ɁY'eʼ${Ae9qY/ exHkʉS#yK:iz9^^Xjǡ^bոRlpc{ sfJtqሓWk<=*h&:\bx]ȕ:dKJ? ^G{{u:%2p}{s/M:JLu'ʗOG I4`ɹLp'ҘDzA`#.yY:^^aNyY9吷AA" 3Rnmx!-e >1d 2p](ver: 6CbxY/C:X7a^)iM:5%ʖ|ꂏr[^՛toxu2!іG26ȫʫӭdC/s{zTʔ:,2sוAt)H@X%Wi˱̜2n2Iu9oc$ԑptE=rS"u:Zl #eIc|{͉Ü Yg ^,OH'vY4F=O6:9OcyydtHkʉM')i,3LE>&>m2HP7OA+Nppye=,{]ǗIcNr$Q7/c.ygל:>x_\)CĢ3NGfLmr}a8^>|:$z|ΞוhM8uhl'"F^6Cgq23}K֋ae(HPȕ~GwTJv[g>wa^C, :ζmݻ`Xl”>W/",_#<ʨ`EqPg*푎<0AɆ8eK^&S:HcNM:dJ~i|Mv<ݗǼ׋ dS#y^Mt1s} 1w*-b3o{?bRfx׻>O%9GD&f:s_&Ǣ^]Nybt#Q,:eʼayө6SM&[u_&2y><uSu$ei%硌D_&y:9O+˨#餫hǏMT(3R+Yκ4(K 3/\e0˥M2r9%V|rKx_`2q|4%N4x>::un|0-椏$o~*#4621OY^N6Z}`1#',Sik\OS 2a^7m2ϗypȑ`g=+\ /})_>c/w^ u]'onk[n Gτ *~}GEOj=||wpM7?l߾=̛7O}xsȐ÷0}(|_ V {nx_X>aܵ7)\|ŊmOG s9'/ W]u?^YDHcN=';[?V . ?!|v8,[4+eWCK} ߴ+?_:ߚtk ki'6V|h?\t3/Lko?7_q0u`%=C=-뷭 oy5w>|lcaמC?j@aֻW70k$}i7DwE3 ؞f'3O ߺp酋^Ve\oVƋ'c3Ynu0i@X!2h@{S&vU6E@tpg0ԟ rx 07nܨ2޽>#YFV^ 6=lq .۲eKx~sH wuP|0_y?A t&[oU l~_5 "0s=aĉ;T?s (i7Sjq@ƍS7~7^ O]bJ>l?&ۆ- е-Oc՛> $``;~B .߸<#>fL-\k^|EXpgaItΗ7ۏn [8,Abkn ^H-DV;knj:C|qE;)i+k.;;< o>?pE̝̜#{?0N$|=!o$F'o߹?\sẫΗ }0,5붇*}5vgi;6| w)0'O W_,<";zO+ 0D/woYU.(* (fp@T5ִ&ƘNb4s;NZyImvDӈL>I}w6m*ljR)v:ZVZUo}[颋.J'pB:# -ZO]vdo{ے^jhwYgӇ?ቲGZh~~7^WK-Z4~~`ᄇ`iv嗧v`>-eEUZCPnO/s?sZci]w->ӟt:rTVpd?Sÿ3ew'ʋyRnpuڼP^.;.p46oy4xWU0 -Y]zk-9-y]xMegEi]VC[K:͋myqX7/~Q%M҃yNޚgMhz}^hr1>?bw W.눼p3nλwqgPk,#NƸo|_W{> .!,8%ܞkvJyi+V|\俟nɽi'0Țr(F8F-`1¹Xïsg?.Z,a'$lٲt)}'X"viiK\zuMG?ZnEuO~A:?%9"ĿaÆt'N(ՏvZ;찲8K_*hǩv|;7%_ oҫ_rCRyjsgjV K/<M gWm{ԳA q0R1􌑡 G"ݯ~Aj<ÖdM(\Z2S~{ctOEy7At>rNyayqz.ސNXz΋=,K?qtrkzGo;ϜY@:0P-9_kк=<蠃zF>򑏔gݼ%?+s;:~cK{R 7SU<3 ^Z|S*>Vu;nݺ++C7¨_ˋا^0`S&#AyyI^v nө/?,~ ;_Դt^wy׮iqCz_2ϖ}tBѮ7zARm "+/[\qy^V O_;pЋ`N0륂n}5֬YS޺jgiz!_u153ԮP܈?;;tIS F_3NefhV>qX]*/rSo}5};Cߜhag IDATpXgN,#Ko7gsEyx6_wW vKK P_o_:eɑ앟힮ɋǷr=XFsEn Z_<ˎ;<d~Ɇ\/M?P棷zC`%UJ?_sڎ˻g]Rn77_oR戃*}l~>{N%mz\v/y6c5^_ n|Qx͎9NŇr:57D!xa4bo-l?%0hđK1+9v?˿=kܸqc١ze7>Lqnޫ^B8ٺ=s vz˫n=;j"Ec~,/ZZbN>ey8(cyIhaȻ"3寂\zm@_m7<:-}gwIw_VV|5{>_[{(=uBݢmB|[Q3שjz_Nw3/L͋yiһyW_ao?YC/N~^V7(H׀(S0XHq$1ё5qD# sJgyP[R]m7uQE9>]qjw|*I-2 $}Ѳs.Sqz@Ԩk>R;P}RE@}%F<-6zżqp\b"n?5:wo|섖杒go7>v*d?oY_o3y!+wQ^Lnw.uϪRC;]U1s?zoxS|yOoDl}b*}%MEs=;z F8YDۓVk|ꥂDbj8! ܘV/Z>8% ^K 6#]ñlI|-F ^}̸dvE_}˪prK Ža6m`x٣RWG#"/bHǸ'q?S-AR1ω|&&Sϼ0.RĸOX9k4QwlwKʍyCbNA6bGq#g/=/ݗǷ",/|qq1]'cn..ёG+.nF 3ϯZ>9)Eb1u)"t_`=?>q~#8#V1E<)p?})HtvM5,>tVO%X|wfL,xZ]Ěb>. tZ9^>zj9q7D!:(>#9w~[z ]F!'gy`cs:~)V> V\B|m;V?r3bv]XUq8WqLM<}\+1k]}F=[ މ$&Rr]hs0j9ujRG18]_+kGN_'L q0w8b%\5Xy1Gv􁕌h/| AXMjǹN\x~#6qA\>7ʁ|Iu1Wkx|^V#st+㵆ڲ?Zz fZs.V\\5lι'ېE|V.n0R1Z_z K]U`Å-5ݮa stPd0o?Rk5E-|OlŻCc^#l4b;{}W[`]ȣ$sTx|Qyq`b>~sN%)S_E_-17?XUXKwǴAG*)Đ5<<.6$>ZfxTN0]80nSyvqV#bz_/?9]|ż?nG.zp?Xz'Tc9Nhs eR.~>.\=z1ׇ&u:68IqOfjc[`qss1FW\}-}ĺO:- 6:b c\_vn1lI|_#mMN4o0sݱ ջxk1|ks+~l#]w\_!b#㮃"^qn_s|]zKsً$&7zG{\4py80C EGs]>^8jؘɍ8>G]XkyysIuяݒpDё]Xjs[z"?1I?&#n狋y5c/qq$XTNPŇ.Au"-YGHH5)~樼WG ^cۮ\b}5[>d-1o9$b݉0|DIELzTP>>d귨RYl9ÆîIrZ$|ރpc$_V %>&ֲ1s?:9\WIǢŧ\? R:qdW1spe~:3()#jfrG')q.Zĵl5y]ǘ-Kmb pQϹ\9UW`C1 txEhkI"E>{yyj=E<|:#o{?-vǸ^{uFF rCzu.c<ڎEtG EO+5r9NkOxcx#\]wq׉KuǠGGc\'/>46w?LECw벇惋9#}AF?vut`1^0%}H]x+&6j~b,-ވ[=4 籖^K ~)>$nx\i>\ )T 7|^"_88_=:jZl(N$mbװIh8Fz[R=upo5,1x[$5\w_Z:^ul5uZb0š+1w }-vM*^]9Z~.050kq_{6vԕt5Ew^0;ZL8 <.[xj"=G襅9na#97<%9\ub^͖6"0)g3%,n;,#V\ıɔ?<&xFW s*g"˦G|nj9K"Uq}:uƯD9x+揾>ps>p|K!';yc #z$ߏ ȧ˼60.but|n;ql@1|jZ0l܇ݮ-n'\}<H[S:wK[ujsb$:D O>(R'vW:~ J5ɇk}x@sw5rIG6yL>\}x򑭚qBzwŘ쮞cOLb}u#hr#m=?R1 ]&V+̇ Θ.CW1yb @+IWDEjkƒ@E mwLRW,XCV}b^y8x#HjY]ycves]\鵘|EzN yܡx-rv]ZMǻNOя]wt|qdG۱unҼfjǫҤ-.tDr_=I9wٕ+\̏cb>Mؒ/Q!Gp,+?>]9v^'= k6-S/JǸqc<qםS|_YJOM,:r`G`ܖχ+N>]z\:|·і%F>xؒя]^~05rSf~׊kͤNCPXwt!_|?z-k1Tc]1lW#.;b]W\jk*BMnɍvi>Ԃ&cv|[}9]x[b-a瀑猢q|.Kwn[1a+'†%(#?…t%mkXxp1F4|-l7u0!O=+;X4N "i+G1jcӇb-ZZ}5]p%C8lru{69Qz.yɉ8뱚W-&ߴ|8$WMh{_oH>Lwي92>L96!yvwscAiI~e kI!OП=K^>|nyv-cP~s1tI>p i! 1V+b ]G_]!Pe Ovޓkpy>ϭ[>򧑪s/5incc-Ƀc>98y5ls :$Xَ s܆<.K:X:x˧8Eg-(b+օW|5l~ }ц+SGֶk}aGZv:`"w?dBc8^#Kho+A]wQ 1}uvitCo̯ ܏.>js=rc yt:ҹ\'.vl9~C6p H>a*\2x2~;I_ UVť 5Z(r x;;icnя~iڵEӥsR森c"O-}5}k~b69#[8rv>y 8~udswu"m燫js$<W 0}9}Z L-^y-r$H۠%d|եV a"s#oo'S;|}lt؞>Ã$Qwn$x݇]xbK[5aQ:^1 Cw"OͮF-nkq|C0> \}:}8rjX)^m:чX`ntcN,>8K|-ٕGD[؈v e &.=.cQql80[}?wlxEc%#Wzݎ\WkX"6$З8ؚ֚O}{?qzwt=P׿nO;+__)tWI+mK_RX"MoJ|p)-[3<3p O{_^b#I2j/~^ҲO^y[zwKxqGO{SzIG,N߽tm; _uT-nNo{ rv?4-^mz GH?tx$zyzŋN\53<~ܛkҋ7΅Cs-d^{mgZ0^~iҥK.|w'2ۦM =ܓ>??Jk֬)??,s@ˢw3(y侾mCLчMnMY4n#O3PwN?ϤjeyA./Y3Cǟx*kn,8zÕߕ>syxye /ϼ ia:=Q앮3O?秃ݽ`n?B!mV1.F%$]~-ڕr禼 {ќ"5ӟz=wi.-ԎS}<=nxk?젽қ^y}0Kkˎm O,n,Ow-ǗC>t{>",o+;C-z `<H~t:&DYEl+kqnto͵\t /jRE($${~S;%-gqFooe˖jhx_T CI~1'z pI ?gz@HEWU]-`cEU/݆kmnk[aړ+>:P@6Υ+&(\Zo7l?ߨ IDAT{-ydz]w1]qe'!QvH[mbx w2R;\uYviviѢ֭);w rμK-vSG|`sgb-/l*o}ۚ(~kQaeՎUw~ıe\Êݻ|{s2ho%iyꉑs<~\={<_!cW˭b^k9ԇ]6Zi5lG}b$kP @$k'qt{vxuQGU;gxтvy'tRY(wz^H&z譹.z%:nťs=hꐇh g} mtxs>>{N©%|3'^0#][Fx\jk!%ߖ^}yGxCz'-nʥݧ0rev皽v_ϛs /-7ߚ_eK5?RE=UΝsF%gww>tGGZ!#k u9:kxZ\)^m@ 5"a+q+7m]ˍO}SiÆ ٚ^m3)ׯ/;C]-jPo-,Zp՟n9}hn_UnaovE;J-rW$\v{.vMoR~ܶ ʧ],[mP|G/x8=ws[Ϝq~s77z|W~5vUo|6Yo7g~1"b?: h7<=҇XomZhS_AO?ޖjhs??OAv|)zvکjK1%՟,'EC~s+_KǘmpFʯdvi铟d{G>V\E5O Cy:1O$Ajpk1 fr%k' vy`wv__{99̩,Z4g7zIETo2,'i5JU_Y|%#g+k|ƽg[.٫w^Vvi|oy!7ݪwŵwܾ.K_`웮̻o广 y貛FD>h&[Il}ה8mqo+nιe<V?-BŅiQy׻U^h!nNC!<䓋-ϗ7~4EϯS=jɧ7ԺUzr}F;S=7da%Xj˿卯яP_9<>1>Y Dl&I_--ܓa2ļxr_`5Y{Շ_Y?25-lNO>Rs]7_ͻO/._/=%tqkX=}-xY/dm8D?g3 A>RAk6v<&뺛K.=#f4=?Խș/̗9#8b|Hj@>]Yn<$/ u:^o\獭^<7N lkkNJ`^WfUmw7Zuo]1^R6[_yK}=o]:ym }"g2s a/K69y?CaRëPWz{n?kqk_OY_c>F]<ڌ,Y_ ֹ-ZGo>"bs-kXq~bkgujԕ*&v~zΉE:'O/Xvtj[e>v;#} udx燿/ʭj>x[<Ɉ6ؚlX Ke;Nz~8;8fF뜍PN„@I Q;ģZ~ͧjr{~ C>n%Ǖ˗ Jξ\rZ>p"[xř|mgV^?5G A6jDҳh/F>0}|_{ȥ>``';r<Ї|~./?| mq|2&2 KLZ/bo%0lx"УlW Q5疿VkA]R|.\Ё]^ek"\N/NfZwXCqksXsfOM}xp-cЩ-/JǠG I\9WOu"?|5|Çb>]ǾVM`j3?v$+}ಣ`qфt-0NZ+{^1N|sCbY)_2q>jc{~z䁕uG:b-|5>pSā~]V\9׊wkZ^ӕsvoHLVn9:,nYn.~')TMt[G'4I_H#ǻkws<Đ1ÏT~q#X|ӪSˇ) }Ctx9raCÏt|<$kxtϑ> ?5csjF'`|pp$`+-!ua9[g/ZLv뢎L_y`~|H/~C> ωb[>d#{]a<+xֈy<fOO cWtN\>/g^jV[H_FYsnoq@Xq]qk5x[~Z<~lţ/pi[㐿Gqv>pEˈct.tsCzLzG%֕瘨sU+Q9`}ڜjgMFKx*xtw[ zD~dáxr74G5ȣ܏ H.0#}őîIiѫ ?R~t$Xa!`FʝqxO\ڱU+vYRvb>k9]$#ԢLj/$/H&_6<5VfG{tx냸|->qC.X;;p693 cᜆ'b[vS7n>?qI_96ƣ OWb:oܚ9]vŜW@ih ^dj"ֹk-_SVLZr6rIrS[cy>rK\Fg7 Wb򑫜7-O -Ww:} V?lq3ZZ c0q[9ɏ%[1z<l+~\#'XZቹEI##fltz ZE'9$߱Qt,KWw5Ľ^ZCxĹ^^ccU* BJ p%Hqb/FW\icRZ.qbmb1?Rqt1hYvӟp}<*ɍ#뎉zq:qdWU/W~~j5!DFI*F凧oC ݟּd=H9GN6r_:1Wy8W1O>]1jscĔ>08|nSk|xHjEٗ ׊ǩOvMaZ9[ypX![rd'R{8=pY5T@Vq_{9$V++V7$o.1zzAcݖF?2xhwWBk/5'vg`]*AuC1#<\M7O/] Oϩӧˡ(Gە7 ?-盧>r0]]1xcQņi6r ,QrH45 !O]uwp^%q"fH L̥'ՅŜHG [OzɧKKft$>I/ۇH_5Ly ŁwʥNwmZV!pSlb,`=l\kA+g+A'5ךC-4ak\$>#"V~C#u=ٞ$7=u$kX!9zӕOZ80/)1?=7 FS?9 VLƘpw 2.x^uzpԗVHυ',yZ>8I炟l,~z xtSO-op;$V˩VS9OmGw\0/DO<օw\K. jzfu0}xQu\ 1d˦1ɘﱨ#[8 䁭񸯥5>YxKuw"vWbC;UG95!#cr=Wa/ɱ#%X6q.it`f.![:kqW2bFka!Gt}Gz,rxlnd-+V8kP(s2Ƈ]}}>^븅_qһ>9t0Q/^[}c>Ԉ8l`:lXc59ЩY1J v>2kqPOѻVVr;b]1(>|1%G\A:$kxN~H#05.j!K+?bj A[|Nuuͭ_`kv0#kW~?&-\볧iz?X鲻j(oHc݅U \W?laVp;@$i/b)N3-.8Ԭ"O>8\9+LWػkSsCw.{}>9O=K^vhN~+vM/ͼZ8xoaKzΡXq#N~am0.k(EGKu=ؖ.<=}.=UuQ2[6!5{u[ =r`{Z|ihs_փG|M/sˋ-nfƎqǧ9@C򨇌9U]߹$j:}"g~ɧ?9qI~G3W_YD_ +___Fhwxݘ d-E DZ]nHgA^w_Vqцz]p}uͻoߊ1]4@'ٮ~LűbŊ>WUi. IvN\Cq]u5ѻjIݯ~?AZfM?{|jA!RLȈ~gv䚏k+:ZmŜshsu\ws#In83kvVܹo:u&:)(uQa߲eKҧ>裏 rc>[2M}C6~ɾ<쳉VؖE^-%A:^b]jxmְXk"o\/ >bC:u.[<]90p $VpA pٹt DCWe{r>#K.I^zi~N:Kf-Bz'ϔv ' 6~Կk}ݗ/_k׾s<>ϥ<|ɥe?Co|#|ix~Rp `D8oKcO[MPqi힫Қ$ut]3;g}GKRSϤn'mlncN0Kz87>;|J}s#ii']Ǫ6vΝwL񄯖}]خ4<]ijDڪ)nɑ{`ͦdgqFʧEᦛn*?\pAͲy"Zԏ׽uJOwWn-ZTn1>.n!=3. #-{YPjxX$zߴiSӯꯦu֕/~pUC}ҟ韦xKҥKvKqsv]xmU*nNo8ȴj岱M}Ï}ϻtE?&̩Й'^vS\ӎ%_=ܷsyGO^~|mR>͋sKosE׿brZs?gnjyޅפˮ]#Ժ[^qDَbCqmIDAT.9Il(7>I}8^ &J_6V5Tç"0kqяvB_.M-6 OWoN?"@ ̓O>n,"zQ{{W^[ j?e[[CPQKo}ZwZwmMt4`s/~Z?򑏔[{V痿q(?Ҋf}?~?t2т:I9>@ZI⌋3vsnoNxʨ}_2ϝ9b[z,9'Ϩoyml,r62GNFu>8/8Iw;wqFlq 4JJ~vI 6^uUeNQC&vکHtLvءhAҢ}Y$C9,N,rZV;2&&{tK9tA©<+WL(Xv)zwI'믿~B,˯_ϥMywvu{Nݽ9/6za*Uˮ=oq5.)>sf8G1 {>'>}t{{O8u/IlqN6=H-iGױCF3P^iyU\}yn| ,AvrH~G }eS jwZO =RE@-HrJUWk_ZծQ?m]YNܺF ShnYOC̅~ /esN1M d8qPv ŵXiA ȫ@XYNqk`.oQs1Ԙt(o蛻ύ㹓9)ggtsDȍذN,dS|Cs=r]7+{Zrj]:'?rXRֻn s䭷ޚ<ы^T*4G?:7~7Z,Piv]w%}PZ_#8"鹜nAC%=Oy^뮻b-H~iQq)}Q/P,YRC4Xr\v+5-+G5'gG4.MoeW7~zYдKV-*uբ .O0;KɁ/.et[.HX~}Weo-~zu XC2^f;M$1N|}ָ{Bכ=׬,\{S9o7w<vW:>}ssq#ˏfCqگe:{ϕcsf:Vturtsw}N\.P@ l$ --%MnhO@jds?PBF륄8ņ2+/aTZ$^ZhK-v[C׺/tl|e+JKZLsepN,JG>ż#?3?h6U'lH$/~/T]}dL3ggϧxU7X>}71\b_4≷x(ǯ7XICa>]uM;y/xGHǼLf%|Wץ냮]O<@G LfenQ,N!xK_Zk1i3;-:v|ˋES,-`٭wq5yi=s>xUCjg{|7VXzY"p|Qea<[lxt1ǔz}Nj kL$Wx~[6?{uYTveq]x5Wc]^r?x:Փߛ[ӲA84]})^/=/e$]=najiǚ\Kj y%ﰬ,:o?x޿yosOu7~1wwRSx?x~vh鹜>1S3¤UEakG隘x>vxLY-zMmt?&䡹5>|c1 csqp\#gN'ϥ8ruǝvz8,v%ȬcV~Y0'UNgdbt<BRkЯvzA-]yĨM.~vܺFꖗ778$|1oZ-O{ ?4Os$F3.P H}Ri{pѫ!uc{=<:5סpոqLj606:"]:u] ϼry.y9Iŧ W#yˏy}V(r{@uN,.Ɂ&jy'o*~N_5*vsiuSHZnķ0C[8^TK:}}{걋s/΅&r|uЧ}5Z5 Swh2ʮ<Dǵt O ss;OWnWhs }y5>[Jp:p!Řs3E<0#6D1kSĶ@ !v"D&ZN #7bu1EݱGc.;țF8ilmlGޛcÎht]83ܭ\jd+Zj|-BrᄣeFv؈b|P7TG=xn [pyĐxW?+둷ˎ|:]<ĜO>]Ǎ|$qdwيy-ّ '.Q":]<}!n`ϾVs/^5uWN(XHCZ\?C{!zC 9HrÇ=T.y p?:qCV<2ćH\wN0x;sIkxﲫtz`}y\UCHD]`bT/xH|/D/v̍v=EŇQ^9ѵSԛ6/ryq5\d S=SIk֐1=oXM꠹-}>c4|j+1d-LG֟0'" W>aj>b!Ğ#bew+7|΋/b+ؒ5]ZCd;Vjq$gI٢Y`5iXMEMa>p+}]<7P5C-VtZ_/uqp$I<$!߱9X5N=]:5[^"G KƺטNQwkJk֜'g?'G=>i5 kq O9FĐeu䂉6i%ckըQ+&\|\Rå\?wnӗr>kuLhǼ_p!0nqu}>Y|㵥/d.ʅoHmIQZf7tZkhBA9Y/l4 ~/LcIǀ!>#PHˎ\Gި w|_ĸ;$u|Q?X/C8,s# |.{t,=X֪c͏ΐN~ NL|$__YltwWy2 kbʙdk[kkqpQ<>Ox%9~u.:PɯE8ew oWz[벽'm-nq2Džrx]bNk豖icipo/G Im@}rNK[n=?|A!%`{K:؅^]+o#Ń.r̨!c\bH1|ۚ:SشOVVBc_W8c^x8iׅkMRpK.Y#o -Ȼ@VΙBμm Gj*VLDlof7E_ni?kGso>y315t)3,23Oh9dmVl2bU/1"4<ۗZ/wsR˨8?:JlzrMt]KO ]*V=ZBDNl[5qɤCzwC |uɮCHOAaϧXJ/8=WyʯCO 3CM0 bd Ԯݮ#^z?Ԓ`nP^=q[k^-A?Dz9ן)]Ρtt7>R 5A#Opȣ ~b\X'*]ZnHҚzG:vZ@Wy]"$:1LNWrP%9H%s<@/<ۮ{@O̼`OȉI_3p4u8'Ƣ9EAi$/Ħ]_hXWOӾs|0!W:yZv<$:yKT;h|. uWק(ȁDK<ħ* 9X[j>UʕTD.{69sjךBb'uLx=G4\%9$sr$81 wM,+wYۭ)6jcr"~Tg\zYdO }( TN@!'&dI (k9aP<^?>uCvlZK .O|>kpo-j/墙k$>[mytAyo !Vn'&qćJx~c |Lf/hrcl>O|$)+]rBuuʉq|rʖNa]Jp緟wZ磗k"OcS?>'>Gϧ98d<7oN\uOVYLl(+vA(]vݑV=x!@(s.4΍O0|Oa7 d-6S˪>2kcZWq|uL1/^{ m=O1ch<>h>0}<:NzIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail08.png0100644 0000000 0000000 00000165140 12564151525 023140 0ustar000000000 0000000 PNG  IHDR@ԌD IDATxgp$y6{`;rEQ'i[~4q~("Nq$ݧ")ݝag7 tay݅Fh`L/UYi|5YaG=|I0L* .[&U~ a]k\%,^ɂNwrVN\~=@/Lp 3P~-,U"q\sGXd.0oHnvT,HtG[dg?gSu< ($_ʼnZ:߭Vdf_=HK<:^kpȄ[^,pec49讅(E3[jOSihhPkaQW[#u?.255-nhgNI]WZC`LtL^o*(XbԴ% 6FFXz@UB5qDGxiɃ .I7Eoc fhIݼz_$QQQrSx-wߕ֖fIKK_8?I\{~;v\1ǞxB86zrÖ:>c$Jٳ%3^vܦ_o[r}kL@ʌ)Jj|H|Tf̫deeÖ˗/W @(>2R7 \z[mUj( tٕSZ:ߗSoL;arاDunsT$HlԔ8}?+6Gͮ1A-aie?q1ilF(opqX)LyGˇill|YUpӇg<! )`iu+j8O4r7adMk_V?oxb@.\ø{ltT}MNNjٻw:GFFmzD޿ՊmUxNQ߉#exnZ$3݉E G(Mov|pgýܽ#H466hddXZ~h9y P.΍kWN_?\hvAUE6mz%5]nIpu},1BSQ>9.E%:2LT O S>C2 [s/2s{}R 4X9r}\$` =%ko^w8#fdʕk5?83Ѳ>}A<WK(hb ̂< y"` USk8^JN%+7WG 5-ڧ 1Mp[Ç~i: DԵ0% i>f}iIvK!)5 Q;30q{Iygw%psU@Y2F0dgA=xJt\I?;UO[Q9R$%XmAK7eL;{2~>Uyko"ǧAּ?x69r2}DHߢG%x317o!#pZR.OUD!I4f0+ZZr$=~Ƭ?8)a߯-DŠ(^0Ȥ( k9 ?eߘ;"hnY*y޼CzcVDrsᖁDGJuf>yrfJ jPVZ "b67dHfasLK?0I 2sEPӧP nO?l0ZHXfeE%eJLj޿9<|[raE>MA}_7&pxsbڙqܜ2i#32== |Ï6;7nHҍGёUDmHe6X]=URӷ\s%9!18-*⥾-2)*,+@)gbS;(>(swDW.ytol#i0Zƞ={/ާcA f?0è>%]Z9BL٦zdAva $(OЏh5--/F)ѡpqI" g~Aؓ7[!Fccqo,kΆ%}wȴf/=6[Zs'12*4!02iX7yrJs7#N)lo(Hx,lnPSS&vcPm۶.8B9?[1>Fg2Et@GIF|\mY9\/ #1qZ ";dO~㡠Tz-S5>N/cZL.?塓Y6;d.6L5aa;1oDBdOZ_ \ \RX?+W.c:["1¯qkuշp]W\vN.YDY h 9ix\m`.kmO},(:HJM s_嫾;''&[!js5KLtRxg#*27'7+C‘We6!m>w9;Q4yQX/NMOMޅ~Sd(_kXp/Eie{Fn}M0-YZ!504'+Ϛ&Էy/߹#_.8)DWnvΊ "ɎG #.̚ച`%;wXoN&j5f֖;M[ُI9ZpBoFke&ssA`/0:QܝfO-IzeJòibw$Ƚ) 5Itk:tZa^: ``"_E @h yĩШA ``"u\) `0s|j  EA6oSA BC6*A`\ ) `0l(FPMa@(!ktuXMν2*DGn-#q^9QkBm`@gp봨Hxҳ$%=W𶆭 \9ᐦ WY|%A`9::ڥk/9wLM:Ș׷H^^ y@ ptto =$6nFS$)+7*m09%m+4ʹ PpH^!W {ụ́VLIHɓjIJ.k.` ,W"qwws%[C631:.RKoMڦF hE (γF(lP"c$-ottJ25/5(,ۇS-,1X/EM5M35X(6oT64teFDq5xXa?ukBrM\H"@HB2u? k*l^uLE~ln"S mԆIxTJ~@ } }:g$1c%q8x9t V[QHv8֦p\NaNԇqUjZ0Ƒ>L+ Ě IY!Z{Ri'Yks[c,a^ɖ vۨ!wzF\\)\:lO7cz/&L]Hx'~>9scC{ɏm9YiI pvEq ئ`˃xopĎdBAyLɴ*j^1nP<$_YQ"M謽cXD|BiSپX}mwGdf0LXwP+- oKYQ$Ac`+p]4y߸R=sFFm ȴS1Q ru8ΚV9&\T9 Y IDAT2UK^N[Դ(q75yX;𕓞"`+Mk-G~10ZwM1Ѷ(aЛLzf>4^zާ7[\$JNUd> qk?;mz qr\S{.5-6<=!Bf` _>;['# g/RgCPtTUg昙(nM=[Qyg|f LK_ln46>'3xYwt]+@2͉4SS2~{ 5wN{wA}&$,ә܃e'tˀ{H=%-W,k hT JݝvDz]izc!mduųOŦ=%:*ϕ.hCR o(+ʁT"obr)ҭFk59M]aBSU k9t0kx{$:.H(#T'yҢ|Wj[:XQ32"HlTЖ:@/ @{5ôLP׽;L:Up ?pDّ"1>6$?,pCm KڔXĽyy&Ou` ԁ9UEs,R06hZZ.12?%"l:<7Nr'U GwHGyqHNN#` OONW >dbk,gnE6lU$('12"1ΨkS/ɕȋ(-Af6ݿ]xLaܸݣ$_kF`dF^z]!t&Ld%m]*5;ft#N\5Չ S~Ayg_|68M =6i S80K_^9snK*B4qqtSY <$ .ƢRFq߳S%0Y*s/pR CmM]ksӦjrs'SՔ"}lorAG kkQṀoXEbPK{vQǾn:-O(;L7T\ ND'1.NŀʽرRo޺%U {W\vKfĊNJJTtLhͳyf-DIsz~B\"TV+cCQWݞW U*uH[Uwv20*<-=CxWTwb) V}\.U$QQMy~N|97=L*2ۍ-PQD4w+_>~hW`O !^DPU}[D B>w " r󶌎{ ?͙ ZN/WkP]v>>GF ծWDJdqr 0 ^R,x8jVvp'M1f!X3]Y#iRc'?c+%?GeN q7<NNoocY|п>mL,>4|e²kilU5⧏}-4۩-M&?ϼ? -LnԷC7H_^ۥLZ[ ϓ[b/:s='vh:kF0JK4l{x&'%{cl,8_9=VNi!Q͓t lziz;OZ;$>7b-c|l&4jȜG-éy.,!Cg35٘O\à)$⣈~?F~NLNjudd} sܸ1g53 XvWoTB`|8R@`'r fj|vh#!A\PX8"~k Z)\SA` P!xTl7CԤC¡..'A6L1>兩7>"Ʒu|_4u7WMm G *jFJGCuatBz=!exjhH.l;l/d@F8;?oLvO,bsOc{S["g3Xķn#0hZyϱ6 Yb%H|sVS& ӐV 0Z=Sx8&ƓOYLB4b04[|֙oA p `O.iA $BLA>AɅ64"p"dfA `zeDiA bD~̭ ߛf]v3? @h"PSS#Ii\3d!j C76 `0ܯ_iA : @h[鲛6*liA 2653@CF־u\s `״ `XCKc [C[ K `p p!A`k#`pk__:A`  .9d0lm~ֆ:))QQQwyEu̩B?O@ )..{Nbcco&ȓO>j ؘH^^ܻӛoM̴D&Ӆ RӘ͌ԪFFFƍ//ݽq X .}y7ŝv;T K;7; [ u5@999}N*OQ-_WuҐ˿K5zKM۸SyYvȄsR2!"y&E`] >l/44[{OZZZTy\rE\TT$=DGG{R۫d]>cUFRRKUU,mhhjk4O:ҒITgΜ&w _zߗ.]RD䲲2U{'wQ4_?, di9G;--MopѣGrezO r#""\J3}!6 Hrbd&x VpwZG9V%1 N֤LlQ.Ukj۝2<:.qR.vKTdJ5$7:#r ߝê>+U>5K΍y*xO{Юb^!}*ͮm4ͽ=,}Cc*dQ4O)oH7\h7zxO)9`1eB`] 0PS٣;rY<<<\vtvvJss|K_x~255%$5~Ӝ槿_~iu[ПrHl$R666Jrr*i(r\L_.j?Ɉ_yE&Qq9rDk͓^7D悂u.1 9s`q->_ՠ{UgI24u̬t(bqLx$k7">m.S8\;WA*ihӷ[zNk|f^++ F^zrYQ.}-6#@lg<~r إ$gJûqAsؘ(cQPkk[JIAgi^SH:ZX"6T%vCsO(mf<.?%=#}jcw=̇ &svh!hXf5 8 iRC!<RYY͋Bb&o UIp$i-?j!YLUJ`bg C6E4ϚɠOۣ6" s4b__46Gα ĄeZբOQ1>$'z~?)(&?M^=BmV/;b}ם@Vܗ$Pf_h 0n@GRQQ!'} _P7>oFe( &/(IկI<G_!E6""b^P FŶu9Km3=Cm*+ӚJ}ѬlD4ؑ5)nhhřaZ-A|HF豿c5AsxZ@B6g{ޯ" mh\B4G:W/,yvF{d`,h*&Kjc֕MjaRRRHklۧʴd0&*C_$?bkęRjTdɨg>oHX4]irQk IaK 5= ΐYOhS_j|KǨYD$9'% $?yYj@J }dɨ1Ԫ4ѯ_o]Q>9tT&hX \Dut +NɹӃ0]͓ܢM^5-Jt;YB2>ϫ ,H 0"JI)$F\ir !Id+$ZN1a:&-IuTVWKe@BR0O=7j$}N yNQ hwu\s[E/[m09Ez]tO§HbnTVkdM ,+<֒oi9#q~`̀ũTNaF9sbti3 G RYK7[v_6auFZ2<L즖3`Y']?gaԹ"@()B>'~dER4,'$e.v%4Y.rHhJr2ڊ'5NXT}ՓVHd~F4$ej/L7=!ES֙j#hUk[P?f0 +t .ˉ'B]TMa~UFc㴖Pܬd=V̀Ɇ 2E+'a Qo<`9fd14u76725  PG`%\r-|3ԁ03?\#L FJ MA LL8 $TQ2' PGOW ЉGs/&c `0l4 p՚`DdGD5_Wэ3 U\E FQL\8A?dn B`phS\lA 5؄Dd `0 Tz{%!1UikEѮNJMW$p(9W[Ig0 s8쒐2cVD<5IppFūRJ84&&zcF Rp3$sZg08W%)Otձ'0󽐸XefA驪 }lΐyX6f+>uB.yA \bh$RLj 8SZ;DqQ(C:uVfڼ@GGGǤW[{0qJ/% Ҡ 3)07'K{攘pib9yYR/))I5VTeGb\&97 URSר\KyiIOK.FG}1NHONyB;F]mؘIDٙ)&,vT\57HGefvFi۫1 @4"SLL$>% ȈH=887W֟e𺏠݄tmj0bރ#҃<),cשSlvAidM A722< XwA.>2<&HRf sվAohV:ؘ]\{vWe7ub#0ٳJH8p Nr(u9Qf9jνyA%&v&vDuʏF;)$G[:6'( `mjj"˶)iρ*oH0Ьu` >t`!.j>V<^#I:_$ed!nܡ u"ffI{TLp c gOchõ`3R_OK#=??Xw)v<9o p]EJ( It&jgᘀׯ ߚ)%2xZkVerMFiĖ fȨ\|K]}ؑ(::)lG qȯ$@ޭR=zp8@|@2vl vP';," hK1ўH=R-7(h Id-J^ D @ .i`WdBb4*5ʞ]d'b?sЄ KasH̟<1j,H 34<5t*9:\WuʁC3=,.tZP%kY b; f78)C!aQ&'GJF s~G Jk3ˊd9 i^;dMN6W^ZRhRO!_]219)1lja]Ծ23dU"ͼXҵZ(kRGOA¢74e DZ1 t_i7"sLMLRrNNZ{iЫ~<ϹgYQIl2 HԜcnhLadhZZ>77ڡMm;v$r-V#$ M8GߨY_N\>bl/\ 4 (ͺ~55gK7;}b`dMj4+߭R/ڶ@ ?~<Rh @6Y PˬFb6ㄶ6RD┙>2j"49M{A6vAEgӢWX0 tK#6gT78wyPHonCˢl&?:x&`6(32" 4| s MSMj'Oqd`aq4VO$G[y$ʊb`̓m׿ִfC`CMMi7:r#W`Vu!K2ơjvSp$h?:ACZm+4jZ?l`Hrf.$;`So^3c$b^~d`h j0pQe1Kև,5Q|7ASfG#8)xM풃h3}JGCoxSKee`zll|ҡ6 GDMBsyW׊ǎu-S ݪf6vcX2jIMvDIҢ}f% LsA je֢m}+fpc7Tc: 20䄉 9G+?^2:7J']G x(V߽R> |r:H:ڢM `h$t w*), {hЄ\= et$?N`NUVV4c{e X:r὾\WXNRg*3H@MTK띛2xDѐՏUT`!Ht$>$' kKMKsm7Gd|2Ds&3H0 WOkd]K888Z͑Aˢj&MF:(<yt|iAޮDL"P'^O^CFy=5Bm7g<Дx^$W{5&. u_zyf(,lV$FڕG% \>ngLOy$@`#kW]^.}öG׾{ymf %d|67͞ih,z\oӷ3=;wtbމ9x昞ƚQ; ;ڗ75=Ր+ژubvgzbοIG*1Yi $m WSwz `pPϐCdKh/,] , 0L+O Rk0vM29 0N&A 0/iA ɤ2 E5M2C`p8TD஦LO*I^A D|PdTDʪCǠ⹺[z!שX7A P~X WMZA 0ծiA 4$4+~B0G?F͕|+NtPoFRSS_CCCM1x`://o,KKKJkIQQ7}OOv=F ШCnu#Ƕfvi-9RZ!_\^:w.tے/vo&C2b()K\ DeKj.\o"|7 _c[_owo޽&- QS>tGFOY*/kWnʝ>nm:؍mևrZӼtc]4PjJ%W^4 >![]"Ƀ* 3ԕ69T &/k#rK""N\mTy]xDGGY !O\.^%{Ǐ$uiEP&kii8p@{=s:/Ky%33s^>?v ߵk='Qg0'ٳaIOOUWm"˗%))I>,ϟNWuL <$3 靏kYQCq\bb?Wu v&v?W8Et Rs[H~P::e*"i?).%4&HJRn޷ ;WUT4Q M=sPbn7\Zؐ/IoT^zrAZlܒX^%uxU<!Q i)^1<NPeCjd^c`zJJo=vRk */}$Xd?I=0k=}1.:P^W ?Eɏg}VRRR?TqJyJңv}MKC!*?j]/yA {*Pc}(ԧСCIi͊y$x@ilɚ$zxmwS~P| _>}l;#Z=->I~Uh0y^cǥB)-̐ ئ78&G47EEE*mfwBYtJ# si9u N /S;ͪ|M\{@ݎ< |ջI>K&*A,OTN&[W)J9w&嶒ly6ٙ鉪=Ԯ9hD:e@{ "cT2o^Vڠ0\$&z0$`Ah{PS"''za3ЈC&Sj xR\hȯahFl~H^VGr)e&,|'smm:NbP#QJa:~ߖ+)){BV$o~SWVVۏ>H7jMOGWɓ'ne3:Me[)ܦ&Øuq8$M!Jr4: P;`A ;>Mỳ+f CPkAVJ`J d-LhiEGE(_勏{LJA +j4~RU#dCΓU`> 7@e{Ji韵Cc秥q+y g湣/VN~NHMTF@)vt-Nvbj+E2.Y]h2«,`Dg9ݱ9u>+TPuTF00p]IkQhj x(*@4=`XG𧛒L(/ΜB5+סԸ/UjvܧWƢ9S\) GӤD퐦0%o0'*{T GFg€7Jc#QkY-M'kU0YHs6z{`N^.pSKBZmi&BB Iӈ fl;ALtM<_tW]UgVj9De3z  SNXńZ߿!1M9Mhk"忼@ 0Bsjԇlfzse\`_iq K9FDpg?Y!2s#H? OI_Ajz: #+9iZ y5zHHP{5;fEE[o)B9M祗^ZMk~,~8[8D$%Ae1MC+xZ`jFzmPICXw,Ny `W/39ߎHjlԘtf\3p_b|JRG$6uz`~N~PcoZZ }O!*cŸUFU $lwJ 4%iӾ?kZFd;a=~7ۜ:y~+\q+t,}~p@ym>Tӳ %5qyH8 knI2⒔FWB>3+! Q \LK2hPr=}=7V8ORBQGdJc P%/9B4n7J6Ie IDAT̻)'nb]T&o~ L E⹥s 0e3>ܔ- iܖ@{mL!p! `0+^A  cf0+^A  cf0+^A  cf0+^A  cf0+^A  cf0+^A 2뛑CAnA X&@ވA ` x3\MSGA`]0.L ̀!pL uAj2567U2u4C wUG{;$!@{p5q%'qۉ{wӌ@*u I^?==%wA}7[nhlЀ FFVChhlЀ FFVChhlЀ FFVChhlЀ FF{iM}%''SHH=#NE7mDWzBCCOł СCR]wE={G\s=ԵkW{91085`,@KXreNu pNNYb̩рvVayfڻw/=ztBz#FPDD\yy9]Vƍ|gTSSCӧOÇSBBM: dLJh͚5~~~ѱcDŽה*..Ν;STT >>D>p۶meggSiƌ+ܠ ={6EGGk'yzs"uHt`UTPnit(S":qכbSrhPל^@hāTx(Mɥ "et;Sۋ&:JNϧ#TV^E:Xkx]uH3)+k)",.|aݶց)@EGQ'$e QnA)y1Chp|SVn1>RF(ܷ+9"@{fv~6;w (CCu]4k-ߞٜ _ yyy dddPzz:m߾^ر#|\UU(S⒒.K<*++>$ׯ /mŋݻ% @CwuԉJJJdߟZ@ {=zE)ᢣTX\.7@iJ= `S`ӯWy2$254$х zRѵ\~ hgQαF{:NJݾݰhCZf!-[@.KCŗ(.\yLD }QV^-t 55s g1(ЈAQR6w0fМ0WVrdZ,ߞx#0$IԩccKFiӀG&VΝ+WEE[bɥرciʕxԡCÐuժU4rHaÆeD }wb`uj^ K/&r>XG 6P||^=믧\Zd ӦMk95[j_ x0;` DM;= :\TFٲji8ZQ-8aDXM(i}TĠ Lb2.:vvc-l%3STZP+mҿ-\C5 ylaZ,:G݅%alaDGJ\X˰5+1'\aE-]0JwMv}]+ Z6:*\,c<,08{;*$8? L+@6yyyлXp!0tܛ!/?Gpםy]m0GPQe8k~x F(g!)`~Nq#zbO` k?r Bk.Ÿk5~s h͏!uX+2VNMd9 =݆Ԍbb lsf.'V@]6sٶi$X"҃R2 h+8=8X**^h}nZ`(`./a1,VZ}@LLxrݲy}{XU 6gaX uۻR دXțX^!7?s,Ff!0hg] HVA' vb  ȧ=`Z9ۣ3A[<8bS懻^al}`V{:L8y ;yyyQϞ=)::FM^hݻ=*uc=b\Zf袋$ȑ#l26mlhhO>`M8HϢ"w֍.ԩ>jjj>,SSNAWL#G˝#G);k(,4 g67PZf!TP`/*mhXfN]ű/C_LL̉\w!\HH R_M?$322(==oN{/ mYZZ SSS|dd  #\z~o(;+t8^{0 @= @_㖸/%ǩ]t!!_TRN7j{5'CtR8hoCvX.*6XW\q=C H!-..N{Go֬Y(i͝;~o~# E+ !;;[ͬ,9iQ&#%\B?8r-B2,_\Ҭ?aÆ_Nݻw^`i>b=Ф&ʫh<'(7[8sL:,yq&9hW 7G}DZR{%ҁĢ8;޻K}Km̙)ԹtRaw-@30@U@[a苀a;@{ҤIr޿5j[NܰʭC~k՗v/=)8ILU +,]B)p!n+B MZ}{4Юwo5D8~ڰaȵXI9fbCV!&5ooo^b a5'\h԰6Ǔ5laaSs4^:x"q# <~ҫ*is̡nV!PbBRR+`0BmE ň أG9#ZՆE.X"<+W؂o_0 m9Uc M U)tk} 8CF,x,ZHybst0~!/UZKa{^@,l`$W[ȧp>c Y0CgԅKpJX_\OG='\~o9q ) ;^i=v7 S x7)WV͌}pՕƢ2eʔ M 7 ea*̰a1 svRYt+pĐU 6vX+[no4%Ĝ$A7+bCa3z9Fطo_4Xj9t Asxt1 [w>#]a~t[b{̍ "7it_)-ӧ֗9%~AR+Yk+6(x :t=G[00B/[]0 Ӡ ؖ{@9?ԯ? Fj}2&hhuH2v'43F:=/r9@US,r +  $8_{ }|Kd=ڦр@4pZAZǪm4`4`4ж0ض4Ԍ" <˰j4`4ж0ض4Ԍ" <˰j4`4жh1=m[f4`4`4жh V=xkIMMmri   jx00%E<<<暪%DMӥj~AEF-K FFFg0%Xͯ&   FU1V)zy7;,;S6|   0F VZZd_@ U"%MS#0V4ah?'I6̞Hn/y7>}KjҴ&F/WF/ZGg}ӯw XO辠g!I~ȀJ0N^1sz ˝3mwZƄZ__ǼxMtŶEuG[᨟bWO/&M;o)[T/2}-_.b.wdRaݔH_sC:CiEŬ2(RS1ԭ|ECG^}_4WҎҺUlMu]`GoI ى`Qa>e-ux&-;mKɧ֢<}n>~Yd%'a7Qm`7pM?^y#KnItϘr @j{ӛSZM ugKVP~aiS%ݗֵ?<=5յ$_qR枦S}Җl Ne!?>Jp۾Ӿ &.>S3DFOF >XHG%;")*M#EIf]D~~&(cId0;%vރ&OIq(C;(+vAG: Jں;_4`TWM(7'k9f *+hQ``:idvјq)y^:>|8?М.?sxHUVFw } v0It:JѲ? =f$+ @\5 9z}C4qΣnQ=MI7~K,x~gIC2N?CV.[Dch't,f dJ&Bٛ&NI>>vF }Ͷ}AU͎_[[N-FJص2ΈUpu%} qgˁu<^MZj۳K}{kV~,k )>2u5fz:RX iW^ p* IDAT~?={ (ҼZ=co5V98i"N_yy_R{'*W"nF˓t`.=2"O,Y4vsG pmVD͙N_~)mdp}tɏmٿ=M& ަ>PFA i.7l^GO?Gl@^4vnP 'E{\5n:-Y5}v]| Lkv=^y%{yMGnA.Zw?F66_G}˧%9m޴SJw~:K/̧Mzq|ྟSt/~F6~O|UZunfu3({npKhi)!>&eG tˍCq }k<~LXyB QKKE;ccWCvltSuiqm_){v9m"Zs>4ޱIDVyVz y-mfZj32 џ>#ڲi=hˆ52g }07#^{mSHYo/WUuݮG$oӳλ[7 [ofǕƩ4uSp.X3 p_oM[chnvE2HM4fRRjM2)3zFEҤi=_? }v#̠Ҁ\c4kdeӶFFzt\̠/ԩS-^x (?]vQzzie?gL%RzfO زo~ |ѕ0ؕztB7\7FCkmak͟{ R-TPXFF=}͛77Dy@qԙ- [vPtsh8.O'kp ]C{$Pu]#M;-)O+?)};Rj,o:m1h4'WӲk͵fe=hxn,N0.R;\Lz;z-s_y ͚=#oe]WU `sת>פxSiik/G_8";Qj,Xokm<:qݎ{رFK["{~sfw=v74uo(8EJ93&Q>hZNy^Pz&WTQ?ѿOw 1']|%[[o /vI\9ޔx e%E-ݗHL<^@tKoQ%;+}jE%(q^:acthʍ\:lZf 3GF{25Ma'*C݉hK̃2ݿo/n*uSmv[ɟ500z0]=h`r!I܉-"/MݡCnR@M<̖YgdkJM=Vn軠ß'&shٲE#Lla+~J<ѣGiPK6gr=9TP W4ÉR$n{}b#MG>k4^IhZ"yK1@Njĝm΂P sd1Yc>/ƫ4o X99f:KJJ(a^1lgC;-wm[͋.dSnT#j5)+ekdG_8 boo!lتaOa(4}`@?U~2ń ә8Axܦ{)`U[ṽydvGy'(4p`̢ 'D{ 3B')Z֘bс_jK323-}Q898w%w gm]mھ"w7^U<(_ +tê:}z]q1tݼynh2w ;AZ%ϯm;y5X3ƒɣ@l%J?J.=QUr*kԊcM&qu>J弊;7zI_VaVuWe=ktҗ\?FrVJEw覷 &Xb8_@)WGAq d,((̳ԥ[/yf)'Rޑ*сT`c˪|`N}C1|nVnשU\w=fVsڮ:SmիP)0KxNgmݰͦxڃK+|K[_Xx\ ڟ+AʝJD_p[6@{ Ck-f{DN>:iEKgRb9x{9O > k;(zugm^記07 났xr5fͤb6C2WU ]$V֭但;'b<፹+yEtw˩Q^ v9 Ui/blƋqLϜJ䶟']zJ y\yƵ7ڱ#^D&{~N$~^ t ,q ZkwbdoxV~^z>2u'JJ˾CKݵRy} hoVYwȃȕ>]Vۯ6]F߭\D?JsYzeޚֽu-@)yݫysݷiҸ0]]yG~hؠh~Z ꅵw-/''gM佲/Oo;]-,3^):ꣅᱪ}5[7d>}-cJ#G`=lV7hɲsiw\lջ."y?t#=?_~=*,*fpsSZ{*p!ާŋy_}2xZt{|/.ᇙp'A`ڇW1u--5{A@[hs6Fu*f~6g5 fU#(WḒRP8] %> KBTw:8 q"&:(Y5ԓIb5JxurԴ0_mA.a+%jNa⼚_o FIoPkҶ~mMerϋM7MFOCYMwF^aV՜݇ۥog*i@} *Je[ö+L_)MUunO GPm ȅ8I=OlZwFFPn^[.)E۔N .,GRǫcr'^6PDMigMw>uN L^̃`m sCPvItqF5 nD8>ͳP'4n? P5Z׮Wn‚SmribP֚s, [{2xuQצXs5iVrT;jzor4=M|„8x\l ^hp zO=5 *m$<=¼gdU@ԭHyHP30 T2P`FYKǢkЗ C6 %o!.<͛tpD@yA$6T"S'/`2%:< A~gRItm#ӝih/ou;8qN46AN1n/> M2r5L{͜zFl>>Mߠ 48ԁŵpz4- :!MG5 @[ˆ:$ yXi*uy]WOa&cz+{9DC9. QMGA[BiD~:0O ZSr|Fq̣<#.jZyo=!*w ]뺑m=܎aʡ^:$Ĩ(co՟t\uK1qi;w=89դ9C_zicֹ "vs%<{>֕>G'~!̇ 7I0!nKCcMi|bC>X(ACwʺ-0Z755Y}Hkr{\v G^,!%Vp @m`q 88,`O9x–.[lMHt! sr`N}#в-*ǡq.\pbZO!`1=G `dr"o0r+x0iT칚:AL{KPhu1:Fgsˋv~QLN!GA#ƞ:/?1{(jEdž5p7 n>A&Y',]tv _|~#I~n&0]qgJCY.| 2]$hl߼]kiҴ $@@t%qPUhsKW65AitcR7*/}@KOGBoZ)uZ9`S :dz/p~Įeo̫MC)t("O)5գg&` ;>q3xJ߮Xl=?n 84 ZչInB]Vv6_i[Y7M+Fⲋi2u[勏Ц߉b,[Rx·{W  |tXw*]Veh3Nx!,^MF?8Z:x]pP+9qw\ٕ}m*Wǐlk3庐ݠ]0<:/.fL.rZ%БM>8#fҾx^R^NJO#1:R=OnՆakHG~ߕ8XJGmlJA},^үbk7n7yrC8Hyy(Gv/@xC=h4&+ x >;:aΘ 0KMt0y{""Œ͂9HǍF6m*ݺ!%MO&7^Rb<{Sx #CAgzx( @ё^soI(ӒE})cU^RR%;ףPx87#Qרv ި쎡.]D4cTVrD+vqXOpk:Gd?q#b$RbN~*>{#I;x}G:.GAx)ڱs?=8}Bwcg۴p|CY{~N%#/t.q;%=v8s{اjY&+.yiBB ~K/6rs̰5>8dlі=4bH?뎛ySGR.}]uFZr#Ǡ :[+-_#$>*[+IW٧v{P))ztK.:D ?ȈNv>Xo2>/)Ȥ_/o،}1aϞ\<$q$%O#ep#"?^eZHou+)=e/+,a/^ZQ&)j),辇rp2yn{OkSxC< VZ\u%%?'5IkV}KzmhZ~ Ȧ,sg}?g-`_e.0Cb9x]~ŃK/k8Wnqu! `ͩef^xؗ[LZV}m=^rхgũ+'o )ŋn!*+={-['&:j~C'sWS'{ޏES믿n;v Rƽe92B} IDAT6;:MyfľyW_Ds՗}D\q4S=oʻpz^hj>;bY+ǹ߯/_Vv--='eGUC%~|6Pw#;&_zv>s-U-o#}pgR(;1EcFaΌmo"%4ǖN= heb),>t!]dY_]|{ ޔ[7}&<% N>pv_I~ 6~o `,j2u4vtOA[+ȏWzNbҋL~F mO@>ItyS؃K-bt|++h.nv߽IKߧ2-ax  ]%s߻ăKÀM=I;8՗sqrj_,Չ7n, _aytk*k#b"K{%"Gv?Y2)fEV>j"KJ2g3ɒ)R_r=817[nO]`'}н?^ϠmQ׮@xרmؼ]6 4{A{R6o#sRmNN]zlfq쑚{&lR~ovy1zA!W z\~rL:ix9OسZLI?n8W?wvLWqo!x2$`hۙAk5W7@pTn{;!4uDvˮJIUB_><LGc AɁᖗg#=#g_^zERW\.a j7 WvȐ8I#6Ȯ]z~[>`f4a%$cMW\q{`Etc}?M`Sy @{Y:m"[yya*I~x8d׃"##ǟTed+~ְCQVz&OGl._[7K[K}iw+M x@klT7;2bUp$oYӕ5ڛаU~)t+9<_<{aWWJ돳.bu/!e}dA[IvB}p~ z2he!z<hi v!}ԵBy\ȓgd [}?îďdINIe ƀ5.v{39Rsm4sI)ރ}9ħbx'~}tdf L(\y[ ozog!|G:OW߰6gH%Eyp #̮x]b`^ [~؟|#]vLf\H7pt<"ywjwnl}ٶ#NɆV7Ţ岵baBfvW 7~c7r-vaSu}٫s<~덒rJ^%%u؝r2۳gtxy1EqlAfwxHoY*~ cm~t^]z@?0)))%i)yZj̭`ȟ^ ,2B}Y8n:(ه F̓ lݾ.ڕ?6.^^wWaÖ ,X}SR(:7. Je͢Ex yWSeݷ^}opDCw\ZJ9㡙ju8#7ۿ}MV퐵 p-Y2MHUW[dMZmpMi O!ͯ5_ќSk~7} !0{sGoM:s^=ߗSNJ1T#v`C$tIHΔC9Mn62ֽ86n)&@xAJ(jWADv#&UΡLufX1d0Çxz ?<%=';[bwn\3N]nT:ט?/x۹c07` a>ӠCOg 4@3σvKplIUk7av^Ujރ'噤ڗR*ҽ|oCf:dz՟^T[A4?M4F1ybH~*>=^M  ;Qm)#u>ȍ[Hԇm'> }z!kmjy/^~X=O?4 K9~*?dSMΉb_Z6#%k]֒2LP*U.k]{%h~Xa+{åW} '݋2y/N=6Kco>'k\Ty;$Zfi͠Gvϙ͋my i {OIX@{yUk;[w kh+Shnq6ۆh;?;_<`߻Rx6/cN 8VbLɲ2߾l`ЖR-Ƒ#8ϵ~BiT}wq^t|#}k8NÜ}-<8z@ )f'JL٭q|łX??ߨI_-]&SeP,eƌF?ֲw’jys|+V5L꾇woH5`G]_XQxrx|[wɫ|Jz ^Ql}:b9sb_u9[uљej%유yYQ^}/~*l_"-]-aw\vQK#wu uj=Εq{N~ԦnṀl٫o}̼⸼oT{R8eWWb壔ƿ)I\?PtM`Vv@=WxLᛦs?͆Uy.?bxh vm\s~*; c𤷽G}x(6vݵC_b[MނwhxI:Swу> Bٵ&.],/{'yn[MlwmnUWm͖Jh3Ż Ku_ff<7pqeX8/;46԰2VFk~V q0OG;:C彣#yV )%os_f薮Xͫğ˾g7[+e1 `Rׅa$!wM;xUV[{:>BޛD;/C"[VÞ>m塃`mlz?>Lٛ29BIۡcgpiS?[6X?P{nenݺl|iѡ/"9uǓݚz9ݻ1ȓVvl4W &ϾZBw/(y#2z?ϳ]=m7A}6&/CR8{מּk?[_ܿs҇7/{m&3??-NA + >KkL=짞zRmV3b/O>6Fh'1?=$.Dq}؋Iwߦ|.M,foC;-׫WOypk;|89d5W_Sũ"OK6MVw{Y(u& _d~'^2ξ0\Xд>GGNӁ?;G#>)u'^O) !'E.([\G :*9^*wkkrZpr4W:ٱ)]og=Nl↋bp $AGϝ?w|@ݻEw7哘־:""¸4Yg̖i%kYM,-|Q|*YJ#>ky޶O>| b~9#AY {}զZs_"A4~5"X&   )Eߛ1V0bXHkZ]hhi@M˱q&g-Ԫf4`4pZ41Jc։h atiҍ Zh Y(3w&hhDh VaNݤ  Vtܲ}-4'["<ܲ7@!v^r?ӆ[ƒc4`4p5K-=zx1o΀)-kG𞛓Fc?ٻ-wP7$F 𗖲?tVEz=6 yN VVm#F9-@SSр !,X*C4r$NH3XğJL9#e"^]=MP>Q ܹc j*0084pH) &юH`JC hO[y eo| tu~XlDm"J՚Fg|}6*PUq/'1 ,㵂CG[+,>\ϓt`G_Y;/?z!tN0Uzu*fnAOL]f[2rǏS79Z`񮥅e%4jV/vZ^Ow+5Rm=B@j'ھcϋVr`Kg45 k>Z$S[rsO^iMh)~\.V"h3.-:.^p̣L͓rǣhҌNV5<5V0돟˯Fn;ĠI=Ǔo*)O]2F8 G8:ϖ6Q-o?7Dl$5-k V qGū&Tor9ja:II *o`ճ>mGUmJ˨k{[~kΫXt܉ NtF^+}w<Oͣ5)ڰAl ~{pP> rjpB+r V<0M¢ZDI?4Pb➄jSHSkё_FKѲg¿y qQh)}ŗk\[7+J!nRԬxqU^9 PPAznAKUW4? i *4֕נUS΃sԋ4k;^c 5:ܧyTOm1n^/H~ 4` ܡTutt`Vrʦ4}!c͋5N5Uu~ S݀wҝ]!. *TYO_񃂾AL8 5s·rJvt4z2Bf]k{ mM+s5?K-@Zh]ss e]^[XetOc;`=VWW. ɆQUG5uhVWط1No<<@W?5N$$HA>i 7?r>8]Aj%TYOMTKJ>-0q~kG}*Hmg-wqxq:5uq8.k]N.]aw|:oMS}Y?t:|š!u QCjs v *{ (T{zqB ?NM頧ZڊfqLnմtTEÚ2|]yzuXN\.e ᛏJDZOKil&JF(IE]^De'*w]Qs'5>G{htti:˧;0(:ul}LsRUM3,r488][0/fDx^*-rΜȕs^[G(wkTYS)y@BG9/U)w*]VC)0=[YV^`A .cS#j*: ~۷)ZtQaz-u7)eg A *Wq'D 靀O(u|t |ӏss@ 6aߟ%'!KAc@yڪVGv̿1cj ,l=&g{ ;,Տ4O6+'{|JT!ijtitqm=t,!+?*Xqh!VѼkQTPJJ*+RqE M !gb A|,#纑I #z:(>CiҖ('-;5}9z-ǚNWytGhbh xXhz?  SHS9TW+AS*tEzum0 nu `Q@'C+Ƕ-_a:LZ PZA0Tew#(&?_ԫ9uy %x\V܋M&/~1ާ ,c;Eta!N]::D |$t!dlδ. =逞ʫr'?ʣ}C*ʁ_;=\г#}B(P$)tY2"yÅuotB $ F <ϞeSt`__< *iMLjKބ DFxБ0`t!dBʗBRLH*;]^ɁuS:4FpOWݸAݴ}[]Ї=q/i93T:r IDATNT--g BAQ1HAskK߬)g*z8OMŭ3-UVnMKb6>SxEg:.|̻lZ60ϊ.n7Vn o',dp~~9ۏj/y{$5UEC x?ŕ4O kC<b+?WH{;xJ!<螝™y~AG+= K _ږd5cR=7J_j, 6@K?XYD>:b (1D/^@S\li{ vh~q8P7>1vʤ5No=exx0T\!b {pՋn7{/Mݓǖq<$w6H+7K_uk /:Z.G.ݝ:㿜I3dڹ[hv> o[8%2^xH3'GN6vD!Cek oPe=@Гu et` =5 ϯ𠹊.z'Rp5ޕ@uT7̾i4hv,K2Ɩ1KNC1;>s9$BINN $!8@@m6;6elɒF}e&wOգz_zuW럡u^M܄sf9glwk?~1rBO.Cĝt}GqJw޳~[ίʹg9?t Hu{=L`鲋Ӻծ&i/Ao]Iu[>Gі s.(4(vwd:J}9Gx31 ;"#E֮rM1^XWxY'-7n<V,~+k>@ a lkWh3< ~$}'_SRn?ou(Vq3wCtώ}YinTY&:}]o8ItY>M\ߏ,Aþ]Qe>Oqc2![KGԙbFR /K13P|>|̍Q?_it*xRL{H.#䇂{ؓ5r|B{ϵ;i 7[Cô~vG3}wQ&)/LIֽ"vqӺ36 \^`[U./~@Р} /OH%2?{5=FZlWt黟Dw?#qL٩laiF0_4~lylH+Kw + =;GK[R {޴u}F;Hy, 6е.` /릞e=ZJF{c\ǹ#oOn'"/ҼOQXK۶t5W_@үk1 S|EȺ@@Sm??w~w󿳣A7~~z<=~x =38z @7}\7yKv۞9"%_d_oCC<ߎXv ^ |}NJgt0f?EA-F׶4VG&s'<-jv 0 v+T07YXJl|w7+2Ghm%mQ_ /|̒0!06_=6"EMӏt=o* C`)"<ERǨ"p`2>I=~ 4xwu7m!3~DMM^0JSww 2/Y~ktr5LnK1!PDRlZ=0ib.J" xl|6o9<@MM4/9Ey%:/C0Ƞy%=8Gda оRYrLp\ΘEyx,ʶ2nAwy򍼈s'C_ "@䁴G{Ѕij '~IN2\$y sؐHuxQ{83\&.+ Ѕ;|Vic7yȯɵ_r>C\Y( ps A4H%JąX"ヴ bBC]j+h&t.QWHs Դ-#h-`xAK5Ē@9rd <k.t¸%"qMqуF:؇LSY&ȥгRŎ4Y*( Q ; i ۜ ^Ү&6 [~x8/{假+GU^!OԽ יA%žf9R(,:xY ZZZ$^QA<AV@*Q: ãڰA :)C]Ӗ[ʹV/JG>1Hk׼ Qb*\f+d AiA/䑺XV~srbz V:W@X?d| K\NX׎G WjVpv |S}.taz_@fVLCO3r´ZRYk,H/ 2 n@(8DZD@v[#!}c Dbq3t><ǃ\@)1rxxETe.~g] V"}S@ʁy)(;xIkW]]kBGQBхCɪv>45s_˺'DJvp o YL Mxa$>:r/.{:qI* ܗ􍞎Z:YZ@·""  aTGߛ6[TKay|_C' h\yh *Go8mVY6jW#6O[@@ \ڴ^!Pl!,N2z_MvוͷVF4᭡/.L~ХdQ)TB7 @`Շ ؔ qC _vM#(0')KYimvY|4F9[@"Pb5<@(xA@:yS9%M逈õ @QJ.g%v;Sop@P *xj|)#HFC#H4D|p? t+jJГf ?Oii] +-!p+^zC-zf*QAJzU9U*/`6O}&s r/C8,Ex]t?? ]ȲZU˷S-ZB ˗Bj\ y!Aw|ۏ<,T@M2,ՙγ;Ll2Nб{s7A#`@!`XG_֙`B3F(GJ`r!`)534 ҉GyJKdNX:6 YSܚ{rj)n Y@eEkF'wq.l 5bVP0dr<ȓy[Tv&ჅU5!ɉ1ڻjimUks9נ.C f^YH1z?m`wt2ON'O=H{xf[EV8-[n CA cO `;AS,-N?ozuuj8>>J?JW/m[iu4oRd*AC#EwxYpm&YlBc#4p:xFYZIGtbVr%͒մb_Y̛\b^g'SX0  )ldGg72 &hH'Q`9:5/trpA:{j+!`̇via1J;v{R,ŚGVpxzK{{4}7mLC#x !`C =f ss #C'ienL ֶjv>rg0 S!o,0h \uBܩ/vꦑъD!p!0::Fm-:\ c+4 )am C C(&~tҽ ^`*&KT=r/#>N3TM0.BzN=O 1+%n q(5}dY21N^x@f#v   yXŭ^$*$] ~Tcjك^ ՟JQBh?Fr,,=Y. S^~.loch"A/w~J>h)-&h ˯9LB ^ힰ0e p?PI)_G;UӶlhGG];[os9_wjz ~/=ȣrn7CC0TH2k;Tѭ;uwz&*@~:z,Fy9އed !5 W _6ȶ2 ` KuK-#O(Kӏ"nx TvD@|ZMJgR ana uER~ ?཯Kk(=K Hη]K\r1uwuѽO/lLPgz{z׿]x!Kzeڕߢ+߿ ^n9G *uW8/CB~6{2 dfu/ЖGAA_b@׿uU/;r}%wV=%.nb4.k?3MX Tِg^LϺ䢢ſ{7ӍxouY po}'mڰ.zyiuqS~K/ b_-i~wн'NT }Mk'K!H 2|S}& ēiCEM9$kyfy}o+~R[kx=\]buy!O.]3{.["/@xDm`ڦYC[cu{wy#6,+xOL&U' dI J͍qt;K( :.]M#ayqI!H}yh-"Un|V%=<|t^}{[t 9Iĸ&s,aco'/[;,[g fsBWvرvhzL/_)cl*f#&w;_cy|#~O){7m}ዴ>gKnQuXk3W\4Xi옏u7W^PWO0l6; ǟ34KéغE\oCP!<hD7қZz_Nyl6N|>qxFހQRtx8)K0 K x{Rw[ nL u7|z葜N4Dsճk]9p [m9W,HcN+4\׻*y9h}!o=(/3旞 5rAM@ٹ8W;ME8C)e],'Pǣɉ IP—]81 Y9s6$XP:dreuD"x1H1yre; #]]@gڱ<~Ô ^PΦ&Y&GdĎ*ٙ_=O]~9Rg{pmܲhUZ{s~r('' 8 %#x IDAT 7~2>C@Ag]f`eXi\4N8.7 H6du o}94fC"׸)";lcp&5?(jX&ɏJ'Y[qZī僁?8ܱ/}ǎfai(rٳɂօp}\0e^ 1Q}W8ċ, ]>ǗJ`'PQUY8 $ndMl~=riTi*sBlDyqҴ4x2Ad)>E*hap_E8TXbiz6@V -:ZhSYMX7,fp<ʰt΃EA -4'` /jOp51qrUA ڱQLsM> `N.+1iў.2SHQxN4v/xX̆"t!BmAbf t%4ר <#lɊQ2r>a: "Bx#ac5_d\z!.:~L۟B! tsxvgl_k2J}x?'$ `#,~0Nj)g!jvF]3o`A]s=~iz:J :)%5b. b1|1Yd$RД255 cuU!M}-G`kԫTm E1/D0(,rm:"PYT9_Yt7s'C'݄BIN Riw4^c4s#ɞnN2!NۓieÄ 3tm%IQKGG=2nzr 1~_-ҡx'V.).8F9-[NCwq f(g--<#NxcG{'{hjq1dOpsÜ_ kO2 y8=t@ !`,eO<;~pt tt 566SߪUӼ8WF0xbb:iӦLOM H&psN0 śZV@|MMtκs(t^ J| }[GǏo<2D)$k~1I#2kQM!`)`Fc1n /+h9crg`ځa?F Z?t]qa]¸q#?mEC2IGh쵢eOOX t`!n6U+/^*\`^0Own;?ՏqU><߿&aa!DZ0<7I\ps|xWp`^ r}<&:Gl/FZ>^{b:x^x>oɃj<+ފ5ٳQTQ` Q܂y0rp\F/91 Ͻ*Ə̌v'8ڰ{@jRƏTVWc͗QwY"ag+T=q:ƏҏGʨT{K~~k)_t!ݣ|°]孥F6~?M!f3oOkq&Wsqa0[` x4h_qV\7^}p\72Onnyy%>DW/yRZq {!Bjb8~f J\9qv΃E$sfDbr<f?" j~/ 3O77n&0婭K&|v&w5ŗ_/Y,?q}?}0YU4`fϘ*w?Հ% ~HU6e2^._vm.?|I𭫯ƋK"G!..nj=e^/_{ĕ{D_&˯o' 8(Y՗iڳ,\l9s w{nZV***S3fa;e k7aۻ=fשAwڀeXܧI(I^z=p=ϻݛH|k /fUq!OII}YNU@ `̜5 ZQYS^'>_/ru./*K4tP[)Z3mƁB~xIJZ\:?I6xc =^X Gu%t[ ݎ%qO]x璦L#&&V"g@.)O%`{=u4?0jՃŽ?]?rnm2*'rm*6OF)QP'N.kBr*kHNPǏ"TWUxn֠ /`(pԷP2Pf~?6lSf$wߝgƕTmgD4-v]I׆ׯW,1Ǐ#bx_or&N^j*^|Y#."\A߸*u-Nw)=3^\77Q9*mՄ{\7VILXؠ9j/OٯH3-|JJJ.sOI{- Ja':?#Kr ?Vyޓ/kD 6 I|m,.<_cࡸNĄ.D??/߉񮈎NՓx`'M&R#G>^{=>ϗ<1-G7av8tnK g:*t7TTSW^0p*:>JZRkF lrmeYYg~Ů;{nX{/؉&_[nŗΨ"iڵCɣw bq߯a}Hjkuåq%׎j^}=M204 P.'"#RRSyU5gR>h&b)aDJ(>NIyqq^ 3C$6i \|آY(wBG13N ?+͛ǖp%`#j͜eTAInG4_{nb,qºgwfQ3 OKf>OqnqRm˥Mox vRsQAX=InڍK]CncUtMyg 1s]xFOHV 0mJU^ݐ T8$Gwȡ%lqU1Ȃ_-'7%{cUc:j3#2܄iN(vE4ncG` Af|i>dD#]u>x bccp;iLZF&PI($@a0|8R}a 1rʫpɯT~N?oX!$B<e-MtwŅT;*~h\[`xvq??ou]M@ϛ (iKw屆P`2n~,q%v2"(uvF^*f8lpGUƁ .K/6s4fA8q[娨~+ ]gH!"]Um,Z m/qD΋R+nӼ&Άe[ư\m|%s_q'OQgQI#R/{0etR 1'piEqGANggN4a"6.u;VN>4(cĈw`v,+iǣV grOO>_3Նubc޹{^WPDxd D7x]#AZv13$HNIB09qfa[NVFDڝFi`H@;/٩@JB4PsuYaʫu"G+(9.51_:7<*.σO? [ڨO`."\E1ڀ2v u&_ѕ"})EN}ϊF~A52||ܽo쭃WIӓq#)o!@{!ҹAI,}ղo kx?)$%?j[hߖĄ$L7֮&.TxN*6nق c"Ar{ $gLrZ]|\CW|'q?e4 0qH˒8&xư'ʮ_5Iƍ%v~R9P#ޘ%({bxN,&z}Ф&zJ-$FJYߴ-tP /|(óI;YQeؽo?V8L?,<* NhL_|I``s@|l gfPZYIm\Vgy8|:F@#Yk!v݃Elh4}x/[Y#iF@#'6HFk4}L-N#E,M鋠6k4}k ojJF%Zlh ӧF@#>~Za磖 U ..>`98hom Fرذn=Np!k/+h3fAO^Z6q*lۺ 2:g֠Gĸ 1yGdN#h b6 )9Kj+zj+Q]Q6b}9I0T8܇9| 1\PVi6sݯ%:o Ħ! 0|64MA#eco1.9!Hs9!yrQȝ@vqn6>i= k0f|ħx7bpm"*aBKNǘ q:0GXWN#_C'S J&UBW>əkNF'q)Wc/{jq01[b}=QL.E(j:8keLltohpL2mN g0v j3)OfnL$`y"닠p;dQfٛzA]`lK I }_-bR3Td-̲Vc"-k R2e}'m]q~(+OeHKMhRUfk 23 R;~ uvZ©w&ŲϾDZG/,.eKMءY.KŻEX|jU&ڣC848#HC/3 #ߴd Adg/  SJŃa֕sqy3ClcՆxϐ=<U>d헏Ŋ'J(m LP@$"z -bXXea܎"oSX˹s2ܶ&jyp5<^CZJ˪|-^==Z m U]gC f_уSExM8dM=qnԿ'euB~nZ<.ząg >6fnB#l1.J:U()DzjFW]ᖘoH1ǁ!?q5|-N V!v%Zg48~r8"2Qc96P%s/G|\.EuD{^ o(狐WT;Q!AN 7Yb1S,  ;%<(hur Mw+c ۂ=hKZ=X݊ICS_\w=J3(p뎽y%kvk&qa28g⽏Wb9qQWt)Fݏ-$ɣøh)9q˕3إD  1q0ր#M7Mq1cd#oole^ MV[͓?{F\K5ZQ-;ҷMVO$WueqfDŎ[]\ ~tBl_^RyPUuHIWaY)(*@~cدTꢹ^ӊo^rNY@]J$`5 qA=`o !Ҷ_G91|d!&*R%9w3,UU3;L[39JnN6.//AIIy5 IDAT v[-ǖǂS_F΃b<^|F;.7ΏU Ga3U`WOO܀h l |X\ ~k w_ LS3;&puS /jid>CD˴Myʹ QǗOE}M9^}⿕-|K~r;8JԥOޭg}DZ3 =*NP#S ʽguZiˠ9Fj u- J(Q8x@bc쉒VU%X 4~ &yրiZ8SZyߩ9a񹹸efw58-9 gb:\Zs|k,օ*ŝ+.c^[p^8Ɠg#u uhzS}"ZTzG%'1lN2_¾W~}O~ғh'hE/l LT#8weE"g][ё..3nۗ2iԺsƭw6hNHMĸ9 %MgCt4]cp}%j]Qvgf̚EPQLB:1HNC4gyXz{jd%ɬƺC4?9!DOyH|GB 2̘f懃>h g#'V7Y#XGlnF@#plc40F/ ``_ͺ@ N#MLg,7nF#`ZFDんV;0yb4.~&3rgL>h4A" 0Ht4FC@wOu4 $P:F@#p! 컧E@h (M#8xS"F H4 }h|Rdi4]K֢y(/)H臈HnAN{JO!=3S'O!/u5@@dM[YCSwpoڞ!_qQ;ΙɯB#86Y?q2 JCUE+)< `Ԉa*DGh4]aC0n$Tj!袂&d)H;F@#,=+5AW-(7Ԁh4=(B%K2G{cSh4݂2E8+(n~{Ż+e[]1ůmvBz:P# ۑv9%)^ l8܀S$D ?Yg>؁o.:P#p&((}O,m((;E,v㪇Y;.Y1Hd qyg'PTT ߿̈́b,3qA qox̉K΃&W\޸;@jC>4]KHIɸy58#Q{i,:I4$>8{H~nNk9blxzɕ-R[OTKÇwŢE0lذS65>.6YiA'r~GEG1HgIbf~~r~մA Gk&@y7!3ka"#?gqJID.;\[ [sIv;W*uֵImqU;4L]`xTXcd49K@I}H}tF Ho.BJX` Yn:O&UIlY`Y>7IrNSPvC$ n m{{`>&,jlfdD&b%J/I^'2:Pof2Y qѢcKQgڨ!d*&qRuPF0so=_B4Ҫ@7AN##Dd!YXH~SzD]۫NzȀ^&sBa^QPvCB.Sӌ83bT=l݌$V+:o6 fQ)|#i L"Lpsv(vzHf9HxBvaa^vɵADhgG3 9u'. oi~v:J{Iw*2K|'QUxpĉHD6~\MJ)>2B%.55TKL!,JzT]SA X+(EAs1ע >N]ѩC}auEPqgmi$@!C'XDCBN2VmIAb"r4x֨0|zN AY [He"<:;`[uX/GLRIHlf'en.YuxwnfSz,~tK^Ǯ`#_5o1V?7¨0=^.kFӈ{%g'%Zk?sB'aؽ0K7h' hɽd2_ ܐ|rqW%ڵk}D#!DoF`;"ҠqȠHG]>+f)ҩP~pB,F\4$7??;a+TEVe7ôAbR.q!h#Z Nc1Fk4pP&{0t/8uk" CFU6G1Rz'W̨c#udsNTUUh/޽{!-\]F6` 7G'Kqq>ݽ^$#2[>([Q]+^$y$'Ouǯ=ohJo6LF^{ TX1{E v͉9ppdrss!]{[n5`ƍ뮻᠝v} Fl㓞:tw*v?:" 0Ɗ$xɴoPtvt5TIL%u/d] wD(#p DJ3H׃GR;g6~>nɿ sϝsΣ# 2=.вyqEnԗ;aBu{;/{L0۶mSrfݭފ^xAyI\#?Y1tP⣏>RqB9<_}s0sVfDvj\ f){P)Mà((8X$LfDݣcD?a|%5DN*T6Y wub .V7gc#oؠ #-&sɓf#arJӉ0ρW1`h8vq,A:|!:֯_2 P 2Y555>B|ꩧT7Y"*yo"`"IaɈw23̈!H NRR8}\yQ$4P^mX:*wL$H%nQ_xЫ TUE\t"0,]8B|0vHpX"I8 /ϫpN6P4a3O<9Ǐ5\NFs;&O*++$?PUpW*42j*?JmشʒqcR[w]tt$h"-@{,YӐ/Ʒt8K܎8'%@KC<4UMv|?:miP}DވXDcgXb!_E; Ͼd aro! ] S8ahšZT#6.7r15fίsP]]ʪjfTPZ^b[ V*~;; ,0`.э DEqjvZ至#a^{ytOBU&_Z'x W`h/)eα>O%;&ULl+ \<l=xa-$A?s!CE~~gܨʅ ԍKXdjPm++0@Out6.RU8ef/_Bi\9] J$o w !|!^{ /2bbb{0r6G$-[Fs/]R&: 'p+[0c6l;>z{WVKGIa'rY;\X8ځ;0㺽_ t#](!@&^HudLůvS PsQYWD&6ɍ@;LU&6~:xj f,X@[,DR';d48>>o/'u)<Aܘ;܅Ya{k磨 r38@&7k/dlYHYō[KkiL JF9Juqԥ=OBυ\H GѸH.P#)@9N}JJLLr=ݹ]^s]{+_TLm[|9>3>$6{2AN\3R0%ǩCV܎p'#K=FKWi:`^Iu]TtӦMH! p9nI|`! x4*ƕ4lӌfdW!4pr)_H8DTjHGƥEv|Z:"ܘ,>`0:܅a\:XD{뀹ގ7;BS 9+:29!8f1b6F' R4zB}Nj;<|CVHǭmvC7>! 9Q(bR.4jw>/cԊ.|R9{Te,)ENʄ.JulA DIi>7Uʄ`|W4,4ݏ@|ow:-%e5MD*HXH(_(% kfH ^ʅD†#p MG 'ІYY1f9<\$G|e` WquW4+1VZEң(wf H|'3/D!E4ݏ!8YAbOml2ix9RsNv?'25.$foosN Ilf)Shi`;Wqa &p4JU9eL(XIG0 /14mL(vOa6o߾>#4F;r<|gҌ$$Ts: -FcS'0(+2 !NM+ew!ʅn3}x#pT FEֶR" ɱQ'[gqvk[.SdS%>#}|VrJu*;aJf|4@nF mNC<|a{^v׹G>,܈ta]vYЫSߐמVtp9$43V~{f'-t{-BOTCMPwGtjF!нrk.H#F@`kLF@#GGnnF@#M1>@A@`Ѻ@k4Dh4}`#fj4g9A`[i4 `6e7VWW#CI#ehe7LWW#CI#ehe7LWW#CI#emLvl݂ ؇Ґ )%aIhE dS;F Ĝ& DrOSwe765sT.XV{p8O+D]V*w8Uj=(9\ 5=rݖmsƗUq4 ΊAb\D./;[" IDATEEE+@CMHp˦xg1z@sB/gؙ DGpQ/<22"Grc$:EurIn!J mCc9 `ꌙ0yJ@i:ۻ&&ebnsj~fyκV8H%Wb@v+=yZ!һヒEaذa!'$cEFr"jQoAO$?ˌ0z64&QDɭ`k h٘t(Rd$6MBt$D=+!@g8xf-E{=0n#=eP5dqnva䅬,r֭Yxd$);`YHN"ɾn'' =$'E'NRG_?SHP#9ɠ74^EFDd!YPCƊhـ[D ؼdS4ԡ,9e<$X\ZDTV$u!Bj$*"Qs++iqkFΤ:(>Hvdʇi\$Pr64 i ȳ.9,$apv(vzݕR=q  KM׆gCr2&a,TVEz'"LԋD)ETҞDe+EWFI&3C87(y#\xᅁi~gOT]n<0}`TmEU. NGJR,FXYJ=߳{w":se8gqTI0! P/JJ=BYH"y8sA⯐uܰ'y#=M!yyκ =nfi|E-a'ݢ >{s}Q5 #1 }+  kI&5|P&.mǪru2t¯bfpi'eB)  QYaCy 6jQ]YͣA+*yTyPSSCGZVWw]Q8 R2\;bccUm_^z)rss}:7oUGC=~饗t3g?)ݼK"y\~0`oxgNT%N rTպǪǏjY\όHLpTz^^YЙzIW鼤N%!<^4$ ůOFnvzpF6R=g&<cחb-P' TK}|DBNy cMh y~w/Ν;c<o0_7tEZ[,\,׮]^{ i9[j'z=w ۽|r|HOO=\x\6/={ߞ#5O]3j18'WzgC6*`ǡRAT<&:r`1;0yHwrQ(E?a|E0:@쉮I4!Nx6B2+!͔u|4l*<)]u{PSK,[S۷'Ta3F/eTVtL$ 94oظn73RPA/Oty\lA$.剓]6\ٯ <@3luP0$ڜQYy5VXPS@Mm% Q]#~Qv\T]Ú<٘ƉZB@5,E /' R^gH]7`Ue>"&ƴiӐ_j}PSHWVfR_}U+]kqwqc(..HT.A@FMH"`G?a HK a3q"n.[⢣#UxKw,`:4 *զHonowazCdK:iE v9NE ,&x |P cOavY ~6xwN˖-HZsi} M>xrau&]K.e0 TRʕ+!HbN_ ]vYڣ!`!%"HJ妠+Za\Čds) üF#YI^wA""e2k=;ҍo\> ϾH|0/ IU&#(k4Iz&8~²cWUؽ:?[1X=ɗOy_]f7'hUo3fH*]㺥,N뼓_JW?p!94¼k.% Ld&?'=q xw.&'_RqJ(|EZܶmnf-ծg#pHHbǘG#?]e͈SMH<]u9.7R9˟ZXvF˶q(|s!u8C$(hcWb8*-NV3gxPmrX\[,ʚG=6TŁ3%UӸzP@ɍ!sE5qoYڱRW.@]%Fh'Q18yBTxzu]*Ɉg_|NF~Eo>&onF~ 49!C)So~e'͛.]Tu[UL{8,D']`@#i󮢞øOzSOt`!Γo7>}!:1'a+ws}B#~G~GP$Ay!z;%6E52LkE̗ -O٣j(-NzʹQB1+"8x`: x7Ερ!"&3c4J@uRbJy(e[okHpW9ͦ$4Ύ;V*K<́ WRRҧ)bBm$ΡC]-rrr0|p>^=a˸!0U1fˤNVUVaH0!]V8;\QQo=tOh]M;UL֚ϚSEbHv=\r%hՓT4,>P#⩪%v" E=LfWT"$ 7$3Ќ*Ot6jcPT郉sڿb^2h  9CPQ)w:I'CH%d1N& CBnw+5^xD*Lap!Y K&wBrcў+3;Pt{ly ɍ$GPXdOPI^FD*@Wddj9dF KI<(6G[>$zG /W5E3?ΐZr!!0W,HÒE.]\VX^^A %GNsѸBDZFBR)a:t1GhF 0yH"TT_l\ULuxd4"bH)fQBz _c!hB[O~m>-.mIHJ6HЦT':S_(׳\BgД q㘖G{-D2`uqSگY EB]o=dK`l|*^dJ?H>y̳KSy⪖ eZ$sO@nȐ 8||̭_7y$8JxJmdQr CĴEPW0SZ0j! |Ą0hwe\FN#Э Go,/ľPYdn.k*^lHs6hYK.2JUE[QY"$q}Stpx[uw 4 mqqXÍNC <:P#p&(=1\M/zeTIIUP1tP7YITxt%4}|rUTtp:٠(*E+JaavF"`գ\% E1M[h(᪈(}־ %t,Uh4gx`]hqdRzvn )H;F@#SlH7&s^` 8 ;mAQq Nhhh,۴e+J _ȯc|j0MM7:HNM㶎99+īyMF@#.nPe,O,Sdp6_jf5Vj* VS2s`oZ\,s'wkk>h4m# 6~b,=Iv֡L.r$$m3hGZn+26ᯱ,4.MOD_yЃ Th4M.:j4]&.Ug4t VF@#F@#%hXu@o@@`oK@ K`ՙj4M.:j4]&.Ug4t VF@#F@#%hXu@o@@`oK@ K`ՙj4M.:j4]&.Ug4t VF@#F@#%hXu@o@@`oK@ K`ՙj4M.:j4]&.Ug4t VF@#F@#%hXu@o@@`oK@ K`ՙj4M.:j4]&.Ug4t VF@#F@#%hXu@o@@`oK@ K`ՙj4M.:j4]&.Ug4t VF@#F@#%hXu@o@@`oK@ K`ՙj4M.:j4]&.Ug4t VF@#F@#%hXuN 0_D\H* !Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIGlIDAT&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0pV`a% 8 P LU(XXIG&p*,#8aJ@AVґ %@ +HDNX Ppt$@`"'B (8J: 0$X(,=>9+Ϥ8?k,yW;IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail10.png0100644 0000000 0000000 00000131200 12564151525 023117 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]|ݝ$w"m[*U^*mi:5*8hiVMmJNjňv^-usXX(.2S<"c_Nv:OVV;@uu5V,[ӧ_VUQz?[b7۷N~1u ]Y2eh/>DZ5* <1Wl vݍf݌C"-'g"Ә#ѥS'\O+.]=>ꊐ]D|=YtO2A&>'텳 G?,0ucXu>uaއzIs@3gb1gDfJdW`绱O{*#F+v 1Q^Q]va%mwo:V1IHItٳ+,H#RG-hg c 򅇋@f^9^Jrrj0q lM:k1AIw87z=?>tXO1``fn9="##=>V LH_ A~^>ƌm۶ &mWY LڽmbAS~X^~IOcÀ~}m^"uyxD8ĜEG}9Y7ggDF8o[_})"3"++ ˖.A SnԖ֭[Gkz8|:HL7hC_~#>/mӶ6=վu+Nbakg<z<̃>}XV_& t͸qEw0z/(+)Ünwwwqhg#qÏ>&YYZY 7'[Ֆ7^+]{x`馩k#/Q ץ!|A~33oO9x"><ŔgΜkWz>}:s`t JŅ7#fzj>߹ȣPkkk8;9vSImx{XXh軆$Qm";pGN~!u,v+*3ϕ%o71S$r?OOBGc\&KZǵ;1$Π{wi{ܹ8lX*S>/4xC?t:wAA(, !x?'1wQVQMڞI'm6saH?ʼnp6=i oi ă&۲<*pzd[߰!C_f pD#SFvزZUH7Q`~OP>RJQw{h!] R2iO}K\)O6I"ZlY-VE~a1W^^ fF>~hKIyy%*dyN:[Q-`XD?&m"cpp!B z\]]0Ŭ;o_ߵ.eWمuHGf9%dƜ1#)&TgH^lX=v 1E% AZZޓI qǝwnW};V}ZWo߉Ck~7]8^Wya4QxkdXDuY%uM&f2ӓڱm ~n z/n|Id'L"*b'HYܜUGJcVnzX2yK2r7 Qp5îO9[yхQ\hi;{,&{2EI*{1d.ke+6n wD^aS|wUtgW}66-,-PQ^kLKK%Px֮Fjz84Cv0Y睧3*N?򈾜2DMC Ǐ KÜM<ԧӛ0.z`sx*; lްc7 ۠ZqGp`6Ŝ&>ڏ- GW"$ ʽ:;޾ y:81j~h҈Yë?lPe OFR~!"";v@$IУw!SmΜ9>7K'{|cm/m04 ^񀗟IS=O'4}~cm_ǫkչ4Q~\JZ-؃#.[r3Ka/B ل-x1`Zm +KX2ȶԮ ,1o+ȡ1H cmF*ڋ,A]JuU2Αz@}Iw׭E'O$gFhQ}xd![Ozg>}՗i8L =vSu2̒[lz"2y8FI%EE >>l?/rkVn$`Ԉr;$j*(O&#fj8nCW_Tնa,/ DG {ĸ "|9YXcOY} :d>T<㈍>+S7< {~ݭA ;sXg%Jʫ(R¬]6}Ō.V}m&:}'?Dbz6ʓ<((;wFNJ SR_qEB;2O~bVB#J7c 7mTl%!b<1U<ߔ}(b")U1Yt'O12sT5 и_xL:g(ĆӐ^I-ό3Elןo? ;]0!S*XF~1lNʣ;svV-$A$j.gYM@jڜ]bzbKsemݲzoz,^+ D¹8!6Kym` KL )}/V ( 8Xd }\b<>D 18`ݱJ{blڱt]uT8$^Ot=O;~q:0 w9z8t _x oϝfᖛo'O~XKM ?-]G1/@踟nR9y&FUҽruPHsW&{PXR[om՟pdhfΚXbcq=hq)E< AEVi>t ֧{a=t"4Ec?b_SZ{%O WroD6yp\X;S]r,pK޲lP" \XW$@ `v$Kx-Sáa8r&]ADr *`ިUjRvo{+ ao|"ה]>5yœcEӥ (;j,-]%u.nOlOuw7x-S J.nC210njj(1|@UD,D1{;;3vcYެ۱) xU }gڽڗA9LŇ4׫:ּmT8*KBy/#9igakI72Fv٦AJ򑓞H4stA0d$Eca4[Yxm7j<$d6W8p=mqgVَE;o,KjLixi>ȅ]]6 1w&e`/*=X|{g-|BlҒ1*n{`IqD>mҧLib>mЮSwa,$&):~절?ZMOm5بp栜쪶IlrS'ErɝNSmŜBĜ VZZ 'g7ѵAa].p}ҳ5SE3aLY\ղ/Eq& O`Юcw:i ,ȡ1zR}iq|0`ן| ];'q2 ~\$ZGNtN-G)_wnq됙|F|m5G>KQ1Ht 6=FԾ(&;!]pøi6}2DY;Vf>ih+)5YEGʫD6^MJğC829r.2oF QiS֏ރ=:)]p }q8Aݼo067dkeۦM鈨8ѯϝGs[wCȀ1}<,~v^uv+Sٮzf\ڷ :##3 G{1NSG1idoGiɰS=y~t{]ȿ =8w8f8 t9H@䩳=qE>i(e|:3wIcУ 4%$%4}tg(lE}Q{}Ez՟нcfNa?v WjPA ?9s|rlIJsj_xj Q773qIB߀et11)OJ)KSB/-ApD~NJIG!B)/S'nJB 2= SI 6ݸ_H `be>C:wh[.$Ս/Db*}C47Fn#r.:` @Xi|HmcF*o&#,Ym6tne;ǨUÍ;b/- 9x.5Ç Tmߠ}5Kۓ-sJ3K|Ys٣+~|;MSciÖK6(g߄=R?q^7~>z1 `E9t.yí&ă_A}dr BσEu >-panm|yaEmh[Zd$Eヹ/1Qh~|:"u{+w6c8Om0d`?[}j{W`#p9(}r66'w_P8Fpvu9'ϡo$H|2t; 2T4}m㯝'0ursGFa!<h繷-{$LAP:ꅂ(}쀿6*[ 7AMa"{ F}H4\VƎy )=+W|p?>@(\Q'!9$r^4.3BDD'P|Itn]sʨ-m_Z F-M/@dGO{ҳ ?3>4mz5v 3?~X<@̳; ];wуpt:HݥCz6?r qTprVDUt92F#CZ"ƦeEX~?L롸0C]SauV 1jW)Aҿrc ¶Q'c4?~^>;#ߣ pƭ3% evYσzPHuzaOw΅=K 9h|qJ/|' {Nmn*Tzy$G$'$Dϗƈu&ݎMMAWx2)yr^>/F /~$s.|G([HOᥧݿ vǠ^8yBtmcy9z ٜf.ﶛnDJj:ɾE=oӄąNH;y8If 37\K|&].-ήn(K(נSJ=`c0}eQNI &1OQ1c̝8v#"p>|I%R) *mʲbg+)}qXHT7=U>4RjӨ*+ Q~=C,_&NĸAp/o2*?u qxDTbO; '7dIJ&7F;o!IS(8q=\GK( 򍥳ȶ26H+&>0?trw ?Axվ\ Qg`uǫx†9-*{MO+TULpivd"tǞ\qpɾ9zw4gƶ^y| 5 DAm_!a?/o9xa;Ɔ _&u55sk{׸f[/;R2v4۞^0STQW,bnhd눹/>ū"{~6Q%:y[1tz]wVÒLA8v:kV= 3Ezf:%hGU+‘xp~qXذ8mJIMp>>eAL|hKsp"oP?kvj^!^kmpp{HF`\6΄E=}"п3(̚1O< G_!Ga]#w`T|D]0S&X |lPsro'&\kY1[:;{ H_y#ŽIKI\ q!X xK;_ztq4;SSbZ_i:$eI;{aS K3'zӔTIa<בBg#$zf&Xdbfyd,ELZS;3ʛE* ':qh1';st9<\qc]q}L0@n 5$NǦy/OZy6XEt|{amfO_"%8٧5\J ٜ3n,B85e7y,)<#%^~pfyE%X$n4P0M~C>WX(>ͩUԲVzMDrccgz `tL۳KӶ~Ťve9*YmK_qi%1?~97$R>^Z^U+y|OyWBtZcI%D0_Vh=p׎Xjv3v.-LOsM{Ñ@ou0[ ,5FťU;D4q`6vyήilȴ:iXՎ4Ki_,ڌȘdQGmW;u_-قz=NmmV_R^n\QfxWn`4}ysNoi_%WzP=v$2yU_=cM^c,F" 㟱>YPq[[ڷ3ӱ)XuP/vu(^[m!)23`emWE?Nw%X̏MO`c>@,i 6SjHbg*|޺1ޅ^dEldwrغӂZ:ԫcRd߮އ 8\V) E|QmZ/X_/W!u13d)RPԽS4I+K gtN')FAVHbt`FD@" h\ ',,HTh5)DBT`IDD,d8s/g-0{8UYu_Rׄ& +WF˹& kkiH$^'YNQ" 0dq5dISH# q\dD@"p 5p%Hh+\Hx d9ED8EJ$^'YNQ" 0dq5dISH# q\dD@"p 5p%Hh+\Hx d9ED8EJ$^'YNQ" 0dq5dISH#`i<?q 7:'4 _dg"? G($EY%gb#!!EGEke۾659@E`^~ckqlִcgk#ckc՚%"h4 |"Y[Ya>ؾNJc`ȿĤ4̜>Q/+-ҩUQ,뤹ʊ occ fEE%~vN"OE ۯo$%"##[+(,m)ZZZK̍MGc}7t?D#`.a))B&WW8Tɐw*lq@0$--x{Fhhs0f~,=awp XLL諼[#_ϋn2Z;u:gω2m3(Ȥ:\w\gIr>XxsOHU}O%]:_?)K(}n|οsf'-]9?lIrAAQ1 ̈&.J D3ntX[GUX1z3TXG^2r;y{T'\V.=$1ON G(ppt{P#cB]Z%0c?=Hقb y C]Qx#*xqcYS)lv%z; xQd*6@Ve|a;jF_:ڏ7IUPmlmsD>;B(4di1cp^֫]v&auj\af: v~x8I9yz^/ \hvR#i#O:Ã91N$Cߜ|X)S3KtIpbV@u=\HBLG 1T QI:欌Ńo!A|(./pD9jh~,mCRg!'"9Zщ$<ᐜD .9:S`7aE gf K8oXHYOy%e$rMvF؀J|=f5p& ipnCuXjeɭn:]|Ǫj&&Kj=RZZ.Ru )' _*v JTx0fڌxmf("CRjRb۞(GZz\-%IR?i?,@eD %d- K$d (t$lgP_" `$`dED# `K?r# C'+J$-[H.z(-)DuU%qC%@}Ys K9 ֺo/x1Rd"4G+;T+K-PTɍHH$ !`Yo*tE?8ǘmlfX`qaN&daa^_ȗ˹EUfJ$͆@A *,]^E/vUX5&+HSK$eaD`A~:Lr?kqM+p">fD~ED _nNi0ܬgmLjd;$H67-7ݧI3h=NIIBAyQZU~K yI64 )kO z~C-cD p,c.%,DdE}5 HA"Wql3I 8Y?!I" \[3L qR6TYF" rG"M}+$("yߕ;gDY Y`J$-&0@Ectᓕ"P0kߏ Yl8cHZ>.\Ÿ#^PگE\NZD@" h_g30p1zL NlR" h &0hJIUs@tA#tJCr{m5X ,яVx[W<ftR V8]UVlj|HuyL*X4n$8ݑrT‹noׇӻZѸug*x|WTJf$Yv44Dž$DAlAfF'Ӫdx#e`@|n5^/s CR+Q$Pljq}Dc-3:f~0o{iOvfm/GPR442C,ӎU%.5 5T%R: g߹J *RqJ$Cyc˒DI}W\%@&I_ol-CkJįThVi죽e8X/ep3nHRBRzR)i2')=HRɆƌY0>HGR)ԆDshw9Q_H:|5ƑtkӼ!{Abb=?,=aƴIj{"G l=^'f'߷Lg:CIc !WAtFg)%͛<4Rp#SY&Ztnj],)2yqhM#fBgڸK&JL)$En 4'q6n\.mUURi o$(Rں\O>Ixb`nb$e͒kt%Iz݊muI1vj5Uy$Xs6JxP%lT꬘ЯWlcO~fTۣYSʜ9G؞zʟH;c¡q2>2?r7ϓuLd(?]Mo:ea$o5a{4O& #<;1Xy mZ 7L,ŖUԭ(K*4Iʛh7-b' ~x*/*sdC!@^BYv=n_R,5,{aV;V.Wg|V6r>oR|\15!j'u/EȦWXMv52C_޾wpPԧ2eSIc)W2R`bD!~`(Ѹ~qp'ܜ\U# Vۯڶ韺neӀ6)0Qm}$&W7&-MQ:!Ӗ1sm5T kkk_HvpH__̴ǣCmrOva%]ELd15VR7 v"0#HBмl|S' v8G'vMɾ!%Z[F%-n&9$53~,qi2^{|%k)=BwZxINdM`-ff~m.2^}sC+`:*I>H K/MX32?tw`%*@,5_q'7wvVu{ZcJ7j92cI4Bz}/?]F Kb!@.ŰN*c7Wpl/9!rzęV: ȭ} NM?GQnz5O˦4RM;CZo {BmiS 2+X\5 5. <)eQ̢Wb+[R+at2 V32}f  E&Ӌ^SӮSܑHZ K1GEW76ԙEՅlasE\w, JǂiY4miۭ_X]P0I|j=ywI儴;Ms E7T;E]vɯ~ c.zkޯsEWOWn @b!榐 Д4e8Q􎫗EZzT=ц@zw"1riݼ̝FLB֞] E["7amD]x\4iQ׈-^'RZ ۞qA"E8m+ax(|O 0,&Ԑ$\MS4fl*z-3ByմL2|:CAՈ>.j?ִYŞX1YGHtޥU"uMŸg rOc3t{eK$n"ClZٌui^!f(欲s[.5 dD62^KYg1m.*&.?\]ŘE胿N^ }])Z./h(*u p{\Q?C5}5(lhq6O$UqrCQb@3ZvYׅ7,BKŘМ<J+3QJH~LfzN؜ kHv'La-_$C gcp;Zn6oW}m0fFm3i}$,vњy; 4S˥axmBOs{L=)lf T+J_T6Œi7E9Ij=?@K󏘟/gN*tnI}%H:LW Ȕ-O1Yw;cz;ޙlĄngRzfW?V9  ѵqU`p=aylLgGKXЙ[b=-8j G%~7p+BkBȠv-{ĂuƭEnkC qhky  hH_֮ ^6Xy˶11a#D"/b XyX-Vt#{:ccXI=/!]bO/+҇ɫLWT?̎MA4->e.K ѿ?$ZԟxU!u%E'4d 7^P%IUfxb"z\.K"+ɻ/4fb @VwlY"4⢙7qr\#ktKv$OD@"вh |uL,2TLLD@"RhlRf+)H4TID@"h+ H HhB$k _c'\NW" 0 `(¶ eJ" tLg2̭k9~D&3֩*w%@Fdx-K$ V2i bLD@" 5U9'D$$4 &YH" hHϪD@"`,$F$lgUI" 0 MIHZ#Ƴ*$d&$ I$[YsHLB@2@`$ֈd9I$&! I0B@kD@2xV$ $d!D(**?J~3fffסC}Ǎ%`ee%~+WloQ.$$ru^Ϟ=;vѣ-ar%%%_ŋ_6& 'RLL ۧ6jj({uu(WUUh36m;-!_`رx'Zp1L1feعsKL-+jەF/`Μ9pss]_.&ج EYpw-_Ҳe0~xk>K(33> u놁b5el{Ō3бcG5 o&9R~zСCދ_~߿SNE`` \]]1l01*ɓ1}Zux k-[n؆ \:wٳgcҥz_ƍE(u]8uTDJ#Lea{9ttCt"&źk 1۷4]Vc}矇>(SӶm[}~ݲܟdؖ,YRcnn^OO9qeee5{W7qRŰxrު/ЃCljiӦ믿^ S;::ԐoE~XXXc\Ʀf׮]' ^믋o]ۤa2RW}~򵽇O4xaDFF}!D7޲ S>}aٳGHH"S>FRbx饗{h :b<`1cD, o^)>-׎?bB/(8vO [%K}Bbb"z)QnŊX~}S/R&Kشi|}}űu։-KoȐ!(--ȑ#eB"p5!,4uL, YM6TI'Bc0sL1?Sܬ?@3coꫯDLƼyХKh&M-hԱ1JMM TV ;Trт{zz⭷eحZ r@.K<Νv?Volo߾"@*`׽{wa_}S)cc̅9nЫW/5kx駟ffAyyya͘2e fd(3VZbܹ=0sy\*Q~LܯJČE>9MԬd}YreB"pPY @Kv_TW  {8.qՠh8vW%$-*L%"Toq[,,d!{Tz!9~TpHa+GBٱԧJt&LR'''QqtQh$䡛WI0g=քABbZ-) !iZD .H'eDSL>&sj҅_ӚK)_9Ok-܄DSٓq$>o1#yf\`A 0{pVF`]bA@3Z="0y =\;L?딗2@AG_{ Ё"ŗFXFun^Pڴ&tqs RaF G\ꮩ ЃܾEQ~_S͜`lF *:"W%EQٕ\ȱF1Q*'WM}Dˇ"BC|@Y7`L"p KZf,L} 0#`+@1;y(#pV*6CVS'QXxկW\Mآa0@VȱB%A~H`t2 qt[4C^ERҥ[ţ|fI0ĜrZf 8(4"JȵՓ. PUhz@ħĒ` 9~ ˷$9/;:%3EDxz.|>Oe@*Zy{r b{U^`&@;:<FЇ>87#Lvt2y(#&@}xqnF#dPF@L܌#`G00>ŹF`Ca}0Ës3!hG'0`ԇf;B ЎN&`!/0vL #C P^`&@;:<FЇ>87#YO?E~dGeHc$WwHǕ)Po1+UMEݝag!|!ݾsbFFܐ'MS8A' n1@&Pr@;Ւ /F UQZ6kLn׬w0@lքjթG!.)./":ծU\QW#`k"PbyY.ݍ)\sLDP1XF5/Ak&XFUQ1CEh"%nZ<# bf 8Kh$Tt)-qF`rX IDATR07Yh"D.\XK}`Es4A#& 9#09{AAQx`[G@Wi&@[4`0E3 h70z`ԋgA nN%^bb)>^[UK=zDgϦ@--*ؽ{wrttLsq * c# , YiӦ ˗O{5رc?~XvtK|ԯ_?ҋ̳k܎)?b~l޼:tV)ч(OqLoǏiĈtAI2zgg~U?rJ_.ds͍pF zV丸 q6:Cg.ޤE? %Ow]\\!_A}r4kXUgiɒ%jװ64gиqKÆ (QB9r$=x"C^3iĉ}<1ƎKM6 *Ѐh \._L0K*%ϛ7}ZsEC};wׯiQ͚5ҲeKɓ'"N۷mhœ&M~ʔ)#c0<Co%_LZAK2й!|ːJgaө_im+Jsٰ$oK5ퟣ2 $LV$hMU hAꫯJ^DD4/NJ-Z ߸q֮]KfΝrꫯhtI~ _|Q $D?S։U=ժU/H3{Fc\$#۶m@[>74_UT);гgOݻw!CHrܵk|҂p9aQYCcaSl&0_28LC"Mxa ;{Eh@hK ;NѤ4)|虦U u\pSޛEXJgϞ LIh%SLv=ڷo Z\5k=j2c :qℬf6 d˖-IIIR7w8IX@1yxx44 qvvdmu WJ$???+p.C^b_~!-1-̵A.`qVu= ߖwfb*U0mVUs{;\—ހvԡEuZ'5{%džzg\`z3x{=#ݽ-}L:7@֔W^MPd,-V%: rqq/2,4i"-]4i&y\^$}2Py>*-&$#SVf2iժG0E`BɁAtpSS3hDK>p@v ڃ1JYY9d +7G(#__''P=OAO\8Ԫ&MP:+4CB!$-YD~T4аq-Zj!'O{6< ,L4VZ5)g.NNN}LL =Y"( ?%8@>h8(E|n:ڰa5oܤSFcҥ LRFīxRCf[n&m9sk֬~ThBRCвUP7ߔ N`*߽{WeMuVȉ60_!? ْhAсWi4JP U-KIdddc&0 0=4!XÍLf%={5hЀeVdfnͣͪOZ-i5i믿4Dyi`)DnjC?, 7 0M&4=)+Cݕ">2י7L'/*ũ M7; U]a; ?LQ\.T]*mAAhDϟlݺUqb>> &ѣ nn2yaRCRc v[VmuԮ]; D.@Q (y =hrzUf0X" Wn(0^xfV8>r$i+"]L_([T+E*;x\S7Gqa 2{c ˆH¹ g=Ȱm۶AB .H 76LgԔb:l21ZeѣIZDŽB[Ďmh~( &旚oT 7&{iС2Ҏ׎ k5'5̵͠k|xok*R؝fM}*]Һ{c}.b.?. .YqVl# "?t<ߞçĴP'7sZ),Ν\̓KC`><DIZ `ڵ S\Wjֺ, (/uSk#5̵M>N-suv$kC߽tB"Syt1b۰lJWKgO:dC0@J9fg}\#0YC 0kqiF0]g!^ֺΥFHD S)#>\#:㦯ؘ;#HnCi"]|?XK}`E XpGF;oQԿO2NgF 'HU.n_|ʨ/ٕ\ȱF1Q*'WM}Dˇ"BC|%Ms&F`KW(,$Xrv5`'g*SN87#Lvt2y(#&@}xqnF#dPF@L܌#`G00>ŹF`Ca}0Ës3!hG'0`ԇf;B K 8$$$R\|l5!#' Vӵk7 ;?,:@Wx??>2$q> [M``YnƬt;.5k=ݪQ%9`Xvs1W!V?~L!Oq@]ps5ԕ?_>(מnc0,FxYXhUXF&ߦXRT^+OSAFĪy.D~~>TvU*^Gf;{ ?x\nB{JT fF@O} ցʕ-I7{'.n \Xv:HA!/_y ߼yOfWEX,#d  }+!hvJL y{ANѹeah?~O$"pp0Kvy`XFOʔ E>E&פamOH0験#͞ |t.-}3^!L#0@XX.HE -(\7 ݻ@wd(OE|SF`U С@ż"ޅd7K"8b,ǿm߂ڷiJ%EoGQYy`!`5 z'wU*X8r,a^B):>CQ"B#dK'0~e$f}4.ox\jȗ(),#Xj謟_1C+/CM_Q2ux)9;;3޹5թYY=}`FRsٌ$ûqqZXe1ݍoߥK7 թVAx$0( S51rYu%QA!(]8EܡB;=xE_X?9i*H5+ ~Sfq?vf_ck Yl޴  >t`L,bhSw=igqkb4*N_c!6P-1!K$ia*A^1#!' [L'CRcI'bFrXhrM#X&@ɵ1@.B 0,*#X&@ɵ1@.B 0,*#X&@ɵ1@.B 0,*#X&@ɵ1@.B 0,*#X, M1Q(&jsX-;`3P\\̓,{" ^#\*UME]~9 #0D_  ȈL޾~좻V_I[ASկW\7\`T[>N!7x /]>x5jQfR9!0ه͚P:(%{q/":ծU\QW#`k"PbyY.ݍ)\sLDP1XF5/A#gCM-0#`bD%nZ<# bf 8Kh$:CK`B*M" RaF GdE4`yzk0#xV&h',#:zJ3#E P/b`&@9<FЋ^8?# ߻wΟ?OAAATX1Y&y5 #0Ex]j|ZvjU^T߰ |8թZ}ė|Aʖ,BNh=s">*3֜B .2EV Lޛ7oNw֍00HLb)"h .PӦM~Cu<66>sڴi$Uz)4iUPAf9r$;w֭K'OiF[B˖s+ x&?|W痢듯zKST@ Ƣ^򙘔DWҵp }j(Lacםh@hKm&4ȯK҂=f5Az/PUh(*O[kb/c?MqytMWd9ﭻ9KVĵM?|+: ˨2OOO8p -쏵&hq Ia0nj#!1 D;@p͚5ԲeKYv%:v5hЀf̘A RȴibϞ=4|pr ;tҥAQgh СCԦMڿ Z=KPh$C[NE*omMnF}M`)Dar eZ u|VgHʗyRY5NjJ-3}ݭ*ФnyBV,+<(I Gcy%ހvRV[͐{ 4f;>% EAIK2LmU.æ uIvfC]6/6DNhJiX :~."C5~dL˨а3# ]JAWw}Z\D @wk /իU^nݺA{-IMTȪUvԩ_C jw^i"C~d}ٳgOg]p\6y~?5"-XPZƂf4-L!hXBB)8;*p6JwED\&rU;p:!ޒ)CfYܺڔ TͬTWɖ=g%頟Ƣ0&ttP?ZdAS>)Muo`ruqEB_$c{R[!| @Ǔ Obbq% 3 .GWns@=u޽{[PU =,82m&{;v쐦w}g!<% 7%0!!xyJ*E;v~="#FМ9sFYiO۳' 0oOңzWf+Lh@JQ+lU驭}CTa}9sঅx\T> Y?i*ɨU{Q;8䗚~I:smס):"hMu2@[~aW7Fu9qFSD ; IDATL=SAWghZr._w"|7>¬5sk3">2͟/\] ?(/ŋ['dqD>CFN:r>ϐ!CF? LVƒ?ʨљ3g#s,S !kժ% P_5hbYAN~P٠A$$$ꡎkYwZ|/ސsy,5h0֝rڎzT|4Tk~Avg.ZZ@2x8]F6 mԤHh0qkT*A?| ACҝQ4R~I,%G׭"x{t4/ɖJWkwq.Yײ*;}Ju,:T ŋ)<1XCmyѧTS8ESZ:-&Q,ItIhs0]_t4GP >n2b Sи >64D@ƢWiJ7 3>˨Ϫ.-kR*/MXSS}8'IL0o+WL=+^ԉV٤IB`*LɃPÆ IG{͚5WTJvS_Dv|?/1 J˨ ‰0) ILAD, 4-NrEbJL8w:ĉ ު@Le:zABx#D VMj:f%{ :Hk_NVOF{1}ļJ;ăf˵,Lk"BӘ22K9b*+4w^Zɰ4i$*0hW+>Taqk] 1Walë-*zca4&:uJF|QݝO.3`D!4{0F_܃AqCf-cfn_G jgEz%Gaa{JIjnLi[$M:nͯ<yN|ɮ"Цm?/#Zժ\Rj\ mUuhkֵ6؅x+`k W[ y0GEk[Gj ?jp;SEa%ߋA|.GطLA`ף_/fo̒iޫgQA[rns0@%0E%N{җ$x`l̯9\SUL`[0@kxW~T,ׄ 0qoG3=>tXe`~w?##y &vyyA=bҫ3@A 0Ϝj(##h3@A 0Ϝj(##h3@A 0Ϝj(##h3@A 0Ϝj(##h3@A 0Ϝj(##U8|]`{B@3f{`rZ66s92`0\#sϹ2`0\#sϹ2`0\#sϹ2`0\#sϹ2`0\#sϹ2`0\#sϹ2`0\#۷{N [G/9NYC.0BwIOP!? AW!7:H EOܠQtP\irttKEAͪRֵhס՝Z5Lpkj9E&ד m9lْE mj%/(D\\rZќϪ`LLؠa@={4k6$ǡ%6hЀ>I~*T&tDDAJJJѣGÇ[ny>e=`6wߥKY$ #YĈ AX=tsQ2>bwGя󶉇l>zmC%7"EoSRW1xl"49w )iWG,% Ga:+ }arff$صkWCqի ʋ6Jz2ڴi2LZhpұcGZt)O[n[jE=z mذAQ޽e!5"J0-7m@{'#0gM9Ng4!eY37iNSR Mfj,4΢(8(䎬j*J+;,{M k+A("y ő= A!²sc{RvɐU  $,-V5))҂ [dIjԨ @SBs'Db.aaOYLd} ODk\3DD =D769H;rIcز:շ IW. y- rڢMכfMӄƊuҟ9Gs*jzב>aŋ=iV%@̽믿4uҘ(A8|pJͷ-BZ4Qa+S~DO;w)dPVZIsڜg/;->V@KzQЙJyLvLM kh^Z fSۇ);} A^=Y6k@X T|}}SҥgQSԏH2.\ bxZYF3J'|.&>{ ׯtB_Fy= yB0BiClݸ Mxի^]Ҍ!FeMO5lU P5rEq/_^0YSe@rJ'|BW^Ii'Z ҁd "`s=TUR%#*ӵٻiy| SzS'ċ*.5ޮnj m0mQIxDhw=m T+'gɑN"ܱe 0FAkܮ`o5Ν;'t71Hbv M2A ĘU)$xYA8sch٠&`q1v103Rϛ}1s=uc٩!z`$ 5}?{ vBN׫^FWreʕ9A~`=O'{= M"'''k87_~ِ#;70o'"0WX~Kb1g0D-ZD-ywmHw^>oD 11]RLʌ3~; LBƍ#<RJT@{way5ùˡz'Ӷ}S[2ITٿ%r]qqqAExpf Z.U^ >}`2c_rɚRVS9ߟ,Y幕]^&oߞVXA d8`Zr%͚5>s*R1C~ْE(4m}ܤ3(#Rxi9;ɒ+kg4w\D`߾}j[N1 M̩#Fڵke֭[k׮ԯ_?q:*WLzLy?C6l:tOUV%z9jTJi3:u7J|LCŋerϞ=e;[lI&Qf~ZEEE2\ڸq pU~KL2Tpai8~Gi&Y5|KMݼyS֭$?,X+N Bφ  ySZIhh<5jԠe?O7ږuXZ6D[KQi{Qr)ZW o΢a̧ߖDh֝ goK鏭]uhنCrgz/p!m̷hôUϗRiQLl(BAA?ϟ]MbLd˗KB v ZqXܾ} |pD]%$ g b8wxFSׯ4(v <գHCںuoi^4W# ѡyug%]N&]BB"8p^~`2}.oVRI(: ;|*f-νݹEC?Oqq R(2g+9; /'AC ;{X.\ %w7gCҩtJ(ŋ>vmShCtUvhQjV)I+7{K혗 elxzz=؀"AkiV1pnPh*hŋ}-? Oh 2 ~7" 899I2\~ mۤ/̙3ԢE YUΞ=K0w͗ÇKS>6` Z. 2!h\SG|jP˖-ĉ11cAӱcGI%8xHeԨQ>I~*TSNQDD 2D@ɍ?p hTJ X{AIo[|)Z:5\cֳ%M<8LNF;HaԱ=iHt0IHʲ%HwC>黏zP2>t%MxlӍ* Yh$O HpՄ{Ғ-NCC&'8HQi1Z4vX LIr02_~bFi駟SO=%+_'02 .]HBB=u%իW>}ȪyB̪@ ՠ L<\\\dUR4YST$ kh$U_4V @@' 2D Aϭ(4֍[_ɰ. -f]j۬a:We~hŊz8*ԗٝ:JQ!WCq?Q7Har47aN?55c|ݻt+V58>8J;~` hDL IDAT0@ZLGٹs0ea#ȀkZISN*! I xM.51,>A0dCxL՟[jU.IEҶiJWAmUoV3~$WBs&Ȅ<-y4#&@`qVF/|hF@L:⬌#`_haV1; 0 D8VMtUXF&@8x`LylXF&@8x`LylXF&@8x`LylXFMJ#J #Ǐ5t s\\=xn޼I  OC0P}vwwҥKSNp-Š"']-7Rըb ᑣ0Anݢkג )R\]]%!hxtt$4p@BmO2>u75_;wH] 888HkѢC&;v+þ?~ԩa> w%|cU~_~Ə/I T^&O,?v׮] Rۧ~Jeʔ˗/g.^t)[oQO;J1Mm\9%c x;Ў;ԩSrBئMȨ::$}󵿿-Z$WWV-ZafBSLqɮQ|yz||gΜ)#Z{^%K.zKݐ!C ĉš6m >-DXV&'qPfoVxժU.VP!i\C!vrL@IKT面V{zӭBGiŊ@L0`\f͚E٧ّ3~g6omTTɰuCi&9{l=z@F%5#bXZ+}9ƍSdIw^Rp96ZnmM*ZǑ4,@u&x%/T], C4ƾ}LA>_q_bEzWLL#GnjImms|z23߀ (Qcj~s:͚5Çe5jԠ?X l"LJeiΜ910/3vXjڴ)UPA>\pB@4i=rL0Lr*>,mܸ1E6BGaWr(j;'ת_U5( _|Q&X&gϞ5ת hy 8]Sq+OZv?q>>*\]&1dV@:c%W\O qaY<0@C}AJ ҥK <Ӄモǁ=87mݺ5eF5n^[*>%>߿/ԭ[WhPN %K7nȇ eqHK-"=U&qiѓdtzJewĉ2"H4h _`FPD\pYF &&:vܞ1c`FFFJ⃶wޑt"8 _Ĉm -5{mӈ#d G a )h _|< Rʕ+GE| hfhPeB&}ApZHąl7y:w< pFP 0dx>< ZpF9SHj4   o&b۸R+Mq V!@v-24pGd/kK۶mtQ pB|}w YۿMHMt⦃(,.ZjY mHǴDoCT׭['K/2"6m`O#|bQ g8L!Xpo6ӺukFм0q i6iDvؼOOk$>~7q>Mo1`ǍіPlhƀ>iU3Z?MF9u(MTh>0pCA(n8h-[l)TRM7P01p/I,M*չbI&!+W#HLJM6EM b\*\ȡA`E˖-k {䅳[ L&gh=t027"uauzý@ 6ژB/׉Vcn<):ݶ@n(70`B` ÈRʃ@DiH$l3ٳGT6.$_~GWVd:>A\L?0@?d.%h Q,0*^䇈7zTZZ*D!|;|~x(/ 9mE`2Zep@*x Øma_-0χʗc4:U]:xzjiaR/J)TzDiV / Up4"A\<* ZrDì~7'ԄQ`h {-: pS 0n<Ҫ> 0>YxnCiAt{Πןm҆ R+`DEUx _"`*cJ LezU}enH[S pDO>R9ùƒ$իgR:W鵡%Ozqof//&ɛ%iy|Oo%@ˀLTYV&nhЮC4^}i0 ̠ASMk|*/0I4miɇ LdrH` @9OM`#Oi?7mV-[HBP}5TשLT*;ԅs ?3H[LO ޸U^ ~A ĥ'咨+ȿ|'i%eRB0#2+ ,ʛQG3 $ LOP`H<77%uc9ٷqOK[+)ߗH`#O mq?2,-L`"*EIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail11.png0100644 0000000 0000000 00000105761 12564151525 023135 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]|Nw:^-jܛ 6nSB3-B !$@ `L1ܻ%۲{םtw7{{ZK'Y՚vw|7ogtwSǏ!!pt:wa@uPk:iҮa}(^Guq8yxhSnh+/ڵ n_r{׶z7g_mM 3NpǵH$g5Еՙ:|A- r+'!X:Dm0ax,; bF  J%&lٶ߀L0q-EeUV +.` wUH;|Eί"xpvm^se8q{m>>kllĥ+/{^x_<ÇC1=W^v1W]y%݋~كr~,m޶_y9̛Zf"Dv,ؔ"/$(6&O.e@Xp0&+Tbۮg:%2pܾ AA8wy'dEᓯ6}:,]vy 8 -܉Xr 2͇: ~J+y8X#.T44紊;w ?>XD\z5,V+[0xzG$u'ŵ:NjF-^Htlݺt uB. 3fG#,W 9u 6\}oXvNΙM*Rxx8p'tR=|Ύ2~:r ~o`S؃ nmسkJqw'y%'&f^^.ޅF?%r31e$ٽU!z-H9fFY{㽿-z;"bشue_eʼn|8 ]׭CH` 2OL0yG# ֛‹.emذ$WoI}Gq%Nw|ow^9Aw?^+8j H;,`',-*˱Rs-klÃPh[Q\Q%A TWU&'&{؜րPl(A}a#SzmW;*c8/|eoxO\r n !ƉLb8}~ͷ GB(pWWWLF#I wVT5 !!Vׅt>06Wz퉏7LhQ[.gB#ud~:|i⍿=!8h+/Cr/O?E<1g\r8OdbUH3V$,f57! yGEE5($a(..^wL榶E}H,~WSn[˗/?gEW!"Q|'޿[Tm]^؛lǞwՂ?'n.9͛/>|+C-$^eWc_~8W +.LPCʕ͉׌(_iKM:,2D2vYw$:|d"{KwN_~8Z{7H3p%"f__l$D}? =<0&c#]g 3.iq~[B'kwwrCИSq[Ru}V`jxM8Jzy7oތt `iBB7P-S&JϒѣGivG]hϾ8Hb%M~ sJf-4iy.?>9@‰,Y?󼱣v[=CHygl$jg\0qWxEUm_L^!~?l/9cɨW\Ky2s+ -JRG K;̓"+iN PO& /ORm0[ Ӎ1l*[mZ{&9;/A~v{qVҰPyG xCk3x VWUٌǿI8AiE[F!@%1xJ|EBR"uy:bXQYLQ8FAE"ƽTѮ4'ĆSҰ=,Ygs/` M$ ьwbR"*%Jo* #D✛'#ϒWc-B?PO)QsN@j݃DzHaj"&qlWVolAo@ީ!M:7Kyry` uLkExgGX[GUO?-ҚaXnm/c^ 0_ýu~)$}UkêI[`x`vJ'dҲ[Qt_w??yy%0fNd5P;Ι>ۇiD"k~YFʪ FWڜ嵇cltv~=0N+ ;+Xٸ?pyNfp"Rm_o뷛Jһ/X7XL\ǺA`omZ BHhk &݂Y1rfj$kG-7$0H&U^#fVsq7ͬVHգ*h:CWjIK.ρ/ FgH[|9.%q$ ҶN٩a|d~"i[Ci!Ȱs}_P ߝ_+»K ճBp'4+o&}֞آ%mdޤuf&ΜG}T "xĉxEߣM7΃1L{lJ86ÒcY{~L)Ew*"ؑ&\. Y]+;d!ׅ7| . EϣYl6򣼴}6uヘIolj$" dXMqLi%%'+JDkWQL5dn^&҄gh܉169;sj^|GTx(yXM7:w2[P$`sMF)&n灖7ش cv#"?&T~hH)i=hFt"hF"O1zWVatHzku l~UTPX5e>tT& ހƋkSpьL!匈@TX;F/@D[p ?v "/5">g$Vsc$byp`MvL4$ɊQ>F덈 ?7|Ou}<;5i/FFj/TZCE=9IUߊFB|, f6KWvL&̀@N ,&Ռe:là?ۣf^I,K"4)LST?67!"3nd)t} ;^!PS[OT)6uI$ሀ?4&D@" ͖: yE%.D`8 ` NFD@"CWдK!=$YK ,K DH كɕN"  Gh̋3ز 4Z`LLN`!D@" P1f.okis! (DsPyl|Z̘3v;gPOVF" 8z)\aa.-s^(i*=-p:X_0-7 F\|`D@"Џ$HF`֢+Dv~[EĔ9Kq`Čw+$aD+Λ7c1CchO"!LPH4iu@t_~1@[uOr0hyO絨,Gmu˧z5.e/58ZŸQN" u@hٷKbO-g<5:}M FDVyF3<^D uЋXUOf($@ޏm[1chEOAסˤqy-[ϿWw:~]|oPZKc}$NpK4~I>h+293 ڶЛ^ 1QQ̦zrU, uu 8[C{*zAuQboz"ȄzS#=(>u I l +z&LELRYiEqcikC01nnXҾ6iFᚋZw0vO[6anxLl)B#' cb Ϯ|rׁc>!u5(-wО4}Z,+pA\z9b Qc'!4D%"*&^OO6a8\ ڬ{]u??x!,NΝ; |uԓdyQh{$=g QW68骟zd9H;Y"(ڜ\1+Z<|;6d/#iڪ'Ҝwa8X*4wȆ3 ǡrmNgkHo^:ɭs2OcLr"PZmCov tkUp`6=V\E*Da1Я'Eΐox{)2 ŝ γs 1ql2QT@L+,'*4$螺CNW  Vſ?z$$J[7}0)u9|"?^DPnςтYyO/%循I"<j8YC?FLl'dH`6AjCFv!FLJ[e$ǎ+#O}1Οy@LtlZ`>D7;wWο6w'] KA܃{S%U bX֋rʫQ\Z0O'S'`(*)G1aH\|ΒQu /&/% , > Ḿ#a{^kvȟYq$z~hF>כ,":I<}KʧxCҒŪOU ]՗&Ujp&(ڔ3Aq:;<$BEjEIN۟alJ bua?TѾpʫdky8:5~ />uωo:=ADvgaN.rR|q; zɊMbp" +LA`·zrFDNYǯAIf@W|3@WD]e7udTxp%i)oxXϛڢQw~ƅIjSEҖ,ML'(v05nN!51޻ ?g. 2rHԁDɼIgaǩ vFPh3Q' $:ظ JIwɒf/~ǎ_on :v2fgΟUdžj]+k<=eFm1,׺|ͻV#OH/v;$*Pf|[:WǰtᜡS^fŸte"w?ہZm~>^d/tNO|DH4'&2{P&#Bp.YadV YWAL&mԞb'F8벢\<;M3ߥUx/{3L~:efsG6`^ss;[ ͏> CG6 .86)"#ccݡUIggO~o|ɏݾeű-'ESǏġRhh ax7w/lXn,mP/W=[O( $E~WܗK쪱<t)g f+hUZ TAK/ I?C1nV408إO6:6d\́On9K~nBh.c϶`[n _j}Hi>4y@ %giGg#RϨ#-/`goگK(H̋2*&:)T̿,o  OD,"6c,Uhv(]Q" h=n Pƌ Ɨ[7^{6mѧ]uM[iny06LI" 8cn ɫE3qyϱb0:o2F*-dJ2N" 0nw TcTrX98Xn+YHGm~BY`}I$@%PY_D@"ֺmH$g3g4>mH~hiD#h,D@" &^"9pxlD`#۶HӦFi2hyO{OChKQ{OsD@"0 8 :Y6Q" I"}%a$aɲ@H+ $NMH:F@`ǸH_D` ptlD@"1;EJ$Iàe%1.W" H,(t$q0@@0dDDc$vHA'&J$# c\D@"0 8 :Y6Q" I"}%a$aɲ@:O &Lի"7oޕa Xqy¢R\S'bk>q8x^_r &O*_|Klq#`, D%@O^ +>^-))ou]ZR:_Isc|b,(,I8mS7!4Tپm@ f'vLfMIfvg_?F"2vΛ FR56Y:N.BXT" +F sıةLJtwCZZ9:3S'R9XVdGcFQ" C+mH.4d"ݱ"YSpԨD00coqјC6ۅID`!Яhkn p*~>Xz>]W\Z &Q;0 4^*>0,4H;wTg`wK#ЯLjZde硄ӧGE^Zzkێs94 U@]7K&PՆ:N 5$t%@X,6qD-N~>`:ӱxRﺫWǻUOf >E ҰߛҪ>B" z,0cnK@JOvMIYr J[Йd<.!HB@mϑ6xv퇏]M%;=OOJ+q2iۤ Iz3ƍGhpDtlIyE+ƌ)zԓI{mQ}dzPQUXD%S<4n Lu$fhJ:;^7<ي@! ߠI$ IGd}$~C@`A- H[H$$~Z$ 6$H I,H" lHl="#g)ьFS7oI$Z؃o&{FԈb>(Q֨GMד:4Dm Dx7cO5Nazp9B#Gz^A*9e(w q[Yp(/_ZkxݺxDG6y7Aa&%xV>n`mUS=I~n!+#I$s+թx0pBFU[hi2c_QmvI" =Q|q^f},-dSd}])#H$>KfzVLPJo;W/tQ*MogR豁s٭%$@#P!>p GE9# , M:JsEsh K$ل@7ljlD@" $ʻ@" Orx$ P{@K"0l8SDydGm7DV]"@D_s )Etix՞ɞel\Zy|op]y63#]FY?@#SL$XOnCJ^!kI|A}Q! 'bD>9f+b[Xp1 (gtWGݶ=G{5Q6Yt\y&Nߜt7f~+$9)Zے\P5tRWxl4yDF:D2wtyr*3u<!]O)^Y@b)c/zgL/8.ڌE{>kލQ;揖zᬔY)H>Jb&g r\ZSU\w™B+i[y}?$̥Ϋ"C%@"6:Ʒ[GYD@" &@*L% p`pJ$CohM D@" ^&Cx&i(;7\,H*qnDŽ:dW#H *ow03;TFH$s/ skLkX F^eD@"o0G1Wۯ@Q%ܒ9a`HnVNo};PI$@ Л{{jŻ%rn'㗩i:Uˈ@#4%%Zp-r<dBcpHYdA@`*3HB/:J$}$>Uf* $^uHI}T"  H $( VD@"08zIQ" $ 2SD`( p(D@"'HXeP@@P%YGS} IDATDO'L%$K@ O`J$CICd%>A@`*3Hg'L"ա,7E -(8 xc$oH^=nVԈbX- GJ z*{2D@")vף y,+PvAuoO`.HmG;ߍfiByq"b0#u*|}_hD@" &s#?ҢDǏóMFY5+I~90q23G_D@"п<5EN=ʻS %\L6ƌN2D@" SƌNƤ)P]VH&rk5"\tD`!YDt Jݮ[hi2 I'H+Q,;-dSq'OG"  d,w[f0ze~9XʨlS3xůkoFDp)i|( oFCDd@Efw;}YM?cF#׫Ԅja9~ W]Ӻ@@"PPZلQPПErYdgo[h_zx FưP6ՓsVV֯_e˖aѧmj`iõn ''so)䀵IvҙjXsS:jӈc&᭍$@-Z|x0;Kg'Y:7[Lr w0^yyhvL?B:%θm& M @ GJZ$=5MnS+KK=_$$@jF`6yn| y 9&ihD}E#6OpyIufDz`#Q߼x0:L33ΏZ2z?j?&r$6:9Oz|W|PZ QM+S.O:@@;hPԵJx(ϤP!%V]UpUTћC^!f":yu#X='[b2΃=dCRx19@pyI4K~(_*|ŏmݺՕ۷ow]@`IOk(?~ ׬+HG%VR>@]IdUӰ7.XK9\v[n:SIMJ|=?mzSu%  ~d|&1!FAnA1ۮ36V5+G"5B]s854hr /py=qqqq"9a/Ʊcď-ե^x zp\6 &' рUʿ"n|rr<N19]JbS%4(Nuڵkoחt 5gurßz)!mذA 8(, :& [4{vڍO'FGjAld#UOj$@Q.f,oE(;tjzAm` Ljt7CbLGzi/ ۋN<ѡqȏfR鳠<$q;^0LhuT%@Xh YȎ{hrbXЕ&OO0=oͰc~J3FqW+ yg&֞VRQL,uGg~;nY .ş $yp*ȩOȄį ֹ/L>/Z *ftia@xҧx:G]U )SD/!\[+z+z-BRO6mڄ | >my> 0!P[-TɆg8FㄵfmîlXT. "AI~-eLt`dFZPW&OܪESLzO9SқmsK0ihY&ӹ>ĒU""-PX*KQ[2x[Oo <Q #Z38dV豩e;7K8>w, A>/T0d-3a <>[Z{^92PZ;PAwx M4T棪v %%< :mbS|֒&Z.z~f# -\ͪ ;Bp֎BFQG:T;HyKE tpf!,ѷGřiA A^8HHoC Cy53w9sfwȸ.z^mO~w^ꭨ~NŸM|N[i{}u;9$ܛD;H\NXeHgc/py) }<1`%@K:??2x F ͵E:_W!{, xT`ϙAC*Zۛi݊>6|FM#Λ>~?͈$ G;ʑ>/0] ݓ:#hsfF2a3I ȓ2% IP%UVW&I_,:m%5 3T`^05Z(_oJ^nMxM-+xf̮uT*} 0"?ID WL3Xlå4zΎ*2+Uc6H$ox0yK@ħ<$;ê2L bRN"0&! wmc=|` @zv9Lgr\%?>稽z|ݘ>F[#YTPD[hjanx&I5k߬C%͕iF#%c4#ɄlD$9(Ⅻf&2/@qY<~l#""Hzq}$F"@0q$FaD$@CN$YZo^yôl\Fx FDR%hO^濾^l~z,[ Gpz BmM=-$9`-3YǒzljN G 6ڊOs!XmVAi'BHAxko 2 Ki?DҨCOH|EgoLO\Sa>riF; /DGGx\X"@;`Iǻ,vS#lt 7%KG':"D]'QB^$ gK6+Aht2 >i/VZ9&!22Dg7P3 3{^ jY b#~b9*v S#ۡdAǯfG;fR>Z;0)sݳ;3þ5&Q&jL{h&5qDc$$. ;03̾ttWO0 E {9uTN#@+R9t ڱ\h$槌TmCn;+ E0^..*5Xqaö㸶STد_SEP]GPbNPͼZU5CG@bx!hn55Pc M(N{к?pu;U:IOʖF@-DE BH [t*xZ-mx$%@f҂6?.$?:@Bl1.t@@= zM˭NX7@[$%a֠޻4MO贴Ǫ * sku\Jm3XjjSE-풐A>m<[ڍAc+k[Hz6 KaS/Dò)(i$S[H q(."O&9HeJU$CO#ו/u.Qckz|gO>6PTT -Bd/OK4.x%r#y'wÑ@W۱uQ!t4#` Nɑr /`..Tɹ>z14Ym:dR`U56$6 ΕfW!jAjTmIjkاmX4HC]-,uIXgHcC#Hi,`u}.==;%Kȧ?i:tj?i妛n$/(3f̐[nZ%8.B2d5JZyq[ġ,P/jrv{<<P{rKkF-8ei^ Z#U]NҥUi : GzQL"[Q\,@Ouø= h@" H<1Y ¬Gԇj/ RKA-D J)! bR\; IDATw_|^ZVZ%s1{Nj K:1ь><쳲k.r,*v<搆-++37|SIaah{駟.-<62˺u"56;hIvGk: ΃q{ ہ{K]jj9@mw, ʛM0Z_m)^!IM U9ꦮvOG<0.UԔT0eNz;FgIkZ5!Atr x ݋}Dϯ; 0(Y0xQm䠀V}_}UQKNӦM"gϞVA>}hU7OCxc˖-fK~R^^ni'̟'c.X@tQQ? .`$B!x Ӛ& n+J)K=ښ8'潫 /6:~YcrՅ/,c?v6W"DU_F04=~#hH;Tu;[Emvj|:O|XC=29Q ~Ƹ!M[NiďcVq1t0YXg_;&2S=uYYY+HRV;>Iv@8qj-XB:S-VѥR$)Q-$ąKXl'|wU &sJ&lGeҸ+Js?NsעՏrt|PMCӠbqA͇ DP;?h5Z5 `fii7R׌0ijⅅW,~ XG BCUCUUЂ*2Jv8KԬKImkeBZ4ޢ-C+VMa pˬz\sBm63SO5֡{Əv\gUUUuf͚eHMAUR:H r8xyfyvޯQʔd yğ d,e✯Ok YuuyP P*TY٥%1@2cPm3UHD{BCģA:%xXp<-le Gjw3 ӡ+x׃w:NZ]I֧@jX`!zTmx  ,GxUKT,yINZ-I- 6c˕W^i/c?}MNPϩ eˌ˦ _¸HpZVKDcY7 Y r3Y ֦oA,ڌf3RD[q{c~B,knTKPk#}H,* d2?ED@[יZK_E.dUk|{.BW x/ c':JT@ zcA֟ /4E;:f2J`QKg/ 5}嚛N8 Q\Ttf  jw~6o v 2x`=z4.P;aw̺]3$|27f&UgaLT+0 ZåqN޵^^Hu#eF;}`jl= OoA+^)!M")]-,\N1.tb]m䩦[)≢ 0@T A`IJ텰$|éY%v>m#C-!bu(? GVt6 a) o)Y8@C8WER$j"By@?.|CD:zX7Q7: &㗠b`7yPuN(HZw3l9["@< x{$2⧽T]ҏDSE0E\708Qj1Y{yhԶ=d;E* A^YUHz!0FR}D{RR]ft$d%IG?ٰ IhK}$+=ԣlY~l(Ͳtt/Lxb‚oهhK4TQEMAߋ~ӮA3 ,G'#,b Ih4hP<01^|aL  Gfj)I9$xF*ink̘0롇O֋k( ?mղb&|}H03gdAYB#֙h/LڇT+`rcz %H Œ܀EV._72W /=TٴƫVu0#s eʏEODG$@f+?^&%1d.4NluXigHɰdՊRBN(i5 %m~K,e2`_lzdk6,fVhJNo|q0>Z2{E$@#Ё:,OGhl,fm`y> FOW4XT/0YhC~3" ?5J /4Gg!?S{p%+W'']iIDcUhV2v'keA.Wı~Eev'H,/  (GC)1$@}B'X) @x4H$'(}  (GC)1$@}B'X) @x4H$'(}  (GC)1$@}B'X) @x4H$'(}  (GC)1$@}B'X) @x4H$'(}  (GC)1$@}B'X) @ oooݺ  `뗛:S}U5(P(Æ&MROEv>Y{xLX"(r:yt0xMzEt {l_++奻䔙Kq@xkٶwl&[>X$oCБ $0 +K?VJ^tO,CΖo˥CдT!>IG$@GBڪel^ƌg-Bl +eZ^ 񥈠 wiRWՇI͆H mrp˜c[xZor 7hϺu2$XG2ao76s7F!B~х&\K`k:e̙gDJ"x,]2k+U`upiZkQ}. ;LBI:]] c_i|;:zqixc#]Ç˰/]gii2۾/6amׂx$31IobT['JR8vpW5[ecU ybi *5))簪y-SN8_~T|躬Y1KӠmiсx=YyDzۤ )7+hv ۾/N43gO(i{PTƫntF#q__#gG.9G^niMOJnxۚZ3VɃYyGѮn9r܈r3nrhA]-0)B֒ M#RkլSiDjVߑ_ԩs~%fBΣ 8JG~gL:T-?į|ƷAiVkD;cH2zϽMұ|y$(VԮ]+u;vHDj0k1M :jWDįmK 'H;G?W|S2d/K'"~*F@XDnIK~U/[.F?+^c3*aĕmd/pܣo ݎnbk|J2acVC9zd߸Wt R4q :EǼg).{.f9S&h7zn %˾?D927y;ߕ] P;gGjk}Fi8-WM: Bs'̶vTm?Bz} 8zQ6uT@mu^~ECmʜXT /J& aPOo+ #!r3|ìK9C#ZnlQw/șmUo`u @,- *8EWWY^cFfY\_q*-O L5.70nZCS^06~Վ "ii婂c ;0}p)W^#M]ذCtn!PU>mmhZMӜ3VU킨>uMkoR2N qUt˯=U,E3\*jEEoF Jtt i-U(dyM/( ;wEנ:MIՎ&\ -%-!i,W +cOWbJ[O`:FQB@.[l<֕@WBٍ0<5abI0!-,5#5:k`Mʣshl:Tkďv?hGVfP*hkx?ýzh,X]zr QL: ={_W\[׫u jz}vZۖKPtWڋf Rq;>*˄·bZN~k GMX|zkZ&v mBa+nf٫VZn,zPRGIE`$QIѵZ\qhQ==G5)<Q)j/8lhv?A.YK/D][^>B5kAΖ-,Ll+O}JwWX}K<b3I'u>,?.CL@ЁC#и"l2 qvݵ&.m\L}al]+p['Aܤ0_y=ᾏr@.8:%W$ipYRd1V˚L9 ?@P2B ~TPG]uu{22,/gfI#,MuY9]Z?4`x睲?$ |rϾns=wKē|]Rc_0w[Q5o; Yh¸@˕wfqgv<F2:,VhQ\|_]si,}Ysȏ*z2S0>+' b-4@.8׆ƭi| ,3~:y8N^{Lyr IDATҁP-m p}JFd W\/[؁q_5ʫd[oPN gY?m+ܦau…R^6o9ZDXu-hǧvʕwxȌ"DUO:5#wMC®BQ9Yk8alhS/njyMyL퀭O<ώ??-?9i8up8>";eQs/$86n?3-@p}h')ƒ>_RkUR 'WW"'a,UۅҞ^b<!k'F7]xQazRSDZn7)+n5"Pj^7ʿCx3*Xi9uL-]h\XoC$nĝgGnC^xr꣏8@278aA8"cl& 8ۛ*#>a-dT5OUҌӁ!PeB)vC]|YzĐ\S0䦽Q[{vIG0ۢ:z!؎m_F׳N"β+3 H1M[h P- %Τ L=KEG$@n!`_i̙ 0H  @6@>C80 1~0$20Rt$@$П .,0ibITt$@$П `zVzZ[8SW,7ǁ0#$@G@%fXRͲl 'ȋVJ^} Tb'r! Io=F.ww{ɷt@#s>G>jɻd@U%-hr #ods>WJ5iEo .FK*y6]_ʪ^^p#s{Uoޭ>77S_Vf&z xToܖH$-%gi}@I))>";;[];wcDZ2# e[٫&ωعk7lѳkgx,X\ꏴtL?'Nl=iӋO˼k@)UYV6_dduFukGbͷk1jQni(/ZǶԬFZB|^}E\8wV0i X6 Eްr[¤)SWъ֛wsgc˜(.-EII膡>s~ڻcG¤ u"|1񢜇+:w舞]q;7};bQa)+y#Z5CvPW_HKK1rX,zdh6}`U 3\(ƌw}&Y5U 6<GC3LfgHʱ?ʰeF_ o[iqΑ"8{,D73'!4,T89ߊGAAfMBN*L"͚/w26mۡY,Y;r͟C 1= ׃qeԡgkm7nBToG3 {I‰JCt"wzM<"󏝪sRRz(-}ERU_חc;0nD\ {F?X9~= Bh0 ^7mOM Kn;<J=- o?}hֽƟ;w 3 E8vn FFXp}plDU2\O6mDnjQit?~[~ۀZfǪoٟ?ģ@[aH, ; ^ @zn9&hCŎ$i"A)U(zFxo>sTU{. <6m}yrrs矠} 'Fc;w.~7MͿ&''aɒ%XɧXm<5:: n5||պ5 LoxWEWZ~1'p3fۻ lcl ڭֺN< 9NDЫgOL~o_Z{z=i;{}?0ǎIϐañax'MF`xTOBZ|6pǷWISUc$:qyu*_Ңrh֝D捉 ̙fC~z牼t3ى \ DD*-'$#̟*,X:wDZORq$ RܝtnڹKO-z=sc"i~ tƌsTQsso/5%5i5EE%t}U xԩO4U4lS<-p%llբFxeNƮcT*[SƭH&E'%>q̝C 獏&=r`k$ctJwvvFbb"2Gʐ;o݌{y8[IJkXob2e`b;X:뗂ysSx0sF&P'Ǫ1k|e풢R0&Hۊ̹{`؍@Dx:iËѫO?q3dWa<9Yg,H>ćH{lT>RjAb/k3|믣T@1!@-bSO瓅}~J*bsZHk^xyya凫ȝ]{6?Cɖ`Ax;H;#!)<4潏>@{vX8o~0Y9O<Χ`;43h( XlQQ :tKH{޻_݋c1cLt +{6E1x}Ż8Jsp1>Zr|I+mʚWb"|6TW}*pOz?~au9}|Xc>/;[!c;sUqgҴI[cy襗ԩ"GX٧m"B"/_{<ብc ]ǎG'=ٻyp?Hݤh`*g~ !U.XmeenD!]-qz.ׇ:8 47, Vժ@KV5+WG)R~AvzM琐1Q/> { VFLR*]nJMun{+ZllDB_3 >2~3&OARƍZ)]w *DWjΣy}j M~`T/;BhɎ:KbRx!|_wP["x{y{!rmc]R|1bJp$(s dK,=GlgTD_isauNS=M-$Ä3_{3飌HPEs2FqRm>SQdT lP"ӧMÆ bˆ@ CCD)O^zy'R%%CC6lH/e:--ls5T6OMǮ<<6C:|T"{suCI*G~9iS8$,}A^O#1XDWѷؓ}hRYv/1H1| 4BWI7@}My9o_q .{pP]J9Pw=Llе?M|՗n0Α].-]st9MC;lD~q)1bc1חYcG5adb &agoFv`pkְ֬Bs ŶRʚ&HL )h`U=L:Z/84bWCۦ(CixYmtJPIDT-CyJmWP'|y8p iǷM4 H+D* z6qfNcQxɾޯj|iv&yo Vt6CLlJSxiG<墜g ÂXaNr;j7`ŋL=OGVŰu4 f3җb;"+~*6k'h(k7uk+>'S]TE (^-חt"6aCJ$řZ%R$p >pMb޹MD{|Ȕԟ.*c&x]aFw@Wp]ua6Z[/GkTuOzcrm{QS z/^pLBMo+G8;/d>OA{4uNc9sֻk'|UՕogkMw}p$,:.* [ònWJZ:{iM?C]Ǻ:c̮E #G*qwqOlbPT~_."rN--Z}+0mGC6F/6QMzݤ힤DV]tO!IǣWwյߐЛ4V9~,yde;IW_*uՃ̞5nONA'ԗ{*&!PiMCjAdFRF|įw*x$aG~T~z-Bݵ@=1er"FJ wyIU"P/$(cxXI&qe ,7/:dGQ7^,)(Y9CS'E" ܉wbe%K$;H$d%;Cu;۲D_R$E%މ'^Y" $;C~OD@"  ǹ>9Ї*[X.7x<ک?& hL"#piGD+>Vۘǻ ڮ􁉁C‹wކ'|pyxwFw9}F%H^N62Ғ~*상CG8IV)@m>u篣M󀙅MmY d"*tCWXr ρ9}ҬOj bm_{WOyvÅ>غwKDQ`/( >J|`Ccng m];éM\=nnQ4[0;s]j"fYjڤwuD~{[{6IMNv}He9BhQ6&j964}s̆1w6N65joh+7F֙>FS*j!ȼ@3'JњzmZsA#sKS-\[ѤM3io~nhX9J ?5{I ȧ4Yh> 3 ףs{tU5rf4UEO>6Zs>@}Cۃ_[6צI8 H Nnm;r0w'94ua_LWh2ךУ['8z{'i;sry*|STh;WZM`\#X}9hee'v*7-AKppsk}m&(){vg=j8.|hзgN4`desprEi=ziH~^BDܜ,C;t:gVf®m'7xxS%E!!6Rl{;tՔ= FlTh}v&,hwsTT6v:G*vSrzر&D]naqQ?M#1;ҊJѮSw>?1.Y?OjA;)s37bG u0KK J `mmVddbЅ񳒣p4fa sm9{nNOyIӱڀѩp#esr`8zuߘ^nvs!p(gÞ}`)E؉Y&'!kT)G?ރFI0%)a?{*Q^wFDEc}HwDk/ynedMA(ow30'ѣcܰpi>ܧ#MXDsYҍE_>w}Ǽ) Ն@Q Д^L1ʒ֦Yi{bj~y{|a: q>q5[䧋[\{g Ա8~)]1q@Xv]̓',hw6B;А)iBg;02Q=3Sh4wh-lif#,%> y4(Ӕ6bd mhͮ#4@-xwe8bTlBAzbǡKTg߃zUie^3r(|3 ̓X"_z*3z芉Fb7աZ0zKOrO~A]F*>auqrPŦ@r6XH:wl~u=L?7W +?F$҆Qޓ#+H).sc3\de}`S)۩C;tsm9tsϚ>/O_|lބ'o=5:JXGJ UyBcP#=heGux.r`yiaȥ MaҋVx"3vK %G+v0rG.̦WD9cs{X4Z+5,Zm\WXF;cSd5>Nh &F1OW/.tc'}gQTJfGF2FI}:݇/ Y1xɹtazDaH$3H$*0DrjmХS{luf0x;/+'pqmE|>qBbl8^{5E'ф&Ɔt&kqH k<&k &=;ZΒ}ILeW"«jx]3M)5vP"=+`3%,6 ?T]oiݱ7 y9F }gm$o aؿ=6E/N!L!ǥT\N x)py; NkDk^(?W{Ka%ĩ?^T]r!>aN]>]|FECvҿs qtevH䂥CtB:rppqqƷʗ)߫QL?n3`}wo IDATE"1i}bNޮR w?0Md/ܶftC.tѵ BcRLk[[\CgE3WBc;/嵳U󩙗 gd`' !҄Q\4^W0$ƣgp.l1xb*fwYYCBY AhB_׿V+ٞvzD*^']8Z'":SA4դrgS 0>-Olٖ cC}w?2 ><0S2T7S&>4';$&#"ovR0\GorO?X}:t6 t){6AE223ѵOcÁ6n/v|'&W M2Mq&_"q(,'Wqp_%sFJQ\A!(&&&?tAEDK* kP |4SsTƊFDDB~%1N.cwS$F"{o%xmjΫ N$W%OS_fҹ$>>P^e/Y'(n̡RhEa1t]?R @g +ST i_X\'RgC.DU>՗PΣfJ僪H4 )I= Ӱi+ooŊdꝈÎ_kkʺ·N+r,m@ʠ_?4p} jN-XfXmn̴drDv잝@2 ?L]/"#(5rJ#(0IOE& g Ab-P^yq"5qa|eҵ`E~]0wl7hG&~t1X(2a؁wL,j*Z*}.0V2O!]:'BcӅf0*NŔa]ar]T;6z%Tjh[;z@0ajF?yHDU0D k?EZ 3G8 |E7_^"T2tEzJe*^-$ed+biaTBc#CR/MbYAhJ`JJ`QiSq1 ¤"ږPRV4jXUYFɯiit!O>^+l2ri`벫--p;`­Js9p c1KߍaΆ]a]v ͡M_ۺ6̵j̻䫭*Gl.akȬAgGHoR:4Řfc~C>K83Z4S {/ ɇ?Eځ3qJ$<]U戉NWN݌'.SۼO§3Y mB9E&6vp7l'x)&/krq) ^Q ga۫J&=g‹\ (^ ð~]qscb3?[Q 'V>Y{ݹo`EwDRy%Q7" h߿ }'@V\<dBMP}$ Qt=Z$zt`Lu7ӗJ0kDTD9z.&P-0vm k?%8@ Q=F֦X0V fL5^)x9a/y_}TCEl![y$XC{1|͑ԒGSa1SPQW7V> G[ 'J粯4i4x,aZu,|I4Y|a¯VQ`Hp2 }"@N\O?^W̕0k =LkV=y?n˜$Oj8h [k|#bq"\GfvrwD+[{9l jXFu+s9E4+?#WGsgN$ЍYRR9RbGEi~JP<n"{הSy~E-hlgGkakaGkD&>ܚ&~JW]t2BL*}ȳ!/2|ˣGHt*Qղe|շOKSNCgrXznuQg"Iq4ڎY5Lh!4?S$] `4XJɶ{2 R/cTThz\R:|H KR sE.8R7_z/>")ߒÙIx?;|6H[ثÑlExPR/,SSsV1J1,lEY3sS밶uPh[;Guam\9V* &(8u[ϑ-o~7fP88;&Pu1E$ٺQi]o[kU98x =x)mْsL-<ŞbG|ZHkVf&4ՊF U#ƚ E!*IYtovn8tbHQn?K8ҭm׭>.Y<ۈJYyꇁ.b̍_ck|EU351p'%}d %AajE^ SLQ7[ɸУ[VvߴZD k"hfH&s1-79nn7l^Rڞ -x 4kzM|&Z>>Jf4"Е#k'B+0͸[[uK-рg;Ej$F*bfb@NmsTz*447L9I6--C|–>\xSF|!^ݙ>\IC- _wd%i)Fu+a!}Oߘ^^hpy]T^L-abZ,wsSz-<д%)F^F(f;ZBd$<;yN!&ހ7SF>4RHO_z/|AkO573})^YqM-AK$4Dv%tTA"p SR":}^@_+>aܘ35[J" hfT>ifF6W" 44o9YH" hj7H$zlԓC&K$@L-w[Dz +u:I@E@Ĺ 4 2;V\x ͛wC(3GQ=qޮm%fDQ}r͸Ai{gK.LZw"y,]L>%,xdi# I܄>|zǚ\YVrFFV{po*iʍ[G_56\c'?\ljP P۽{7֬Y'|RTe承۷oǏ m믿ƥKЦM\x#GDAWb}_`` V^-jjxm.{Gw2퇯_jژxp*;:x@7Lt \`7&Gm6+ssWkK4q-<m[;`ќ!ӵXmv}~1 .>hg! ~m>{{,>4pQϦ=0oD>D)7m9.={BCDs.D`Q|V~ 9|EL6zP'7s0-̈́2~iy2M UNji ۇnL}8~.ۺ`qԟ8p"2DƁ?rpgDL R~>,>MxQ7n Ëf1gC{@RE!w1 =9H|~{!0iDW"?v8=:'reiLLL, .D,bTXBݻ G&&G czW>@Q=`|7߿?^z%A~!99<_ydc^zh۶ ~A^׮]#~o6gϞ&kf]>^&g,k+s\·>?vsQư~|p?R,_w#󇋛 T094>m{/YTcе+{o3BՇ|![:Gsrcһ}cp|UM=ndQωl{w7ħ?d?nh|aR.\F%)ex\TXI<ynE퍏SC_׵=;cM/[Y~裗yg҈Fa~FI`лKk5'm7DœD,wЂ8MLť!i;ބEIvrxX3žbaylH(kld׉Y )hCj ގ,5=fX;acE7yskdW8*X(`IItX㏅?_6En*Œ/hpi,P2iJ:k}0馧Qh"% ajjwyFFFBCdMD&%K ++Kᇅ7Ț,!kLAɔ-HgrJJLqυ.H6q sE\)lnv k%l""NN\-dY &bq*9Yd)(,'iz,r;]>&:E\hG+򑲰9צe+a 6,AD9Dji,A]ɌU}$ 26D|֊]G}5&sEk]bbS5}Ǯb iOM""C,<"Q?\m\?/JΧRM'oeGw>:qo4kW,x7k>(D_W!3mY8/hHS*ՖWISmKKKcf͎MAN@ :'lJs_~YZ,5>}4._,Hb&Ӧ,4  Hiɺ*J U,L4DZ,%|FL<ݧ"]mt6Yc` [',&+􄶸xiD˲fY]LKcNLM7~ $&ApeMFUuQpQy4߷"J=Qw6[έI[hLVYwm}T,i/w>:t鳒V/ET_kkkch*"##$vпu։1G`T.`Bzm]ca?kfS4c71kef ,=eYc]¾M6uqq&4盈[)J}Wp0x8>k x7mtO\=`${H3d*x eO?ި0% wgaPO1qlj:\  khjG?8#wPu-kc2gY/{> Ӝ9suʏV@pt$ ҥK},CzE*`<_I0H6? A -wgز0JD>x-)fC0E7#uG|U|zNy}'(' SNcQ6Γ$D6%<5ecMb>Oaa \1hӱC:k "rg}ǿ<,EɁ aNf|r?XGXbq˖-{Ip}[|Aᇻr<1}E&N7^Dg̘!4P }!9pWܪUD; X:v(U MkU>>EDc@<';o\ ߤf! /\܌3Tf\}4V IDATma=G|/`<$gݜ}4 #|wnm="$`tahpҬ!eaD7k*M]0YK}75ău:yOObMK穣z`*V_u{m}2U" hHl'WvM" Iu#S%$|re$X7>2U" hHl'WvM" Iu#S%$|re$X7>2U" hHl'WvM" Iu#S%ChTZzz:`ffss*i7uh[d9DFO==*?CCCm? 0xĐ9r.\RfR-Xo2ݻ1bLMM/gذa֭[k׮u:t(yXZZ 066ưa0j(A'Gիpssøqfy~D]wW_}6mڈZ `zwG֭[ߣ}8~-= oooˢn^þ}Dos5L\pvvF߾}rJkN~a$%%aɒ%"Ν; <@B:bĀD` }.&o7C`H(mXl|\Q062m}|(AWLD_CQ P[o,X Hӎ?.d"; Ξ=Cpttŋ1rH],/00P]~ƍ|8*4_ѣk׮"?k+ 휗~zdggLZL6mw-Ȓ "?.zEEE7ɿ{8p׹AAA"}|* J úNR9s sXSUD?m; _ SIA~Y9Xʏ04PLu9|{^ņOY|f 6!vE"u+)i9DQxMhC7ڹ%v8Z~3s!x=h]ڹ"*. 8q>RBAܗ_8o7ȁ1H MxѳױG9 6,^^`zڴ~iX[tDT&5I*զzzE#O:;xJLZJc ~~' Ulj!D\oZM'b׮]b 722RR1ߋcx;6 9 h"1q},LPL&&&U2H}D ѬknW5ƒ~D`L`/9-yE?'SҞ-"o,knj, +)9RCwRj D%_Aa nܔ]bG[C}qF6Y|ey?\tVԮ/UǺ6ԇ8$hT l}^1Cx#LTÇ?,!&8(:(QW&s rS.^&S֐8ۿuD$4bQkkkkxyyu.Q4=O*CǷyfQOS[͸!q|{k{WZN"QRĈ @Qd_"1)۟GYK~FM G)$Jyt]g&ק)/  "9rP/oA~W)P>L4!כJLz|3 ?֭l"yxBO>4_ڵkѩPxX SadٲeDD<1.1?~B4/3;_uak2GQ P;Lc>oqrrL,.K}2D@" W!25FHHOM$kCH$MW;Q:MqD_C9L6D\#t]5NLD6!p=$ 1t=hhlG\r | )D ٕK*]EPIEm ql~}zч.U2D@" UKHN;_Hw+VqQ!REw{6IR$@c PJ_$ʢyXLi|nb|ô؍=@> Q ?|Yi "5D11~<Й-R['wfFaYfZ(KCZ GO^g>pKuYH{@A@`9#@CPd~D ŜJDHl(b2D@"bbND@"P$61_" h1Hl1RvD" h(/$S);"4I ELHZ [̩H$"&K$-I-TʎH$ E@`C%$s*eG$" @A@`9#@CPd~D pSst$024sWII)RқҴfL@6emm'G;P^Ns[}˯՟ҧ@V[",&mN`U4L+fhU?=w>}qyWG53g/6Er _-j<.&y+@Zf-a 5- KNNNC~~!|(Vp(ѻG',{aG7˸p#)M%7@`xD |Ik0'f~d>]DtL<\MݵK*ӤI$vm۠c/8۩q/#bi.\葃`kk-] 7#{u ~`MG 19xϜʏֳ@vN.tn;ѱb`Ѐ`Mt.ЫШq/dF9a1ضoQ(j'kNIH2WdNLJk{ٌ*Uv.|\͹:[p&|XpcI 2Wz0G41icQPP$G.s3{.\ @JJ:,-,Du].4G++Kµh?{Dd,iz3k2t9Hgq|Y%͔٣3ڷߎ?u v [\[LrC aQ011Fxx r`;0(Lg?@0v9H]xg׽CNRP/s3".4+:2PGm4a 0.hW3bq?'DպUS u[:%MbB4tZ-wBUH\dr6f`&yX: ;tLmsqϞa4v`9pV_tC^t%.-ZEm[75Zp e/RM)if6ھچ` ڟ@ ;8ّb&镫y{WOJfҨͦzf9T%Ҹ]Ȉ)AX !4jR&koR]ŋH3)T/z-6+?|  {U/1MU*n*2WM [Oy722QZ OZQkIұ*4G ^ݚj3OCdpZn;](/Z_-BИj1;jey"`uXU:_(٬'$S%fR|lFfykYtM/ EMʫL ~j;%%&B;YJ ST&)[&dhڞ%he Zl 7F P22|}< jm?p}9֛ICGQYŁ-&'咝HK!@#/jM,i0Rt,9fi.bM H\`wGgeVrc{I> U._ i.2q IDATYBT6|qʧ}@nI;dk8 nT|3$Xyiv1nggGvQ)x@.h>R3M$G07. q_c'Nu\$_F?2 'brvZ3?vܤhu֊qIpɋ\ڌa`=zQ&Om{s$N0X6˷ 3i!3AvTQvre5m1GЮ&7dڶY5i_cD7`U}'2eZ*1u>=i`QVf si^<@ۃfֿogކ-{}8!#9Z ~~}:ӒU8-@VNiIG,%p!MqsT4^mޥ-k[C8uf.`^q]O` tXC0|Gх؄aE ?|JeNCG3G_Fެq#PxpzƮS)t Pn4@\DÙ:rJ 0@~'{qjT$pNx-=p#E8K*zL9@/UF'0РKiؠAEY{wQw mROEۍ n?~Et<_b-CMȧ (?Oc"/>=BEE)]tI3ul`E M)>8ڶjB?, D]a<䕢]?(N؏M:Ӆ=Yzs2SGN"Rݎ 8oˍM@;ˑݘ 6UV j N9t?ps$1C WIlRW+knZOiL9GRLք(R,>|w>]M4y9 t:'G'K\խ6pV6N&;ӛ9VMpwLۄW8(eֵym5,epЎC.6.NArYA6R2? t-!(H_MM .G;qkle9rg{fL/q\SO\Ӌ{ rDfG;H34_br(D@H g'{>o5hJcm9Hw$CJs_P2UDIk_[GT93eiZpEVFR}_֬%0E_n6𤥧)M8gf 䚭 H F%Gݧwg۫#-0a,k 'gӻ)c*BV8XVu mր6DrҬе4)@@`<`XLE rSQy @E@ X!@+, @E@ X!@+, @E@ XJHKDJKMq[yҼ ܆c6!'gWrF7`?t%+#}6#//r7hp X0%1)_Gϝ+1Y{G $Ǽg(~BVF:^:/ V-BM?3)#@i"0޻/^B"{s'A҅~d/ijԸ)`M;!Bђ `m.St vMb.f[)]/MC^ZԤYsɮ9W] 0!.պ~kG2Bo@%YE* p4@d]T/VvvӦALO),=7& ?Q)#@Y!\d=ir=JA@ $ =iP P/.}*Mb2 pn,  P\ `92A@(.V!;3 h"x{#""/ 'Nuў={lGj<666e˖|85o\Yp!OH&LvAZRcqbwM]tIۺu+%J@;7ѕ?O- -Z=:Muuۏ{)J"5D/KnÜ ~"}dgl!O @_ںz'%N>=:9:nGN^l㧣+2@vw쏠_oO 9KvѦ]ǹLMOJ&Vs_) OVuԸ^ ߆֯j旋Y` Y SvhH֦+h_W:2N7LVm Sgcܺ҅uPe6g/I<ڏ糃0jުOůi|<*}}[n_䞑V+>>-Ze̝;F'!{Ύp_'׵kWJKKUN'|B+V !/_&NX$4HwQ$7vX9s "iӦ)R!>},YB̼y(^ 9z(޽Ul;v[nݺtYExW\n&;m~ҤIj;x9ofأ)90Nua%Q΍ Ƽe< &}&j^-iТi4E~w#}}[SzѾgiɺdvb]Cڠ"@0}|.]̻,pD|WRV:uJv1ESff6}JKs@#C{ݣ4 hJ jOЛOE}4"[Vu_9سx~d:Ц>{u5H?`4fm~ptB7/-24:()%5cjOs7+wdž4Lш(Z$g./ iOf7]j'^0&VB3fqy-ŋj.֭[+> '';ϟVf/LfъdYv9bȠg}6_S63gΨdv4WM*"#wUڧy{:lْƍG~~~8j*X0/D9 Ͳ$a`2yiZCDիte΁7"ԅ %&39BMe(rl=~&"*,.>dm_̀XCtqvTm\Y9\" ݙ /v|b*iVC;zMٖd;!AެdllOlMMˤf1 ½:5Msڶk Ѿi\7m!`UVZ.XhffbȯM6qFI;f5k8p6lؠ>SNP?0` #M -q{LX=ByQ |xxN||Gh AD)( ʗ?^2AͷuPnMhC@ujU_3l&>1nˆZ4 nEiݟ KٚK*_I 3Z]0ulYGP86S m>Oe}fE .mrIK+_8 Іմ]j 7˹U 5 XU(dCI4M;@`F" .|cwgh;kt<ǧcŠտB`:zW6}~Җ=' Ьe3xk,֤vaz1o}$[Ï _&Ҡ(Mq>;veɋ͚0Lq@ 4.?oW)C ^zW:uH- ȼKEԬ^"cSyaq&-RW,c44) Դ1> Ki6@#PT{3~nR='PN`#d}p`f6< rGpJL4YcG.A{/[R{./U ȱ߭6#_Zkye+ Da:69Z;Fp 體_4!b֧i~HA |i>HmL@ -w/t-Ջl>AxgV&kњ5kh*Z<’F}Q?s47t~4]uT#|Np@cPoCɀTvYf3ekgI^B]$57#6-,49 ;Gw?ڌC!DZ0&DLp&2ec=ɗ3q'ޚJjphJCֶɲ!##o᧦Ј# Ajɓ'Lȟ|&"JKBƩsiHYi^NlPKHA$Ӎʵ4ߟyYDd-!Yڡv0/S,EL־*Ụm1'&SD͵Nǜ/D]U=>9!Ђj6 0z"@ӓe{&}Kόr,ҷ Pz \M@?8ͥsYF,# G@p|d[óx X2rG&/ "@EA 7H!Nu%A! XHt" ()&!wLeF !@@I1A@xVc*3J @C@S D@P'PRL*BʌA@'B:b P2wk+2#A@]Mx z61o)c hXQA@QU`FAV@@V8J2FA@ BVU[![(A*ZViTno$c hXQA@QU`FAV@@V8J2FA@ V!RJ(888ߠ?C#""zcccC[l޽{Mcݷo_}En}B",׮]~!@k.1cYZTOiܹIM4Ν;éqƦ/]DSL[RRRhт&L@72d%$$ЫJٳgɓiРA2PrrT?e˖)vԶm[5͛: .~kڱcjJՕ^yڹs'oMݻw7g%\yԲqy{Т)ruhY&JR̕Dj\7^ߗ<ܜ9(E T?1H>x>rwu2dO?Cmr5?Hvf*4~hjްNVV6:+m{Pq ڿ 5_T/QAnًw/K:KԹu_7C_@ԬAUws Pe6:NhGќ%;hMC_W#t_ߖ4{STXVrA<_HuԡM6o%BBBٳ\S/^L| M4Im_v-Rzz:[NmzQ S;(+رci̙j }3m4ڿ?O>MK,!OOO7oũGݻw رcԻwo uꞧ|@GN]L&=*K>Q&yxLLzy[hԡEmS4 dذ=|Mr4VvT@<\JMϠapZ%'8^Շrrѓoab^(bٰ*swS6T[=sSßɋ.$1{u&թc6puک fmc#{px&0L$Ρ&;:5n U\ɇ?wMNлӖP-&u_u" 27AV ?H… TV-2hŊj /@ ? 4( J}n|W D ꫯ%&&ONR5W=CjH0 @!DH6 S5P)p&N2jҩs4}詇{R7&GϫOvjSQ 2kӶV"(gҚMM:4A"TkӾs{ɻT^B2imaJG!fZww[i4Ҙ{^c}GE_ )Z1bP}MAimCsIYr_muA .cy?hҵm]W<Ѿi[HZ$875"+7Ц PW IDATI@8O> ѣG|<\((Pe4h}ZY%{0A:u2ߥ4 {ァ\섯ޞ/n̷ucp_&|!q :`%W)gf&N闿7їg"ա܉\Q]MH&r)z0; bkk%mۉ34~0󁇯w^LUuۏџwP\?w v]]r,/*pԄ, WTy2/e ܦMH?3];ͧH/?^ӦMW^Yf|y|r)٨4B;(1 H_`i 6lLk67oެV\K[\r ͞oqТl=$诓=hԄQBVhC4Oq볔Y ?j[4 a򹨊SZ`jZ•M[_/SֻayI>ڱ hh>oQBBCC`.BV5kLi06<rDQF)? | 0 8Y"DP~i ƇKHIIQc6(Q 3ز}״9덥0S9z AMPOΨL@:s2}?{-" aLiR*ɞSmmJA告r߈Q΍L HPYh鍐#sYN5ކ IU{^zuYQ2{*2:qDz饗T>}> `AeQ$hfq*;.uhV[C< :tEKM&D-ز dU?O mYN|85oTwΝ[oAiݺuGy`^CRSSO?sRddsΪƍݻ^Se?Om/2uޝ222{!hgO< 8V6oLjlyx$4dذa_#թS9LK///ڷoaYJEp_|=4}t;v/G}D۷o۫mhf͚(NXǘW^H}}}сH׭[Mj֬r>>>аaCM|5?0'j^FpmD//]7mc/=|OztD76HE0bF蠚 |aT-Zt ߪ~ԩS`iڵjH m5jH*H fɒ%BvF.\ZjVXAnnnԥKUf˖-jcin۶-ϾuRoQ#v~tT lMT@~w}G[VZ.| Oh >|G~q4󅔙iIgݜP!J+74yl60DV%@: >`B`N4̙3`=hѢE8Ucf0Ea^xx6CVqՁܸ͡qԾ9`ڵK ?Zz)Ewyɧ 5tQo߾4gzG|r b}饗T9&|u{S$?*mrJZ`2իG{wh.cƌQ#mذN>BI#ĘL[c=r(BCuv Fwu*hڣ̿ke}M"RV/c͇o9~mq~iz(tRf#`U '>0'?~a09'L@OV!QQQO?MT$bkk|,aC_~H3&6bȴiӔƧ AkDpERKw][UK%Qj;hpdff*\EPw!~? d ]!1jf$Z"_#u0 5OO#K/Hx &RHQvF3ў^b TvT=ܜIּZoϩ05m6 ^|=75 rȳ8q! Mdiԅً>ա&BcӴҥ HLJ&UIt5(A@(K.P.tOVӞAL8\k : Ѝ.R ?+"@yE %50W9Uv5D]LN{~]J!A@pYW-{R̥t.d T8EQ+۱nsp$O ;Б (f!+B% ^KQ1ԪE(UvۂB  P۽wD]$ t;H#/*v`p矝խT6+k @/M7#-)ڳo6UKEJi)t_𙓝ojd)@i#?$:"JMB^\X%"@ADqM32#̴3K9π@Aܟж]))'! wHeB !@HI9A@pVC*EJ @C@R E@P/RRN*BʄA@/Bzr PpT&$zԋ `;2!A@Ћ^ T8+! ^"%A! XLH" ))'! wHeB !@HI9A@poFFF&]r\99gZSڵkdogK榷Ϳ'A7iˀR"B;z/ZtXI999cڸieeeAf`oW䋦vϝyImGOfcNSnT)2^DgE{ť_G"Ι?(\'߅+UnG?{у#y@pL#h˝%мEmfTFU lvq.X_3:ZL$O2Aꠐ (Nq h<[w7<51Nmv9*M|us$ W i/9<7?V>um ߭7S}8F\f-`.wW/ESFۻ?\ r9ҪS,&' ݵs+кAxzЌY i%ۨ kqh9ȯ ߄4K^WvV|r٨4jvE*H"IYP9mW&C'L}4!#86+s6,TYFH"ԃGO"48!DuͿсŽ6ȑF*R$G1oz =@てڬ7oѬ#*^Gz1MCkƥy·o=C=U& p*9BSW*޴7F_ѣzԱC+ `Kb?'Fz&̚5վg VBCdpZn;EՎ*Z61D]yGm,oSJUtc2qcId z GjnTR9HIkYC>fH5(CU&?SƠi 4uesd4Z5S Ud͠5{@B]Dl&BjY\]6s? T8b77FH4;aׅ;a'@N- L^|}ZYkAM.ErtK}=fsifMAD5\X^a8G -\<-c0 y۳/.~/$!&.|~wt;XK<% H5dA i. WlkSmqʧʕrHI:-R1agdi_ Atv} =. ;eӅ[2L&s7iܶ 0"A߅+q#b)ޑ] ~@&x3LD h5ِx'ԋ|5KϚ;ѣ-W+7"ȋ3F P,GO?Р0t6?̄cO^䒬F 0!Ϡ^&?הmoZ=a&3$8uSF}Voմx]M,o&\W#m)m7(_cD`U}'d[6|Fj.}ROntFmjoE3.aqT8N}~C ?z#f ew݉LKoT#NrX=;҆-{8.i6"j=2r{#&8k)>jysT톡}/Җ!:3y3?i`\W9/m-?a&ܹ;L<6a! b>!];CCG3V_ TN1uu*nJ]LdCy IDATuЀ4q`6Q O4'_6w+w9Bب~-:55>`P )*p例sQVѓGkT OOIjW3) HxhrP|,at{wQw mbQ[Ww81~yFTCW&QxNEz} ,$RW@~h 1ԏLC9ZffZOVxcڶUC}XON"Pi0F ֳ/r.rIIZ^]}9:E|@a^/vYHV!܆/:G"9 l -VN5!S=D.sɞs$ɺz 1l:]QwiQEKtxy;"JjWR|3xxpwuz5ȃ\.3Dp ,(º<N F7Ƒ LժPTLjǓ: Q=sBy`>-Qs$ёLhE@~X#' 4i/R v6TW;Nf>w>K.&uDefuNFPipUJhٟuȰW8hJxZ50@" d!]%*D0pki-]%I'OWM≌NFAƍ>EW~sό1iZ} b ZUXJzP f?0@1?r66$np9ܜL`vdÑfh))8㓉〲s(>gI4RzsmWuJzo^sONƴ4fe;0;ے KX』I9c?S( ?kvd)l&%X/wOYփ),uq{lWcfkOQZ :ZC\\}zw:RGHvfPF$g̋X>돧!'fYnUnyԮU:6kl2mdxBfiAefGqzNYN%i̱ O oΖVJnXA@(RO)*@C@ $oҍ ?1 MB@&-@C@ $n( &#-R)-5TnҜA@*mmCNήTٍ x镈3Ѷ+їhʴ'_yI1iYoRN!bw|UjiwZzƒ_ 98=m=S4#HA(ZIvt: -*,9F'Dx~)05 'Kc,%A@݅WխfeӁElJ,o5/ !nԎ6S o/C]mE B~)Al7͸ڂ!o}owE驴'Ι/.9K G퉫L]=R9:l~]Tlr6Ti`NT?|Snf)A1W!7ٝ ؛w.Suۺ|A&#ƿAf]&0Kΐ$g=JA@([+~*M~6lg&  PKWiJr`982A@(j!U~giXS%_ņyPTRΡTaҲ9ҫ PpDsU7W}i,7:b~3uw8CnLj5-^_FنBj L}a^ Ekax&,ŸuˇSR5:q9ߞAwgX MC۹-|25 Üi씛BRTs*Ύ4\T\!gJHO.J5T:ST6̝BlsK!e]8K%yo ppcNpg0)jV!g;;:ECHkJ1ękbO;it9%P0ʝ0`c&(S2EPiz# onxbY4{~5yȆjiW͖^HUmN!`^bU PZCwLKƸPmo LLu'G η bR,fjU`rNYDh,سŦ2ήfCTàm;M45}suH} sa4S]65EAZA4ǵG%H7{&(dqsq._n8mhoI& f7k@BgZ[Ϟ7;)cYRҲroحrB&C(4ӹ׻7ևJ"ОVˤl 339偦XGO E0irvWi\"3t˿QYMl)؊AL]JebL'\ȽP0_-]JFkw4u cm¼wct<ǵ9]@gTÎ5n[:dRqt\6`-eX][ `MdZk%eF 'O2^dHD:R ʦf ng.g h)k!i~aq*mdʁ~_dܨ\aXRX1Ε+p[[-;v$?3]k Ǚ +ƺݝuiLD=Ǧk[͎niO F9'|苍4cg:kdc vc>g o<\ftkZ;U](e1e<>64go\h cQ\»5_л~Im geغ̋Yi|K3 ($C_*B>+N.g~m9EwdЂ ӝ$-v|VϤN|ǺwS0 a95e+-hb{[cD ]SRps,M}ϹSSDXˁUч93ѐf5H5OESOAl[Q\9"9A[_]]ʦ_$6oY>ޕj@xs)ϭ)o TfҁZ ӅٮL4DtZ3ɍLq SfJO'"mg tBntOc{?DXcN:W0BrSW"蟇]l6-QUԡ6J"X  KP񔞫|uJ]3ܑN]I|'ѴAPgU/rYuaӷ{% s XT9رnA3X3'N?-JAfs7WW[Lxo:Iƈ2$pݘRs_@ /rM .Ի}LTH(DkteR]"H"c}o6Q"mlLthz64Ԟp2/-ȝgLm𵲚I $1f+jՑܹӇIb078ȠNLT|#Ycx2 C{,3aͭurK` Y]H vjkO)ѭRL,ɽҙ8q!Z ;wHBp;xa|7WK2EH͂;Fy؛a)kC;txU*rѬ,蠴#AӪkcMKٚasםl7v.|g-pΠ(!hߗI͘~QlTlb&i`m|EA\UYC5ś7$f,m{ѐ} XA7{'H\ p|H=_[zw8聁fXv UOum;a^cؖM1Bl.l,O"cix7]s4S]TC0pl *pf84Ȗll{'87 (&W2-k!*~-Ƴ?l_F-9(rh0*gF\ڼ ٠oѶy9mA Ӷ BP'ј)Q_`SթbK;X5NsCZ1mY8 ڦ5~e]E~^?a3 \j7šѩz^Ϧ{:н|LΘn]ɧoO~Ba.t 5x'RM_(W~vxbxjq[6_7`7=ooY' .\pe*"Ml5xVeM;U g,ڑft50aZ~ήhfu̳ؐS=U 4F`[~y5 ѐ)n}FQ&6"$z}{Kw8݊U` &EۮM&&mIJX,kݼ]Yޱ.=&~Z~lg_[8g=92 $:TgI&֨n~{^kc0؅j0f0,Š}/k>3t3o{*xig5f˖|!Ȅ=~7̅u4<`6-#H8JtWJ5wfx*,urMcN9#M&Hͻ,Cl "#i:{F%`d߆-vcRA(EqFv SH8w٢ c"T A#.Y,oSABS=fq1HRT\yo<סSOs-N>)ҜOI]zu_GA5r|f9᩷<:'8ڄ P^gscM.8@ha;ç0dM kR>vVJkqٓ$b'Yvx+n#*s.Hb^ 3ka]쨈&kBVs›_esPF@7ǡy{C*/ +cGe\7!&]hcD_r4r  W"hICZJ P]*R#D졧M)#@!rr.70@F/Вke6)X=*>SX]63Aؐ pFKD#^4A8v9A!t?\{T4@fH kz-In XpYUz;ԭACzt&/=ˑFz;r 6i4jZǗɯxT,ٶnդ=ƿI@bp A sF|uHjN>UɞT V*]gC #o`JR")-%ߠşMT6 @a"X9 v[":Atw/?T{,1! .K9"^)r\Z1G8뺃 iT  p+ x+% X!@* pdwQU{ѽ-tyl>5lYDC1 b'*!@ qAk)D@ZB[e;vf Kf|n;̹$ #X( @ ]bI!@t+%@K,# #(`e$@@we$pLH P.$@:  ` %H@G2Q @ @ 2 8BV&J$(pXF GPDI}=U]T!U|(R l#EE~(RT=WUS-eŅR몖Ĥ.ү_$%$H\l2 ܕ@}}Tܸ!1_J n=kz@FF9O#sȕ‹.e h3ΏG$@$po*hv_.}CHOBw3µZA#(~>yH$к=R˒OgScDWrd_/ 8J2$s\-j2%MH4̒SӥظhF誩 J3TLH1%ADGI hh n}HHM tWZ&f$ عIz! 6%9 uFe0:5JN$@$Жb;*7*"P <*c|+ (? @ͭdEH%@I0hn%+BM͛W_ɹsZ" _-:tЯ>}Wڵk_[n5\ :C $po/ʆ ZM@Tʲ<9tu춮Nr},lРYo8w)jҒ@\.@a& _ՕB[~H,:u^zIԿ8`% BYDojٳgm޼Yi&y'W^2}tAiO|=?c}Q/?Cƍ'-c)Sr8qB^y߿̘1C6nuiҥ2j(A3~Μ9n:4yˈ#_ ?e_rE5p@yGdժUIp-ܹs%11Q3hĒޯ\sOu^)ԗmW4?qz%p$M?x`}n„ 畨~J_|>kw}i&y\OIIqC}q6UƉ'UU-X 333ڧܝa_ұ ^4hT>r[Ϟ=h-S,];x$Xx9y{1QB=KKK.w]Gn"/ofGV?>EG_A/B0hR`I M6M^*?KV*;&!!!:2,))$ۧǏʕ+P\͕O?T_[bEY/^,N>@F$p@||nY< ܹS#wL-S^oUԧ@s.-|r=Gi74o}ҤIٌkeϞ=z4]twyGc@5:zIDATDEEÇRF?k5!04D0`ɓ'|#A7ю;l$fΜzav.->8KO5queeez:J{WEIFm)!iiiZ%BDHfET[{={()5%5w޸aLLvQZ}Sx"""t'|w婧Nۢ"oi%Oׯ_Uaj4G_fD`3gȲe(7F!'w|' t@0(AP}kz޼yZ "O4s}=o[lbJvvvMrrއ/biyY^N< 'Fkp:"V:!O@/rTEe_~n>3Y-Ί&*`Vb#0 1B^Sy C. v{Ցbf6~o+ E!YYY:*E7h ݇/Lxoڵvgq*B;s=̰<:rô%Kɹzjپ}&-OC? / @plC`{%..Nmf]nl_lbg…z""Z`n޽gϞ2vX-|4Q6 r0oj6DT0H:H=@ 4[|b0 | U1kR5kQàȖ-[Q<#>LE^C9};@$_9k.lMMZMB_WqN:U03:j1Ҍ< ~ 1F"AAyt?UN|#vHA00Z0'ƛwrZWٓZXZK.w'"@43<<> P/ݷ41ܔ?d5 A0@4 %@#@z֘S3}XY>퍐>yGKD9C5(Ow F$жZ ܶa$@$`NhΊ$@AFd7!0'`,Nϼ$ 3h 寧̊B/ h]7nJs 0TʚYV @J FĪeMң )|UQѱFe08)/"7JN$@$*LiUTLQF-Qr4Qt" VEDEeo$H)>!YJ /˩r2ʅN$@$0OI|UY `XDtNN9h$@$@`?IN)*S3*CW˖y(kDs)'S#hY;#%Ek7zdLcoP몑RaZHFFwITƫBCdG$@Ԝ =-3S08"tVjLʁ`abJwqTIueWK;5שW}c# `&:EеDՕo/ov~5}0^ ]ե+is`/yYw{{UsV$2  9 9+z  `PVHМ=I0n(C$`NhΊ$@AF l7{ 8wFBvn,AZt!ElɆKJ߬"ҥKvj/Q>k}iiiݾ ZEEnp8,wԧ›oc'2Z"#,*%e@~v.JuVo$ҲR|G@uu蕧'& UWFXhX/ I籕ص߮Y ??_$M@Db!98+*0ʫ0{Hn ʫ.(Fuh*оx/7ƌD,Dj_.. Gơ剫SFM9z>GHMŰ#p5ar8;XÏزsn^W͚&466nk4K  =c^uCbر8܂Q."4 8dyew Ç?=ԮM!%xJ c]Qeoܾ 88 0gmStyWYܙڤ9P`~]5Ƕx3n_- "+dDz tłY۴-7֌/>_i㏄`0s7WW81REcs/ڟ]{ NW3=׿.\C7p&%чd6'mݵܰ&OFQJ2s4 4 I+>Lj"t}|0"a(Sb(ko6 lPm*n1ilݔ&vg|kWœs/$I2yWմYgb^8?fw6%_gM$Ae*_S32{O =gU5Ѐ۷?nAti="mP뉌5K0$ڹs'SL3j\bC xc'U{(ISspH{xjjkwu7vӅtR|gh,4$+?>$EO=xadeF8x`M}D&J}[??Fa]֬ݻFuq^>DTouLLE_WQHeWC'Nٳ3y{8cl$D7oyA5~|/ ;9&퍤lG{V4'OQ㺚XoAuy_-_SG^ybË/feDDv=4G3TViMA۵H/ %W<ւEX&".T#.d;X?? 6I2 0,k׮E rPŲj7x0z$ swHdI2BCDZСCCZߍ;QY]"\Ғ6Ŏ>w6,fL m F.ZelM"[y6,BۜyF N0Ono _,͛JZ=ѱq =[6#J/& >Ȳv>?ǎٿ mnɍIOuiG{[Mbgz-C8q<5+4M3>D'=i{K}=Jhzu15 мatI[X$0&NWjtutbk;`ĺJ%Ub{_CQ\\1XqQMŦZdq`QvKr %6(Nb&#W(hbca0ܳ7$ͭV0@q̹LyYTWVZ*">51|P]ǔ_l4xq}y\{M&p Ǫ1k|ͼFCYmUq` >E&lݼ;cŠ%_→ÕgQ ?Nl3A=#{UnHpeuv]r~R|M xaVjTZ~Y<)))O>&{ƙSmWT {:,ShiQiyO?!!O<8^|5Q/4h04Ė`]BoAaqxj_<anp^F3<_< f+V.k0 «#vH>_ߖQca䨑לk s} lafgqssErVҫQMԤox ;~E>*IJRmJ7֟L7aX|b 1;*(R_Wi5|3di"%jk?/0fha=M)7}A5p"+!7*Fd====Xcc/DoXGAC/yĔ@eU <*>kK&8q~xv= uuz庺Joo_^zeaXDQp~ɇ`8@q'Ú[fqRKsp0~8jVWޟpBNZK`"݈֬Wo3vM#I rCP:"9-f5m;4UIt[㿧H^>~C@`ÿ{8/qM]QTwUNE7!6 Z~ 5x~N#Nzb[z-~4BOSd k>j&!`tc ߪ9Vg2SWbcc>. /H,l ' t>uG>N^}EƲ~[M,̙9L-RL3# PZc~}& C~ Tg9C8E|M,*+.);BD FY }c]qAؚEWB`!8;O%7[N//Պ5mN4e9C2LHF 1=7ePb]hQl7:Ph(ӣMeؠtU-\O?_|Q4HA|9rWQղ,d.h /1 xze5͹:QTVc ~=nߍlohm*͏E&]$,IS}*04wδI":pƌ7oT)z RfS \ d2Q5tDWMˉc+DgTH< VɁcgf# ijP YQjDg :Hvk2  ~'fG=w \E # eZ-Z(~X6wpʦ;h_f4?DgL_pZ Y _~Moo2♿< ހx /i0H6lC+[޾(³cN…E ^Hct`PQ[jlD$C*"%QX'J˻$pR >p\tbkWc$ES]ϐ&fp c|b,qh7`:{*3f{𴂳䣭g" 6-,:mSe?q  y6q14pjy1i,F ,BXC}?_orSD|%V.kO2X_5 cgP"!A+*'Z}Ow>DdT;l^q׏lhJ7A+隴E|}JOEMz2:趧FHٳA!An$I=U"%nSS9~<渲VwYpГ xUȒ"P\4(D@"K:)}1K$(qH$x;eD@" @@գ5D@" l(t^6GSD" R\2D@"p9!gH$yƽ;6ӫNibht Lu5BR$K9`nv&}m%"aԤ{iF[FebW+1vdRݔ>8 e@Gƺ0qƵ }ʁ &v}`qؿ}}8Ѷ9% A,p5}ao1~br -gy%v B98|a"/IznL7~gH;>T&_M漎o29ՠ,,pk=!QiivptH䛺jduhQGw&W}!:.>B٦V>VԉjtuU,ɅuCPQV7z4(7$fڈP9\tiKI(l BAD.R:7OEa5N7!d D V>\&FMUN' CӁ; OM&ɭ޴''F5$. s& ۋ?/9賋~>1o䔷Z a")w$c3jpYFy<gZaTeHVDc@&&hk[pɥN |6IbؔdR.Nz} ^Z&x8JgFiU=[/PhLD >x~%VߍwwoFxըֵY6C$[$:Rєɏz8TxF.ĆG|\gEl_,06*gTءbyE"7TpCs?[VMQ}5QK5}#&.@[|uM-#1׭Axx2+} P%ȏk9u}[vK}"JD]l^NGjמ&zW1D_3\)W4^U[^Hu۟&8MߎnEB8XdMmNfMOV" ;AߊwnT#q1v!2ovwY-,>a[;VZǺΞ5}E`+ZrPL9Ox)04\)L5Na)e+1ex0nx6cmcƃ0YGpm 0q(; wh3QT\XCg˪ͮ\S,>bKLio7o=)"~#onZK X@)ϕ47ۋX3q?ϩs#cwqј?g{I]{/Ffݞxkǎ:㏳&1Jo9q͂p24?c?!" ŠiNXeCQnw'ƴœ"bK"tuՕ?V^cr"`5 \UUCIIHNֈZOƎz[WŪ-'N/w 5xNdTVo7/A=#xa6EE\l 4v/q4 pvvFR*^1Aӣt-B4m݊i7ic&|H!uH: =~:,g~mMi:!/:?4>/W0i!W=}Qm$mq,ŕ3&Q{E8c+儏: ctK C7 / Twz MeK ۶s/V~#'V S68TOaA~b9m U1'@g <#'U Çj :Do(p{vz2 M?ef_A1Xa7$'lx̺b<[D\0]9Yhgyk _\;.^pk/9 ^yeXcxsVlMi>K],v}T.#e[8^%WDE샯7YÐMNmjVȑ)k#{:!\OsҘ?>-NysR`>֎å<+pH E4E}Ma910.o|aQWOu@!.FqiUԶ1g9U[cNats5ّtZkIr_?G@xZeRۋ)6SSC*&FE *zqr [T%++܄#GrPA핖Wg xHs( EIi"‚E^Nd˱[V>|26,oS󛯋DuS.xs>ةW\@k_ohWU!:T@# IDATh{ISh=!n(XYS5z}Ɔ*~,:vgDwݜa1(*XL#v*Mu{0x\QO.詸xGk Z.JNO7V%uut,N=RSʥD@E Q̛#M.We fIK&o)ۜÑ& eJOE~pu_0NPd5-WVA+Ơ:׹iCK}|pL Ge(4L`<'.^۴ńP_K5;-xX}X)ݢZR., Uřౢ^7fMT6KW2# 4Osl8|J)U\D:<&?_D 7FWIъ7c3<G;YurU" JU:\=},V:x`f =#&hLW?ۅ.HS(&+vwU'Y{˄"8Cb_zl41UC7)#H澛9Ƶ%o-&11nӴ+V!7$mWO^%kd2-OH5-ZԺHr iڊwD0kx<%=>\"?~1Nx? a !+o~c#?3z\[$M=ݝ v+ddEYxdZHS-+Wدt\=My\E@z*}UKQo@ͯCDy/}TVmݒzf\g,*XiΓ J:tyin^_>EmHYEbw-*WUk㥝Uv,UHZ]rĦs|1sq8PHhp]^._w\w?\!-cGua)%_'" '^C .D2Me8gD \Ĝ.Ύz:ˍ15Y_+^`mZElJ"pATv$)=m]^ƕ0νQ4Y<y俓" zHSH#FV7 BЭ efDKjhbiDXx+G!hG&ГU<$ OSxluf;^H@yI8pV$m6/QPIX Cz{XזaDߚ>#>@SR;ly:g1QX lU[G>(HL{Fơ޸`jW" n UΏDT`q8~2 S%DSm8#_5HuZ"E" tVȑᜢJz_xbՒ'K˫7{9hWdD@"paVIJi~ah!R$@_C56P_D@"`aOnK$~y!9HDE@#ʁI$] @&D@"?1ay%]S,$1{SLc`$.׍<'9aeɾsN~D d9DD:"J$I !J$hW" HYQ" $@Ƚ@?@@`?8ru$ZEHACH# :.rD@"D@"`Iq{%~$~p%H+$,(XG@u\^D d9DD:"J$Moccc Եo ~vOu(+Duu cJw%G׫6 xzyyy r@(N?_v;`wĮ'5/x7͛lyv'2&KYzD=pwi jk3ɧBG檮δWW; ޛvա~K4=Zy?/"He~8r&O!pÆ_~Je#bF cwR04c7W7>~@oE/jIe?DzԈVo@}3GQqcQpqvE-Dn5r(CAA BC:9:b}n3s#LS;-+@3OxXibA=j86mXSݩ'NaxgL0c:_dIx2egLma34]DB8r+`Lb< Sg|=0nL"aLv-q6;\Xv|3p(9Elpqqcö_cp?a O=>S&FyypmL? Z2@D kȐ/|&+BЅfo&]9}&[l3Ѱ0>WҒNgq(uWXUU"/G} Oxx,b"-K1tQNg8TnǝLs KAr͂biʼn|^DfZ|f11Ԅ(S$\f2U~~1[>nZnԇF#>>^C7nq1&!$8Pԝv"~`{+Mr;S58u,a1#r*Yf\ؐ>@ _P,zi'3] "q' 1d˯hQdD&R҈T=2w޾U54j咃W͞*$ә EsPKti9dS%¼%걙WL&Z@sǭףVMW&@B "pʨ^A]CԱfOf -oڍ҄6`!zas}i'Yz'7=`~ܸKf;nuFv;t$ D9l$ 35jK˵%ivÈ7SDZԑf9eHAi/%p@g 8(L!,8(@huQebr  94uy8jIUo7 =",`3G,ǎ+@ XHR_JxX@ JOEZPRcXXg~yoHmi9!8j=.;fDa>"42]UY`X-&3<54 '~é0V,o ӹ?8qsk ٗO?Tג[ GF O$d~¢bۯyJ\(^r6pЈ~$"9KdOChKs> CoJaD M'u;x㒹bzAG[U9oOL%ұs`hBX\f3MuI#A׽wQ1<v_ p)cZ`˯OLN6 @DsȼvP^~ ޓ ;R)2,l3)u%LǷ;z(ER[ĎʳďuRAt<ﱐ|&?0<=#©gC>B&,5sdo1uLPHtJuU,ɇ('xz<7ap<|mڠ%7.gvLaLZbhN1`Ə,/,-798`BsXhy\'̈́/#4#NJ|ΐFċi493^4y:&2D&pDqi O_dܻ w2 +bD,ǧ$*iAdJȓyR3OC'M24R'H~h:2'&B#|Y)3FC% bj^Ғ7z?PJ؏ir Ow7D ج@&8YQ#+?s 1 t}pN/{ Nz\iRrSvvkk?f犹ɇS&wC[S%ptיo3Q,q{ U%G-۳Z?9(¤ӓ/P R'"뼰V5 kzY+YY$wOX)'biw+ģBS1q_$FO ?}iueK@"sS#..EdBKH6m8~UFުH8ÐH$~~ޞޜ7O8*D:P5>(s@mSYN" t.MZ1S P89tQ}r PWSc9exj4j=(H$D jHޮMPzI[4tTI~",I$=+bOÖeSmk6kz.ſKA-޴/2D@" 8'MمQpt/h3j+JaXh B@"~hE;Q4vNGNe m?ա^QW/g;<I~s[=?03V,MF xP*iE-*-b^M}r7}@cSv֦Qrjpư`kNO4 )+縈;4?qUe?a~"`OcQP݌Ћrѹܘ舑aw|ր  9^h|2;O-h;H~A 4A-=D6`VhW l"XbsU&]9P[_[ _{8[$H?G tw:^ t7ct>C^U3-[8"GӋ&PNPO`̊귪QR"H..AY^ǩ&}Rv."X/;i,N'}8ouߞzQZ;p]> >1YĚީ6:X o'Uo`s=bw#0^\oGM]r3(BۈtA 'bZCC\K?[):!\@$B!aR}R#`+;u3Vl24,~D6,:DP#^b1sC"5aXcf$4I5!U  `Ao)gJ}S_g[xd:jJS=&/p7:$q|jw6N\Hdy]p%;Gi.riL%_/B#0h"3ɏ.7jDyb"߮!O|BNa07z.,T%4E{;+,1t"9A/Wu'YQ^/&,-%A&-u'%z.XNL~E1̀u ؓz-z4b!E;bSΕWoƚ%5djr{bJ2YW%ҡ}t`J{<-!Ҥhv4:"}dN$͏uee-`7}T7w! DHTE_ȴ$e22g8݀@GqQ] zic#pj/Ljuȥ>Ӏ[xZ|ʘQ%ÕvdvOA 4$庍a7ݍkvܘWXttwW7-k}t=ǛB.l# xF~"dQ&mS-8.rc2* @KUͽ^F~1;@!DT$ߦuXgM'ӒOuu:#E,,l&l_ &4/oH2U|ZS;ϼ<Ҏycyo_v#@:IXv9Y\rEʹ\^d5;vt&|b(i=ʌZV>ER }{>*c;:[ \+Y7ʻELL8 X$kbe*L`3ȬDAa&DwJPC%_F IDATcb6ϗV$| I \h+T857vae幰Q29aVvԼ*K˟5BIcA - $1&2-u+%/9e5Ü%݀o)2B=Q.~dP&w!bCs"<uVm]B?uZ2H#yh3HLJ]Dd~jt*V'ĸ{S%[mď GrO6RH &Zsvvpp=E;HPSUe3юy`LҾ˔G__UM^>w[=WJݶq&ww{ |5͸j$efcmʝڮ]GU.Z9+nǃtR(eRj3v.i~Cp`'$SDj KGQC9 ',(q ՗`ԐzӲT'dnu89~w= y?{}GgQ[$sĬz :l <7\po{D tr^[fO~G6Tw#%ԯF3L}0k}ÔO\KG: i0 ; atӟM~bFS\:n/.+%+$&`[?墋ܳXAݧ.9qR efiE¿N%X\S}i)#"|ޕ5جSKu]ԦƷ^Ł?"cXҔx.|sFuՊ{`)is*W}+i#EMW>'F6;\,{Z*vܖy{y,xE@\3*_i@{Ѽ?2Q3Wl^ !2 yJ$=$UV*$$({VYD@"D@"#HXe@_@@`_8J@ G`J$}I}(>J$=$UV*$$({VYD@"D@"#HXe@_@@`_8J@ G`J$}&HW4P^^Jxzz ..l]Wm\zU@|||161UnnݖkTV,e677cر  9&:Ni?V[{{Rpp۔b`מCػ/ h0vp̘6 ǫpl{w Kuǧ+lu6WTOWu2hP4fϘ7]GG |1f0L;vY1mkwR1Mٳ&/7$3=boظ[5_ i~|dfÏN7t8>[lܼ۴Y$PSA,Dԯ&M,4bStLۼ$j >\T\on"dغm1ޛvtUL\6\p 0éAq~ o/j&|:ȔܸyYtد.Ύ&`Ѕ*cs+GHKnO{J>iW'"S>Ǚ|PFmQa  勉zx1M줿ׇMa+JFj3̔烈ԉLĚ~* }iUؽ&OigmE`uLR0e8SsUX' NlZ0=/]P  lqSO ЎKCff(SXT5mcĶW^^u?n;F8|,)qh Y3&I(DIREd|ԱdBee5nZM=/,g1,32ܥ2&x,DV׆blN>9"CQسҸh"bk6ڬ U>2oORvV70WϞϿQh<cj3hjj&4bLJ '2v8d8unx'qcw2Vp#n/_zF8RD.tm~%7P1~ 3ZLUn+;4>W HHڏH<& I%"nAqIYrZWPȕnFzq#bdntYf/Xz.yOV'qڐtq4irL~&:| m޺Og/?{Q7t"(,E"` Jn;جIY4Ọ'NY#ڛ|]yWM%SD D:Od,H3/b_}KDL;JfɓgW×3qiOyx=6. //n8L:kt>v03ca?0&V`oOhY[u6%lLzYي7i'b:՛FՏw!==&Њ,Dig!ԯ'a  Cg2084#pKQM`iaA`=3,bc#1nP|g@ZLeD JpRBGek1U8ڕI }"D0YTIikfdsҴ4%e4/}w-'SS#)' B>J>@}fLߦjEMKvISby~E}h HJDGmQ=hLD<&G# XõnztRe!`#2V MZ]HV\-btylmra?v8(.oiq@x+$ȾȈPO;-ǍyVG]p֋L(5|B6؄b'p~N0y?=\H.OaIpLe1D]g /X:քX-% v"%"#sͼ4cf=pGN5jlu"D(K?d-&4r O4ݝ ) p &p@Xx!k>V,b'_>uʘ Ǟdž-{E ?2T 6}ycѤa52֠vE~C 2lE@XCeMiu3iik==\G Wn[*&֐/㘪as\yZ _wqyJ#6?|{[\h?'*y [MXhQ0μr"``ŵlz(}"R!Ë^N;eDE)pA$h c)THww0sj_x_QbΠ1Bh:/'&;m\OQerbiJ @ ѴZgo?PV[I$my Hv9֌"MS4#(|*ODN~!4e4"z'L(D9n4=ФmDi.SgsQI4bk?S4/Y1ӓ'9Rő4ZJ,"2 Kb#8#J{|lr(%m'ijDXtTdI3Ə,3Yd%f\8Fޞ21Ɵz&MҚ`rEgş,0\'_.|!ۉ_o|BM8I]رOGҚfגcIݭ{g'^S0OSKW5r~ <&~;:GkƎRQ9(¤y,Q{|]5tOc~eſ.@*k3e6_`8w HuɘǡNm|JZ#cƸr@iKh~Wm>ҍ``WdzF7r@_B@`_:ZE@SV&%$%*\P$^P8ee@_B@`_:ZE@SV&%$%*\P$^P8ee@_B༞1#Kujkŕ;8j%CYzN9m+/.D~DK <ćϵ3D@"  ~cTuM 9(//:9/(NֿY}~B9 #c;CWI$=6)0 G/Pޠh3^-`i~yY:lM(ɯe&\sӦLˆQpoy 5l$/I$G ~`,'BeI>ZU6H$ކ+f!a(k6^Jo;*ދ{  JZR H!B6jl+6{-YΙ}ZI+YkW93;wf0槦(r=@PƢ"@uޒѤ("/0&ȑ)h,J<)jܘ(@v h,*3_< 1"&̉X$\MMP;\e2YiQ 3\OE@#SE (f1=^P J(5#"U(la;vL֮]+;vjժI˖-E 8u|rKݺu&r|뭷PB  Xbq2zTXd)/H0W;Alw&c>|X[!1X&Ycƌgq%8ݸpBT'DF O+Bڴi#M41OG^xlb3yϞ=2|6m|RJ;ydYپi&i޼4lP~_s͛'ݻw7~ms< 90:"߿+V4;eΝk˗ ~۹s$$$GygU͡?eo6sk{DžxH7Hc57yqcG/#{il巿g%3|7擞#Ő4z4D߿_/^lsϞ4׾{5E!> j7 IDATd-7>KY89/fϭ%z}_nrwʖ-[6vt|HCZ챶9i汖>yMSzWl²KoρIn߾}!X8l$K"gg5r| ~46?¯CUM(=~"ɏիWϕ, H($@%<իO1ǒD7n/ұ!`q( cu1$+`>s3056*^[NiӦ&=z)L2>ず?^w~U |ZmWm )IO~m۶oxlz豱yJcsuҥw -Xɖ裏Lslذ!@L1D^lyWv5yH$]zLVZҧO$k-Y4_z%*Xr;-y׍,6m^6#ثlcl3}wKE*w x~vHny~peJ) 5v4W: R7ti9 71Gl0 34RлY )0ǁ(dNiݺo1i' \ Ҿ} NANJَ&{ #ҳgO nx )"vgFOن ʹl>7![Na^)[re/K`Ã463iҤv 1ۙw5E&"J~[#gy,pyJw#ةn,Aь}^]vNcǚ>@GK!{i{`EǸ%;49v0N+;.8.Mc1\iq5z~Aza9;=8+eС~W "ld+a(>##r;ȆIƳhy1C_lqcs43#6ήu6ٜ-Yp~>Iƍ0c.7 9 ;1?3#9N̎Mo?8X33x4mL5E@;r wWREP0lE@P Oo]P. E@# )*ON(n"p))IXXDjE(@~!pEcQ`LҐMzz"(NpULl!J,#GӘ(g0*dn1*,^"VEKE(@~ @"WQ S*[ػG֮*z"(eߞTXx )_\Tx!5E@P~.1[tTQWUZt]%3FbٷoFJD{-=NPE1EKʁ}{jU0\P+V)Ξ'd' E 7?tfBx)ub~Y^ታwV]3m`0-=Xdͥx*fg~BWJT`+P͎"D`X鑊"PP,`QP+=RP J@5;"=JcG*@Cg0 -Z,t.X'N2,sYP,99Y_-Sp_-zw?__|CfZxeٷ́?^h|/2_gg[n9?s}:Qzjzu{68pVޑ{gJfiǎw]r<⛁y-QJZQF^O.}0 eJJBd֝r9)Qx16l5KeAwώR4ur%!~I7ȩ{v#Gߞ}TNMShddSFF_'9>lڼ]],;ƜZd.\(ԑWt/ %)<%Jck׬.%0׏oJ&3޲E#iܤ~fMHÆu:Vx+VTS3%,CR'sR%ҍn줟s*V,'/uiͦ _~/[5vm[ ~ةC+ٴi4o0}-RvTTQ8ΦrYTI 咀t׸ atQܱm|9[%KWUdm+K{u:kD<}Tx|?[ʖ-#;eJe9rQR Kʗ4عs,XҐ ߖ-#/mLzo?-G 1Ӽạf1oܸtVbb<٠KV+R~mH\z?_*lSV գ߻ӧa69 5q^{H)x4:nx{+K*ޤ7%r/,_XJsɳP~ V| kƲ[޵Wv&Evɲ̘TZQr)k{̹mnVe nO7rewߟ Æ^ؽe샜RJ%4TFp.E{z \[MiצtҤV ;K `J$?Kޭ0m.Q\qy7cX{tkg䟅P6n3y^4_ u4ysf&S⪡5wx irͰ~\o Ԋ GIϨ2CY[v!Ĥ$INAdRL)y[d5Me vq9{4v~==z4m\W>$ Nay>N"șB /Է\ 9tL5h$>BjT$O=v d0@"귔ٷ/2偻F˘WJ9G#y Cn ?ZM!>}{comf/%w<3̹-ԉՓbռi}-BW5"auV& D:ߏ5' -;囉ӽr1P8(ƸO5>ځҶeco5hom&r (/G la]:}Nn=D#'yes?puRo3uܦ<'yC}]eڌy(UtD'KUl6M,[Atv'|;u8J9b~\f0Ts/Y-KVvh\GhP4ie]q 5~뮃3\z)O>O Kҳ`(h;vB-DM?kII.-7(6ر+R8F6]:*eJx+.V\F (\K r"k)1RN$y?nԨ4o?IKء}k}cLE@HQ$+^ƶ⍿cyUr% oD/=9sЁ;w-ÍGM>ʺt冫;h*=pzkn4X֊Rvxҩ}+(Q%V&#>Ǫ䋪T EB*LXy9JofXD*;ӠryԔK]NHHm{iO.r*fU*o.P2Wxk:2XA(#}B y Q7YcK.ښ…+a=W^P?g|(Ք:ujO!ޠ$H^r> IlgìyK0e/K8$~ٱE>Y1 @$[ZIT:&|5M3o`zC<0 U=p VϽfw]4R:g*Yt|Ўg*d5XvP/rIDE@1r˗-Sϟ:omJ9j-Fg?G-oz,h_b<=csˎf%.*!-84M*!L:{dhHbr {9:NȄN-G R-6 e`dRZA\̾H+45֦6ܱu7.ě/zvGpE c3o͞˜0D,Zcol֜;<+bHgkG `&"69I8 X~Xvhʎr5$"Pk$e /{KLşe=?vWm+#*N=&ϚN'?G˿H^clנ@ɸ$>c) Kn|Tf0FKފ[\Zrb, qFe`;'lނЖ7:H1T{u p+ -jVh4W+@lCf SAR/AX,kM I9UMcb1>ZE襣GA":}x^.1q Fj!̐%xl<_I< ~filDLl z藡w =虌0*FnX VVaa~);a&ײ{^*382:}7?ikGk'=Q\3{ OoDl| fOry&2{,g M(adjD͚obMl"2o=~?_@f |Yq -o=ּN8UԘ?.;|?ip%qH? A$glR8ħجCl~@EµW]!1{v÷_6q#yCja#lSh=_~W^G b>t R q6F_O.B/c ƹ%)-ט^G9*1X?`8Yʞ3D}1W3ˇPHq[]wtHȶ3( _1<?9 ?ػ>YT[=wC ovUžx1A}̞*ok-?,[FE,<jx*G2q.C3Hi6@,*U^3|ҼQَxiArjV4C0 ޲iAu<z#ZyTظ~Mx5RJBST\zO0^dl4gxKX$YO xVH { yVAs>KVob2kؼbxj#-hؽפl<͘E =b6?ɳl&&=FuLr r1=㓧L\y 6Qb;Dp- RkQK{`xU_]x}ٴA-&^GLϵvSf;cFKM0/ x`9ŊfNo%x?!u zclOK ֻ'ĊO`XPG6y,zKv=f^A-e~RR·aELF4yij$<_N Ңܞ7)fȕ!Kφx/`gLFܲ4Yx{$Q$&C!}2̰ey,.lƾ|h c#r‹/*o/3[3Úc,q&M w? 4&~['ChddЌ 6%x?>ߣ~UyF%x1*ʛ>97{Z`(]:f^~C k>ʲ 'l9)z݋J<(ʕ3-ƀÈF;%?10۝{QO/k?ܾv0q+W(_W/Q s4Cu"JYĞu~i=vXHfqI3G2wE!ؑb7޳=s xxP7dň1yeA?ڵ%?:Oitp]5\v |?GY 蠑x9|,6m cRo3Lm[lAםc@^ʕ*AD@ 0qN(9I} 9pYL)T(q|~BF63~2Sz_}I3t4Ц@TnA׎m[Dc>#@^ @xi#rY I|i?o3V0$1o1|A:afA va.,/ HKIK ^vilMIˍ4z9oV/0vc,m{rho:5j汹7JQ"R,2NkB,JyEV8F7aZae%uHܓiX,4RLN r?6 kYM${zbjFӟI/HS ]xc1XoU^ eh1l)9a^su, cpv,Smf+Id²1B 71ÃXYGQaC'B\[E[xW?}ܔUI<1s!2Tq }ل0YC^B0gPHk3bG|ST7ٲp#ƺw ?:SHhv=v;3b(IDATݺmg)#s[.^]} mA{3v|bQÑNb.Y3g'cȏa43X626vQ?g =l:n /kgAf%͆ H7آ&z%yrhFxm}7ILs9ͳ1ǮZ¥5V&NjٮMpM31*MMB.c.Tk*XA)D;`T]qvzȪ xpGcT+&M&D85͊O2 s6"sXf<zrU! @qU-áe }eh X+/n e0$֦U0!QO3r>q`3yx9$Yyt;2F]Y_~/N؄ܐG;3ed7RuL)oXMT,EW)ũدDtW񙗑9`NID=gZVl$? O43euh^\׈$ɹ16u\im1r6%9oztYuS{2z6ɰbT&yfl^(c~Kr:_ ڄ_4CVNx'L+C,R9;e3( 9a4PRԓC681,ʈeVb>mE OhtPح _fAf=m4eH1pz|>ƘY >J~؟!r[CD4B߆a(G e#^$ IA n)f?C#0y*DxmzTψgTQO/b̩YI-=h='ϱP'Q̂f%tP({8 Y>g̴GDz:C:䳓&%8[ u)Kqs<#=0g ?drA1dTz&L xR4I6M7NaHVtwB`9Mb3INًFfHL4!(BIFr-!E(KBRx$|Z*eNewO6KeO+ eu13" y#*xYPY!_onw6m߃b{JQbkb`ϭ9zK~lT݉:Zx=ѫ\9{z,7xUIUSlִiQ2 & ~eɩ4j$Qrn$55Me=gb9?gL&;iFn-SLX#Rrc[\I)GqhcRTL>Zo _̑R;CX%1 +5ĄI^;>"̦HWD3%<<6nr.ƌS I?.–Ч*!ŃUJ$xS840H01)R m4Y6eo/)zXA+[&]'=YyY85ȴָk۩e MF]mݪw+f [hVx5bx{|40-+%%%cĮtOs6ٵ 0ڊi2b‘3oQ2sr# ̝#ʽQ0w2b@(#t3yF{J18 k0KC4$@Cɓ6;ik'+'N`$̯HCsڼT)feb(^x<=PG9G=oF`JR߇ws1Hפ2\tY"؄'ơ-)]*s #p@gF x_T-`Zʳ/[//zw>g\EkEt[M.#99눘'f>g5 Y)wf-[\}T@Z'VCliV*fp}tb0VF]3[#BW,"bvdsiqq4~do!*ʤG2 WY،][ldz6 F-E4(B9s%E(#ő!i6O(Å2nDQ9lÍ0v`rҘ$ΠRd&n4AϮL](|6([s[#nU1 p%О2q2}ઁlÓ,Qm4׾csG?g e0_Iq󖘁 PyiyF{#Gryp >]y0v_…xI7{vҤ#>٫Y2eB0 6(SXI Rg[q!\hn0.p/VKڵm?;ڑPq`v1eC&y_a!U[.i_OHttxi~BG Pgl1<`{uo z@b}Krfg %XF[mls Ejְs3kE=je>,;i'.̵Oc!7>T0#qOpjAj.l!J|󖁾XPPljp+0z{/;iRVScSͻhٸ]ܹ<߼E+֛\5z+lyK8#BV&$z;c mLJ;UEOr\U{l~<'B#i\ন<>JoOfinGΣ H'޿ OHp$ քwN".Ʌc:Sg0($Ob00=FdNlHNk{cceX ǘm¸=+"`]i2w%R|'FpVNM\X΢ cٞL:̉s',m3e]f'ͬ GsY9& 0+7DzM`#?"YM2PVG͡XZMp%5 2A&z1G1X -RS/@h8@^ɋ%DLZrY_^x=g .\@$#(vLm? @r$ *;0.RM`$T.mNFE10M=0;f $;e@'|ux8l #g0:ּaQ_ɀ~ `邟F^&Y.m4f`&N%1jJFc]_ g+0mנQ/:wJhfNsrsP|[`Q *2Yb[NzazGK(eH!ܟs$I8VxAI3|ujPʱv>Wck$d5wNw:bN,\aL6O6 @RjV+[S>*s-5 NQtu:<ŀA&]!;fU:kj@S$-XO \%QRw>Hndx:L%FٻKKR +Vo4^sl3ãc%)KAAO3_^*xa^ rv.2+r q4 @(;o\5KkdGbޛ`y#qoQݸGVV8Ct°zC&2CML'٫cMSwNΤL?lQ%ʖt(V|uXC$(@oOHcdI5( \0trBS-N?<4`_6lQղ%X gE4cy+10>0voV CM`O(bR7cug x:BMB$<j0(blr]{̾Dk)aߴALVS(}jRcpY.iY MX.(¶ͽ4WJܴm74ox=j Rؔ1LqLY`] 0T Ff(.RCIU;NPA-mjA>cwu< cz% #4# 3t=DȘa^܈Wz!㉯2z/sMi%=pP!;2aS;H~ii-A !#y_޽g$>OM?E@;A-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<JW@p%@w^s8U@PE@ ݲל+#|PwPt5犀(:_E]-{͹"<l< "͛񟈒{9V\FGwJrG\IENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail14.png0100644 0000000 0000000 00000130671 12564151525 023136 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]`TULzTB{oRwluwk[u]몋%Z Bz=L&dB&!!{`ڭ{{{޽f{W)#ጔhiC8c TYZkFCጕV:Zk-pKV[ ײx]}o%Ғ|0;вX" k2SaWViѯk.+'% XR9::b!7w|zIIg1r%{+kڵk׭+F '1'PXTet)q$о,cx1sl%Q]Um4Vײ2#y gFip!Nq_~Җlwl\yg:]Fc3jBl܈umĜ3`\ȶ',/aĐ&Mΰ>[; gpt4u|WO؇ڢT%Z{ xxzbƬ9E.xѢ&,55 卛o/2\<7 ]WB"ȭ+"6UŢ,-͛-VU}ӧ͗_[]VlmaIH*߿NNNb˖ 1!/@DapϾHDrQmM>O}^]Q+1}d".>ۉYfMp,&+ÇE˫ݚ1QTb<]\0|pS\Z]ތIM"72mز]k{^JKJ-T{ן})y .7|Mj{8M]>Okdm⒰S'$Vkv#F৻>'9`}IWWQs0O>|]`,Rhkkc7XZb7n%4tEgV4 zv܉U|Z@Y1O/ c'-5e:,{$*0|kl.;kranހDR#PKL }n|=_˯P^-J/;S)ן3sszǝM +ė|zjd>>SOZ$Gf֭[ y*9;<`&OzZ<Ͼ^ c ƍ;wau.=yqg0p.ŗk^>Ipppȡmaػ{NQZ#0r,RG1 (Ilp>9s3y4|{MBXc$¬2CعDkٱy0~m4M9dO5j|V}5 60\C|W˗[z}aͩ17jV"""E {5KjDˮ EioFӀi7` E4 <#/QE*o.#|zzc˱~z4=/˚5`IѢa}ې@$!C_$4p҂dSw^G/+4Q5OqIIK̩SQTZzziؑIB1XZaFEbJ=SRSָ E=kfx`W~0;p[d|wl[oC'Q۶"ۻK.Ȳq&=?' /Z]26p6騞o~߾]\jݥ:Qm7Ke'X Mc]CON$4=U㴘j 0HzPe?o$0&Nw.+Q\V.L_]"U+,Ԉ`>b]joL:(E|V]-n;\E3b[ .[djp{^c՘ 5zұN[ &@X+Y&Xx#vSS g6v=V4RU|S5!E%뮺\3Ay  Q6CUpK7 sPYM>~I<l̰`#)S* nʹlO?:s ƚkms,lShhPMob?QR^AͩHW /~ jk`uB|\EH\׮Fvn5_0,6ke}>!Fa vԶ6:«&#m$70rHk.CĐH?6xl< "8vv8|qeǠStRۯ} rE$hw7TXc<-~0*{іUC_KZ_)he=jXOR[n|{;ol3xl}(%pռ/Vx)oџo/ z=W_|&v-\D'5~I)=$ Y\M䛯&_7 IXCxo qoca\iA!BspP1˯ %>۹eqlQaҴH[cGWS\U)zؖ u"΢"<kQq{5庮ϿO[K #GhBq'Ú[RnNንaq_ XY9!VNI kJ[3oVw۳ۡD9izu-kE5\)uu!f+W-)|l81 =ˀ[YYaĸ,x9=L3sq,ȟ9`B,W tD;y#mU氶4CU>Orz` a$ TK!V)I9vlD@FNJLs$ 'N 뜐{{{yx& QK K-fڇQBh"Qƈ:XY1r-xpѬYhõH$D3"#[1M %10X> !d狧3gȖ> mrPDH^Fn>oM_{Q4 JE#!(ނavUt'm?!lvgw._q)JPNU5j|QSO3Q {AjCQOo$~)s<-̼P[Mǖ>|>6GmArmQW@t]K/_U_h XhF]a~Ì9R+*Vj\y,.h4mp!\+⊓g[|_F>W KLq+qwĝcr88Tavļ/KJwT H%֓ÝK /wzM"\ kܹ9Ly;RAƉ𴣮K%uJɜdxKo ,@ {c~QHDMg*>ȥƙ&f(./ uf/jMf;nFI\Ƒtܸe/G~WzWQ}V<GDtK0z,3L0dHH``+SH[sq|\v+݋З JIE"p PRZI4;Ad/sH$=>eD0;t"I{Ȭ%C@9#sH$MWȜ$@!iӚ*V" t;4 ,Mݎ@" H WY(D| oH$ vSSppoMr?g"(8L?VD;HIIž={I5NV۝K(P.h;7j44>Z߅*wY zI}`7҄4"fksj2r?G^`!Vevn(VbfEtZ;Zu(^O)gUFO! #{X-|tz.\c]x]`5I]JByI>^a4Tnq^q*GJZ'6nLʛzcP^V gȈq>r-N娃B!# $şD~n5酈XZODY҈v {ʃX+=%Fo9-)jKy޾vs^0|%sEx{r wuDpZ^ru)+-,,9z"8.g`L*j<>p8˹7!DZm'ş@iqֆE`fuUH8u\eLm)#-k>ή,CƋ/ 2ӒPTKn47Oo 5)|Qamc+'ۛH ]:] bkV K[8z=}u0צּ@7o'אH4/.'ww?+wW]}_wcLH:3'y;Nk~ۆQC0ahXE=GiEL=F#bb3"Z@a>Xee8Z;{Q>2DjϪ5wqN fN/-WYD?q 1iJfF'(&pɂYZ'-#iyčl 5Y*XO9:u^cygَ< dNa߉ ADW  䘔WC˔V =|UzMΗ%7;)p s_C궝1j,= 'I\t(?-aSӰzrĀ`7@& #= 3M"!  V..DDxXR_@}@[Mvpf_ٳu&26=_[Y'Y@ͭh5:GNT%Sh$hvIo̟9' y %i',%ͭj Z:"3,#Lg:BeGg#4@#=ֹ]NCMֿuĔc LXxΌ)X'oDO!bTH?C}%}-'uKj`8Gh7-3Nԧ\d!:_T`֘p B!L3 XcV7S c+؈z6XlGt%Lbz)N6 cۧS0?U TAu8g$m?_wGa=7c^6o2.7{%Ü:Y31(,EyER_1>xණ]*-[:>>=#7Qw bRA+Oߍ_/1\H!}e Lz~^2}xqpQct;c1g&S>d ؛@!BQAaJ@{QZ\Ȟwd0O\\=PX LOO(Ibr]VoY 6U}9rE!bR|Fƛ IDATIXgez0]-vFGU5Fcxb߱Dylq&ص;1º*߻EŘ5i &!:Teac\p%&/6E%v:!M_?ҰQoY +FB kIsK-p79j0ƿ5%us3/\˞/F7aZ3.{"3 @ ZO GN.4N햍`(Ԇ) PhPgg|j,qg(]~85o~l܁cPzÑ&f㯪#o7o?r)&U`!u{GIs&PCA䇯~ڄ}+FF[Ϯ18/5Y&?߆3s4a-7:\7\9胄Ɔ3:3- B$M".O._9H+1| W` _M5WR:;fV]PX,ޠ|"7VsXScxୗP0Q\|Z(T 57Gq 9y@k/}Fi#D7\9S:!N)u5)q;p *& WUk囨?.-iѥB4b3xtr6"k6O6l/[b@PxzEfC8&Lk9Dj԰'vjGaJhC!cS:_5íWS2s PSDZYyMqxHDN=~:okh$ݚL>5T׫Ej"=C| 5>~3W44@t<.m }zjnx䍵HN>5?"V2@WSHEEQ&M^` nwt)B\@HS6+,Q8CBR8߬o|3S&`L!2<Ii55\^v Ahm& o8* qFDd2'][ƚ=]{@tfO66W]2f'R3W{^7nݧeжYY7Mjy٠~&~?f޸D*!dBWY߮o\gsT?fN&=PZ#Ozb1ͭv s>W8n.u".#gHz1ڋ܆e|Kq"zȇ2J.)o,PPJZe%.Fm 77}6JL~.Mynar?ZD`pה* q|%k 꽊-qw¦ɸ5a鸶?d2ճ|xI ¿eQ$vI4^ fW o5&nR>{N4l;.M߾4M*\xh0];L.-Vd!M톜#ɘ?e0I!͔"|a1Hʭ?}Q}q{,AI8q?\WÇ,ABtJAC=Vۙ btuqƔ @ɉĬfa͞CBD&>m]/>v&8_%-%L4ZoGnW_1/]w/o農}/nMs3a]Dbr,g6+cW=|6L)%hTqs21́%:FJ},;.0HOSaxOzlHryP'2~ +0.XqX"Hⵟ@|{"`Cď1~|$fVq2`rlN?-G%+De |^j"?._{Ba{bedC{Ե>9ᛖb싧.949m WZi<:i+ ;L4U.Xd`ъL9W LX8Z_ۢ/W{?Oab`,p"&ǞnKaO4t_-7棆}$rwڰ8Z0+KO GfT$rKeSǑQ%U.cO VCtmv/ZI ?x{zw_F8!gM@L& iߛ崓3CvXqDֵG#mZMl 0𶤳ws`Og 䒽l|,P(~jn(TEϺ"yY"@Gv׎e ^BXZ44׌o< [Ho!S:HkL؜mcfq&U8LC8ԩDݰ~YEbSO$9&|ML_`p8*غ$54J U-c+:N4z@bXokK7vX8MDTvUӵ;85#/ޅ.l'epRhM;e}Gv M\(]I_]ݐEUkcY[ZʭFґs>H<kȘ~Up>Dthj}k[~>з mPZlquK~ߋ# x:Wa+,eNgMʝF=A]E KMitf{>򵧯5ܝkl^$m'X0fUڊԏ~t]TeT64ž7C_;P[U[_(.TK[aՑsmSG}4Lv`+?S0cm+1@R/<#" 3'gJ#sns٥&av:%{3t&?'=l]:S `MسY/_ M4[vnminHf}NK9;/T7ܭ5/_o L_#XONnnD4AG"Ȗ]h5|j@UYƏ@_]?q"n{r`Nݝ]ObNl} Fm\i>Auw?>58P,\~_#K,vl03Rm43zywVAWQjiZ:E5uRx>?n1h0Ut? ?8cH+,jrut5,d&ȏ5otu璞=}LiI`o["eW6ZZ7bFv~lU4JQIP)Y@7#`6Dv>v^M3΍0L Y7+Hz1 &H ZDv MD@"Чh ܧj! +H:F*@MFH+yJH$!`6|id2D@"_0u0V+k|%.|&3Ѵdgx7G/HLD@@`@C@`FH4(L" HTH" 0I&%I$II$&" Dd0D! SY#DDh΋ Օe*QO oKH$݉-4u#hJP[SlҲnwWW8:8LY@eaZL]rlf$chpL2Q_3D@"p`lI>r4R$Wޡ"LebĨ123ʟu4vP_SokbTO\|||`nn={;U&`.$F`kt|Bu`ROJR0CJ444i]oWTTnpWv%yʪeƞ{IL@'fff9ز͏j҃v? aW$BRsa"BCgDL h TFw?{BTS-GWv%yxj&xz Q_[ 3,lk}МDxLv qX%gG`SE!c|g]sȽN"Cj1l0@A=Y;7^W(& 4nHGF^%kҴ}(M#݇\ [0(DqϛCu`i$@&CC3$"P]v 2h/"^}UaTa/IVX^z -QCɭD `N RhHTle{&6}q8,fiWakI ݳ4+F*!l$˧+BZV1Ǵ!B6P=Giq}.T-=[ o !p2R^uޯ"4>|z1t z$Ԓ=|Z,F}C>zLTjʃ¼eBP\O?ԹqO Еh#Z.KCqq1Jq,CD0Oub;/㇇_sm>,+٘%< hN\3Fq,lz,! D[r?m dffrg+b^t}/b킪|ט={60qD<(+kRׯ_/y8}4n6̟?8e5sdoq5&^l~툌DPP.rlذA-^s5"ގ;{aڴiY y 0DQc"kO'uXɔRZ_JZe xvX\8Mɣ媵^8ڼͮ;S&JS<Sɰ* wv ICee%Ν#G"""G}o8䬬,߿[n͛T1tP O{ԩSʕ+Ex&0=|ヒ{G߶mQSS۷s/E"4B+~ T"6)EH@8ZǾYO0{<ڍ*\pP'\= I4adG ͮhf/.cWIץdP_~Yq'q-X=ZE?~8^ςG3&cǎʆj.V04;*_KLuL§?_Px J6f8{5jcW.'yZv?~jڵ| Jh}&LvofQa[}'4PRH,5E`׿`fA5pCvQW[5Dkc)C ]Bz#Z\57,QzO\iz RSm3tWt\jX.W OYfAoVtG <1|pEii)ؾw7c!8j(LYx~5qtq(ךδH1 *V J_6lYtdsQڷ~[L`#0=b ./ IDATѡΈ'G{_l9,maeؤ|LwɛoK+dBWߕiIzL[tZQq!?>P׊l:< *Ɨɧ',ş̞}WzepuQj+cy^"p!_py |5 3SP\AyD}QimZˡ]>Ut}דcxv7+_Uv 4$`/TX+t£K.Tz] $a"U&ѺM`** $HZ"N\eckMDtDQA>* )D"PYUB*1EL"@6ZZᣦ)H$A9֤M"@NyY8`R2D@" 8%U!HO;HD@" -bvH4<}\e4 &ƃ!Aqaa葰Q/˭D@" 8#ɂ?_Ȥ`j̬PAeXͧ@ 8f_H$@(%s-=Sxp֒4>wo?Ugjʻf ݼBue nu:5+$@7 >~=RW/zŚO¯u 2q染+μ[-lJ -5(1c(tT1jgPq$~$~qe%$ 38@@@`@gdD_ _FY D3H j2D@"//nD@"$v5G" HQVB"  ;# $(+!tIAMƑHmH:$Π&H$I6JH$A@`gPq$~$~qe%$ 38@@i( -[^u XҲ9tuںsZҴV,(F/O7Z[̰#-Ol}}=<隡̀ 5 %yyA]襣/~".Ť0{$StY]ԴL}z鏿7IJ?&϶s26k~$b5*+: k|^rr :#ɡx:\5ג3r1ee7&S0ms33ͦqIAITy}}x--+ L"ƨx[mH}G}ONIt.']XȴDVadfa[8iS ~+hQ"0dp_TT?6E b3T+'OiS(nE3& MkSɆU$>Ea\]WpXs=}l֘8~sw ¨C`֨Qq"%f5 ˣNX0)x='7O u,dS 0(npqUyN*|?<L%%lKC6_ێq p؎ȿ1׃IGtsuBaQ)~Zƍ@pLwH.%#Wh[ž9ƚ1{ e W[I# ǖm=Ar==??WtGʅ@`umU QO~QCPvaFX x5E۟aoc&߽G:xm 4Dth$@J~w|%.9|*9oٺrH,j_4k -.i"DLL^0-wjџ4aͰl]uFr(jyt20Vd%!KZF6Bbcj&$,ׁcaju\H/k9-1desr(>Ul3Q%>GF=K7/2كec]xٮ z&G& )FK PGZ ?`'&vH,Ə)P6*>w3֧e{)AUsitU5ڹku#a-5 R%)UiX|a8pqZ,2Vxm[RG|&ƒ*L܆]\,7 HKpwTtH$mܬL#3,0 SJҶ6kjUq)U4D5Zz(`t[2ilca#lmD]Xq򨪩՟24Oʝ <#k~(l8|saam iTH+lHH`q7=87 1T,? %FcOQNK7g v&?j|wbGկUf1X=a15֦vMkչFr[8ؼK#/ 3[ Ҷ!יU84\4v_S'}ǃR'V=A`i$˽w.7öb}̘2/r!Oh`o"ɕƙk 5v2.\,ųq׭WSEmR*M?W6/¡tqnhuHdL E p_J>v<.lOcG w]@U@s=Btv 򘚇px dͧ L/9;v-Kl{uss& ~qӕxGՙxOރj'%䊴lLXL#>x3݋cx4t}>LZ,d.>|O'F~'F0u0EsR Z&MC _,d'XI'2rhjDLccx5v ɤaT@JÓ\Fie;PW؛O\0> M{oݶDd.Rr'<: ;FLHp^T*buNr!aA~"_$5>ƌ°\ȁBcΤnt&Z{ݗf'4Ј b1G(irfNKϡ%{J&H?^ee#KHp## ~?%l=RkzTF*L"L:u*UDVͥ!n7vխ- YԘd<[ISɍf :):$}Vo1 ,EEen?R1cغ<_r7 PMbr.?6sZY[i`N#ͬVV*2?ƙ< H}-k˔Jri.]WteEWݿs6CㇱZYnxXWג C(l霬H`;ٮ~!lMZ&UдcgN]֍es?LLuzxU)\t;v7ܸϝMA @ kw 3r(ʈ⺻,>k9mg漖|Y!ydF] 1k[Dr yg0 ژnv2ɼ$ j)1&кLSyVZJOYd.q x6D@" }H}DH" 8OHa4!Ob(gC6Zr314r8-X3Q!r_" 8ќӧL𑣑@&KEW 5T5V%^D@" 8o a#F8/Ls-Bk&`iQ}iAжSW$@!ʊZNxvL"@m Al"Hz+Q)b+ښ #Hz g s)b"$*H$B }M\EMITH$=$ 혒 #HzGZԯL"@}~"E" v:U&`o,D@" (; /$[)+"tn!/4ѣ[?zRRR]q"!!۷oGttt͞=[wn9r5y }{w}Ll+V0( xiMȀ@F_`gorF$>@&D:ݻ?nbWAir} V,3>{N6&ɵjzN%f?B|r<0ܴt2,-tMg.w΃&Y%x^!By{4w]Չaq"a٢ᯏÈz9㫟aAf8uN64Q)ӢY18GlX|Iͧ1m@qt|J{!g?~|D۟mSt?pł1XLK~nȫ֭k2WKYjzzp뀋~LQQT=p#+sTjnӆVVfj9ʿf̽8@\( C8y}}_{ϺCmggGx_nɒ%>zӧO@|?>8H^Y?t~>5]Vn9XΙMz6jߤ"4vZ*Z07g6f5!o>ށ @OjժZQ@@n:2{l&=hhڠw WF n_n])р` A{L(?e˖q3U&)c<|sHӓ -L}D "߽{@1114tP ^,қtm@Hż=`&z55b9u1gkPk@[]B qGgG{&ѡ}[АM0&g4if*ASNuiܐ7Xd(Рo}Q[jV *o\OAmUnk{@2*S<Xph:Y͙#6|'H蝹x8mz4e_tYoTd] Պ ᝨҴ*.]y9 7?}a76f%@0 e ۷osUTap57/_޺Osα cPP "/#.vJ4xrR!v„ zUH;v,k1*WL{җɅ0 \hް 8\ 55_ժUizgϞ`:uڵQFQŊ￧֭[4Rh(W\Iƍӛ y{{{EQM>JAc$G>1&+HP#Qc* IDAT r{S2|qwe԰u|C-뗣ҡS~Tys|ݕrOUcP%oz}u&u w5^ o٤nsjU.~74q2ém_6\ffJ3n8~M{t>*>d{qnq<.L9/KI0+fhrYp~=ݝָ~z!xb$ִFȑ#/`3s!˕+48\|\]]ё}Ν;0D"k,/tH -sr]9@`F" 0i{uCd2{r/rui_kO;W2sE01?3siչr}JgHI~R{;SiDD2,rjfK@AXpp0_ka˖-YۃrϞ=/Hc1ioۻw/LSNes}ͬe}`2ÿ A0>:up0`HU׼nYک U72"~_GW`sTO"R~̸K0!0ݲ;_}Ff27(MWŚZ Loש@w!c$% 3 _&]i {çi|>6=S0LqE ;wՂLrH,Y}e.^8Gj1 E/Dʕ*T9s~&Sr6m>Ccf+RW  44I R:k|F%֏4LkkHijnP/`"B ȯT4Xu}AcN'G]p }@DЌLxfQj_ r& }L?8&']¤h"8DMy!x1z_OUYnY Q]YCly;o~s/?< ۤ:2* qh"kNNXjA)"݆Z'盁0~0H -!nQIˌD~O{4<\-$@j "L6 e@ d ~)P!&4?-oŲ"A yGj @;!4A 3# 2 `-$`-;} BI#ł `Z3 @& # hXv(I 0R,֏?c١ $`H X?Be BI#ł `Z3 @& #CoC";WT ~^D̀@j613Ӕ5 Y4 2 d3S5 Y4 2 d3S5 Y4 2 d3S5 Y4 2 d3S5 Y4 2 d3S5 Y4 2 d3S5 Y0 iӆdB^^^/,z„ \z??ӻaÆڷo_?_'ɍ d~BXOgA@x54xGˠD.AHp|KG K>xT7B{!Tr1׹8xo|4vSgz\\Cٜ 3I[WUmch4pBZ87*N11ŊnQZXvmiOPRp^EN9^Cax<<1y+PlNԵ]u œh'իV>|Haک>&등[_eh9:7H{\RQE>zՌ>ֈ+r8u1ghP9:і}3ȴEr.n="kԶQE֚MMՕ/L~}Ͷt }Q[n7e;Tx>EZMqNi3GxM"-*W\2A{:x Q޽n˖-|W;vp 4oޜ/^L"EV%yvJ4x999?Ϗի QmM:رct1bU\'OnOƗ>^ljݡAKim,S g'ebb-/*Jmۯ#CHj"WЍ٤4U'Z[v'Ex0>= 3I<פ2EU|jG:(VCͥ^fl(jqeu÷ 1fA"0 m iXvYfeZٳуƏZF.R$ ig`VPk׮mXŚʕ+iܸqlB{{{&7\k5ɑC_½BL&$2xht~ϳ/1o}8ϔSVuds:w+B5KSώɑaH8ʵ˕oav&&0w ֆAH0a\1v+Q8A uӪqѦvq*0 zxx>`޻wp!|ACijm6ںu+!ې!C?DΝ;.jyI1IO#G/ΰ݁82{;4 ΰ1 WWWi bNcJBB@<0?JjilVᎃp!zLOhe.X \, ,σ}W1MSM;i> O8ܛUVկtʔ)O]4"@z˗ƍ,X@jƍ d2:kժQb_>>>lZw^uvvSoq/M~Om^cТ+NXYa!?׺46MS7b߱RoE>Y1<?TX4}2u 2A~m5uחE, bŊ6 ,H*T`&#R? (7B@ӽ{w S  O%OH@J>$m0^#QG H^sI%ra*)?|36'6E{Ǣ[DmϨ`JY5^LStE{\@/#߹[9Pg{ eHK8^(nxW ]v1Ii@@ xСC/TGV .f/9spd_~_rf͚qNLT|tDoh;v7Ax!buB[D[Ⱥu7F#ާ1k"fTΜMh˷T"+T٫5`i'jdn 3t<4ؾo i: ~L464}~A\ucfs< Css?~Ȳșn["T[~ o"| !zeqkL-!,Ν;qئx9b Ln_2މ6t" eM DFEӕwUa"]NNe}"n-qQaDsS}0us?~H+_GmE>{ &+kA&~O{4|;:y$988Y~}5$<<&OLK.[nuʖ-KGoN4/]D}}WԠA7x 4ڴiC4zh^/͛*WL?P/аaØ:ڵkG9Kٲe{Oa糗nS0*Y8/5C/YGҵ ʝ3U*e̔L8)Lw=r&61L0([~ɘ_p…T@ bd68w\޽;͛7ۀ4sδdrttŋӅ ش̙3'8qpΝ;7?L| ͞=z TF .EA;;;6[q5oݺILt ;v iӦTBvpwwwv? y=efZ^'mrҏCߢ^"w}/S.^FMߵ 2fxLn̂~:5|7a T^֭[HSNL~dMpٲe<3ѣGtU&Pھ};ׁ0V2ePAA6k׮%"+dty&-Z۴iRݺu;}|!>48DTT)6mk:u*ݿ֯_c5 ;?a;UR\@AAǏ0_m'_ ?,4UI>ސNANsW{t #Gxn/d|iL-Z4A.7oޜ/^Lg rƍ< b/WǓt ?zƟI5w1}"ޅ!*&0+B釣e˖LBXrvvfmhʕl>,Y:tQb gϞ1l׮]4j(&BArY21ݻw-?dځ! ,y]fMNcm۶VKѴG.T/ZZ AP2*/ p/\_/4x^`X/c&!NIFLO0gΜI}a6 o߾t5 $ ~2A -Y<@f(Ll4/ŐӧƧ ʠ'|Ξ=g^keϞ]v(`Pp?[ϫ/Tce̤PRؤc=ƜSZ8hAkڼy3=|0^Wh+V-[رc5sf6L5kp2qƍ9j`&zX M 믿ڟIC`_4=ԩS\?s!XTTHϙ\_s5Y:a\OA\!ʞ-kmԊGL&C<o!@`7YXXi:Ÿ Ƙ1ci-903a҂,"  >FM4? 0DZ 4Cb kΠփAXFidȑ#9]~Ma"8!;ԤמYiĠ69\h؀V`ok،kT.meL߳uO:x5 &vgׯ_?! Mdiԅً>ա&BcӴ@CAhL: h-OR!F# h4dA!@kyA@0!@! `-Z˓} tkA@ZCF@hȤ X B$e `4BFC&AZ')42 ւLJP"Y:Gmɽ.4,=YgvS_ s!n<2&rO-iӆUh//ZL0 *3f ըQ:vHCRTT~jc9rDEǐWE~xCȂ\O^mOkgҮE?_S)<~ҍ=?Q@tnA.5}r&(2G9ޣZ=uFo.gq~'9r$Gf%p8q"}i$&:!e/ C<#4"MkҶ"4F)g?Q.72 5/bbՇ4CE~BX$so:43$\gaSj N<.Dy=[oƘY^^Y|gi<0o ~7˿ՌC/ARsHUuܘ` @<$QF a?8B ,]nݺ~:uP.]lٲ޹sΉ TۗZjo0._ɑ#_Z! mRݝǑWb\3=;}ԍ*=Q~ ,42:ةunrWE_&/SRJ@*.0ցk">%K#gxٳvIN8Atu&al͚54m40`@wQXX5i҄*VHJkLxCFEh٫RHt3u,"xys7KWb`*_,7Λl\<}9H;ܨRԱ4A` HjϚs-{ S4@3̙3tM*ZTe+۴iȯXbti{.Ջ"ĀF7a~WTJrss͛:SiܜRgdQ$F %Fgk)ٰn>Pf, c "ݸAǎ(̓ck+,jn>+h&%MIf˖r6p@ڰaծ]!O7ŒEq=!x 0ӌ3Օ臶w~Т؆gD|Qɓ\Upa&Zh0!X1m8;B#Yg;u{Oƕ=эYb#(zG# wru#}͉H[z] DԮ-EAʋF|eq2ΦUVe 2e ' ci>=|Æ S5 ={d^Æ i׮]qF/L2tq/1ωgtVX$| NNNҥKlNs6\tܹŔ/_$mBc)T89fa1&7_^gT+MO^%!{'Wr )_vbb{M)bUQ yyg'reS?\:>s4@ 8uH19nܹ3Gpm!0uT&.^H !!*۬Y3&7! BEyBk۶m'2#e`.ٳ7|CcǎUV1!a^A4m¹PN.Jg`6BkWߕŲՋ^CK6\:%Q)O[Okv} {%GYz4¢td }B`D8C-huq%)\x A-qoKa$VR4.ie7|%4QW];t= *D˖-… ͛~:hj/ہ!Ev fO?=zH֭[?mLgW;MkcDM/W;g6*[_Hx,E{t(:ȣ/|T.}5ƬAk rq~@35V|-Id{1`1LZT[~kc_[|J]|Akv/^`FS6ߟ]Fŏ"$&ƴMY?u>M%T {'fӛ?~9O,LOb:bC5u="C(~=yVC$4@ O Qr?P">ɋ|/bM3wA|) "¥K#hg&V䚚)`L2G=ƥE3EvyR5kc mc@z8@: 'KL$lJ"6;iI$(SOdI.ɏғn AEt[&GNEKcX?EqQyzS毃"@WwZ"} |2 رc_1߅h@QxeLSz9n[0Te)Ȍ7pE?}B* mFNb~'?Һuk3?[`rH Њ|8լY]ݻwy4:M`T~}fm/'NpDa 8pZj㹹ԩShnٲgtƧdɒԹsgZhQZ9'@ByNpX$}=i7>v!h'ݹ( _q+u8j!8/CC'lSZ?xeO_ӗmw|3?:~4JaqQm{!gbG/g o |@⠑9}f5uּ1߿Oׯ'&7ofQFZ\ȣG͛edggGÆ _gccC111Gb֖VT׀N菲5kдih<֭[O^?Τuܹd׃&۷x={ CҥKC ~\0vZ"((Iټ}ܽ18w8MBhmy ~)GDRU)Z* .Tw\tmuؗjV*S]WPk\6ګ/ZsI]I{C{A:~:;GgUtzW_y~{իZ4,Ow@/ٳg=z 88욠4#Gyk$իGy{ %45ho7V(ʕ+ݻԧ|L~Ɯ>}ہt@C=Z#FВR^@ ?34* z xƌL: I}vDO?GBC ` jF2h|!// bqZǬ{Ѳ GӍ*O*-Yݲ4Ԣ^YV-&k"8E?ބ)CC!=Уa3n="kԶQEEVUhT|a ${;RSĥ3ש"Ɠ߁C_;g6&Kwߒo֤Cޠj[t6 쥺UJЄoQvixZA4&b YA+7l4`xwЁ ›Ҹqc,B8P?<4L=v1FЂ 7ߤիst>W0 6p-L[| R;zh#&u!fFJ_MZ!_J?~˗k0 1vXߍh2Kq( ۍI L#Fi3Tt><HsbIa4U\4RS9N꽓rp&-]wDZw0!+=e\Wi`F#(Xb|}Jc(UIwυrYov[:VvIRjqo4>-7 6ѥKgj1 7ŋy&OШ YOҸ/xkz@_#$)RDY 1MbN_q¯<@D|z퓻IݺuK&?L7l6m=_łɽ^$6s;&+ڗGlukz)'c}ճJ>^TbE~.=-7wvj\4XVe?wFAR鑃*0k)ѥT) |{">ʭS`( P\ o5ߴf=` BiAÂ6bĈߗF  )|BK(:L! 2a2n4Ǽ |Ĕ+W˗&m49{^ük° ښjڼr!S\LV0_ӧS]ձ]'8p2e"Bܩl4e;,g܎P'ݕJΣ`G *g9]'"(b:׆sm %%0!,59Vu&i݅꧙|W @`AqL|TIHrrmQL4ԩCt Jr)_<w^k m ) кEɹ !v>}j\ /&G"9z( 4 ]}`*I:ԤaZ7*._K.P !8R7?C <4@^E ޤ=G/sD+VP,6;)4/]0F S!Fsi~zLNUx|Аax;&y +0:xr2FeX5_xnBZj4sL֊ o 4`j׃ Sh Cڶm÷lْ͍fj4ԴΙ?~ʋ(Κ×/\^(W[ඡ*hS4>Q`hz r% ? |& 4@#_E"6 2(nӔ[lkMJ*-DJeҁW/1}ھT90A@~H37a. 4 MHD:11L_D{%s\xQd]Rp# rLo$:]꟰X&M;%b^:Ӏwp{ktZܬqwلmݠ~PmwL_hpnlKk٤OH}lElRz~0[f3-3,U9l(?m"4HEuH] "X{r2fp{^3s/'.NKuWTt#?,&#gxcH{c=[~ oPs '\vВ&Y" PQٗԮZ&XBD}I6`i.ZnJΝ#www,sڴi4uTY&۷$cbh6dCqA>M!OR4kśT8b_0}/R^Yf4~x.o߾=={L~\y>|wܡ޽{SٲePBoкu}p;p]v4T+%9&'WWW PPVۛܨVZсX4Ij_5mذ]t{=j=BBQɵW `޿٬EF=.ph{QϨW:1`*Wig=qL~W"[[:y>GT@.Xr!k :Hᆪ0jҤ UXJ*Eׯ/&Mevvvtm:tm۶lBtuڸq#P~*S @ Kڵ 0 WT߿e  ۷Spp0EDDЎ; Jtt4`.ҥK >CK,vI޽{ ~Qҥؗj ?7)-_k/JT)WH+w~9QSq<ՉXOގzS%'r̙ÙisвG'T;5QZo"kY0&qFꫯJ*LD͛77zdd$ן>}/55!DO:Ŧ2W>Aӧl># S* 7okܐ?ɯXb9aBCғ'OԩkrX{J9M鋾wB*T~O 16pG:ԨQq[.7Nj"6|z#ٲr[T+(ѹ8;RըCEAv+r9_c5؏ݯQJyLYijg MsάAӂ5k֬lBƈ78d|6|3bС9:7V.\vZ>CC\8ä@ԫWrǎk1wH# ֭[=k*mh uh1HiA0wlbW{O@P%vUheB*SňFGv{Q!肊-EP$7Њ?ҏCߢwȟW0/@͠?Q$v ,X%LXМ 8lҠ20Pgfi(Ô5*4o&Ni#$'5Z b+&oZjԭ[7&itEZ*޽[oޢ $j-Τ ě4I8=7[ݔ6 c6a⎙x-Cې|oݠ<?Xj U=vI_k-}}}I!… իǛ+W0&2 `H=zfF8p kqPzܹsvT|Ξ=K{ϟk6(Hl0^^1*.@v;kZ Q23;wQ'?{I7j2ES"`rWf LM`@4d$J -.r7nuKj iZ' b!C0ifgvh֬YZ3?fƌZag7 5SE)D!;cNNXV!T|a6~\9\hNK\PI 9<6PV)_֡!:ow7CDX¾r/ Y912Rv<.** LHC 5F%6eC"505*㥥cO#A4:@ITWuS^bu$; SX='?MH/QD0Q]^䳸qbȬ7\  ~ũ~Df C@,G!Zf C@,G!Zf C h{{Y zT<~@.A@T? %#ZSI_Oj@)A #(-5*M}@jƓ6 d(:~(]` {+) * daO⪬q3:RENd?XR'@"W9doJIb9=tWyRXA@HO|/_U7hHnt D" X PN8F *P W8>y*vBi't76)3RsXqVTdSFE>/{~ܕM\{AtH<~iyLAp^i|yY Ӹ=@4@mPL+EFӰtZD{̳huUN΂ !i<A{"i"@m"Dqdω<⿜Aeh'E}z➴J i@  `Zꓑu 4;2 X*Bdd] `vL >Y !@C," hOF%fG@ `Zꓑu 4;2 X*Bdd] `vL >Y !@C," hOF%fG@ `Zꓑu 4;2 X*Bdd] `vL >Y !@C," hOF%fG@ `Zꓑu 4;2 X*Bdd] `vL >Y !@C," hOF%fG@ `Zꓑu 4;2 X*Bdd] `vL >Y !@C," hOF%fG@ `Zꓑu 4;2 X*Bdd] `vL >Y !@C," hOF%fGeO" `i]B6+YBBhd= `Ny sIENDB`davmail-6.3.0/src/site/resources/images/iphone/iphoneMail15.png0100644 0000000 0000000 00000143227 12564151525 023140 0ustar000000000 0000000 PNG  IHDR@ԌD IDATx]xB )TPh>Z-m_ 5 Ŋ/Ń;gn&In@w2ο眙{vO=;ml w%i U*jiޥxRZZts;*pH*炫\̝WzJ~л|5Ե{cD@"Ф^bfDnlD UdffZYZZC=j\]\HMf5Ӳ$6k+[=v[m thw7%WqFcܘ1 %zz)k5e |X 6\iZMwԬJX\l ^_ Ν9K+K;o/~?wzR!mɮ{p/1 Caq1JD3 Gr޽ض{/F GD]7+ҹ]Ҿy LjWܸ:ujyJ>GFJJ `!F`D*c f@ȼ'0|n7ǺϢxj+ TC \ A`D.ڴ0Ävx~++-lXׯW 󭸰dnf#FӰ#J<%;)1c"8$X89>T_{:TGj;:g8D2l`iX7/kסsprte禎ѹHcO"ސ~u"%テT]EFRK1z1s)zKK1HPJE }ԑgΧOvѢJw9tßźuO'+;k~zx'q:ߌ3:3LLLDF??dg`ذa8p ALUI __xyx>HLW6oۊx]T~exi Dգ;=#d.O<] Ǎ ./i-O`h0,,,еCjڵ/<~ (/ Zڥ &N7^hMemgNYSzFqjOfoxgMJc?x8WBJl&|G7Ws2 Kn;2堦ȼxg4p@OUV!?WV:-> KN%"RiaO>3N4{LX#hG>@P@6^=4tǾhb(:~Kt} vٙNJ6r[kQQQhڴؾ};J WKJQc:˖-`tk|]yq&Ү}{% iAΝCLd$<G>?իW*e_xd8Ԍ,CŜ\*M;iD 3<".`[Sc8}iWe}=r`?Hj .xc"#n93gUJ2#xiQGQ X8mAA <"aSEsw ]u%L2>;bKfػ{ [rꘛ|Yȼ"nU]} am`nI>t5ɰf Bzs} }sjFm9mq.() V8H=d>r8tOv?{1uZ~ X!2QwO<_ϴķ0ay^[o2\90q1Cīז=KPb_Ѹ WNg ZvOÐ9Mc*By"IX^{E,z]W7F0&K$ӻ,,T@1sfz6d?kvE+5ؙ4HX]Pڎ*FqsڶLp8p,#/?OW]‹K_Ť{& _ 1ax@Ma-4!I`ZÎ?_\}7ې۶ÐA+ݰۚľژ#?4bf Dxde ȯXk+'O/x }4bnhq 1*iϢhSR!48Hj7t2GsT崰5Uf"m8|#Hm싐[P,6j(_TĤUxX(\D>prNSƃLu$6[Wl:Yfw ߍ'ڶm2-,i#FtvC؈g<c,7y'eaaȮfjȈ9̈8kP ѼN9Hu&?_ T/hd[Wm_tBoO;~/ $rp/o/$Y7%"#B?==G+U&8|\ 2M KqH!ΛI%D2-L,1 H$ ʴˤfjlX h4d k׮"o_jɯg%sА͆椂d LrƆxw}&͹NgaT7kJa<" \lP;sb^AS(uݻ#F|G':ߥѳ7H n9)-;1^}u|d3gLǮ]5wvuXCۣ~]V tKF8o^"ޟHSʠk^Cu#؏W(Ja4Ռ[6E}p 1ccY#=adb ag~ ģ6ְBdս3]qGűʚ杚 >|`NI@+X.&U|J9(%gwd[ ,-BIt:czB[Bsdb߾8O;SIG2 z:qdcQx˾>`3L䓭p{,g &c-pK,6^#Ohٽm0 i&@k9z-)ƍ4/EH"/AFn"c觤2=YȌ64/[N=~p!7R>5."ұ#`Pj\[kRHZy9 +4*'{kuHJ} $ ؔOA[7'"#)2Emٸ["N@L4FSCkjif7p =7/ԂDJNhN0%b/~rZ:"cœoc(ąk>PdG<.^a5cbumm m)žo7XJJIEkOzV3Tֿ-mKO1zH2xH%nΎOD-ѳ ZZ4C+0W+ ~JjE9ܜI[Pc>渲Z݀"Л *IVE"A =# rw0TܝeD!`ۯݽeD."w?TEK$wت^udD!`XUw$D@"p0՚T/YD@" whXeYD@" `,R@"HhGI_vCMA,,h=w7^ċM] F <<ND }D$c]_vL^^s5ۏkUNⅳnӑsNSL$ t} &paShlDV8y8@ֽ`e3淚eJCFj4"г{0@+ j}5A1pt+ݯ vEs񄫧FMi zA5sv046v6l>~n-ʉpuY]%f5E6,-% WΠsG8x{'݋PXBB;id%5b:(6T]]HH 60ѿOOuZjc#~ qK;&zۭ#)#_k7rhtJ̿9GI~\Phxd ~-5&.$/W'XȪV*qs>@R3CP,rTT@&qX;(U8OC>I kQͭpEdrէze<4'7}/;'D,REX!|ԁp]+&0G.БKH]L EVze[Pmm~no\ub=aSֆh[F4[ؾ4]ZG"1>& _a3҇qV5s菌Tb.hѲ-G1 Bе"nvVYҎm:N3#=!7ű+=[b".ZGs[{| bs~!MLMn Â: _m;T7v /F̛Y &"T ;1@dX w.{g?VTV>HdDad,ꧬ܈v `# -302CXصpNpsLĠ g$F)0vxas {Vn;6w6ϱ~qSVm蔸"q2c]|m4BNF.m1yTxp^^>"bs~"AlJvDž_ԉcۓ֐BbR2Ғ@$̚6(-aq""y:Ku5Yâ1UuoEKvqZcؙ@ -vӽX$ȹs[*'[Q)5^Cͷ=Yd45ɣDag@AA}s07ȁJ|*ү{[ZֲΧE_9m=~Wa餺wp۠<`E-bˆ~LN3,h}ݕ.RzH ɓfʻS r'4',kA賭LTO/*hnin?LiJ^ 13]6\ԿjӪ D'r2NADߞ]X̉ G]+Բ5;|,7 ә6E6^U8s"W'tcF߯Wbk4|]q==i^ ߭Yv ǚV86xv.l^b!i׶zv ym䰁b_X4#6..0~t5pM1j qxYb9N%OVD`3ǫڥO4O4n'~6]4>XE Uq2P #=lkEuxrRBM?24sWZy(z#'9CZUI%^`ҕ^ШhTWbhq]5` Mvaf?/) o,#ga!9>O; g>{<̬iHHNѴB I~iّ!1y}M.c 0iŒ( 1i!DvL+6q)K "0'.i+NtH ґhjt[䗑x8[r6< >f5=l7?&Z0;[P=q=&qQ!xGw=TZ ]|<켇Ų]M\5p1t6NP8zh&wWԓWYk-X)Mf}{"9- EXܡG:@88 QࢢBrPcyF$JЁ0$oq32aulfDg}]?6 '+Ip48ž4cz]xrcv\H9_[ ‡?}_6hGЫG-bg)䀠ըqYVV2?& O7߬IÐG#J{Ġm+wyHLHx7=|񙈌KEVn6 NXp.bvtS~X/:sӥ\In+w"h AImP5@*C },$KXD4.;*>?zwď(%- ]'e8tvPi0|-i9X! {y/,&E#y#w DPQ JT䪊ϯ_jY9ʦ5W~[Guj~\5[USoAe)SV8Q]EU{%*blׇ XO|b2R3lPLHaBFiOsJU0v?)|5īPsƴ"51‚э^H({*[ 1 hl1]OtDxDk\j 6(fԞE]\W3Ʀ䈼ܜ#%=Lme'P&d_| /=>/<60R$2T)L~r-SU[<8c49Gb86qUqXAEѡOs!-]_+`UOndD8Ebⓑ_\>RXNjEM+Iq#$ d4"ZXTNM\r믄)7=gm,+5ZEEe )xڶeRƘ{S$F3>F +"`dIki۴lʫ%u Y4G0MǍ(/{!Uiseȉq)_X G{Vלf!(x)+osɍ\G0DU~h&R#T+_ ;e``eiۈ/> l[--kkʾ·|J SccfAʠ7?~4!4p] :Om,M3hw|zJ"[>Bqk+'Dл*'19G\D\$m:&)X,.CԊGr?!cna%F?y"Fz(`,A~ΚcYijXγBWWDhJ[mYT׌\>ՓӔ۪hjz\!uQ 2z"**T%k96:r̴UQJKgzLBq.D]q2[&zH,3Y!J噠IOE}sT9o">!(-Ay/ ׼D* ڰW.JjNvvF~l70cDGKhE&}fPd°=ȩT Ti3Wc`eA*K_ 8:Ujdk]T5=Twsi ڪLIb/{k.◒Ai !  sy41Vm)))yG9IN&Xj䭄iհ+FiithAOL2ti`붃 vҧ`㧓[eIB 'bT <3#=ZV[:=Nr@3}mkwW[>}8/Λ! E[}O{IkҋӔcr`2$M\ a3;E5ϋA9 O_aNKtQ#&fV@jɏeiPQgVGǜNjlC\Rs?\B~f?MBJ6_V<9.Oaպbyu=V=k6;N>=Ĉ'5UҼ?Vfpt G2b@uѼtՃ`)&b8x*B^uLUSR1 a1-I){ǁs{I \p%oN^ o[|`%M#yw5 oN]V'+ֈ<>5<Ǫ01'R ׶(F53W99k{uފinc"+e%Scʯi\ )zޘF#'1I,,PL5Ozo~AWkOΝ'rҦ-QD$SXH+vɷ<%I:iffBQhƾ!]qX3׎FyJBrݼmx5NoҨ ן%<ҭm.S,u@mDx@ 1o{aʯ5^>ȍcT351Ԍo'CS#tO))iK"ղ!{]1N!oZ \n[t&Sn[2[B@[?e-ը$n"@ДՐ4Ls1-794l^Rڞ w.<@CEf5\Q?iZ ڌf|7•7dg+Ci-+H皂ktJabh|)OA"pȡn{#ATb)S7nwF>1RHM_z/FkK573})^YyMMAK$4E6)4TA"pSR":p?ϣϵ0nL mRf%42*hidFVW" 4o 9H" hTk7H$ZlCK$&@JMuYD:!uA@E@ؙ+ƴ :VLU̜9P>|8:N{1 0@}\N:ּׯǽV\ J3K//۷G@@fׂ+dBb-qS?=e3KIK&?4 ndoU/42ۛD?7ð*gIK>|XdtիWduB %- 7}0uuʿ'> _d5 OŢO6c+R\.k}1 e`D^ p͚5F333C=$dmV̪,֭ȑ#-͐QqRR͛'޽{㫯5qȑ#o1h l۶Mčyt:u*vU!\|ҥ 1l0&MZj~?XBt`IK5.]8`nրju%Z"$~n"~g;t$vW̩"Pi=4N8>(VZ޽SV{9^yu *J@ZZzHΜ9;;QꓴsA0Y݊ v]ԃs۷o3ψlLּw֭qQ~wpZhcȐ!#Mlz*>SWC osں>Fmt^][MXum/bh|pc3f?q Fg0Ccwkm6?y O^Gs+sOjK$oq=4-=1wztB]k~+>|H,BO;Z?&> 1 L {ZBpbgN?7"+7_͞6;'"=u;:j8/ߞ- ?m</SL(Ďi</?6J,K Xtl@j3Ah 掤žc/3?Za8xE% ~k0+a=;{ъvQ8BSy`zӹڨ/2lQ|LDkOq&kx?}C~R?׸zfx-W)vnMdbb`3g '''q#$''c|n920TO>D믿k׮ᣏ>yT3͞==zꅅ  cmHLL?.n^{ YYY8XW\Att4Zl)s޽"סCDEE{ܹYy3W… %q-{muh#ε0lEs"A#7D0oʅ:z.ONq:n;C18DK~ꀈD]>~m ɽ׃%82 _Q/C B@`,3X<>v/a1di0>7> /w;|T~.Z"Up$>kP*̉kk(Ų`:`|ɴ7>Y7NMW 6ti熑 ./6x0l [%*$gaa &Җ6maǎ`m9N8LՒLpFmeM}bҥbѢEBS*$cǂkE'vYsKHH?gɏS[[[A=كԩSVRH^#F}(Qع`۹yW;ғeZ_5[h1t™ܣh_un#)(,AhpLLM' bXՐS21kB,O^("/& /#qQyh=7҈b渞#oB iܐChMH[b y"Ql?& &&bxE c o/D^#IMxX"bRD]aGX10<9gF562[Dܬv,Յ?o|֚OUVX8Mm /U]Ed!$2;V~Z"l"boط[ӽY$o\hy)YCeKE,**Rk}}¦ƍ~hh 9:ܹB" LF-Z"L_~>G;Ν;Wx߇Yc- gEFFc !5Y&BdH)O[^Mv3ݐl)bO$=8Z SLTJDIE_[]Ȕ6')A*L,y*eҬI4=H.ւX"t^iHYd{Ӳ0I՗LTkDiYDjmi AȌUs}um 2:z֊ףU }4&sE:i. ~X1)#W!HIItJZVFt.+?o=;ڮ2ckj;su]UEdm+`;UţO<DߴW!3mY8.hPS2W ScKKKcf͎Mƒ0,)pu*dlo}HHc1jeͲVn*ư~>LM7񻁞 $*NpeMFUeQpQq4߷"J>kxuXo.`G"c{r2|H3KSd*.7ZԢơ?oVz  Z"<@b!*%F9U-(r!XXg@ [ z1WO_Ӷ6VNmA" Znno;y_6M>]_(Xid@7_$~CMac3SN"-ӌ[>I(`ӧVX!mx: O}asI~l" >@0,YD >I!r> ]irYsL5`<9d6aXd5XCS^8- 4ϏIDtKn M1C 4ݿ{+K(Ȩ#l*>=G;K<=Dbty ScQ6ϋ!oD6%<^-kƴ=\ޯ4þR 2h^}DLz81r#ֵ]ʿ<-Eœd7 kZl6nذ<rrT> Ώ}k#<"p.]"cƌڵk/ SF'O,4P΃ })9SO=&e˖zp; mV-?֪^j]A2sКNHrZ4O{+'J+̸{}F~DvPU&Wz-3/|L<æv"Jr~<&?`QFb[y~0U,Ε㰿2Ƨm!Oa%"M6AqMشi:^7d:kRQL0k!4 S4_j kVGmRԖNkPxo/-||?۱zZ,~vbmf4 AemfҖ!Q[ne$'YXVK$R$K/lD@"X" 4dؐD@"PHWxe@CF@`C:n@" ^ᕙK$ I ȺI$$zWf.4d$6#&+^D@"АؐD@"PHWxe@CF@aH$8șnD #&M&|ȦI$5# f|dD@"Є؄/lD@"P3kGJ$MIMʦI$5# f|dD@"Є؄/lD@"P3kGJ$MIMʦI$5# f|dD@"Є؄/lD@"P3kGJ$M?Є1дT n>ٺt@9N4 zzz~hٲ%z!0!4Tݻ7{չAAA8tΝ;W!Y!xV?#⌚EqdD1#P/ bb޽;Ξ=-Z>|r >o4R?qѴCVT"p3ԫ ܵkWAx\1|}}xbGťKnf޽(,,m+>rClb:9Gg9peçVYH)JCԩ ._ #Y+W߇:0M/^ccc 8Cd_;v | \WWW9lS}v|hѢ˲e &%K 66f?7⧟~B֭E9?> ooo"o7={Dxo]vUH}ƍprrB=tRjJ{1$$$gn݊ s=x+U'q{?ǮV!@>l^ja\ ŧτ=GmE3"\q~>!h :"_~Hmfԫ5w0͌E3Xo<=v鋡pŽz|u?.^9큉?ˮCq|0U[Op u_ii)CMmEvn: ,J.֐k?FO }}=芉Pkp+jkٳpѣG2|": N>`߾}ppp1dMlwիk׮,B 6 .8:tYKc^Yl\U)3i1a[{g Krr2O= yVf.wѧOs}]&ٷʝWO@@03^; A h(r(**ơS1%>Y^ Buq]C$s䗑C}̙΃q8Y׫`Ȯ=7Ұf)'YtHE>XD|[]l7eTW=݉h1)8r:|# ,8Y9@-:Ɛ>mG:"ço`Op(u*9Ӫ-'ama'  (WP\\\``XbM/TNv6q 4kL}?,H***JxqΝrrr/Q\&:ΟA|aV)Gi*Äʚ|ֺe-lĉ`,|饗M&3ׯ_?/kڄ} }WHII?_%9y͛'„[%'ׯ[KX`i|&2&jrnr`|R.߈Ƹ!*MǑޜ 6SϡS7D؊ F hプzh<ix˷g9Cc_PkK3AO/_V'cҝI+1ݱlL}Ezxj$ 2Mu^3HzZh &OJD`vv (Md6@4۷LdL",af/k]pqqq"#kxlJŒ}D?yL6Mt}Ҙ۷o~Z-G>* j8yfڥK,X@ƍ&-)ӧO5QګukD&wb6yXZp7iU)=BZRaa:P6P„rL9cbH{ܼB 9N-yy%02Obf¾LM;H96UhYM>}c<|Ml; LV-2V5p &y'@91 &6~xSc~,b˾0& #GE&nݺ +yӳ). TUdnʕ5Dc%ќh"4 _JӒ" 1y9[<ҚɽT f/5Ln`BOȇͩzG#O:٫xJ*MJJcя|{( lj!kD3oXM1c`۶m 722RV1ߋc|;6 y@dܹBc<a? YHMLL* @ E4&rEجp|f^ryԗ$S2[Qk-v4hhPg'㚛A, iCwBr D%^^~ ǎm\SbG[]}"lҳΗ ͨ^[O umu Q W l}^1uYG6 $~1YCA2dwAndK=P" K1]Qkkkkxyy}&Q4=O*SǷ~zOS)|{CkZqǒ0iiĈکцFO}uE%aS)o2Uf5jp,'١uEԌ>69?M9y!Dجe^#c_'vq4uժkDra!PȤǝL@h}ǎaSBxg@z-X>>*OCi-@&æ#k;)lƣiJ}&ڪ-'0qWHxGrGh~]۹c㞳bJ! Lf9qj:Rn?nx`5?1s𘬼/8uOg4_&!y5$8vGGGs>ɮ]Ĕ1@D7߈Wڶm-[Bx?#xwsq1@Zk ǫ0AbZLnn T?E̙#A&6NLLT*ly:u 0>hSjŐ?/OvBf YKg]~8,9wZk<0L<'> feVaQLJJ#գ&LjK+z\psEJ$c+(3cbB Rs)L<˚6-|9.£mڴQOѬ(D83鉰0¤@h\?&o0I2+ax1<ǏdγJ}!&LhnL~8P5q&͋-yN" 4rrB\ejzVJD&f026kOK$ssNuЉ9'+$ ?:.#I$;F ҵH qpAR$@CAK UnC%e`gk\x ٽ+}R!] $B}~g_@b|,ݘG: \^Yշ LΞfN[7-b_ܕ"Hb"Qxf g*7LˮrN(E^N&.'K')^I$l863tތ\ʆ?o_3DY2L8>|-mQ;#պ"&K$MIMRʆH$uE@`]%&$&s)eC$" @A@`!@]XWd|D \JDH+b2D@"dd.lD@"PW$1_" h2Hl2R6D" +늘/4$6K)"IuELƗH ̥ Hꊀ$"&K$MIMRʆH$uE@`]%&- dPҐܼ|FFFZb4SEEŴ.K oiIӼ|Z09 BliE@y;5λ[~~AmpđVmBjZCvY 12<053W߸!υA?"—⇕k{ac'(,,_Ɛ={t} j 4n Fm0CEUZE9!-Emf^qqu~L@q䣫h歯'gѬv=}| .kN_ľu'v 6Uמg!%=6Zll#9% qhK$NLLAnn>tH:fpe[g,z1GqE;zߒy]*F 04, ~5V3h@O2#2*NSwh߲B($iI) Uh vxm=аhjF 7lH_Xx׮Ȧape&aCz?X:gNPl.c-FvйEy}{wkB2CLL._K!hWWGL0-Jdͩ6i'sxPYD׶'NNEII aw^6'ߜ#:o '‡%ZĽ$wu;"8$&& BuW#gciA 򈊊# ;ʍ:\1~_q*"`;;BB"qߜIpuq@> bÌ:"w<:fa_WBb088GuY~|^8wD괞*R,"vEi׫WUUuG$%KDDЙss]͵\tS.T , PPRA?r.+ <|.'=|SM;:`HD@wB@y. f98 `&VDaG>[' IFQ@00tuq4Zlu܎|]b_Ⓩ=Z9{>sh];ڇ`=cMyy <}: /\#?r ߧfƗoE?8'#h>ԱCkuGO|Dnn*h eC<=/=ډ9(7nڥ.6/ߤ|~g͘:VÅq괎Di]m!عOb_^xDn]`A5m;'G{Շ:~Fm>6e 255+3@ ynƍfeeӦ-g֔}[Ih v"Bn2{?ziuAYcm<8a{o 0!|*:G}{wa!mڼ[,`wo-zͻԍj9ȯO4}hjE"71]-zQX8kQlfrd wQXs@d-/'O3GvE߽ϩe2;Oޞi>Gi>;8oؓS*ּm e2i4aS:TB<23UpqS2ɹ>&bEZ/~@xZ4kLq 4?C ɑޯZSջ\hXlV}I  {u9V*n*2ҿ61<2O0Q˳3'Pț5 sQUH҄}ѬicUyVwiɘ;tlME վ/Z_[ćmݲI0 */KͥeR" K#ͤDO]yy~  "^ @/2)S|=~Hԯ[ZZ8v6&LRu|3i{)mY<4S汆_\ZsCHXf"1ťɢײotb+aASXqٗ;fv?iBs;v6n +>_+r߯~;C*{4 y܉k+mjZ:e Gv('|n(lJ CDUF CAC\8 aR{p+4s1ԣvQ9Ł=ffHKBG_ԚYgڣ<6>Ǣ ʄݴL]Zš$Aą2 l&>*|1B]Lk\zN6ukS])."4vSQp`&QMP`EǨ >s$GQ0Uj^X IDAT8TZEגHKorM8&G|aGNu8c!!xsZ+hPs.s2X//IVk3;oDl>"?v>;8cø,ߵ?Lyy879UXB}o zQAL2Xv>Mw֤="ڸyCG I]6|]WC/˛*o={w@v׈! 4C{5دHRuAŸ0KW67or#hS;j)-9S6c@@H_|PEqT4^e]ֶԙE΃y!ƕZe,AL~K/LXR ѩcL)<8}Br*!gO?Oq#PCCݤNM "ՓSbpgIC>N&{]" pk)/;R40b |A@q j Ծ=>mrrlDCPQV:tޟ4SUv?G"ϱ@~0rgAX8H]!ȿ(ZcgWE0']k`VO|vjC|HON"Pg0IFmJʵ˂N&Kt!b?'km6iK^`Ӻ.@Cm9)9}8pQ`<ЦH~ts@'GY;ow15 d6M:Lb_#sfJc؄d GQ|l"><<jn)lcF G(NjT jQqdn `f#N6k~#UšnB~e% `n>=SsJ*ZLbQdAjWA@2Rv)%vaLi Ӏx֤DjB/'?2rU>?A@nTQbDHuqho=;;Sڔ: T  "3eH 'LiT P]1W!71{Q)JA@ $X^cJRGD߸hL"@L.DDpxOZ'@y,/bR_j BTDAoV~dСU#""(NM6܀x,,,hǎ%ꇆze!5`umƌ&O" ps P+ n޽O?Up9Njz 9k.z7),,ҨUV4zh9s2C>CBB7ޠՋG?0}iժɓ'ٳgS-&J]Sff&KtS W}oҤ uڕƎK۷W,];Sg}F{N:8c1NKͻbccU;wR?3|p}]y%Ա?ַe ӨG&4mL_ڴ-/ҩuS_znPhG,BN/KiQQm2cxԧgh<ɵȸ~dc]u;~:~{;#wWuՃt9A?/II Wm{OrJ=/:zs_Wُ'_/g*(EI)Ժ/ޅ6o?y˨]s?O-M5w֗O~^GGz2Njv?WЙs{9ׇ>jl/XB/>2糇0>Oh>i/b~f+55-[Ve,Z~겷--- ?>K999ԠA_ cǎ|@k֬!!/^MvM>|z-Er&M_~E׈_|HI+V gŋ)^ 9q۷rssU 7mڔΝ;/)) L4j w8<?Of9-Y3,ua&&gАޭ <<&}&.r8zth’Szf"{ z4s :ptӲnSǀfx:Өa(3;I!r6VkRj&9R:u.umF \o&ǣC+}G)>ȯ2=B:r BɖМ]PL'/&#}{+i94~OdYׂƌZF4<ݜЧl]|l l79G߿3^ĜwKV +w~18b6tM| "f@&04;ACO*ٳҊ?@+WT㏊>=<<|ݻwWce  O?%hƒN7̙3078$%%LTe Aooo5NhKSC5g%d@ B5kUJGiJTD̤!4󡁊xV\i@vF [Q=׳'V$:k)?}Z Ҹۻє}T4%Cѐ>.k~ zXN|A 1Ц>z>jC,b4eme?ϝP +_@4N'7^eM9\}h+ϿlId{'eLr2qdhʚ,֬qsQ[_1RU?|an&J0#a~Zn]b*bbb>\;wVfKg/YDGUf/LfdYv9n8ˣzꊦi8gϞU!vܹzU>g}+Pǎi驪,!֭SKB$,+K[OkW.jef*s$<.c-1O*m2;'O/Vfɳt!>EigɩY}@ ]Jfj:t,4=)X @|mgSvakҜMϮlV%TueC_1kg >fss:fkvN>4ЈQhaiJ߮Mތ7d@} '+C&p``,4@C3N3W1ECM ץKںuޤ8q"ot!ڲeLhĈ׍{07A4/ ~m bB7֭U6cԤ~}h$(1dTPptsT&~֯ 9A:|_ؽu>!'s[ԡ?=pG7E6Q1:?6>5@?wMeLև~n;J=;)*F$9MMi% v̼LӥEZMnP+RK̸$\,&\;cnQtnReG"`V4ehra&zqժU ǏW&5+ח^}Uz6AmڴQ48Y8::>c4f̘+hܸlQsFN~h~ >h &Q8,O$ri/LUq 3\f҅Ɉ1KG{vזEkZֳVzZ[Y֪NaINn1"d(u 7ez0 lʔᢇ@AXbbZ4aÆ)mf"Lm۶#x P`VDزe+m۷oWիW͛k*ͭ"M9[Sx7thִ 8kkc&\qVүRnGv_>H N_?c234 ^͚("05i充@ކ@-:IxR8$2:n҄'PVN%քaܸT;Bc6T$Hf͔ AAA*R(-)2?<Օڵ9݋.26GIG`"uX06HVV L@KO`ZKM@f 4bm jϜ0埝4WZ! z,[@/0 GhlKH8Y)1dlJ6FSN"ߠR{bٗ*X{M{{Q;?q-!;߬VRg0~GU$}:b"7.n`A4? 4{ァr6id I~P~:`ΖW DFG}q<Ax ,P&/ӆ h*Z<ŠFC Q?ӊ47t4]5$|Nq@G۩(ٿ)"B 8|xJ'y=]p " ifi(VusgCo}t#_?Dr.aRkLmh{߭Vg++ SO7&B1u{G"4Ho)Mrie猟H+h*qj\Ymk ')30akZV^p4X=itr 3,%$KC;nu*_2=3C%|W-jɚnCSA"#o|@/FIDӿ'' Ryv9[( S 0K(@[DQyXF$`H[og3Db""d\^ Eڂ@q@mC4(&!wNeF `"B&%A! XΩHLD@D >k9 Tڇ`;2#A@0!@j P}Tf$&" h"PRMj&? A{om@f$7+& /"@M@TMLp6e `4*5!pd `4*5!pd `4*5!pd `4*5!pd `4*5!pd `4*5!pd `B#G:uꐟ;w*CyDDUcj<cǎ݇ze!5`MO" ps hpK?YڌD5'ҢE… ԦMݻ7;Zn:66fϞM;w СM:s}QZZKtaZ`͚5nv}V)33S:99V ߧիW+I&ԵkW5۫c.]J}}ggԩB^^^oR2O} ڟ\Ӳ)b؄Kv%RBR:nKMJ蛅[ة{Ҳ[6^1Vwlu>~ Zc PR2iôeIM i>ԾeC1%;igiB|i.Զy}-vdz>t7L/XB<{}&Y[եޝx~¢: 3tyvv-НۓG}Ugޓ^|d-\>t"Л>y=<8֣vfeZ!?lll(((mF7o/{s)KJJR@YZZ}˗/?Ooܸ)776mڤaZ S[o)+I&/@d/LZ[JtqRq^-3F"P-UMSiO'OVe֭S˾}'C@~8PJ .Gy7nlXtu7n8ˣzzvvvtY?˖-#DaC4MO;nݺ4gjѢE^yرw nL[php@D@Kȡ\gg&fs4 ;ud1U`.}nZr/E$)s khaNvLx>ԥ]"i4gSkxxbRFAܗNDZ }14cC۵~S3toǰ )J#`4p*Zݏ?> &лᆱ<\(-P4MK`VP{eX4~meB+++Kņ*:|ԯ/a[ f!Hڬ&$<Weqo IDATEa[ОCԫSkǔ/˽t%6s5^K?_Op-h^dog*%-nʵc%HQm,M`Jݺ껤;u6f>p-Vݹxi/pњ:e0 zxxyx"uxՃgÆ ~zB +~ZA;f}{ڊw VjK___zWSDgXo׮]*}9N8Ql48Y8::{ø.,tnӈܜ GPWk|\J m3ܴ;XVhoyѹu/iuڶO*;j?kBXiXZmze߸Mٮ|bwE?ҏ>HׅN! ׶m[4h!~#5#ZL#߳gO%F | ,A>`˖-imfzh޼yʷv&?oyТl3$VqƊtoo©HBVhC4Oq+)~4;vh5TZ`vN-SֻnyI>ﺱ h_o>ǯ^BЂ`.Bkذ!kNi0>"cƏBkƂdAE%RWE#++KڨD`6icU9ϫZagfrTu' d?|lVf5U':>tEzf[Du8ҦiƯA BHGܔs+9k?]h=scoQq;%@x[lQ$?"ѪHKm7jHEV mViӦ? 2DDGA,YDtԨQ%B~ +{!;ڂL;IONj˼dS ,QhKO/8ΰX`;e7`7i~*gm%_;se @&i<<@D-% \[y@F@v_ `H nk @ @F@v_ `H nk @ @F@v_ `H nk @0e%E (L&>F!Z t$A"V59FjB4$A"V59FjB4$A"V59FjB4$A"V59FjB4$A"V59FjB4$A"V59FjB4$A"~SNӸqԩSk}:ٳg >вehܹz*99YGf/LQhX8رc* MU{ǔVr6z'OVeÇWKC<߻w[+ YdZgΜ[o4A.*:.\H< ? b}U=UPzOKǣT"ZIz(JY@6 *~ 6Lз~z)mUcf讻RQb eĉJcľ-[믿>BV#MHHЛ G}TP a =z(>Fo6UWKѴGnku2h}&pCDa\~&JW-Pð\ڼJD8]T5f%@`zSᆪ)S(& sԩ4B:?C ~m۶ HnݺG1~0CabCy,|J'8ё#GRgʜUԶR \e+oPZeʥͫ\ǫ)%Dx# 6kRJJJC=ӺuhΜ95sf6L˗dAoȰo߾-ņO ڟIC`_4=СCj`MYҡCU Fzh~β5G-ڬ=uhPwjӈlZwpva2ijVlPweee)48W@."[oZ |s̄I f.|5@3Oi- h/֑:zYbç%&Jׁ_AhNuzP"3Ɗ^1٨ڪa5ޝSaƎ/mz@xO2Y~4 xȳ6m! Mdiԅً>M7ƦiyZ\`2ì24yy f4ֆ4&|g4am>  r Q@*Hts0Yc/w[W.6H.:u6ܜW&t``)m!f^c,t@D hqHr qi+Gh(H )'ڠ=*K2UL `O :|0S`gw:'@Eo_J! I,yt;!7w~:;4u뚬T7+k OrGZ2SbW-w7U{˥jCW/?ͦt:,TݻdzA@ax6 k~ƦUR.  8x򮲙V{syZ#̴o= &CcRUSz PuT&$" h*RROjBʄATMEJ @C@֝R HI=A@uֺS*S4)'!ZwJeB `*B"%A! XNLHLE@T :k) Z`;2!A@0!@Sz PuT&$" h*RROjNkOII)oprtt w7-kՇʳsrdeYM[Pp'Gy땦9f)o_߉<=\f:U9VaG,Bڳmݶ J8nڗ)ݨu+i/L*o;ԟb&4ޭ= ݔC* ѹ f>o*:~bxWN]c蟥kUgnI|oTԧWg8⦰}~ڵ;ϭ%(:ulCte"[La0 f6ڸiL֥2aئA}pKSQzh? ǣﰔ& 8eswQy\|Zk}ܓR(uמPy >>Ժey8!GSae管2Wn #'y+ [~1#RNN#+3KO|CLLL&'5RWDx`5~$Пp3Cw9T}xH:p###6oC/*Zi-(I#UYNՉ+[Ԭi|T:Ƴӳ#KTmV(&"Q +R_cz H!c;OTú(8kæ }x줇-"I쯿/X3ghObJQC]*"?M|C@PǎV޹S[`Hb<(/u'PVDaG.[04a"x@0Iym8QRr-^vnGχ.T͝= wCjf0|Ǝ|yy<8;O_&~^G~83kl'q7WH5d ܇:vhGGR?TfVwԓ!uB$55WP::4'DwiX{|t}OLtTD N#)AqXa19߰&=ĀA_qS28pq'dr&HWqz7>p{ G^[P!W':6҃ 4h \ Br[vhixP3'i`߮Р._G"GhжrwwWmc|h^ޞ:0˝6+ uMM$Mո_3p66fCHXf"1ťɢ6bǠaAS4Ҏ+Ͼ͑5nj$hPn0)PV |)sPq'6_Wݮnrit]Q6uV_1B&. AT*V/8F]:+jG}n.:|}Z]kL'rtEm2,]@EAf&tK!Nshr x<:3wu+6š$Aą2t k G_ !hf.ͥ7<ƺ.5cm P@nI*ӴQpန&LyڦZ"׋ynï7/;;vQX*xĐ>I>s ,r"P&0Èh Q>l =EN`c4g" JW@X- zf,Yb'z\Q ~˰#'~8oEuS,ǔ~Aaܹl΅<ʄcſ(&YaBP~(M޿o4Cۮ3 ᳃16+]> | {v51d}@iAyEqRpM1TOkb܇a|Twkhۧ_W,q@5j;\؇t(hc? 8.7S+N2 қVUEcs# Xnؓyt9w UQk*7^dxL&s8k,^njۅJ>SM]e]ֶԙEMJ8w:82-adȾ0E`i$ѩcLRx+ҷg>a·s`%>t Psĩ49Pc7St P`:@&bE4ޥӔT|g#*ay8 uX9 G;ܷq ^nԩ}+z|8Z%pk-BAz& TtdxLǬH IDATG>rK|3C СtF牽Fm^i0;qc{!: k/N>'4} ,$RW@~>/J/*}sҵ& ֱ>k͜2"k6,KEaFyF>9mJ78ʥ&`ᓂ'2r AE|@aޜ/vSadunÃS#D[8 ~l { -NN5!G${mgkE9d]D}]t6Ǵ"|l"zny~\db5[ā9Q x {81 #G37lMq ɪgꤱFv4՝|:R6/0]ﰁ5D!"beiAZr2sTtM*D~Fc8Ys Mht>|SLODoީ.%Q_ɟk]_9ҕJp΃XMl *LV%K3 r5 YY!dj|I"QP˴u^Oс"&An~CVU><ɚ5xdg Gj8}MЎ%ͤLn;wx*ڟq0Ek]6n[UbL KzxSnNאi蠞ƑcR13%ř{,hZӒǓ[㩊9K@ME v``# nגBe&#>=C +\5{SXWR5c^At*= nd 7B79 @! XE@K7 p! x TBUt#7B79 @!p]i0y9ٔN9,? u>I,@ FViOs zd]ʓL^0ږo'[њ㇛ӠJsAH=A@LA?Mi$StT4%%ېY۔|)ayN?43#@e"0 =@1ۿ ?^1XQ.`>k~#UšnB~8˺ T9}zv()vɕ|Uĵd2BK9Gw䷒]])AhHmڵ 3~Շa2%'O~!u[A@ (f޾l۫$yp>?A@nTQbDHuqho=;;Sڔ: T  "3eH 'LiT P]1W!71{)JA@ $X^cJRGDiL"@L.DDpxOZ'@y,/bR_j BTDA1/ =٧)**M6!jA@̤ ҠA( ,f/_Lo5hЀwNF}YfQ~~~2 eX>| iΝ%o~]wɓ'KH;v K) Pdggӯ"##df!?^}U#$ݴiS$Lߧ'|۶m ĴcvedCCCCiԩoWfҖ <8 RUY?Tӿ[ŋN)))t=_~گ6~jgHaaa3Z+mۖvڥ7N+[ϝ;W+:>|s$-\=uSL|*daQGzk47KXI]mc^5#Կ[3oxg} uz4J͡'4[j譯n1sE9?{ޝh}}(ki+za<=5qU}O~^OGGwH# o6`k :___57x۷OiX͛7UVOKR)A;y پ}ZK-+LrM`?nM~.BhҋQ@/У 5\g7_!#KLt))5S=ۋ&ZfDZ6;_b2:w"։k̤B@*УhGKߵx(maUT}_aeng!NuNЖpqGN^ӬSVNQŴ?':|<مFl7\8R lA/NF#ӣNHbx>OYHcS^XhKPLB*18Xہ1srr &:ܚYz0 /D5 C-M <D2:GU\v|vס¾ktFfJ?իG:t(*@]&}Z搓6Vlj%.e6oMqd S_TOzh9DWfj+" X&J mJļr*3i'378+2:n҄'P6D0ūB@~j~Ü6J'@80_~eҥK )*;wf͚(/"Yc=R3yAHi*Q."3~>DZJK@ ߗC' hB ɲdFgD, Y)1dlJ6ڪv}Z&]ioPQX}`J9bWhm8;oz}Eyǵ"|Zi~Hxk>vVF#я딆V@R@~@2T #06||* FСC Қ/Nۯ-5ĶV.KAzjIKcNEiMQ>|az_ד"bG=t_ 3jf "HK1͝u|?8%۞ ojeco?sޗw gpj&}8!k̹Uŋ ? |lf,ԧ"ѽ[#|}YB ?Aѿ*GC"d:rT9JE5%$K#">I As`P#A6,/:1'k&SD N9KQ5w[&-+BE נ )TEf>9aP X-"[V!@Q<y{WĈ$f1o&e5-(n"kl~֜H+ !BRڹ@~;$fDbe7>7_DzL]Q/GAFG<\eZԵ}2>A@(=#,5  .'nԠTA:hw$Og9I߂ @4s]C:Dt䋉eѲ2A@JbW`aZؑ- =XV[R&@"WYڙ4-9xPBl ?eRRID V\ej& 9{xSءDA@Qbv~ pbZ5C|ს@:cut4C'@e!߾C @~#S}A@~pMN qU)ztRK  f*6B`9㥡jn8^ @v'Sq7 mDwuEHP}]V{_>4?Wl3̷Ў/^JjlVoE6j%DKJhT 9Dwh A @ccIp6<2R+Yּ0;D m <2N9uM,35DZ/0ѷZȂxndhw YV\ug ݍ# #TZ:BB68Q>i-Ŭ.f33uBTpfGS}XKD$z/{u,tcS&;Q/xDg]!l ][wݓJy=Be9c f⥐9ڂ׈mvFz ~ʡw tM։3\X,h]SM4+iH'#5>Wgdyh~^C|R kϐT O.5TI'>z1~{$0$nk6G?TGu=gc-t-) AK0G0oqWLO!;AaK=r&9+,).>%/=դ{ b澉Vś/Nɬr.:Ma,~x;3[ [' #w '"p$dBcϏۏׇ};dW[i$|"Km.Q7 Gy.dWl Ep_yO'C>p &~?b隦#0wMySEN@!R\[PYxGC}bK3-F?R\cU(Xƒba_)m .&@&gxd7NgdYQ5iL-y~aBƆL,Zj3fAgtơᶷv"k7װC?0 b} 6Ac"0 ,}>^PIDATM_ CQ4V<RG#tkۊP5﹡ i 3Mhz=ᤉY@ Rن,UtY~orj ui̧ }ǛL֛ :dҵ&1:|j3ᅂ><UJ1<38a=>1DC%thwKRoNcݱAs+Vy0L^sdP2-5?Cf߶n+qbۀ\)/WXQX5+Cg@1Kezwt5 )~졪/t^?#w1Ok5OROR'25o0Ɂ w$be{~!(VT<1^ӑ۳c˺ b oVvk:>=3ìE7#Cid0ڸ V# l6?V4ŕE @ |>\~?rcWX¹q(jpE`f>)CJ3`;{fqю=;s(̡;ߛi.}پN7P2my2qdx98(ǦʝLj=&GgSY69Gc~7*#ayG\t\@REns/H?.$|v:W)6KVy}"{A@hWPBۜB }_`"Q|_m!.xY;#ڇ\JQ՜+p9+E~5A#NEΎ_:\!! PKH#A@!2A@h-Jh$PJKKZkFA E,fKطU$@ Q[}`rI!\N('RQf6 UT%F#~c{*%H+s=LRLk% .P  ^0G1WYwP<@1=+1a.ʅ49A@tl]dm Vdң%{.{ʽ ( TXD{Nv 5C7}EiH\_8E!~u/)}pJ;AΤiI } ^痗槢\r)kOJDM9bd=l(k>ˬ]ǩ?$j+N)郜A@^ 9"jo᧬h* 0ҳp*[{ t}k%x߈)2W.>WQjɱr%J `<<% !*JA $} XE B𔤏 c(x@\]Y[r)m ,{5ow.ddd..>r4x1&s(݂ #Q}W7<ȣ5F?DzM)x닢cxH"O)G bUBthgC011[.[sgd|+/-QL)RXXÇVDj7鈼' bpRsッ4#guQXS-7X۹o 4ə98D,# C04?;{_ ݻյޙ1{8ۣ{NNVN>t: pƴaNƺhIYsϋ2֮^1O?sR=> wj: iob\v(W^1vۿ0Y???L6 %ؽ{7V,[cqϽplB޺An]vbΣFi4xݻ.YaUZǕ@ss*^-}W*ҲKڬv/!37zU +$]J}t"'r׬[ͥES;?1,[ tc ``hY~:јn,\tycExaff&#Gb>5={Gjr?xW'!bF޽}>&syܩPxp̙Xj kkktٶ6Y,eDT?zciX_՗C{,?z9p=i> ?~s277Cׁp\1]7:N~Xo>+J*XDyI%N!7| ͘ >;?@qa(kH'#> $gis#L$[ӏNEs9 ?J'M%\ax<m22)0'az<u{2[ݴZkqqq3g`ڵ$\c,VO?^yy` 냳$Y:w邤Lt -H?Ȝ>?E򕤉*}Vu)F ̜E4Q) 򲆙]?=i{ Whzm1VvAt Oذq#|"d打_pb[!Ԍlϣ(00kl8aۑD$?D'0y- fx4&1FkrO@Ǣ6̳ϓ91@O.9HOm[XmXZZ4x;{ݻwq|,u)2Z[>4_;2OKNw>vOŨMMM͗_]1]4ø]I)lGQ䚒O"my#lV]tҶ}-/nvxՏpjW[M`Ǫ1k|Ke%0bdM; o&n̥hٹ}+~A^}ɐCUa,9Yb ʅ|ݏȬK9YۜMDݔv3EA 4æI :ZI U~Yy,瓚_Fƌn1XON!O)mTVj-رsFs*'UʋZ%2b,*R?+ ^' Ҷd/>ZN#2j \a -))WD$lNDZ}>'9]}G7݄N]{bsys(ñc8{eDɺu̓e'_VqBe$Sj t"G;' -)BeE>>/%hAJ yXm2+}0ܹ+APBCݬYz$`yU?44Cd_}L-_s&{/-MלaW^2`d5o ",CE,&M&3GLdvvA|1de"K!\(=JDS [1LRIõZ p-Od}8֘;iZ< jngQ0Ve'~1)QO~Yq9yC|nw:m:RD}N<ɓ&j5X`il5~ S怿5eMH ƚ[1|h?z{%qM>#M0*"!#,D~b'/V/'?,;tX|Cw2দ[g=Π?S$<ӏ(\菲ݩ駝 =DA]m|>.4:847",?DZM"`޷츿 {W޻*q-7cÆ Xh1ݽ(_{cҥ"3}%AVZnҠ<4Q1uuI_z^ǫOԌ\^}bưW_v_{w 3Ko0;" ksGlh݄خ0G@gI{žR֎֝!9:0TuO'uEљ @҄JQL_ER훣RJH+͡};DgWl'bz~*Ӳh__^%n݆Gmi`&L Rs Nf^sL\Xeb^XgɿD38~x znod&@c9zf+}bX/Zs3}MD1wSX$(5Lh82-k;K-;[{ {%\]Tȉ 2fID~0,dҨX_KX -@I ԜODs?HLyYU+a 3];gN4ZDl5?o\繁vD}yQ 8]Ojnj帤W wg9;œM >YوOW='jWۜrdgN*tTȻ`GwCp$,6!S} >^!Ǖ>t5gR_7Z^_hdpH#^"JI_O71B =+^0HK6EFST"; 9ԪυvDV^t3H@ -I%^ƎEn~C&dC$S_{:j1jxl :O/_)T\R &CKjE$_д^vZco lL㲎D/F|qa[mGعDcQ1FA`c[٪D^l,JښƏlZXknt *@whL4&9 @vN# `,'>^%C_eD:"`p,4J]K$ڋpdD!`|W]Ȟ$uB[kӸdD(t6;ʲDE" 5yX$k1'E" ܈\ msgO>މΏϵo)K7{ͣyiIplme\JoG`^pmhHLZi p`^q3ܺTjzL79aP>jW&3M+vmwnݸ]Ĕ^wöGfTZJ/66U_VěRiI{潨J^;aϩXz!9JKDAk9rcD =y9p bqJ9N[gYi; >IjZ;y8wr7MѡZDn?LOgk״gpn; g_dͮs!LKw,ӛ\Ѿs0OuN+PR\GDCC#t=HzE* ׷wE_@Jr wTj1v'AN:z:js@yoX?jnb;mEDk10jyxqz=ѽ0t+AB>v|yq X6d+%tm29S't'q]s-4`-7Z-cߺa :7YлYuZ%ق8o~XwX;Tg8%.i EU;'t8.D^V*,gQ 7e gWj^]uYs_Qb~Djdū=RbϋtWԶ7cǾ&r?&mP;+%6cyL7A~}*WTP5'#0-pnKtDu| ǡ*u&䤣{Pg3r€>X$iW6jݤ(hOUğy|z9y:'һ52˲͑W"//si۩C fLBhWn>[Xb쨡"Omѫ1:h^o>J˯\DrܥH<קRL\F olH|/8kz~_!xLt:;j!6Ξ!zRO^Ŕ4,M ^`׾X(|!%z`2=q)6ʼnX92' ߼_tlt,s _>~1gc8O#^tG4 °3?WR=bwnp-%tDS0mC"xޯ?}7J/q.øO"$<ۏzaҘ츑8.N}*Qt3zr◳7ؾ!]Iؤg]:Dz5ID!}:WPXqpPJT qY ?~!VfXQ_fv"ҩ@w8;Ӆv A{uw << KsSws޵3v E cU%BD\JbRsK朇,Ba n>N%LDƦ˅^?zDo=3T\nFg:ǎitbFTzRTCsjG :bŞxA6=;gALb&f3t[1zC iowYg/bʼn?/+JuUlw ;i|kܜ]Ѕnis]"Y^PT2SZS=?'wz#7,U@0!.DŽB":wǚq1\G~~m10u fAF02(wY|\q>pqp+cX[;D噘9q(\qB8D5f_y7ۧ=]Oa DDaۡ:BClq~!iG/~NR|$ ތN G`PV$dh$>^_֣#1qP,Fmi:U18Uriyt218yhq& CO˷҃+I2fqtl|J \HHoN)2̜|D^G(sk!ޔL%k1֬Gbl$K> IDAT|Щc }c̈!M200mk&bȗZONSbR^QBR_XDdev9ab?O~?j>>1A ə Dm\nJYc).>(0CENaͬO9K02_sD $LظdVWKIS(GEl:eRixfZ?kN"3אrJ'7O,=)&>/-՘'S2eoSkoLrh)i\؄ħhN,zc%;~bsjislmmx_ U4Ј/VVkfegk& jhlЈy{°P!z.Rn/!1G $А|B%c9}.Fm'&2 L}iVgbM 5~WNKMTRޅT$19U<&"흕MaI* b5 󁨓'QЊrsrk+M Gi̩SF7Z->fP7_s1 tz!3<;nO*I%aX}VdbDdG[ B%YQNy"1%C v.cmytS ?J9)j~6K4<]l%r,F&~Ӫ/t+d~ZgUjmwEHlLr[+shI h-94W>C i1(-#wOԡ9sJ vٯƂ5pUj'M ؋gi Mҡ[Tç_rWTєh&FCN.}zaX9iWM,XJ-S1fX|dK ޝpDŽ! }s8Fy!@w/lu]7O›6d/ݗi tUWC_{՚G"V?Vv6])aH>tONi.vȠH$Ĵń-6-9mE o*FT.35ʻ;I αwF\3K`zfߩ]qj0dBQaO{*4Gs`O;6~:X0k (''W#6cL/ҬΡDi!@,fRbYDK%Î]/<:Sm}Ojޢ.[ aD@Zs Z-Wðp N^ Mв5K_Fa":_Cpm^ѽK KPV‘9]'ZQ0#4<$_J"cG7O"ƍE%mjjJ^A{䗜TU7250"|$}CHUvkD K~NMBf~kZo¸Q¥aaYm9*_Ҿ"Zɻ@KڝGɘlǡ0쩳dj(AM{Nc㮓jbK*~k^V?O`ݖC0w"ߊfIiX3b@4ֈVm/5/fbh aRrw âjm #F;U`C$EI.ak:rsm.LL~+ DcZNelxɃr~oK=3-KE" HC,5u&f#R(smKHC(p]U9N\$e倣RJ;"\[&@Mї}qZ}oBKDo3n;Ď!3iEekχWM;Urr~X+GXu_KH z`M/*]Ictg-떹tkoo*{=QJOiqh KZ"H.++C*4qd_>cE”OW~\W_zn E3UNe)D!4Vplr==wr$*kywitX}Փ@"Р HͮIYS3OK$@5>19>D@"P:O̗ۨH$m2r* q#7 Lr@[DL`)DD{ђoc/g-0w4VЫM0q뭷`I$ց_O.4|V= zŪD@"p" =r(oc/g.мPة(E" %&@nK]E"жWa&pI$W@@Y@F@`>rvxpdD@"жضD@"p$^%m$+g'\IWGfI$mImI$W@@Y@F@`>rvxpdD@"жضD@"p$^%m~Vc`ٳg 777t i)..F^^SDZ#e˖a̘1&7XYYw}^^^8p n6 >\K(--m]p;wcԨQ000P?:u&Oq4+XSXX(vYoU---abb]M >G.\(ŋ#::@,_73:tccc$?m}`b{'޽{:ؿ\eee_4HnTJJJ?YAV$,g8n8-"͛'N & 5tӧO?Z]Pa֬YZ` k} M6 <1+++8q_Pf{<==1`x ,>1x`|WzH`uw,l3~9|H_sЮ ;R9]yYQ" M!"c{}QѣG+i2u6 /\du;882%%EDu%S*z(׻wJ2E133ܽ{wrȑ#EY"^zxEy"_}_M1C$_I>HQjzAAHԩH{>Ow^I$&._\mnvUVIW]"肤Y^|M[o%>^eTTT˜|ھ+\|3W^A߾}2aЉj&gΜ YXaB[<}4TΘ1Cӛ6m^v=vKQQ e "|qea͔5*Qŋ;t5kր8!TNc >.vذa( qc[DW.$-[[[a(cdM.(//WY¿lֲ09l޼Y]vU& e!mIDk GP 󓒒jk> lĀ8-tH;/,ȉeffj{ev?Wq6_E[1 /+"Z/\Rb?ZF4AܐTxgwupS5m B*޶m-Z$DFFO?O5I&՚[e)IJҍkmh2Vx ZgB,V4&]g_j|| -_8ɤ͚"666B~E*w(E"`?#Ǿk7_ԩSb<زejRrtTH@o.Nd>u[SɼARغٳguJs(5pΝA{xxy6/QiE|Q_e_JZ"ה&'@fjY%';,,l_l3۳OkС',_N8!D@R %KK Ԫo>lj\߂TիW ͏9*ZtxW5g~8[[3 3)s]֐Yd@KDoǮ YOdL$x Evaz'S9qY2e t"Ϡ2N 𲏰0* 55EUVe94 f͙E,!Z / b;Fx =zw![e 3d" K9ٯKkHZ"P(K8~\fwy|DLβQL?o344Uvp2p$Mc_X'P{l@6؄ ֮뭷 ao0E%]G~[@x# G-@l>2d eرصkLMMՓ8o= TV\K"`6k|\+iWJJDVBT8o0 q4 d.abkpXah,/-uujrm[ k24+oyN T?/%C]|VO2խ\vMHDSE+[_>Kml>:M-Qf|ו%$",&p K$낀$T" h Hl GAA" .H.N%$p$낀$T" h Hl GAA" .H.N%$p$낀$T" h Hl GAA" .H.N%$p$낀OHH$m  1lK@ɹH$}6ic*G*41PٜD@"zzD@"Hlb@es@A@`9Vr@# I$IXɑJ$M$&T6'$c%G*41PٜD@"zzD@"Hlb@es@A@`9Vr@# I$IXiqq1ŧVL2믿"::Ypԩ000# w233+>J:_Lva%ص*ʼn<wD /PLIIe.]0z[jUZvǏuI $<_CCy2gexqrrRӖ/_kcȑ,>+~EQ"__MV*/\ ʐDM/((i:ui/7U-̥{Db,Eov=UO$]U"ҦM @VQ7|S[o{WI5Ŝ|ھ+UxxxM3ɚ_|!ʱv&@':N> "Zmp>Xc-OuaӦMbH m^z%#<&֘6nX;j 2D YbEpH=|Yb&u!#eښvDzf(8o]Nc >֞b%K.1㪸0ω{ 7/’Pʰ&H]p L2,l"cL` uIc)mmݺUl>em& "VO>'NHYTea3?&&FamIy\`bɉl6IC wQr$&&.зo_AhP+Wf NE:)ij!h B]wݥ*Niru/\顡?GaҤIlD)Zɦ*Ŀ)Bf٠_Y*,JvC?_"/קݖ'x?!!B+TʲV&?_2i樈Ў|AľJ^#E"p5009C9!nxOp>$%z/$~'pwHDFFB!ZI`CuYւ͜9sDtI>`nT=w_XX[Wia>S 8ʿ}v=ZM .kI~8W^yO0&T4tP8qD6dRڵhwB~9}O|)/'~%LxXdpȚo>.65ݲeU7 LW^-4?N0ky|Q`a5k~8[[3 x_._$Xd@C`[`95?e|ͪ2ik J석,lO,6XaEĎ֗D~Em=zTnb^DDXwdfΜ)_ &Q(Z2U& ̘)B\K_3fXc~}cϣCebaMM4G 1>P 9ұcGdg>Dㄢbq;5yiD@# !&x^a5xВ DOvrr - IDAT2):<&?^nGַdry6v%`ֈM<>xq!&[qP[ |iെ>+=ൈ,uUԮ~[ ) չ YSoر7ƒd}x/֞K"P|>G˸ xM*tM1!*\,-{ɈoeOD}Dzl( -m21rw]9 T\SFZhš,`]>Lv+ֺ4@KD-&O.4|V=ފE[DKnTdMD@"<Hl\e@+@@`+8Hr@ 76}x3%٪D@"p##ҋ w#c*.rax;jNAO4BU܂US/H tz+m^hniMO/ӧ=YF" \W∫-4h4Y)D"PPX *sKYNҫQYH" \L-^/l\竟 WD@" pɉqNo465;BNw$E" X1;}8\<\*j!q $O0׷/YN" 4);v$R0>i0#!׮=]GO-˕挞=:kj H́F맓N`23qUS4i8p8V3!8Mszz&l1ѼG+w<hま},e8|svuu2).Ύ qǠ^p /o])W[">14**+pE8;9`Aj{8u:4o[[kxy(TwvFRR=ܽڎܐ4'Wf/HKHU[LIM}A:rZƖO"bpYXQ_;V&516ٹeB7B4.DFc҄׷(wcbX{eniq4͉rSS$V~Dt>oO5&SOh& Xr8: I?9?NC7浇 $G!-Vfa>S&NcEO i& %o"0PdDH W%U'$(ǔo4,\O0\iNJ &^ietVi&`<|r׭|w#T8^gsգ ~=^z ߺ} ?wU,#r༒ o1QޟksiP nC`;A0/*:v6Z4P7&aҚ|og}dAGE B, Ycyc9=)S/0~` "fc|r]7qnwaa.;~ȰTDhF d)ZYp&s쟍u"?i2Ν¨k5OyH!D@5}+.q9LG""/ŤE0XPHoȗo;~@{;aR27֑iddjL.bȠ^dRjIxO6ݷWWA`efhD4iZ`e9!}D&tJZn:). fxŇ/,A@䓨h:6l6kwhI+Q{u a+ DK"\SdF{[U{`?7?,V_6xKAޱRNUiyjfa,~7!_[căNx>h,Y}ֿ_w="ظDgᆪX|-5H[3ĝY_\ ~uv{Nv\|2TXlu5Sa8; mt~ P{~ZtD9tñau=F Wӈܑ4הCȩX,, ¨2j , c&1eM? Æmi?+0i9;ۋݘ$%A&qė;Y<XEi[Ds>c@:C&%}m9Oڲ7bSc9h&E"М4?S>7/drwH%fyeaUw,w:$M&WMiL=Ea .ȉP ܗL[?peqEL9 W6G#L-?t'(fJM9>4R²t j)>ࠎux2c{\"[.O>~{:lI{y $m4у4@ =p)[)-|f?MXt  Gr?vWSG, iA父@s"lE75vTcΣw">CW"o-8r,$̱gsطDSL҆wÆf"/{2I&mVPT;Hj&rDg |(`KM97x)I5&w*֖.7q>A֮&K;ENŀp)=kyi4sP%[iVC8iuL+,*/@#8Vkx rADvn$2> 6DËKD^cYf/k[L{x=36T8w^\T)~q_1,:/-EUSp\5~Ѡ4#XoP+{R^{=3KŁL@ZXէt'sh$GBK)򙤶Ib6}H3e;3qw ML84$" %XcR7.A`G\ҩn8Xċ}>uVX7SDӟ|\eܒEplj&0#U?񭊼41e0֖oGHf0'L$__YBɷk:Y oP<}hEˡ*ў"u?UAzPT}dyMN jc|ƴԃ?LZ ЗkSzbq/ k>enoO2ݼx͜ A6}/7r,)lNQB21ZaB.!Hg~\T̃]XXkiUQrMMZN%|[qDUW-cȖb JN]A4smVU=kz%(l>@!' } Ҫ8lfb[RZKf):f@&AXW{EUʻyY'o  ijk"F蕄X҈~6eD@_Z ;`Y PIw|k]` zP;|tC"hmHlmG:#(ρLȜLj R$I]1s0+FjYuܒ2D@"p! F;r$@ !hHюD@"" PBnH$7o#.+\2"z.]A. _D@" hN I#c[X |ϸE%EHI:A E" 4|yn^=#qqHf C(+)FZR,\<ѧWt*+H$&@2uI$ý] MjZP:4H]+%/%>]cj@-w%k?mޣ/] +&Ț_jb {FkWK$k@Y Rz`Nf*<lR#D@"/{"7Sj}E%Ņ">?)D" PG"@^@^~BD@"R` LaG$i9>D@"P$61Y^" h3Hl3RND" h(,/$CycO)YNjǯk6f!{>t'I=+X=tGDWSSq˓?'~]!";%=qi5&F`_?^uXp!bccxkFBCO;rdD@uOLjC/ޣD$?u^JC#aan*:vVYY?\cB%xյʱ`8|u{'/uo}jEa䀎}r_5X.Ƥ ڷ=}=8D3W>Y!}ace?7C\R&0瞑6Z_ |xj*!3v;^Q;;:> o=5M;ڇd8;Zc@<@3<|ӿp$CaPI]j~~~rY5&3⋸{ b/1tP>K49Fׯ_ &L&%K`̙>|PكcB!C>xdd$VX={cӦM`;x ' ?Hg'-_LL nv؆!!!LӦMTWg0w8 BaQ)yNnpw}ɖnζ0560"$gk;|ect}3"/O]G H - ^/Cjm,]{b5|\I:*X?o-Fx {kR yw۵دشV7mX?K{pt4/$l; 3 &!]??RqJSJzc3CD~@mmmY$5&ج9s?S套^b""mܹkUVVV_h^}eeeGExx8>Dcǎ -^@&KoVW_}%.7nD@@ޞz)֭iL[l<}D9$ӟB̋5B)WIiuGQnH BE*, (xDA]kbEAzwH@H{f6lI癝wv=mf]kVCרN8;mXӥ #ww>V-|F3^!?[]kקq@{QԾ:S@h/A}4w^K:4CګsJS]J$Z0s4 OwWi kd(dltP%uO'Ap(_z#P-0~ s҈Amܙ>V>v6v)( [Hn.ȷrAWh\b1KJ yɴnݚ}Ö-[xbԶm[ּ]v|&93fP hĉSSNe'???>4k֌^y6C>,)ʦM͛ "O<۸q#uFDDVmOl)NmҺ.6LmS9EU(V̴nV._b3Rk2M4cY@퐏 l\]i>NtRiUmA դvu_ބ1el\~MnT?0[7ANFN(brf >A=;4,0&{s릌)f 9Se= FhfTTEm(C/My^7ЍmѠ2M&o>&/\kP[ -P\]]BM?Y>P/sμ> Q&00AfSȐ!CL X|XK1?/#¾= b+Xҟ(fds+.4VJ1<_yjLH֤w k~9-ǔim;(Ki3 `=_ 1eLv VP&ʍhc7k>o=K\b *0 7l{v}}u(Mt7\D' Qg}i(]={`k0APAU&Lg~\@}hnm_֦#A 5nX;"HqA4acˍysWFLO7.Mԯb΁uӾ6vlw^WnPATӝR2ABc oC]m Y YŁ[ӈ~-}ZFQ[f Mu0>P>l߾8rH&L4]v_ %Kp[ ?-o֬Y<&D{eAȍr֯_j\<,_A=һScr IDAT=3VjWc&Y6xq~*mv P\ LԀm`A2EZ"D#&8@ }3eLЂab>!"f5Q!#?p?"i~p9YSӆes44[냳S#(LO 6)Sp@~XM^kh &xETl>wtt`yG} ]m#ʌ#tA"#pQ^I}6)^q`H019Ui$Y%TqwѼەˏs Q>n iCtHҕ|HUw{Qmhvl"j1MܩҁC-*o `=IoΘ|iD7aZ~mF===IscX5 WM.]Dt89lXf "ҳgOkȲm E |xƧuPjUNݻ7-ZT„ y՗i8W^ 8ai}*Ir'_uC"e`U}61:~.T=R ~[Z{q[#  cruR~ %h)Fzyۚ0A!^zy2K 3=C ~FF4,riKX$\7?)t5U` _/ufjrh?k?"H.hܶSqc6M`$5A@,BSZR`)X2TA@,F A#` WENP-AQ=`INi ӨA^Dg#FgPcړ2 PUeMQ~ZB Q\`y;:r vEru eOy_FgޭWXr\{ pe  e2 ՍG  PRbva A*cŸPINkաǎPxD$l\F۴I;0)'@qwQ # ?ȨBfTVP[{ˑz[2UDk Hel?ӎ(ߗ)##?F76iiiUjnG;voϞsN6 `q cIS'?yOHJ 6S@jGEi_~w9M='OOJk?w7TM-oϹ99)X`pH(P;uRvG\֩A3PeUZNdT QWZթ^Tb}9hB;w}<uҖʗ/Ξѡ'FX*Kݺ!W۰i7c~N)zDjؠ65mR_8E׶- fnA@䠴5MNjLqԮT- UHiYڄgڍhEyڗCp I!=12ԸC]]:DF$F?;Hׅu~%*W֛_v(lפQLN#J@ X/z~SxA66Ǵ~ӧWGf s X8+sﺺaV'Ɋ4ЇϿF$+lz0Y3y>*Tj^^̈A4p6cwSikati:~HgWʁ/xD&pQ웛{>ix4_LpE@WYFEB% 0H QccyBZBhݥ0ݝL51 P&#?HY*ꛥ޺PQt4\(#Ck SP%gQEhMNSa"7r-16iC(4NZνGh˶ 4~wR:?o|71UR5)-6|zI[󘛛݉VQnȍ}щ0-U)3UqA雥BJ)rR-(MWbr/x\M%vU*6uhߒӌUe~.c-=P'ֲǔR-{URe)I2*VPU:SK7wlRO("m"3ur@~H֝UFSL@0W1k$3P!)'-hD7njQL廒/|s עyz_Eӕ \/0(2LI7!/WGqN:E>]Ѵh֐[*!7b[*rIYD JH]cpud^g<-C^)\s@vQ%)U=6k6tK.nDwVk*LuC\U@W+"_]UfGՕvBw I>ؤ.oODH!T- A7#cXz5T$+e<y{2a~qc~"AnsW^zF: +O*R8P>?"ZE($􆚗eujBNjSBոsN2OMUc Qs TTwHNjZ;(<͊껂`Ӿ/ YQx9WFO&;aqDw 2'edjF/M!Iџ9~7Ill<F]Fr"ԃ9 FE/)1;·HtY 3D5ȑ"OEYʅK@3͚" _X0gIA۟z]סsAG89#׶UNOP2whZ ۯ˕-CC6#xzDcqv5f1C #4k}s`Diߚ7umw@D=T ޽:=;3 \TJ[͉Zϒ!A>BRLuU W7ªz!dRk[ lќ_WUhrB+"0:r"®eI.z}$`"PM 9 ZvA};[Pؕ%hƌhv= 5Wǘ 6A^ZԤt+rv! 0.6*TUV&NA@0(fU(>V 5R9 %p4@d#F R]ʫh/&,"@IE>Ad# 0U1JA@@*&#F"B9Ө'G0 xO2);335D5=lWWA{MNU9 $ cH oRӨ.\>/-tg*[2ը_SN_ %[_VFe$P%d?M?rWjJ~|2\z!SLo>fbNA@ȋl/ Rd+/2U +5^})vv̼_{#ٳH4&@;YJ<SZCNx ڒ됞U:5Ilm{Ol[R>͇JOBvFI}4Ovm XcZJ-s"FΊ,+,8)[1lt6?MaI\WTgL2c(+=˒2mDي(99¾FD)m4svܵeۡ۷ٳʹ{*WLM4*l^Rr>@AGhweewjU e(D^;_#=qQܕ=_@X[.1^ؠӇ[7nCdC CC3$"ڳN)Kjww ߀X 3y>s388,?vСCK.?i$JOrS",@ٓÍS(+[H=ʑ7Gu賹}(bA#[FE}h$gH<ضb8Kj ~@ett4?nݺE=o8vL)˕E@wfPTjݴ&cDY8&~AW#[czKE0\Feza: @<$=ֆDt.]J7n`\NhԸqc\o޼I.'B"3E4vXׯLABB_[bŊ܎|hLmAfFnuO_9haD4my<8"k}[U5D˥eJZJAnASDŽe5"BKj[ #mZJJ>sdrss ;wҶmZѣGztU&;W[j}W4~B1URm锔Dz͛SSהy*}WqG5s?Ū+OKtR5]jTv'+QO\PrԢ mJ+C&hVY:/bI TTTtI~:ժɭ_[~7Wvm:qEFFҘ1c8)A hȨaԪU+*^sii:SL)[TrGAG22hO~YRc[@ke Uyw[әv_|39VȧlAmuA͋b.kK52*T6aZv-uؑG*UҮ&mܸ?ի'ԗϿ1rH.ϟO6l`m1 u޽ܧ)e#ȯ"1 ғPXT*% n ݏ:D.κs ˦'g/ݳ&^"DYS$CiΩN3fҞ$ZEIMP>>\\\XYK/Q\\+bA~'ٳ'/ *MõB ֟5L|ԭ[7.%5k)edCYiMex*puvTń.IR1z@!Fy$*C~Ȧ,1UtarΪ-gENPþơ]nX}}}yX0oar 5A m> 0Ҽyۛ;vcѢZۆkD|q˱cT5h ܆`lJq_# d#?վ 4)aC٩hFc@ؿ:DOj'Q1s(4Hyш=5RRbu֬]agd ;ͧ'0!1yduQ=z4wN۷ouћoI5#Gps؆L:}5:+Vh#D²G/\4S+44N>0@B́MRhpΉƨukӀDK%orNo=ĖA{C:(h_^s"z4L e+rD;VsV%R,i[ \h[(̙3 Ns3 IDAT ҬY3~"8De{ DOO>yBkۼy3'2#eZj\2e ͘1/&$P5Lጌ ~,ڥ)e` hvQQe ZzVVz i켐EfR}'z4}TLn*P%@^q$t])f  |m }C_\1-Y%5@S@{#qg ouA5#Wq3Moaq oeZG&dSZݡj\8J gT35 C!*JR*r'"]_qp x),>RTقZ=Sjud}!sަiѦ .ZrY3(O<+%hL PJP4Jɐ &G5S7?Zf'@Fh- E#鬢h,J<(z*Y()%|teM MC1-s_"ТVYJ:*zzә(j4PrcϋkLKU%dF=T)<,TZz+2]zyW7HWc/0AÇeKs, (J-[G-ɷL?g9!QԸBG  ȷ+98r$" &pI*2&A@ B6Y:`I*2&A@ B6Y:`I*2&A@ B6Y:`I*2&A@ F2" KM^K"c61KQ Ҥ KuQ Ҥ KuQ Ҥ KuQ Ҥ KuQ Ҥ KuQ Ҥ KuQ Ҥ pbcc)::oTB ;;RR)3SAH?XV'Xj׮mHU͌ ںu+/ M6lH^^^4sLMօuӧO8 sٲegJ(99Jy`3K1sZX3o{{/vusڲIw_k׮… mFFդƤ4|2޽:t2i@ݻw:֭޽{64-,&w ݶ[T}{Yxsw2n CZZ\Oѩ 7hɧQOKKp> >STF [ȪxUڶm  ~l4w~z& *جAٳg?wwl|nMɷw7߬QZYzyN-[FM?3 Z<<}f&.]c8~:p;V;M}}}mfpͩVZ ͛7矧ƍSPP=裴f͚y3*׸Vn:FZA}E/;}h݌=G.G8>q>y*R[_{i_ i3+.d`>zqE&'B6>C/LY@=MCoe%%ޣZ;qWW>XL#&~O|囓 {4A#Akjoybcbb!&6l`G!#۷oʎ;ٙ&O3w\9::RVVY3rrr"h-Z1تU諯s[6mШ@xz&ӧO9 @>رc4b}3|2eίAXXL4AK.+ݳg/pEիO\&= |:eC,GuiS^z;h,;p zedO:z*zbh+zLh)%Ѱ)C6) LU*ЙKayjߢM}DH7cUlNOv߼E W#$g'Guޝ]A]< YK7u;N}!5jQQQVcʛ +TdY7%V#@?x`3 7gϞYB0ayh0z1Hücʐ!Cm۶]׿?eHEl]´ŏ"|Fp\rDž@gf.+)hz ! VZЧ~Jpt|`x!Wk~XoaUX ,0PzJTIO-b /OI4˿|rJ"&Ŕ'ս@z kgKvwaB:>Xވhe\2FP Sڼ}\crJ:uh؝dN}[.#ݥs:i^?P<@3n"c+b7ŋy>sކFA}-\o\4H䧟~",%f͚"mtLhr4 WWWv~M"rqq3,_64_M:wm2!Mfa/6~|AӆndAP&OC::㼺ԢauzԦyME~v6RJ>Գ}=#SuDv5nnm듿oY:4ò절zSӼa5>`:!^ ߿S`Z) P*25y\`|Ӛ5brT § _ԩS|_ $0t';( X~1$<_"&)Ls{y}Hb4iBfi˨ɩS\ePRhu >MUa|M= Lcv Wi`2ZH6jEj\ ͞2'uy]'WћSfOt&A~f5+SAT:׆g6j r@7W ْ0Yzog֭ &GiOOGU$U>7j3XNQ`5Mrvbv0hƠZ8`QD |ݔFWb8g7Jixm&X@4opPn4y|?~H:~.Mh M#-U6phk?i硋 ~jWit0 cT~Fu ':A\atxq ?h9b-O 믿}Аa̘1#MҲeK^CsD LE9hfZӦM3<]6_nBM64|֊Uk נA)b!||s3R jڱ}VR&N}/~'~t aqjVdkǁ 엃/hsj*2BD}Vn:~ Z4>=$&rIݪqDAp$Mu?0} >kQ4ǍS&6fҲޣ/1}ڼ Wq|0A@~H6/ 4 M(D:611L_D{s;wNd\ap# rLo$:] A!{`~[nRQq&$#xA;~\֫W/mXw7T7BW}P$ϲ7~df*r\ƽu1PvǁW\Nhݘ8{=PMMꗟ鮟Vg )IjTfbke="e2b&x{ Œ%N|nj*ݗUsW~}|,n <|pZ[ >"> X/4i ňލ;hq`f  q^>Q$‡v2ՙ/+Ǭ\ cRƅjeᘷժK^y184Tĸ_90c^W)-L.9`71R\zh޼ytm|24%)hXߴn:m( RI | #G)WNq4` FܪU+6]A~kfscCÞ4i޾}Z nݺ|lц1_h3fиqx^+W~A_Δ -B0-)+"`*d؂۾T~}:x Rhh 7Fq!F+|B OwBQ(@qm3nbMQJM4sٓ5'lC[p#ōӰ~/^?qFҥ kƱ zj&L}#6̙BK,?#ڛ#4HTD$6'@ dw9 X\9 "4VPt .dZȠ( Ӭjժl~!5cڀnv'gJd&ڼsVװ/F?a/"ôihԨQ|~iM^CF p,]f04˗?o߾WĴ/ia9$An6ݫp@Y3J+nZ9AК@B6lvJFpTA{fWC~Do?a0EK#`00!0g6m_?g- fp~$}P<(Ȩet(4jԈ}@0d *!SN5=)S $y}hRTlYQkQpI! 6hЀ*VOH15"EP:Da!I O[}OD@̌4*#`$CH&bIO(/W@[IcEe\w.D/blS\+FQ`mZ4ZSAAڵkw8!h9m|FxAYϜD˥͋hW}d/)һwo~BJ*oРA0e#GdN:믳֮O?S iig7H@Cr5kT-E$ . gf+"@iEX 9e]L &:%Q)G p?!`7~Y*%!y]dT `mt!%!y]dT `mt!%!y]dT `mt!%!y]dT `mt!%!y]dT `mt!%!y]dT `mt!%!y]dT `mt!%h9 !`4MVJ 0Va~Hz;# h ҳ !@;_^쇀AH `?퇽,vF@@! h?gA@3Bvҽ !@a/= A~2sxm:{,]v*WLM4˛ӔAXEg. IDATΦ?VJڵCR.]xҤInأz,Tzu1b]xѢB{[nÇ[+4mJʾZf5|7 yG/I5,7A}6o!Qo[WP'HIJ#ߣhaW}Z4\il|7=?yeE hYU~i:~6zo8iѳЅ+6#ۂE8BqnTlY> $M.\ȚM*Um۶4qDNӪUرcܹs4fݻ7}|GL}+WBn޼I?<5nܘG5k`'z۷o:uDh8qqqa&|о[jOW߻w/׏MrQhΜ9Q;ڵk؅ 駟fVuDL]N>eܩr%;C3[҄T0nAi陴eo{uH kN?) F-zO3רF`Ejް\5_/VlBA $8}tJJJ^zQͩ~?oIfc0hMjƍKW^uQ`` t5jԈԩC &'䧟~ 0 hтbbb<1 -[PTT mddd,]34>@_5kj ] 欙0]ԡB@ U!˗/\ bAk^#232r]ƌQcir|ky)RR%n ?u)ڵ+?s om[Aɟ~{;IiY֥\gJq/XB Y߯ԢZ9U2˃|yY w ߟVXMȇ9 A&(AMv\\Ğyއ1Di<oߞbBZjԣGE_Ga;wr;ɓ' F@fXX4jq|!>p"ݲ7۩e4|`BAXiʔ)<ƿWs ؀7>|e5lؐϟ?Ec& sqm_ _R8@HUA405~P@~1-`&"0Ŧwqq}[΃{ۅ[U@fqQ#åGڟFlz UԻ)LʜQ+Կ[3pw-9' #@/$h" A'i-[\  S]!ziԄRm4Fh(& "!(A >ֵ6r !>޶m xs@4ۚ?yѣ㿡g.uh~VvԐLto!oBOz6^_t.ޗ8:x2;̳7cZ.Fz3b7+W؜$@+Hp3@# *k10YiTgN=/ Qb9"HFP ~SS2,8jW%Dg-`˝AYs;-A@lhvӔA@0!@󱓚 P,P/# h>vRSJ9BA|&@ߝAUF3'XwҺ @ >!Gf$@M0 ՃPڌݳPcړ2 PU7# Лb()-5*A@I)Ӹ7EnNǜOA@Bru׽mJF )K7ŵ)A@9/^P*c;7]ݨ?<~Б %(fǏ&߀2V 䴆`H@P:qGDRC>v(A@:r"ȯ*4>2uXս[+=-Ui)Tb%@GKDk r9-)κ(b*aw4IE*RZj2$ v djEd-U@aJO\#fX|ofZTzq=HzWBq"I=A@(K(s49'!R e `.B"'A# X/L@E@\䤞 z/ JU _D+XBB&c'A#?@BIENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility1.png0100644 0000000 0000000 00000127472 12564151525 023572 0ustar000000000 0000000 PNG  IHDRpt iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx eUyw =@؀C3(QLJqbbt%&.&Y11QoR4p!qȌ"2M7yO[ݯw>n5{ֺԽ}:[)h G㞆ES5%Y@SLC}*GX_jS97ŢOOP)}z?\ fYA;1:f#0P " " " "DM)e.~3si," " " ۃLf.Cf%k +̾)+_)ycGkĪϮϹQ3M&Jb";i3N<-_ܟ-6osK5yjE@D@D@D`\\Ά#;g\q;l4_v?Mv E@D@D@D`{hyM.(6Cahv?F\ӮVD@D@D@vTMB/6?>ݏ59wQ$ڊ&1ִ1}1։|\Ĵ!6w0?+)?{?G??+q§5[*۱s"ok3־-58f֎s}l2{GSDD4g z/~z &G.X~v~V(!ƲϖtC{k;svl(Ύg~l/7-:\Q" " " "З~Mئq>jc>[WpEyQL䃝>lȞ=Gޏ>ޏ<}3.j}Gyx?f\x?h~̸~qQ8ʣ1qGcE(vnjZQ>ޏ>ޏ<}3.j}Gyx?f\x?h~̸~qQ8ʣ1`<;-8-A Ŀ Ѐ`ƑvbyocB>8l,'[>GzlsO[;m-y{{4}Z}\c>}>}E<;a)KS˭_S?%ϱrbs6 Xllϱ/O *ggc_@Ufc16cZ 1-^hZ?586'GG9֮lY,g1v XNQ?/bf;?cs?͆9g"pPCM96OR8f¢qE?79n[)Ju|v:NVC}Ӎ^?z5ck6M8kg?F6kG?{='Ot>hc tcn~s0ױ>K_cc?߲)鋟os珞?ѭp_?~UMxzo}հ>vkŽGÏ'=#?߭vW`Zs>G3B-'dR,)}|ɧvZVD@D@D@D"r6mJ>8T{#dR`V1}_˖H}@ ^hz7lyՊ8JL_#gխ[@h2sc:]' ǶE?7ݷ6+B1um׫qtw=tUWW[4{QUis/+A~+Ov:ZCƴe>8hg?ZGOA{p>s1>~NotE HO|saʴud_MrK 3с9t'%|q:C'?+ߨ*Kw~ ~1Վ;9!:Oo9-_<>iK{,mHtw"1sŊ]vVw_?wo|߭_ ;F6hǛ7oFT/a *bҖn-S =.J߯ vL{8}wܞ~pȢt1{K V飯M GH9hnZ6g+ؽWpN\^؄ęN\NP\kXlϴ`걠ťխ:DFӟt}bKU۫{ҋ^zW$s1kb poLπ~;:IO|+$ߨ_&Wn9ӟ:4jo j>6uԊ2(1 B 98265!ݮ³iF<#}ߎ?W$kG&rRuWW^YQU^}uY`[2<&!gk^zWҞS~i4oiΒ4KݍMUѴtt7'׆sZ*}6lL#k,6m\嬾6DYTլCmKI'~w B|z{[YA;V}Xiwפ,-X$}A%<Ɵ[-Xy*{mst;\ZZ4^-[TVO-`]6gmZ~^iޕcah^?^9VѭnZMc 榑j>Xsw㜘g3!8!0)>!2qNpX}-}Mz׻>O}C=T-dLÉqٛTGF1<,rua]1篫~.5ة @PBK0}BVu'%Hӆ8 ~?9' tѲoChoj9cl|,͛3W_Ao[0?tudu0?ޑMeyq)#gӼFO-Ns3c g6V\JH.l4'&D%''(oFxb\Ӝ!;#+l y6>kFbpWp9볦/yK/ (/~Qω<\q?N5pӞtGe/Kԧ_p6_!|_>__YW`,ruqx*.5r-" ;5( Nh18Sڸ)kՋ@p"lcv6*1䎹եܝTnՇq~e[7humΚ5imu`n!y7,3~DK+ѹxA]P}4 ύՇ3x`X匛VL A>D,|| X gg` &ok}q0Ǐ^l~J֏4aG N 4lhy>Xڙ.~aPHK 6[Y}.Fi1Sɹitw%=scw0=iޜJtVӫinus,VLgeI[obפ7Ή3%=dkk1bӶL\oOhk (.`+>{4iŷGPjدG'?=;.?)O 8T9p!V߸0xƥyg9cآ.5b." ;=)+l6 K8fKVH1bxǣ)1x2 9FA[ѷ-gϽNzZz+Oc]->qګKwX p})U}ӟ.EDz'J_{G:{%:Vg&FGWV/\^ŬܯTsN\͋F zԷ-bpVoCm [?|/'Yľgs>-/yOzғ{7񝸏yclX^(;SDŽH,&^wuG'\pcLgJ |eD˯4壆mꋀpV}fs˄qh;g<1)`͏κMC _ntiuY¹sV³{D> 9M>T-q/KW]iK? YR銫oKW_s{ؗUsN] ?x#{33-D 6qKA$Pvj:8S'pBz_gEюC!_ÄO+}u'|>0)oo֟LJ3>%x=9-dn}Ԁy(|߉8'{Squ{]-tz1rP+|KkDtt16 Ўȁͷ[$m  ~r[AU\ ?,K\]=nNKKcT ;'s>+MGz{L|`J7^W'+xtx3DƉg} :q_@b7"h#pP:779?^+:|p&~f%g1q2# 9\>ǚ \Fq?3JCQ >Mg?>jk}ԇZqV|gU__׏kAd}k!<ͷi888f߶^ݶ6Ai}e<%o+?U5x'[\8\]ƪ)҂͈G'{֮@ㄕsh~w7ޔv[R<]~py5QZrEw<2.gRmL.o>5!IUeTHx@H?6I(:sm>9%)|O?`;1k; sX)49FKqJ}.>bpliOǙ|wC3q d>M9?x s|Nsb^\\ O| Z(|" yM&9gϷ?>ƏqRCn.ߧܜp@hOEH"~Wz0c'i'6"0a[q-0M,Ɠg@00,!D>q,O9ml̉5Q xp g[pplk {/MfG=vwTvKvBx@AO&j/L []!G6[*?|1-,*7پfr$ Ġ}ӟ/" " " "Zj*^j:g40|Øc(01f1Z,4"1/l c£E@D@D@D@J@CQGye^EcI_}`sxQ0ÏCD@D@D@D [8 ƈc#ODD˿ɣݴ}\Hڹ.Zb" " " " RgQka1gǘGԇ3l 愀[aAކ1}嘀\E@D@D@D@bSPyXlyϖcjYPIr hM {adBK}Oj)ڭV6rc<[џbf4IL5l糅b~[,,vc\" " " " >7:=0 pp#hqMKA 6}ց}LͤZ IDAT@|Z sG9a$(R5x梵vƳӴ|" " " " SB[&kCD@D@D@DQCcAwq -د1֞s1V 8&mv_ cLjXD@D@D@D O:ZZvd>/;+쌱^>٢socr"6Y{n D@D@D@D@-u63q6c sF5(49%l}eZfOlm4mhsUxhQHƱmZ>nm" " " " "}nn2-8fh϶}Y31fE*}>@ 6sVD@D@D@D@rz7֣omFE`h1k>6s*G(brc(>i6Gшa7ץ]tVKQ[ц/@I?suFc[r`FM[V햴qЦn\WN36MKIsƛ4^n&r2ގ"36"(fXaa󣂇|-i՚6ʤCD@D@D@1Й-M6/iXⳫb< c|;R'}'i:pcȳEbg˹g:|ps 6IuSX24X%mon;CYk'Bsmڶ6wA u]6eXBv;57ǘ-.Z~{xO:ϣuYSK{.xY!S^5i,^cheuMffN\jǙνv_>f<&~OSWtx}gm~Q<9Id DY?̍rfdxOҹCΨ&%u t?L}~j0khڙqk;,i Q.9Q@4FQ7ՇAX[۸h ." " " "0E OGڣzEqIok*28'&cԊLhN^1GX_f~W+*g6/E@D@D@D@cj-/oc ۮ39l1Mfƨ/" " " "PN _9;mDΖKCD⭰>pDڹRF_v3,~C_M(QD@D@D@D6MTTx"6s @1]Yn\ހTxkGm#q4/*h/hnko lvcʼ/@Qlm,oď1݀d Ц~ƵS|_[oďmNԷ֧tM)Ogv4Of6m9XD@D@D@D`8vivec}E.g%s(FD@D@D@D;&}vv괦_"qކBe7"@VWy,VYEm }9}aUx9-& l"E@D@D@D@ D+g|viH_gsHY;W[xF"c %t"`fJbry O_D&1~5(&Pc6-V O[a[_SsDy>NcfE]e-[cR{m0nBe: q-߹-%1\l" " " " _>ޏ۸v+NI?xΖ{̦B ?g @ڎ:ͮcgEXϧdňt'ФNc]' h8[7)@~~"cVo"vWQSYGs|[a ϨH[PԏrQi݌D@D@D@D@BuU|\4ʏ{(rbmAolN#H?/kVz%X8kl|Q+" " " "0AM;yxsc}9g]g-*"P(sFd*/|/g/l p"6ASDv@9H촕^9[. 鋷l" " " " !/kJ9}a HDx} }7DN,7QIL.o6>0>Em~^E{l:TP1Y0m.Vz3Z||" " " " OY&U^Vюn1/Vl?*y_v<0/";RY2߈c͟&" " " "0AM?yk3߈ۜo7O}SN1>li.l*/svp4/>]x (YE|KP@wMiM16ExC~Ӝ7l+2l.³i*Vܦh'@}EZ?5~4縵E(ۜ(@D@D@D@D O^WEEH( +-6.D1L(jg2^_yfYcEƔEx6M"ۊ~4|" " " " H6ۏ栝QxӺHipQ8aڂ|Eٜ(Fv)~=_Oг-Kz[S6q96VD@D@D@D`@v82r6 \Q9[TEP|ٍ(" " " "U_VkQxC_F_vDam6g6F}ri+ r]"o\E@D@D@D@C _Εr6zdzoB" " " " XYn\ހmѶ }c@ D@D@D@D@ *8rlg'EX;הoQXD@D@D@DYQWA{YE;EvX{kTx^`[̷PE~E@D@D@D@8|gwnKg~#~9l?7.?'66 "~#~lsݜϷ>E@D@D@D@hO9x8>s2(Pn#}" " " " !ФN++w9+di/C1" " " "  4/ﳳS5~&n*oMs'" " " "PF+߬>k}Ș[ϦXd[q>sOD@D@D@DUi`f3v5, *\ls*iZidE@D@D@D`''oDvza||۷9֮@@`G:X O[bm,㬍sm1F6iqdl֟wr8oCQD@D@D@D <֢6*<Ém6Nm" " " " "V>{Al O4D/ Kﳹꋀ @+ln-<#1ބE@D@D@D@:kD%1L/m?@(Uq^+ J-N`v)9<@v얭~ o7fQ̋ xqN8ܖ ϒFs ~n\~.N6 m/m\;X6E}9?/" lْC=#-Y$ۺukիҥKnFGy.dzjժ}-yiO|b_椝 DGrqCC|nc&}gSQocvl7\sMg>8׽.+P>:E/Z]\N7be˖+W:ʺۿo=!n!}K_yg=YNik!¿/뮻.mذar~ztBgӦM??ҢEX8= Oߔ7ߜ{VvM17;ͷ~|Q% 1o9#ۍޚ~;nwt͛7~W]uUBM~k=mAu…mݏpi~G qmO˞{YPӚ5kfύ7Xp)ԿXqAO" C'Ф.Nc]gPl*`aMQ+o~"C.Z?iZvmz<):t+Qtւb"_xp}nKloq_Z9tGg?g/b^_yfYo3B7zX$7e37ʑ]+9s^pub8#t'׮/x Qp_'y̝;כv1.}g@t̓ cƍ~[ctE @}-m`f3ֶϦɢ"mAQ?z6i}D`hg???LOzғKME]p{| ! E-os9'}鵯}dyoVY[?z& .Aߨe+V?}TvO~R}/xA}$Q\6Ł:pR&+_J}%5{__ߟ>6z|5cm3;&Qoxg ,>O}3YxG}~tW?CL nyϛ7o`}?KkS`8~wgqK3s>8iu8e}pl_K9q{?x򕯜<{[ \7~c`Z[ ^WOYL_/b/_}cKG< XG@=`>. Kc9Ff` 9Q"0T:7Y|,| r$}{3L<!x{qϞ=hWg"^~}y{59 6~r%a|J@W/aqa /!P3.gxצnkZGU rkmcչ^{D~ߝ6=!~Yel3] |oO~'?Z|Y`]܎{Sx^@xx Vl!!Jp[~Pqg7Waw3y1_j}ך7=??8Zq/}i}&S|o3Nx+=qf+H8OAۣ__45L2~8Egl bgeW~,6 sru6l+2X+ a3j8|㼵~nš/08Soy- x˿K׿^M@9>O Q~y/? sg=rN%ߙ<_?Oզ_9O"BZ/|ר&E`ڴuҞ[1֗Yg-*"P(sFda,Hp4x/hc >$7J ~\83|@t"P+pD|7pEʀƁ 7%>8ȣ su['ήLfa,pDOCDb83SԂ3tbqUzդD̵k<~jo'@q)L_/x._1Imze%/O嗱1lm3Dam6g6F}U\˾b3fKrq.$?C81j? pvooq'YB090])=C/9ǥsVBbA9Qʄgyωa_p*n7AY%ppǶ] ػޔe}l3}L2"[q>ujNHY;l4|9H_75 =,EWsq IDATD@n u@!?`Gg_kmT3gev_3;`m}7c6_јg`m}O.&`^?_?_^J. غ5("sb~U4GD > @1cH b>.CJ8pYHOo go=ݜ&€pbݶGB8[3L\~pƇpfZsmAv<;r8)s҄O+|0ƸWa-rk: xO)tɍK^Z:}MTnD`*8relg>Y38 F, z"QOgނfFnԍ>zM6gL*Q8H?ኳ2LI<3.WLcӞp/( 0ϲڿʍqg;;'}|)g<ӵpo#+lՅ-`| sSY;Dk_kA ?ֆ~}d<[L i1rxD}O}@lpQSxnSa0YKSO=Ԭ" I\m13] "?'ֵ~l֞Ch؜m% $ffCVa%?/ʈ4駜b<}C|nc&}gSQocv.NY+_c$[ pG/i罧&Z:h_^QElO*Y9~̡].$>].e_TP8[{wG4/lE.³D(6 Xƨ؅ L'>c&BJn ٵ)i"0I+߬>k}LB}:0 DsZ?̍rd(#@}E[?5~4縵E(ۜ(@D@D@D@D O^WEEH(a9Q" " " " S"{=ʟZgO[bm,㬍sm1F6iqdl֟wr8oCQD@D@D@D <֢6*<Ém6Nm" " " " "V>{Al O4D/ Kﳹꋀ @+ln-<#1ބE@D@D@D@:kD%1L/m?@(Uq^+ J-N`v)9<@v얭~ o7fQ̋)YJQ焐>";3%1\l" " " " _>ޏ۸v+NI?xΖ{̦B ?g @ڎ:ͮcgEXϧdňt'ФNc]' h8[7)@~~"cVo"vWQSYGs|[a ϨH[PԏrQi݌D@D@D@D@BuU|\4ʏ{(rbmAolN#H?/kVz%X8kl|Q+" " " "0AM;yxsc}9g]g-*"P(sFd*/|/g/l p"6ASDv@9H촕^9[. 鋷l" " " " !/kJ9}a HDx} }7DN,7QIL.o6Sh>1P" " " " JtblfJbryRi"}kʷq~(i," " " "Ь"ekc_*<{/ۍ~T("" " " " y^Ga_>Ev;³db?v?MD@D@D@D`@~qN}gn?9Qn[" " " "  4駜b<}O\~?T_(>Wch_^Qٕ}P̡٩Ӛbl|QdM7|9(#oO>VdL-Q]gT,8gM'" " " "N*~j0khڙqk;,i Q.9Q@4FQ|V[-m\4͉bd"'#eQ ={]xڢ5kcgmm1jE@D@D@D@&i'O{#c/glEXy e~Η݈" " " " Y]Xe1lmWN&hqvnc('鯜 "gKxڥ!"}VXzU_D@D@D@D`8"e\)gw;lH&(" " " "Љ_^&* f*<}m9 @D@D@D@D@B,XIL.oV*9#" " " "Н@>;;uZS/w,io4|" " " " e6NJ)[%lEg3i~D@D@D@D@ P_EO fmA;9nm%<"mAQ?E6u3 Uq(?pa9Q" " " " S"{=ʟZgocx%r6~-n*h JM;Q1-}1r6^jEXy e~Η݈" " " " Y]Xe1lmWN&hqvnc('鯜 "gKxڥ!"}VXzU_D@D@D@D`8"e\)gw;lH&(" " " "Љ_^&* f*<}m9 @D@D@D@D@B,XIL.oV*9#" " " "Н@>;;uZS/w,io4|" " " " e6NJ)[%lEg3i~D@D@D@D@ P_EO fmA;9nm%<"mAQ?E6u3 Uq(?pa9Q" " " " S"{=ʟZgO[bm,㬍sm1F6iqdl֟wr8oCQD@D@D@D <֢6*<Ém6Nm" " " " "V>{Al O4D/ Kﳹꋀ @+ln-<#1ބE@D@D@D@:kD%1L/m?@(Uq^+ J-N`v)9<@v얭~ o7fQ̋ xqN8ܖ ϒFs ~n\~.N6 m/m\;EFD}9o}ꋀL'Фrq<}ngKsdfSQ~F\E@D@D@D@CIymGfW1Wr3W@",^2bD@D@D@D@h_ggNkE.“4MTOD@D@D@DW^Y?}fX1eDuMSȶ⬟}6/@;(9hg>ǭgT-(G(nF" " " " ~*`>.BG?\NX9l ߷q|6']D@D@D@D`@`GS+u=iTeqNM>ƨ Цb<93WTcm(9_v#2dubZ_>З]g8sbr)"Q_D@D@D@D@rvg/-i[a}6W}sg$"Y<>ޛP@'Vym$&7`Em~(Pb% 16kb%1[ l֎58?G4h_U^V~ݲ1/Vl?*y_v<0/";RY2߈c͟5挍m\am\VNh$@]2M?|)~mE|mc[XԷ`hmhZ24Y3_R@6GҒ:zeHG~/qXsv3+<|[[I˗{lIu[Һ3V@\ǜZ@lIlY6ڋ]' E,K`HgX\4xxKڤy*QD@D@D`pyWdm<-_1P" " " " JtblfJbryRi"}kʷq~( }|i%S T;GrIvMlM16ExŦ˘{~% ox #&" " " 3"oO> mFuM Hn ~  hҸhE@D@D@D`l?vsKxFEڂ~mNfJFG}4^³bD@D@D@H?y{|\T2Kc9%-_-P &}6: _"k}mF@e܀sl31;\{M75|i͚5K/MW\qEڸqcz^W/} _H6D@D@D@vW^l?vsKxFEڂ~mNff+nKׯO]vYo믿>}_N?яҜ9s ^4wtEVWD@D@D@JD# 5(>uNX[87Lwtl&.moKp@]UW]t衇#8t{קD@D@D@D8Ln3(mfocgmm1Y%K> ~#L!" " " 6iϕ٬?*qކBe72M6yw߽v-|4'߼yu/" " " ۓ@vSzm }9}aUx9-& l"ۘǽccc=֭իk qe˖i~D@D@D@D` 鯜=[ 鋷lߺuk%uk6lؐp)^g<=E@D@D@vv׻"1l'+FFF/_vwKxN#H/rl3Mc|.g4sg<% ږ O[D뤙"m?Rg<O|d=GED@tO߼1=G?>+ oLn[.xN:?fKy;,=yϫKyh," t/Hi޳^x^i+P\Q[<7poxfzGswYi '~tw餓%GpmQA\2E/J_|q:묳?4󖷼Yd~q[6ϵD<A>ƈN?ە_ 7c_FI[^.?o]ZiߣK˞tyN mwqnLiˆekڰ& 붤7lMs?1w &M$" ;2NNr;Gz<3`LXuq~[Mi-iug?zQ26=8SHщN~׻ޕw4:2>| ۑG;I,v7oR>x gE|Rz7R7 ;#Ӗ[2MЯ>iI. asgk_~Um:Yկ#pktyڒH׻nխnA BC hωV}[TqBmvie6ǵ`ںlPYPB9(D oy?'Nܽ9UBZy#{ܹ3rgcyܵ_,)Oxgt3/uv RǼ٬.O07 ٭ҍnI[,I6w_m98-ZpXZl6훶l TZw~Sws%>Rzk_u{W/}i#qM՟5\<ƿm7lj:^ך3>>Cu9ㅕg?i}xMddkVh[Š5W&d}V}{V߶zC;]C?mv3fu _َ3fXT7\Q"q=7cGlo_^g"6kINhs[Wݢm nWlN],wy~h_ivSmS~'tN>_%+sh袋/ިf͚YUɳ?~.t_&}{N|w˾:~6Dwic.?UCϏK3˖/97{T5]sGFӳ9vcY.HtwVC:`UOAuA;iÆDn_uVcEsnG_$uzhc79oO'xbc=v}7+'׭os8MOἑϯ|fYtٓ8+mmځKog^?\%ݺ&'7߭w$w7oLoJ_6\wC7Mcڸ&?r5w;yO-iW<91>4+̂￿}~G<1IGuTzsSY)ZN_4 |+_y\7)>IGydS~Wz׻ޕ.f?o57C򐦯čr5zS<{ӞFRvg7Wxկ~u8mǽ.^򒗤/}Kf8䓛_;`L7 _XrCQn'>1S_{ L}Cj_8o8F{wkoVkO~r:cӓtW}jÀw_W569 m~k_]>lr8h汰~[:tc_g4!Zuy]nY,I33ҁw/ݰjSAFŕ6!1LRƿ1&y\~CXoɉ)im4k^f /J|ѬFWYoGGjmGm>귉#H󴏏xϟ\ ] ;{(^s=ӏ/qZb]cfc棣hIUJWrWy$ijIۡ\gt1Xgk򣢔kIn:+3}uemZﺴiz[\wYfʓt%,/~=[Y@3B XV*oJ_򗛯Hp,q5'>هҾnqqx;7?%~qD|>򑏤>y_Y}B7j_HX?)xen>5~\ti3VIƹQq?o;r<+jc \|ϝs\e&Ogmfht׋Sq9ܰ.?sn%wKO_ϫ k]v{}Ңm7vƒq*1gJy:uM ω譅%VLoÍ̭wnzIM-ޒzY=t#NNōm~_iU M}يjzy7qtqLx;9i iW~_үk~tW^.E)O}J{}W_;'GǚmSuJ:la#Hx?6:淼ȣLg̾t5}Xyg>yEk92/]ˋ}~:/Nl~NM~ /0}Sj_r'i?/O淾9=yCޝ6qaXyݭ'96]W0c9zsb}-x-vj5rB퐗])S f|:!oK?]1~u^ͼqa=iU WMِn.Ϲ:|}c7ؘ]Ga L[ (<{-r=%V騟50 qoO<`󪫮j&v\N;'](QD_/fi}mVLIH &X~PT~|DҨ [lYG:9&.zj#w$?mC2 8K+ bŋD^IV8ܒԲĄlHXj>2aŒM$aLڌ.;Φ- S>/U+V4Tkx@q|ЍKϫ*ǀh%1͓Vy׻jOR,kТ$t4h*oI?]g~2uI:/N9cie1~p­"qd|,m̙cOnH ~|M=7Q`r S&A^;#9WK#:9qqGʤ8ċ$$n'!er'N־'wߕ0X^wu*E8a}iSDܩw!.4L250wXq_hjuGYv&~3}xsQs^'u 1^WҿE5IHoyϗ$J\ ny~XNMEb:'?6W}]ͼ>45ߟ-_skץK6dljG>g䤓K޳t@p IDATg`>0L7z=ӎʵz%"[' Gr3LNU᧱ 'Q}hpڑM .Ϳ/46^W¼߬r v uَpk3]93^@ -K8Me:< f3i?-_-OӢݖٖfU'.Dž<_8xF\Lyˋsb@ğ>z|dS~J6(}g|3m4n }7V7+m$ͪ#cG$qE\H>Y"Y|ce j|ŗǜ' ]s5MG3ܖQ$/ʏD3O1iI+߹O}#Û#|M؝|ۦ>L(3Yi# p'|ǣc=&W8XBO}L2;=lIf [#n vUP[2 ׀MC"j)uo2^$@PBv_yL.i#z$ٓ#Ȝ/̭|R(:Nx@BK?oIy.\g.~؍/+B}+wqwU0lǖy$xߌ/g8K?}hWh5@F nb^Ld9KVcgnel(/3IH:9ȗioK8׾?mN>qMW]4umk~ї-ã}z]-tk #6NeCَ'[&V#J0J~L I+XܹOJĂU]@7&¶W hđG\$5\XBL܎^obg&4n˜'uldg0/.8GMҘf:H2~yzܐwg?v˲Ϝ\ǥˮ4]_Pik~dak/9?q&ӣqx!M]ȩ4h`39acb H6ş5Yda sSlst1IJ?HR_a5}$y=Mi }?HA"ɼ%]SH E>^5 >$ 7ZQ!q/{MR\Bzn8<_?05 ށeс6+O+VnOx Gj1 WVA9v?@ > 1 ~22mf$I6;}FǾj1\ 4q6ka q">k,dy7>lAqde!74ȘJҦd $'`d6Ty$l&_|7.Jr8>m,+n+9$||-yݜmzI ͠b01I0W.%*ݱ" +\YEaň|Pw0r$ /;'Q??Ig^_vE2i[N:sM9i6 Dt<%9 Isw7IDKֆ>ԭnG|-N촟]#RU`>a5}K&O|H8]#2nmQ.%|!*a֧1gIDYpۦt,8I}X9 7pmd Nʐ^)Ӆ@0V&TY2˜­Mt dxsʉp5W8,}eܺ5-?|r[F~~nikY{/or;/ڹsa qQ殐N|V@Ɲ'Q|GU~zx_.<^߿쀿HGify~lJ. m$֭ݜt嗥~uq:!hfHYfEcH6$Q RxGוXdWX%ť:`ફVxtǑǤCse_k~tUk~sE:w:yI+S&>Qe*!e_]`>]qwOY Pj W$5%CnГLp%NV dK/ S 9/+>1J@PdʍP#:@D "p'7/#+KGHVnX"\re6X5&W<Ƥ/$A*7]+W~@M@mPDu NuiT>~w#l"@D`$yL$ )\2usA'ҙ䓟7&y<FvXl˿V$wI<$mcm D"hvt9jm#}NJ57}3r;+>Kg1+&)t$m ځKo'@D "T#:hJU S(<P~UcWf1+.Gr>uv&|~F@D "DO`ޮ;Pa;k;ekWklD"@D "D?/-L(i;&=Yk+;N6lG"@D ""0*w셗(+aV_MU˿,ZKtNSQmIdO}ƒG"@D "#@TʡɿdW!d#]g5T:W m&mw:T6vGYBD"@D "(GU>RPTUyo&]P<*["@D "D#@T5(O.ZYؼk٥.;fa} ui?l"@D "#I &RdE٤/c'[+LYަv!G"@D ""P˟m.t>k}~5Z:G.N\uD"@D "/ʧĕ4Rl.&e%^gZqOuJuHʪC(km@D "D"(F ^{yZŦ'񴙱m4KzYa uD"@D "P C)REj-&[.[UqOURjsڲ-+SD"@D "r(H-+Q:ց"-v'/:ⒷxF F,e͖%=S-|,nlj嚏ŭ]M>\󱸵ǖk>^v5r֮&{[X{dc5[{/[}lcqkekW-|,nlj嚏ŭ]M>\󱸵ǖk>^v5r֮&{[X{dc5[{/[}lcqkekW-|vF dql%o.mȐ|%7cʖ#m#GpAvW@-N5|;_-N5|>GE8I%ʝ,75m'Q6Rm6#uZ Jl1Sr%J,.LS}`a#)/Sa#jiӅ/m1jE"~DmbOѦCmI,G&08l0qP:$+uk4k.޶*'ŇV%-2eV(ۡW/=ړ٬W|@vlV_{F&'aA)Ο8X)J%lkP*ٖǰT-a^Rɶ OaS'%:>SL)[ʪW'S8ڰ*՞dNp?#b8Ec#Q)plx)plb$3#8M2~\e%!d'.Keg1+6sN4T;gaevLeW+6Ğ .#m2:(gǦ1STz< ~l(Rq ?1~@\f_[vC}fa'{ކVfżݜiSj,H\z|dS㲃ۤS]f&mY QJ'vŭ0-˭ xccc2>F?v)1 1 "`ϑ?ljWћmЦhK &8JpߔdUC%[b;K/tjڵ]O5`jXNҩ2;HdJ&˞ږd^ѫ?GgImx9׋S?M~\Fo?q?Nb5{9^z) EUs5vmʟpH:0 sm(CUs5lkFtܖX/I_u(@`+?jL^\Ζ-^}Gx[?1~x&[?1~x[?;n[HYy / ;6( 78:M>-NUIOaӀJiJ $uw9@p'p|9C~ʆ:E,rkcel|I6V3[+ǃ7cAcrkc?bAQbΖ%[_!K'2ޓAOUMyēmFE!uB..ʲXB/L|(C2WkQx/bf'OIϞ}F L 0qpSYv_HudY|s>,[xgxR҉cce &pK[J0^>j>}bU^ץ?9cm'Ο8F]a]m?d_I$eG$M0,0ť&T/%#רMxʁJuՀ؀ 2v`4 ž\Im•h* dfܮCV}Jom Q-a_@)V%oX?&b#P:WJX;οRJXįRJX{? KV 9ʒKLM> W[7? ܙ$T'ciI0ʐpꔬ$S yT ؐPdoQf1dKMJ+'^oD"~F οb?舑 rMs+;"0m=؁RijJNz5$ Y:v^ |HZA)P]T` 7|TƆ͒/K6TXÈ_įvnvG1~brm1qDYp?ѩ,;ŵxGYŔ/\ueh~zHv*_αn`eIOPC:juBvíLZ_0bJX /Yv*7'"D"N"8e+`*oOrTI>Jˮgz,e^Am\E#Ə=9Ο8J)1AJdW?4n5UKFr+RNFIll[Ȗ!kijo]Ftp0%wd #Vg٥ 2_}^ɞc+LDuT\e] xͮOfW'^pjkv5\~5.?] xͮOfW'^pjkv5\~5.?] xͮOfW'^pjkv5\~5.?] xͮOfW'^pjkv5\~5.?]n}eSv})߬ +q[/9SS JVu cGH謌p6UV2'[YkhϞrwyGncݼc٘Y9-6fV;+~]#B.Cpaa/tV9`"+aJf)V/qQ"TƧY\tp-&{a,ƽ/{{_]{{_ ,\}Yv5}'jrOeո嚟po˲qo5?ޗeWޗk~½/ˮƽ/{{_]{{_ ,\}Yv5}'jrOeո嚟po˲qo5?ޗeWޗk~½/ˮƽ/[?tHef1Go^6nuuаdq0uY[0DW&02emW;J8b[;dK^bfDo1ro8NA81~bر1=q6V3ZxG_N-гY0ϱX0#_6%hS *6+xl$?TlmQSbJHށn]y׸.y11'8g̰m?;!lQO|q/˽D4*bV5f;!TBYnJ0%?[{%+.!ٴTSM.{hQ.#mcM'O86];KfCY+dc+Ͷ؎J\[򱼤bV%Ŭl$|,/-fe'cyIo1+[?%Ŭ,KzYI.-feX^[OrIo1+bV~KzYY>\[򱼤bV%Ŭl$|,/-fe'c#CSgu[=6A*{^yܖ3!C J2mlƅ Q|-%Cg1Wi ۦv%I? ck@?1#m8=ƛ%?[[-ljݬOb˔!%@k(kő:hz;v^vȪ_2_@-f{X+=6N5zljr;_-f#`T޷(ϒV'\R$;qpɲʲʲ|J T-KɖK0˅ -|щJXIGlSS;;FqfϮpjGx0 \:l![v=n#}luvVVi/K/z_ltͦMŨM1Ҧ'O?msDؕRn";=d'kT0q /aV?$doH1P-[mYcgvh?mDƓ#~1~q=#ƓwZloVǖ%{/[; ywA[t YeuɖdnKebW 7D"~|cL)wpDY/[6V.%=\y\vkr2Sqɿ 6GNz{WG"@D "k&l켾u|dSG|$^:JlUY\;pU(}9#޳Wo/v/G#1||ygǏH0r b#?xTe%iUzJ/٣jcCD"@D ""%p)%{:.[WӕV81}#@D "5&sؗlKPGufRX;@D "D 4ilShv$oKF:w0R|tڇD"@D`WI_(VD edͶԾS]Wy\Fl>7qKq#6lǸ߸ cҝ%~crQsN\ͩ \'vE"@D "k8W+&ob& n8E"@D ") fmIaj'@D "D"6T"i;rD "D"@D "D"@D "D"@D "D"@D "D"f?"4*IENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility2.png0100644 0000000 0000000 00000214450 12564151525 023564 0ustar000000000 0000000 PNG  IHDR.iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxuWBB u˲-r؎;q/qo=q\Y͖P/Q2QDaW݉7̼yf滻fvVă#8#8#8#8#8#8#8#8#8#8@gCuRS&GpG "ܒQ,堷מIA}_oI9~Am_oI9~Am_oIɊ,O<z:@w #8#B&څVRًEitR7yGpGpB0˩[nPR( NuJ{}ϯRl'(Eqp (r# A)tLrpGpd^y<ƧX"ogɳdY,UꖫoCW( ճT?͛^^z&OӼũ~ϫgT?͛^^z&OӼũ~ϫgT?͛^^z&OӼũ~ϫgT?͛^^z&OӼũ~ϫgT?͛^^z&OӼũ~ϫgT?͛^^z&OӼũ~ϫgT?͛^^z&OӼũ~ϫgT?͛^^z&OӼũ~ϫgT?ͣ,/|Z/bg4'ӱ2bB,o͓:mPa ^|^ӘSY7LI o))og:~_|?S~OyLݙXF˩cTX/MG`hś),Ѹ,N JV|BB:ʼ~x:~__?C;qHVfr[Tfr|,Kӥ ^~^>KΠmʳ, 2JӾY~!_jX?ƥԴ羵˯~wmVb[(ky1NyڎfG )/_ۯ+NeleK iR:^-16?/Kfb~'#KӱxdSnwhz i6XN:'⼥ iEڎ!4ydt0LjQ駱ib)\ryG>n$GpG8hll\dɒo;PX9+˶{n٬}{dÆ ݣ}۷uQҠ}֭[I,4/sGp8ȥM4#C:cЋma֟`r͊cvJ,c+2ۨ L?uSz:ʀڥKeժղuN9o)_B"fsd!52h3|B6,]"n۾C}2‹Kɯ>Ξ={HϞ=^׭6m[e떭m۶@>ǎ+UUUN>NֹsGpR>U6GmMbŤ&'Yq,#&/D02Ye1ub4s~<=Q#\zyny׿oE^$YSc;3os]A=e cddE՞uWy<ļӭB&^xIAx:-Z;| Uld>D֬^#+W $=9fz\@@PH &F>:`zwya]5޸qs=r6'|2p4iX]pa믿^:|AwL0M=8a@̣\GbeG#&@Y,3}+#-q*ǝeX\nBF*S ,bB%BaUU_'({[LT6ijer=) 慍Vk~!Ǎ!;@z ny QWnj_@yxfSaMQ/%փ:b v#I#x5k`Nّ摛 k69o؛|ѷgGYJ:)7og=7\/7(fɀ-e)M#>Lo5R{ZrZ|t۵Lj{W2tХN7S6 %i4nkefdA:"s9G/ˏcӟ6 r!CN{;vDOb1Ș 26mկWU_"Ǫȷ-yӛʳVGx"Su'eB`` u(y"o2!|Cpz,F*iG%=ׯGwUtSf݊r~R7Aңt[HҽaW rA~3m2mȃxĺO!9A׶*W/+|}8>}^zj݇.KLM_tErusd>&xto__z@"/Pw_Wբ:}D> 3 Ic ,j@ht ~x;d޼y2+#&TկnAwG>ݱ[Hi9}L{su ơ[Y< Y'%jirBYYƋ3jq~!Ie6X䖎c,zl$CoZi:}aWTZ󵽕8jG.Cj)t,F9tKjKM*VOgmz-St{WI{x3ͻ %B厀#ih^q.h,Ol<ⴼ5ƳXE+'tѽ2+ˋяI d+ƳR=US SMeN+sӞ ]'V(W46JO} {fԷvWwʆJ0{JM%5RYPU5 HŎ]RQJְIS&d&q| #paA0B6q0 qq=fXWBzʔ)S^>֌> 9gpmd4?/Kկ~<}k3ۿ+䓟]xYidYbqlgcg;@DxTxݦ gI%ɒ#C\?Kle8mydar)3@,K7VFP!Y-6l_N}5V5ؖn nܴI=? ZxwAEOQU/%=u=f]fijI_R%oWf=hB&t6nz 9RtoLuwFtZ{銕Wj/dv xrbm% SBgzKRS%Ҽc,^EjƞQ&{vE<ͫAyhKBlu. )E>;uoea#E-kb;/e]&]sG7nz,e&B-q^cǶ MefG#tiX @fyMfr2[=Ȱ,)+Z*&4MA⁒a[9eY4hJ܀ۮyT-u:/)ۤeYh z`㡒9˪Ȩ#{˸#I-/,m\M_-nG^%'Z&䒇x@ґpR2xF(Cf0l>8͛[yC3yy#};}uFo'ĒtAK폋-Qc^!Kalli^Wa'yhu3fLXͽo!WngV!ovK{8] .zcqe@4šZtMbidĭLqI@F#qK#A,-J<z.8uCEuׇr8U/;+++̙ͪ]2kyM|EhZb_z/Mjxb9~Z>xp:7Mtt~gmWcgtQ̙'Oٴ`܋=te13]6SJ<3iC)L!crZYZl-SZH`؄zp@WX#iClWƱț.5+2bVY&J%֠Dn2S<=IV pxpGpG$[03f:Էxke&3q:e0.ӱ.rA@p7I@Dqz2ڴf8+;Gp^4Cv0h7y cMTYh$u,mA>N'z-|Қl52J >q|o۶9mP"m/ypG "$e,Y@g)c#'m͆ӌ{*lH#wkO{LKYL?"g<Ǧ{8#e`xTǜ2o'qtS7O`e-"!q̢C0]q'MLt5O^bYD;q4elki@_M'/O=9#t?Y Lʐ|L@5y$2 c̸i27#O,oei MqO;ۛ]281/FN'#=8#tIUF*t2Y<8b,M 3Biyt!֑1[M 7iLק .?#r)tޗmȚ4g)H#<)̲guy}x厀#8 PƩXDfDҔz14ֳrderg! `!,2Hd&A5O>CI ޸uMrQ_:ibL/Jѯ#=E/^mܸAkڵt=%D0&v[L8m1Q5$oibm,q[qG**HiZlGp.qظH :yRnyK!-bCEL/M?|ڙ<܉ v"  /?=tI6[WjF"+R B-nݔ|!?[TUImR/"Rj;dG]v_!j?ΫyI$u#y :Bk@nL/mt 1q5"RrhOڷoV`pU3dy> X/z.DHK"q1H yV0=щDRW [n S ~l=ƒp˖-a֭իWBje]uqNڡq{ KdW~a<-N(2JDUVWg7HXpVrvi-y:AN.s7rCa.u(xBh,8«͹=ztCD!Gj;ft,^]~Ȍ3F&/lذ!1bG?䍔8[ǿi&Yrlݺ% ݷo7d1Jdƺz,ޞ#8/"-"~oqar-ᑢe.ieLCB$22ʳ:l5~_&MS+W{G{ ٺmQ2zŗnqFYpqrwI$Ι&#FzyZ_4uʁtN؏0CJ+)z?u?Pw˜ş߆TN)gMG}&W3Iz.1X~x#]SBZURS[gs.ڙHcd;H]+RZMH` W% 5PɄ){ָf{Cm%e^5iFZ]nßXMP[U-cGc'O} rv7Jl} ic=q㎀#XGyr ~CJ; .xZuVn|Ů[ef瞓kV6njqGL7u2yأ,kt} +}ke#㎓gy&!a"\SUJY[1XnB>$DF,RfZO{ ov%jll#Zo:h`~P5(yG:C0n$Yno~`f]~r]2ixJkzi00n;}7cGx#s*{8YЭ4+cɈ+Bi1#qCVf1:i'(Kt8z !5z 1k:G熗f?;Kn_ʘu2+cǎ 6c@HӖ'?uGOfΝ-uIƴ3Δ/7͛dŚղF겁qC#<,x+[Is]sQ9#ЅUYCB_O Wr3 e Fby^}MzZԹkN!u=_oUz/3kֆv'vlZJV+)Uu =֮vTظqЍޫЋ\prSZO8\F-mcm 2nD?׫^}t +?Xznfiз7oZZH[LnȘ3#eL[DSu)2=v/f'ٖx|05A69P{~^@ҒӦ S:ZǬY_ >pPWp^(={ȚS }rmGp*1`ouc9y+#N(/J%8XñYe&;陭.'X{n~2X٫w_Y29, [v:iYnS;mlї*jjk:Hׄnӧ߿ S31y0x^nQCϮH~թcyǣs՛\-#?>C^wQ ɉG66Ek)rsdS=Jv|#KJŔݔxˆ=ԂuSE je6aD5o5`P&^"y}zΝl?xI`c#>"48S/yA7tn3_xE6m\'- ?چ*#lnC$<úD]cQax=8#F RƭLF/ry,xԎ (-g.:}R"jRT20 LЍɛfF^^;%5JqV%Wtd>Twg,^H_gnW 3gΔc=C~fgxB~{rPdk_^n-;x%{Cu[grʳ&Hmz 2dž 2gkc71(ukbH"(Vk^FxB^J@Ǔ8[i7^z 5MҧNsD5+>ZDxĴǞW/g792OٸR-r#&;`/eUP9Iϟ/ke-UңY&{-nBu3l454K?lꜘ˂ c6ól^ ׼';u`&9bQ2r%ח>=@k׮ $2^s`qG|p.4:3 ˓ )(/xPNeeQӱ:hybK oKn)N}0v7wn Su{.eJUg/ec69SV8;tJ{}zw6J]+SWgx{MJ"kOB*=ᡧ0rVH1wE9i@8: CuyΚɊ겿^Db#/@~ci#JVQ7_Q9\FM+er\Mo7k4*Q_1C;'5li+jtmq/^ZNߑ1ƓQ1/U>{tM4[EӾ%-)ݻw{c l{LG$%oeF,t~rgZYq:Bbzh$6an|] TnU|ivlVOh{n_ ÆU=sJRw6n vߦe} .xx aҤIBb)[+>g^J|j9BgN.[Y7!G^^*:Z_"ڪЍ[w(-wB@_B R{^j[H(5 ׭XB|mӒa2WUӏ/nͺDeuҿoTwt364ɶ-E^l??VT{bW7XM{~\wur.՘6mZoo.4뒔$}yv0S댁ħpR~@\ne,NSTbK6ni営uxtд#Sk :0֩wZvnPLq2GyNӴ]ꕐV÷[7PI]_hV(.֗1+ґ51V2uxCJxaqcȱ-Gp:ƯɊeq:φɭE<:w(/WuRCtJ27ZC/u{INJz={vv2o:Lwݵr>8yL{T],V풪ݏt@_٫^S {8iT¢ä+K8;R7gM9Qon9Tw(a{ A_Ɏ|aİF_0d1A!=n^Ԣ+{pG0C ?<GRu"qJӱ^\?NWt/ߕf 5e"v鷦 "O"/SO u"F's :2]]_^ZdgWNl#ަ lӽ7kdK9KC4BV*Lty(Էwˍ>Hh%oH'yyd^'՗g#ԁ,mv򈥕16Ky4-vKV:>~\1nەٷ~=H_EY|ֽL @cGMȶ,]&|J.[*rb|ccV ep.@̹a {(BzO:&qAQbPx$7wf~{m7٠¼><飞M-q>٠n+(^s:<^MRZHlee~iNӫ[U^Iz"4Qϱ4o&* B@yz)l3k.P<A'~}MYЈ5>OVFӳ8M>[U5ȸus {*Q_ӮJټ:ORK1΁jN Rg o\D?Wu[+-O<.GMHYWX2dGbjr- nN͇:2 H>d'8qِFdi:q$خrĖeq^I~dFRgBi׈ɱM0YcE%_$z{SXU_K=tg?C\p%}Q-Þ'?N"Zb=`m:#Љh!;#,NZ%˪FV.lS@ ^l.Ott_]gēOrG^0]V.}مlwcf ٬_X tn߮2W: OpnׇmuCX SOYVnK,sMsΙ?ƾ.Z.\jG\N?c̾r'~f?Pxӎ#FXnp 2M<:h<ձ̡t `>ȣR7kLr W<79vNU'5u (wY直N>,_;uKx$|oz֬S1Ηw=G<9SېL:ps?~k^6l'`9ɚWe%d?|eĐ˳1ț@N:&6y?luBz3X1 IDAT:w7|nS7 ri3[=\k8%yz)o _XbxA?0F ?OWqF]'|r~B( 1w8@E _)7R):Yx(6SFvɓ'#>}{ɓO>oN^lSp)S}(1jp9eŲx2٢/'U*%SO>.'Nת P4sm-xѣry'9'@UKBr% e!qOqߨo4[8NSN]dfޔͺb]rВ&c~jhя^طX;>B.9L@^`K?F73'UӯIN*[OyѯO i<8!B.:^qѱ2ҥO;eƳdYey~!yN3]xEF]+xqAdٺ~m5JzkYT.R躵 ur;@t>ݥ~q_oyGxӠDp cp +P`%s/C/jm x zJݔ޼n{ Fl-mqj$&Cli4}e Mחcw)Аoƒڬm%4^`,N1Tm;"f|f[,пq\.?xaTLVN|oQ~ʐ3.1AB]67p(1g`-/UAN\ERg܉F3~8Q%[ycJ7o$w v^#qzdfZyg–1S`v6;{@_7nuRlN82b,x G4Yɗ(AU[5\wX2{lϳWs$ڣ9GO,F҄0=o6o1vNY8(fOP=("MtvA(m6eoYwNj}2?/q'M 2&Gp#ِgT/ַtĥRK,NgKyeU~d<؃ ?Sen=f@fzB]X[I~{/}QZO̙-:U_;j8cǎ=3vx}$BUΰ[*K-uwh>-G}~ej[h R172'dԷ2QN09Ё#t,fx0al=lYO:V!^GiO^^bFKeo7/inMwݵ،I>18&Zqlu̾ٴvK]bgŌ!7B̑j.Z&8y7vsGs#P|[<~,/9]iJi0yA)I ygʐ41Q{XBKE<< 1W؈əz4OPWNѣ[3+a;mGNEyI14<+:i02̂,6y[]qs:xWҨ\뤟N281;ޞ#8,6z҉KJC</9-k:].$r@:3FFF1I@Nވ=@̇(igώE6\Qщ,Mli1ыCz evJm/K9aƞ~s}X0=vG0B W)˭,i`KA_2ʆmyrKlS7})Y$!~BW?ce)ꨐiGoOYMVL,mciK{XX:soO;^p.񫼮bYγaroqGϼNKեqq·@G7B#Ai_BdZ:<˭x|A$cҙGb8] ^-ӱBb`<8#e9WCkXmkcGp^ *c<,6yVM'.˒rgVdyIuKetge]zn7Ia2pOO/~1|;@B^2QfՒ{ÆlI}.В*w"NرcDHr'?I;KZh9:q_oeժUo-"xVFL2U#cr&="m?yr H5 3f/[qM77>$z/صm&K.mx#8]RS̿b}_0I˲di  :ŦZ<,K <4o_/}I/KCCO L(?OZBFCE~_J=ƒY*O&O)ds~#RQWWwPp k+og#yk׮\K,i5mDĿeٲeၦ6mNdMP1Ɠu͛7/'.7X|y6::ÏH^O{ݞuYO}*]MMXtlկ~uhxpG%Vww(Y 3!K1}ҖtK?R9zի.Ըhq)%zwӏ_Wg*h%D׿̜93leTnw _sG\qd${2?Y7j A}8餓q ^c+,<!A8}Ll޼9Oڢ\k!.6{'3L<97-\> 6,xg͚~|qr }䮻 m3vv Bٯ_ЇS\#G 0gZȻ?3x"Op.^XAw7Z?O<~8g# 3{$; &vuL]SO[9sȦMȸ z]qG ڍ5z@4~@xQ!mڰ4X&ַp(U1!uOG? X~@|@6HGL{XʿI}~|]{o;SCg:)^s 0 lW\qE/e/ kO ʺ7~ [l 灾c/7/D#wy {_~qC I3K=(})S{[]Hs!ǏR-Ä68L̮ǎ#trb!g*HH;Ql:O3cѢEA]XkfZ蚾&yp&f*O=&27{ )0=A24@׾֭yeZ v13& W]uU l1@P.7@r Zf!)`@[Ćئm,ĖN|qb]#.uFi  o,sRICvX:[A8\dJ~q } E[cNkGvY1c'wа6v,gɈOJ7pQ N؉m+0圱 p!pW[>_&Љ똼hESX5DaRw2Ngj;<c d? z` \ Wiz]렬,Xc? kN 9<#tFԩ&?q QZ)7&J#h1PQt4 3f6bIiʌH0YNj x @^H˓4ڎ9Xq^J_گ^d bcʸ +#&JZ?N$nMZ!JzV1QNYtO^)K' /q:~:crXS@=vG +-tbϸy u`u K2!Ωe`:#.Fbb'RFH-ZkrIt \EG8]_-.Xnrg6<ݸV7=3 ]tlҕzJDzq-γWNV~LzwGh\n,<&/wdܡt^]:g<8#8#@̹J&iY\ӎ#8#8@Rw4#yS+k #P ;w… e׮]Te̙E\)ӧO$V_JǏKD|S/q0:SBD>8vtinH:8(yRntbe5[NV66 4,YVY<8+'~!ybvrغu|ߖ_'MMMRQQ5UR~:u-o)IP*G?CAk'NnPt0i$;vo}ĩhv*JӱtIBGyd;{Zz:Tx둧v!?Re շ1yѸTg܉F3~8Q%^^TUUy=jAFxxo}+sw[>l?,x,g?O>Y"SLs9G~y)cΜ9rWo+_6^I03Gyi 666*r嗷bLEhѢ6vVX!7#`1Z+j_"~:o}8'q͛7O7KO cE.yk9[Z[9;{ﵢ8 G/<2:K7'xo&wC>ϷyRu޿Y,toٲE>_'ǎ@#(Y+ճnɭTYt itYz.sr DcM6~2c ^4\{ҿ?z@Yx|+_ x ė\rL6MP/ xhweɯT%G!wqW 2?Op|K_֭V^<>?OG-_}(?Kr:KĻ /qПG}4zˈ#5RGof/@yP?CouuuFgɒ%? 3^= /1d??ƍ!t yBl483N[MevJFK/ |mcǎ@!xW46 A|Ff̘Ѫw'uu4o߾IJ8 7b?|k_ ӧ< Gu{ i CVyj6иi,V4: /qu*k]S}=X޲kV!FGq"3iyCKyBDZ|~p=r߾}K顚JN6H2SHi8TX_ZsxE"m!?I"Z 1^Xy;cNC :Sk,UĆ?pw!?8w V_:mn8ʠ>ġCذ:Dys=8BcE,&i^Kӹڵ{\Pv b2>6Bkaǎ3qn.m~w?G Ck3>$C^z~qIؾBRޟPMn@~C5*^|x( /P4;oEVh`N rE6#*/D7D,,o`}:?ay^_\w)˟_gVp/T Մ~ο9?$P@}kii16>W:N+oi}Ge9nvibjpq_^k܀?85ZAC9!Pܐo8y-N;$3gt+*l,V:j  qJ b|\a67|1+  #K .IyqxM7Ç; b .px߁oV> OXg]3Y1]ĵ/~pڽ!)9-3q\牟5\LU$>G\e#V ?$~Aⲗ?/>Toc~limЇaԅub5zY#__gm5&0TqS3Ԯm xakֽmzT?p ~ɩ7(Vpf׮]uֵ8 v +WXO!V.;tP?4%G@,A =]q8Ul7Ԁ)vS{6HQ%Iy`gsG U]?hqZpYXN|)gu~ZYqS$9sϖ?V?/?X]B ?/c|g2Ք}$@r]ϒגqY{<|1c6DF66zLV!oC8{hԶyqǍHV *<2m$38C}\kn/X=ipM` E]ŦkL۾$$Fv_7 ĩn~i9$@$ BjtN7Omƅ/]Zaxu"OՉcQቢ6o ',c hpy/hBY@U ? UEtTiYc/d`lBX1~,|H%   Չ@dW1 ю<-&4 8Enc&   O Bv=Gd"/ Kgs&    v)dS_J ϘcW$H$@$@$@$P_6 u'&WVɁ_D$c>1|hR+r~-ʢ%U5   U@fMMҡ5ME9q6 G>j+<1-J; BXO#cd!:g[*g/g.včHHHtf6Mkҥ]|NeħUc_<bl3y-"@"m;Lgڱ%g d|Lh   :J9K-eszV|H_G88-$fW}%O?Fqv*<K/;gAI$@$@$@AྱZMf!Y|Y%/Wxbc[Xm'g}۸ڱҹvvo;1>#\՘Kdm$@+1Ǭy,} 1 mi)4^}z*Gc!)˽5RZͱEZ[cHtvhY:HHHVoKS41o?ɏ\"+(5ǟsZK/>ɴiC VsO8p`ПǸtWRsS cHV=|YO9EcYlI?-jXi47-Vc*_pa>7h#7omk-DZn-j5?qL馛d 6 70c\xv7\W]u@s# <B1'x,^X?.wyGnr;<jy$X wJ|f6F~SEg@ZN kXNEꫯ/:4V(h,YĭF741B˟g9e]wu`,CYO$z}^zi:s=rV=NǭHcUT_ź~`f۱>Ԯzi c(dN&O@h ]2qDٳ\}n+^zɓsϕW^yEZj%?C *<_-"kb-\vD~ɨQk׮rgʾ|o}h;V-|{LqR7Q)i  mgmX{ت/\sN\N2ŭrm9ywO~'To~y'ϗk/z)Yop~'x{PWn裏H_Y~`cs9^s}_I#y1_\xNTs1} VRO.gqf͚>#rU;$@@=ᬊ ?,_|}_]w%v< t"oM6uvwxG!o]J`!ViˣB6?qQY!kZ]6}Tx7?K.q||A5k*<ǻi>lRy|?sQA*- UYn*DC=c Uo[pIЧ~.1մv!K/ɵXQݺus8c$|8Ǹ6>6n$ wLvQt1e}r"²*ضAZTn?unqd˖-gqiXEj )NC1rjx)qܴaDi[Vޤq)NK-ni+# ǘ\c9c wsn~\qS87WS=qRچXϏӾa?ꨣ NxS!KQC5\VkjэSbn$@@{Lݍ8kuK{_{}AC^kEqk5xzrt"+~qZ$ 8Y,/_ʫa6k|pڰcCت ^‡xxҤI%1-1 ]Z̒sZv_~".~3g[C[W80zlmڴq5emș={2+ۏ1 WjC_6Ć֣GmcR>fŅCylY7B1$@@]c0 kg)wn$bUc_x?bl3yl4iہgҼv    0_G88-fW}<чm pM檲JsYUO8X=fU\V#Y_~P|gbm;9?+IHHHFbzE~ /W81h!>d1vS却X-"1 @e/_~#1֗]Dx 3=O!   (N M>ۻ괴]TqZqȷ~NQ}]ƍU_߾}3.HHHHJ|}7W6J[."<"uX׶r{N;픫'|R.rks3HHH *jͶc}]8s_)+krQɜL}_~`ؓg|+r[gC~a{݃C1ylcƌ<jt>I`%|+sY=߫k1}Q6mZ4 AWZh0$@11{LY{,?6^n{O|-&4)khz;oJK<[&M]rA |͂kI/~(kx@>lw/vG ^-O7tS_ݭ}тZ}%'tO.JwH`%кukO?t&k/yDif=X9sp3$` d i{۾1z}fvPQ![?q j~H}oM8u~-\]>|'cp]k)]ts=Wg!}_N>ds]ww~ +[ltL2Flr_˃>( w#W_}kO>ՆuCc8ptY6xc)= g>}s=y2e pss+A!41ĺ=8^r%6 24i"y7|V:^y;JY=h'l/Q_Ȧ辨v9l1I.bvӠm uWDU*W?ѝ:tu7F]wU^{mwV! (7tSi]ȑ#7iokw"PԩSOn_.y%AZ[o5:>H>Ci #_!ڊ]-iFV٢E JTjՅ'N}{޴'O쎱 :{lXEӧ@(v_gu7 tAn#Fo݉Vbw;]HaK/u+ {:[ps6†I۷o/{v+kժiF0_$`ܘŀN 4FH`u%}' 'x}1/½H*F ] W5YDwdC^ $֕W^XAdTDBqE^tC8XY ]7}Aݰj-Y=zp1Go©m6|p~dg 2 [=ގr=PWTr#XFgWvawv|Ћn*†Kow_a ?$@u!`B հ+[Ü/"k1~o@1Xu E0fĉS]8P\ozݷ1nkD>Ǫ 6$Bɖ-[jx=3Qwb/)8]oc| A06B1V =V{ 28 h7ellg&xZ[˓XM Uq6 C>j{=6-mG,Ϗc(U6yU{%µ6􅕃cǺk?pwc^M9 .>jD*NŶkjAb̝;W.bG>DX q\@8g-Y袋Jsq"&)=}`J7<e ,mj5/rEZHQ7Zr?aéts >~颗 w놕Q< 7r#M*_G1bbq1-X{f;,{hNfێy1!pZ4 P]-gRx&V$G`Sȸ+hFz6ln EV ѪבVkIq7(V´ !Q/n|饗Jiy"^%OS'+{f+ԊQqG?1X#UȍVeSḤ.e-k帉q6s9x/D378<js#(p_~>!lj׶` {mp*m{a 70$sb(lPb;0czv=@tp>Vt0O^baEK]ʅ j׳b߰yNc8Qv*_1n8= 28RR?mxS\ʍVeL^^vo%{t7 &/UgB$@$Ј/_~|k."mvW dP} ~Ef۱>Ԯzi c(dNYO={fd谺YXʺHHH@L?bB~XYT`'m\i7GO&|2>䦤},HHH`&O 'mX|~lCD(q<ׂjkбcj<$@$@$@$PYIu^5B6 PQ![?q j~H}Gl 7ic?+5gԴ~V67ʮf-ZT9l~sO$@$@U G;YeUe!l~^³VC$xgmLq梅 SN+bp=Xvm!ZbGS&Kyol2h [ռQr1oW_~MI"]黁9g ڍ^_v!g]v;mwڭ_䝱cd~]z}Ǡ*I_/} z9gH^MVq|roΓmn"~2sƌh?\פ&FcO? 8vy7F'rruW(g뮹do/;"6-^}IXWC.ŲA$𳟞ے/'ύ|F!'~:q>nɦrݵWaj<$@U%_֮l+{_ϘcW$;Q'ŪSO=J:th ϵ=Zf$m5֐!C V]xb`DtDp"!?>vzy-ڛJo.}{o9Gu2lprxwJo##;nY|Sbn1T'0q$mWX<}ekNmVaOv\_N?;V}a 2֩SO2bݜD8-U8wW}qH`u$GW!,-OL(-l֎8XWǸanBp<ؽ=rHw{Rvև𜘜?G=*!+wmn#+˯̂;\>Y"^r|#&ݻ+_zYKW߹Or΍Hju#&ۂmg ϲX^aX7"bJ['PlN?~Æ s~`7F~]%͓8b ͯm3EK0*z_SKca>ˠM7w73 f{ymԲvI֭NeMnjM8 Sk"cuj\tɍK$5|SګQk6OHtIC?ZR[ "g]"fǞu*:DT3_G'w_vuv;D9sm۶ܿx ] ԅp_~xQm ĦSO=t{wu 2]ߩ׊'V8q'XݰA3?WF#|FrY?aq.o 7iС){ `ldw,[ 9][-YkUV>g׻K|}ar/޹,+?hh"͉8~5x[W/!<׵kW'BՎ}} OӳW1=G߫.[VJ@=MurVrfzVtTpԹF]|<.w"knr׸>gGW}ڪBg :%:Qf1R < H.7<" w|OowMo??t_CINW{ bqܹ҂ڲ {٩2ctw ҋ\a÷uq3Tl{J7{?``,v('wtZvx͛oN.luGsb.G2sGV.vF$@: N1֗]Dx 3=O.ZiO)^ ~RT{H5[-9(9H 'V*jn2ʿ~R` ݿl@e!#*wZvS96ywS~&%V~!w+6-PuSt|#uj S@7Go}[s +9p呇wqw ɾ7vFN>hއ}= @ /gQcsS ڵ`޶auj]5hcmVxҤI+>>'E1-1 ]Z̒Sߺh*87eI߽>cLhduj'juZ\uK2yQ{ؽ :n3>&%kq`6RsmP [蕘KvWM0gfܴF]o|u\HVGqJ qj_g=Dm-δ>GcClL ,Х=+KV2YBUYmgM]JJ XX;"mNn@*%]Zʰ֐k&-Wޛ,J-YrA[v~7N~_Y$C*K?-_GQ{>Edv|[mRIbC<6mR/m&sᛣjoKN|+ei2!#9mUUxZGsk mYvg̒9DwM'|^|zα%O9[vm)h-K9jC0nZ6psrٱ=$~ &6IQo vKym崽/va=m;˦ON$PYqHqZE̮3ODca'`ۡC}%Z%Kѣћ.p5ɶEN :-C]y情ҬMpӺ/Jr䀋>sU˶7s{ $Wx$fY"ܻLh7wW5оtՑsҡMScHG 6H"ye ٰi{A;mܠ{ 9[s64C>m(6 d _qV!˽=4?vr~5xi""6M}{p7gsME2A3dYfq͛Ȇi~WKNֺ; IDATE>-9eozrxL$8t\:kϋsD.y sO4 r h\R-qh|>ͷh"h6=Zhcs4OgDuΛ/>e֜ymv2-]LMOb%v֡mS9Y8ª;)S\1'/omQytl˂E_9; >}o֧yrS_, 4F$C7\}K$V+NNmN-e?wיNp+uIHN:ɩͤSףT}ܓ :i&>y߶c[$v~n0ڮuunM$P"Pe4T\"+Z@Zi!m;FlټKD%v -; vi.ۮXY,9g.U֝d¥r>]Ur+BMOg,O.,ݙ~p U@L?bt7Q)i  mgmX{_"&7ڨ`mM|2sN]1#֒v\<ۍ?XqSѸ R?l^NnXt?Â~'г6<ߝU$ <~<:mXKl&}HVM e\(_~8s7^5pV$H_SfgX_vOP΀O@ mLA_%oٲh%|kZkX|_kfe[Me< d7o SzZOFyCys;~u^!Ss$(_X?-jXi47-Vc^'O婧ru:T6ڨk9z̘1CXc 2dKY`aՅ @nZzSчݰA<2٧卷K6mdo+lu o(|f6F~+Yj"u__ۚ1++غu&={LyeΜ2{yםҬ2}9QnIu;ɰJsQ,{lԷW wɦz˶C7?^u=WH $ w˟;D'r:'g~J'HP}˴~f۱>Ԯz/YH[Px6'mz CpdXο@$@1m>8y[5c-m^ ȣlB6EEg#a MBm6vۘm+xH#dw{˙3/'q}k]?D)r]seV_=TQO:}٫v]6۸/q3\]%{?wnXF$z x7v&>ldJy~ݷr ɾ͋e9{ۗb W1eZPȦNaS=l6lPmm18oNP?$@$F`ɳ?? 'ZH`u p/Ee`V2GK뼓<,$y-#FՊh۽mÇ 6p{Wb*v_]6S7 XSzͮ]{7N:sa[$믿(WBPw";TC]Wn$@$1`M3Hn*ظ,9ЖWxb[|G,Oh=f΂=^HHHHJuK()-_KFQ{>Edv|[mRIbWbr#   FHQ8/?N_Vj'c;F$@$@$@$@~gq-wgbm;ߟܮ*ݖ]IHHH҄NHi8TXCvSjVT -"1 @e/_~#1֗]Dx 3=O!   (N M>ۻ괴]Dxji|>#   GW~~YmcD7zFT֕Uk[sHHHH X6ێv}gH[PE6's2    '_W4CˏŻ:tbmA~ņ9IHHHV'cc+F(UtCbmY4pO$@$@$@$@vƫ=Qc/d` ŊcP|H$@$@$@$U>Rl hGl"f1l '_!#Z oﳹl T@LY}gLDj1+{L$   (D/_:ʫaȚ~Gy@$@$@$@$@]k`ybBy5ly-v`v/-}8 /U^VbvX{f;,{hm ռv    0_G88-fW}^ᙧc"1PPm$@$@$@$@d'_qB Dck6 @mi)4^}z\b23(D<&    4k;ivd?rx 3=O!   (N M>ۻ괴]Dxji|>#   GW~~YmcD7zFT ^Uk[sUiu:d   (H@U,UYmPqȊgZg"mAv,ٜ#   XF |{Lq1X|7E;LX[߶qlN,v    b Xl]E鐾-Xq֦}>ͧ1ܓ ,#|jq ٬?.*l;(?G 2Y_~ŵP|34?vr~M$@$@$@$P@~ /Wji(L+(4~.IHHH*C MNuُ\"+ EjcHHHHH_:--jZ@Zi!m;OHHHH߬_}fQcUDxuEfgܴ#   &*iͶc}]8s_)+krQɜ HHHHU1 Őce\0qbmA~9IHHHV'cc+F(UtCbmY4pO$@$@$@$@vƫ=Qc/d`y7 bm]Cxu9by~IHHH*h/~1ekc=Wx= 4N̶cj^O; @p_~>ӱ?} vP~(6    ex8krgh"͉|cHHHH64_>=sP~_V?Ph"\ T@4;c}EVHHHH`,/W{X_fvQ**d"ηPHHHH |,VYˏ1 ю<-&4 8Enc&   O Bv=Gd"/ Kgs&    v)dS_J ϘcW$H$@$@$@$P_6 u'&WּQI}@ƴ:\J$@$@$@u&G ,Tb4GT[P K˷q~ۻ괴]Dxji|>#   GW~~YmcD7zFT֕Uk[sHHHH X6ێv}gH[PE6's2    '_W4Cˏŗ}sQambh'   XA `/kVO[Ҋgmڧ|= 2Y_G3TT+ƏEoC'B# @PWXZKoc//*<y[LhjqưM$@$@$@$@L~GYv IDATj{j O;4D_M$@$@$@$P1e:RȦ1ǨI0HHHH|m(OL(/"k1~5  @nytblB հ8ہ-Ѷ|xL$@$@$@$TWA{Yv-[c³Wvb+Tb~IHHH|㴷]ygNCCq ,#|Y\ 7- ~YǶXg}e;JeD    4_>=1ևƔxU|yC9HksyL$@$@$@$Pic~j EjcHHHHH_:--jZ@Zi!m;OHHHH߬_}fQcUDxuEfgܴ#   &*iͶc}]8s_)+krQɜ HHHHU1 ŐcR)iڂmsm    0~==E0-Xq֦}>ͧ1ܓ ,#|jq ٬?.*l;(?G 2Y_~ŵP|34?vr~M$@$@$@$P@~ /Wji(L+(4~.IHHH*C MNuُ\"+ EjcHHHHH_:--jZ@Zi!m;OHHHH߬_}fQc<ß׭Efgܼc)nzN2HHH P}K~Ef۱>Ԯz/YH[Px6'm|HHHH'`~\k,?_E-m\?HHHH`~==b2[EW6 @eH!WZxD'D    BY<1 OI}($@$@$@$@ Uq6 '&WÖWxlkGmG,Ϗ1 @R]e/flmg ϲX^ۉvP͋i'   uCˏbvy:';F$@$@$@$@~gq-_ O?9o}l &BKէǵ{.Z/+3ӊ M!c    H_SfGc/WȊg    ||}7W6FԘ|gDi]iYY57HHHH EZj0kXj|=WJxƊڱ\os2'    ~uULq1X|7E;LX[߶qlN,&ޢYi\^R:;uH:IHHH  n`/k׹{@Q~1!B6vϏ iT:i*[7ٳȅ"Z. H$@$@$@As&Ҿ2R-K;N8ݫ=TX_fvQ**d"ηP;n"]:4^k.O̚T/EN$@$@$@@ Q8lt J<YeU l~^³VC$xgmLvMkfҤIKYk2sRY\D$@$@$P83];6. J=l1e}E˪E_ln-َmDZ6o"Z7yʢ%U5   UutBtB_֮eWZxN~?F}eO"+-vH(7    :,'OL(/ŠH߇cBq5 @.ytblB հ8ہ-Ѷ|xL$@$@$@$TWA{Yv-[c`yo'f۱B5//d2eJ"묳Npƒ @ : !i]1 <чmrF;h~W4$@$@$@$PiY_~U_r' :vr~Wv/;7x 7\ @}HO!Pc}mLRFZQ~cslHHHH2Tّ."Ԯzi c(dN&O@&Mmz?%Ku]'7xc07ϸ!   z"O=XٱXTJxl mlmkz{֬YXnv9#\ti$@$@$@$PG1{LY{,eIai}[Z6VM}Oc*_xK .t}q;ʑGY! T@vƫ=TX_fvx bm(TCDJg|2}R@>}䤓N6mHR"$@$@$@$Ph'l|L$!l3-*<3;\5 -پcvSV{ƌy]vN:t gu4{VpO$@$@$@@LYu_iTKx"C ˪L`۸(}/9Ӽys+ ui_i+P':M$orLx>䓲`R7رc "YhybBy5lu/"k1~5 AӦM%zO?˭x^tEңG`_ I BYh<1+(l!G~Z{HHHH lV+jH@e׶r*f8JvD$@$@$8 UgͶc}]8s_ cEڂbX.9a @T?*X~,^*%<X[߶q6߶mM$@$@$@$&Oã(Ʒkc5ڴOݧ4{    e4^!c}!Eg-V8߆B5? NF    Xe/?ƨ/dS_t_TxF;$fl1aHHHH ? ՖvhHx+,}eHHHH2buM}e+-j    *8_ʫa+IHHHjHO!=[- iE&1 @e/_۩N#1֗]d3T@AH?_y` @qiU\"S H88[mI @>l#jL3ϴȬ_ۚ?}$@$mWU='7 i@ EMAR"~P}>G!<) R|@U:$$${n;_;߹ߙg9$y1,^e'` g@Uz[+^^Rg }@mz[, ` `5*ĵQ߆*uǵ1m@0 @0 d-ޖ-~gjxeicsڔ 2` ``@_T_^Ql&Alm)JU|WH` ` yUI_k)*񎑯fUδz&!6cv~ys9']yK/M6lH333頃Jzj:Cw` ` 2Ж]vU齓DIJy^O7xc:餓G 7ܐ~xzz׻5c@0 @0` _n7V{_GmI&MsLҗo~3m۶-O|b:{$lt @0 @?Y-zȶijD$𗘲E*_|qڲeK׿O|sMЇW4;;~W~%^:~{Ðc @0 @0 ܬL-nmvɏ$8ocW_}uj&(yMguV:3 'N<]> ` :Wye%;-vūG0#{mPJHcR\دfUs}MN:n<'|r%` 2^˿Jfl94p9N>kk]n۾}{ZfM;v^4Mw9w @0 d/*_>~ijI91mOwnyvszzysKkt~~~? @0 @0 &Z%|׆+kIq: =f_2cǎDrIb-3K[nM܊ϒ@0 ^@WyUC/1}$*'AҪU 7I<׮]v @0 {0wa?H'(v Nkmfm3ϽcA@0 OCaj7Բs6v-k*$]i@eƍI2J+{@0 0@w9?pV:ϻ*mOkMC/t>?%}C|-ͬ!$~'xL햖lu뚿xx޶yyEnDUz[+^^Rg }@mz[,*VwWR6 0Wr.,?L$#?ȯҖ?ĵ ئJ<}@>P;]Oo6]qFO.͜t=VMOmӪ}mHSҺo`]<~ǖY9;ַ},j/ɉz0 c']^4&Ϳ~R<6IILٰi&3l!)$}^Q1Z)JqjK߇ sYӤSӾwJko\Zs#m65'IkNNo;]ӕg}p}@;Y}ի^<~{^7 /x0 1͕hCm%ӳ/~qE;ɾ܎Ds{;۶mKxgή *-)m~>mۖw7̧|/rO;5.cZccz?|!emwVxdossioض$|eEsy2IW\qE'2$wʿa9FMV9nP&!㼉6c&o0_<ҷߚ8?藭I;6g`.I3s9\uLUZuAijint900-??NwJ$4MBJGuTc _Bs ??ۗ3um[df=)OiZ icO9d\ n vw~.ڍw86x4}6?R6)IyCҝyl:c~:8m6MOIm'' qC~!'8xO|XpIJ>tcfИo|o౴6/~6M :+]wuar}¥ogUiǪ7čӡnO^VO3?y9}y^?<1]mτn>/<oK[-|ԧ><9vRB. o}_-˪jG=jY׿s\z߸/|;O>&j8``2D_iӭMm:$߰.*+N훞q<ҫtg?W<UVJg[ /1Ԝ:۹te9ξvki--iSiE^iW-?y}g;>8ol_E]w4+J:4ozKϭG? vގa|RX_j׍27#I;,BBi[<1zӞl%: 9sMϦ1a /}[+|F7;yU>t)>Ai6y}nY/Rzы^~_u3=L|o4Ӻ ܪnCl.8s?C5/n۶uJ9kVuC6N~|q7aw4hr nxg;V}aЂj!C0E& &Ĕm,JW6엧<Y_9*^gs4{t:4uUiפoHk_fY**s5[(L<.$ PV*/qMӟt޷g>M"Q80O'=)e;zЇ6o$rB#Y+\vZe7$I:m oM3_Mk<~j"|w5g>&X %X>n^:ŀ??m緾-oyK3Զk_/^*Ea?7Mկ~uOq/| _\HظO|Y>fx|+\[*8_Ը-~W>Ox%/}*m4'_h>O7bB7xkzn}:k̺|>ws 1SJ'Ӛkc6+rPٱa 8IR$ŕUSy5_|ѭ r-(#HWNozczޚ{w0}~3ec~f!>#}K_\d}p"po+!,C27 g64y>+qemq%npoՐlI^W3oxU泯Iۜ]w[H7^^[7,Ak~d3-ַBYu;aY}'6;=߸ʽufՓ9X8 ;wmX:&$X1%A#!*IԼ}dwY_<9DK_7H'aDGxAU6qVO)NrꪫHn92knPHX4+$.(܄$ >6ۿۦ/~COmƄo.ZW0??k.B{l⣴y{޳I|/.8VW 8NŸTi.XS`>lL/Drv6>*84IBLٙڷ4}[^񂷥;rjNPs4}]}CsaH\#hk܍/EF fws^\ Fc#k.BJVբ>כͼI3c8 p̣Tӆk0^}4k˜]ocِV;+I5MoʿaK+i ifk^ۑ|az{~3l~6f͖֏0@8fki?v\Z!b@al|s1>$h*$ }%(զB"w6UlΤmP!".$9UH~=VVXUԯg\X6'Qtoh$_F;Dr{u_iS\ອ߲J[Ҿ ohx 81щZڧy䁕g<vI ܜ Z.'km5TTOOJ>!xTŞ|n] R3i떼!/&)q^ܣIyw×F<&F{| !wGTHLya—WRX9˯>x%]Aė!QJ{.Y}[P.ZUt]sHD:m\_Ʋyt7rjGvڜɟFN4yo>?Ch—O~s>ď, ;g_VxALgXu_$ݓuWy 1]S-^>k].}sN4HAٗ p% $|C%7o]5K?ܼ*:ʿ[f>f|!o. oٮ7}77ΦM9 =%;xۛ>Dnfu|ms;u{]󭋕;8nrᙻ8yyAzPN\yo J}U]~XE[RxØ[${Z^*KIIy֧7cH519<ncDaj[ S^ c~x YTIB|ƌй xWΪ#֒0+|}gFI>Yb[q]4/!˯O?Qb qG-{;<uͯg:gr"Iҙ/ iMN@?wyrQ^}3y2=L-..)S%K6ɗBrMqt.t>OGm?7_i|Ѓ={N8sr0Q~(}:/խso-1.>t]66wy\{S$ĺnriIlqDk#FVJE{lzruڥc(Jҫ.HӁI_fu~}[w5y->tn~v&-$x,ʰ_*;N^jK8G+wKi&-̕X9]C[Tr6ub6jb]z) YIK:%L&WRn 7F>pEߔh*vxR` ``2IY4.qNL'ttNJY!]w_YtBɵmd:$:Ņ=`  p"yxnR thJyUNL+$ݻ"il}S /{m¸fsU7 fkLWkD9v=t ` v \Xtv7I~;ϋ?;~+9@'SV@YȕkoiD̛7u컰 ɝЃ` ``H0%c$lRg)T6#` ` vȟ<dR򯡉SJ6 ޥj.C` ` 3@T˭L*)U%)U' Zط}PP䓍:[N~!$@0 @0 PNUJPؔI QMNTx$$59ӅB` ` 1Iy܏RF+fx:aa$%.&K(@0 @0  (r':G}1 +涹G]6o] :6~|^q'hPްI(@ Ցھu%J4KI0]t lڰ`Яtxiõ= f f_f3S}qtm<ك f__Om籴ϦdO:}$ɧLIڐvՎeS>Fڡ>()`O*I(J\MվFvTYN,uN:_xz_}c\c\Oz}q{Iq/N~q]>11'=8=uǸ'Ǹ.z_}c\c\Oz}q{Iq/N~q]>11'=8=uǸ'Ǹ.W r܍|Mq:.đ*^G[ʑwNAI'e)4aipe@W}j˥ÆN+Dm>N!4lfO"|Yz/67bJ#fb~#)f}H֨+Ag#1TMZ]9|etaN]Ōj;K %jx\Yi5I>A 6t_+VaKPaʱz_?q8pf\_< Sڃ%ץoxn祂OlZ.<"). ~tm)5_֪ ;k#a'GR6xtrKJ޶eBV o6싣GV|~%+6b9IDAT6싣? 'mѱf^O `ħ$%|H-c\8 ]J]z̐\(xpXVH'ARC'׉rH:RE}ٱR^6PKp%GbNśdWY?'HW6IF>m! X8ĎN *$Q>I0Kw)K-I蒮kԩS?LZ">gңgt Iow"IFk;0M Kt=锝x{j?BOKAjSPƹվTQN1PI B;IHِ*^2|RNCiV@o+Ĩ6-{[#Mo8s{΀ԦGƙۃv6=:6ܾ'c$yOYW.$RXݱu#)5)vDQRU-H'(s;6ٕ!ewIKcN]jTFo~6tO?j;O?v#UWttbm+bhE!ȏM>II 3vPb]:~H&B"ħ|`!ʋDJ8φcr))1}m'll82 tlO?h_3gIױH65M0ʟF4 /{M ϋ~٫rȊ' ԡ8u]>lҙбvб$Ƭ%ԥgaӆR&3BtZ#8 t#]b'sD%ӆM:$\vLJ/ RȏME>K!碀B$u# "bN QWq؅G=tjS$1O6ŏ'|ď/O?=;z1o8W;]XrhI:@#ɦΩS$V2[9im%jGcȮ2,6Z'\h_O?7g>~|񙕺r|HkF~%G|!z_IJ֤ӘtuFpHLRݥn=I_X }:uQ` ` ؕ x~^Ƀ(Hi jqL_sLo|'EH.u%`㗎¹_&e#BV5i<4D%#iJˮM1|+][` ` v}$S:y EuVRwtOvRa)CR${]6$\J?%x]Ѱ:z98$At%-WO6ū}l5V/` ` v%+ʍVک~e8t{.juteijAD݋H`$=y;`$"=U<1a&RPCR?tG~trِ_u\Jw 6 䒶% ^* %NT&Ggr!}ՅpDX1Iv`"~و˧0]1Q/ `kOñߤ.+aS$l v:6{֩Mxƍ>w~~d:o't4/v랳`R9p)qN?6/czēuְRQ0mmvH`Ւ6цV2e˦lnj,;I5]ak6q<fkؚc\ak6q<fkؚc\ak6q<fkؚc\ak6q<fkؚc\ak6q<fkؚc\ak6q<fkؚc\ak6q<fkؚc\ak6q<fkؚc\aKue oy;/uK)YWZ}g[ hpJdNik'<O҆lKCWm S{]._ď0еtb'8~]\.)]uʃqXu[-q\w[ [_)1^OOW[MڬalP`vO.L/G tq ?G|O?].J?V)}xQ]겁CW5|Q~^-}LMSĨC]\vt"~@G]/}O?uyQM>ITCFJT3m\SިVߓ{T.] .eXe'(P¼P%(S90'KuyOI|!ݥtW{.KVǶ =Ktkm3HMt[jJ&˶xt_翋3ce?+sc[)}^IҮtukm]z飾sزN^$*)_Y]2CuHU!GlxJ|Y6jz/ؚ^z-m%;^q[/뎭%bV˺ckz/ؚ^z-m%;^q[/뎭%bV˺ckz/ؚ^z-m%;^q[/뎭%bV˺ckz/ؚ^z-m%;^q[/뎭%bV˺ckz/"vGW.)e*Fl?%aְnk o)Kgr~ܱ 8x]w|1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\wL1wŸc\C,MI&8$&]q%u ʶD*Zh1MuI5$v.RǻRG?` O][1HWeG#YUG-ҧՆUj\Ų^J5IbL𧻓,_8C@0 @0\&l}U/}̡͆DF^ʺ\:ˮC@0 @0psa 2u͹jSNrQ$l7Vĸ8쾕>9Tyj 2Uu^ZLq_֛7XQ,W*TWԎ.rM>9ݮ6"~_Q"bsԅu!n1fߺo9ְ5[_m1}c]- 0 i 3cH ` `@Wb8Odu 3Xv%yi0>!m:>` ` 6MW 3W3Aq>I㼍Ѓ` ` ؛,;N8Z_l{2Q[nˍDP` `  Xn(qLA@0 @0 aH6[BwKC` ` * @0 @0 @0 @0 @0 @0 @0 @0 @0 @0pdH5 IENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility3.png0100644 0000000 0000000 00000102407 12564151525 023563 0ustar000000000 0000000 PNG  IHDRFiCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx}dEv.Ir% %)(Jx`D'`@((` 'OEAQ@rPT@Æg:]=uΜ{7VùUŭpGpG`Ea䚮>pМb9/G\pg*|9]RRa5MqYۄIP8VbSahNauhnu ;}g:af;S;Naǯ30革,NŽ_g:af;S;Y:țLc< `]7F =k?-&4XTpj2l,ݖ N9Bq׏I~9/ꫯ565B|h$vGpStDL$&MqzeH;~OO ӋO?LbB^凶] zO@}XxD `lɥٲN?,ODt!0YL,Vv#q2dBtVV2Y7h' %C Av„4Uvz]Vei_k'O\֜U+*| OteX9˟J2]QDLgwCx\A&aX(UD%_qT)O׉Uˆ9~qɎ\~\~ZꈈX1G9Rc02AA} *3H%y1,yN8~?G<l$ן_?"-?HrgPˌArCWT*gEBd#f9~TrsiSt\?ZGD%-2-?h rï$a&51P&s hL:򣂑9иl3Oן-ٰ/GEi A5;FcCOt8p:}2Kˏן4Ccga?ЮS;O1 Td.(--GRY{{uzǏ|[\~TYEO Avа1S \~ԗyH]@ ?4iX5*͓>{qSOGR8d(6.?dh4 [î?\FPpIAit}# F *ɐr3/ҩ@K[ UH?'5D,|%~Zs:f2c֪*o21 %׆^8~-._P$Dɼiw?"Oןe{1 ظ[XNxP|7&[> 9 矤\~ (.?I>D{pD 15꒜WB6ku /2<`ORZ++?H򣲡/I(^2VrS壶ADXWc 3^|kc;~[gl|c=ˏˏO& Vg0s](gqg"b^.lؘhѰ\tmFpQUAgۍgeK~ / ڼJVdS#H8䕏A ן\TVotŔ֏H+d;, BgNK P쀤ٲN?,OX^aMeGZ[9' W%4+̣i, yΦYC |̢NƠLbmb_leeҜu#eWҜ/6.?*=ŚpEF]VeiNg?e~ D)FPAZk)OiS^|x$O^F1[RK/;g͚^&g.p@b.+NB bZ1ޢn+BV = xR`b Vol"m֨sk?3%U-gv2ɘmoLH"VmX['szXl6?>LV8?я\sͮwaW~|0d>]xJz28M-6$OT?_UO;3mO_?t<GcNƠ(h8MʥINx4sYEjֵ{Z-u_otY8,U!ϩ ób Ș?6/e`®1+:F#OןKT~զl:Vjq'S%&tp:知T~*wuW{0>SPAX )K꧌b9߁,%i\TCXNw KrW?(ӸRrO;4~\,c3'̑z/@{ka!S 'g!F3.:nz9(_\1r(!W_pRVNB_] áh)RP 6s- ύN- k|Kcs|KcÚ?74ذͷ46<3#HCأqG{(|頽>'溒WĜ4H dž?G+3p)} ݚʥF;= /ҰT^;oy[&II- ~ׅ_hmc qj=&y裏3}E& +*5_,_wby_|2-RZ^3qM4XrbbkFRV<1| iZ0L7hjjOw9sf?XD"_i1) K9/} hur9(:Өɒo[ At˔?j_W3(crq$w}E/뮻g}!6 pa|b< &&& B 3O>9z2\01[>Dcӵ|?B_>Kk&Ӷi K"LAX~#̉}˵@GpWk/9/W:[=/jc,6'B[` [ztIoHXR&0-J1sv|rSRnw?3f4򕯌q -6a0T0 :+3 rб<>Å _rSWb;S/ku-kOlھᥙ~~+;42tᏗ6nPNzh`vy$=NŞM$i>1X̸g㷘T"Qiv9B\ΕQ(_p S.nA{cI'ԵnC{o&Yq;3f믿c{tMq7\{^{mva跿~C# ;Bo. 駟LC_j9M6d`ߜ9W=&&賏xSw\x衇vTӮ=vyc%ڃ>8viR緾-ف1r]t_K~ԇ'xBҀgfm>яtb-$L4ӛ$yo}c?agyUxы^xt|G}'~{9s?اŮŇ(d>11R32; ;~2dLUKoC|#X"h -ɓE맟~zs1nj/^0f:(1iա!F׾6F5>O}{8zA`\ogƦM&Lz6|`3C{5֘׿Q(nЯ /k}& q]SQ~ug82ă|! 7f?OiJ>{aفHq8::w 4 p@w+Gtu~s ԧG>򑀱n.% <}{+XiXŇ-kY###`vi'{W<2Lђ?eeJH%lYsM?{|D ՛4م11+Je%-S~lR1> 8Qf8 N*1{+2NO2'X8~oO~Wrⵯ}m}嗯vac?D0[7`VXRv}}}ۮ?Y^h =6X+a&ի^5S.yGБv6|-ܢ Sq8;ZcmVUy|FCꫯmcھ+;O=T*þ+< iUh(?|ɣ+w]vyMzEC;` kVgOL>]v{)z/}gj0pבm-+陯}bxn-| W|çi=]5 4UCc, >)*ʄ 22?4$Q1 ?Xgir;~<*OO؍Wϰ6rbwV0vj'pB/w mĤ~REQ/p"8_uUjIY-& &ߪ9XwgXi4q\{nx/tP#H u2e+1HlǣY~С DUVYEa>!%\{+e^N ;ܹN!뚛#N46}I_ rϯ ! 'EyL LI"S")Ym:~h j!e\(|.Gcic>/Zǯ49,7VOު/v?j- vӟh *C#;ժH wŲU9v㦇#\wpV/II]J?/wxҊyḷXޥ㎙: qW1k#=i}Y'1lkF}dȑCgAkc 묳ZDR'90oʅ;O <^yAϾX g\5 QAe퓞N{,c.! ZJOF#})nh7i0z CYx@Gf~a9\mAg'߰83,ɿ29qsks5-mmt8, ɌAQJBQ$͖uzǏay l-%Ejq cCe]&^WmV=OG"57_i4 ~y3/tH'gD|JN &_Abhãg~(;X՘<~!rɮ?W"jȄ˲~,BLG~|Өp,LcL#|/ǰ1Ww,>Zaig]J?}p)K/TlCE_Ÿ-c,&Jk˖-ӆP/G_ 36zǰ^[-aw>@Xw  ugt2bbΦ9}2 عbl/ȝNŤ(@ ᙆgK(K ҤsNlYC9~9\j_rG'ίQ+XA>SJឝ?ީq;q7.у Pز"*niYvxNdbz1;}fiY;fi͒Nuee-"kbecbXSzӟjڼ-sIܵ/ۭ# ~`/p|O wpWI( f?ߢ_l` ϳxfqPtgP4|)Jt Ncjo~`RC0'?$?Yk?1˧2%c[nQAbJ%rܙR6b]y/su 2WF_L+?/ae! ]2B Я|5&˅#C>D[6pM/%?ACfoZ<ǎ%2Yvlc20'?2MNP,ذYR~ꥉz/| kc2~V銆q~Fwpu3h(3<`r7g՚nD+I$\K 2_6 n/ڣ|j;mD%L&Biҝ(Vvԝ'?4q:c ~E~fFA̛Y3,=@N~}J @kvu_,kч/^qdt?]Ѻ1a-#bV#ty:6&\g?:?F& >VF^*ʵ)<(BEF& $|]J F~74‰oF_|5 h/S.Vd9KB[Z-3YU/ *9~Ȝ1(<2Y|?Ω*~O~&kgilPcpGBBQKc Ɔ :F- w$(dX.46ܑailP,ӧ7/Olӛgo?mxt+~@r+fh&~@‰N&;>mMcp4 6f̘xm4Ey/4~M+ӸlYXNشb9o˖4~M+ӸlYXNشb9o˖4ky~I_/McƤ):\_? ,4Q&_vL )$)0e\ #_iDǯ 3OҰD k/4/q4T?] F%?V ;yq,c{#o)QwKMqr18)2cPTIk\NDwQW2c:DKPpR;dlۧq̚< M>Q]BX?LjsLqشdP|1r|#E~)ƝOe[]bueiTIN*VHZM%)(&@(gJ*v?\[߂3rTP. j!"YNvL)?V_dx?.?#XYqAD 5Q eL983Gm;R!~% |f2ߪf";~[gl|S ?}j¼Uԕ ~wa IDAT沿!E㯃ј1uKnǯ49,/_.?.?QT\wOeI~, ڼ\J(/a&+G< {ᇅ^NlN/c=bʊ+r-ӧOvɴ5k)_ۏu9}6 ~_MlMo_~dKyW?}}NSN\D\l.ٛni{z7qB/΀m/SX9})O9O^ΠT$ f2uy1Nk!&tE0m4:N3cci O mtm>(FSϹ49?`_r\ Fe/v9>ʛN8FL[OC)vy]+|@K/_Cn;H#lmm$mz)= kFBosRWҋ$p|q0_}<F/W^1˹KaN{\uU_/AY /?3gΌCo_'ٯx w}Waxxr'<)S5=-6:)%4c<s_j?Uflڏ:#i4;_Du g.LKi&LFtYw. ?vX6C恒sLN kZLeó:;4 T0ưcת4 aiYF(K +A[~?T.oo5 WUַFQNuR?O %sN7Ǵ-㳎VErƿadq:~D~$HoCoKu>яb6̗2^Br?^WO| _ O~ҽ{s#Y [zv@bД]{뮻Us>Oƌulpv7LꌥU~[ȤwzAҟ80觸aHI3eSC&Mqz2ϼ.[g>Y_,|g>Jr-+*:p ǭ/| ]?aT2 }u'OOƏg?ّ/&_=Ol+H;%M7ݤ?s1 cmߣ>^6h&H5-k:`$hkcCc>a|cاqW^yeM]X,>1%f/y si]eٽ[rq6k]aa]gqd 21OLȜkc~? ؝Gs̀yb}kfCfeE_~~O <{ﭲ'|2}}Y `?Ig__!S4,9 uN>֋oGly`7 ~‘9׿}S_* 0r'<&3<&o :/ۏs܇C@f*ox'۵w}|C:_˿oC| q k!D!BpɴNt>0cƌmنsG>mRgoK.bW_ڡ@$&PpLK-+=d[Hcm4'iԥ ׄ/f&\Kf" BaE~4PKy}Yyi5^i8Omo8B[裏Vo~( |{3şxS/K.]hdɐG֩q @I;1sߪ7N:9aMCw87ў|n,U&ڷT'}Ճ>Xf_wuvm7#*^޻â5G Q sfHɂ_483D!/akDIOcWU72`IJGA1 o=Ľ8Y{29'ݸn,0nFcR:]z5y 9He?e~c]]kv0\ď>>>먣,Ɏ3#xx*?#{Y~?@~)3\ /ë]t_U+~J}b LhM}G?ONR'w c0>zEx`M6ie?/ 4F*1!s O#}'=o}J+00JfEسD''_'<)C c]#/K?vKܱ0;uܭAEHPIWaVxN΅^b;-}hy m:=08xF]2BZȴ\ /£.à:V4&N_ Ա37qg=}LsV;~k.I$_ڇ˗=;#@&hgt=/4MLJ[MN+T?~5?fgw}}}2􍓾b$WXwuMlL'([NJ䡔'k}|L==5s\gsC'U;v8@0,4Nz8n'Nrɿ879WU "` a;L9& q1xtVlYGn ?2_$C:I54N ^ Lzl[i1Q8wPSc.08&Qo 4-sw~?w86?_1+ ˾ڧdKYn(˟Hzͧ1|DӰ+)XqgQ 4vj?I^鳔eV*43KybΗ%R%yefQbG4*::9Xbsc'f.⨶]CM1N* _t~1 v wgXW_!/DaY?3Cm ~(Yɹ_mӰq\4~%˝0'覝-N@4\ ezAwqy D3+`9el,mbĖc^t,u MAO[kY۔ xb#yx@ &Ƀx^:-V+򋴏ADO>uG ~uϣv_|D}.f>DjK%%>hk_&_r3'ɦy,y Fmd"k 0}:wTXO5bO~؛pu䜎EGK rs G يHǦ<_UIiƲ 'h@BOcw:;x_.nJ?}}p+wPFg _*?~T6XQyĎ{o'p ;I.VCy:^*i(gp^=]mͲ:믘/G%Iy!]c_1f!|ğe? JKb44ǫqOu< ġ{ ʞ'5Ǻc8GS/nR}cx B-$5 ztN@, l`ÊMz[@tqz0_=:_*y /GKZaT O ??t9X?ˍ8kq'gGz#q v5Lya<;ӲFz&LWkyE=I_OR}wKaqㅐ_aC|t|?x,Z8Qǡ'd$~_#^ŸG?pM?]Q_2̌}BǏt7mLHw0dqׅ_v˙#û^؉/"~ /Gc x!|MjO☷r3cyA~) #FHw9=?FW4`ϹN!ARy F`?qWǜk=S[uGls8Ή2e3NC`1>C?ܻC9Tf-z`װ8g}/lj<(Ơ2W(PH1an $?#Nwg!e y:oK bCxy04GWy(=eCc1⸙z`_'K㆞J_Ҏ$qGDe:ғw"븧E IDATCI|GzK3I? ֹ,%!V

?ڟ =5l> CPOL!؆"ӃpgyqQ""$P)6z3:o\{.؝ڏc'm4)#LP>H2mMJO޸I[f I'k: S> YӤXп$40ٟT7F sqi+GuEȍ_)? 1t7I?_:?Q+Ҕ_Q:Ҷs>{7wj=iJRGe7i:#CpI<\㧓FԎrR$.Lx #_ޮ@yNO0"#,*X/x>Yx@4s> 䭖a8Li-r)/e+̴g>Lw!PX~t.( hлt"?7p}f4ȮU]bd<]9PDi\rTZm7:rGb(m6b1>ӽ}?; c1tvc0D3Y ITѦ7v+/Ɲ>sy X8.H[L5&OOr22 ן>wMdd;p)ArFC7':Gd<)#6?]8& 'E+bƠҷ5NVπp"Cs!tIFʊ"净l(R-ce''?Q> Ec2Q*֯oÌV9㧼eyƆ'?f# ѹd`u 3"O/\NAA΂y}ccf1Grѵ ӗݎr_\rWV\+ϴDxr7-AyOkmg%  %F)*S#H8+.?.? ?#'t@)VvY@06bIe#X<:f" v{rX;:Ov],0JiWGglYd9=ApKMX! ,AKEAQ",M-Fʖ9}އG.\98_m\~Tzu5ƍ'2ҜNƠ(Q#eRjSPr}&G5Ghxgv뇯-pX$qYPi|gPUd((sӧ $DɻTd~bs#"N ןyᘲI[ŶݨseJ┤Q%)@vE"?\\ghxSZGb$t:& PtaEVm9SQ_ˏ 3}ha%#nbO;V1;taJfAu:g EPrˏϴBZ▅ʌIuRu;"pp-.?QFBRC|#?# ? whUF BeX*-_7=/ԔG\~\@ \fnx`*諌IlgP'd )c&u.'wzE2x/mUH? F?u`q# _:VrlɏᅶA₃BIЊc:}D`:~ 矼1#p!3rOן 􍮘iślgD ic!4[? +̣i,Bk?sdwx fyyt6͖E[^!4?/4Y4I,M,Ҕ9؂mlYӷ}8~̕JYG\WXhH+ê,],Gd 5BAZ 6e .gr\~Tsd7\fG~?E՟ީΠ%ƣεcLK Dlc?;4sM(tB^8>NQ~BiD"/c&ԦK,= .v饗V_}K^;\xgvء~ᇏ>_R˻xF5_L2%JbJy7voN!)y翥P<[e1ngF(:[v^ڮƊ*A.=5uiy>_];c{idr)R1] /;}~ӛ4CU6`^D~Ϳՙ3g'?I/<VL>_;}KF-4A]9g@68:dOKg>ogk @ 믿~+@&mdd$L>}o~/}KY޺Mھm$;~?E?KN\\\A Axf♅gmzn tTIܼE3OCp?s9g׿u364cH`vb׽N1z:j8 g?=ۀs?޾O&tK-j&؎[[+r͝(yZGj4(T :Z b[rwiѳ>:{;ȶn;Qq33Smj=C6/}i/xg h=?9:;ͳ>u]\P71::Z9}cqtWl¸:( 뭷^w$Noo#uQ}8?_O71*2@Ǐdg8J|rUWZ N8N;(bna6*~ö=K(`.9gbYXwu)NGR4spQwX\š~9V:>ť,iKYX?N dUX)? t>2cP3aTLc㺠}/Tz4`|8V}GYgi|3{_=xI'Y?5o~׿~tG?馛֙Ix{cc駟?>>>r5q^+{.뗿%H6u3fc`%&vOO.^NeNZ?O|`M>ÏCp;. >?n!9G'@8>c؃y" 1:Ēc98Mc \3_'sls9#>l;:fҔ/2B.;AuQ:߆3ݥ nNFiȖeC OFF:`c2ϝ7܏ ޥJSO5aXU_~- 4~~Lʯ\?K5\3;fxx8Yir!~Y]ÔϟA?#d؈/:#x2;J&>_s;yOw5q å(I3e 4/nJ8Jw6wL;`JYS#1c7_ :7jGr_nbb~@H[J4ڏeNO֘|ZIM}Ͻ9*.Q*-/?"S,kB'3YH2SlمAW"mcuĵϯ^l_Kѯ|yHU/DObve@:~?.?-p<_qj-14ز c$,PS|Yٲ47(㕲49LT+ei???.?jT+Җh11q7fM4g,"vzǏLO'?R̐uSOןIG.$i b4JQI͵cN߶;!Ƴ'Jm/V.?.?yqK<\WS^?"vE:mv"+S$m:,rrmDqQ$XgK.\b*:?Oٱ#9 FZiksAg?\(h ן-,\EOןk0$N`j4U.BtÐ\>w9~8?ӂG _?ˡ~h[*3so_(&RS 3l$rOs.?Ȅd(*{̓DˌAe4T zA)i֥Ja:sztRWI|<#|#!:1 pCy iS$Բb*%4NHfror.??T!_?|b36>1hBcwcJ^! ;ǯee(c\~2q#!2icN )Q~(v; )_Р\)G‡9~?'R'-l?(\?$_?LT(K9h j!"YX4Xg@8~!9\~G.1q! .?* R-ce''?Q> ]),,_Iᴜ Z;~e<Ӓ%?ti4 m2˳6<-nz(]<_;4U}QLF?8+t/i;ޱ(BwXmKWPc#* !-ZfؕeZ0Iqqã=&TƾWFC+ղIw2c0;7~bn<<.Ya|].j\0d]0^|iŸ,V/j WZ 뭻^ht8mI,D[z?p"7Ď k+Ƨ?ccc-~"$6l3}E!Lyݟ]]3M=atMqN4`|Bi nfrRV V%&!z^5;jZ7G ehx^>O&|(|_O^'op=iN7pE޹K;5~2Ů`9멬Ju sƛ_O^cT0pǐ>gV>uȕZ\;7_y˶.5#̚lGN'i<ē{_px'ᑱ?7];>/}Ǝ(pd}|,a ^P%fW!UA'SߤIwcgDY;@,. P5sbg>`lbѭs=]mg9qW[n^N>;_>3DžQlGOF˼b9?7z齟 1#M74u]5j+Y My%ީYĩ'}AL)], f믿>c?dF׾ߩ׻Cݢ8 =̘1Cʕ[ <aCǟG^{pf͚UqW8RR WSbY?8~9ޡDch;j)⥼kGN?pG0{l-O9kw}wO:l6Rxj̙3gXc@s뭷z*|+_ _~y@G^<ꨣ}ݗx/xбcxI:&d?e?+C9j8Gb#=]x1u#.S]v9+gö6/n#շ'l'\h7 mU8DŽi[9<wO |]=NV[׶iödaK3WcwwŠk}g8ZŲcH)(r[iN?R8(8QPrg_},.X_#>B:1N_r˅,4ty~s[~lN ^pnguVxK^"qm>쏆շ46|- +jeU1j~U̝1e?%Ǐ/d(dӸc[nent>cn! O>Tk#8Bh5e1W' d!& ݼ| x㍲8tMek$ <Ɵ|͟_DX~;4@ooKz^կq,> Ezx`c=Ęq?i-/-;6ϲ3copŠ+Dz#7~[cg}}߼(te+qReA@!9jn]Yl[O;`eSrMz?1ȖT6 sbb3/ѕ/Rk9^~] *)sGt|ԡ(J9_zh r\Xw1vWowINR,JXIEJR >HB" "D(JKr|(J%-[$hq qw>woN=3;9sܹctNndz6ef: 2tnAR75_r-Ng1}=zz }93g>\kՑ#G:/uI{Ϟ=ackej2eo>k:L֗GIFgwJA6јC 0Xן6\\2XЪ#{X y1~} Yfޞ4ww^z7;7߬jԛ4&=W|oy7pr<jM8R8PRɛ/l=,v;i$9S^8vsB@B> HNYr{̘rLCi4/A#Y3<ٝ>}=SO=ѯ'^KAɭLJzz*VZHp{؏|ĉ>:ꌗwA6+2/4j~guJ`B}fߍC;K6Oß۾6~>cg GLY/;enaiNO?] gkzW_Nח?d9Ky9]c 򜟶O ¿zR?xرW_MxgvQ:Ƿlm|;" &N-F?^շ)  Ĵe\*ܩ]ژwYҗ}՟~~տ+jOH2ۛ`p{sV[WO>_{-g>M &KTG~bVu?kX^7? ~6w}uԓ^6AtPZw& Ȟ_~?~tj~{?Ĉe"c#K!$GO~5%0n8Vp˲^arE6ڗ'M?;#μם۷tI 5k tOȳ*kUڙt/Tx.zAoX0KzbtgE4 ΧN?u)(ogd2eMxiՍT̒^ _>]ԏW;v9VIh&OnO:H_:R:{hOөK3lzUSf?K7VHN=? Fxzw/1KUc-X}x~jXe(-D;Puo_~˶j}:*}Twg漖qs2Q=T$]s|xp*J^;k_7'OU8ސov_?JGx B2{5`nγO)L {z$.2cui3J:ǏGIn\$atGCa"@k#pϿwO6[oVm;0Bϖ9l\ hV6iyG c"HtiX]bߧ޹|jС/+E(:u@mb4$S8pivvF M*KOߚOsz)/+ ڛ7_pHO>mREZQ8z7/,ٳgkK,|rӷ)t^w*3 X̺C [36 jZm с~-eჹ] 3?6b(fUG)U hE0o۪AV~Xe`(]і.WV߻&|Y9&nϠE' cJ%ZȗV%Z$7SpzwޙRyL޽{}J;ذIFCӕ 8Yuܹsc;+nW43H/bф>~vngvq~s3Xz_}p?|{t_Y9w]ltE?=8E-|qJ $FyTh̀' Aϴ_&gsJo{7DW8QGNOr;O/@i5'zha[҆f~tg``hNٹJ}ȣޥ b+椨 |]o@GB~3 ! (FS5Ɩi`Ҫ<9?oۉC.o0!Cj iÔ!1E VaC &hc yo R5Пvb $}h#y?zh1m6S1Y so9j@~B~Zx[ "]L~$lþ$%EtxMt'ӣAD-*Zn GοA#|guѓ7H~~~jc> # "g2p<76:{Ǝ |M0ސ/݁iL_GpѸz|<NW~~N'l4!gOSJ+442C2:pvD05H4u }$O +#~iu0t MӼG4ϫvϺ?̥/LNCڱ&-f\!c5 LI©;rA{鍕XqNf0{ '&#Gfe\Wռ-۔oVUʷ)PN?||5gJ "gtLbFOOL&aYCз|Iy(P ~ G⒉9ȲYe [-TrEE!Gmc-Vs>k[YrĜV:b5糶E!Gmc-Vs>k[YrĜV:b5糶E!Gmc-Vs>k[YrĜV:b5糶E!Gmc-Vs>k[YrĜV:b5糶E!Gmc-Vs>k[YrĜV:b5糶E!Gmc-Vs>k[YrĜV:b5糶E!Gmc-Vs>k[YrĜV:b5sv IDATE!Gmc-Vs>k[YrĜV:b5糶E!Gmc-Vs>k[YrĜV:b5糶E!Gmc-VX΂˪ʂAhEqh"Iv^jC#xzΗ]1}:??>yz_='Ns#q~uFvU8U@Jb~0L *3B6:Sn&9/_ܚf!~~~ȴf?|< }S`Ј D4iA[t@ @ .`wuSol=h  yx)yG^'|=###_!-"aHֶS&Fd{jȏU*0~_me3ak&Atov9|@VZVTGG.}8ѻҁN}@N}t_N}@N}t_N}@N}t#Q  66-%ia3z@ @ ?: OC>-Q _>d[I@ @ X_!5M @ ǏTg`-IENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility4.png0100644 0000000 0000000 00000114275 12564151525 023572 0ustar000000000 0000000 PNG  IHDRN!/iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx]E~.HF *ADŜ㙳1{N==33g Q0P̠ aW𶶺gvH~4 t[U-b0 C0 C0 C0 C0 C0 C0 C0 C0 UZnYuS`X!`!X/h:XW*3 C0 *KVbR~T5޾!`!*!j|GG.RX.+!`@:Bpr7]ϳxHbBNSceC0 C |LB6&is0 C0V=8{^0O-//8{H҅֏3rC0 Cɕt |:/4y/xC6ؑlIE'#Wf1 ߷}ߏ~V5?_N8[Hҡ:?dCLΩ*`:̺}__HO冀!`!H"*!쩯 ;UD:RU9%۲ѦѲo ɏ6-1&!`5 8RϷ'}uʺeJ}}2tޏt~Ї}-v-|C:oHc tC!r71Zt:F!ߐNh9-|C:oHc tC!r71Zt:F!ߐNh9-|C:oHc tC!r71Zt:F!ߐNh9-|C:oHc tC!2|xt9NC,Ӥ? *.벖Q.SfuK #z4GkyW{-_0JZ7M}/"74rO~k:ڮe2e/k?߆2G}bv~%qqZ':q~Izؐts*џgu|6ߐ'3{e?~?_FZL_~]~9HڧL|0~\R9F˾/sX_Rg!`!` Ѻ8~ ĤG21Iem mӲjǠ Cv%>ug'.ȓ_OH(f~@ ;dOແeڲ.$CoکC i:?> ؤ F2qlzC GXN}HEݺdc=I>I6/C $gH;?O~KBiL)n,'Ǖg#~2:agk_H?bti~?3~?vHwNk2s`Q\ˌu#ɏ:|Xs9$ʵΗueʾ^}e$[Y!;o'ۯ$n'Ͳ~?hOk?~z}si}P6RdڒrmEF/cCm1윳ꗳWeG6Bx~Ɏ{j'#嗓+_oVxE'æg2~EN~;@CuRIwJWCyN!@!/)p\/k:} (k-[ѹѲ}Ѳ}C(iOjk(2eF;r\YDPR.7g| ^mKWKK* ~YF$USfFk\~ԁChCl.?iɆ!`!O\M6< :岶E*wy(A:e .Ȫˇ8S~Ơz_u X.׋k 0`w}mnW^#%C0 C̛7ǿ+q irt̋L_$f~8dC!u'$Ss_fKf(g;~˳:!2nݺ,X d!`"Yc5d=c7Fh\S 9/ZG0kH~urv Y)}hG|iM8!oCw3gd!`L,^XJJJ6ׯߎq ozt;=S5 d&rH{L.Oa˚'v"B߮ːMHy͛ohѢvMo!` JfFC3:|R2K"YsI])gs' u9Tu!ly[n!`T_~$9QֳM q$p`Y YS6deI:v><G9L.SF^dM C0 @DGŬdp &$OZ3N o22uf#NtD:6ȡ#dg ef+חnݺU| 뮻>+|fÇ6l#kfhQF:H6mN>ֲ_wܹs? c`ۂHtڲ&HZR!Dy姟~Kfp޽{EUvIÆ WZ U@4i"g I1 E8 vQG+ĉq@ ')~id %Cz#裏/r#?.;cmgΜ)]wkN@t A2uT "_cǎ];+$zlzl}<!?7_*˿oGM_3<#~;Vkժ# (>߮]:VN[ UrMjH[MzK 6$ߞSϕ8J"PRNYy؈S%MQ $D>Z; 3?~xnv#A.b.wq4i$iˎ4a/t14"6)?vO;bԿ u?%YJ7C͵` &Mb\٥N;M |eʔ)3^:m2V=. h^h=tC\b|=>N1g,r9@eaKujGy! Mƍ8dse]v%S/؆66{ll X\pp3\0~kԏY+nYG"@zK~wa< cw-?[fkܘG,r9ȓO>[l!tb"ffyꩧfm:3k,{?v3JXE]C q$ovvˮ瞓^x::X7ߔm47M,8q>k?^8 7{9_\uUnE 9wy6̈-a L#P:urce[]=M7f@BA =Qٵ;dD,&dQmȑo@GOKE*HJCl1ԇ,AGYTGD-T`v37#e*M8pٳL0|gn[o-~O:(7{eo]Tߥ 9I9=6.`3fD@ 359 ƄM뭷B>9lf꾡n,cz2c ftŊ^N_gyplAdG ~t13g$>ڋ-}y9r1C<%1{XBXgn<g@=yeE CdWG*8+J h/ T󤃊,,aI'fH,;QFeNÆil< 3X" A"FfC>~$-%0[CB;p1Rx mb X 슟pfhӧ;%=$ 7Ͳ!}%ܐ~lv&!=C.n_~mnI6HP̶CRn%1,'2~?Aْ!P C$ B;sD 1 ܂ 6$Θ_Z7Wd} F)Ay҉ j/sᇻ%Ӊmƶ`lp"D8a6237%N,Ё !'Ne"r4]RB|V8!vH˺3҆P9"4P%C" : CXrnm zlfc< zPavUl~ O   j?2qH6,4aOt߄=:x.fð$1`fQ.]4̚~MXŒ =I$]y?'O yN)0I|=` ̦/x\"Hģ%c{;K/҄>^V6!$NgHrH`bIG?|+JܗQƁN"QF2s HБ(NG%CZ#Xr`ƒ&1k=1ܧe<0`$L`>q𰼄#03?~ԭmc }L6qhOLf_7!??ed>ơoHh>6Mh܌gZnlva) Ɖ] 6W mcbo |W >c+6"$ˣ o @t'1Ffp as~8=˔u%P^ZA2r$A:%(3 {ܒ!`(p"03C  -#m)B%bI15s-7!пc#' %lÏ2 eEe@O;s\JT@:чv 1bN2s.j'$Vn!P,JM ,ˊe>I秸]Go!PC  iA@'O4 +ReAؐ_?TļT?;g(E^tbB%C0 CVfI]u \*Aq eA:@dĩ 0 C)K0?@Œu uBr$:~(?NLiʑSF!e5Yb- C0 C '@ЅxFk@ >z#u|ʗ8aAPNp/,!`@@ c\3M8'ʘ uyR"GIq|߀.Cv!:,!`!P# '`I SO2D<|LAFʼb97NvHG](g,V~l!`!.@Ixt,cdԑWhDt)bFx5;N1&T^ǵezC0 C~setY#A_i.s!ND4ʤeꐳckEC 7 C0 C`F@s]&XFe(i;c AN tBw2r&v8n c冀!`!P i"w`QCPsO/d$`i/qB~Ǩ/s@ C0 C s/貏 cG9.%ق1'`Jpv e,3ϓ6!`!`T/4)J!t~6Ʋ:OC \de^ǃz C0 C#?s2r7P9tHquY+v*[5hOloˡFt:oʆ!`!PF 윘̤9>l Ch};V[j!` .' \}mY*m$Vr(t84;&hgǒ!`!`4yQ}_c,rk]85T9F 9=tpJ0 C0jd?B%!(bv9*UHCyNupA6[2 C0 @# 2tHiˢ*_ɦ ME%?Xw(dk?Hُ1: C0 C#$H= /∖iv̘Jy.ĩRpB7Eku,k0 C07$KБS }Hclg䒌,5Ge9b8dU@`Rh̚4KeP@Fvq-WHE^Kjb:̓ Їtez+iG#(kL(S?1[0 4s^LcLɑʒ!`UB_ сN׾lٶ冀!f&^"c&.3ƚ2!`@ERYNSYӹq?DI8[\uF(Aeq~[nYܔYioNQ)%̆!`$#L,.:HEьS4f KT['C_MUXh>Ȳ)lbކ4a3M͛4Mq0V<g׿rcpY phJs?lZzJ"NqB_Ay ҂ 6sOZjKέj"6fC( ~;]Ϛ'3:qYN7$]5мBRh/~rS3E痵Ɇ!P N:R^a =0V#p.9e94drn"> h*+ZOvnjh@,sy1eش_ ] e;uz C0 Cf!WL?早OBRUX;e$}X),YDpĥl_x.Ma~䗩0 @(sF qr&B!oe=PJ?l0袋owyg)ԁ9sȃ>(Ǐ`?/Z~u-=ZzLnjƇ?O._k?t1N;M׿XEcWa]v.z뭲g !`,C ;nY-饜 I8vUw6PLU6?c IDAT֭[ s=}1c2` ?pzꐆ._~yf((_r%2j(ewdb:/K?&L~i0A?P|HG: T:(Ӗ+~pM~jjE6w[I;cu l޼p wl Yɓ'Zk%?\ve!7ӭF`֯}ըUC,!:-3:ʌIWI;;Ta't;+M^c5 BiԩtQv[y3n;{L9䐌«*s%Յ%#<-Q]+T ~ 4Hx(}GY-Bn;뮻2nl6uGKN… /tޓw]G#.M>շ馛J׮]3c6{lRo`Y2izp~˂ *;I'U#C_pL<3[nҥK]7C~7d}^{-SK>}d5tmaYZ/ybF_~ҴiSiٲ\|Ů96mڸtMYoJϞ=m۶nĨCDb)˄ñ+뭷L|7 c冀!z#4ψ14IUOK*Tacf=$6W~uus=W3mڴ z}5'xï*]wK/N;$ b RR]3gΔ>@y{Jg.bX w>y9WI  apAz'xO8Q8 PI\aǬA4qaEuM6 ƀ a XVXef_h kCuc[W-fa mL?cǎuĹI&4a_~we+b $-Z8"3n8߿ծ][N9}饗9x-]s5|a 2HH|nv$[] k~6ƍg_:}&,盃,EŒ)[\cV ỀYv}@t q }C=ԑʹc8E;@,@w3_7lPP/>s`ْ!`'$q1.Ծ%q5dѣL&鴍:X)2NX" Mpk 3" 72}QPq1@؇ IubG|P@n0 M Z:n* RdPكYfyGwwq@;` }F>`?H*?P Hp AA@c,lv50tQG9|r3>ڵs6,_|b ,@Ҙ]~]c~FAX/Ȑ)~?e|5+{&K((6@G f\AB1YK!P-9I^2|?H~LB,YA;NrR0; i}00dr-ݒ .Hh`Gq1#a}wd {ְ )f}K'X7'|Ʋ i-@FkN L!At~=Dqe[o wA \pC>ߺځ }&^bC86b.{`C97/MY\ܰo aPS,%hBЁ(b9Oao3:!qlv9xf;<b {@0̄6}S; Y冀! :iGdeQOACJʡ6,;E;үԄ|3D\b;17>i˅+M̤`\p3Y/͝p 3w,=[zf7fI0KY`Y%8֡_ ff^}:J6k_.-Ҏ%g&|0.u`V_ңow˒~NՏm5>+@no;_M:kHu!;~ȳ%KpNcp)p+;2s4c Kr!N~GnTw22qZo!`D^"iRH-N-/&'N)17CaLc[T6,;\XfN^ndi_Ω\*`PYm1[n)h\l\"7Ȧ2s~̜2 CE=9/5A?ZO9)sM@eծ%Guy"9TCY2 C `y٭D7j4,k * ˧+98:)3H1 ,ԎnM'ԒuRY~vY`3!`dA{<&&k NT!B!S'4sIڟ:ʴR@ pB/{D(s1 C`"@~N8ZeCG1iJ1iinRF_gl!`58yF 'Z)>-qRqz4!`!`T_4Oqr\,:&ɯɯ04XRz2!`@@Z뗪ao!w} <89!. tQ%X0 %KdҮ];Y`A7h 8z'J/L:UiDb ܹs]u.\giҤr矗o6\ls̑zJv}wiѢrUjd4@Wt]:)l`,icN-7 Xx4lP/)-Mu.-]rwG}9&M仭2%Ǐ\1o<ӦM[.=z,k+2bVmƌr?\e+M G۪4B8dj?t1:dCHv\J4V{S; \rIV\fM6?‡zHv*]wS 0&IeL0V?퓄F\|lLf50 @ VQ`-́fkQ^{1{ݬ 9#ݺusO;S36۸YO:(9묳/g(7twޑ>X6xc9蠃d„ Ao<裮^؄}aɍ =X9&;oW~'#gvs4ݸ1Gv[G yݺuo~$[%gS'i sl0>_ƞ q;3?cLmUE3NjՒٳg:#fb7nK4Æ xaynp{03ҲeK3O>Y}]ꪫd̘1r7;{Kkq{u{4k,Ayvrˎ:Swf lH'xSygc7c)o̙.A&BU첋;֍߅ ō5ʍ 1{ 4Hg+ׯB dp 6k{e$[.!>Y( ̡1ZMХN'#~Y7;I~x70@ĩvڒXV"q>|;> =ԩ#9}cdȑҿLS:uLqQkԼۀ&dB @w ٲ5X`4|RII# Smڴq}mN޽{ fͰ믿v>3?D6.a)gc9F."9#܆p'3!#XXfN^adL}<┪r')- نC冀! NE,Ks7i 3!YB@8[[ou]hժUY8@~aì N _L:t'ɓr27.,3YfrfiUVu`f0MLI6XnxAh8Ӝ!N+$qBm5!`T\g0DzpXڄ}Cثc9BƆbv3Dކb%뻶 H6$!..ǞN:IzJ.IJΦ0VxA?h]>)mԡL9AZ!`0b6CWӧ۳;<\sMX? uz]5sޗ_~+ɘc|+l RNOg(%U26?snc;~q8қo@T^fY3tj@?_ SrxR4#:ʴczC"AjԨhܸ#Zqr-Bxy&a38@$ -ZY'M[n~{ feB5?}{a]tJ7o>?ՍZ}KH VM}͌ dˢHI6V{V|,7VGvGxcLPEQOAc!Ce8cK"&уDzK!'lJvRՂ_}U0CU5bw%Տ[8&<|M7u3A{-nf<q}q\|饗|Hr\:w?`'XI6]Ɇ@Q-e衣2lE S٥AB)N_t)ɏ>@lH+9$H!\J K@< /0wvƌXRH AL/"<{VfȒP%ٴɆj qCƧ~U_a1e-7 <2 <1ۦdn L-:̗ó|:uY=J1"gLY2 <$qQqHl0_vNWC92D\/A҆#DG}ǒ!`lMl~Xn5,Ku\Kq\vЁP9t2:.;DbJА.c/RWb%C#D9Cf!j!yA?tz+ɘj҃ե;Hߐ.k:C0 C0t>}tUN8%5w44.N Bmxo[׮]WP֌!`1VV{!fF 9}X03x'mS˹50 I8L,ԌAwTˌѹm&@Jƌ,ЌĈ%K)F/]*'|# CX $]5'q1"NIԍ~~YlB_)XMC.m&EkȲ&-w?,x0^*&O`9ta~2tS.{eݨ$eedC7R/-Jy nm}~RRo Y/\ VA=f/]!oe=P CE$ڨ[͙-o=qLflRsYZ\W"WGm_,_uQz!Em aFc-pϻ+b8ᅲJf;=eGWwĈ~޹sg P9Xt}G/d2ydN^{/LO>)Gy;E cH'tk3sΑnݺFm$;S3͝;-qg9裏z"e⇗<3>'pء]K@H!u4S|!?PڨCr>C,ג1H˾E5f^+=x̞3Olo]R6C\]vEƎ>%?3tPw$o7([SO=U}Yz'NvmfF.#U IDATu"Tl]z2`kX]Ò'|"kvm;Hl1Nx. b'a,M:Uz!iٲLI~QF9AenvW͕W^ĻN>dyw]Xֻ] [޽o!Ç_No8ͻU\ܱj„ ҦMu\]l 3f|)biذhݱ;W wm7u}U &k/ҥKor*0FO0+}^:ur>3$۸qwHf0+ĥ9 m駟~#GJLLR Cu84k,҆v֭ ݱ/0M7T>S׆gCAلiZǘ493%)YkR8[rjqS!5ܬL|^ٝY==YZlo)Oש­m98S/@Ha3fEr ,8Lo`9]0#*K}I1lX"c uf7H !ծ]l9gzJ+3U|7nɮc"-z$1U8yF' ~YvI u(Nt[5!`@Q93L 2ۏkIN/~%Es#qZwu>#܅ `IKnz w3$c$/, iܱۻ=>@t'M|[\qu#aO^-z-7swGhsVxgm hPZYvªHOƯRi*(B,u/So!`Tq¾ѤISKe/Ѳȓ8Jx% cL"X3c ״mVHDρznO3}~1.u9AZQ6}>~嗡jxVnC $N2jZM/qkAlYجRvmоnߞe+uVҳmR݅W^ҽ{wLDj,aP]c O;Yn~VQۡCqi6D뮂 Ix7m7v?xrK..2m2n̬n8lfPfp,aXNA,C{챎aE]>l~'\5~[waVOۯʆ@/7c<:|=#pAs8s-CG=Y ?,CGMDzK!'U]R2n2ykr{UO;XtO{Y,ax M Sc5HӜ9s\ v+csuTq84c 7~n?n,GJ6kco]Ɇ@yFH`qB:#a2l ]=d@~D=e?ف/ A~$B(q$K@UEcI![} ;찃y^l1f7 Cd!N3G*#']ITK:m!},7 "⃥'gA1;׌4%!e6CX hu?F*wyyl`9Osl!`nsrM*0eC솀!H4}4R ESzi4Y冀!FB C`e tA Oe؇T4@]痵Ɇ!`!PHCf-gC2\f@.C?320VL~<~!`+5ЬXfxrN8˺q=kɆ!s~J6-> u%ru)f2 <rtQz!Em ][Ȧn*W\qE&>h媫mF~W廽-Bwf^)݈#d%x9#ݺu6HvyLi ' ;wN;MΝ1f$<lh_~gq̟?῏?-qv-2D 8pLXN9A]|Ov#* [^zo7ܯ֕O>dsN~O[:\^yG~nvGjJl0 ջwo</O~<蠃_v[wu]7p=H]veJƍ^QFn̨2ƍsB[k@5E&yo N!_m'@\'2(i㵟DC:% H6-ﰄsߓEV{%RR?|?.LGiiȳO-3- \iL : if@V&*ASVtL߭޺cye?ǝX~ӧ-q7b۶m *c 1Sř jz!xO-Kt:AߐNi!`hs8fFdv 5ZWZ\p@F{I[R?mBO߯[n<yXĒ!Qߜ%H8̼Y2j>e@AٷAWTwhh!_ C@`-Տ&M'^*ԏGǩo߾nSSLqI-'̨` (A # .g͚ǎ+Çw{<lfϜ^/T~En&lnݺۧY"βOuʿ/:u]hvdҤIAŲ6c6˒!PC4p- ? neCHfJkKu+-[XAm1܅K^{nw1.2,mVҼys9# Owqg^" i< /tl%7N:%4,?V~l]ox ұQ]tE @=nvq!0馛\ܖ[npyXD IdTSq6'|mdpA䫸\f=e䔱9e(SDq C O0sףK^Jۥeܨd䘃H~Y^~L fS4? 1ۄ;q:P"9F` Qv3=NHAP%,3ϥ.5 `{{ ; [2 C`#x=eش_ ]ꄥ_NR_>.^M6 <Ua)Bf7 XfN^.di_i(\*`PYm1[nU@QPCXQxAmiY)aRRR|./V!`!`$к|FS|!?PڨCr>C0 C$u董%NI 5;xL[\=7 C0 FNTNˌ:ƤMKTay;>)>Ζ !`!P#g,M|J+UXY0/M!`@E@Qj'Bc*٪J C,u/So!`!` 8o@*C0o)Vw:z0Z_kGo!`!`T?|N6 ߐ/q u"ӈ6^jL4 C0 Nu֧%NlЃoH40 C0 ?2|3 6誜 AN "뱲!`!`4Cוh[*q;N~2ctkɆ!`!P=Hk#5bqڧ\(┶_9+!`@C !`c JiS\*,wìצ C0 C"yB(5b1I~lU%N~R\w:㗩0 C0j Ie !7_;Fs=/ǵ70 C0>' |_oHxu j{FΗ8:iD MT5&!`@ D@r CH:^S'@NA7ul!`t}tUN N~'X0 C0 rK^)Ah>ʆ!`!PH4}Jh8dj?t1:dC0 C$]5IxSA.qJA/W C0 C!̐?01Ze'#~9Si<&Ԇ!`!PɌXfhta~2tS._֍NR_>.^M6 C0 XfN^TB2_>U qJUaazlrC0 CxAhӜ!N+$qBm5!`!`xA?h]>(_HTw6P -0 C0'I |](>#z(,'iSRq 0^(W C0 C @~82㵎1irg|+UX^Oe:i!`!`H8q2Kl)J;aLk!`!P}C6m,ZHS0/^,B+YUS~MZKJ&Dr姿3/~-wpB9ЮRR}럴~ǂ&h.\(7xLR9r{ҢE 9묳N:U 䒁#䣏gQ>;u+!+%J\eK#@.w}-TqQ_7+<:k_;::8:x9uЇᓄ 82t#Rg]*QQ_ΗCM7m$puWnf|#Ӎ2uX(E4ZN5y#KX<*hɖ-'7ӓRQ1;]N u.TOZ'|>Yn$[3g[,#Uí|A/|nm۶FI~I|*B{!} /0Z0`x!oܤs IDAT7ސwQ7n7[# ÝO$Kjի/,(% Ldg\~%_|0\&4NB^CiߵA<#+w9 ]#,w֯/v*wc9`sȗ |2sTc K6˺Ik}2~l~#/#k}3w!{_|QJ\ۨ)5/2h$S,@2= 6LYgڵ<or138qL2m0ޟy&6I'>Ϋ|y sI- FK92|p瓌2+TfsiQkh4m_T* ,Y*Ԓ1Tc譗ߎ+?--^xT^z{?8ٳ廯P7?W..~y,)ڎY\aԅv"7n-Ҵ }zLNòO$' ,3L?6ꗩOjoLwJz>8yѣI w3g2wIΝݾ ʼzڙ)t饗%|mfdPK݊#kZ E ؗac&l"ƍsb-A>LGs2c.R-c"iްTQ,K˖#1)O6Xκqͮ>E3SIްg[ʕb{OYrCǼ:SŠ4(r5?nb3iD"|ke'qg*NO_!k=p yh I:tY8!ć,ϓƚСCÏtg. #SQrj }JӦ1_vq).reAS\ȝ/].8`!CHd9ҥݻ;_Tm2;x衇>h  6@^y??~{ҵ^+͛7w6)Q\R-ϕrg9!˯J-f${a?+/fR6ݩTTf5bOy|{)`{%\>yv쥻eߤEMd/o<ƎxBƌx\gtןeG.ytNv: a=xӤeYkHJexzqev_ T{o2v2˷kEm\)w܅:< ~,%͒!`# )fJի7ģ("PH88~Ikٲ>Jvm_~En&ܤ=O ewꩧ{'׿뮻wQGgힵ3cr9{jeAطL-Ȗ9,@4i(ujDGq4{U$k`/\y'tk7Q_+"tIͶ/̋H ͖_ǎ^!;\>/eɂjî!K5[~I?Lgcگ;KM[ɇOݐ"5kLNzIw~&=9E޼Œ1pf"#jגQ^QCY\ sR5|](>c(,'iSRq 0^(WOzXI uC]w]yꩧ_?\vygg(%<#7ߔs9ǝ@H`_xrW_nQ>3e2sLg? {kU`1/ .R@ PEUBxiZMԊ?( ZJ*-JRJZMq ؘ?w}kǙs9ט{ǔco9k5k ol>+~'>#O~{\&b.(OZ~+2pdM$$1i"9и3G>Og>sꪫz=w8Ϲ32/7> >ME?~:Ut2_\.cygRN!p}bw6\̗ 7|參}O}!طtpUcx3a{gWwr8}biCb,q~Tp_'{\|Ϸ7(  t,>{ӛ$Wo9n<kܑ#G_șjrɻ/871k#:s6yh >^ O}YsFC/|8q*8|C.(D?scU"g=/>Me |T?+7^7El1cB8<b񙫳_ՅzqNԒc;֛P'2N`倚T88Yȯzի_G?xۧ{¸o|K_;>k_ĥhG{r/}W]tp5LYk6'm㕿2pf`h y8udmC= OïsLj1C[b3mt0ǏO]riO[=܏Sa(/y>ic#Nl_fw;Xz=bObg?o[q\}&b}%<ۓ[{$Ĕq(.d>iཋDtOAKQ>YϚe׽ng91&x9~ߟ${#uga(:}96i>5@T n ͸\koN#@~g+LgO}Su]7=@?~&s)__а.9}oz ?3o馽~rPɼ1ӄg^rHߥn1oyQwF;;<^_]~{o|ysu۵~X=\:<kqQZʹ=q.~<ҟw=N}M_:|?κ?S;\sW=맘 wyb/~&9lcs933nfX>ۦܒ#lv6Wd_N Ms1Sow6NLLw&bqaI=Q?׾v:i' ~g `ډ'&.}$܊/| sO<7XEϿ!exR}1vsb*gjXAzkzb n#fwkzNg._~1w| ^0ḿP̱ _{_~Km|<"`\W|\EsƷ},bɱyKp׉ۧE :"gwoN|[ïQÿ| _[&K?.Kwnx_?~7p.w(|q ]?o/;֌ߺ}]9gEGW?dޛ1ploi/]6|k/IDAyTLRTr|'~OxQKރprM@ٗm-xѿ`Yr#!`BF﵃Sq', Eh"ߥ=7Nu`$?zdzXӟRkmo{47R|ňC;~܍-idc 6QNO|&-<7qji7lwrKwkӹqpps8~όØ3'pUԻ:m|o =~9%}Ȼc;7 h4bϻVn?2Wum';o_0>qI_ʷ_o=5>f%ng4E:>V&%2H, NZk,x>w8!x_^(T((Z7kQoÎmWN Eg?٩H/~Lt;sN na*h9yt'ly>(Co?xxӮNwS3>~45.XUmeٯc)131pXMp nzG-_@ BZa[$OS?Ɂ}‰m:OZX92B%p6wkӞPen1|ͧ:~lŸG^},'w`y* m;d݉ק)8FeTΰ G,;:^O9 o%~//˃ƃ5[S_ .x6}:􅧽;?q($roVnOpX&D؁0q, `=9!|ikj~(?I&?³aW_} S<:^>3 |쓆KW|_D}mΏGvHΏ)qY i#-.BGfb \=JQL~ie&Sy>z1*o8|io^7>}{;MCG@62^߇G<c}8E3 qPIe:Y! '\4nV'7#puyHoa"J,NDrx|nwIk#]#.Sq\z66>8x0~^]mGzl$r/q8ӋXl|-h㎓Ev.,r" v,GmQ,mO-d lGʉءu g>rS'#R832bDq7(k}\ɓp}G)އvVcjNVƚËxwڭ] ]:vgzˎ;9FHdӘ v@e3`Q9oVdB xf}Zڪ Z;,/^#ފ?v+unrډI렙@e2P !bNGy-h>1ldT*@e2pzf`>hkŷ0g=+Ns1>bz^ T*U#DYXԍ1K{ܥSo}9s=$K T*@e@FuFO'aK/~it_'=w9^o+@e2P8}3^bcoﰅSb8Y1ɶx@e2P TΌ X'ٗm2z\=hSƝ86}ۿ_@e2P Tά :@U?d~p3gZ8ID#֊g\@e2P Tμ ĺA2كNq$$nX#de2P T*gNzuA) ;&iQa ގ91qǶ+Y T*@e g Fp-52׾k$[8D3 6 q+@e2P8}3=vTSobq'xcQly9@e2P TN p`oŕ`-z }i;6 :811/ǘ@e2P R\+XGR/m\Z8A ;%5bۏaǭWᕁ@e2P @5A{p[ŐQG"})we;Id,n%+@e2P83ktݛ1~rהNK:ä:Am&[cW T*@eȀO{q^qc[Z}خpG bmqMz*@e2P8=3Z@W?9|ߊib N0FT>+Ց-ܳOi?1alWWuNO#/7[&?8ϲma9Nmalq[Xnq[,[[&?8ϲma9Nmalq[Xnq[,[[&?8ϲma9Nmalq[Xnq[,[[&?8ϲCҢDwo :㦮$vE\&;@A.";EUWG^3nB`f\9EM>pƑjpbLq|\|;F|uSÚ#5FCsG2ft1eL~}V1 dbĂ$-d14mءh߷8Rc<uzX6~e^Ƽ++fb-?Qw30AgxxWH&nQʉ};K84pre-xmqjuerp8lrv7N(M[68թᏘ|6F|1$Wy>J?~.93u{YS-^"{*{ ~E]lN7k>4u}c&nr*PiL,j&p|E7H6r6oonypibJqeg8q϶qJ㔙m)3?)Sf~Sl4N6Ni2m8eg8q϶qJ㔙m)3?)Sf~S>feIDATl4N6Ni2m8eg8q϶qJ㔙m)3?)Sf~Sl4N6Ni2m8eg8q϶qJ㔙m)3?)CzG󚬍uX-r"zG,n4\w+?&)ő .E~y$%W#/Jt8HT]{)IZ{ma@+W-WuMVZfjq[:bSkq[fjq[:bSkq[fjq[:bSkq[fjq[:bSkq[fڢkظ# [PEO3RʻFEqՒck6A8ŤYwB)tDbS)GuGO#-W] '7m؊zmY T>m[ճ[un=* x!C 5&-um徣-W IF[|ܵprAH|Y9QM?byH*Tx12'ɗV*Wz.zGL^Z?~+uF ]T%z"Nt1qz>{}.X́3Q>NMN)t#>bGF?y'?Nls>ys9_ů209_G掑9_?u)<60$7(hb/Mگrt|FҐ\frmiw.S`q¹rD. ?>wX/7|4b苖>?[jp#|r8s_e`.Gs_ #s:~gFCr q`rH-$-ӿbc"u_΁QNN,0bi}`]&z-ȱ$á,Н;~"=e0G 9O2|2Wy31/:Q寎׉DKō뷶zGnĠԱ \[\Yqe/-B w&i ;;B>)E[L#1tZ^+~Nw`d?3P=~8hH7m7s_܈ն(&7[MIδ[}.S|`SԠ.F,16#ig ,/rz: '۽8϶l3?z2݋lv/N<-'3?۽8϶l3?z2݋lv/N<-'3?۽8϶l3?z2݋lv/N<-'3?۽8϶l3?z2cvZ-kzˆuy#}ǒ98Mɹ%+l #<[uHA!'G?>8nǐ0q49+ksĐ$بGΜc>}1&3ǘD_z1&s1c9sz\LŘGΜc>}1&3ǘD_z1&s1c9sz\LŘGΜc>}1&3ǘD_z1&s1c9sz\LŘGΜc>}1&3ǘD_0R];)`lzcL^O4>|厓łL[?9!,>$*WAV*OZ?aѐ[[%nUi/˜zXmrIesNBw"[9 v$E9枍nsU҇5~W9YSY?ظ^|q_ڭ#S'_2[ ,)6N*N*ݰI|6cCM%-9RW[V[T?uZ026l7ql|򴕑8铋T(GFmK 'SW2VԵd')hpǢHGu#AG,ol|v&p}.U*U\  Z?u$v2ntuH}H(l}YY~$xre-xV8ѡņ:ݪ; u<$~vB ?ɑ> ɭL }k_?M;HR T* x V: nrѵˍ~)d2s7 :% Qka4 'cb,X,z&I$1 \,SGwҵ.>^b^ꕿʟ爥LSO?qE'۬[A ܬ͸c)r k ŤE'%pv849-iq,G٧zc962 oq[XU|}i媅U*b)VO?Kt:~?[K݂%A`r!Ŕg<󱏖Oת &җ^D4k]8)q}@QcB Š}Cضm9H/cٮuZXѕVn2:d,:ZX+ rl_^j( ߆&/6^I?H7mrĶIdp#,TCBFbɾ"!ݬ<cGʻ|_gRzkĵzʲW#u䕱mУ-uVnK¡L9.sϜZ81|PG =6\@gqu?sF9;S87Qʵkᙃ9zH/u߳F Y : vhq#[ Ezʸw<4y+k¢C_Z8i\|J&hNuQ x;#UD\c,b)ֈxe68MZFbpc ZW8Z1reE Bo l;-ǹöb"7@KO N>."'W <_xlx􀉫G:o4kHZ䯐s2V8Xqa3yQi2&N 9힁:~\ѳ:UA2w>ymF7䬬\E)g\2'fЈmӍUzg)~F Vb~Hr=+uVvOZ?IqO-c=[N_J^:6ؕ9%w -[4|xS&iN'sZXŷ3U kGs]crbL[cⶰŘ-,Dma1&-n 1Qoq[XzbL[cⶰŘ-,Dma1&-n 1Qoq[XzbL[f L_ ç%#&qE fZf,ۑ; r[6,,pX1e?cIbQf~c]:~MSnk&z_|L%w+zhK̋6]KF,L;cJ " ^GvOx=<@/O=|3_WzEc{^婇oFW{yᕿU'˕[Y+;c?d,49@g]{Nc Y:.&'9_^ T* Xѧ:t9$M\Bxߐ-nz:&“ˎ*7 70V3>ZXGma1&-n 1Qoq[XzbL[cⶰŘ-,Dma1&-n 1Qoq[XzbL[cⶰŘ-,Dma1&-n 1Qoq[XzbL[cⶰŘ-,Dma1&-n 1Qoq[XzbL ӏd-F_~L.ޓ~$Z{'cZi+Fn-1Y'b*r2e9>AZo7Wvc:~elrEoz2qlmeƵckg5yuF,m{xI%1Qq|ՕyV]t%&r+>fcw{bD/fcw{bD/fcwǑ?tvOg^Zzid/1z,V6[V\Ƣu2yײz-^ T*:;g/ENԙ]}IwA ^\w#lKV*@e2pt#϶3[b.v*J`-N79Z܌7V?ۼmz{#ŷ8=>fe h8{}i uzXϱpWVdzFp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx]%E6;D%9?YI &@1J # "A$%(JT$KӅMt7o{:|]U]ݳ$GpGpZ*%#|If%lIct_769+F/qsr)F۟wvK5IAПL UB`%6=!ҕYwY(e̷tei/G 3_[Ҏ_9ern?SY+G 3_gq*K;~af,P 14~$]~ ts=w)/LV*:z [?ןQH~@1l~N"GjĸG⑈?t;#g3QMV dӑv #ןA) c+~1q$=}6  ?`0Xh2y?ʇ.?& Ů”5_ˏlVMbeJ=s1w}QgR  EeaByQl;?A<ǯSk.?{ $+"OrGO(ʛ?t0ʸ:IDcT($|f!8;xXEnl π=IA{!#u #3Cح0a T>[R>"\sVFr |#"s'wXAQ1=G0䍶*,)I(Eί@h㧀@\~Zv?E"Į?$hʅۏ>QF43W::+t)-3i .ˏ*Fj'@)#n?~6uþu`3(8z %C3QvR)q?n?~FG? o_?s맯A9f@Ng TK7H ;E 9h*e6t/ , |9?p?G ۏ}pI ~ _?|hĴɌ,ZU-Z4垵at__Sst),?Ae(<4xv?"O*ן{1 gM۷>r~.TeO4L?Pb=~tiu"}AlI& *EXvƀCΟ@CwFRbubC@\T7%I%'+Jcu'?9Q9jB m618㧲eeƦ)'.?f# !`mMۏLP.~~w  "e%Nct!(:ݎJ_F\l"!n?~SWlf:Ϯ?sYheq/8 CM$\~Ȋ `dG n?~(06bLGhAbC$ 1cmMt9:BHp(`T *iDEA!nP/M-w~(َl?_|q /ܾ6$mmIVƐ]%c*OK4L9L8TO̯?Yg6L>``ps*o~PZM3h6:w2?VbIcel?@̡344Ty衇wedxtI¢@[Eq,(IYg#aI"O<>k Ky:}ָ-fYHX%l1;OIeM)I{*Yp`!5ZH꠫$L%MIw\o?$(H|9_LT=b(>k,|D\+()w!/5.?s 먶'SLIz5?5 D|jii-Zlylzj|ZnylZ˧[[ŖǦG{}1P:{t4&}/K|R$yzt'uU!NtןVȇh E`PӧڭY\q2/ s{m<@ʷ141 8!q\Xs5볢}E.8 xcb XYO^xL>&%5J8O.<>_{2W_]I cysJWe|קԓ)Je#M}7_59C}~|FgCF2X'mjgGoVzzzE`g&'ӎ 0G_3׀&S'bgt:5inIs!A˜8~јnh;S(rq>IzFO?]}'IK.[oLomHz0g2<29{t 5|>|7DKW&?ƛ<§+}?_>K&7|smӦgDEMKgG7q_p0Z`#;oJnH70|z#yu$v>,/o `1w (kN~@BJLƸ(|}L;~Fv|'OnHߙ"tPׄ ?яи)4,?9AIm$u̘J{ߚ#v&wr$￿Aַ+X)X?e 3_oQ{g[6-MSYA$ġ^In%ɢKCM~er}0ikt=`zy$=SfNM%y>1X̸)g7几HKAAlsf3egm8Cc#GpPjA{cI'Ծ-[mUwܡ2+z'c 70aBkwmEfmzVZi>Ay睢GuT-~EulW_}^aGz.Џk%C_`W\qž=أ{d\ +tqVlG;txSG}t&Qz>h'/bs=:K/);pt&Iw5Ƙ|cK?Sc^~eN;픬*>ppV[MyCmV>O'gwN\%+r£#8"YL4ux9 42/F5_'nG\&sj2}A * >\a">@(Ł.cg\tg0AQVEbt. 9Œ<E,oL,:yY?;9#` _B ɑ>_br 'v'::$p@կ~5ؒ{.%LxԻnI?u,Á絨+&s=}{Խ $"Lт_EEyUD[vO'> ٛ<َ?\]cbV+hU%/<Ъ9b}suhFA**ULc,6U'ri,w{nG?ui c:Oa$hth=y 3y̘K{+eYYʧ^\ruM-_ңQcgwq=դKb $8^9ʴ#Jd< MCo՗A%bl pey+ iEPid=1Ɠ;wU_ 6~-؂^;Unlޡԃ)ժHwŲ5vf#W^wpV/Y4H]?-wyҊyḷXޥ㎙btXF~O,c>/ KFG6a><04pz-c} lGʸwy晲Ⱦ?֓o|G~:1{YؾYT>w_w[_B kE1y#$.T~@s/#%??UeGw& c(LlT|%>:@{'>oN ?q[o-8xC+{r☶Wǿ0aB 0E : yz:[%*?(~:65OA5C]v%OMaL?A!umCM+ǽ_m}ם;>>3͘x_"RͷO~o1i-CgL+{4;.L{C~7 -xh2W$۲Lwuxv%W&'l^`um|λF;~sB0d(QUh$ &y?ʇ ++,cyE*v_xlȻm5X㎛cHʮ:u:a|9ۏpТN (#67,_Hv]g ]=&1X5fSWgw:,ãg~(;Xՙa<~!<~xٕ׾l& Lcb l(G<埚a]4j; ??#)X/acܱLb '?RZ*9ӓ믿^?/cنIϖƖYLͮ{P~:!!d6L2Ye-%= [H8;䣝 lGv돝+vMmRT 'y~3? XCT8@\'u,EEyer~yʝ'a:FŮ`|ϝB~P…dyN#މc   -(bQ//eWxIyct0Ai혙y4K>+Es~@̕6~јH ʯόǚ7-Euή߹]zKfd)7d?pyW&%Ͻ:9y <ߛԉ̙Y !b LwZٝA9d^\|f+A,Ӂ8F@~u:EHODZAIim Z*O$t3m,/lMC|EyE4<;O5Ma=v!z'wC}HcHG7aZc}ioې1r_5jZl;IfMtPp(4;A2c.?fv:@S/ |[_atGǘEnq,8;?\LFwpuӸ?u)2R0oxx ^Jd?8:.?F $ >6ڨr-O;"%I7EF&c .%9^j<~֟j k(qr,N[Z ˨J[Z-jhx?Ot8y-x4tN_WO٠Xh ,MJ-M2 ,MJ-M2 ,MJ-M2 ,MJ-M2 ,MȲd?'6xguVʿM쳷7 7fMLN 2q9_i7Ώw2F'(Ȝ?X|+3X0aB^oy{s\LYQ2Oؼ<>kliy:}ָYcK[E<6/O[ڢtN5.yy:}t%\5S,tg_?|02Gq16DdgHN(JzH˜ :~_P\~җZpOQQW`r%s-gűcLwI~~3G0-oW _?g`*9W@m Ҙ)N=VΟ"D!6ʟˏpI@~4#_2O_,\?))wtRI04B7o*09?rPG25Rןpy,~A:ƺ~дXt~gPԋ$FcyS  \~q]G)d1q! ?$dEiNd''3*G-;V"XWcM:ݪf&;~*[Vflr n?}Z¬ϕӵ~0{ IDATw߶!dyiFZ:N .ٗ/ן*nKlF3gn -;,.D:@`:~ 5#p"3HO* x%mgtFറB$:G2aee 6Ң 42X;OvG@a󬬰YZ9?Ap뽕ͳX FB>˜ASĢ(O-FhyoHV\~\~D. 6?=ŶŚpFBVEyg?*Eq3(F(yԺZ- T?ssqQˑn?xDpGS=F\~x;Ҩ%!%jǜ?gP? #FG"[ YIwz~\*ǘg._3Rm7 M[4b?(O.HϦ^lMl4aJSsXcba VV8SXȕˏd p\:Xۏ.ti1F$Y ڊ@ph%zF!m 8˝?E.??n?₞ZO '!C ew3yԆsF[:Z+i,x8~E'ȈYTj\ " tGcziAZ%yFsJ4S֯eOp›1j*#.??n?n?S6<|HwG}SKUhgPU*!s;QZ;"<ˏ$Pc~vSqqs*S36=WyW`xĔV(3 .g-WO}x=; .uN|n>v$u[?_`˳_D`F?)eNԷLȖ#<cyhF.3z=;Sfm=O;O~ɤGFF`ɘ4HF#7Ɵ3<sZVio{+g]>?"7ΟՉG"9?oNd^O2Y1CCC Sܚ2+Ws0'( R-$c9Ο߂(h0aB288l=0g3K-dcF^8p,kzWoV .5~@_qv?CMGbTLV;u2ȧ^:pG3}{jK/t_o0ַ7dĉK.0ucZ̞ڇygvtMt+YdkxW\q1'm<@uV5FY%E]|H$}!~=G?ёZm1HW^/Rozmdvɴ9xV1_u9:o ~_ ltn3Ot~)?:׷uN?veg˙j6VZ~W`>Oh<~5\SNۊSsAXLf6my>Ο}k!& y2~ɸqvjF 2fY-㓐7O9唎o}[u)Lɜ+zk ة~  Nev9vm^{Meqv҉w}wi嶍7޸.j_`ĹDo~lu&~u^뮻n\}iꙩph;n:3}Iۏ~. Ɣu]+cYCsugto?SG'>%{7 Ch_~owO?<*Wɔ)S*w\K/!hW־v$Degs93 -m[i< ;CSC'j;vJVeO b<,Kgo;|_1_0k K<=o/Ai\J07dV.qebѬhAW6'HaR~b /g}SqKJ, t9GAnt{l w9bg.& l|px'}0vtA=&Les`G8;'10[_VgIH;BFOmƜ?a~~M_d; `b៖ 85 0g#ghcC&Oq~2+.4GǮU cnaH3āL2<&(T u7 f.opX>Ϻg$qa^Kx"__;_~C}ƴd :7<ߘGş;:{w7׿+26~֏/| ɼ=ܳ뤓Nw_Gߑ;(d*r70R2сqxFm{7 ;z[}E옇Pv[?u|OFXYftl-\ ߚ6$AV= }cDZmS~D;˞K/}<Wɓ'76t'x>acnm׺º;9b˝tvm8Cr\n\Tؿ}ݷ W7zW]uUL㨣nv^2;Y'9v~G~rǺ9̄DǨF&Zm`zwP/'+Й?g9vۖ[nG!~eOۮ%詧5*Up> Ɇ7dKJpӎ] &ڜ;i6}c]lyu6$ 7cBYlYY'3X\ZOvZ#8ᚑēkcqI: yEO_+b0cXo!1=5>q <OzFDpC /T>(h]ve?).u]7 zS%C/ Z>XFZ e2V\s5+W*w?`VsP>1&tF>?GoN8R'wCp>&zE;dwWle26:%[Co?$`pGoY?pO}S?qMS2 /2vǞdy@(y0ĺyB R/'ph :>aN(cE}#<~7G?P<w-B[AGw }8裻 QwH v_vz;1p^EW8אM/{"?LC_؆k=s'$ P.6j6Ң BPO ~/ʣ'Lb21Jg;zB$_!8?aU[OA*3>icZ8yr}aW}nN];@|~t7Sw'?v: / ~ Bgu0WpU*6Ti谈iEmIv{ϻq\y\bsδs G +t:u\~Pֱ#V뮻v"!e}Hџ:?3~Pz4Bkn5sT ;RaWgx_cl8v+l%q%Xc2A}؂>VT&2A9@YcX۟Z8&5| :<yG;b/45| 0gqqGwC<||i̧b>#øO\V)苴Ϗvx*:_<`G:a;L=&]]] &b!H[9ڢ<rf8~:E]Atj&yufw>XͶ[Z1r:,'O1w(uqn[O0saf,mE江Q,3t,ё,q(KE k8ʤSQљ/G2Ɗ=^b: .t U69yGtHG;!Te3?(0%L y9'ο:7/ {v 0pbcm!<58wm:1sǯLp`I'8ݴDE1ۯPaxqǘ`ctḄ3gI_pdib?eX.pչ{| $!CV)(z0QT& uԁm_^^} !}tWM?-D` d8z{CGoCMĶ^/_AK2y(q娪Qկ~5k<~Ppe~?ھ¦xd-ReΠvIfL9Qё܈3ȸ,`^4 Xd':>OmĜsp=!pcG,GhS2npag }mئ3#E(*#᧓#7J ɷGcI'wa,{p"Kwttz }A+.$h'k9Ta1*dqb >A5$e1iIyF2auFY3DgŲȢ/uQgRKոBތ}=#t<.j:/VD~9ȶC+?`*?_d"dr҇| ;h2e&_/F&ь;yܩcaQrcbg0ywΆx .d sXj|QF;őD;\W<^NvXxp vh4F2G~SsA iFe&-IƁuqإ]7pGa,G-\Z;H;xD, ĶÖ}X%0GukG\xWTXztN, l`ÊM$z@ a:1_:_*e /"GF(KJ r_?W:~}qrB:혇qѮAapTWy. ^m &_K`,"l8C4}N,E~ /S6<uUQ.QI20O~;}ؙO:aNuNxzuN8/EĬ)2ReQGϧ|6m3~XC>7ڈ}vȴni=CXT{0}ǫ:qX{1>/Cc;sG8a⥠_J 39]/bqqsɝBoK!8=XY_ sO-:?:`^t/Wwş7G_Cnoý;qh(?#ʔv ۩'Y(g~q1U>$>/C܎ ;H~T@L;r |t4/t4"rξC`Y~>`{WIVL;4ɆKfځ~~,~(m%va ] ^~h݌zW8; 0 H-0Nd^"B$E* 77:%GEoF[_w!ÛՑHyF: V ,?$}3}"#w&նO :oص6}EG Cԃ95 tIlsnZdv<>͒1j)sI;y2m12!/,g?/;1,#)#ѧr-x~ӓ~\e]--l`> _ЎdqGD 4]Hp6 IDATP2;_oyFI; ^G:Sdwd?Pw^mEPAG/0qE ou#8øYgPC0- w y4 1<o0 EDb8)Δ3M[~+DfOL HP:0GS_mG!o ?wSYp)OcG9*ӡ7mM?4EΠv ܤډ4 |Z#8_6}n?Klv1 I;1=79&ljf$j͋o矝?sy XgDb][o_L>9?oӑ+_ۏB.sC1>`eXn (O u x.??V&bGtl~#=qA`OV2A%ҷK:hP@8~A DRbubC@\T7IAɊXrqONfT3h(!+p84^+Sٲ2cӔ\\\Re6æYG^&(n?`? `AUCIJLھi.uBSqȂ_ʊ۟b*:On(Xi1ie((yah?i0Q|Ov1#p"3HO* x%mgtFറB$:G2aee 6Ң 4w{2X;Ov@a󬬰YZ9?Ap뽕ͳX FB>˜ASĢ(O-FhyHV\~\~D. 6?=ŶŚpFBVEyg?*Eq3(F(yԺZ- T?ssqQˑn?xDpGS=F\~x Jj 4tsxA!tˏyՊ4n1ln?~dE$ur3c<~Tl F:CS,-:yO%Ӳ (!vn?GD%#Mn?>#.@XBeuʭp:r+gfgSGh[Z? ,saw"t͂nt8ΟEg_?ˡq?4-M9shXGQv~E"?Y]N"n?F-~0~L *jY)ҰN5ZZ9? oz_ƨ>LP#sO5.!VǢAV2P˜ASĢ(O-FhyHV\~\~D. 6?=ŶŚpFBVEyg?*Eq3(F(yԺZ- T?ssqQˑn?xDpGS=F\~xw-4tSf*+kZ?)Əḽλ\a?`G9>!9}'tm/D& -La34oq)z饗㙱m_ҦkLc<+п%U9΃:SNxꩧb*w][;,rq>L⦱eڏ|ʍ.?.?yqiE v c(:0WUR)~YhYjnh;e9紟~/䒎[oeJxQGul>leein}W_}uf>7|3rٕ0-3Y>h?~:u>`<蟑Y~޾Oc ^2΅)x|5sVGFF=#̀]ѧ){hr+鍊nj}gL9#w}a7/yh}}饗XG)se``|*;c XTo8~LU~]~G "CEd3/?іd"gPʳYڅ^Yf(kVzqk!8:[ƿ^{|)m馽+Bnօ>_.]/|Fmԋcgun[qu,uW wa'V+JgUV[uU{n=qvcGydZkշV[y睔ǮcB,XcW^"? vɏS]_ fL3\~$oNvSb2ՑQg5E!Gqit>~p ]wݑ6mD~2ydqPOOFF䏡4 iX;ظ:MBog(?MplLm喃pj3{;NԢ.* *]tdV vpV/?7܎pkv`矯,֡zU&L@dz?^~e_`O؝cvvwyeovWV4NBbq;=Xeάq5q\;;g#*OMq`дyhcq  ;O<ʫ}viIZҎ_flho<"Ќ JMy[WĠ%8Dm\pAvm7X\TG 8Q |!Ύ */=m+Rқ>7'['pBW(oȵ裏V aDZ~m O w!q-گe«}0Ё^oq*kf ͝Pl^Z+]]]z]FcvF*{Ygpd`ʏGqQ7ʯ)wRvqQ]E#gvOXQfHa!?fᐼ:lTG5ܗSG0LoXhlr-WNk9{:8+rUW]5qS'6Ez6|"O?t{﭂^?f[L"J!z_b]xnuvv&?.%O}S#A;䟍뮻'ixǀx :e7?pb뫭Z ;  z}֠c Gt,1/8~FfyR^~b1uc =Ew) nL8%WMABSƘ8["M7e:i.T/̚ɬۘG2fc„ 8CǴUeŝxS+{z}8%cUd~¯7l^nh'8:6QGG}g{HE }.~mG,CI'484 `W~V¯/C=tP+і4)9<;?!G~*@a3?bdģ.ZQ*ʷ4XFǞ€h+OKx %7nveZhhG??&G'{GO`O;v-N|2 HحL3k21 yǖjT4G?.q~Ǐ8Zpy&|h&_^WQvG=y?ÿ$2Z~gy1DE4#'yvq,I.lf ]%͘47ږ'l1Y~:puj!8Wp"L_v4'ZYj V{dڟm~|Yq d0QrHp,mFTZ:f:fY y3aQ>0[/ޙ:~ ?`<[ʿ=c]w41ie-7_ϩ 311:W1IX<3YQC_D[F@`n *<t*Eyx+߂ ̳,25QHBpq6ȄG,s:n?~r v3d?xobHj 8HMc߲;A\~ds1ba n?N0AH7~fcl._RIKŶ`24oҨsTB .?- "bn? n?zSqH4c))s-XBeCgEKxʍ"|F\~wt\:Xۏ.ti1F$Y ڊqQQH[wF8Û<˝?E.??n?₞ZO}!̼}j9BiE4<̢d,t*5?p~Ĺ#1ΠFV\\#n?R~IpSEcZ?D @6"QYZw(V&YZ+bȂ>R>l1w3(cjXphmQ7}8~4JQˏˏGVXHB(ª(̶G(.sň /tZWe*g39~.??j9G(n?ӣ?_?|h"ڈOΠeƃNcjL0?1r.?F1(QqtG"]xn?' ?MA=|+}.e-}c֨LnT^\LWjy;rT\p~NpG^dQ_?gtTT= Q/5J+u?d~ m&;GG)7Ͽ>t:RO E9B+:h>âݲ p?%Jk Jy:}ָ-fYHX%l1;OG’DN5.ay:}8$tq [Ƒ$gKbvN5%<>k\tq$,IYg#aI"O<>k Ky:}ָ-fYHX%l1;OG’DN5.ay:}8$tq [Ƒ$gKbvN5%<>k\tq$,IYg#aI"O<>k Ky:}ָ-fYHX%l1;OWiژ>;E 1J3FbH9Z9+agm4چQ:*+O,cy9Ydmu zKpb07"0=;='6?'_jAN2[NnQӼ?-ru 6(&ؑ^F"#hԓᲠ#0#ٟ{]wG4T;leYv# UFS"xmK(,;V*igI~$7Zxg;L[Q7g-+QC l|璯~C=,rd`` y'~կ~%IGGG&ek%M[V;Nt'F,?ZmݖO$뮻9G>{*M+ͳY]>22 F|(ĉ󟙹o[m:}e>OKۉ;0Ǎu]ɲ.+51ɡ|s Y'ޗ\tE-G5_?녠Ee$|:rk:wqGKw' &$SLI7<;yY,,?O(o):/q gwLWdև|9Gk)cCB`SG50]PmA%3StOc֌`if)$0p饗SF&OWZ%4-(j<2.BtI;e!s;'pǑucܑ뒳:Ku]Ũ+nS'h4 nIֲG+O_բ\z . 1qyfzmȷ?#O}Jfmu5heJ7heSg_uN;%{nra%o,>vi",yɇ?QO9dE}LqXBcV|# , 4_~K_8Ɣ |QK8OMx z$ p*?ŗV~"crKK/ hlڦ [i[i)&Xhf[t6SNI^{'?I̧~eF¯8Z֑CLyl!țb6m . ڊ#h?v@F4fCg ;)4hD:aDžF3h-L{1w&}{moLVXay`=SA맰Phn;y&?i\:_LA/~QTZ_r뚻{puǿ4'ęd_Oo,o4|#6Lc',ꫯJt/H!oܡ[guȜms7;7p{Ha'öq|[JBAL03{ח_WM74Yo>;擏 qYeU7)c|K6p+o6:__įy8#~>~[MY찜?5\39O~;.ĂϋĄ;=~pr\Љ(ol,Fǯsv.slI'^{?eccdyEjq3|P ?[+^3/=c[o+6=3:ƬYFlua?y @9'ĚW;umpN)"?mme׾3<.?Yn1<0(?w[|a|5!?R~xnEMO\IV[%\pA?u)?瀎%PɯIg>cE'| >_iMfl?ΝJ=җ6(X'?,|vSqVL+-굵lv6vhCyfP~?oe6L_E}I%3-VL:4y8@a]?l\\~;fu pя~TB@E7a1l?4W^yXR 2OiZh!q8Ζq"@w]r8Hs1,5wY?1>1VV:ϺHibHCw.#B :K'G\hXb Yd:i8]/XŅ9sn1yGC#<Ήс1b> 9hpf[lZbD)v|hHk/ה , 9>1<}61m ֿb:A\31"?_{٬_烶B:'Z:clN[iKy_qT,ioCk!q/6I1%eU5fmim2h/?9V+ϯ 0.3Ȳ(D((&_ m_g 4N Ҍ|713g߹\iTJ-CG€_ [>_vZ6oѡsxRF[ /,S/1|hy2Xb\)̣CD7.| FEƺ2sIyo[<.`tvsHgΛ(,P^_K)1"?686Ɯ_] a/Cg. 㢳@ r2L0 l'+|) :XeL㮤bOYvAIwLXsy±NQa{wD^9F,wh76ilikk]O9ḘO珎+7e/~|؈Dg/tlɧm^I#&2?ŅQ/)gg^Nk)q 3˴ns—!?JGn.%_B96ƣ;~<5(.<4F4VڢF4.Ӽ"Xi"ܒͼfFq%d%`r\Dc Ơal͂XeA؄% # P@ i&7>UWw 4?T>^5;k?8zu!Y1o+5ʘÆ{zZ[# cP`:;DjWm?ոBD 8H( n`'v:문A'9b@0V-r,Bgc I)-h,6Aް3&|cbƀ' =,, 1XP|p@18Ľ}٠G3\@h ,6|~m]aq78x`]O+7n3bsc;4Fb}6FG qnjv1.Ɔ}(qsu!aE \lP®>'Lyy)C/t >`/>an` u|?~#x~Tb!tA̰ j0 ca>Ϸ^.蛾%ن5Ga ]^cW#z;Dnx4y{^$'H}+ 9i}0֭/HY=Mܬ ]j]&Iܳ "`'`B'2 ć -`e/F,]I_X4XfL8d.8(y{ke\PG8ӏm6,#nn-.#qqD -1v~cAAv01lqB|ÂLj]%| .8AJ?'#vup\Ӟu5t?`ǃ4k;/]S< |#>*v{añӞ9c2Dqy rsL?QG,oGF󈺰bLJ ۳2?Ǎ;bxr<ځ9¾` |ba'x^b879v\n,.Tx 8إ.$(r6|2bDxQ۩U`8q=Nx n9 0B|< < j5wPvaCߐ6gq8pFLq1~<`?QgHb/yXyz{G?{=h3<5Y7.g7=Į&_0Ԭ}H =AF)N`k ;"[3FD}0qa{ ^o-`ϜYC݋ō[bBϧ`'A:3ނ,Xw\|y."?.Hhs,xzmL} }?>ZT nyc\]͓ a,mRħ|G?{PGr$pQ q@.puUJ;`_s/\sC58# 6vv<$bc{$a㉍?肈8f%X'+[x/Mc5@6FH!;.N8?oq/a38wO(uWS)ADoĹ[k= \,2n>9 .X@{|GBFl|G?^c'5Ab-Z}} G_pn9>0~ц5>-tVuw԰)e8A<]p\C0O`Qq 2VMVӉ{om8QjmMm(lŴ+HִRkA|/wYKmi_ꤎ}K{Υ\s7/}/3-G'5н e|D >"?|ޜ'( Pqk O^v@T e$Fl|.!$bF(c;r e.^X񉗉E0f: b„ f74.ąTЇUf"ccc}.ƀa`Zeg07 nwE9r8ε?y L56dO}}\X=\c?Ƨ(gr92$l>QFB˱Ct 푗baw?sWʱN:H3̹s=7~!y1ocznQn"x_>e/n#eq=Xoh$^G/xN駁?'9a'bIG6?f爹kмgn@afbTi>YH>:խ}o{S_oU,G9/R/TK}vW X[q /_/&n1Oxx|(8rOvѯCM2|󸣌Gj m͵ s1ەe|ȹ|o:pb⚃qກǺ <qrЂYeډM!=y[/α&Ve:+$N e&۶0D=5m7f ~9Ml:ݟ{{3n\f$[LW\nsc0XG$i-ƂǀZkF($p_|Szz)x]OszI+XcGR }g0 cO!`8Y@DI(>xj3ki^ŽcX꨾ 0mOnW V?3Pϴ v l *GLo_cW\gwF6Us,tμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jXμj䄥̝jX}xa'3>3xf " źu2)4>,ivM[Ltq8&?pq,ygٔ6~ 5r<.Luhhp.p0ϻ'Q3(Xn3d( XUOpH -eKhhm wڸvgdD-AG"lg޴6'KH`6~ܮpg_.Hbe'.1gD替~-^? ͟?q~?-jKs]N$Eg}~O7z s>8ͬ \>c~'08iֶ_:7Swsc=kvHe6?αw[Z=>гzp5)a>pN45?ss{OI<1rSF~~h?~ >!3Fj}(F?ḣr )`*Y;M5;ȗ|Y6#U%N|u z1rs]7opW. w~=G?E(f6>/6ǁa[W"vU?KxxB²#N ?ngv l|ue vƱ}L_sݒ1y[=<£2^^ӭɼ/tk2o5ݚrM&6\ӭɼ/tk2o5ݚrM&6\ӭɼ/{ݭ{gֽ PXs6ѭ3T8vp_c+*d{kQ2t:K9/Å]S8&F["pV#ȳrJ]ŞmX 9#3sK](ʍ=v] ~ŰòUH:}Bj/CsqHX|I@Nko83N9~ov{s=4Υ:6|+7͛ҹ9yr? p[p;?b[}( ɽCzCr 4$ϭo߸uO8pf,ٟ`=A&oݹ7lڶ7;p߳6qߴ{?{[2}27_XH]b_cHƿ琯d0YoY:y9Ξ@ҎK c{t=S0$\p'=~qo|ƫ~XX8 _ΰtՊֆbⳟp\5c%9Ҟq9NHP|_˾=~~q[j3£u`i?8gvn& Gq1g,W/ yQ~w^>ckKb?3$|[b]{_+:|۷ Aq3Xgk]`LEYy;:󾭔ϼ8EsZ҃d# c8 u[{su+1@tFޒFSGGf, |p+lV}ABD+ -l6.b uK5Kß1Ͼ.7 FdC|v!=fL]qj0Yk>^ý˪ 775aKKxD8ؕaݚeoẄ́w2<ǞYW.W{=h6|-՛vwzcW6|7[y!ᔻ/;>4ׅ2g0kCO: ˗op-:omؽcsX~8Av?mYˍ7~?gԧYUϼ=5j2ߓg=+~=/ׯkj-d5ݚLujXdV^m텡mv>w8_6aզg*v'pY,nz]M_kj23G5kք%ϧ1AmU!uߧ2vdنktl2ϟݺ&Ɋl!&WpG]s\a@\/g@5NMw/kl?3tpoEgYe˶7,6$`5ѥ#fo]ՈuP~R#<{?=h{eͿzLؿvt_>:md _U7 O~cm78>筗vk|&vm ' []gIMWyh$pӖݑA}fڱkO̹cK#_6AGs"DGݎ^.fgş]bι1k!?> [x.7-X=և<~J4{ wڂŗ~3Ibi_[~cu[X6#Mjr:6߸1|?㥭^[@n {A}uKII-:y~aoaw[weq7ԩ/k$ڍLke݂B&z=Z<ʆ`tBƭ{SMrThĥ lxպpg*l`\}@8I/ +ni]F W2?q{#np>!nw5gϻ%|[cQ)wYט~s[ !ǯ~/b[8Umc_on \#n% 2ve}}]ɽ. ._- S<fo/=bE8^jHҭ_3ھF.M_d48ol_ɹR$k ؐ}^b]#c|09kU1hO ?uo 9?-z5?~dpf݋Bݐ$/~ûo/{͛}s71;k ¥^}C _Bݸ >2|뮻._>緾aڵ/}i<%zpӝ~~/w~3>;/l/~ԾS}7 B/ڨ;JgT۴3mfD:w½Bs!-;+ >6ڿv?a~ S=pD2hƧƾ~%G&+!NJ<Ҿ皂!2{QwƗczFu/:r]߉" K-+䚕Mt:5\]9~DZXoز,,[͝APDċc(T qLξW~gݧ O:YN%1bnX, o6RBc v;qW8vI4[$0ĭK`蠌-elam7lO6q 0ceh1c7{p&{.oݼ+< &_{Tsw6g§^|=u?m e[Z[l$#6U>gTN _ ʨP7uܗ;!֭qozl?Djd q~+g>FB/?.xpoa8|˯!|ùnEvƗ2u&n{l|6~ C՛v6\{z} ub`yUiO`-ᑶ[üxݶ{%tή*{aenYxqƏ.4c;}ۇN8 xo/b{|Iov|‹#{oSxvҝ羽{w|6Ǵ;1d /s a}Ǯj'هW[o׼M4܇Ox܁u e G.!wu?YM' mjOk@E! "S)]]<P"/m# '!K]Sy~NK.'bg?4ц[G؛×GK xYWzi|*/>>޶f[OK"oo~1vWmڍ94|[Wݼƞ NŷmO=/5l3kLxzdg#.WUb8}oXŢ\^㘂|>'=ŭC3w>ƛ/Ο_{cP̹7gYSH4b/5!>v(\x+ċ2o b$w,8#<2}?}g9G6.E"z2_}|Vzxfc 6lo3C;y/ y <Hq[N/9Cb%O{zh/DȐ|w=Qy֜qk~~7mpF"l<6?:_WO?=6uQv-HQ/ءLgsR ^BɟI)x/;q;6'=)·-i,5[6^a}/Lw8!?:_,p4ֿ}厥߽r ޹ٛ~u @ ̃ΜѾKÍ~1վ`<Q\Sn5a><.Nw3ڷ}a\ѹk)59о;8b?ǥ Avm~3\p{Ċk+ڜrEvolG[7tSq,v Goc9Qij^2s^+SƜv̽V9{yLs1Z2c2eikemHJ~ vh@p޺u[ظiswy]ׅ59=Яxsis\xr|yn;}:h >{N:jӳ$RאXvѰ;oZ<Πc"Qd=:wbE}מٓo8Y$MRwĺ;ؗQC#F[r}dL֯b/_ 8kmyqL $3+hdy. dxR:sʙ_MSΜv>ǭ]RtwHmY:Rz3/z:Rz3/z:Rz3/z:sf57.:M^=ggW-7GrEY!(0b_iY1.!!pAAkqo# ޿F~m\aO2mxEt͵C(+J߾N ryylVj(֩w?>v Ѡu7M#Q=$0xa uP{Ɨ93I?j?t)UknO?a;4鸖^2_V{ėO;ז-M^Op~ɞ\S~c4~sN0oֿHԕ(Y ![cT*c: Spʋ]?("> &+aAL|4̉g?;c/_=&r=rx>/08)qeN~!?LC%5}?@qca'=)̻/LeyY"RnSmAҮar˘˝yG~YeYPȐ9J /7|p>wX ?hiPy?SXذ{ ag*iRmt՘{2 (}Q[Ӌ몃N.nj+?Oʷ7o,mXTyRzp5ȿ̯gج%rHGgA- [Mb!J/W< IDAT7ſ5{Mv#K83a\?p]:.G3/5c;sʙ!!s|H^ o[nW~&$ڽQD%h׋䰕%9g+oB@! &|;qLƇbe堓'z*8Y FqRfDS;IsB@! &DAzb]77yJ]j/_o>l"1: OSױpNUB@! "@RTmsK]Ŷ6jdw ZnoAB@! &)$1߷:cS-I#BW>lom:yԆ%66)B@! 4u*B6<^SA2bg] m7c>DctuiOY0B@! &Jqh?GQğݼ>`c }$(onEB@!0%z)m,_n3d X`:GHM[ eʅB@!0"{%`-,_`G7ʞ @BG©-=O>1\zS.B@ G#wQÇ 9~Θ3d4̜zra&*! B` ?Dú(e"fԓ? GO]?xQ~Nv2"x̺=OQ[ٸi}$I$|,͡9hzvޣ!kf޴mnu,ķm/Yl^b/e~v^kk#6^Ćt}kWPZ?o7;{XlȃfJz~ǿ`8}`ҨA(9d^˖.Yvyέ]t{îśݭe1nMɾ\jXdhh̿VZ?~h\c%aAg,_G3BF/3~ 9-{x bH~!+t \@Zd3C[\KϏ0~?:.kkEMG?pQˏHCF'K Tmzd6Z?$Z?~E]?΋}_nzZ1(e -Ejގɾw[a'[{Pth)/=b8t43 $=>n$ө|Iy=9'Bvp_oh6I֏n^hh2u͑ic㏧mb6҅ ${y74gttt֏ ?qhiHeZ?=NX"1w`@y\ ˝w69Ob~?YpS׏DtpOMFOIˋ'-{"p}?9:5Z?Dk0~hp}]?g 4Xg⤤|rѢL_evAkt~K Ӫ 9)[Թ줵v& Y?\~:Z?=~c?"C[\xeeȡ`*?ͼ'!C'C^%@G3Q!2 څ4l>R[d`[ eI'iG']t؉'·t~COHe]?ƻ~`imג,+ ȢS=^e! a@p ΟhasE1@t8QBNihdO1g8z;~%%++-pheOm!^qn9˘'?@ڤGΟdk/U֏rN`^hc,w ڲĆҘ@MWU-8c4/gRىYt?n.v}[SJ'Z9y[4&WHh䋏+:tDܜ Z?~r* wkX׏6fvO:7,Rہ(~~N6$/֤- +`$ ~e~ ˼5 K{?W0wceM?v4p,T|ŕA7,dqre?77n}Ol"yWK6nd_?,G1~!ۯG1հɒV=S荴/t;=V^~< oVaUM<5j·ۇ6~{M5SM%֎UMSy}mNƞo[$ȉ?eװs v VEk멭Tz۳gO83g-ڵ$.t19VXwڵ{N9=zꮥK}¿=&5x,̎4nݺO>yĝv-c}h`wI;ߧ_71~o[Jx){lsĊr]!Γ:֍7f1/ߓhѡ'yk6\tEZSY87[o;=]qя~ts]W"X'b`,d=Q62t 9?y;/}|vh==.m]<Ӳnk̑ǫ;;s}q1 ?,̘m|<Ʒy_:MyO/qkvGy${bя_?|}f<Ɨk5nMo{Ά _`iqZW3/uٗ٧roٱ2˽/v ܱrvXXx,n x\ɯ02 IDATrP~)6\^^Ӽ/Sylk@Lj<ڲJqߘB (2(UJ PXKKTp-E ՎX3)6RĢmQL2_=߹=䫌:ocT׏]?DŽ%L;*62s`a,?ctH+n&(,ȷWa0 KZ._!>[mQo(D8k H5ٻbkk.+=^ b49UF>2\C>ز-αc=6,_1ׯ֭ L կN8!K2b+5Oq|+_\ǓVgc+axZܲo?W㈳vEyd|y%+V>l^zio:Sy(.INOqkQ ug/%Sʕ?W)q4bb>ܯt<kHKAi˫y\xS;26Kش&#A  gf :xw|ճ{?>[_w[*?ponv=xijÓvu'6o o^xbXL_g97DRuahtX#|H̢NS7n-tA%:ݬ^Q7-D o~0j)V3WhL[{D7On[(0?T?h>|ϟ ~zx/ 2w6+x4*_G#|nOe!>i )pybD\gx/bE˜0.*m{gckEH b.\~CP8'pWG4>7l lʊ+† ^K+^MG/` c6*G͂W]a⌠rW馛5W_w˟}cN_5ɧXNtSz0^ _zlso՝*ՁHy$ώ }T6}ܺu(歟Urji zjN:po\VXȤ<\^MI|Ǝe|Y55c6L beי@[Xi-Ɩ ux{݆Vgز~Tx.ahk[?#Ƭ:Wﴕ冟5ju6ɻ+| mSOpӍ7$0mX?+?J[Fl›H3ٲ(x1T#OySbSSF=):ې3818-_v|/yw:zQ. ZNe=ԥ&L>o }['F}'/Klj_W|]߮9Ę$zICY7$^s 7F^V9ib?|ʪߒ`Xٕ-fWRc'n4-JO[7Uo©fWGLNֲx+(~FV\U<qoGt6džSc38E|3<2<ㅯ>a8m VSC1l/pϦyZٶ4_:'tZM BB %`2K+7k8txd*WMȿMe<¥]؏;ay2o#O<1J[ 8q``SpwEܮ^(NNM7?-׽u1~uׅ|qU k^w+?ԧ/˘k_ڀ zy{};\~0<|_)'RugA]+T{M9ì%Gز=>ڃRaonxd8|x3g??LXqmf[)Nk*G}+^yO}ݩ9⊨CMyGfTIcR brqկ~5 v3ZwxlBQ L0y:{oQݤ¸CEw$S)Gf־l5(k֗ѯҔǴwVm@cY ]TQi[~8&>>MOYK^C5kD>Ⴏ=- i]wa/F 6Oգ+S?~¯4.'}owO)j'qDONX؈CқAv~[[Cƾ8VhuT aYvez"Mt`oƳJ%]UCa#863q)L|J?ꨣ­Z):D?ӟt<Hc2jV![d{ Mj[e5 U\lS'mt ־.'ߧSF*䔕K<3#5_bL#pf_ZAt_kcD"qyㄙ:*U>5O ~PMk`{D[aX-1qʣ868>ua#奕请2v?=kE%?\A9u]cp/AdN4x|δDZ;S'xt ^*N L[8h‰K3cݓM|E>MiZiGT`Nijh|’Calegm`?d1dq@X꾹2+y;߉y?IO*fRU]6l+|=t c-jnY] ɇIb5KrȺuJ=D@=ɓ;)T|> ozAS=)?|xǶ]QiUNʇD^e2x=M2PlHW7M~" 0 @ua˧> uY6b , a=`:(Lg1= >&΋^Lgo1m<<1.!DŽ;׿>/yx_^jSIGo|ow5jG4Hwos^WzSk|Xk0& չ- ۤg3(Jǥ·r/?Vv+>YI?Cc $ ƙ]:'<įa}é^9$_PyHɱ=rE2y$KXTV kjH/<(KRg8=Pv]X6 >waT>q>qTE*&#oFI}#[sTrC Y~7e>(uF#< +gDT\t^9:[\:{GF'6U:lMtɓaچfS=7'>>0Fd#C9$6:+:q]tPIY)27k4)/kQ=.R4Q=uo\"bg:c4ɗ+/F/F G]%ZQC&݄s7X{QFbf{ _xS5&gjiS>4(AVnG'u^uTeuc+|iru <όǢϓ'tt -`ݺu[u1kY/&K'&/zt_z 6g.╰ae"̢ ҁ~j'Va|O /q{\" ?y@>W}U4龈 Y9~᝺?m fR}WYO޾zyaL/AlsԶtl+I/EcL3+3W>/Ox|̼^`E$[q,YD*ZN8%i5tФkl=2!Eb_yD;G[GU/ hɈD/:<>}|oss{7lmζ=Pq[Y:n34q'.t&ĕGKv<9g?wW}c /;Z\Gai]:[OwKW/#+.mbe4ޏa>[-Sa7O'c:S J~x$6?2䎐ʸE絤X(4fPM2R< (_(J 9k׆m\;$%'?+}f@Dɇ|a/"z.~Ez"S׾ع9>uz7:-Ooߜ d'#c $[tG|Յ8a4޶sy3`܄9mD^>o_~Z'4x1loYOM"s87p.兟c:!Ni#^}}aAX8۽M1t=TT>uiҐh7ء/{%?|oPz[y aW 4)/)h|x&{^cE([ anڧU'Oi<2~q O :򗿼ă9YWcKhFOJ<r+LSб`=/tsDuAd>Z| ;0qO.ɹޣ<mq$>hX9@Dh#" w5kZgSdSUcS94ҨҤ;3ql\Dڧ&hOn !q^&Dŵ&\jR$rq_fHt|r4ɿ_ k<"O ݑ=/+\yaZ^L:S}pl+ʛTI[/[n ڇӞ2*cǺ'}26dIk|ms]&8:FZTܶ'a4˸`11 )ʆCq)|꘬OliLΆmD'cU'yǏcF+1_J>+5-OivէPV[%o&-k%j:-ÁlX3sr798`$cUAr` š0elrLL5M]v ^hV]?}eO_ȰpE?O~2ܩ!:+M8l5t3ctB.IDAT^p~ukE#ϛvf2&a7@x81{سE!7;uõ}g;ùܲdYaN6ٴM,$1C?931ݧ\iê<61BNmb3fw<+iub:~¦~G?aOӭ.u[GKk}q>W]d%LgķP!N2 2M6ijٶެ1Lc2HCљ-,)GZlM; gQ5k֤䞸v:)Ƅ׶f)Ĵ˰~2V{dak)56>աaĨM.' 3ؕWڊH*# +~^< z v#1MzaWO| {s+M<]ks=fR\U_h3p.D}c^(qA@|Ϋ-.656Q7c\g>oxժq[= dˎuu2 K, ;ֹ乧:N$A}n1LM΄ ɻ~6s^)+\Sdk7Dr S2# S.F#xMX+38@f%!Vx8;k׮}\rp ٔ[m}^(^Сiހe&x{,(8 0ζz;i5̩& %OdA_&q[TcGcp6#:Į#iW̬g{)f&$\g+҇Uuɣ<|aw;VNw÷WG/,n[ h[C}py ,ճz)ڷ `s]A-Y;$fl5/~qw`,=.ʐٕ슝#l񔽣ؕgӹi{ `+!l{ژ2Qm=ÃU3;3 l[r裌9h9ֱC"$/>/QE2>I;`QNqjoT$hl!cL [hl c|_te߇l(훵_;qeſXѮ $dW;WU&GeE-\ɣO[om1Tixw9Psgk\J}[yÏ )M8Փ?˻ «/W+|ƮԮERÜok~mu2 NnGSƤz61e}7ExUVz3P'[@|+7]Զ?7s#K)㏵r^Z1<6yl{k|W~[Y< |6-4}i}ZM5@DXB[@BeTO,. dWOܿ<߼v9bO0Wy9xp'tc<0WRUo OzqƺXj]i'C8ŗQio? *vY5d ~.GFQslg|ѩ/S?z8cyJYć~|cI9Eq˃+j\wѮj! :ϗd3X8{=F>jw):bRNS asXSPFf[.]zX?/ƀ#>%ԯ[DthAf |!ʢ/|C}SQƜtǷ+e/tBL =Kcw{ǥ+¯ݘFQ=iԬW?X/>el?:d_~yS?<^M(PT0(] s73~q*P?x(~l?Ggy-ƓNAOw?g8d> zMBga8d~`!OSg~v D?v0IoaKk]ZaSͮUv :#e69 O+:|/|zL7rrg1&}SvMصٮ vŮ?ovm :0á\Z$v!Dp]LbsxXt9=^'|8G֏x>dCw>e]Lk.?\q$̓v&зqlu2q@N%CZr @'%dXd>Ǽ.﷋ˉde&(5DUAhAnET\_"l&&z"ЄS*o©"ЄS* &zƯ@NMtֿ&*M85ё&Ms9nL5!d~GZdA.?ht~"B.M;#muY>g[{Of2~ۊ@fѵvz1!| ~2X+'m=U*D-bS>KRZQ4KO,AF2~?#ҲdO?/-ۏi[I CM;:M! G0AM2 L'Fu1(o]Y>g F'+u\Xm`M ib]=g‰8hG 9.g7'o$O?8|qDz&gl˒{((g2@F #,,$ϲ%%7MDG'#d2@F`E RQOn++d2@F #!m^(̐IENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility6.png0100644 0000000 0000000 00000102325 12564151525 023565 0ustar000000000 0000000 PNG  IHDRϬNiCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx$EՆk.`a9GI@2D (`Q1D%0 "H2!IJ$sV̝lyVթsN7{BPB@! B@! B@! B@! B@! xF/kR! 5Rx:Ak l) ! BgBzGo{! B@ ޒ*x(ʼ覀6B@! ސVl[Ț&)3WtRpMmB@! BXǦS:ơXe:er[tqS-B@ fDlLk5󛎳@dd}h{6 NY ~XvuSh.y;.e5ojl~|޼QsW+Ki>lj ! B`n"PF -Vt_5fժ;I|,[<ٛ\B@! EH^n,}[c*OdUr]"lJU>ұf}:mxo۸qLedޏs9uN7'KL?s9YjgnNfiR;ts2OnNY?~Zts9ݜ:vd9ݜ,~N7'3ds9uN7'KL?s9YjgnNfiR;ts2OnNY?~Zts9ݜ:vd9ݜ,~N7'3ds95uKNϕWm]4fk뒭2ge>mO*Uz~,mn_|S'u<)\wJɻFg"ln'׷ԏɛֽyc٦rm}k[}JLOr! B@@+d-խ::|߷1TϏ%[ev^^&ܘɬ.ӫ3F>reT$B@! @mT/36]S_iJ]4.Jec&OkBNe"}ߖlƨMf:~Ucutd?g+03?U:UcB 1'@GOgf~m{Qbݲ1?m#k:]`ԦǬk䟯|JeLTԭe/t}Gz/JY0?}3yZ3n2Ffr\v>:7|_OUun 曚b㾍}NNױ:ǦN[ ?sx?:twDkm>nVco{TX*KfߣnɬOیoۘYr52JNkɬv&56i[OOG_RM޸ؗmt6徝7թ>rJNn.9:/[yO Ssu}7)~x,;g&Gf,훼N~SozeuL}+S_fgT?^Y2;iT?ٙJK;N^f?socF:>TB@! f#?8pF;NW_(2t,H{nVtc1hc^P4ivIgւ4.;RIř|/ԩSͯj! B@|=f3L+2tsJ6mZ%B@4C/f ?f F!?_ cǎ oUE :xotH"5d6-iBԃ,LǼ cJfNӌt"N|ՌUc,lMh+ |*B`B`ƌG-2an\]_8~S65/ݔH56FL)-uI9HD,'6Cm` =Qu'"^ KxE 4(f$򗿌lg GydjZܽ OlaĉᨣsVkkDB@UC!42+Gnv}1tv'`f Gjku?0p"62",I??W:G!\/6o~1O}SK. o\A_~H< ,'dڸW_}B`C2B6̓Mk3++f[6^K鴠azYFzmu S<3?1=~p=K7MQ+7|s(vV]u}q)n_}qy]w5<ExGw=|1/Rxk1! f dRE`bOkϽ:HYgp衇ѣG3ԭ4 nm\?\sME.ʏѯ/| r8cƈle]/ӳ/TEQ)Io$EAf<2q`c6fv6nʺ&) *azOȤo״94$U  xx^\$G¨QmWwVXaHꪸSN.lV_}pGG>;Hݷ_2b-z꩘݄,  "|'6|9*7|ӟndJb;Ciq-d_ {1ݖ[n/s{}M$ 72d)L+7s=+ Ο~8tIq*/}Khe>p^y#.~$ʾV;! trpYe BIhلQHZdQ!cV'se&2Ͳ>t Md++Rg?ěV{a#7A!td)ك+BaM>= PoD#9y~6^‡A(> i{kQH*#A氻߫bcn)qe,7RA&{W2D>sg:kPւ78>si S! KSIj#&7.FKƌp^*LJ/^k߽nF~̎Am}1EIEyH$wHe$eܟ'K\#+G6 ^zi$D(X1"f R8[nHQ !{DQq|o.-C2ظg>u$ %>?SF2һ_L1 !;q*я;mUd(ydunknDb,QI7ev36?sy"C9$^,V8䔛y8∘$kHvmn*+9qSbROַRO?馛ׇ/e{^UB`Gڌew,[<>(ZtvC.=IM.m`&iE1"|{ɠq ! 6,%X"^ʅ A {\-/ #L.Tt}\~BR}Cnm'r YA.GsL*}R:L𶷽- 2$fjJ*~Zy뭷gjkkk3_mָ  "|q)H7?9xC㴭.)6NR)PҺK:f ':82j4ܼ )d>rٜCrKdJ?;طf]a܀q2wO8ݐ[,hR}2Frzb#'r Uz6x>)7{J e]\*'Tf!.cIv[ {Bן!;|9x{Q8pgƛxTivF6w1I})}_Rrɸ'6vؔLMEPс"ukc*B@' !A^ܞ Is饗Cdd;!{42w\aICN?<tǝ܌ K>JܸQ#$a# c*UVY%jė@)Gd:!k`pCY?uɍQ}S?pc'7 `^dX 2@|FT3B`@\%uP֧fdeumr[״c}D 2kSӇ4R%0u~]U@ $CJM\,ۿYכX 2<2l-pc99B`BࠃHb#F4HF2= 5idЦ>m[,:׻Ŝ5Z^s4JϵDȄU:*{DvUlUclbm[]?O ơ |]߄!m#?QyHb2#Kuu+uH7M/m f7;Y] L*B@! h'S4iĒqk]ӣm2F6iSKeq . -x?3[> X HZ! f2cSoKɥʭ@ZK-pas2{tS[q! B@j|/O"M^NJcڵa`MMn*B@! 8Ri1qtgm Sݜ#B@GT *xKu]Yiosz ! B@t!Ќ?+Op.M."{_XjB@! @/ӷ1Z}*t"S[B@! zx9cMۭM'(,u|HG! Bkym]V3VGJont W2 ! B@CUfUtEP p ֮Zh՜B@! h _XV}-Nβ`}0e2[FHI! BA&S(<czxS;`Ҷm\m! B@<9B^ƿ7V{qRB@! B:K6e56e^N3$#`2ݔɽB@! shƟͱt[S4>]\m! B@,$|+]v+~wt-g<ձ #! B@@_X::93 /6cRS^#@5B@! z@Jr5duIg14n*{(KB@! @ʣXɽgl IDAT큕sr>Ǽ(vݚ3unM&M^>|;?gӓL4Efg^ۅHE! \G9zXav$lƟRfot2Atcj  ̫3¸'L Nl @) ! @G9Xa2d;;澊?}kAU]YI6>@//q!\Rp>apảs*k! m 0"ᩙEs5aT_~PR?ִ `:MT:TRﲚ:U:v+Y*0o\tn=cG [\|1-'B@! ZA^|eRx0⳩7Lvmtv3L: 7~fPRC%ÆVѯ_0k`&]! A|AۇײԊ˂l=#%!PȝB@7>,/3} zއo{FSh@}0iy{6^B@! @w!/_^ԂUiRYU^|Z]5f: d=s0}rmUzK/P:xX ӧM .MkB@y ]VDz乨M'7V[\@9YYp.z>7V{q*+ h}EŵF o}[oƎ6pZ>K.$|c s*B@! z:ncYM=:ecu:κ-zwI^|gX}ß0pHd9}{ k;O<~E֡)G>^{pw&zkx衇<{in('?6xt6B@#Ќ?*7-Q*+'di}(?y;/lSOg[u/G?Q=yO~0H#<p]w,g ~ݲɐ'|2 W@ ! B#-?FuS?m[lZ:6\:th{|dܾk|o? dH]wݰ1.饗*q wŏ[op'6lh|͑8nuȑ#evӯ;}{Zk}Vk:C x /Ѕ^>>ʂśx e}iO~% . dG#I{K/tXfeY &4|m4w+꺖B@fTq*橣kzK:b1&e<5 "5%d?7񩧞 xxsmYַ/o?qc_v[+zYg=3fH3& <[a~c ^{5QO2%n8#8Tņ.ˏ?>ѣGGf5.l8crHߏs3X/v!^2̗_~y<\BMK4>/Y/r0"A4kp'6k6޼ė+1V|O<9+"bnB@!U+˅QG'gאս1,7VF,Qfgst^le]#sfo~x# 7=3a-W_}u$Z{4r-]CP40qpqE҆.7X!{<?;f#MR27tSoGtbc*Yw= PWw]n(\Q O<,bI k7㾰wtP悔ak3vu։CW2#&O}׽YCy&/\\uUdTf! Reih^'+%UİԹ0{o;nM&o|1я~4| _}J$Ϫq7]%EO0W .'Kp@$M_}T3Έk?7@flqd/BBqWUtr+q<;X1QG-mzԐvJ3?v>p3B@@ʣWgxKu]Yi(LƏ7,rKocVO<0f~אɫ dL\ܩBFǾH)G,ql։~zb]tET٪@'ʱDV3Lnz@{k{Qf_XKOp 2?#Fx. %;x(p7/CBE! @O9e6f\HǪ^ht֞6sns\H2[駟CY~kf%D(n-oyK);>OAnD_ܽΞv YS[oI)b;K@S4F2حq~na-P}2[g_coEKܩkƍDd!^_1+L֗,oCfs6YVB@!0wU/x-cM9cd&!}GnmO<ݟ!Tu!IƑ߃ذW1ݯ/pyb7:ޏSf4Vx.Jz.RDi1cFUfZ=4%aoJʌApmgo断B@υnwxqbaeuF]\Q;18f]U3MF0MօjÆv,ňg>oټ!rH\K.+uȦ΍=~UMl6N цA8vTamJ8;1|! B@\8Yld'k62ɅB@! :/Vf1Z6d:)k2_cBAb:m@x)<8L\d|p磯d$B@yBgA;QgQ(XM|FuT^6qWuuYnNj/&m{ MB)#/n}ΦIA! @Ͽ6=L6+,6볉Ϩw!/_^^vN Or 5tAȽ3B) KVX=Ћ' /L B@! _VXlPl3j.jXV#vN<իJ:-P4'+ .E/sc~n@- 928,>xy0"B`.#%u-5z`XrĀgT:lR)Gl\QUYqX^.{@mB<_5t@qYcf6Nn(BKd8!|Fu4O>}3ݖC+ai}(?BM=8GSE! @ʷ%¿nꧭ~Ǩk3X[ B@! @DSUt,g]C[ҙ1)NNB@! FcNg7XK}٥z ! B@tG Qև{yer޳v]ٖs7ES4nBuB@! "(92T%uHv>'B@! @SʿR "Ҿ)k~Lm! B@T2}~OϭeI{طK:J'-@nx啞~f]^tE_׼d]@_y}{sӱέy,yܙk7 T7W팧:~iҙڛ w#l6a K/tzc}m̙i0^wyg_C -?>kׯEv&jvi#HXmJ{|=##mLu3cZUN@畲 ފcDUfU,omJj ւ/62Ʌ\CSN nm>8#<vicя~4/n.qb{F{.}M>=裏_›O}*pOSN?{G*_'>7꒥~>~8odoƌ=y'A6^. >ַs?ݳBfG?QٗGܶb'<3[{}oᆰ;aR9_6(/Z[o?6xk;X[Z_uYa=zku'?nyx=bx'뮻5c#^`B)_93)SE_dM╚[ozF5qvNbl "`Vll:E:˂l=#%!z?!\s5|ߌVYeHB?^z)| _'xbXl"Q9-&d3pisύv[? ]2>\rIԭqF"ƾ2HWՀ SN>D"ʇY#i\q!D/b쒩#[ȑ#MQO)^70e44iR| C!̔;e~ϔwqG6lXP2$|aر^7<2_`,LϹ:RyK.:vHga`Ҷm\m!q [7,烖rA=29d^{LR$dVȬǔ>P-e|1Ӂ.tgN8!~سdo %D.b\\#Yg1&kKƇ8[)9!;o{СCÚkbQa#f2t̕+dVXa+#8"^Gi<`dmuY sg2|FRu/2k v2kV\CV@"߸bg)Rx @d<ȸ??_K J.H_y?քyb])[sY||ε83 _XbѦYR=_#' B^ƿb3&fؓed wR/_LJep-fu'⨚rq%g 1IywnWeq{MR87 YKUĩDkcL޼n#fM}CɌ]E]q!:JKE' #cRam 1n!☙2Vr1pɟ]^wzڴiq ['N)S7,>[d'ҳ2VNZe1Wq,):u|guZ%Y'.y=LuEp)&>._*$ƾIn$"CEa\L ;ߚ>ƥYJ]K.d;pY 1ܼ7wڗeIrɟNQ:7bcX2:7O|+_3}Yho_dXc sխN__ [%t?dbo 7 d5@l-Fr9Srl "O|1]zs/~Nޓ)i <M} Twes=w)/^9 ==ޮlβ񯲅yfe>J޹)!3:mprR>} ÞMu7ʼn\E5z)k}r Y˜\̅elBrKl!ʽKo5'n.J/Ǧz.Wٗ:ח˛60Ta _}xϣRqU!svG2D˼~X{L2h{u^+K8 v9sR6wsoҸ>'f&gܜhvmEGRcȍzB@ ̍2sp"|KEyyPG'gאiSOf69Yn/ƩQf}-tr F\ <)29D^'+tVRn}T5ͮP! B@<~zLn-uIg">>|I&Knz>}9| #yO! @/hƟRfot&HMY/,cj ^!ot#KV; Ϥ IDAT11}U;/4~~o~s8s-9+>hnͭy8UY~.0cfev=q C yGp+ef}jbb]<287 Men̹ q=ohosm<#gzV a*B@,pc<kn%әRR{w |;߉G}t;ny=\'8~H1C=4>??>Tվ\Bᗂ|;qٯsnoB<_A<à~aStÃBqIHWYj \!/41 la]ww)<.!G?]<,|_1}jO" X< Qu]&u~Q?g,pw2=Igj׍}q Z@Hyx:'緷)Ogؗ4~~ LVSVHqU`q.'(|0eHN>on- tWX?xHK. i(\ve k#1 ~uEE;/9+-|@ƒyx5{ ?Tq8<瞋dG@t!eO R ?N?B@tVWq2uΪ,fqkm >A}~E{BA9eʔn"Ƈ=EY(Fm,L|\;3{hw?g}38#fVN;/u273+ǟꪫ"q٤2~ wLzU:> ~dхDN7G/Br,iBH _ [E><_2 [3΋C23<3p DzZ8?6BfYfF ~?x:yui%㗑f~? ~)2V95.@#`yY+}-Nβ`}0e2[FHI ?O%m>M Lqwj"3i}Qqj -#hCH!d1yeR\~揱v? Wg ڐ12Ni~K#n)VX!ڲ/,ٷy {o%nen|C̭x{Qsğ;țg!ܲWeΪT5m*[ƚ? ~/+be]bֳ\Bx2y]fuNΆâm}xBmpW7fH2m.aC,{@.oq^@ %Ѵ66EL4kG4-]b#G\\C=;ы.hcm>߾&F~zzv}l0> ZmGwqxɞD2¥|x`{G-T1|pr2>9ș=u2 }AnHL$3#z 2yUa{B!6qz"-?--1f,@E>G ǟ]{td@yjtT kA^ qi $bȨ YGKv1y }G>sM/})8ALťX0 YFfq„ }y毪>0٩V 'V[E3d|%޴bdQtO `F-$|d{<̍?`#W7ge'dxY; =ߴYy%Ql{Ua<>/.7n\T|iBbEknRB AxƱ6y.8ɍՖ&@frk5du0{qk8cV[{[|HE>P(J!ku\悈E2bL/޲BƫK~d J !K]!Κü#^m~K}uw֋+dYbKkKM.CymRlyxA~@qCnjޤF'w,v0nmgF; qCN;H^_#αcy=G-F |m''q,풯*Ww=U>'$7_pfhkΛN_~y9&;ɣp}qz֌^z#F2U6o[TWOtQ~rxcyo`ضM.2 J ! :@ʷR/iiYX TZ7xΛϻQMeT݈oUc2[ŦcxMLB@! @JǺ[vNg7XK}٥z ! B@tG Qև{yer޳v]ٖs7ES4nBuB@! "(92T%uHv>'B@! @SʿR "Ҿ)k~Lm! B@T2}~OϭeI{طK:J'-x$B@! BJWZ[]ҙ ]D6emޏ-B@!*_oc鹵,ivIgU@$E` ! B@xWJ4?sǚ[!ɛNP(XB@! @5)ƻf~ߴ A9 {?e$B@! @\8ԋBYA&ǭ]Ъ95&B@!ƿ2ex3Z6"e`eZB@! @LPx.XKR?/nuHwm}xB@! yr ޅyy>?S VIȦIeUz]2iu՘B@! FxƱ6y΋jRꢗʘsc]B@65>fn|e֯ߜVE̜9vaƹVs| Zm9[ډ`5e蔍5iFf ]&:j ! h ό3W\ /iӦ-49dȐ0f̘曇=3 0 t|B6 7D?S [z[ex1C,vFlƟ޾n˯O_N HEB@!F6ʰk=#aر, (s=Ə_>wpx[w {W0>}z{ù.xa].,0_p>sVxW=w>p9?nx{)JV ZMd&vZ'FF@f}u~ =! m#0upggy&|-Ov3M׌~ưQ_6f"ڥ^˅q18'~c28xYzv,iAfrkMGh"3j4OJBE: `TB}pN0!uQa .+k|?`YP/ O?TwFQd>?6pu 0vQ$g͂,ΫHgcS/O:p׷لt٤6/O#4'M*=I'$N $2-91s٥z ! z#o|a 33t@;d_вod:9]tpG'}pUWK^f_>~Zv &ԥ~6=^Y/X΢1_Xdaw 9 o0h9>-)~ʿLN0Y4HήMv+\! @>_p 7w=fH!e(N!>?+^_ijva0zD{t.|k_k:!^&m5zTk ;S5jTfN?ٞ[~OQ"\\/Wv}2pտ }ްK>ɛOz_{"GF w\ex CdcFtfAzjq><֍/={5"u,W :Jl2}oxJ<~Q!gӓL! @^s5ae lA?yH [Ӌgg7qҤIa O?t8c?Z>ӪWˮ4 0*.φ뮻.D~7>[lɰˇSgG^&MN; MW ^>-$varW_y9wh&Lx1|/>|[7ũSI hjE:裏oxod M67k:HA$YdIKn"Zguƒ>{,0v{&'L*HքI3ÔSŇ# vf6:er8K epБoy#$aW_ BgEc>caءFO5yyYaY]s _`B}g;mo<7X5Tx'! M8qb$V+B{aњ9cf0pZ͈Ks 'xbȰ׳?{H!n뭷^8#ouɐnW_ w^Bdm?W^9O׿kr)acӦƔ:cfqI}6I9N Xw}F ڧ}t~i@Xu#pZY¤_Qׂ /d;?\?Ӻ 0ꫯc?t8/l6((0/~&jiikPLɸ&2d r2 g]/Hg\3vWfJXdԘn&Mx6 1x$0aʤ8agOx8O0hȰn6q͠Œ3soZq>8Q-8r1Ŵ6ײ, S.`ZB@䊬57@dSZkϋ/8QΆm~}A'^R\|Ɠe夰nSr nLĻK=Sy+y}]+B޸m?_Lzez2ɅB@tC2DgHB.!y$;첻j.kFA%q6?Z0ll@_}xŇ}[Nare {SdHtf"ʫF-;+b 5 f_e}32"~Bާ- '-7o=}nM-wqG|~(J!`W5r3c9 1$f<'0[gNjc;G3[_^#avt-g<ձ,HNB@ٖo~w+,첑X&is̏]b¥^V[mvv3ƿOڳ K7wϏ`s$;şYςN-~zמ 0rK#>(Ucޒ4tIOurzB@!؛p]wc#6tLNna(\Ng)^ǟ$ 3ǙG?]{klðŊZɠ_dd_,0؃ E7p^ W:lVJe~SBfr&n}kSm޹&m.}^4FE! @se!~f>!b|a(dvɰq }+r >_Ȗ >|;?gӓL! @- ElO@r0+A >`/[܅sH}תJWM[[]i>_XϏ-BmpAx|J `d ꛠU)ǿL[;E#'fvX6>@/O:B@! !_)3gIuXv+37y  07yB@! F Z^xՌѯ[!>2Ua}̟B@! h~'3zThB:+4dZ5ƄB@! ZCVof_˦S,XLYփQk1RB@! h +`^e6ޭN}>R{6^Gm! B@rK}xU**e :-6iZB@! hGynejXƬc-[%('xL/] }ԏB@! ])TbjdpkQ:Z%]Se#q#gr6Z! B;66S,)tzǶƨ^7[B@! = Wťr+K~~'IgU`ȔHB,i>L^{!RB@! B@߂gt画S ]ҙNd}jk3QcvV{;PlB@! Uq'xq-tҦm.+>YN. ,d6-)}z0\E! B q*_7^e kdDcCMADa?uI'-:~Mgr|?񺩎B@! Cϩ<4kygٛ^6X7Y]iFUmtQo! B@#`\bޜD|ls&ktb\wώ` ŸM9z+B@!PMƩgY[kS[67&/kel^Xȭ |@qPLFXz/dĉ.vv>Mn5nd!K Ti_OOG_RM״`'h=pmd9̗yE3[бb>OcMۭN 6ujtH1=9F6Fnc6Y4cƭ%ehd]=r9HIhdO΍ܹ{%'8BCqXFtZe拚bvMF˭m<Q?0Mk,W!y#~[1_k[eƇdV;~ܷ/Q{6/mw!1m#|@C?ߞ?xGZv~[g4̖͗ڷ76?59^FRUSWF&3uڦoW|6fsEn:&Cvn [AoW vOw)IhqcG:MV T=EEP $2$Tծ]<8=D_ฬS#NTΚ{3?\^럦&y × #w.{rDC/Zr9L?{eO%vs&rL]?~vL:v=s9NA~ cu u3jM_:=pm}B]&_7by__!+/xkzb%jϚD'Ƥ:Ϥv`Ŀy|''''''''''''''''''''ħXxvqBH/@Ŝ{/Y'|H>4xN&%G19К\1A&G>8xhWܔՉkӉcd`DyqG'=qM q8Ffׄw#Dxup8&ֹy?D俅ِ@ 719~edԽr";sbsA|ʥ*^o.vUeϟnrE%Ch=>s! 1A89|rg1.2O?hեˑONoɹ*ۿ׵ح]Zǿ0?uMy]'rU:%rcp2[D1˨6:H<8XY#%}q!2xrܟ/>|Cmj4g8Ymgk䬶gϮ?g#jg?1<p' S#W_6~šxyv>h"b.4ESd cBP~Rctz~qNohG{Ѯgx0ϳ՜LsV[сնV ߡgzQ_>˹a,ʉO[㻇N?N7`Qg$\pjD43fΌ9hֿNl՜LsV[сն?:pFjxGs \^jyC"Ŏ;\O4 {&4ଋ>/ᯕᷮ zoۿ]?θ^Tw csZ09cZbwTٓqy6)E] rAC!{њhzO7f4p`4g~{lt?v?Zv8C$\Wtz0Gp z!wdgO廇N&K{0T@y9t@x/& vǜzFKk~ܽ_5?w_5?w2Dcs@ 23Kt~\S%sd<1Ir xuX7yAzq4GXc2YOO֯0=_'cW|ӓ+LOW>'+dl ӓzz2~g==[d|峞_az2YOO֯0=_'cW|ӓ+LOW>'+dl ӓzz2~g==[d|峞_az2QGU.]/yZ#wxJ 9tNork`X'jI }2Žc{E}olہvWvs{qQ3?Ck6۹ZsԼ9trsn"7\Tk֋Hcd Y=|j3;EMogwww`^/.˃a=?\-s׹ʳ[xun.c1<,c0&xZbia,3%fv`;lg{&b=<,vqrj'oM.xϗ|}աSxyP9D<$$G{Ϋ{zA k$<*~v]q?gR^ 1c90ch{ʼk\xbdlQ( ݧwLZurԼ:r<%с h3@\y7a c;lہ<'ɡ\LΜ.VܳVg =tjdRo R8o ϐ12CI-g`.5Ԭ+ijwzWíWlͨkNgϮ;; }fZ$OQ#VS.gnyИ9ΕTS:Iy}X伤N}ms{@\5PY3Hsj|%Wkۿo~>Zy25Z"'&gl>Y{\msO hD*+s4rQN C]ɍ4xB4 [Ԝaz 5.xy'""ҏ3}}óݞlv]+nϮn]vV:bʓ{>ʺ\Zuo 9=G9Mz̩s9輟W(nۿ]?Ͻۓ?NgO.rM̘3KOr.篛y.@獓#3xQ[ = }=TV!O/<]Z\o?]׫m~^;3ןsZ_NG?;]?xvGnOvwEэOksq^<I$JHa.Q#?Pg`^?ս'Yg+GOX5|U_suV}'|\݄U_'_5W7a|W}MX5|U_suV}'|\݄U_'_5W7a|W}MX5|U_suV}'|\݄U_'_5W7a|W}MX5|U_suV}'|\݄U_'_5W7a|W}UDH= V?z̝zUgȋ{;|UkdN9qֈ] eQZ&c5ד׿!׍qj2맮Lbj2맮\7Ʃa CSLֿ{?N?|G92O̘92q\3V Ǩ\uLo|Ժ:XH>54sn׿3k~?dR349ѪvzW5G^&̯b&1I^9'Tmr&]:w~j\d®W]:wzqۿ]:wzq܃˃84gq圩eg,5/CחBCTm1cӟX5hٿQ6)An'G<4&y&įS&=ڳ̧>M|z'įS&ս4ۿL}WOg|]h30ꐿGƝV z8RN_9sѩEx'8'Ǫv`;lVpǓMħGhCXysj_ z!/\L9f.z} q<[S'7i{㲞qdi;.=wڎKOƝғqdi;.=wڎKOƝғqdi;.=wڎKOƝғqdi;.=wڎKOƝғqdi;.=wڎKOƝғqdi;.=wڎKOƝғqdi;.=wڎKOƝғqdi;.=wڎKOƝғ1zuga8 u_|cT<'oKE*yL3:9IsV4wu>M{.gO3q~ӨڳZSk,rk~VC˨=Ɯ|'O竤j'v`;lہ?A5ٓKݝ)@pWZKV}v"}IDAT_lہv`;C4וZ㞕y8+]_9;{q;lہA|ͧx>D݄mWuD >/Nstڎ[ו~:}nwWru>߫N_;~֓v:[ެ;L^:Ox Vws6Ϻs]]L;umwݣ3;׵uzxygl޳[XwL;si[x-oہv`;uPݚM:󫹍+ony@In{;y)t~2'Iϴ~^|~35;oٯoMtCν歿96lہv`;tCw;wy?yHvָlہvO?ă۟Ljہv`;Gxwہv`;؁?C-nہv`;lہv`;lہv`;lہv`;lہv`;{:K]*IENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility7.png0100644 0000000 0000000 00000224132 12564151525 023567 0ustar000000000 0000000 PNG  IHDRcCGdKiCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx]EWzB'K.Oi ҋR_Q}A" ]WTIDt-HoN֝;sMM̬29{;"GpGpGpGpGpGpGpGpGp͡mf\32Lܿǯ~E?zv 7p~GpG>:-,d8tkGpG,4KoEbf|㶼8#8fHS=ض T髽lbpxpGpf?*>e4BMRg'AsGpG;(#Xy%ORjګ玀#8#1KxڧR2F'ծrބ<],v0heGpG"}=<<9B= J^[)y,:XױSh9_<埲˓[J?/~SI?ɻ:]!T*oƮo*RY3'6^F΀TEne2TnUTOܿgSs^?~hJ}~q;q:eeuslkuA:gy+ج 򸮶yr{8#8 <㺎ʫvUꩾTV)or[eu-z(Ԗ2)|_qn}q=}\zlc>q=}\zlc>q=}\zlc>q=}\zlc>q=}\zlc>q=}\zlc>q=}\zlc>q=}\c)OՖRgղV=v$"i'6m1 ic#2Mt*<.7RG٦|HaT$sF[=ϛ~,q*~lҺ_eSV[c^d-ڴHJ6z~E<㜐cY\a唭6i[Vbi??j?ǯ~nԣ_?y˗KSQ9Smvqj*ol#i\w᨜ܖֵ>֫)%a/n>֦?eWIޯ~ɿ>4]!^4~y:N}S{S?k]N2~jr^IzQYuⲭ뀐2r+S?^([,bS~*vyeMy>VS+m*ʬ]^YmSyTfj|<2kWVTc)?Yڦ<+O6XyOe.VS+m*ʬ]^YmSyTfj|<2kWVTc)?Yڦ<+Oڥde⺶\u^).ʋʱz25:3DFʪ#ײLZz[v*/ёl-ֱ,җ*׏_?G+_?nLܖUfs|IƖak=[vO^*der-v\Ri<.k]NHزWV lS&R)Ha^lعk%<?OK?5sSd2թLZV~@26YXmC6dc$`Uu͑Sֺکw&7;$Ց.8|G,. Uϧ ^UNF~^ ?l=UV)k}RVg_2 <Ւu[Pۨ95Rhi qAYy\NՑC8նf/-oqGpGH!g~7#':hG l[g>/#,iN9UWy*\:R^nu:39I뚣S&1B2eb|IgOLѣeC /,&}| cƌw}7@n[l@ȂAmҞmsCeAms-mii&'= dFG+nH/>@VYo)je5wO?=z{俏)g6 !c̓#Ux壏>j + K-T+Y=7T=n8N@iRR&%WV:rײ㗒[J) XnٲYewg֨(4 тAƘc)B lX1%{-FodyxmY:ѽL"=zgf.lsL6um6#RdͳX )}>>-ND(×$}.3&؎\j%>lt.u:!^{0hs9J0%aAFIcpQykZd, z=y\z/{O B1g,>} )#Aư!rf^A^kv>2e,naC§;3Ca 4L]=2eI^2t>re/ >{oh8]~lr!e@xy^oAg˾mG`A -h1x%QZVZ%gS*oiPάrd˔/${fk6_fFlر+ ~CԷMdHY`Y?G403duEK=g̿$y2c o /~ʒkc^(l3«@@k6x)ȗenc=&rp ar?. Ïeks~O?-k~a_%3q]t Bkva;|m| 'K/4ļ!CȞ{_GUhAG 9l@YM~fz :WNUȘvy^Pk )2*ҙ10)qD „'l;kS%plRCeҫg@zf1sMC^i{,c ۤoO@gC^;lZk~rI'Ɉ#_sg/j8:sd|;r衇C=$lIYgu裏e>lao-yFH^{~gB뮻n;묳>nM?%\l{<#PΌa3^Y"GHJ([TF} YNR#S=Ֆr%^6ǾV/bm2iT,[<ۗ6tקwFzcuG`v#3O=T~f6yҵ袋[oK,3CuQGмa'lz]e-Zhk ma;{9tMc{r-'XB{=w=n/"Y/ոveH#<9@A@yE*`%]3 JGF<&V*ʱ_ڵ瑱!ۨq0`-%UŬ_%V"zP'A8hmm=bEmҎҨa/,}4Y=2W@Ͼ 8uR6K:E>)24)j3/;f:~,!~˅<$,ˈ$fH~Fezsb!IMl_}a ;:|> PeB}M+r E玀#iP^j!-3_UFD)E0lY}-lЫ\}rdvXvAZurlM[LI6 \dL\vMҧmmvH:+->Em8b +wd=2 #b{gdGlխ[xNf^H]z6Cd0ŌR*a jw f$/k7euF7-2[oUqWӕ뮻 Lk~Gh\x`iӘwC ڎ玀#0PnA:f!FIv,tZ6/UJNq`c>HF_rUGtj<!ILݜ]~c/m|9˚ɲ_pK-<3y_{IWfi+M^yV%Nh)X\t\#<6_|ac cɑSlg-aj[qZ:IiGY佃\ CH;,WK\kvxy .`o^p p /%S<s%fء9 )[]a2j:q`)9+}/^Bx2o4nܸ`~I\ec&_JưN`kQt~g#+L>]zeeOTbۯ77ԋL2G`v#pM7 VZ)l+g?YXj< .O>9bFN?>\Sra8o Fy; ]vY(j!<_`W^){0Swwn!.D&?CM8]&8%dgL)gapqmqj6ǧ0I*q:\qN5(c )DouGf_ 4p_̎Qw1x_K&d/d E1f cembǯǿ*|,6rtz *#%P* Q"!L,աrl,e%fsy&%O|B"Wy_eI;6Y`ق/dIw/hIm|g.c'${eːŸOl2!#fIq"s\'X*ڃ?fl9ekeկd% 3 "g C88`,gCJɗѩ1[VrMr5jeS2%)|Y]l66Wb2+UU 11_$80U4#m_ͩ6MZ#Fex/,%"wMM^t=-c3p̊QiŒ[‰Xs:5p +p (2lĹf&v]JSՌvb9u=V6.5rd*|Qt0~_ O{I̤AY6Ig˾Mv@2~QiCބ#zWslM Aj ģ[%d-K-S¼*5M|`2-T9ph #%]Uڌ##7O#0#2C3cPDqΒ*I9NneZV[;tTYg eMZڜA6am(bvuס8#8@(`)ÖUOљ1[Ť ;aS)5BX@CI^]{YՓ#8#8!=pWY pH\2))|9l9Ͼ+/5htДSuC*GpG`nF@'Nsksj6i`ek?*eymzrGpGxU~2>.Εm弽N ڢz|]8#8@UbnA]R x%>1mbS95J4ud}_z+<7tGpG +9I-Y-,u`Pm|i=/srpGpFP^9mPrccS^]cK_qRGk:Q啭V"H]eZ9GpGh+L[I*,kLؐG[>lviXoAYhc#8#8U$*&S[KQKlFIE)O \e6mmC\8#8@wWļƶ/.[?-[[aQ4[]c^+w#8#8[ebn9Yé^2fS[!#N}T~^wGpGR,Iq#]zKd-̵a XS ՑoFwߕCvp/]1c=#oe뚃ZsjuKT:6kfl-  t){uN=n;d!9]o) %Cw2rg3tϛ &\}?AկX AW%%]jS`˖ȕ7J;;8q{^DL2ESO&gq%ߧDn'GW 3dt~~+n݈ IDAT?oԩSe 7/XvaիWإ($&vLjoeVne:(dZ&pL嚧wRf̘!'N^%O~gS>Gcd"#dn!֡J&>Idv7ˢ͌M1:.. /ڲ馛B_|p_zJn馰W O>nA\pAq[3y KʨQZ:sN5={+7|6_W_#>*;iƌ$p~ׯ_PюD@E^޸l9Wyq<d^S}!z@ƺ˼{?nu֫˨%.3%WJ߁e6l`̛2=B,z0SȵFex:2Qᄏ;6~ZqdMii[nx$ͫ4/6l#'t\ve+~\?PY^zImt_fSsO<dgHgL {b q:#Uy뭷\|C?JTyTͶ2n k;y7A[ ^˩JN3cq2唌s~ cxYθ1wO`TɇK,+{v{y˅%geG]˔o=0iV/ur/ ٽ" 8Pnfur5|f);}U zvmKg9oDuQKiy cF\r{ArS膶Fo,Aa[mGez fƲ)3[/)LJc?;oDvwЂm|]{H~Fzw[^n|4yzgXβFC?޹|'-m=#5|Y~9bwt ȿ@#Gu<]rͿ ?tǭ[.?WnXlwrﷶ'[uc<ʍѻw@ d)O6h#Yld]v{f_Jv[Yr%ev5u]Yd+ :l/Zj)O~1ҽfVZi%TL*c9<)Ⱦ[h+_\5_x0˦%C=T_}Yve[|5>X~_q',-gcӟTYXhqطjVxzo|Ko,?Or!Fއ<*9=UԦ `K,H2k zWI\z饡&zH7O8bvC3 UW]lY￿&ĝex<Æ%J-0RECm,)KiV teA13 )Ko=@ -<~~oɯJh[䍧:PM(mLhe=(#ɟnxc<&;?㊓_.tc_}2߰r^F~ӣ'|vޑg_>P&}2N>7HFl 2xҲ'f{byI2tyKN폾X[ecyl,2hwx@eqϔo ?(ҧ2j>%f?D:kwN T\plŒE]re%B=9@y衇’ /w lrꩧy923YJ=#wK[yϲ1KG#yYtE2 rH1?nr뭷o=zttAaVK. 8KLezyjw}wh+:+KhrMA H E a HdB%Ǿ輡+H8c;Q>o駟>K>}믿/bCG?ުbfÇ+|.o;2e?vĈ}ֲg,ba9)lmT,j&oi,G`R7 _K}ZV@Yqe{nݻIlyGπ }Y0OO>}5M7x{F_QEt-ˊ[A⫍s~/ޗ+O ~E^{.dwdo)ƽ'&Ųd] |GҳO?ř3>$03ߥ6Čbl t<}~hGv>&72km|[9YdC[U$ 'qs[k 0׺nC 3CVza?d7 k}s} 0@ rl$0n{KNȸreoSN {x'˔ܨ7=c l-܍7(?A$ځ|-Y#f|@ݝwY9P8rH"=h_ކnX[Zr-꫁2%1K V<6xѶ4<!@A ,!_%BН|ɲ[.Fr|Cc#M'xbLԆEe ra q{k}0s}13sy_oh{Ә-2&h2lcɋ0LϬ}iqc:Ohr@ ez{?ufH,>ΙCYͪ>7e\$$MպxW˪WT%M9_bk//gp\^ ^e7#_R)YF͒1<`cƧ6l-i[r\Ku~uT Vv'f c3;7|e< ~,I!zw/y }L=\1Yy_~NFZnsIz[aZ8bƳ5_Zi,٘fƥs[[Rb+C~d6Xv裏e&nbZr௽Z5jTXWGBXRb7b{#ײ_ '$vGʿDe샯oD̲n@,ʘaY2iΘ u<"=:ekmy@XV?ER;TxPCNhG۪vyÞ53oY>Oadl!,]*.'ײMιgS`Ȍ}V}r^pfƗ󗺧EܙMdS̖W Rd("6qEض΅e jHɅEԫ;x뙱 3n6a+7q _z#a& -.re˕koyYy&5dLcȾ[X',,NEY^_x 2##N} zx5-3q44B2teDzߐoX>~y]!'MZ&$3@wvuXa-QԶ-qsD0ì˔06|\~_<|A%$ZRטֱH{<4f-[r%kפkN;Z ҈#B,IrCg抽k V*i;r% L(3y|8@"X662sYc؜1cn}Fl+p>pp-PԾpQ˖HEʒ+kk6,lTUnuj'kW/Ŷu~0C/,1!N6QV)m緥rʟ -.32 ns 1R<*'ʭ+{_6`~JόMeMj ̒A|;U:*䝖~'f6> 2xX]!C7I6uȯI/!r,LXv8h9}Ue| dg\-K.|ŕ؂aɟ>YC fSљcqC#1yd$ m]ȑ~/6hfgc,oyʒ둍{n{#ײ:䇾[++_~yP7N6&d)l_|zSG>4kR#HDR-K+[_Qzذ/ ,̓ ;rDV-[y0G cBǃ<^Mm9LJ}x|_? hl%Ǝf ꜷt裏r<~USXe?rO틀bʵ8P]܆:[ƶWӥT8nk<.g Ce@FR>GfOM%|`,t 3 >̻B3Z>SfI? b.ز!߶75۳4a²iƽvl:v3S6ͩcЍ?}I|l %-1;KqL d>X{-f[=9?*3,o1V(  <-k,] J/uz=myԻ$Ta9'bK%g5̰xz'{~"EՖ!ړ'_"Mf Ov\c=S粃djIM|ʑٜ2$+.#K&#)vZN٫N_P,3N08{V_ř1;EG=SMgZ6Zׇ)_&A1xZq~3O1MEY(ǾK/Fmo<k#h+Ն%1&Ϗ UO'J KsOx؀0YS=eyɉնggUH%%r~.<C)̘;Ι%g"$=>FU^u=j`t^]?n˪Uy'E/){}RYc7#c2>.O>ߎǚe#Fb]7B^>1"9+q K<&%_sSYmlG@yE^ 1z6OɭMr{1-Y\ܖtg3L~oJ20[ʾ="XޙonدVE)8:*dlvh:fҘ9q@=uY @F}۔\}**\ܙim;٤{Wz|7jSY/v|ø[8@=@=` ;cq"R,EHWſa(%cTQvP,nL{}6#HN=Nwy<|ualkj>XGc`V|V[o":?l.CK1:րn0smmdRy'G'W+xJx͓#8] ` D+}zXnD[N6loDՊ)2VOǩ^myeON_Z*@ĜuCrB c̎y#(9,?с[Y^<m'7O\6h k9ռO]։/Nxh#8)XLyT[eP~ vtP:Vor^֥Xq ؖ ]_}:)(y*Onem<./=c vZ\z"]e#E8SdРAҽ{oR"(y@6+Qf2a9rr<;p/=k!2ֺt-4TK٧{r#tIXc ݻwaN q@c'O'xbG]WWvq`ڝ423BWW_n˪U#!,"2rHׯ2"#0ޛwWEsmڴ)2u m9Hzpz}:B`kS)? oĹڧMէrYF;A6_kG ˏ]@;9~-U"nRſR )FɘjSevPX~sGpGp P_Tg-ӾT髲MWn C۲K@x ](SLѢ玀#0w IDAT""o[Ukr3VOǩmyeON,__ f/2Ȇn.Q?rJ=drꩧ l뭷nۣI&,;o{4٪'ʭ*l,5.t$rK뭷ꪵ[xegyFV\qzp ʸzOtVW6_S3c (l-ryһ"V[m%7|,2lذv믗7\~ g7pC_oCl+|IRtʇ~Xgᣏ>~ջ i+N;M?|JCXGk#1rSN͌Um>[a2r'AG:(5jqb73!_}٧{ J,na&go>;<{L~{}ut`xgvt7޾#̽|$TyP`JfffRd! ]ٵ`lرa 1Fad}k_UVY%p]~8eA7wavN*:b%AF/@T;,?C=$;cXo}KN?ty뭷뮻!>Ta$vMZkж6.` ?BΘVf+G -_dm9wyG\sVݢ'!Cէ~y,qd嗗Gy$Kslw]w_9k}s^ޫvwt^pق@?,':dmTO-o))5Ww#%'Ҙ1c,of~bu7̫X꫃s >\>`b%C!]qaϐ"FkMovmaq djuוJ Ibxz):% :̏~0AɌ$㏗#8B~ӟZ D+4JCO>9,\r%53'3kV w\X~_x8nIp@j_~Z{/ҵz{.A?`LbzO;/> |FoW;p^ ni6? / {Wҗ=}=zt ri=DsPGPrjk*KɬM7+ bĕf X+Jljg!\>ArlfxJ+SO=}f$8_sǞ#n#F_jM_@W^YmΦxL2}rI%8/v[1M@]t@va((AHXcIT Ha>} Ƭ6 se z,B $1$[P8Fώ}vܙ$gfY;IJ Y~xx>K,222,w >t'ϗigoac֒Yg}Y>ș bNg謎2d EҥǾ#)Qao{aM b,/yشݯ_Z[ne3^$%6C%siU~h@me̊גms/\,LtETl5?3eߵeuZv|^+ՆReșɩD/eR^E;ӎ<:/w!؀^tQ+1@@ %.J4M+CM&8Kg{ K-şGa_Z=fyl3{'8y\DE~jc>%6m-?ۈ@mFhw\mB`W7?̸g6jeGؓG^%ʹホ#n(kPF}_mզљ1j$I A#BQ:'Qh}iK=<9@Q{5S]UQ2AuleG !*^ʒm^d,/n;@:T":?lNaѱvmÖ ]_};@-E!0T +y[Ukr"ct(W&K^~6(8q?07ԑ{Lʞ;쫤#)!c@S2 zalA$w >\^|E+uɅ^("袋g+YW@~țopʿ/dw~'Gu9y*1#C 뮻nycjsCe]v-q:,'AV J~̌:/4lME',yLJcǎo۲ꪫ[ljfj~7(7[5swʁdEmƌ׭*mY 28 ̂]s5F:,llrWԔla oKL? /%vm'JqqƅY^[Yg9c>5ŘzK/-ѣG^{N;n&7||l~avm;V1bXO . ZkZ|}Ѳzɚk)7tSMr* ؆n(|AM; KFm$7,_r>*F&|~J+X?pXbЏڃ-\c7>Ȣ.bYN;-6?I]izg;,Ok*c{ YAcv\!nMzj8w|@gUl6[Cq a_%Kȼ3//!:-%|v qpx㍀fDϓp뭷厀#q &DRf[զ%cE.Ŷs]c/X$3/0nnRvhmC9D\rIaɌ 71F/{boȡ7aÆR 7{^L˧~ڊl`͒qA "A6`CbVRK-͌}wD1rl̒pd1+՞weR雙[L}ihB*xc=3KS^q@RYFoW 4/R :{0ԳgFkK#fLM, 9b+$q11"c9ݳ>t?6l&ag l_' L'؀ b陲'Gmq ȗ%`mUl}a=cUSkGZ\*'/Y/mfbV>@xݛ!cHia' ]H7RQ[ 馛V*7r9VYCn3> ׈YW\\=Y$N|c0{ea:thl^WrLKYtAXJSW^ 䘥h[5eE3ɲp!"cN13<>;ڱ%n:#3Sqa 9 %Q?;I$,Ub=dL'?<`9'Y8"aͳCwQb}ڕf):Ry}urKl', `Y!XY2 4yx.aH[y}X97xf&<?e󟃘=i|+aKO.62 #f(3Km2]!3{W`,xy+0?!쥃r"f`!O?t/Ş|뮻n$&fhPB>e6(?; LهH73NA%=aK*[ =9lG*:iwde 4맡r궬_g0oWjWOe##7P=tK0H )hDD7Xc9%M, !U̎@N!IJO)8X<[mdg Yc9 κb_6Cuؑ؇lԨQ ˞E$8o4}[ ?hβ,o5d&YU632Q+{}ev'?!N,}UZGp'f {$bd-!~ziG>٬ypf+֋ƶYdoZSNT8!#=\ZfiTZGf7lc#'x1oP#mn~xFc;bln6g[yOYVd&rh2̈DŃe'!g,v^8r޲[>o\fY51ŌRsּX7f>Hy޲5ά(">`,Zɋy|ouSyC9g#P|33sBbŇ=iϔ]ezZvL-ɱI,^ː,ud⚜rHÑ*Qgi=/e4HMa =3M|^)y1ϓp= 402}3LbY>FImJs!I?T4F=ٜPR`NEm{pZ{uQM712HҠ|lcYV>ϭwۧ+GpG~:]_Tg-3`1:n3 ܶaNJ.>;KvDs IDAT<R#):Kz]^C jc-):_"ctj9Wx_:pGpf~]_Tg-ڴ+&)2w\ooem/%CWnkIwtGpvD-E60r_TGy6ȼ2$Rn8#8{v@aleyel)2ƨ eZNucSz9#8#^('CeWnfȘ Te6XG 魭GpG(C #ثL"6 ͐T)hul0HW:#8#NrSwkmTO-o))5W;#8#?RΖW[+WY?OflXYTp$tGpG @װ$e{j@,ӽ 6ixj>"#8#8eq &Sf[զ,Y2V|[ZP_tGpGCS@,Vnۮbc ˍ*ѩ#hku鬝GpG(B SQUcm<./vZ\z4"]e#8#)T%GL4B4āu\rt)D7.rGpG"t=Ș Th\WTNݖUsGpGpE@yE_E^6"{kתdvlt5p+V%cGpG(C@Gr8WڪMyd,T 4F6#8#X"nRWWQ2AufeGpG(B[])n]ۨۀmYKХsGpGpE@EzĖ|UZX=:Ai/?W%ٌ3Ó#8#t^:~]-sȂl)Eƒ m6H-r WuVMfpGp:NpV`u^)D!c6P "٠cu6l^N GpG,g|UyPAfX*ДL:d^9`7tGpG ba9)6Kէ7CjlXJVҌGpGh)gIЫ,'y6Ad,Xm*[8W:#8#FkXnM=5 m43y:]\#4b."?mb[6 c6P[Z-b[;@BW^ҷoNIX$>O#0 #o@7\SئS9od?7ڹQsCGt}b):{|]8TEܤneFɘUԾ-,*^wGpG":?lvզu)2w\ooem/%CW?{goWqEBMpnP Ŋ H }E }P < H|uΖcɹ7k>Y25u: ?t{p*VYgÿ @[tzĶyIe0ufScg ڌ埚eMB_~X}Y`duוgI6̰aモ%\2>e]Vsq{ 0@[l4oZ!O>Vn?[}-\x*p2~r??#wq |,?Qg+jcd֩Xq B赝.kg}l6G|'O=lrw7aڇ8묳nZ^~xOtu·~(^n\+O1:묁uQBA$Ġd^GhI,PSd>+; T}b :ѷzEzk&eKgq9S/UW]5rgȁ(<8㌝[$!+BL_Z4Cyr'c=V  hРABUZV$;oȢ. an-s#tm&:ETuP vJfF2c@S2 ~nPQi;f}_|qT ]ad77|3dsm`͟k V//|pvmB ڿd=]2k :+3jת ^ ~uj~N!d\Guy%W㗟~:,)?ב}~>y;$F`"ݫca9)Q6KɲէZ7Bƪ4lXJV0Ltqpz>\V_}N=2<zرc #7Y8wyg9ٳ={l9#~i e:sU]![wߐ-q?ӭھBqG }G}y'zx5\~IG]vE=ت6fyf@) QCj0..BYyCQϋ[f#FȕW^)W\qEia rԨQ DL tMR Z{YXo5!Vz+[wzm[5Wjܼw* nm8 |&)9gy:_zb`G h=[GjW[+WY?Kfld(XmJWօmTwK0 Zidw p A7Hn=j@r\p0Fp=2;[{ßh}e)Xqo tMxkp8z$ꫯ&ozi&=řf)m0Hjd;d;=T4Vn`Ap>O6HfA ˖#8BDd{^(Z>4X–Y[Mg]H e[+9N/s9g8s[wXEVto&)۔i5rf lm=Emg`C c{Be 7hn727e-l~|EXTha~AFX!+E2m;oUWF"7ͷ~;lR8CoQ*H/8p`h0!2mʣ-V,LVd]yYqcKjmfqT.րB6'vf,z]G?>^e]%u)S.s)ye r Mkۮ IAk_k ,:Og]'l5O/B^(ʆl:9/m`kx @_GPy΋Uh ؞K[_d _z%mY,hէ'VYף: Yh9kg\}溳 5g3s#8,NG"WYr5CNi_k Jqt){ՈOR&^RK8dfap[tX2MV[mo}98͟BnR[2:N\sc`6ۃq>l&EO]8k8!yB&2d|T-RH~H đfssx6Y'1(gؖ/ H[xYQ_|ڵ ZpiCz8_Zλyבm=S=4/U2ee[xJ-iK^ێ@7G,ȲSZRN~)2k;!qȨvϟt|Ԇi*Zeq•3I'V 66[Rkhn ! ؠA:^Gmod 2bP۷oJAyWAd/2 YbojOFqʵf]HjQW1d_w+&ŠN!1W}3j5Z'} l\3b;Y簊Gud[:uSZmYݢu#01{/YjK~a4&Nm,Ն~֧hi07ڔGu)v #@>)Z 2穫:2H1 g1%6 c6PfZmb[/k!l޿pGh?Wj6%Wud5ғ_nSO=ux{}c#0Hzmvҵ4f>1;V3;O(gy2u]/Ӡ&m|eXE#ЅlOƲndxqn@Q eK͠k@5XqcdR#txqkb;׮y\@#"+Djcmg\_IǸ2qK?O2GpGp&ꇞ'6EsxdԀm6zm)GpGhI,Psd2f b :ѷzEzkmGpGp*:'%v#d,hJZ2 ҕ#8#4 XNbu_iR,֍   SZUtGpV#,'AVgyXQ۔6w%vzt TW;#8%-Wq MR)YӮQdOP6XA ,lt:Vn8#8h=S(7!"۲6\Jgs0/<s6lY;o;@D㎓i61[*lW+9cÝG/KEa:v=d,kRۅPGYb9˒,DZ͸v2:Fl}uڟ9`-Gr1 ʷ~+q8@cYv._j&k܆)eUѥr#tAz-}iK2V%yqn@Y^}i:i?A@})*AY'W׎#Mh_*f9@&+ ,/Fy~jc̳v cvbf[mw.8#8@?씋ĵڧVm%c_fqG`Fm~aDyܤ4en=]ʛ.ʶ?cc{w>se23+,-\[{b-q6#VO/oe馫'C=$> LUrE]$Gy,rʦnԈm02,qyQTpGƼ⋫*r ˛o)d '}Zo :aNud: Yq!Uթf[w嗗>XFY#H Z:c=B^s5amd'SŮ?/q;eRd<!*=zt/-J.ЯJrWIuȻdvq}! ]7>AWYer-瞫}K.)m<3U;zpX2j7\j[a"vGW_~z5XC^u7nvt gMQrG;~aٳgVc9甛o9 2*: 2)A89 crCBs o1? IDAT.n0Έ#+ r 9QnAZ!qSֶWlîk, 9V mݶ: >f@Guꪫv;>S Juӧ~H>モ[oU~bK^ێd@GXʴjcJɬ>KiVstY+MHG] 7|ޢз-K{Ö܌3(lA9b؛KfUFօU,k";i&?ȎA)d akvTG_{pLw}77y>+pTObmȲ#JYda+ ۘlAwyH_~)}05Y2젬u=e]~ w,{x l·ps~/ckߖXNbu_bhR,֩3cUe6@ ,%kt>LWElqC~;,b2<C'ps [lqHsZzh1%D` K_[~Y #S6駟W*dكYe fW؎5f9gpS&;Y$|Mv9(pE 'R8l'󱙰7㏇,;WUӖu=#W,馛yG02-/x\wAl_y\b`G hS(7"۲6m#@&:OPL28Xύ㜹Zj3g8wC& DփJZ@p"R{9gù4t@e BxWpdٗC!-()y!vՎ(OqX{>lrc?[E' m}]ڐf!< A6bGņn}bR9G#l]λyqw ^ƒd\xVnjwؖI_Ղ880kk626>mSCd*׶N 2Ƕѩ3iU}jd@m=I]Cm𵗮:- *2g1΅A`(t|;goXEFVqYo )2,E2@Y;W:d]Z#F3lY1,Fdk eM…Z{H!߹sXE#:حc]_uS;j_yLJ ݬX*s*η(>[ y5vG g2F×T^iNL5P^t-׭荐Spn0k{Qm?$Zʎ;(gqFp{⋙"..ld娣\sgr#ȟg5jTO>Dn9Co|gt ~rzrʾP\$>寶jSw]/KU& ^2sDFsΑ/X bv,ROO(nFy'&\$_)YwȈ 6LU㬳*o!o~'\r,.5._<yHG(?IAiJ&Ӡ&meXE!CG"h9[nZYg9& #x'c=V5Iɪʉd 6jEi%<] z7dE_^b=^xA.lw Oin+45^G`G .onsl،[I{,:ȣ>Z vݚk)-x` ~G)kVxY'AFr|{ȒK.)gyFJC:;s==»裏ۥ tM뮻,sYqkzKfz'VcS{[oӟT=Ŷ.e} Xe~g}aSO=:<80J8 !*ߖfIغY[wu@J+W\& d:pYfc]kY=~ j5__~p]*[VL^΋7rUWOl;WuVĩmYmO6B|P~_T#ck."{lUWq5ׄ., ~a17 75 7fNcF[o /P^ⅰ<[iȮ=a~D=Sr饗-5?O?];7 P;30@2e=9ys@bQE'n._GTFo74t7`ꕜ ,Suek{WVI'$o}WCla y 8~m۔LhRN!aiY=gy[4s0z^k2pNs7O?}5V B %l1٤3<3skaվq eX h6 :l͂fM^z饪 j-^# ۢlso̘1Tfu6j@ƌ3̈́7 g;#\#2*``Ţk_2a7:@^rMc2묘v#ЍPZ$UϒY, o6+ bĕmy"?yB~,Y( /x}m^=z$r衇v86(OxSyl=d [U?3cX8a59+?R뷜ZRY2K5M .6kA.wns! /L=moV>㶋r(lS%c6xƶ:[mg`ӱv.@޽O>mIت$>/#m(MXpmY5rIөŶw.@;mMkR1p2/KXv=dL`LjZZk`q_y:kmGpGpp,r%X+YK=d줱֠M?Ow#8#8)r,;+I͑'SN64O8иYfP]rA;vlNӫW~FD'C=$> d9hcbs9)+s3uh7ىmn!/'+Kmq馛 l YoQ.\aÆ_]^+ov7;ެ>CyAw'ȵWyM7${g .Ưߏ2שm85 u P.}_mզ='I-Eq'ʠ4GN;MZk5AQi;B KE)[neN i-99$ALhҠ"<묳T y-lQuKeSW<hὺ &eh+?aeⱊ}f7sή8dVDX )袋dȐ!V[m%=\ud8vuWydM6UVYEZՏ92ϛk@ᅛZla|T%_|va+ʢ.*mQ㎡g}Xh< 'P>$qƴz [Tswy?#y={ j}<ɍy(sN?xlpHX} b1b\ya>O? lr窺SϚz]9;߿e]c}'kfU7$jL,.䔭ip[}լCM,MJ5XC7ސ7\ +k~?SNju^y啅m~-C_\f}4fnreWOl;Wu2qj,dVSsEpC Rr3 AZYW^Qu8∐U[dEB5nAfyfo(w koȡoMzR8dFĄqB8/V?@8|s9eYg:O: lr[o?am`*eוE֯_#o7Fْu [;| ;UU05\=4ӄ?d9W~SCyq |,?%[YVۢ9tNug: !A ^۩!J! 7z&@8pmfa~I֟@j+FE:[͐%EیL 4HՁ=+ǍbUH!docbyBRwNC]W'&aC1bOlOTg:g zMc Ѩ3w(5 $ ~V!!c 颰uގ"yd ?C n(րIɰ٢s\Y'#&|TuPs۩m\LiVͰl89 F=9[9&CA8g4z覽?k6 97uny ۈfC59gDl6lK/%,A8xM&;ƸH㳍loy晙2' p&Mdਯ^ø5{Y6X^z_!㖅ڴLxqÃ[:5;4l$V%ڨ.%WjRаj`)Y0eyzC 7I@w'Cv˪mBb86(Oj"aoO>Y_N!Sl<<>lBl/u0! u]w_zh 8GIgqȐ!r7wضSYgxB_'8mfm`mod4kmm7~=שߡrԈW[+WY?KflY6yҐgeC|7!0:O.2kdbW׎#8#Ԋ,h?Omy֮CdNlL5p+%cGpG(B@GrVڪMud,T 4z6#8#X<#8#8Eq &Sd[֦(Q2|[jP?5tGpGB S@,Vn.ccs21#hk}S鬝GpGC SQUcm寶jSw]/KU& ^2s#8#82#ԮiPyE6>Dzx"}l}GpGp/öWmY"cĵ6`R2t)pGpZPn^m,?,_K)2VĩmYmOUJ? /#8#о~]-I+jj$K% ڠmF?/-biJㆎ#8#"^dvC4BlD,A:VcغHom3mpq3cs#8#L@`"ܳc>*:̈́'[Yv#d,hJA[2/:#8#1ꔿSYեdYS!cA 6@ ,%+Վ#8#ԅ򏔳$UϒY, o6+ bĕ#8#(lSLuH%c6x: Omg`ӱvGpG"N܄qlT7JzkS F.#8#8Yq ȗ%`el}n2V&0&v}5r<#8#8ydq 8Jʒy2VvNZkPڏKٻpGpe9Eʕȓ'zXA8иKfP]>1GpG(D,>54@}EKm[ʽvGpGVWd\Dy~jc̳v cvbf[mw.8#8@?씋ĵڧVm%c_fqGpG"Pq2v1 *o2(XU8#8@yEu6M5Rd,Al:^J.>^;#8#P+-Ы'r~W²fFO䲉o)_|Gfmd-Aw#GpGFz>V6_ɬSd,Ӹ mN oSz!\rN2dȐRsr饗1SލGp!dj7N#dL2]6q]W>^Zq Y.2ey >ٳ˝w)}YRK-% /pYw3FnF.oR W_OZk-k\YoFniZ8~"*:8)Sgr2hJZ27ö9u, :vXfiz>_x9wyg#Ff{ג8 c矷d|]y瞓YgUny衇\y/R~ɻے|PGHXNbu_ amTeOn$3VaRaWO[ȓj cTdʔS>Y5\S<2CM2:*d]~zyᇛ=luJ[l19䓃l*yp&"Т{TW[+WY?K)F2cɋ&Mfe] ~=zێe>,Zˁ(C:KVYe-lva+ʢ.*mQP92lApzku]C?dve?}裏5\%*[nTu]'{챇v_㎲K|A[M7gM6 e|%#ygu:W5T;cšdGp"aK6%kj%c6x: Zmg`ӱnCȌW_}UӳBB6-c-|s}Ud0`{U+?p aO:PyrI'J+"`K2jԨړ9}o@ r-'n@V_} aq@!#^[Wjn邩?>cho렿.:-][02lV2Oކn(<|a3y:37Ghw8rQd[֦4&tAb[Jz-e>K 1>`@Blӱ+ .`J=AMGw9)RX`>!?8fdn`ÁyXh>w\F:zߧOplR=W^aL3;eV78<+sYbկ~qXl^{,we@6erGp<W1vAV|2c3PlazoFd8sϝkǨzwg:`Ω0)O#ӥr#8m@Y^}t߹6$m@㾎r_^wv$ĬAG/Ze %\2l;!,c%OŅ V]uUYmՄq8lAK/'y{=(q] `e rI^H;,̠ۚmJz̊El-l}z*S9V8#SGhCV1*/RopVdlAM3"zmC6ԧ"iR/;aXE}  SC+=ztW8[~j02xۿfR>X;Pk5f1lAx_ۓC ,aVaMlѦJ.e2Gp2#{1 *ob(XU{HD2orb,/}[@y[]' ĜOɓ^GprIm,m+_jY'fO}IltkZ$m[NmOϳ6eZkR0kGpI$ܦdۍY[vkҶ!lWi6iʌe4)\KV}zEpE.8@G[cbeYmlu̚,T+ mNaSz9#8#,X2j74*3Vv@2to:ێ#0vlcQ~0лҧ2]ʙ^uү#p&3RL<6sۍT)hul?7HW:@G" q]]{ALSfף4@?,':/dFubFX26h ,%po\AGpd>z 1V9NӆLC]c`/W Ke#lZxV rjk*Kg/b&Mf~a}G!BVq 1^_]t M\=ʈ~&3eL/c8;@YZx.lS*k4AemN*U▚ߍG@1N暡cE%{m8ݳ8rZd[֦4htAb[;@#a}=#6˴eE~/}Q<2hK9@|Yfmܮ im5!cY mt ?2j(YtE׿u\\+=z)Rxy<)OsE|ᵍq w@Xcqhye|'r]8#ԍb.)馛Kx-/.뮻7|U= Ε=rM7s#67\ l/r;|XQ8YKSj6%Wu=gu^NƎ+=Rƌ)|?)+߂Dαz*7._L IDATʇ &'tm믿_~m+$YOʷ~+:k aGuзW_}U^ziye%/Қ ' |p i׿dV/cƌ {Wg9#0wG"Pq2ucW/Ӡ&m|eXEm7}q㧐a/KN=`yVُɧ',oʗĄ;vmbNْ;` jA#\ve)o?9_|L? ZƏ/suYF.Bի<-#<"W^y#'rEjkQH˚k)W_}u5X{*lYCʔwyGF!+b՜Q@ _\ʳ>[mgop=-^m,?,_Kש3cL(f,\.kCrs yd꿖/>##G}*7 =BzWTYU̼L]d- r饗z\rUWZ6lp-?^Xc ef%H'Ωil7z%$dsNem$`;xF BN1r1 pկBp.TA;3d?fAN;4yc _z WTz!{dvO TSM2M!9y-2N {矗k&qW\ lsbۯ_`2,B\?zwU#t_z>(V6_ɬSL:6h k;5O]ֆ@ cN[fd*VAҳ'aH TXXHj|Ck*CL -C7ѣG4hP88XeJ޽!mab3@8WLb-&mlQ$E֬a}駟!Q{Rg +0k!EhfSQl%3ɬ, ۙZm=gqŸ b ]sAG6<:'}l!v~X-CƘXEJsϭN hqrm-C=d.YI;8V#L|EL<6sۍ5M4@CfAk!УrL4`;k~"KEOztf8c ^]@Wc9dv 52O^B J7yuj kZeH&phLиy*PÇ٪|`IaZXXguTY۵dMBl C)ZH؎dRП8/#0Y!0e[Nbu_bpq_m;Սd: !Ak`)YX )O3ȆQ([ْT9uޙV[-wJ: ={8v-%N:zHr=c曇3R'|r#o3eY!k*:lq &lޕ<^AsS y'^Ta۬N]G&r0<u1+٧IUY-gnpNい}dΌqm }#dŴp>x_G(H-rjk*KgɬM7K \,6MMC`"* .0e\`}2vP-)n¼;j=vaB5nnmA _0;%?619CB&?Cl{r =]awqDž zP8ɼ9#w @@|^@9p& &)۔iGrm55}CT~:Z_񉕺+s4 I>\|2ʢ̗<|Bz܆T{N_F 7wSlomsz}!H]V!vEsXmmCa /5ϻÈA/UWsSYF >+3)п|T$uE]433{ysy:㕿z#qe2x^6v Yph7ks>!=ƋjΦ`Sa mmYSWC4R1ڒNɜmouzk`wdgwnAՁp>(q#)1Ϯ:Ϡ)nEo#uj^ǬM\C&-CN1U,)G h:S(iRmmV]u=d,kRDzx"}l}Ghs 6?EZ97zx#]/ö ԯ|ĵ( >.ovGpG[dWOl;Wu2qj,dVSspGp"z>VƶhS"cؠmF4?w#8#8B@9*cvC7BlD,A:VcغHom8#8@1^eZdVnM4@CfApGp&!INKպާ)h5Pnx7믗>T6l2hРRn8#Ԉ򏔛$Uϒ_ʯdhT`vY ryBK.vI R*{W.R9cJٻѤGwߕTSM`Ə/|c^G"aK6%3nlS2 6֡ ,t轴!ƍ.d|g`o\yb'<󌬻vm7Qd 6(s$#m(MȶMi0U3/<6qymرceiqlF2U={vp9eUVZ;kFZk-9#'M>#8!) _Y[+3c:v=Imavqy6? /G!ce|%UcǯQO3<2s7:;#D,"Gem2VvNZkPO<]>S6M*sW~=zێe>xS`9Sȑ#CgK^zio6 ,vСU?lֲ뮻>,K:#ĐUk9蠃dWeY&<ȠytMa[nE\sM!._}UuѣGs^ʲV18kՁ~jxrE,kꫯrm䭷ޒO?=`gő&u_|q~U#o8@DD N_jX;C: ā}\2RiʉZ|q1Ysne>=+-d 0aYo_ׁ}'Qf_.;3ysvV[-bquu,{キtIA~IG]vE= OsW $/+gԨQSOm&sN s9\{.?O>2\sɕW^UW]%|xh_C@?5B<7|s yvi2f+Լ{̸~`?f̘88BGR]Wvq,_Al@~!TN߶U.1ne>Vx:]} 'Bq9#dEYD]tQy +)‸-Z{ӂN a!sdV}֥f<䓁|x1G,m\vG B@G$voĵMէt]/cr dƧ)2N<lf̬dʐ1aq?sviLɭW^%-s1G5Xp)R95Ύ~¶Z0 V,"mYc<2hqkϊmawΑ#U0βw#8<]wR%EaÐ$H* I®T\v ]wAW\**~E1HrEpEQqu9=u{x7}\Utg[7)SC}KjnOxj+Pm+c!^Ƈ@vn~"ƻ]p@@']݂,y]yqGyTyyǕzDIo|ce/|)}ݧe_m+ǖ{tV8>GpbXt;63GҁAvVW9\j\ Z)kxN+]uG_#)V6|0cƌn\:c?k԰JvUWeKX{g|)G5<$xJ$OoH_~741V?GǗuQ?Uq;SqĕcK^vkS ÇL/]ǢVǦ{+.uLwm]1uE$9 :ti7|s1!+:P1$^%tymŪ ̙3'4m?i]fwx/ aoaIs*Mw#L|5y϶z?k?Fӆ%;ձamG 3DD<+m>A)Ki)B>I׆Lj+$gώRG9AmZkPHmi8u|8Fu6a}#@@|Kz)c!c=iIc6nW 7Q>;RQȇPqsEk?: Mc#8@@$d I9̜kDs>MYv\Tu+vHryL#8 rIǰ9KS[Xب ;iM,+{EE-ZQ8# $ĕkK>[xAs;;sGpG&aK.77dJӝMcvx)ܺr8#8@MB܄~r4ͩ+|] 9I-Ubiێ#8#/Kl۾Z}2fb jlIM,Gl뎀#8#!Pp*86S4~4n;h'[R.w#8#89rR/1|3بN2tMIqRU,jv=y#8# !ޯ4/q/ADk'?OX, :#8!ޫ+Jruuʱ}ۼ}<Ș ښ[gr4m5'9#8@;t(MB\$+W9AXnRm&Zf qGpG"Іq6vA_թ>}5|'rKV3vկlI|OrGpD(f {j92PV3#Wo~n3_[V8ۤ{E`qf'O -ZlGqRqX~bRZX?*It+rC*Mxb ?ixֳfnWwqGKt}cU{pg;Z=)&ٳ38ӧ#O?>׆?7cƌ<9 pW"l=} ӟw\x\}}{j;qWr!y{^8#ʯ}k8OYq6OtrK(_L;i ts&^xɒVے'tk9¯~7DoƜ9s??R VgH҂*~i(\xcdpA5 :9sG?HVT0HBT͛o<)wp81xIr+cm;UM곓Nc6>l\'|G dbdciMZiRw;Nqwy?Mok5iWocE#ZGʁo:uj$o~󛻾T ":뤡'}ᇇ?.O}sH'Y?clVXn9&hc];IX̜93T%'M IDATc6{G͠ #v!<w_ r/|!}3tQuEB1kX2c>qe#[ 8 j Q}ի^5ju8OyRa9rRjr,dIb'| xxEA1ށff\6~/}K#~a֬Y|;S"6/tM2 BV[믿<3=#|Gƭ6_We 6)/;iWf7VJ8tvwFr8?O"hW+~$QOƦ{o}k`RDRcZ'}q4iO{Z8W_=bBjsNǃQbx[.G)Gn-'!\/W_RN7k,KsZOvO<8affŘؔ)So7iVFhXRƪ m뭷]tQ~Pr $^|0{'ƞg[o5g$]?4]*+H4VJ , $i=wqՎն:~8 Yb[GeXC7ᄗ%Yɻv0-ǽo|);$\q4M\r\n7n1&a'm'ƈӔCC^] d}t-A h>>Hx_Šytf7  V U(@Xzӟ%E$?? . ><;guS=&0b=D{}_"EQn-<ψM6DQuKQ1DG|b+_J7M^Q7Gx* )M)mNk\J&_cmN:XBH%2zu B}=td;sn㏏.V>r^ׅ/}Kk?D/|R?GtcUVY?#ۉ'XK(?ڒRX:{X_/f=ݖI"LWںe?? S}/E^W]Dpq ȗ%`6-(&i}<, j'$l^ݤm^:XA +&0lu+c/x ڬ|xǣw&r c>HX8nDŽpgy/Lj[ne?-|" h9"p@[NQw1]RK0AD 5|T4dSO>IRI;π*cƣ!4ކ+TҦ|ͱ}#.=}ǝÞJ_Mkok^ˆU/bkVYSj=fVKș}hY}ƳU-ܼ@'Hb<^!OtșH8zlN bFCNt$[5!zs}#S|5i:[Hr闗jO~ W\qE#+a{lj.Ko;ş3Șm|11뎀#P! ^Q#"c$?9 cvVgbinu/ =7ܰy|{@&+bVxXc,]acU֛# ~-QF7T*?WOnίrP2pL͸LF\cʅT*:uVBu!o#B`q:QkS?iRu۝:5ԧx_xpcz:N4pG!;bX=i_iQ:poU"UpGp~(W'V/ʯz٭%tL[?إz;ɒ^W}#8#4!P&#fbWmC926*i ;i;Iĥ熱GpG/I,1J $RtöqaeS8#8@)!_>:;NgXXn9&hc];I:#8#0NrI9|ztXXNP#8#8! +r_\}gK9?diL,i==#8#8y&ܜ/?ޱ1;yMcrrȭ/#8#4!)M)mNӜ񱒱ŘqӝR.8#8@ :NZMͯ!cm&Ơ6I˖R[~d]8#8@%NG)ߎcs?KAXA<ْtu\GpG!ЖSɍQSAبN2tMIqRU,]#8#4"ЖWy@_ƃىJDS[hɏmuz]:#8#/ȮS.AVgĭ=ԧqGpGhB@'.Jꕫd,76o38#8#`h?Iz;^_dLթ>}5|GpGC(fW9ucˑt~;U_G,W#8#􋀸Er,?zV~n-sds$K:scM:5,\U'9#8A{5!&nAMJ:McQr(:$|g9i m?қʫXH͛#8#L,OaUW OBr4AgI5A9sfڗ;#82c)_ҝ9KS[dQIctIkb9rGpGp䂖W˗/l})'Ǜ5M9'['tGpG @װ$G;V2f'viLSRu1pGp&8 4iS7>V2V7 nsZ\GpG(!P) _\}ɱ d1iْXjˏ<GpGC)(%rUqlzi0k;h'[RN.w#8#89rR/1|3IƑN4))N3øpGpF4/hx1;Qhj -xZ/KGpGpE@Truuʱ}ۼ}<Ș ښ[gr4#8#8MER\r3&fmGpGp,mG7iSoK!iRuٝ:5ԧx#,c-2ƄnF~UZ}[}c}Z>}YdI[?](ҤAׄ\+T/{nkB ٰ&nr>bzոt 7ŋC… }'7iӦ5\3.'OFԾr26,c w :/?.4dm]+Ame@ʚqX~bQ 䗞J,>dO6~钐?cSR[u]W1o#0A ;3[lcV[uY'R \{7\{-gpN~,eq,-Zs+_"{magItKm7's%O{|8\y႟_gN8>L­8mP5նHb,m DKvcS&*w׏[ "Az*SF\LdJ|r}{s  I'/xL)rŊE]N9唰kaԩcǏE X̟?? /y0_yUj)qu,@-<$f|Dxn||$uםSTXuUû 0D9?\{+jrխq_E*ᭃ@+#{|(_59|#/ !Kj'Bfub"eY&)b&=UJ7=6HϠ ╶l cp`x,y-c9&aaJK:+cyB8묳#~ͬbPg){E8'yw. # \-V+Ue1\f^--{3NEozXNbcs(/Om厒c!c:+85PnGXp{\w߸;84Vĺb }}/V~X=s9_mx?z׻O٘s l a`/җ4̚5aӠ>`~emQxֳsYm /| Ç?၆gXp\.n s"\q:Iwgsgn&Zss_qn74g?0cjK/:'k3S:4`q%X10[˶,[b,;3Lhr큓/W_QߪnXӠٝ-G`9!/~H~4o0}Us{_|d>{7mo tp;wvy;yUd1OW+y˲=uV ύpWW},ַ5p [ouéf6+E/Zv?ϠpX]VXu ޿ laҥAew_p~Kx6;8(_]?hɷ,%},8 /?a^%a£֪Sª&&b煓>p'/8>>;Œ3b?<@>~߇g<{Y7HĒv1x^uU|W[Ȩi~<`o~3a*3x}k_zH!svq#47C{l|Mo~X}k^O<1Z1YPX8nfX,ށ;gQtUǕnW==oUwn&aMvg0s#ub73?8gkZ0R3d)RU?^Czko\8(kv(rA+[NIؼIۼtu4mGgX`5B m27J6V-c??#|ӟďx׋/ES|=yOx_o /0㤱y oD`||SaJx+sS'ƀLӞя~4wg/s/W7{[w᷿m8;igcC9$}^ԫyDX,JXe0:+O\mձR]\T>o+OzQcmӞ;oKGණ~.gÁf1kQ5Ü +9g:\"V UfhnxBXcJ~۵ͱTYk;h'[R3F],>Ggx6s^SU7Kt!;s^_ٳb"?rsƖ__/uӶnpW׼5AVxvAK.[r < "1IOVĕwVm`ejp͋/U{/u9V{?Sk|&?_#J{aY3OOVVU =q[CZ hkIW>fFϐ7L9+̚VxhA畀pN?pq? +O<)Eu]ckcaJjw 8y͔l.q7YK;e`ML(٪UOw8nb y61AbV'?>1Ahwyg` jsBq.(]6MXl~t߳K9;o/~7%/y_O2G+jxcw_~yxsux3s8'~U׏ƱXsӱsWb:q;cAfyQ۟_݋_3 ?'lݔ0zJ[Zc|7sjX) Z\-~br?+U ZPKk:)]WeiSN IDAT;s~3JI;Q3Xjkotu4mGg; ]`!ڸѦ>HjiH ;s;G|͸\iLVZ?C5)'^ ?!~՟b(w}dcx~5;ch_c/9΍ew^[(#+ǟxg+[]awW%C0S[w}~5XX[W ;ЭOJNEӖU..-j;Nx|~zHsUrЕ1&5$T۩w G`x^Ӛk~xo+F&b܈iZUs=cKwZO7_Rud󉼷-~Vr>u㧟~zя~}k&QG^W#<U1 S|-m۰\'qvohk<'xw<^NJ}cז=c_q`xoM7 ?@AP-7:1c/v|r89a¬uWVƪT;{վwO|9%!ÏvǿqΆ s#V}y~xs+CVӧ 72ç~N0s(K{حCV+dOT4ys,|8IOGltG]MU|KO%g>ds7rЉivlŬ$M+p|ڏ/'7QHS9Qu]wN1} VXU9^ZgM[ǂX{{v~` a\JG9Yj.bg?-JĕcK^vk#c To'YT}#0d*Vs2՗exc{2#?8ޟoǢ-R:~+꺸Ƌ:-L_"?w3nh}Ğb>MIxsn0l0 vӰ1n?x2#8SVtMNRDz62R1=,I}O{u,cY6c O⮾ɶafa:kW/߼ً?6_1taW'u]ZMː'ΘՉA&l.rEmeC 6/S)%E\6:1K'I:@L |'Et^+ { j!_ £Hl7N}&h X@t]p='O~]>FX~&l] b"!cxARr&S&2Ħ51HаdLMs>t ~?/HOGgܔucH>'X gڰslu]%\&]FkXmc%cvLN6i!^!.\:rD@$_B8~,& +&ΎX3i&USnۜM.ۜtu4mGpGpJq ȗ%`6mmrl~>k31yLZ&#b6uGpGp(q 8J\vc^?~2MnɖԤdƭ8#8@'Kn:G 26#hjSRTgq#8#8i^j3и cv5Zc[]^~#8#BB\+d2"c˷y=x1;(5q:5ysGpGؙg< 1CR9mko }Я`R87YTpGpQW:p衇1:Ρb(&1AW4LNT$iTl#8#"`o"/ sGW͑~Kg֩=ytGpGn"35q OlssPm.ˑ1M8IH'Zgۘt$Ɨ #8#8p ώ&E;c$oH6܃ȣɇԆ?c/j92W $kG$ɳ;jysGpGع;o~1-+S)~bsT%cvR -H5i (.:]wGpG "#bzy߼3r']RN*S~Zr~ݖ*L\;eve+Wv*m;#8#Ѓu]7jE "fWz FȒ1V:O<']-(kݩPZ#[ƖOOR~#8#Dx=+%bKU[XNBxHV[~#r$5SlvLM~+ѽ9#8# b9eWOk9dȖb䋰Ylm]^D|t|8&':1RYi'!Knu]w}9#8#0뭷ޑUն mceHɮBzl46aOo4GU M͒;>lB*I1h~ŔVSu?Α?~ _URbࠧ,y†h!՟;mmiI'gLm2*cO~ݔg}WNe Mj@e)&E&ٱ$y<ْM_y_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_ui~ G4l)YpOLqȘ)Oֽ^~J6ӖKsdR:ITrNI&mbK<|)tZ*;O@UM?`G[cuśzS7I[c:moMu+$m՛5VWI7)nkx5VoSX]&ikTMXNq[cuśzS7I[c:moMu+$m՛5VWI7)nkx5VoSX]&ikRi"O:RC~d+;N_蹍Mc[u"Ң.1GW\z>,ȗG>lS|[#2Gy4K =/~[c4GSIwnRY~ n_2#x:~ Bɯ?!1rȣFttFb)dӏ |QfX?{>,FVǯ{>~tӬ-]RztrhQ8s?~86GZ=MYAbG/m%_^җT⌅.>%ˮB1T 6rTWbfN%E/^ߋ@ /T;~p*{+T/Krc1/mE,IįǎV+$f㩭:v+&$ԘAW$G^𫥺H>kIL5'q>JG8y43ZN}⣥T'DXa>2XN}tARShi,g>I: i)VةL|4S$+G&>Z٩OuGpmG(fupq9ilKؘ[d =uMyڑNvP>VlDŗk4$1mrf4|i.Gry}ab9~~\ǯ;Y%ϊwp8~_t~?ӱdŊnW&eǤ۷~1".%CL:9Ql.[%#[qIJwWıicۼ߫f$߯~Vy IF~+S%iCʶ#]duq_揮yIvg+cE@NB𡳑Ok$McPC4_yҕ'?1Jz]2^W~:9~kϟ2s~YJ9OnbɍS86.%iHm%ƃ1i&lMB960 JHtdѯԷ|4)]2Gctő^?>'#ֈ珟?wS隱\?:%9uO״K)^tsU!?9jlǠdN(˂vҙ/; R_4!勁R"s<ҤVPfmԋ̑Cg뢳#ʳcy_箕j|#Z.7r9HEzF\n7Rѫrsު+Tjܜj|#Z.7r9HEzF\n7Rѫrsު+O ]tltGgŋFV+j>ɣi I 懭1v dEh4|ґl4V҇m.5 F|Q'RE [+YbӘsRX׷'X9<?Ǐv珟?~ z|5t{GW\rr|tc j&FZR;WdJ'b' "Qr$?m"Y|HW\9UKėkOr|^A9Η4珟? ׏_?MwɉZoiY?|&~m+|Q 1K.֭iKT@:@69tmRs2y$tC ⪩ԘX"^TxꓼAsT??\9~pkco#iKGF[B<(iBW_#qN*G>dD4JנĬNt$; R.۝d ~,V.~;\;Ho#8#lW?>T)[R1l&F:fԧxL\&2MlPȏ&3JA(t%OQz55c\89"_Ms!_?G·~pSפ΍6?issØ4_IN:je>l WX#s(ʶdӓ;ifUdΓC>9M\HȚHUj7{sGpu4$n|K SLRu"^_gI-ƊIK[xQ%c4$1I1V4闦q!WFyHFcV%ѽ9#8C@kf ]?Ȗ/)dW_>n%~|ҭDolRLhY" (Zǎ~)@Eʨo@.M}Yy趟]y94fz>Αx,槶׏%[ܯ6ʶG}j[TƠ/l׷^"cKRZ+ *H[cujR[DKR\bcSn~ي#?=Abbu{NX??N@Ox1Nmu|ضN 8M͗.~j֗)V+KdRрL$(UG:15D,tL7ūPw|OZIW#?.wè.9~ PwϟtzUn%zjC(f%1VYWoiuz1P#ӆO$F׎%}ˏΦ>\a_[c|dƭ>|6nu Є[s@霰q珟?z5TW_wlUfQjY?:1tۗNH-sQSke[2F @#B'z+G lWevaO#?rtsuJy%O)^J8~J8_/%Jj?J8_/%Jqs/@g_Ԥ#cHGJm|ln3SJ#(ے1H1l׎1zT [c!WSVW2us9S:ٹܜO|i\nΧTrsNv.7#ˇ-Kҧ&%ɧٺS5+f6R!@h$Ku|Aoj&Аl3WmR..~rb^A@9R?õ6|"fĔ#_J=WԷխ/&!BSXc}ʕ,E6+%Eb19~cǤ 6mru?Α?~m:ZM\9VZĥu9֥:6Ɏ?4)9%͓-I,R?HgGSb1lŔ[Su?Α?~31[{ld˗))#nQmɧ>4t~o}=J3cy֖.It+3).DF_6DW/=ɮ4O1?/~Η4珟?~B}IDATWE{{Xi|RIk?YF#{l{RynI:N}z\iM~#ش?Oo%?ҫ=ZvNO~#Y]񜴾:=ajin mI|^vdC}Y[a vǕvOrHS;SJS'9c)qݓ1ΔIi~jgJz\i~j$g4?3%=4?{3FڙW=#OLI+O䌑vǕvOrHS;SJS'9c)qݓ1ΔIi~jgJz\i~j$g4?3%=4?{3FڙW=CHooW:VJW&d;/HKXz#k}%G*[]qQ#NScu~|DWꝪ柶͕ [cuo[̬Cbfv~Y̬Cbfv+~M>lKZt,QSNNI|HȨ@O}%ՕlI-nm[o4OGpGXQ9(GRԖ/XȍYSLHI`ֿl-o$@4>K>MǯOt/OɈvl`t[>d_$8u>FIKFkgmӭKԶyi,g+RGpG`HMi4n9Vg|k[=iiE9()gKjubwW_\U$4cn1t~Y?Fǯ'ùko4J!S4OXrx`eSKGpGmILS^{R;SolAFJ}/5ԟ|u~pGpVlr=S_j ԟڥV1"7kˍ%_(?MT@NslC95cTաs1pi9~`-} _%\S?xHqoE4vNXΟپSLV/C95cTաs1pi=cքְ.4ߞx[S`.gXô<8#8O!Ҡ1WWֲ&McѦO#8#KW@.KX#8#L|^SOnnVI^:X[I#8# 0V4f"i ppGp&$˅tx2'>GpG E#8#8#8#8#8#8#8#8#8OU?eǩ{IENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility8.png0100644 0000000 0000000 00000226237 12564151525 023600 0ustar000000000 0000000 PNG  IHDRcCGdKiCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxEX2( 0;sީ穯LO=s39Q A "y[3>[3٪zBӿSՍGpGpGpGpGpGpGpGpGp9VmqL0qO Zÿ?~pjJуK:#8@e4[\NCheo[;#8@sA$ "1[m HC|㱼8#8 !MVb(hNRdƲ)2n}GpGi,#$Y6Yr=rzpGp ,}ܢVn7)7n>M&K;v[y8#8M@}]ʒӫ]ằ IxYXTc<_;GpGy P+efA'OWzIPJDz>v*mgq?}܏~lc>q?}܏~lc>q?}܏~lc>q?}܏~lc>q?}܏~lc>q?}܏~lc>q?}܏~lcFKlW[jK?~YkmurQ_ok$A ʳ SYv>>Z,vn՗94=0ʓ9~_5[=4T^7cSc*îj<;l)֦VRo'aҩ< 9}=,[f2GpG"Fl,..jcv>6Œ\C}VmjeD3mEe23,7.eSci'QV1|~8N[}l"}l2K>_N:MdɭζT r[t,+?iϏ~SF=Z'kҒNөֶ͸j˳*W'^Q9m3k[}W;[K¬_lKl}M;~~dd>iZxmgW;U[H\NN}>ʬiju%'}lkymեVm_TFmerSkmKސG4?YڦY>V2kV۴:TfjVgXyʬ]V[m,+OSjmZci~*vYmM|V2kV۴:TfjVgXyʬ]V[m,+OSjmZci~*vYmM|,Ug赟WŵXy^;O-fƔ0h^[uV\VoNy5:VR7ܧ$['QNӒ??nMڶUfkۧ}|)ƶak=qOV dermi2Ʊrm6u־k?6m ,8IMe f&stҰJ{au?+Yea9~]w]3'~8kmdvOT}jm+?O[[],sZ}[C網zdc$`U}־ک]"욼N^)di0YYܶo@+wߟ"x6Ws7?Py=??gUfkڟ'$YrtsCND9D߶11JN4!cH\kPV^1y<ÖdM6Xxر(8#8#O?ŗ_~?\vb3"yAJl%Ԣ-&ae_njAӄ:`Ne&2[ms`E^=?wiC:tɓeƌ8?#8#Zn-۷I&u_D12yY"f%V[Yܦ_Tc%WZJ국6$Zu[UV+L@ы#8#86mifoK-8uPl(l}/CZ#+\%cmv+&_1)k?7ekGpGp !gyM(WͬZ~AZ]eRI-9}p[T=ԩSۑ#䁧'&:Wefn%z/m۶-g1pGY0r $ Q+IX{0T?[ QYj]Xj+]eAVZlG}g !M"?s㏥s΁tu)'ʏ?(,s.袲"%::w.HN 4Ċd/>*7=ptVz,CKO.~7\F3FN.nFaquY Ccp_6hdK3`Ԑ%iUV'.%`h͌AlѾhiSTg|SurY1;&/Oz%{dy9eԨQ2bo f ,aLƳc߻1GsD ;&'_zLrpgYvPjoW^&L/|d-|)@)}P8z[(!- ϗ2JU>mZg*%c1Wگ)w D2Bݗ2 d  >,gfO>1g℟XS%  >yc>ƒR~"2W6i9I:cX3R:vo+:wN[gDeh gז:.[KJ.}Pn8s lWnDWmamJVY6eՐ1 ھt2++V`jde)!^,Ik.dPkI6_zq!w[;&wurHI`ܘs5Ȼ++r!a_%/\*+/z1ȑG)wuW=_y뭷䪫 1 gϞ뮻8K/~[ȪC4[n?#b@4Cx|i"seE "dL':kpRkAҦmU5ve3c,a)qD „'l;S%plqt^ҥK'iۦu cmyMQ#x.n? fDhn|gO>#_o߾E]~v99rd g 6,.{キz?Q^xYguͪ*GuT u/{e54Bw}0{_mJs=73}_a憻8hf #xVrfr.j(Ѣme 6KβȘN682Sk[mP]^ؗEuL[2Ҍ2l?16o̶mj^$ĭmkбM[P&yfʤdsr/mZ ؾ]Bc}GF7̼;!6 c k7830Y'CuG|Wa'Y6\%-Z57@\s͐NilOXlO?K||.dX`R֋y5vA|p7@pZ +V1S$ {dcbrơ]=}uWj/X۪zl)`j"5WS L g {dS*[~;E:iHmK62aڤ$K6YL*aJ|̚/?;f̘f qw˅$CeD 1 Q|~)l1`ɐMltM!SA>|x y>˗8S峌~Wh\ee 3& p + B6E[eJ҈Fm zOf]I3K֎}ik2[/Z{ W"s,/WY7._c2Eb7R}WW?}4YwNI焈uid4UxLd>+ (wqd( /0,[2$-2G¾_?3i3w3<sxqǕt|k~Gh\_ȴiL;mM :׎#0Pn {Ȑa$ ;YG :mcU %c$:8k dkmkFWvj<!ILݜ]~c/m|y5mebU-s2Үu[iۺ Ͷ&69>|yXȘ ZbL_]hYh*\P\^z饰+KG}txKbSC=g/dxn}>)(Kq`)9+1_,pGe4Ņ_l6BYaazL%'wTba˖kyq2GF;^Z^z9뮓>;,5B،)~H:3䤓N )\gZ|x|,-B^~CY믿^~i!ScLܸ#]&yq 23Jppqq'0IZQ6}^zڏkt/DF!zdr+IY H]t wM%Iv>sL{PXzG~K8蘐-!{4|c@Aʍ7L^.=\B&w񼳙 dh)@BeKt_u 3<,>,?9&E&z3m2Ϟ4,yc^|%I⠰1>8p2".cFv;4yq@o$;$.1^<22Uoktd yVu@Ҋmm% 2R:Kl[>K&6s'T!]|+qҍ< /rI'1Y`ق/d)w/h<mn>meH~O(=:5X'Č=)NzNB ?`ၟ~fl;.2ׯ_ e/bȠ( -|'@ u#4ow߽O^J WJNeٶ+촭cRSVmۚv(E)!OiEɗŶjck%f*>9A_ _#~˘'. Xp0tL~5If19AV;8mC"PMt~T{[?;2pdhoV!]D,M98@}EI 6QZm:;J]<8+' ,rR[ۺD(^ET狒 Za{L qdɆ_}o:9eS#0P^̵ٚZT{G Jj5?l V/hEɘ4k@l*65EZ/cSCȖjI#n1㸽8ǛG#PcЇDR%Upriʴ>ڷvRKQ2f5dhjkk:a kC;n GpGpE@yK2xfTFm.TMR fb-ڎ:j^JʨmF~Iw뭷&]/#8#T@r]W$#9 epڔ C,ZbJvZ_ХojG#8#0'#\Pm}}ԇ£QSmTzmL#8#8 |֖Y^S9]]o"QgQԶs_`r#8#8  k Xm+Fcz}}ƴ; U*W`&>qGpG@c(:ڷ>|RFUТixO:b>7tGpG V.9rk{22kΚ:e l(~VEkGpGpA@y֌A;mT-Y}ڎ}T^:j]r0 i*muA*Ӷ8#8@X^mƢMQȔ`Yddž>j_+7cKu= z,"mޘ>v\o;#8#PKbnb9 :U9ti2@Q@^ҧ2[3u|sGpG ;+ba}c[trk0(GY'͖ad}]8#8E@9VG> hM;AVu@m`>Ϫc?;#8#8Yƍ,w^/}JrMekǞcker;#8#P C|hmyK+ø6⩄]\kZm_ȼ8#8#odqUFTڦ3mQdg#^{iAC=lہrk}&Gr;}|`fAyƨVq:LOaj5"puI޽e^z58m}M dzf_ K-<fjyS|Hd]o[n];"l[i/Yƺ~ClI- i] #=zvQjZAUVW5WuLu0 #_qf?$xEVQҥ6E86Jl;kLydAYGo8xoFL:U "diҪMW3:ʌP IDAT3G&O)V1N&2~LYg5势\/mĵ1P~a9HM졪5ZګeVPVLN?\4=:/_Tm۵iS]o۶Sh3 1_̚2]drRqf?͐Ogt Sۉ~շtI B@3` װ%XNm+N\JAٶ&C>^7Sf&k„ aydl:yM^[1|Ay7O,_,]vmG^?,6r-Jn4d&iIGy$[eUdumӇ+׫n!}w;%XBfܛ~Gзr:#N2En&ׯ_8(C[8?CdUR|#ʼW$ \bpni}_H ns9kV9cxQw:묣R9uI?dM\}\ӟ:f9CC?y晧dvm'뭷^IT7x#uds(1B2vqߏ~ mWeye‹גQ#w| ,(LOFO.Jm;we4&z^i-+jk?ܒFr*Tڠ-Fe I' _-L\T?3ygB#g†<θg̨ '?4?wv|(+d"a.]]w%OxoRSJ&h@y͎$Tejr-?X^{%J(95q97tN9Hz/2P<\~ReYFi(' dj7tC[5h`7Aa[Gju3A2ƅUMY qGE^zI~B -$+\ve*_]w5,9~woK^y啒 \YYiK/r۱2?2`O?xa￿ KdW obdv!3Cl]fصK-,bZk|Ԏ~jaYpV믿>q̛mYN;-ȉRtM&e+RkRlc\3[o-~{vȑsυ,g3eWʁ('N,p]zrqɢ.+[+w^1"dY'zgTB,ׂ+K+ROI?ͬiΛ| o^\}9l%/ٍ9J.r -lR}99trQ;73njN2gw[WNA~{}_ڷ_v]'Yb)y륧KcN8YoU.tlh,Sz LeZɬ>ݐXZi2 ~nl9hfBEBRK=iNÇR.,KA:@(vipY2=\;찰./Bx |;s׿0%EcG}4rI' rܹDpoO/|~ ^nAV]ucsXe ˅|) !G}txTȆn({o8o8>#{,S9=y $ k d _0>>sT+c'N!#XҺ__^~I=J7tOo+"]_H>~)A'9Mz\)ȱi=O!照{'KNsKnoB^=~0Q~t)ј2=y\Lrnj Z8X0q_m !cؠ54Y{W_/Z|8Q S=O ]vٰ\0k7h#9œp1Zy啅O5|2_tPPо}{ԩSCŜBL\ɚm!fa<0 0we 5(Zt؝p a#0Bb{2CFAMNёX)D"B  ٰ>}JO=԰k ˔_f^{MEHV~;#D`0F2oV :.甞 g]ov qGaÆby@!7 j<*[$gA O_{T=VYho>x\?N7zxb]Mۄ|մ mwNk6=g얐K}.8a?5vڇl8-EkߣHZ`wєjk*Kϒ_ȯXIu@ _|B4>| IzZ/y3w3ĴiѲ:JƖ8O 7}榐ɂo0'>V_ ;3/˜jEAOA?:Vzj!|pD <ԑcKlkQ5dBȐ=~hd mH$'|2܍ 8tnjQCfX!dq02dK}!}r -W?:/ɢQXU5Ę,,8-HǶ1^~Xir&r=ɤ_i_1Zj ɳkϕ+_omjm;&YMBԧ&&yiu;wM^vm>5{KlΟd?wSsG`Z g)Yf&kJleuڠϲ6OcsAve~MlAjUBy#o0.DdKbiBQfС(1c1ؾay}mAE}vָ;/xs7 2|)A?Vboc¾6 `|XFe*K}~,ǑifKl9dN,ȔLLLu:sL:.:OEmi[{S~@XVe"CO=j)YעmB?owKmCWYlu'?bKozj!98Ib:K5]%L KcӮQ+mtKb.\Jg1H7篾qòp tM@qfml*bSՠd,/<6y:)Tb/uA*[EF|A4c.z ?.&[,lFX<;c/~#ʼn_\<̭sl^3.d}7@F{Ƙ=h,3{yֱYH ,iAZY;?;O}< 9dXw br4c:w|<ؒd<8eoje Nlo6cPeI(+M+8r%w`1Phe1i]FX,ԍgɂ..^D&4Af&//R+w -*[d/HN~|$BlVCX+OZxQzuln_ysd'>RGcx{>6wXKl~T3Cd#Xqb1}%]̟I(UP2٤ߪut1t{aϹQ=i_9ec2ynVYW.:&{-7mA>T6BYdcRXɂAT%o'|kF%֑ 㾗en/zON&IvylϤҹRt + {)]*S00.Kn'Xmcc+҄TDFFIm_;'!zYA=jnA0:󋆌sa-R۶ვ똢J\(f)"#/MCk b\ž%t'w [E&HұAJ Zd K\08ǫw6i9Rm<`ٓCV;VY?]RC9V(s)[hrY"{ g^gK}X7#&:vʤ ?X?G? !%?q8iסiXt9Z['8T*T5.y؄^A[^]h 7*2ߥd$o' I^ISmlM$+n#K{%⒜v((`KGi;^u^7SbC7 VWrk9}%sٲ-imX"kVj TP)ؗ"x_ɍ1?8L,9ϳrJ_WnTfaF-H%W GdLʛm,* #$yc=F_/#DJnm-]sQ`EKI k@ö'M._}n4y$w)|8@KB}ܘ@:kI^j.DN߈5X%͒oj3^\.k]ʴjcIY}n!d,-4hul?7HW:#8#HrSOkmT&WR2VL jGpGpB@G$U%Y6Ad\6H\8#8@:帆&ii64v| ^''xB6|sYb%d5הW^y%诸 Ygud 6@Ȯa:seUWW\Q:Xo뮲Kk!oveKIzHƌ6lX/Z+;ˇ~hkjj-rGo, / h媫 y!χ,!2d^u IDATiȑ#-"~G.x /3f]<'s?}$iwc=V:w,e„ aB~laD-~m@>찴'2Adzrh܎&$ y'e4'#HauĈaIñq:_Q-+'WW!'Ē$yydFns-O9m4iݺuxg,km۶yQ9#|L<6dVN[u0ʴ@d!}3쯷9}tTC2|J뿏 #y}I&-"?lG-K1{W,ZrFD Xxjk4Yꆐ e6@ ,MVf٠dҌ8uFkOS7\(3VXwKRҦc{7.g}ԙooɓ巿mSng~U:F`T@Dװ44YiCɘ lNVY6tWNU֭׀eV&\$LG1Ɋ͔v8Dft4j^[n9Ys5eԨQa(_,krgNO?ɱ+orQG !-?ڕ;Cg^nvYG-Ѹ袋B\7|cC{ 7 c[^xr-w}W06J'9>,ꫯ˲.+o}8b?,9oB0o~#7tSɊmVc n+~hy饗dM7 qk9#az?N,п Px8?Ȋ{W1cFXZtW&1/#()p ld,/<6qyضYrlSJ,<7ørnDOI \S&X)شmSyNz+\{0N[믗O>$u.Z,zJx≒-Kƍ+~סEUV*uYdDz!䐋|']vYIwaI׮]瞓KN9唒^}U -%XB=PѣGI/,q!ȋ/ E;V#)gqFM6axذay z ']w5CyO>2eʔ7gy&|0A d-62vd )#F=S8WMMMRR2Ǘ~Zg<kS K1΍w2\sM8g8;v>3 yqf@|YfmXkۮ IAk_k ,:OgZL%G\JdkGIM5%C.6=6 Ku +-BҮ]0{ʒK..ԩ0u=,Vd^۹s0gdyۗd Y-XȠA_Ndp_~y [l 5tPxtdK]J9ab;%X!jN+\[o@48@ȺhɊ]&}ZJ+c4 :'Jbs1!D6桇%3Hk6өB=`R’ùV,P{XCrnja -YqM^N;7[{o ;c!\8"9EKG5nUdqq12JtiEM"T(ll'uw:D5ܭ 2?CӦĄg~a@X:蠃d=#,L;/ʐYO։eøGoئh),E:>=0ȱݫW:ɊA^[TM!{ ifo߾2<L~ia28e'K,OC|RyS"Myc;܀SW;S` Op~FT}.CV2S(&evbmkq_S9}V}k0T=@#9g}`R]˦U6D,I:orX=~Ld3هÞ^8,q(KxzN|Hnq4Åd:k􅜥B]wu 5$ޫ#,"a =d 8qbGJoedrCDZa|ne<)0;Vw޹8<0)d1W_} o.{뭷6sՔ\yV7Y(6]n ;@>MxV^@E6v<{kWdNlL5p+:B&|s o3CZd~Yl`:.Y eUVHp \!\ cuǾCtUWl _>b >(yc9}MkN;$l'Sv͆z1}%t .acZa|Y;V#sN], C guV.œ'X 8JZk-Qe?^pT[; i>Ȋ{Wm&|X*n;.ߋ#4MtNrV4U봁\i5DN_]Ff_زzdYAd4> X3xP,fB }Sem7ɌeAcd6#0 t'c~J8@c"@V.s؍_l@>L*p "ˎr3G"X-/Fy~jc̳vuڍAĶDq_rۮ\/ԇ] /49#8@#ЄkY1+kOW[U$ Z"sڴ@z.6mp7OcSαd/>ߋ#8&VyܤVK4A6>Dzxr>߄onM0ar-?ydҤIu裏#+a,4Ȯvm7?Ѡb-&?ڊW_}Ux[:뮻W^umvu}; O_] Ge"<:?l@զQM#cĕN6`dcʟ'yG套^믿^cdM䭷*a;7\g5Ȏ|?L \r3$k잯(Gyd$Tk&W\qEa^xAِOpf -&C6v_42Vie ڌ6-;C .'|R_|qu]Kjo,F'OB&MKng~I=_q*usv}wys,ꪶrK [hr-'d8lA@ ʲؖCǫWzF ؠmFieko[KuM7w-{w #K|\\sM5jT!|=Y,OςN";Ek6. td<6pCaN ٻ?<3r0.;ꨣx+y%_m\tEa.Hob=zI v ą^(Z!3\9嬳\&w1o gz*) IDAT駟[oJ4C, A\D/첒غv*=\ rJIw y'=Br1gi2y 7=z_%3{W¼\(Cf;8a?{^=筷^YԂ[QM6_=dXe]v C ?K-9Oڷo9fL-0iA `d%KJgl)&^G!X H6t}y0?8g4[LLu/HaH媫>/{n8/lFD8_|P8B[o<#r={o_2|8lC #L2؀dVnK 4MZ2 ҕ?K i/|3B  IVAVi-(8pŅPC6a@?8\$ -d ?d. ovPsLj#B>-Cfu Do IQ ed`!ü/gṟlV!k-3 0j2~`M3< ~@58XNbu_଍dYSg1&+/BVY&HY2E l(ӗ!;,5V!OX 腒9W .5'Q AȠA*TTSi&,L!zaHeҁA(W,sZ5] xRE^x "B3zlLrb{m*ﻖyt0άǹ@g\8^HwWR Zl*pf?&ZdkHf,mrf6mLDY,ge1.:duϞ%l/|VWM6ȒŒdz+w&c9&djjj’^Гqa>^GYtEÒYiuq}lO>">:엲٦Q w;oWPuL!,B1TY>}B]2}엂rnҩSeUKj dLB6k?_5R#K,i8QRJ1bLH1ĉ=Z`R!syVZscɮ$O6IٴTc1+6,(6QD)J~'s^|;圙9{y<&=_if U> -=t# g"##e:MYA_J2Tk2!ԓCsd5-W  xb{?ay4zBs}A%b˂ZYxBTO_!}F6bu5GĨLrJ]2XQ? X)vbJF;XEex{\krCh"Gy"UUvgvJ ђ aQYL_ڲ"y$~ ;D%X0s==6 C"PWza_񌅗 C01:G^E֗r;)xwR37*8/_(;zΆm C"P7{yGLxETX) sDG~\I7iCu¼u:40' u-o ;bl F"ez@B2ƳO ?Rf cяG7V.uJ1:Kw4Z:6]C`cC@~uc0^E8Kde ,FiM#cm(Fk#%\ұnt C0 ChI42Ht #2mt(#҆Z҆!PA`unUwzV o=0 ]_wݫ:ۚ{(J9!:XgӍ21P(&4 r@ a X,]ӕ" !`4 Dln=*u]Cs-buDFYEMkX@-խ0"GluWָyKֺe C<p#WT~Xzx/קW +_wi u9 rR*~z͆ӘazY!`@{ŖDgq}zs}֭(QT C([=WUccƸٮou"KL7V*4Jƴ eb O頛I[B3b2nM6Q?o?"6BC\ޑhRTqty]^U^Ej%J~}l C ÉmCϗ"'_jRMzXF"a*I*~+2 C0 C" tt 2 -)'"KņFڵk !`u# "@E$':͜kX*ݱNp]ӹC oᮺ*ٳ#Cm}sn;N 0 TEXcэKqdҝ:M1M"믻/ro{衇;6^=!`pԯ{ nSQt:¶䡾7r>Ϻ .tMnٲeꫯ!`4iƲ12v\kR_^ YԱ(D`-t[lW\/>ڍ?} _pVn=p|[hQUs1^O}ʗOrlJ͛8uI'W^yo[7i$O?{W\>-։'?^4}twǺ=%Ki[niUfC0 ,-RJEGNՕr/qqT}md*M{JCCJ/-\vas~mn8oɓ'~ؓz~wyv]{nŊoq^~իWÇ~ӟ|+~n^wҥg?sw't2O?e;찃dkow}cs/r~NҔ)S#pSN#1w\[6T!`t x^iP-uRiL.hXH6Z)i䒎T+,뢿R8.SXٳg{2կ~z^xg LćЫW/O,5ʗw޾$CdA{ a<O?xY6ۨ;~gY3Doq_ΣI3fW_}U5(Ý(}9J|;r/Her:BHA$lv C #$EWKY~LOf+2BfGbBC [|o&ȹ.HpSNߴ\xcpvr@}3zȑ#}xA z4G?Ik7ۘ?񏳇!?y/}ɝviճoʟk_'{RVKX9 9S/X2Ch(tceM38eR.0ƣ&e=ISƇ!{RFP\>HK|໕VV[mk7ԐUI'//ȑZ|/;y!CTulﯽZmNۈ1rug͚ĝ0a;p\n'fnv;l@@LrfړnAnn܈^>nY_ v&G3ڤKCo5%uG|hGZb,WIi$i :!'COȜӺ.!P3BĨ8xVsH٪%,!`4 $iݐhI,cOTxz$/楜8'z6 C0 C @SQ4zrݏaZJVgl%$ʰw29YL =zluO܂7]>?P|<}Sd3f/qY%4jZy|;]$54G9EKNhX0OI*~~Mب]n`wzT9ʓ<!`B`5n+??oxtPWza/X(abD*/uEN6qQj@4rIǺcr+3 C0 CY'C#nFȘ6T˴ѡK:.kd 0 C0 ZC>xLCL˳FXXe|f/7k0 CtZILKY,U_TFX6P 4S.nZMC0 CӚ-#$EWKY~LOf"c1,)mlv$&4 C0 C @$+TGidLOP&9e!`!`Eq &S[VȦQ23>'Zj;,ݠUVٳg; K,qwy[hQGu٪VX?쳭t,c!`tr z(et~6]+cj=bXrLmE{c9ƍ7r-b?{ڟjA]wZZZgwp_X{u?ʕ+7U/g !`B )(|$hTk]udzX|+d1-{%\n֬Yꫯv;s0~xw#<}vauկ~tw?[oU-[b˗uL0 C`r |ߦ^=dM#0OQYL?͆--BT֭sjQN;͓O<=䓾|ҥ_Lӟ/=Pf?s?y1c]pNr?яܣ>N=Tg o 7/^.{}뿺}{/_==c_*#xƎ&OfΜ[w~V0 C0 " t 2 c)'"Ky'M9?p R&۷'J={t_׽Og>㮿z~ЗCΝy饗… }h<GϧQA7h nk/OОyTy77f7j(_ ?O2A."9z2RAxoc8s=y}[Ձm۝y^.slB r֓-;/BףGXXॣ>ۖm۫W/wgy湻Y0 C0nꋮ&Fcԉ Q IDATNS6l5H???7qw'`" k׮ېtЯ_(At.rSO|.W۪->}H]lrw.bYO~Ŗ6 C0 2#Mԯ֫efĨ\ =(ò"yyHc=I^)2I >=R zG. ۑ!C_܋/epV TSfϋU+gyo>8& B_V^ &N论*onZ0 C0::Tcd,6XXX}өiӦ3O3Ux8N|qy"}o}['?ISO}{8UK8묳nv_Am4uu=t{;88t_>>W[0@` C0 B@E;䢣NJԗ|8 eR.0QF{rIK̶N>v\ϟJyC#-5;po92 7ٖ'#tX|q^uE^&`/ I٭2c:˖-sx6l8Yc@"$3ix&Z0 C0vUXS}xĈUYp-H8\>A$ScJqg'c KZtN8I{4J1b"FB'4:ꨆm0y3M%?e|ňXhZC0 @@8I>nȴFȘ dP2Zۑt\,>_&r7H[q΂!`!fH9!:XgӍ21P(&RALo`#ؙl4[ C0=!МD˄hQym7B4(FaDƋOF4ޚ[n C0I;?b]kN\tuʨ_^XQ1`Sj&]sf!`7V_b],Hӎ66I?WOtt9}* 2;i: b.VEr!`!Pp0X}zX̨2F/Ӈ!`!(?rܤL}_MzɘLJC,lH[0 C0 9"2?tvE'GͲ ;Q ii/V,V_Xl!`@HC.:tK}ɗcdck#SiKՏee!`!`!P-De4E}H{mfoʰm6R%%]^sO<{7JپfwmM0 C0F@8I>C*6B0m@X&B'rݎeGyn+eٳu&NXJ֭[ao;>=zĜ[Uo-[͎BkHh(Cv|J9!:XgӍ1CcebQY#Ei͚5n7wk׮-A:i,^xO3<^yj*o*53eC%ǕW^+(v^!pӧw\֓!`yB9  [:"Kj܈gHAB( b!%{{爺nm,K.7|&<{b\H$؀sÇok7g?6?nvp>c=܎;ت}D SNu={tr?|r7l0w衇:?n8M.zwᄏK>t?h"[C9fn\ ,yW59=޴㏻~ڭXmnҤI~Kl%̝;w}裏|aL\3g%ג~z-B;,:Ɖ@;Ep/-S"6rfNrdRWFdna>ub2bƈ#QgL􅈅6@&|!rG  [6O }⡉CېUlη[d^W BToA " =Rk&bQ'D/Vrz i0`vT9ق!#^!g,e\l &| GLB)27Ad80!eֱ!`l㚝pJ utyN_O[4ԓbCd1N_DcA*ЕE>:x: 4*H]On/|߾Dη3ȰHǂ2.OxXIC Sx\PnA%` Ȗ ;c[R/s$ Z+ʍ .d[#&Onكd18gCb 2p }r!ifbC0 "G9EKfڭ<44FҨ,_N#J/9k%c,xsغ}΂vwmA2n;ꨣ9٢Agj Q@…Ej~Xڟ Ol@P4a9DG}!,:ty*7:[4.H7a/.s!S+JM]!eֱ!`MF@GYa,ʥNX:(rIbjA.ii9Dxw+[nxjj=/P,fO*[Yu_Ķ 5KxbXx!aAKVE(~.Ov,̧M屗S rr2Ӕ>j9i­"@LICNgq#ŨhRħ-CRHy;'&0 N(yetݔvbqeܺT{ZtN/7ڬmBĨnK9EbC0:9eKfA57X 6tZڌ!՗:]:4-HYX~@M(mD!`lp[ A.:zT])/X-:JFҴ˕ jǢ nd,e6V`!P/E9O/]J/$BJ6jPI3(IZуɭ0 C0 f! D)T!cP1",F2Z.mHu-m!`@!A_$ʴoNO/'1!`!)h絺,HIZ1mkH 44S%iTEӏtS/n9#L0 C0 h5,<7R!Pabt*/UEN~O<3W^qVjF]t|V믿̙וW^Y՛2e{衇f$ .p@H۵m\k?_K:xKXr{ꩧ.Y8Ce괗ύφ5:2#Mԯ{(11*ױNSaYVZh"H}ŋKSġ¨.dDju[̜ݰanF}՗[ҥK]޽iS2dNaa4^pukDŶ)鸑p݆NbebNASd #GWΚ5M>mo߾3Ψʋcƌq|$1c;묳hǡܠ.fbniӦ97d7Z9h>q?ᄎ˦o{>t-RF.:tK}ɗcdck#SiKՏx֭!uZ7͛7{ c_s5# 0,=O &xOs=}YwQGW_}=+p嗻tAV%K>5;ZwÇ{] r!/(<޶+VM46R^AiönΝN:$w-o+Կl^`{8` NOv Vk>x !vX?筷ޚcǺѣG{{`z衞MEF/eԨQ>k'xbl$׌ U[q\!gdٻp.[x6Sns#FpQ9-avpa=p;;12EW_o{1\'eN3 IWkM,{2/+~6*/ 7N;4`#~mΠr< $@IrtC{fNm@X&飫IEQŚX` YLy/V@XLHO,7cۤ,, ` %p'~?g3hXXܩaaexlҹ~yR!٠.ׁER;<k5Lhlv\SbeOlr/T EkadNuC@ [B/|5hrd0⏜u;-!Ms E !y0r \32^%W?@F *V$(ʴj!adQg} Yf_O}- x|}| /CDGCnqo)/&u ސBiyĽrM7yN\Ӣ9"m[ltB9  uDFYEMiFm+kfB_d W@Υ ΗDzLls=R&0f [*4H[ԩSݙgsCX\ !uL=El^xᅡJyl#[Jdz8㪋+7l?N2mɡ tm/\;BӚꈬ_xWabEXo`r rd _<]{ vx9l# #Ē9C`ڌmVftќr)OQTrT7mˋ:۶nV=cOY2Oo9@yN=gزLX홷u@ N IDATarjY(٪+!y}X ~3zho_-" /$"{ꩧRK/ׅ5sU(CHq@M*m@0?>A ?LI6Q;=ļPA}r-!6\?|AkLY_pr 3Ott̜g)6@go^T3à|ҔA˜S)X1Btz$/y)'ɴ^HC(8ȌF"YD[ZZj"#6yW7i.L-V(B/˜>l輜ea0 lL<9T)/J\7;ʴKQ_x,Rul ee#D [_Ed6Sck֌'eW}K1 u3WR6`_8o9 N@SQ4zr=Ltt-itt{UY=d,PPO__s}*'[ER< k<4#0AZ8El=MjUkVB83boW6v բY^Fme/kI n@م4G9EKu2yHUՁhv(bz[o.[5 1(=تR3?kvjclM/4mk0^^̦fB҆JZ 2#Nٿ_s5[ݯ_?&Zd۷o_N;9:   r!/ཛ?[`{=q5jTB:,Yg ފ=t+Kh0cɓݦn=>5k$;޾۬S={SN9{QO^~ePغaVew8s= 9l0w衇kG=5m4O.n;w;餓|7t=zof`ٳK Ő064sVKK;#͢y vm~>|ٲeŃm"{؜qVLX8I-"灷cʱ-  ?0@+'m' j|}a#]G 9-S@)Nb 6\\?<`@4׌r m^ bx ˴5 ,@ laۏ2>{*s:h%d*#;%Bߜ,^[xC!ƔcV CtS}Qlg.cir)cbȘFEdM}%cr7" |#ŌX}z=cUR'6Q"Eg<\.uR!wfL/Ƀ 0 5[ -sc cƂovsL뒛>RW{s[ d\c6õ@x.,.u,@;Br#'+SnX?kkB҃iP?, *|;^d)JBه[K+M0y( <6b+Ғ6v(mQ8Y"B*WVU ?u.X mŖ-7l!C> !؊}yd` 92!y,ʲ`Sm_mtFxZyyHL:՝yY{h5h@ flBvb§1xWAYTpX AD:Nd+(-sI7!{Uka u?2 x[sZm/qe3f'+gxo5E^xs{~H\t4?T])/ F]Pޕ&i漗6-pNߒܘh5[ RitSdJl I#t%]?&Re<֬YAڵk]̙: /|IOŋڊ+ Ԝ_j 믿^s ]̙nft&l#\7|39^/\JޙƖ48"hּ`?xܹW_~ysx SLq=P՛V1KMk'Cx*(1miCy-6t\$׺>[{>}<721u Yfyq׻K.ĭ^:Th-?Ί/G͒fЌ6 8˗/6YZ~nذaU[;:?~td޼yվOqT^jϒ%KP vA]Y&Vt#d,fhL 2t>kdw@owmȑ#QGN9[oy/3f;cdOcgםqnMo{6rwsGgvڴil1vuc=8׻wg}M7w$ݾ$Z&%Y,U_TؙI m+kRw!c JfϞ=yDv/E|H'ܦ-ignM7m#Mgu첋{|{キ>|cq~lM>b : ׫W/kܡj_yO>>`/oyP @V wqr-w멧r :46v aԩ![nq1{ <,_~R5eq:#?3y?C\FXǎ븮xZd_tǏҎƖ>R݅ =,a9ȜA~|A8dK'9j2ÜFfie˖o9qm#F1}2_?x޽뮻<G[m8= o\;t&Mry)ۤ{1 v[/.;{vqG ya'7nLJKxK+<挃}N̻gv}E]-0^RV /UdӘaz K0ëL@7GxpfN;J][x{^2!*,lh g[ovaQ">Dme6@lXcƈdB=8-|g<A9KC\뒆RC]w URACH !Լnu6v?=~Avdf=z;H[@27wm7O=ʕ+gn@!m7fz,)ۄ__^6N?䅶 IDATS雘yw7,N乱l.'{x!JPv3y=D f̘GhȘFdJq7b|箨~C`hv[Ƨ݈9nKy0\R 2<<$9x;xꢃLĊŅ|Hs>rޜy!]C b& `IǢ#$O݇.o<8xt#rުIܹ.8m#l<\l =[)aaa!|X­"n4,BN|]Sd,1p$ak\ŃK}Yx h󲡯}s]C}w}b\k3zUʖ;m6zQr@R/ 2nhڠ<$* `&^oH!\عO8*͍5מsv]O\oq`&S?kwrmKvj>k 7^`s_$m[?lwqn,]S1m pgXygxЄ_B s?5h.p lr@<8*3*G$ 9&ue(c]JjҞ|  JXg k_+ ѣG{uw_ k6Zr|Cғr/No[gM#0OQYL?M,)aa|4m1L.Y8WW8tٵ^FxHE]mb[mK؛~[6*sOrXr9Ss՚"/D0J(IJi3a]SSŷO/Ro6Ķ B,ly1^81!JCƗBO==Rxܯx |!$+s"6rfBxe:&ƚk,//$;kk&$oC+%T ?] :u/:/avyfX[y99gmVE2ܩ#ibISY#咖0VhF;:cTXyG.iB# B@xT""yh&jtZ%fѬo"y; ea^_GNKem}"& [}lBW.suqƆm"b[xnv-\HuX۴tG@GjEXcэKqdҝ:M1;.ߣG/V(7d?OG>GyZ~:&Mr\xwիW[n{N;4wUWwur~P-ܹsr'Ovs{?Aw 'SO==_ݑGN:$/m 6mZ:='moٽ+G?'c'x={+jvu _6]j__<6G}_RmܧL1wYs{9U=o48yryxC!m,,`!)[6!2>0 _uǙC=HL~}zя~_3f8s=uT/2 ~WAXfuo-_+^\pӔ l/~ |{JVAx`dM R} !6) pd~1nmv ˽µ\v ݣz?]|tewqS|D{WCZp })/Bvw_6=0\xrro3p.%BQMxq!AIg,Em~Sro_䥜g4aq |4?tY*nQ^g6Z)inc\@׏ɻdovfxÓ[E!T!cxrN`c E|A $RF  @ӁqwxgƍE|uX\?[noy 5A9-O^c6cP흇I׾淜 N^MQ:ƟA (3~ݾeܺ~QR7K{t{=׎C_WT_xxV@BS=K:ЖoK-jw5҇4 $"AD?!_PD " $!$Jus߼oާz!s'nיw;[ŀW9^0є/_2r9礟j! q3/]Y);[g؁7)*-_E=&uIܥs;[^p-:Ԏo(Nu4oxv"Zks*7^zig=QDZ94tSv>ǡ{ oZooACw{sMJux o!D5]019->[L9cVyp_ظk>eqG,mռ>'ǡD׽us]{^;~'8j/rh&GF5&Ԍg.>K\x46x˲ 0?(?F 'E}5ψZ|Pܾ9F,eלĩO7S]O ŋ}񘽋D>b=ؿRXWgTᣟzh: CR{?{Ȋ13gQ^x(-&#r)3oaaJń xi_hmssϝN Y,uMU&x=ܼpnb \u];z?[;xn#ltu +'E3k\QM|ni36 V w%CCf ^n_9<ܜ$IX5DE4(=ɼ|K- >nSGur[M"GW.b "(]Ʀl!ܳ"|ӵJ9h0r9ߥ׸q_]3`CZ=c_|0gVksFyա=/y]vu8l[mZ_`x\ڼ:t~2v9֏9yۗcP3A{kXb$PیiXG1A % \g FXx w8<]mJHqz@WOuabzܼXZ "Xt-׉O>yV.ˆ;L&+9=dždSL1JQZTǜXK-̀0f 3PbSGFq%G]睉i.q)YVZ, 3`̀09%_rk|_ӌ$㈅F)ŢXY.3`̀0f t2зhc/hƴP,4d~ت34f 3`PWb/BGY+nF_D3 կLqm̀0f .pE$>O,1f,WT"X>kc̀0f eOQMz-;:r}qx6f 3`@Z˜c^bjk 嚱Ir>ṟ4f 3`P['FK3vokƆ,[EtWϭe0f 3`-Ǧ T_Ik ηF暱59ZIqe4? 3`̀0b=a>4cZ(>-:`ks+ֺ0f 3`QbtOU}f,Wh5"4f 3`$cU c9_)9S9O36CYX163`̀0f`2Z= !V !OynƺEaӻt7mZe:p 3`̀(1&@{6+`͘ŵcq ^[q^r3`̀0XkvWOEvabs IDATp_@ZLq̀0f 3PcSL`_4c} âCѴ)YX釬g 3`̀05J=zRsU:QK돺3wшMɢhǢab9}f 3`̀1з(g[c̘;ck&8bFJ&g 3`̀0 +".Xh"1-: 6٢|-̀0f 30؋Юsьªchp>S\&?m3`̀0f%{(Kh9է>6Ƙ3`̀0f@z> }l3ƢjNG_+̀0f 3Pcֿ0ꘗcf,.s,̀0f 30<ĉDR.̧[暱! *k%skg̀0f .z ıi9WҁZ󭑹fl hERGzn3f 3``O}Xϵ<͘"O1*⊵ǹ0f .b?<}]'xU@vH̀0f 3 b=ؿeXWgTӌM'P@uL0f 3`F1#= Ī\~ɧ%L_t3U, VA3`̀0f 57asJ#6cZO,1f,WT"X>kc̀0f eOQMz-;:r}qx6f 3`@Z˜c^bjk 嚱Ir>ṟ4f 3`P['FK3vokƆ,[EtWϭe0f 3`-Ǧ T_Ik ηF暱59ZIqe4? 3`̀0b=a>4cZ(>-:`ks+ֺ0f 3`QbtOU}f,Wh5"4f 3`$cU c9_)9S9O36CYX1f 3`̀\$~r%0XW(,bz[̀0f 3g$+یiX^1G % 4f 3`@]={Ӆi_3-jE"ֶ0f 3`J z 4_ڀ)V:wfOaXTq(6% 663`̀0f`2R#\JbiL3wшMɢhǢab9|ѷi¦*0f 30%VmJ8ٿ Qӌ$㈅F)ŢXYk_F3`̀0 ,5o_qF _ьiYhy臭:1~K3`̀0f e}E)/"ky5fE4cX(,\ɏqf 3`̀bG ^$Js3ZmrE)ﳆ1f 3`̀PޤO7HیbS#Gm3`̀0f /i:%X Z/C,K3`̀0f eE)qb?QK?ifl¹JZdI|Z3`̀0fqlڟpNt`|kd[áEk[Fsq̀0f 3(ؓhA(s?O3Ӣc 9ʮb3`̀0f؏Oe F4^ir|,Pc]-A3`̀0f ,hO1/qY034cI:-|8l̀0f Q %kO8/_i~ ݌u"w=q 3`̀0yz Mr؜/͘cy ^[q.K3`̀0f t1S7<]ؾyZ @\1ӢVZ,bm3`̀0f@@ bկs(iEiShY)κ0f 3`j z (uOcFmJE; 3f 3`@=E G?5`4ck&8bFJ&g:p@à0f l\zݷ h/hƴP,4<臭:1r&N9z '3`̀0Kd`]M@EhQFjxhtaձPYU).%^d̀0f c`I?JE\>Čc\Q}`ca0f 3`>G7铯 6c,A~Źo 3`̀05j cy18kC'e:3 3`̀0C`oQCOT/|ڽepnRY1_)?}f 3`̀b@'S}%خ58kրphZ$uĩ\>3`̀0f ,$Ї5J\ӌi,"qΡ+Xf 3`̀b #GY?ur>Wy\9 |jWt 3`̀0 b ړhK\V1||LaQšhڔ,,Cbǹ0f =J*uŨ?ӘfGEюEîrx̀0f 3coOQ%F51ؚI2XhR,e2f 3`@'}6ZxfL BM臭:1~K3`̀0f e}E)/"ky5fE4cX(,\ɏ^63`̀0f`2&H$+O,1f,WT"X>kd16qlN3`̀0f 3j6?-;:r}qx%3`̀0XkvaLձ3 ߱JF Wҳ!k3)C,K3`̀0f eE)qb?QK?ifl¹JZdI|Z3`̀0fqlڟpNt`|kd[áEk[Fsq̀0f 3(ؓhA(s?O3Ӣc 9ʮb3`̀0f؏Oe F4^ir|,Pc]-A3`̀0f ,hO1/qY034cI:-|8l̀0f Q %kO8/_i~ ݌u"w=q 3`̀0yz Mr؜/͘cy ^[q.K3`̀0f t1S7<]ؾyZ @\1ӢVZ,bm3`̀0f@@ bկs(iEiShY)κ0f 3`j z (uOcFmJE; 3f 3`@=E G?5`4ck&8bFJ&g 3`̀0 +".Xh"1-: 6٢|-̀0f 30؋Юsьªchp>S\&?m3`̀0f%{(Kh9է>6Ƙ3`̀0f@z> }l3ƢjNG_+̀0f 3Pcֿ0ꘗcf,.s,̀0f 30<ĉDR.̧[暱! *k%skm۶-ٳ 3`̀0f0jf/atce۵[#,֡Ek[Ys^>:}N7oN[.{{d0f 3 ݻ7p q'>%}LX})`b u]qM263`̀0f`c1c9&~2,QbOU}f,Wh5" ܹf 3`Xr#c=ؿĝU cE|]#sόТYX72N7f 3`@$~r%0XW(,bz[̀0f 3g$+یiX^1G % 4f 3`@]={Ӆi_3-jE"ֶ0f 3`J z 4_ڀ)V:wfOaXTq(6% 6⬛3`̀0f@@RjJ~]G1zi4hѦdQcѰk>3`̀0f SpɭQ1 fL3f#mjb9|f̀0f 3@߾"⢍޿,Bh-ax̧ 3`̀0C`_QʋZ1:g }͘.:6 W3ecܶ0f 3``Q±\>Čc\Q}`ca0f 3`>G7铯 sH,A~Źo uf@׹ ܦM*U_FʿX82ei},TL UV/ʵi:2/kg1,̂:ҳasΤ\>s,̀ f߾}xG'>暴gϞe`۷c=6uYя~tڲeK>enYc& ś|%]xuknj VbO=nG:cOb81ڟu߅[-ԣD+ dԷ:%?a#?g\q/obf l؄LߛO?=/ RA/<]uU颋.j^?.G~1yxwXݻ7͟Mox'~wMJ[O?bj_Ӱ^o Z{.JW-=H[9㤓Nf m_Hpk8nѢuF25z;tцd:}-+m`W7o3`>7|szk^s?s_?;=/[\ɇ>gg6Mzsm6B>[ֱؽ{wzK>ο[)oSܦ?BNGwqzk?:n؟16\)cƦ 8lJ3xDCtl.#w*hzƎoݜE`h >[31[0x[/O9昴oᄡɝjި"!o}}?t+Mw^зfnb,g˾^c=ؿ?|mby5Z4 v3p0 7ܐ>m L;|;onӎ:=(N6(o{ҳկ~uHXnЄAgGud??JGyîE},>~v|;NN8>c؏XzC^Zcor:LvL߹yڶyyۏ;xæ/wN}]tq'{=hM!zb:tLC㰝S첕4aJ{RG;HO?+)4?X/N>!}ۧH_7ݸ{ss`ݷٚs9}3^:v|[z\zo=oM}/뮹o}szٳz%;^#9hG ?75 WI74os;M&.z^?]/9lsnؼwƴx!ZsY3D".,nwkq8nzPx~lطr~}^קswN_t'??iES3f蝩1cs4wFf,<[ }4\rI/ުzq,^oE_>~Ѐ4tzwwp9X1uM'~״i,ݵ?ݴwS}鸝;6m';}9yMU)~}Tz ?%{[ox_ta?A4whcu{;}NME8>җ}SO=5?c8뿞/W*wqm {n.8_~K:۴ϲm6w7 Ysg5,}c/>3W.;'_73)]|՞:}MOy?}cpsc{&yksڼ{ǥ/^yusZOXSu8JW1ʖⱨjE+.[Em3`HnE8mĚ_y7 iB WӧMg/~e ( _Z< qj!x#+_6/})}N/j=lxKqgM+h#~,Xعi &i$X4- M<4c9vtmOMֵnw{{slύ͇ &we/ߦGjG#Fs4qs}Xsϑvlm>\}u1ϾG{ע*~'BE5~ay"3`1;x 1H4Hx %f~<x we/!n7s ]r'A+_ \<18?ֹ?PCԂ:!Q;1]%cOMb|k_kB-Ճ66|;yzlvb\1m=iSeYÚc4pwitl݌?R& X[wSb5[{of:cgw]eqQn=g7퓷gjNgӐ5_k6g654O_;YE%-YDKBY.8ت34f` @.rCc 16I;mnM93~+׿m䏗%֎m;{[?ƶ ^|ű;olsg%t؋Юe+f>晱8:pfW6w6f` Ewb Jh^h>x&~w Xr.`8'2q .h??i[#SlS J#6W~_e YQ[?S~5$?Kϴ9d4pWzyj綠ͷn߶5mkޣ~Ȧc{7αCM$emx=7< :H_S߶Q<ۤg|$83wih6pl;m0uS ;ިwAGi:"Q'r15vjN8 1皎={‹[/dl,:^ U9y:{Ї8b@2/hy?3?򖷴_;9/yKKo}[Fs.ڣt&U>7=qK˿ ȨXDӇOnXx3~_ O4׽OY"}}_{N=4jo/>_[OŞk+NS晰_;6_cd^{r?x{?c=C>p %ay;>rьƁ;!9rfu7rY:nMwu9n4cx%WŞzcmӌbC-b=.ME75KJc|3ߦw|ʁi''Ko5/s,X)>ՏntG&[ 3u;cծIcb/|fsxW>Khuus?[+UaYT/ߵqkd G)_,阯[>3``*>_3Kޓ7=V[~'g\wXe[Ա@Ïu溸mDvW2E>_.VCo}tՅHBCi`bz ıiWҁ-sǂ81m2|1-Yhf7{3p]|W)oA؈w2]>8А}|طa|,Rq,3 |MG?;>/~]2}Tw#!ceb{ze;ޙw}r#Mc?mJ}{:M*6]S/ٔF :qlhמ ?3ְa6x!3KN?!3l[ _$7y.iOG×0֖y,pǓ=.wOw?-.4]O.-@hMh1xm}N >eƠMTl%/6]Sg& 1mt3֐a6 hevxzW 1aw x+yvꩧNa潛cL[@C.O.#=x>Nk^hPEhƴB3Leـ SL1m b@f|X3A/R<ďO-|o3(yL ކć@lgڲDZu/u0q*ݝlx^pWGўqbO_.C~E7c] ӝ-f l _h6dhV_pV^t"]cz o4߾.$ 4z _r؜oaیi(J1M % 4f 2&P[>@sh8;z˪`ofhޖV|-WL,Xf 3`̀(1P)|iX}0c>aQšhڔ,,Cbǹ0f =J*uŨ?O@FpwшMɢh֭rx̀0f 3coOQ%F51wLqBbQM,,c0f 3`:WD\E4cZ(umE?l[3`̀0f.ĕv]#F7/ӅUBfW9py3`̀0f4b|;c_=cE$5G}_mX.+V}ȁ>9f 3`̀X;/=O1f%1sɱwXTiqRD>Ҷ4f 3`@m-2W=!U2b\36d>0uTHLqY3`̀0fe]6#FL-DsT\ӗkXDgrBkƨCb26̀0f 30%\woMgfA]m}/\36h0w0-:w8QG 3`̀03 {ߝBœOCƣ{یiQX 6}Cr8% u^[7f 3`@@XA1Qb1ݷ[\;a-~ҎRǹ0f .5wЈfI{xs1 5X?ٿC,|ԉ6kfRP̡͢a裤 3`̀0-x+=yL1+UОp%l`c+.F iưb"dc$~ ѯ0f 3`\wt`A;l1<6Bֆpm]?Ç&-AGq|,mG <+xec{3`̀0f`'t/75۾f+MmtQgSG?l)݄1@3`ӆ9t!؈bW=b 49hذisG]胍 P 6(?j1jZjb9R_?h^kc@i$Sٸ[\cL3fGG?nĩ n$7UH?m1c87ayѦdnK~(Ky%\<ge W3+GY•̣,J~Qp%?(Ky%\<ge W3+GY•̣,J~Qp%?(Ky%\<ge W3+GY•̣,J~Qp%?(Ky%\<ge W32ׁ~lYBE?bCTq\6_釤ި|9\kJ6-N_ɦMr(QQ|)QN 9C䌚:]RsTc\sTgKj]ykwIQ+qQ.9w193%5G<5GuƻޕǸxջzW㚣:]RsTc\sTgKj]ykwIQ+qQ.9w193%5G<5GuƻޕǸxԜDG:~h}*c. 1 0('V;cIشpJb 5~SG ly}H2ި39k9`9sq@ELkAy*̬;/K&VQ#3| dX=_yC<6NC`8J4W3(L?G$2g1V暱@/.MaѦ_Φ z$ y@b 6t Ap+> bSW7z>_Wʑ~|-1)ZƋ:00~`8$9qQGbJD?dmC8҆f1OS2qs†NIvjcAl/'rv_sp%g(TfO%eS?SɿB]g%mGOO"h3~]~n3F$hwưHy#jcG?uscN1c.uHAt#gGaXΎ>Qz}01+$|1yLLF v Fc}@‡c9;GidD`GaXΎ>Q )5~责 cׄgb:q\r=6c( MOm6w`Ý/̓qa~6hq㜍X$xbsr\ ?? C85q%6G)G/3!aPW9V,rHt ylj#z)W;&d~. VOgpݎ>|{a<t}͇8ubr6}qՍ>J sZ v޷b1Jxİ6Q,bU,ƀg|Ё81MhڨAz7?as%|~|tV~ O15UG4jiNf  >s:yX0c1xŦ n9:bzF~| bzK~P;6m9 79X'3L~FsS4c0^ Rq(:6b 1x6e9/z6|9X]bŜ?aQ-f#?>{z>ts6^C]%%c1bĻꧭX}c#RԝxH6GqA5oB8t ๵:˹3\#?k_ot07b͟$ύ>?}<`\?XRק1 G6-`i\C`lbPʾ'wPF; h্8u6l1@Xà0f A:z HvC1{~ gڌCiOm篽*|ϟ?Yk>>G[}iG[sko^j89H^\Pɢ炍`SERsTGNh.9/lİۨ<CqH[u' ('P>w8 qcV>ؚ8Fxꔜ"\SYjƦ D mg0\ Mt7ƛt},GIg9#Ŝ?aQ-f#?>^9mDAU珘ڌaa G2+1b IDATؤas%:6Xj4Ws&q:]>9|W8ѸsB^?yMBrWM?$|}[c60gbꇎuK?XE-vUm0i\Pb!brE(X*3_ubɁs5t|1ύ?w.p%g(Tfx*,%Jl%J~7@6{c& c_qPԷ!'=(CϪq^}1q1(:>s F >ƉB~Gu">gkI9YsR\x ͛x?ü"+%b44E>bw #'na`@jUk̀G>1upnE8O S9@Z?0P;Gj1?>|k1ؘ!F }1c\%q.cpnׂ`CSF<KY ql!:rc~csCc;1ML[OqT?jH-O<p~Ձ 6ĨT]qlb^ּ]>ƜQ6/^%|[E9v|iӆckF=)#N.T(vџzq34>b䦏m>K'^E_?4bLN%:cST_M1kƐ1bK6HŨMN§soA6 > 9_#Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=Lʌ+=CbОX1%nṾ:6SNMԆe&1rXtLI8`8ck3C>9wgN1/_9Sc@9S_?Lu׏L~ٷ}gQTuƴQc&`~MoK&dMᣏ6%M ?hӯ2jkcf 3`-mPs.5JƢM?$1O2b46:r͍TцFJ@bh>tnц -8ot~ di/24 ph~7}iiT~rsKS1Fj&XqOm1)c<ڊ _iĹJ8̀0f 2kjJ+FlSX_mcF E9)"d513`s觭K?dǸs?7ʀ_?߭PgȘ8?8_Qs0i. ]vq}q[3`̀0aoӅcسvS9ь/,8 \WsnK3`̀0f@Am2._snRcl.ח[x;~QH;1Q ajt_7G53E8'kfck];墚1.ĝs>z0(э_c;f9!_樆05vcfu,jb]6=3IF9k6f 3`nE Ԛ1W'5>'̿(gN[7f 3`n mz6-CsX7f 3`6>}^ ͭw0yמ7A3`̀0mEFlh6bMu0f 3!8(MWaJ~3`̀0f \uk0f 3`̀0f 3`̀0f 3`̀0f 3`̀0f Z`" _IENDB`davmail-6.3.0/src/site/resources/images/osxDirectoryUtility9.png0100644 0000000 0000000 00000234077 12564151525 023602 0ustar000000000 0000000 PNG  IHDR AݜciCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx^u]I%$$$$T 6.ql;>w5Ǹl? nŀTPA;YޯV0#ݝ3gΜ9߽3----------------------------------------,P}^}DmPT SKF 2 m+wCbuڢ+hX`hJ*گ+V;X'-z-MR]a}!tW 6:D D D D D D D dڙt˩H|͇7twꆲb>Z Z Z Z Z Z Z7,O|x{߽ rixB\ l'|\d'>?F.6>|C.uz'_Η!OI[3ʍ/6 diit>9x&7O#'da>(=-2ieЭ^NՇx<2=~zVyKC0V!78iyKC0V!78iyKC0V!78iyKC0V!78iyKC0V!78iyKC0V!78iyKC0V!78iyKC0V!78iyt|~[l,ƔC2d?=3>w_~~- >өc8W/L璇'cɔ,_槭ҌbGO[y>LOC#Âa|bNZ:.:>=Ootzh4ht vJK׎_|z_|;k/f>/}`u|I!-"s u&P)(V ,o)N'MnXft?&m4 Ӯ0(nı~g{c;x5?Y >?O~όmhЌ)|^+|4O' 74f14geezJ5&OCv2ҹ~.u|X}䒎\'?D䗎O>?3 FrK'Ќޠzҋ_Y}:i&&vjvxaLиP0 LjQThbG>Y_|&LpNEE8 cx[`k֮]w}گ10]4~>Ot(0IJ͏ôm |.w)// 6IHxXPʤٛo~^ t+ձtR4NEقF,Vf`i+cר~W8B@g[[C@@@@@@k`&Q:vo;!K5F)6dNk<-ǤFc5Z<)+,((ih (^vș3,FIIILWܦ2m~'kvE ϐ_!C s /V,=v;Oj9~Ly뮐s3SbY@@@@@k`&K&&6i4 XޏCϗI|ʍ7)i !ybHM@d~S?AeT*njrs gV>Ȍ.tk!2OhݲT)ƌמuke} 2ȴ .YG"O|@ 3T!---Iۥi_s/*3&--ܹz{--guEJY6m&1bIy[lnا,tEPcyb?me}Ʃu /3OR9wh>i9덗ʱ RilS'/?*C'M#sɽw˒_/N$g^uʬK.I-2u4){T  ډʼ' [.Ξ,oyÕJ^w9RR[/ e޽ImP8&TĂh>nA)=,]T^~eٷo;4w!Gve4k.]2n87bX`رC fN1ygeҤI~mu]'W^y?c~C-hhhgR+l0o$_ǂiaY7Nq?B [l@v{{z숼}UV46.nIzon!M|;ߑwݮ<~jX--jNE0Vc4Oet`~'s(oLMbx['btYD ީXVyϦMsjٹjܷq<\W'U=:Ifƅ2{zT 5zUIyM4R^h#\yBF+.N&#d@u˖eyWȀ W6| t0N&=cY{#ڧoۇ;wt-[9Dϡs=S^x|LS3<|zv|LC"/Wδ}ȷii} \s5쓟җ$|;pM1$.,|oh˗wЬCZ^@zO}SrM7>d@i>:|~?U&EJIlF`y s C">_HB/ 12AׅXyݹ4;gNɷ) *#a^#CktH,tV*@;pw&u>V +ZTeXjTwh(Qʻ}}F0ZUbyx≲Z4 <1m"\PXgX?O>15;,|ES.>oە=\կ~U~_;?9Oܹs m6W8o,,<>cWnCipa}=ӯuL#ңN8 sF3fyb al5*Z9;YYZ 2F^!H>S`DTչ_v| VTU^QcIRR$, *T  J ihn[B)-ɤkqQe2@M%R^Z&-ͲYtm.j E 3lW&o#&x!TƜŋˬYp^>֌>Ӣ/N8yV d4?/Kx-/\>G?Qr^ פ4$ݯ|X|>::|@@(_yݦ+gI%IC_ߧKeL$?myhet)3X7tn<ՓCرs6)`:* 㓜S0G< +s~>2Yjm)֩RXgj|XBr۶rټ(=b)v#֍&FV7id8Z Z_[}W@tiXrr9I96٢P'b [0+!-BOf@7y0YxrFRŬ*ڔBk4V6ʳ: Ѧk?B[i:s7Jymhb--Я-`fN4k2؂,haLY@`t?(ySt cSpu|9~R+5_'M@tF=P~'}o;JZ0[>!"(G=\ CUdՊ-z.zU2Ssx_˨2f=8Zn:YflظGΞN:nVViGz@_΀? `sϞ=$r6p;3x`Xr2(uMzY%%%Rǭf LM8&[k>U7D>-mn'NtXj!+l7̳a a}hhi?oU%zci4Zxbah~IF.~K,- <|߼٤TWu=gEyAM;ʔΓ<fYح[~uT}eRP1E= i.([]6^*źQBJQs;z,3SbYkL;+! HK /vγ+zց{Rziz?mЭbh.щ4Ci|$al@@MO8=,gg |M7Ŏ^A)MxG D ~ <3k|_f[:6c .}Z'ЀL?t4O/O '(`2>?6>[iy tX5tWHΕouhh޵kS^t~ﶞ[kAzr'0N<[iLɱh̐feĹOS ~:l(!u4nPk#"$y=̞w--4;:9Ė^uCC7Ex /X,z4Đ+M)Dg,B/xB>SWC@@@@@@@a+&/vtN!WiJ% kINb|jC@@/Z/mPfYBK۲ң;;;bhhh.Z0a* &y4 eGނ$oi+xf+bJR1iϕ ^F D ؈g;=E,ݓYl[>[-Υ>snc---C dӀG\Y:cY, t&Ѭ!qw)iBr`t&^ic--u عdi\BoE_l@`F8vvF_d)}eꀽ 7``eƛ1xiʌ>_I406^d--Ћ2&m߶M QӠ$41YrVAR7^ڵSKJڼp@VdpC_O3T%r,MLȥ>|&ɀ+3ov6B1--- Mh>I?N=+J1S:BL=w/ Ai-6G 8 ,|y\*S ߤRyH%SEzEY+"vӞn_XXm_%=+SNV O! a4KP `hؐr_~R}<2ʭMH[B(4!Z Z ZZ0TRlX (7jB+-\ʍ?z.ق*D]htji7 b,`z)9餓zK!){l(.-MRX,r`HkkZ^Z\,ezHna PjʪٹEQ9zL|jbdY:?ALf.r~_OeO=R&)X]Є 0PWWpTkkkr޽{]oG>'xb~d(}y<۽Q@;WgRZP--l!jd_S;3{+6I (v׀\=QըkYr`p=[=zceЅ?'E0i- k4d=Zx?+2 2?63LG D  C1_./y{)uɎtH, #Igӡ0ʍFlikش<|F#ݥm| ب rNNwo>p"UTouuL0Qˎ;^Q'&mhli ,Cj bfu*hT;wQ1=mS[ [o- VzՑ#F G:}>X@8P(;7l[::lRsg'c`-/m 8SxO5;nxb-- hbCbp =F#6@jKIOuxҊu&E뤕 #6Vx|ܟ0}H?ީqYӲd] tՁH('p̙s9ŲvYeT :t}g_s:I߿_Zt3Pimz3r eή% .>XDxfe{V-';F&6t2]PP\&q'RGL0y2tB:('X0qR"^;w:^X3@eLokѐf@!ceiUoݻeӦMRW`\{ 0GقrgGdwm Ye?[a416r'Z Z ZXK}(AvgV_X/ X L@4eR(OR.!A~$/ie:n|Pz(=k :L7ɮdժ5r}/'z{2v8u3 'Ovm!zeww uKmo{Lr̜9S^xlZ^b/VMӦ}cslU'CVKk6;pRS[wuXeN]p \Cf;J*mljq? 4TVrpsxJ]r  I vQFPN]Zx5xBs 65 X6եMxs 9 G?)ctd/J.?شG!o|rĦK?t_|ovc---p,Tlp'ͳz$ <ӄ9pIt5iGR 6L;V57wE #Fː!CE/ɶܦ9͑6eMVѾ>St 6Y|}<P=@}r1]L՞ v햲*=X'-W?CSȸe=rQK+GښJ>t;/!y a9YzG6Ucɘ1l?=\c!83)FƓ&NkWˢerd1i4ư1J[p͖M^%dF]S2>x}յ8,5 <~餓ʌ+駭~s'X"wy: Y3pe=s X);6J+ظdlߵWjt*a_;&gn(-Pp][͛'o S nfdz-;tlY ZGPƏr͛Ou{/Sor>H~ssr^9Fͻdr Q#KeS= va#Uu8Ș"~Gܦu 0ʮvGQNrӷyB itV_e˖xBr\Y-mqiyo:v:wM|b:U=Z u4gM1ÞKu-ӺW a꽴IuL:Mςݦ1t5bT}Ox|d&fÚuȞ־5j;acEjE\|WR]lz]>w˹حS[)vrbF#$WIhh^@bzhѭSUI#(+i$,fڗU1SK/,|Aq^ T/T D ))ݲDFm,vea5 :JSC^퐁5SZ]3D% <'>wts}N|WAQyDbTyܩҬKkG{A9colqµL0m,b7;LW鲆}yM"pkӖe’RPJզZWM4m" {e >NzLtxu2y=7*hQ_J+h,=?^BNA]"鏮gd|`i]^yGں+dϖ^cL_|zLG D D _ox e=C /aNOrS:F=_I:h0o>(𩬪tg664 $[[tJt\3UWm:i#c5߬-tmhlpN=NtW<xlhdLzI}2ւ9Z;[Gw]2[dPuҗ*h7u ׍Dl%em۶:GM~Dhhh.Z N's;1\̑lJ%;ϥXl*Z҇um)#~2͖&7^YenCU޺#Rհ_*+:YfH0i6SO=ݠS%t(~F#ęg0v7~IAd.3PwH={;;n{mtxN;jzAr᮳xxHi]?Y3FN'0 !-0x+ܹAtዲO=A]C\ УTV z*`o?o*Sxs h+ *#YڀU߾}x) iCIͰ]O`7Zji' ?j>3ִ)ky?;^oT 1RAbNٖḛT=7%:[\S-/W[P~!א)esMG e֤tH3c6Z Z Z,`*=0Oi2n-5)PZ:.uvH105@W s5Rqt2ҩr[[^̛N+*gl2]w)h úX}f DL):tȑj.^ؽ)A61SnU{fqMCL7PO(kmz6Yh/ yٸN7ӴuѾ#Vum+;TooH5ӏv+$E䶰* 2y )c'"w?VN*ߠQ%N$Ǔ#X0v٪|)8iacHq-23yB#&aEF D D c40Xȗ6su2z x  >_O`7ؕ4ޥӀmuHW^o;8p}QdYR>d;Du tWs:4]VvkYlbv򛆞|z&>_^|'J iaT)|r$Š#[3 ^^V$;uZ+/Aڭ畘F/l(:Wu1Uz646Ib} FW9bw|IO0Xc[{iLO=ꭨYOӕknP<1 rԓ8Pګ6blgi(-*8Oɪ {*.S`NoȥnZo0ϝce] zw'@׹7!-ܸ|_\3 dè2ypm67MCкtp٣oX^;DzvQqi`W^}vc/RN3;EztV߿޸[U2k8H^ YGF2-uҤi@#O,ʫW^=􂵿K>|ҵ}N%*hvuAtb:6,V*%MCƕ/}?<{t-Mez LҥeĨ5g'ozWean] "GGt7feiI IDATGb>Z Z ZX tK[ܣj.+(*˰̯1u" h}Uݻ9{r9sՋYsVqQ71H6fytE:u3իVznz]6bNB_vw9ngfR_/ ?ty%n8Oڊ<{a PGvQfi=XdGbw\:MG#о'h>,b?P'^9٬=]Vם{}ڇclI.A]*q,yGrngsc"mӇ2?XLoi}Vhhh#l4MEhqO4C\=O>9_*-Yfzt,+Wj18(&S wgN1>nqѢ &mҒ 6izXQMr]:eʔnIԳ*Gvl`50%߯|Sdȡ=a>i^x=tB7Y~jKzz?tL"&806^,MrdAhȐ! Npr >e%o1۶˃13?S!JՖ훔\eO6}=V~Y&Kб---G-% ORNPl< etR|3(M>M2} (kdt47F7pܒNZ^#gIsȊkd͚W7'UTA:X 9'/ɓYۚ#y'e0aW5670`yWЅ?*Jg*az_]XpxpdPeXKjq1}M>%'F7rM.1o`Й ~r|+/ϻM]p.~@ua@ߞ~L>ik,hhh^/A§2ҹO2I4IFZ=kOlb8^磺b1sn + dR=R˚Xw ٫8~qࡺ%-/riETN{ [Xɳ| ]sׁ  ;Xu;PxX$!6֯^M[-U.Cg>5] nn1~:)o28<ނ_׷>b)]n)w̹]]a|G꾬yckbʒ>-OY,p P*68eor=k+*4J*/v :x3O)`ܳg̜yn>ŗW[ Fv};;7lh`&YQ03=ۓ1?

046^?/O/#\D}_cŸlmlbt&Cʭ-_&g])>|i[ؿˌ2y'=o(#Aݎڈhhh^@7@aHo.ǥ]a;n=^2hpٺyWsP?m@ eY0 ]ƛkLV=H>P-&(ԩ*Eg_%O?N#I'v}7Ya~-Njh&^b---İi.y˨Dy:]d SƯ+{ @'gpkjtF}#>= ~Otz(B OwA2RhR dhVZ%'NGHߏ>hw}P%@eZ`sR&}hp{&ϛ2Qz~ otAxC~ɱ2?ZmOS^vSf>(7zqYN@~`|zƛ٫׷qv'mB}MGey#Ȅ:,`үߥ.43@FO0O0Gf3TѽMtD~p;ҧ{rsl Y[ bX,mq6 b;lVc$!YL;Y3_F#N|hLYn&^w1 B 9/*.?A쵘Ty={Y\dgl1uh4ϗFyrM&~-V73D92A2" F<ɷ/_fiǏ2\t@@@/X W!~˭̧i [Ԑ)iH-muN"S%@m-ߟO?,1R=lS{Гn;gGRY0OhttO%I7c:Z Z Z-yha06꧕B)PZ:.uQ>zt޾z4vI ~gV6al-ϥ=x|ۅub>Z Z Z,Bz Ԧ~NFOO_!_Ca~uxLG g T:7g(/l6ֶ B}v---p-c._L@;/D3!-, ;EOy]k ۷ow]lQhWdر}]æn{S0-_wNmĆA9=!3fJSOɨQ=Tl~[O{s PO#pe֭[;za!pܣC@@@7-`g-mq7\41,O;I[a /zt7_qp)"xa8d}7hM2E>O{g:ȍ7@ͯk7}wM7… ݱ=6xb/_"Pƍns  w}S`[ؽ#_Wx_b;$qp覤94>ɵOs}\q b3{qQfry^x~Drs/_[|ru @(}?l==K_P>%/@.2сE6}A_l3wey#>3n6={v'=hkkkq@@@Z@+i[814[XYOi&9̙#%%oϵ2֑s9S4JH3>_tOSa$>|# tܻnyg/ O/?wO+3<ӵk uw ӂ!ta Qdo@x|^pkq2XOs9yz.ӑ fg`K0@OD#ѣGw[iut8q؀ 77nʔilDl 4|ǜg{L:U>O8@^AFw`˝N^zwDތ(LmʕHyrpaC#N>ݝ|S?*`MOs,?;\?|'<7؎ #uyvx܏CWCs}8cxx~Lp_#Qas?~g ^t<N6B_ַxa ox3xX'hhh>n O.UN CPFwTʂ o{MnD2ET]w%˖-se -W^` 8"o2 Ecz n x\|à`r7 eOd#^s=yE)c H@K/$K.=1.fut:]˄`Bl0>19bl {nW {/%{58o.G@7?` .C徣x|:i๰@7{>Ň@ʽbCMƏ<Q?uLx2i`[Q7D.<>b:W'J $ZRYNdX#5s0 4_`@F ݅^xulA_7yA/$7.0HÁ?#6=^D ~֎ߧ'W]uv +_Lb|}\U hf@ ؖ $)a 5sy5|&]݀1^}%dI V&'=C1>L?ϑ=Lg:Y ͽٚsS< Vׇ>d8Z Z Z,㪃_p[44><&˧gMtgdf̙\j}%trFI9 :A&.[`ڛv֥fua2K֥=N7MRS'ւL P›Z00ݻ8$]Ɣ0*1zI zNm d,6}M ثGv&&Ѻ:MSl2@湲iYovOǻ(?5dYmCg7k@5^M:˽}2ViI>}kg rc{>q_r'S܏ܗIte)Ѝ!`r1g>p#6K:cg(>vPso'P{)g:3:+zoYrԯbsAWbpJw$'ȵOxNL[]D /'2Tgdp ΣmdžqO>/W)?nL3ssgL7_,vay?l~>P4KIo._!&G 4[:)[jw[b&O=4nO՝)=k ƻg$O߹a3>79!ֆbRr/u|6/QEOt%knQ `4= Y?h+>o c?[@g6b/}|cm=׮qc9ω0%o44fC /%uH` 4[: lì$y2N㟪^s*GM ’!B(Lųih'/[̠{MNvrѥ;OwdrHJ'By.t~X#=c4߾V3F'6yVT?Knu=0;9+C@@bf8 l&<)L5ey-J4vpH K`tvӡ'J4"^R4<1*e M ND3 M~w˵aa4aeC`i~ȏ<ϓb"ËeM⇆bCȄ2_mpx|\b&X&^yU @竲S,1f1b8`h a}h~Hki_/t^,4&;τm|@@a@B[OӨnԐ)iH-mu%C@@Z&`RڧZe8MvZy(;[=s&ï<옏% Jk/7t [}g{ x)+Nm.hhhhhhhh-c.RHO`!/OS?W^Wߡ0t!Z Z [ IDATZ Z Z Z Z Z $c.R&L|[=s+eBZZgyϧL3O- ;dG˒h~yb:_T-MV?,#--------BZB~ʒhV #۷nc& SdKU|+VmRXX }.bp0$/2'x2>OG3R$LO|@ 2m%]TT^O{r3C-֭k6JCǷo-,a{|r' 'vz1.Z1.Xɾ+EQy;ɷ?y{y{ٻeeÚ2|`q뺭֍H~L,lz WTۺ[rZ磤"_m?֏ȄB<4d|' JҨ ;`\dDhhO<; nڽU?f]zM7ɓ]~VF74Iܚ"9*GvwګN;M^9餓Z# O~~MWcf!7~q -Oa)>|u?ʇdԄ=G?٨/)߸rSPu;u3%:[ WXׄL<>NG@g&X&^q@g'@N<먿rJ3glݺqM7p[ߒzH~_:oQ:z׻ܴ~ٻwo~XΝ+ƍ-y掲<7eri{u~u`e?ꨣk_+{'xL6MN9Nu.2g=/gij{ٳ.C7xs9Nbs}ٻpw&*({.bcck{a{TDTz;g ~f9k>.gngW3snׄ=>W4m]S>[ᛶSw&/5g!d|\}rԖ+94y&t˥O>x{-n^n8:mfaqc oQ۸Nwѽמq5c\4i=ȫO[|嶜Mوϯ,фիlj~[1ϴ4ɬ^:"@ 0fΜY&pҭ[7T}=obLxKﰚl}ERQ30v4[Ҥ^K8~=isc}T< 4z>62a "NUu@N%.6l@;{,< _._Fkvʯbz`Vf*Wϼxƒ 1_$o}>Çˌ3<5T9'N(͚5s_Xn2yy7.K֖C=T;<%wB1pqAH5j$mڴqz|ϡ]pk-}VXAvꪢn+?mK;\{nx\SO=QE[~Jm[mVZ9U˖- s\ҹ.l3*O?xζ^ty {gˠAd 7ԡ3x ۦOL4kZf9yߤV{ɪo?.={Q폻J\xme;qDvR~#i|[7"}cgUו>['G$x]vȘBTQ!ՆA-PQ{[SX *\r{)4/_uذa:r $V:O~Ұn~ٶ.ԬqCma2TwYO7WЯ}#knйGazKdϤR;{Xy1iҪmg?j07N +s,[: :AfO#vOۥU.ylO8Վ?n>d:΃uc;eocRVKXǰꃫ[m@2 Bjj +dV{4p`?ޑڅc)Xԩos8Wl8p`{6q߻wo'W?dW7!d=;U5k%_rQϠm;8X¯4_kgK:v&k嫗3/ wk.oq!=#of'][XNL>ydoysa.lHb''* A"!'d4^+OS;<X]Hf~3THKƷ/C&4Xjܸ<hةa~${^*b9z>cD~; }8᱌nI}4|u]'7x|n?0A`{<UKvb^g}֍7ewV;<@=p14㿺 3 DT&w?2ydjeۃ,v_߾Yeu٨~/,oKӷG/V X3]ԱkIor1Iei2eˆAҪJN⪫I׍EV[wcYdžːz.Rn}iv%/q BZYVhNb'Ӆqfw{TedzaÅKT;/@57_^6.$*/\$ k* x] 8<pHܩs.kaZ:H*ؿ4اv TqlL|ͩMwvׯO >bb(X!Í_;ˆPba+s =0²==a!{l_$zt刋W}erWUcz@4p>%}qφUF zG_Ż"?xeڄ1rv-k$[w|}IAs?f˷;t#9oVrI;Jsdcϕn\}:˗vYI.K}e3*]Ȓ\*{x /_ּy|Osp?x/ƿBr7BuArW|CO`>/`F= U<ذ~ţ=3\sGU5qZ'{L:Ql31[m8) pr]F!Q}P)R~ƲV5w&˅\QetjyҼU`CcF&K cY:a4nѲIk֒ZT7gV襙3iBN'i'*渙0EdY&F_7] twztɪҹ䅏K6D/AFU}\CD\Z5YYY>䂉F5|sA>drMQO I*-xz?֨}VoS )Rխ[G.|zUICt1o9iOq]j§e=a'Ukö-m߰~CK[:Ҥ§#(uP۬j4vD`iE0山~UD$mD)$2A_~Ore1 F^8Tc&OrEȘIH>u!W,4eب^Cvؤ4hHZ+XfO>K̀P&m M5 tžb?~#-w[3nL X6Qz/4E6G׼&4`6I8e,'uz+Y\fAmպ^tاMZ2n/[oO}W+ #(܇o3U_5/؟vQF xLk+e j!1|Mws͉@og [}gb};9?ձOIzI=dp8lD`Y@{N:=$»9@0}hh:֦/xj@)M$<% UDIkT'm/_"@@4묿4kmybZr:/Vmx%D"@ȏϯ|f2Ǩj?bgJ~VrV}iPG D"G@UꕃYb\>Z.K&|ɜ  D"@U1 G%*l6!obCY D"@ !O^OҒjgeSi:"@ D`!Y_jjcu!PR!Y,v HD"@ A^bZʿ|{kLuk3SdBP!brk> D"@@~b+$WY9,xڡA"-u֗}"@ D _V#d+Zn#<ꊞ?h@ D,XsBylB~dU%~Y޷cTH0F D@NΓWY2e<6>K<$'AX;?Fl\g c"@ K%9U>{+fFeyg,Bl?"@ DyC˷h1ꋾ%yNCC!;ʈ D"@"ş|Ye_* OĿ>ou"@ DTF ?ګN+G.Z/#3Ӓ M!{"D!0rH6l,X 7 SL)/'xB¦駟ʋ/kÇu]']tL:5ϲbs͍粂 I픧}/J <1hC+e-:KN?tYgu{q9y2mڴŚ_1 2pb\dkIzU_~)oF.i۶RN\>QUqN?cdJn&9CsYբնZk Xd#8}S,/_gR4k_OMM -pZrzOIXM~iڵeΜ9K\\_ŕC\ųe˖]r!C/qI1Iݺu3c 6@@Gr-{.]۴iő $_UgeyJs+6&Z7C9Xq_hJ:LzTzvm7vmw-;N;$[m|2tЂq!/̜9F!GyrQG_uի>3r޽e޼yNtW_WUˁ(fr&L#8B6tSAV[lwY}Q7~[f̘!vrg/! W_}U[䠃rr̿O>nΘ bZ .-:׻ɑϥ^Z#w9S ߾o,ӟV4 ̞=[98>8>{ovN/\k eww !H{q/8$`k9uW $<Νc5q .={!lMjԨQo믿vy]2f9]~p2vX/W҇XVl?CZ bIڄb/F>2(3 r+-,H/ "ڰ AzkW)DQyiT2˪~P]x/W^yj[f!/=H+O5j$ 4p.=C!VGɳ>SO/*" ~a8餓sB?,[rUWB/㎓^>s9vmѣG;9`cE`v9?QL7qM6g pѐ>ƶ0O:9N3k s='{Eľk_q7nc}`DyB55xP=?7`DI&re9=k߾}q[oU?|'^IV.!\]GNbɗ8oC!/pQ4`ڄų>1ʉ@#"GvK.DZj%zTԮ][PAw_G0P1@]vҰaCW/k7Tp` ~H`?ȑPqBPW^yeW5|j'K=Eӧg_l _,9 IDAT ʫcW[=PV-p ~n\6@ ;T&MH"|AA* gC'Ov9V = Өevl?@ECNy0 }qLuJ6P,Vyb0N=Ti޼J_-Zp_}anZ\r"!O7IP]IJ*$%ΗaP*%EṄC?}jo,= D5taqVs{#AlPYDu2x6r/Tzl@>@Zn!}{{w z|^{mGJa~zzJKN~ adZ|ŠSNⅽ: j>RҚv;Gkډ- (.] F6&Y3K,M#6إKKx/|{ǾרכSj._+,ENY{_tB2Eh Oa MBeΆɭ DwAKa~z#PU`αč֭[7$*8U "}@Xciڴibp Bs0fϞ=;~قbiiZ1o@ఄCSOjHb%"pp\ bاj;peWt$a'Ղh @,ǬxAQ3Z^l|ax? b_pl]~)sms%A-\(&|vab,WHN'D S++d}lRI丷/`t@6z*"۷oD=K/(5TWP=fy' %*TXjFe6by6XeHk[j1P =jjqXOZmA%c,kC;4;UN'jS5>扁\AHmXx/̣bW,?Fb5nU%mLT91`-K}<5^sѸ<)+فsw }1'+t4Ke}Qk+軦SqUi*ӫO6!WI+T2%YWO lD"@2@%dv*{P% "Xk6_WkS=D"@ ë`cFce^iAmVե[;?Fa/6"@ Dtr˫|^kcije:am?ն-: D"@X Q/Ngk^'?1l??_7?o D"4!d'}ƭo߾+ʑG)m۶]|pN;O68^|s9Ot^ Ý,ʿiׅd_bgA$4ykgCֆ}"@yi׮Rvm?X=mL"J˾Qf}-W\斥y7ϳ\z-+ E+ r֥Ku]HƏ/n+ҵk*CSN-74KVZUZk2sn|pL4yo|P$tP=3?nU 7n,vqN7yd{p  [o垩٩S'yu8 裏d뭷J6l '|ldP+dȐ!sIV &>2s {K{%O>];{e_* ~Y6XNȏgu+!K(X>k$l 6(dC_yjnk_9{@P~g˝|r1O96l#XvN;ٗ_~ٍC=T0n1M]3ysKDo`;5&l"t 馛./O:$GAnqsVi[gu-"ʄ Ow{`AQg}ޘ |A;t 3gΔ.U\z.?ؿ'x?@Q{zu׹J0QesvY ߏ]YMxN>V[KUK99O /Wއf6V~V{ZR:IZz HA%b-\{[o-TQN=z;kl6hfƌEN?%:t{* Hsuk暮?*ԎI^A|zWI6 \XzF% xz5vm0k޼ӡڋ/.\x w򨣎q9|g}.* @Ord,<_/G}~2i$7&o,Ovkn|QuGui +vܚoҰOeVU7auic,xSD >T+QӀXT}{$]1bL>Syp !~RÝ XrGG;;~XF;v##XBSLq<a U'ĩ> I -ZOZ.K&|ɜ 'OqzwtV{@L w@Rci_|MIFus=t] sop9sTߚ|mڤQum_]B6HӺ+kn+huk/ZOu9bɗ8o0Q6Y߷vŎr"#b,$V:5qhi1cl*Ay+nڹX Š8}\6YkIml,`K *'=Vg"9rx80,k{8'A8H( +~8l?4ES{2צ6rNc.82a'w"2ALL_* ]Bߵ!5v ~҅RFb@A4qDQ"Q j'czK*}U7!O3Rr+Hp#?q N|zJ q #ܹdڔN&_V'u*ҍ@dW#_~%DY䭝 [XD%8mTWm)㙟2[ me(I:WfQί2wίRoY(Q @YZVdx$CjM}"@Tp o߾n%roMY}#/Ȩb?'[yhQ!6`U͚4NL|VD _Vs 7Օ|-7HJX|`Y33H:׻q#yxlBF}K%&AC. bt ^XB/xa#=22fs!,yK列}vYLU]a<"=lBE7!eD"@  O>,\[ ~Y6Xߎdzs-YQ5&٘o/* D"Pe ,'|N%@W{>4G:֦/xj@)M$<%Lee%;}2e'"6"@ D,63A:4-+$۬LdL(|L iT'F&k9*L[ ߏ'#&ϗ:`RA Dn4mPKV֑zuj'3},N_ΆPfcs3X!FN@٪M5ઝS;9fٿԘT"@ D@aJFXr%MdoV:+}$$S,!)a k:kߟ`̷$9t|ٺE}KC'"@ D {=Rʯb^9~,_3K&|ɜLtOgz\faD D"#<cɗ8o'rU<6Y߷v_dH D Р'c[y]IX≤2_o'Y,o~Μ9V_}u9sxyIǎSN9}Ze-)ST]ZYs:W\ly"@X7onuƫ04ӫCyՅdVKD;8ׯr-ҥK%wܐ]޽c8 .,ke,%+"rc2$UD"@8ϟ_]9NY{_~nu!WXY)@D5 MP1)xҩ[ .@SO=UVZi%8 ~OA#g#D"PpijrL-?˷r*!SCW|ܦ>6-}>a$^=F}U"6Tр1seykC6MH)H, 8ʦ6Ə甆*]XG--5žM>ȱ,_ lD"@j xٍ{ۺҽ]wM R8ҵkרYM%/,M#! }* !DT^)Mi_eO̼cZ~ jR*lD"@jX)\ -YԔ4C[i/*x IbV}qXe- D"@ʍg}XTȜ'Yr0+?ˮ/X6X?$O!i|ԜW"@ D,>1c̷aٻQe M[P'fC9 D"@o1e1F(Wl&CdYkNmx%D"@X@wګJZ8ˆ㹙v<=o?Wp*Ƨ!F ީS'vmK A?"@ D/+׾^˚MuO$H%~[Zk-GrK7xM g̘>~=pK:./-tADz;c=}`1}Ŀ|;vLy+yNCC!*@@p&OC.nndf*/\8xSb$6~ޥâNZR&c}lV.Ő;$=$c $koPq|!~J4ij2!Cet_ܰ\?j(y衇>Ga#\ѰkЁ"w,#g"b(s3,<{n&qPp ꫯ6ml o;p2SO<\uUҵkWwokJpϞ=ƁO< D"@@#ƿ|M< 4k"\Rp}@fU^{QWC}F_eG8}A[ k̕ O߬)!f1C6,JtTB '}=Փ  D"@@~b+$WY9,xڡA"-uwݰI~QuD"@bE ƿ\ TW܇b$R޷Q]ɓ(㸱cO'mۭU9p@do/HLA؆Q4Nmۯ(W4=7xh-no- 5rv3]^+ylBȼ,~_}*_zIe D"@R_>7 M"MȯO"k6~ 7|t#g͔7^yN:U@_~I:c=]J?̜9Ct[C'uG ?m z ٥O `Ҡ!YHKi1b~:FٮX1l찈XjMFڴ Lzlmg93\Smu]6 "T|i| PkƮ`"@ Dd#`yϣ_*G46G׼&4`6I8e1TZiHzKSx6l*xσdϕn?J3kl/?qVHmwv>LͿX&щw!AM>~B;٬\ӈ"@XZyC˷/x OĿG ;"ǁy+?ɠ^;%=M6 7R^{Yi2YBOۿA_uCѓbc~_'#;촇t踲|هcaG*$^UX\g=k]썛6YZl-L~W"@ Df!ş|Ye [Qğo}b};oue)L)teD"@@G Y$BV1PyՉ*Zm~2t͵7F'%bWYv]ey2*Yv5 ~ҹKիlMYmͷj4ɬ^[ JI4i# w9R=׉=x@K?kIMgy~՗OiDŽ~n5a&{[8F\>|r` 'M"iy3yZv{B;MWI=89 DĬ^9~,_3\Rp:ܫ D>v>z`}Ӂp2`2ۇ,J9pڔ[;ו1#%Ekޢe~֡رQN6БXOṞH8 ^ DXb 4*V,DRd| ʬmwD*mv{|UJD"@8OޓE^UX]Hf~3THKƷ/CU*ŴM/&6m D"P],Yh<6! O?I@1*$ț# x<oou"@ eA Y(<6! Pd!qZQ~~d֬Y˴i䡇[VXa cN-[V[Mw&r{}onł1?C'kܸtY6l'O'xB<~y~_Z>}ዲ[ OĿ>yYoOiRRf͚]w>GQی3tK IkX3g#;SS,W=?Stӊ gDUu]vތ?UYrAzG 69ر`lSanҋ.VX۾p衇 bhÖ-RZh!ݺuoƒrQ6_g>B >'|"@@ /WއSKv_*,fMWJ*تU+GIT%QaR;4j zK@(a_&aE]䪬[ms9*\A@x5##G7xC^uC)tA.;Cƍ'دOOzW^JBUW_}=lĈnc{5\#\r{Njy'<3F*'Em۶ʕW^2"@ D`sYX]~13@A4I_ybT Xn޼yv$CK5J@APsWts={:ADOBdH{5H/{!xvin(O?H)"ԫWOpX PD{uו?b]}n] dos=Svyg[]u C<2|w :u*,Ua*lD"@@4 NIGyZ/xjiӒ~Zj}wҰaCYeU<*h8q/ sAAV/Bw>d :{l)˛. IDATBwo&G:A>JP*U8F DTBW>zY#TA13-&k_}W\NLTrCE={tL&uQ%i5^z}qHdvc@~vo&H+aС6_:+}Zw 'L{?M>0`@=ز6GSO8@F ~!;D"@=_fnc1Tzy-%icHdNT,GU8Yq&n'(2q駟. nm!I&\D;H"h3/TgQYĒ>".H.egv۹GF}g.ݡ%l 4pK r:~1Wg|ۆ%w9]۶1PUd#D"@U1 \` }kgmXy# ¤~`,g n`:T3Qoq:*a#`Oc pa/R'p8$ycb+.k'l0/,LJ  b)KbY-?:Kx blIyւ38ÅB5ܹ#—^zic)CͅD"@rb a L+Y 2{Uymc}\M|z>.Nݓԫ] @p2`<]rU0y\ůb)'(aSNՠzJ Nc J"gjxp>GW? @DaWJIyO={@5ס x*lD"@t.C=to[Wi9㮱صkרYr'/|>v ݂E6/}ALR9* ]uAk x4MdH |[2H[ +s%Z>&jfZ=II'|᧴X1xNZUǎť"@R@dWO6.$*K<+&[;*&6n/ *dUix(yMlXk<9'"@  LEUiЎ"@ eEX<ƿ\BMu%_Kۈ.tB6GhD"SL D%2r˿|nx_YUD$m  D"@@n*X;c Kou"@ DTF ?ګN+G.ZwTdӒ]CH"@ D</)O#6V_L3@A4I_ybІ"@ DxѕX\b&8-9[Ť"@ D >իl#M3!i4ɬ^:"@ Dl_,^9~,_3"$mB~[Ѐ"@ D ʟ|^`] Ҙ̾Eр&k.l('D"@ <ƿ<%xڤtH_U;+ӘzMө D"@  N>R{pT ɬ>/x beHTCD($D"@*˿,R[Յd^%@&ʬ [ D"@#_!GaY] 'o"@ Dr)$S]rmTW$~W"@ 52˿<6oALt?I@1G-gym&BPD D'a:Z}~ފgl?ե[;?F|'D"@R@cyϣ61em}v-&W}׼3O`"=b ~(~?dG D"@BϿ|{> עK%A'ַ}"@ DR{}UKC%dfZR@?$}yO D"P픧ّ}/J <1hC D"P<il}~1SH bRG D"_Uge&VϴPdVrV}MO D"@@6ʯbVl?CrX6X?Odh@ D"O>q0.i?f_hDa }kg}b6"@ D@?A_Vm{VI}v:ט\E_V<'#+ؕT  D"@&rp,/޿ς(Rgh"|c"@ D2i)Ŀ^uz_9rqҐ?Ph"}_"@ D4s;ivdrx3&zYcD7zU13-&k_}SG D"򫘥+2ۏP}\3M(֏"y9"@ DDϫb̷Aٗ|(0QdmB~Y D"@ !O^OҒjgeSi:"@ D`!Y_jjcu!PR!Y,v HD"@ A^bZʿ|{kLuk3SdBP!brk> D"@@~b+$WY9,xڡA"-u֗}"@ D _V#d+Zn#Ŀ|;k^'?1l??__؈ D"P{Ͽ|{> ֢dE1xֽM,ַ_n\fM/8C Dň@NΓFtBKU>$6~ϴ u4cr7>o,%+_sG= Bwww^=/"xNEāIp~κ{ߪaa]{]uN ` `-&L@0 @0 3 N^ /GalWx&U&༏*+.$@0 @0 E]ij-/J>Ūu_YdJl5ń @0 @0Н*{vhD>fs` `  5eSlz³&"5y؋` ` ^ XY.RސoOb"{ch` ` @]6+ Suvr; Ƕ|}<.@0 @0 K eW[n-G]l¬]j@0 @0 :vIyz]w]: m vR~ ` ` F'<޷G ?, 6f| ;` ``.mWL=--/3&*-綶(@0 @0 l L@/JczSGg@c s 朋4` ` 6jM 'KG c>DkMN PnVz'@0 @02Ax}+f}ֆa&BI6&9jr6.[mG,` ``4W5KYk}ȯ|G֓I Z.9#` ` ~򺪦k3%aFMS|Q'h&9jr6.[G) ,P7`v-[ \ l*Z ?O+l, @0 s͆OO5:2묳&֗hժUi]w+VX_Q0 @0 l tU`,kI`ku `'NKR6Ai^^>+]J}rHgl` `rπU^Gז/rG]N IZҸW}ѽsF%NGy(X/9 @0 &]_'k~{ד/ķ]K/p ` ` a`~}{ ~!msj]Ϸ` ` 2ЦJKxԞsR~WxMTZ%ύv0 @0 dh_^Iّ=:}gi]$}]1խ(׾mbZ'dn>~6wq߉{[7 .@ͨK6cv^imd@[m#ƭDc ,H]V9Qc/QtAEny[o~~7ݛzƍ36|cWj:;M ry(o[?8xʒ9?icy|{қ:x{ޓ.9M<3@8. Hl\16 3.϶5Qqm?b8*g?Yg>N>=l3}les:i~{o|#q'?Ivضya[cѼmzl\]C~=MNfr͙v=./;s ;veg>3qX?)u>}SJGuT~~v]z>t$=Lx#׿"[\эnt;͎o[zԣ5f'O~rog38^r%y{^kK]zW=oprJ37vUos4`v1zt%1/'cxֳ5O~2H9Ќqqkcᶷm< ~}usqBsmo{[b׊w/{f7q?_7u^җ?Ar4ޗ؁֭[N:昸xׯ_`w{zސ?7Y:tx6˙5ێ%Ƿ9\𻝥2_(\5K*kv(#=M7 7|V8Uzr@SO_`Wc_çYi\6RxR9k /Rk^Rʬ9yά WҞ{lzj/97wqF\"x?hַ˶QdY-Z^Rϛfrwn%b!'=)}_M\fO# w]oVM, IDAToj_я~bV npQvm7;W&~0q\=Om /LkxF}#I_Ӈ>FlЈi_3M7A?M'xb#.!]iO{Z{w#6 V:׹Nz;/ڶpo|Y|yƛf qk;/-]i;>\ |!_s}9V}.E/j#F!P%s=7%/i@T>1i>pu_5?wM3%8\; TK>pqpֻdɒ9(\5^#q|8⃮ntngvۭ99tL3>9Qz)\W^_-[|`g9@&ETl;)z_m-V8Sb]k+}>a=hxV@vi?NIޗk6^WjbW,Tc}dGY&m-a.M^ 'wW.q%_F~;SBzcG?WgEۡŮSR_fDx-\գ_xE@qlr4yq']m_e-NJydcU١U.=؈׽uNlB6X|yؽgVYD #8lA"fOisfԱd`׸FBPKez:>eL5vngD% !:)u1MN kZ׺(C:jL__bU+lh}g,fI|x,8c0bǨ=aF%/[LW^syDZ+%*zs%N8N o^~_{#cKw]gEv*>v?<7f+X/.!#lKZthX!^W6S+eH/9yӗ-^R>;N_|q#m~,߶ϓ6V\9붹\FsB]"seGuT#}aw]#^po&\0;Z72w$oʮO?6p(vrN0;^wC n,#Vgˬɛ""vpCk%Dpd>ɯ p)Kdw nv-K/KsfWb߶\vE9ub×ƹpv)m<'fGX8yavzKs.#JZǎ}~P/;ܻY*}܏ GsO#93oy[<ڮr s\p{g}G˱98Vz|﹤|v6yaƣ&T;; OƮK_nMmm0GՇ_q®Dd'.Eoi[;}Ѥc7 1^5ov,v;\f,j73)*zsDLV` qV 1vcMu=\T3~>(+\_/ (֖ϼܖA|ɇ׾ {]cA9ki[a]].w-ܶǎXqR:V׎_K>.K{\ۏݵh\~ང{۴AO!'dž/jbض61 >la77w+1q)3Q/Jeҵ>}{9U8I˗[ؙc7&:݋v|\7^YݶD}j+pjn7_6"t9*_NwI!]XڵܶXj;׎_sk\㋼eTL|)|i_`'6J0P`cq^mrTp“iW&H~[<ѻ؛Tq?aN!~겼-9w$_r*I =QI1- li7{¤ƈ~:Jm䇄|?*<$FvZ(NڅƥZs oFB5݆-E+;!:'>e4JKc.1ƶY`^G./5³K~!Mv._/z66!<{= ` (Y+<O|TNflllعm# @0 @GSI ڥᄱ1% ϶Ivdl܉(|qon·B@0 @00covXo>“ IuH9~wc"~n%J0 @0 #YZ$20n.Ŷi +L@0 @0 7WͨtA lfٸlq" @0 @0Pg@qi0vzR³6I;]e6gb @0 @0PO^W4(Ϳ yjCٜ&@0 @0 j MY-0˜VO;) }mXO}n u0 @0  __Q+lhI|x,8c/Ŋ g0 @0 @QWyZZK-FOjWxV;r;"8Eo1iɒ%F0 @0 l [>X_Mc}~snv7"O KkFN /LL~=J0 @0 "ׯO_|q}汾~u_o]OZDDc''G` ` E;;s~Rc.v|ĨEI +VhE @0 @EW8JQv~ k˷8G- @0 @00wr"]K~5bUx=(.ڵ*0 @0 @hǩ_uW٥cߦk/p ` ` a`~}{ ~!msj]Ϸ` ` 2ЦJKxԞsR2mR~B/}n` ` &@N:͎16Y@A4I/> @0 @0П6cw6wOMɑon3b@0 @0 7W͈t}lJ59ܶ# @0 @00ƥڵ>W#I $jv-ۜ @0 @0 @U?y]U`W_Ïj9`'k'mgsj@0 @0 '5ecZ}w<4Mb>-&L@0 @0 3 N^ /GalWx&U&༏*+.$@0 @0 E]ij-/J>Ūu_YdJl5ń @0 @0Н*{vhD>fs` `  5eSlz³&"5y؋` ` ^ XY.RސoOb"{ch` ` @]6+ Suvr; Ƕ|}<.@0 @0 K eW[n-G]l¬]j@0 @0 :vIyz]w]: m vR~ ` ` F'<޷G hTo8jۉl;ƶ}I'?sMgyfZbEZhQu]ӑGc-24` M 駒^1K ccK~m|;I[M?iKg455VZ;Nsl5s@0 @0`h_^Ifӱ䷘VϥqB|'|r3?]tE闿e֭[>>0|vkw!` . /dIa,GxjmM|v[[-]4Nvh7ݱ7l`a@0 @0pi3POkk^G_i'm+Om1a6{ͽ .l\z.Fp"N7n8'` ` .%Fi'4MalWx&U&༏*+.ds:a%u_k&.ǎg'@0 @0p)2E;Ye_~XɧXԗv2Egqb.5PZ`A_|q;sٲe!<` ` J/뗭zS\N'oܭ¾ yY Ulk-zKu|;7J(O_^.RސoOb"{ch[CC;|xn X!`@ u{{RmN{CZlqZ{ɺt}w5G9]?/LZ$Ip~+_IWӝt7w}FiBZ}' K+>OfÕ/I<17O7/Jz#?ۤ=v?٠y[ޒg?&7R#i3>v }hSr6VWy_3|M͑dm;NF6<>jo#M-+{&[>_SЫ3fb/<4-4}N]i]k]n(m8\Ƶq:(Ӛ%kӒCr '6(` 4Nn',9=7O}nŒӹ00N5oӺ5ENʗ?cEgN DN~/|as=Ԃ!3i6..9҆S6l}~6kW{B~ |K~?˦.={֏ *֖֥|˞OGg|ʳXF*O\v-ӊ_#-iI"-ҴiҾG]'{oVI' 햾moKK)UC|583+^6H|&чk'?Wj؛[b9򃁭u֥iᆝU<<-[$o,Hפiu~x:^1 ~47],^}㫧%+ӧ\Zyӆ֭_[c|us% kYLas C}m5 ;x#Үr=[Ęf`;m'_\|.;L/ηM?<78 pN>co}Z7[N-M;>zC)[1`{}dž#СڧvZz{ޓN?޹z׻ޕs̻_D'TTW6\pn]1mIiOV޷KCccʷͥqJA4I]3^9X\a+=X\qiZdcZG {g=muuk=k.Nt%lHK-q`uYs_sqpt{s>l\^x~򓟤}[|.@;O|"]Zk.cq$ei7Yxiv;=>ϩ&ofލJ" iJ)銇9eao;jWZ÷:&.[#eө^L8b]L_E_MY^Fk8_Z;/Ҧ"f}6;}vt6&m/}Y7&_zn޸S+xK@zЃ9>я]/}is \SO9yNs8c3]xǧHSN;%_E҆iK+^>em]Fq?s\k׬;չstæѣv!ms#H:q[M~>]bЬM.ĿKGj3߹_>f!\;}&qȷqk9؊7/9t˗\.-sa4yiJK^kiNSݐ]:FR45yNk͞N%M _B-9-G}to^ {ߜO!hzdσ׼f>wcuFN?i}I?o1ƏF^<^;9j|bD"<AeGӟt*SN9%uk֋D}sk~n"z?O7bƀ#r)<`UxnӼr2F8NЇ5֦Us9߈S?&()~KypnxlΜZ Op<ַn>|SJ|S6vm8V|P㲼J?o|+|S<|_ʉ:0YayrǴlhhQz/ի|?SJ?%}ttޅ\_WbƮve]Ӣ!^+KV!>W56uw||K_l6Ls3<:g?+rCҵ}n3*k%8:/?/U颋/J$#,)\ c5/-x~qŬ #LːC}g[ٸl?I͟Oϟ>/X<=f0= Қ?]VxAZ|?[gOm~vt|Σ h/_ވo/OKܤ]:gT6 }ˉ|߸ӟԼ@ r;'\?fivkvLh Be'G2j+V4<g>r{ݫiO{ZB]وvy܂*x!饰;ɎyEԲ87(4v(&cr9᥵ ƷA9xt)74cqOO}DlZeW0?iwLp@sƼ nЈ?_>dLV=UΓ=ܳrڎiq#5W*,vx/?SU||7d>"T '7fW,!=9ւ(qAߌBt0ZAШ ~=V;`*>vFo#)m9Ĺ쬂ܜ<>*9Z \ ǭ~:jcK>Gŀ['Jv5۹%+``kb!,8拖wKοp'^;{,.`sa(ys&7Naẘ,°Z@-{E%ŕ'>̲6bAMlxנ8"BlFpU{5cLۜe6˩驴qƴ [SM"8 <6Eb>&%<삼mq66Ƕ;{Mo? rj:]+N/eɷ6rSq=|prw<7ߜ,%R])D!ĥL4UNOXq|Hߵ ^e}m/^x:l.ccTTiN[sK _G=jO~g-^X)m9s:CoM|c:_f7ѴT]OkpΩɛݻR b>-&L'Ӯ/i~ ڻH$M8|R,'^==lrx|/]-[fb:-k›olzի~{|[Le.s‘g K \ +\ C_Ұ֘o}[7qWECf|˒98͗&Jk7-=o[^Q%#? f슶=m|1/va̓ n¯\cQqr(\A~fbm]lk Ц`%P4p/ME+lhI|x,8c/Ŋ is"*H?6ېzAߒ nYo [6̗c|il{i.+N+?k1. pp#<_>~ws';s=,py> mo{[:͘|{QOs'9~\ț8>ّE#.{ yg˗Q/=y|K/!nHROͽ<eͯgpT0>.7s_J[0گ>~q/v~¤cܵ0ce+lb"ͮ#o.F~uTQ'qq?KHD$ /C/=@/tmlx|/ؼGr6A]̓9.0/i Xߚ` 6.,G5wNVYb+֥$|5 >joMY?68.cA>kDe& ɓ|kvk]ZsN]v[=:gij%izcї|#|}csC} x,LtKќP@8*֖f^q߻֖G/É;NR,Gv-bk8hA-pΦ^0X7{4}GCK:[jC?~mh1Z<"nsc11Ǻx3am}G_\&c}i^3y~ma[/Iv= ,.?&_2ʿqO<.M^,2/|Vo檃8_'Ħ}uy' p M6:x`_u2*·Uկf@.>v[mPYr[^ޅ.ۚq YWܼ˃{cFʇ6=n\jTe,n"6O:O4oX{M[!ObN%JvQZ6))KO|Yg9>oxXsُO=$ўLiZߜ}D' )m"c>Ss\1E'iε㮅yqynȱ]½G͛Sp'ӗ13r]OL?Ĵ"v7>3~NWJtySN=1_|_?1G`;^^߬}]J+FOpdק15eo]OZx&I +f}yB9+t։?g 8E|.}Ò!o^3,mgT?MA؜<|21хDggկ~uC8: Nbz xY?vSJG%پbxIlJxJlf|ȗr@d$S=Qqf0 @0p3.| vhs!WB<N1.?;Ͼz衍{æ϶T|I˹Ǖ/{?֭y^J K.=&mВGQl"&U4mTkgResqG` `{~Kp@!ɮ#q{غ7)~4.3}'_t´w8ݖ kF9؈zڈ}⛩"=j*0նvq? ;` z09w%%e3b|/ >Y:.=s)RoFC8kO%%bjnv0r}lN{\6)?&cs$F;` &j0nTe)Ȗ֦~3ͦco1v@~Ro *OT.}&` !$q f}bىӈa,|.BmrZk u0 @0 @w>k30gЂ#<[Uã&gƉX0 @0 @ƥڵ>W#I $jv-ۜ @0 @0 @U?y]U`W_7Y Ն95L` `  Z`1;vR&kYT&` ` Fi'ģ06Vx+ZX` ` @ICG=aKެeS$Zj\jՀQ@0 @0 2`7H~')³6&)a(Aڊ[?$J??m[)[5oDr BSm }ȯ8֯>Oƭ RE\~j\  c3 ǭ/6,gֶ\V .arfm˕l_?NJJj{bb6G}R!pӗƱ1c,WMB{"R|mĠDj_>jqMj|m8xԲQ/STc[?Zj~O WG05jMO5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5Tp5XԈ=DlzG["RM~S.5m84mema=rSϖ4:Ӥ2Qġ-jbf,kGMS.lC- 6jmaT Z}S-ȇb9C[>`bXqPBu?01S,GxGDŽjKX EyHP@QV-r&MQL6(Mp?ۇmz;mviǓVa/=;O0F[ϑ'[[?yj_(mV|֏^Q[58͛M>“νl} C[6 ؚZ" EIDATKyʡf #զ m Pȗq?(%L[l&k&/8~cq̼JxpY:G.ks!?:gs)N.E5~ڥtMSZNmSk6ŀMl#m}1Ӽo6ڪ5WKu-0mȟaX@1'8~i{hC:Iq6}NNG1Km}QbrlUx`Q''5IE ^*©c' ?bvnU3lΒT. c$Οc!^?gx{^ -iK{_zFrh1Ũ?9<;p}RxRjD[v~Ƨ!&H/l ~%tpZ=[S&WW_+z}slcψ~v?q8Bmihcj|GvɕƧ63Ao O _S+4i-F65xGfS-[yZxO1|Dʖv9kx ˖v9kx ˖v9kx ˖v9kx ˖v9kx ˖v9kx ˖v9kx ˖v9kx ˖v9kx ˖v9kx !v-SgĔgqmy_O]jl|jR&F_j_[xٜ!J~lc}kG~7,g=E̹Е;p3kwX;1`9vx,g1`9v8uP%Idʦ&^{硸~66>K69풍od`SDXBڊ?%IM_`$>eUGMQ?1f3} '_#c/8ω>83}RT[}/T JQRԗz=s>)G>r:.“k}8&*> B`G[cǧ~oqxPd=.J/8~jgh?q3-(Z_*eg)VҿT$UEmic}ȟ'u?j8~gp>.ql-ڶ F*N-TPTϴwܪ #U4A[+rɳX#/69cуr[G }y> 8/-qϸg=tF#۴)(q=c>!q[l[69οQ“a`dfLHĵPD&Z)f/ HRA3љZ_@0 @0 L/>K6B-6ˇ_>xƧMQl'.Q³Tp2ܶ5!jŨ|#1Iȇ̓bpL` `  M(gZsh#j=hSߊ.y>4I1Ƣw*<If`kM-g'(Eh]0GX*N0'h^ֶ` `  Hf8VGC>K;G_6fSQ,v3㓭UxѦAĠewC 1/lj%0kv6f쮅D~ϸga/οqϞ8&!óaIiɇa[}LmS˧RaMQ6ELkqAyB(5$'M>[7sjad_ Sph|pY[sǧ+t\tOc'qOjFm0j Ge+㴽,Eֶ>UjSAaj .a' FRd#)`T6Ħ[}37ߧ_oӟJ)}\R|; >d%nϷ%nϷq> >dW|{џJF Y-#m>CoP #[Im//ߨk91ؒUFB8yx1@%Qi Ƨ\gWSAXWI*!NQ3ȯsḴV?q x9[js:t<'S,^~ՊV+fkpjcϫv=9kgk||3*<>jۚN-q%,UlsYckjqS=+GļZVm%V]ʱ>S[ŖlS[u)S[ŖlS[u)S[ŖlS[u)S[ŖlS[u)3ӚۖVG\-5?{AIx߮-\x߮-\x߮-\x߮-\x߮-\x߮-\x߮-\x߮-\x߮-\x.I6_mhS|jo brtlɐ]Q_v [ yj%.aK>v [ yj%.aK>v [ yj%.aK>v [ yj%.aK>v [ yj%.aK>v [ yj%.aK>v [ yj%.aK>v [ yjGUvOj{ZPv.aS{6%Z]?o[|-\[d(ym[.m[jmR_j@0 @00)5mkwYYm[ă_^<Ӷؚmb1}[ؚ_񨃁` ` Z9mY\vi,Zq.KZۓAL6ϗT[l_S">=Qel ѷel ѷel?_sGv$~G[|,p#-ZBh[]6>J}=Y#kWvv9'.gJe)?sE#8o[mv8.aG z>'ROcj~uX|@0 @0 l)g-XW(TRMbmcmo6fZŴّX76DX76DX76e?ٽmz}b%_Qxgav 3n @0 @MLqc-_uI Kit` ``kc낟f,.Mg>Xqla@0 @051E,'4V'ߖj{ P0 @0 [!IhIq|ɋ|$l= sҳ$?GHfד0!=7J7͗Sjl{ְu0` JHnd` ` ` ` ` ` ` ` ` ` F3xCDIENDB`davmail-6.3.0/src/site/resources/images/osxIcal1.png0100644 0000000 0000000 00000150701 12564151555 021104 0ustar000000000 0000000 PNG  IHDR5qiCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxdGu=|gv朵Aq3Be $1 $ۀc19#$@ PY+is;:5{Fwj~v%ߛ[uS:ӽ}^h35! B@! B@! B@! B@! B@fhk630~w\3f$B@-{gz}O/O ! {<XbL!ql B@! 3 fcMtz74B@! h5͐zbmw% 2W|RpMc4B@! BW%U>M{g*|\t-;$B@!lFq,=U|"j̋Etzķ~ עaC[Y++/^?zT*)(O?0m U.s|ge_eYeDz|ETڐ,ϡB@! v&][ok.ՅI+WQ>եc."էctEK ! B@R]:R}:_NWgJUJr1I%[O}NE9s9ߜ. ]7S|V9]>Z_V9]>ZV9#*G*k?1qNc_se):(S}=cXCi,~xګHƻ n~/}QE׏^?U)yY>r-sG*ԯ>h>fްEޏ}%1={ԖCW\E~ ! B Էl\}|u6 8/꣘:"2=lh>Gn2?ҸTB@! (D*!K1&zLs2?y>M4l\d>(9եc.tLG!'c2[c+({لe2^?zd{4uCYf>/Wç4lmII$^>:1%|qvO?Rmj8)_^?yG{vg߷?)>eR{nui>bاvi/{1`}v}1Ώ7oO_S2ǐ>m^>mNoO1t Wm)q쁥~wGVTQKm/f=m}>qLL~r}Or>RI ѷhL=do\ץ:x]꟎o\ץ:x]꟎o\ץ:x]꟎o\ץ:x]꟎o\ץ:x]꟎o\ץ:x]꟎o\ץ:x]꟎o\ץ:x]꟎oFڊgczr z1}H4 qctAN}>RrLIeOK%!}{15MNJ^?ag F:V`٧yC,OGAlǔg?'t^?3٧d h~>@e2:W+ pSS@ F޷|y׏^?|7/NivC[NV%>([z;雕cȲ>m}d16j$m>z/}бAs6Ԓ~zzGG-?ώ~Oi.sS]ݑ1a9 66=>ӿ!dQ^scrcE]t{ƬYN 5! B@Ilذa?~e]v>cC8jRKFɜ,L0}񻔼^*DŽwǿhСGlڴɶmľLB@!"nmwjLIR=٠/}ӠC,GGc=ad?EvOĤ}qL=lUM! {A7o!CL7n~is4r D ~lEh)81y}^2eljB@! E}+Q)\s0r.&ƾcoܯtB!}(}i/uv›hG}Vh2ݗ_fw|k6&Mbc +kO>n]q7Ag])'xG"1b1† 3n֯uk#ќ3gutthB@!#p' /^GZ2~NzZ՝L>8 Qd>%QYpm_aWlv̽γ_*۾mo^j?xE ]]|yߕy?i}luY6嬗آ˿g^kϐ6;sJsbɓ6dvVǏg[LK,EEB ?9{H4W(e˖ٵ^k't딼I}! x$ .| 6\ QѩGU\1>>X{l<ߎ]Ųbb7im6n|NGd[0 $nvCYGnNgQ[x=aqNQSgj۾za݆93l\D`va;vZ[v?A,'Mw0A${8=>nx;a 7=J+@??[-Y7럩3D%r&p)KသcШ$,"YIЧ:6LԪic\Ċ_ژ@N skV[ϝwڶض6m5w>ELY{ٸa#mvغж<~mw 2ߺGG|]JL6-H͛؆lㆍ5c@0_Ĩ !P.Cկ~w! 9 {*@z2c<| >SBtw'4B٧۹@p^Ws'x5p@4;W,osunhkHk;?Ĕ,;q9٥ᒜ9_n^xa{Ŋҗ4^/9Wʎ9;3qo|x̀1~! 3qA :py1g@\AVnUH&'9)tǔXÏ:9|jacvpʹ+,3$mH80Si#t Ƕ-[mJ&[bژ!klҌ 6tb cY@ v1tÒ M]6\flU.-Kmإiqh oWM򗿴%^{ELLGO<@Bdl~#9G>H.q AO:qZ~c K?T4~ߴ_=Ϗ7D)A< דc'x"?B@|Qv }4&bL]jC2~ECb4~T]̑l;6"<CzZ[8-XZ o ?m`#CX{,Hȡ=nu!ú⎥uжlM[ D=l6Ĕ$$ɤD#D,gt!#KJ?Z ON?xÎbhn g?~֭[o#k/|!WpBÍ{h8?9 7GO8蠃 }x}oGyM׌FB`0N *I =)azl1(j>w<ގaL &1Y9l8J[w~q]` F0Y,\Qom~k8:ǎu?~0ѓlmcT #z}x #:搠2' BLYÇ>P@h"qǰ0Щ !Pv-?*RxM71w'mCA0AH6gΜ s4H.xoA>x35ǏaCOΙ3'^sq|Zb>[n%> gΜMR!P98CZPGʭN&bBTRG/1헶KK_b]y)\kyD{+v.mϞu2yqgs{8VԶw`wv ~nߎrCPwϷ Ͼ< a+ցcC q8w.I4tv5! n%H%o hp@$ q %(~z" A㏷O~C oGv 'ĻADUD͝;מ^3L$8]ϯO}! C *KHB%y%-қ>bQNeiSeE8'=f@,sK¸a_͸YB38uto8p0@HLv)Kepz@r_I,٧D:^>$?0oY@"a ۋ^ym Dmhz1zsUfΎ[~h?h#կ[8ŶrN,7 1|@ҋ4-?ǣDB)^+=(?O٪G>frVW>B@{AHbI$I#Ї$hOi.Z?^z;ټ/`PII@qPC^fM<ĝM649\;U9>Uٜ 7<*y n?f~:+L)! ܅́Qd+3G4X{ Z x $\KJ蘋>}9$k4 拤~9 eQd2a-q pVQwg vXq:Q>d~# ! )&)9?%h{)_U%,I|Is K kf*&ZjRԟzH؀#m ! %J(~ג6FS2uM}bZ?!2hy;}) ^2%%dԥ3%91|ه5OZ|G`&B@"yɄz |">/zHf H~p?1\8l\0h1ғibE-G}9_J24.&0 ! Yȫp;2'I$Ol2[_$ӓCuc, 6هD9?AxM"ZJ<)#2/*r1c xQ$͟a'X! @Ky]HHyj~_h DI`]ژR *NO@I>7KJC$xIV%~l=\?}3n['M᏿vkonp)_;ؙ*B@vTcȔdاde E{/}, ch/ïoWOztL]јoxVd0|ԱR?̅~.S(sv #0mp N@QOGGo>bF!G Ï\cÆDVYoׁ=2|iӮXB@=3a_cJ }s>*0I0Γ2o-Zd|;I&  d#V\ X <YAF@KX֟+F;f[mŋWړKVNvڶu f{55>NɅmʅf*{{ ;mQ5P^! xV!03  <%}>ly#,"E f㜩@Zܨ\n}8f ,a͚5T@|aÆ=Tu [̑#u>EJڼ 4y|CZ# k$s͛O/D IDAT?ic;d?f=Ci^n@Ի9p;lʵ6jDyv g>δ3W\cu# ԄB@$R?t؇ac_^~1'uidұiA1^O > 4#ۇۓO>i`r>ͤ쏝?}v Ϸn;߱b'G2kԿ idN~Y~1j&wVn7<9N;sKnGwۺvǷ@F3V-]`7H5gmڰ: dtvl }/mC_DV5! h=)y$$5hУ1to\$\x.\ysցD\O~3۸a}] <.SNyI͋Zy0|S>)}?*3?Gyzn]>CB,:2e7"f۷X"9vgLl'~M;sm=G4bhwqvaGj[ A Az Hf.7DSZ&^_M/V B`wFs)vߧo4ONf }Q\hQ} &:5}t{_a֬#?zlD7?y/|+իh8BG"֟Cb Ø}K.Į <@;O}뮳믿~GN:^1~Wޟ(t0'0h?+ S&oѮOv Gچu5lvF[dmw#=CmPxIÖyIͶ-4Ϸ6ؘC퐹3B6'/i= ! hϙ>ŏvXR}gh,k4&-k$w1i뷷dGv$v"fBvm'c>4[GNNZOtU S8_֘ 7@}C'{ }gIu 7pCk??A4iRܬ7ٙrg.'|e6gx0n{v[=6UkmA ݝ]P5[y6RbS'AI'o.n{7N?* t罶p :e\_B@! ZOS7}ȷb`g̨B&SO"(I&iew#!HpҾ94 FΎAܠ>$}3_;"QY`.xYSS/~AACM4Λn)Y|]v5H>$k:>ZѐMmފvq?dw\nk3<#8>1IUnS'"Մچqc#؄pG>ÍB/|mk3NDtMD?OGXf+~!|N>C7HC2̉}"L :JY$u:^ئ#F@`1brϻ 7eweh<b[otpMeاo߆O:Ǝm{6~({6r0:n|}n ć7m{8>w4{h'cp|ёoش\{7ؚ}Խ6Z℀B@d g yI%cؠ1ʭ*DMDZ6LHҝ큸0QT裵M~:lܸq| dj\$p.h$Kq:~drJ܌?CaÆՎy.x?7u8 X+$ h׫CNccAFN[le|9"^[9m\nA?ņ iSڑk=]ͦk:{Qwv 7m[oˮj; sc]jB@! Z@ץ\ SSR6Z鏭J2J:eť6+J\}|橝Lb-\Io9oxC$j޼y7D2 p99?1bݔTǏ5EY%E̘15@DAzzzjѣG!a웷?'Hq};;q޵K}|R/q]fذa#lm {=pg/8ƎOO?6/'}=bl#L~ ! ؅ Sܸ&fI/ 16[٧n$A4<;8]cn+W#G)l]̰oRƼT>bFp0jd$ke'^ĠVLU;^P?ڡc{Ϟnʵv駄 6zD6{9a7cG;mQǗkNpmu1|u k1I*?! ԥSpc(]/#y_@j-\0iq ;N֭ϐyu܉O<VZXO|DMmŊ~㛋8e",:֮]8K>E}?[`JVwvA{GYm !z:"c~wzl1Ӎ詓۬vMxn,ݸF\ɍvۃ;8~! h q+Ƀ3v @Ґfw2@)Q$c / vffdĩ;| I)cGh&w/jk~̋9AZ4|d i3gNiӧ;7D?t-I'{,NGϳ?hۡO1G_K %\ЀA1e&OB: ō=&g8 I} 07}0FΜ9薶o4EAӦM˒ru[@ZoI;Smın<ޭ٨x7G\^ƶmX݇] as@E }s a7t 7ډΰ5|mB'n՚9Z&B@=Z)☲V|[d" d5ɵԟcJ:J'#q;D# c}p5nALqxN&]1gww4zF,|SKoCf|{O=yϋkxeaizRx)6 YC8n_nۺ]3ӦMq!5@:v3:óSSVS&ʥl٢EKle6b8! ح,]Xʳ1O0?-=@;p_Oǩ)uv78Ov11Ndb7 m[a' ϙ\jULdA䋏4ADbp?@`H,cZIJ?k,ɓ'y97p:q}h}eq\T ³NWۊ³,Atwo d;†b=09v-G_]}}ᙚmd3gwvu jw`;N?&+WB@BBy=8O1*;/ᚎT? -e+j`ܸƒwM@=jxQWG3/bd}ۦHS>{$5X?NˢOL.g%;W_}@0&￿yN{ؘoر6wqZϝ/1 ^L{Ϟp Ϯ9lzj#^;WHavo._%mӧNk 3cAh ܻN?u+.]6nyF?I++Ol_B@!  q)(J"}>c s\ ܹhKQfNǁ@pp7Q\ 2"j W^ye74:r`mA =H+\?gΜx|T-h.$?Dʫdwy|Ɲ .T jw!6eSmd{HqD$w_[7|;PW CwŽp 簰k)pb#VoZo7nC?8$e . t.^ B@<9S=o^}#oo^d sxі-!*k$e=k©;Kg!.Ao",7gK"}ǘ}JCDCܝi{ҥL>N & |!xrHC=D-6H4Sw-_yV+<'֮\gt'x&O+X/p|M9Noܼ޺3;gv3abx[h~wz- 4w{N{Kωeq]j]! @ HNz]Qh]Z$t1%k q Xn H W Y]@&Sׇ GfĢ d7Z?1II}ڱ_"\HϾfv`+sO<{pLdcM kwvpiڪKyf|pm;%meo{͘O.W+֡B@! e|@TuTcs:%%ts:>5'CMaG/Ϟ3%J JcuAp7xo[icǼ//Bl5S.H'aS9iV6ZΛ7/Lrt)MF܉,|ź!q0.ی7D~b8=Ў{ae+VʹZ[$Mkln[d-]xv;#l]o{x0лжͽ+?b?_;\W35+V! @2md8^t:stL}d) 1xu;*+@І]ȉ]N9pj{] KsTk+ \D5 d6-,'&PJ>!2 $r)}$_?H 5#ao;^akϳLJS q-f*Mk. kWIlifB6e=Ѓ̰:nk(ZB@! $QkQjv_w\fTp+>qMa܅ z;5uG~D$K,/:8N_lm_]c0pFF"xmБ`6H&5z]nԟ6 ;}՛!O<>ƏnZh[]wu}GC!R[nF?; UXmo~}tG4[⅀B@ԉɥdWd[I20~jivO%/0Š 1Is7J2I(SGܠⓟd\/!xR 0FyI(AAcX8;$n8:УQ:S-f 7t- 7uO \|awmv[lrsmTx+mW4>)B@Z_q,Җ-?On2[$2ۀv Eғs7<vGV ij܍d q%m8@@*!Ї>:/\[]`oYcHBU|КCA @hQj.E[[v!.<7<=bGuu։l*1}r3<(^v jB@! Z>\>`[%56Jxue$3-EA|^XV <y:E#k.[Y>3OB2 3߇k:f~@Z=`,0Z$ >㲖K}>姍1E8/Hz! r\:JXA_Ϙd+H& LPT ;c. ̜ǸCz t+W_osNiKI"6 fߓ6V\ԞΟKg;d>FvGxU_O[X! x2Ud}q IDATi.eTԞ3}|h٘?}*%`ꪫjN$7﷟' :ߧ}Hߧd*99wUwV~gRx&լZBiE Ti1W_Ms4< %zޟ{I||+!bŊ|.В%~]ڛo^?>ԥ0>Img϶O<1gppJ["%/yI!GZ9h%j" ex缽q2"~BVM*miONG D/"{Gcp0waN?t{sM\rI$F lO>dxYvgG[Y̴in>N>dַOɂ̼򕯌99w-:A:Hq7Ƶ^|v]wGo~g#:uoe˖w][pa3xv}ُƍ /0|wo//c^N;@ml׾>=|̋SգGwv^kkc-t~3klĈFӟ4~"/?Jo[馛EnS`Ϗ6ӟdpo%K5u{<^&,/w 5ԄB@>JE2MZF }NqkD y7N|ӛ p^ve}(뿎d ,dx| ӧG23k֬87d:$[Ta/3gk=A8A2[|3 @Xߔ)SWObp޼yX4>;C"m~#bCnl]wow G\ E b $wWD_?6 NW_}=7!i|u/~?M׿x@HA߿B@! C6v|2Q&iY:J.VIc< rCoy׾& vk^ &Ԋy_s<կ~vi 6;zE v4SN9%N~vwGrX4PqPh:Ѓ>bA{qErrN_lع="YYW.CBr7;8o@*O=ԈHwL@8{q&,`gyfc; ިC+H$y?" oֈg?YK#;ԄB@ԁ9V.2Ey{~;ˉts:梌>բPalNBqF0qцS$P)6Z1$vl}'=^A>c!m4ءî-}ԨQ4/vym'gQ9HX‡qg϶;'#a,$`8pO7A ҷjժwAА}}#$c\& )@5 e =^'8%'O_wН>ܘG##*C! @1}!oBaO]:Tor=Zς.Հ:x]v!vDaxlZ1.v q;W4KҕJq%H4y5o{"N:餸Uăa wcL=Q.}1D"6vqZ}=X[n8<kANB zv23 CS_5ؙ Hr68i$7 )q *1cF$P:v$dE/zQ$zcHpz7t1vPrܜK,6b>  &{n8)ƀ=։w]^{dQnԧ>?j@4/K ! CϷ*:ɺsrozS-A AhiHv>j-9‡?yI\[S|e8 "f͚s@`a $ D-9e ȟkE N_p|17L^zgq}L1n/vaڱf;q OΞ=;anԄ$wZqWzTa* kIqD] ̘c>QEN6~_#4FGVPtX֋ܬw`kx\yЇjmF,N?B`G ܘ=lƩ[/ه>w0$}@cHOepC?>S:!s%$|ĘDz!1."/5L2C|lqU5T0ONQ_)a5`\TWn}|ea@ ~_ `lE-~?' szB@!P y_!,$1%b=R1}DiL߼lSz_^ĊdsLuedchDuO;uh/ʍ@q||ӟ1>Х `V~^9=Sv! u"VSO_A&B@!P9V΁6.PqOS(/ᚎYx&B@!0<5eGq)(W>c}w4%E{]ZfK}5B@! SU hZA2Y, IuMimeW)M! +TEv{{KW-'ҢG[sB@! (G ǯ-_HfyeEx?Q! B@z ¿["~:J蛓U|rq ! B`O@+Vƿ鼽r^Y4_'zt>I ! B@!Pƕ-ǿӜ$%+Mdz`'|B@! q-ꊣ[jkj-).B@! @$o2Jsa6мOF?B@!  ~UıO[ʷ>l9V̲l 1hjQ ! B`7CstyVĭ|-]s,ɬR0~(cʴЦ&X! { g6K2ԏceB@! "PV*! B@r\:J}4$;bą!cn`:5޼emؼVo6ۼlںRY4:YOg fpB@!A*%dXx@ټ_isՆmxV[jKx#N9&I#h>k*P!H9U:1Ev~q- %zޟ{^ŧ,>ڰhVgA=b(Y49cJS!B@!"@NUT~[¿j}\ sxі8ExH0,X`/ O߻wXzv2ب&B9~uE}S͵Hf>X[F }37a58] cF ^pz*v?k]ZVB@!P2E|ٯK"F%ʨ+OY| 7Q]Fg|5֞2)Uq%}|9W׻}Lm,}]h'}Sӟ?X]ve6j({+_io}CkZgg_z=baÆٗe۰a]5w<'|;#|_o۷o!CC=d_W#I=z]tE}^Wmݺu18%TZh}䴻=\C^sꩧs8g?Y&|p=^d>{w\! +ۊ|hdoldpb(輟/ {[}\{6;/uY=R  &coF[je/'y ?я ƍSb/}i$8$}'atرц܌;ʕ+/~qw#;Kw#<!  ϳ/S4Yk*L8,ZNԶo p?lڴi׾6@A.w!Nwq:t 9 }Nܼl;CI&v2kkCDž^ho~#Ax8@NNw9"rM(x6"@6.PqOS( l2C|pzݜ\S8@2i1cxuA71bIPȑ##1+߹n-<mMٻ"U.B`ʔ) yq$e64{A0>d~=Uɤod$E>×1^Ge>uKnM<96cƌA9}B@! UBB@!  yFE1St< , |tLZB@!  q)(_ӐldU \ץ9lB@! | M+H&~!=g d/B@= S맽 oq-Ȅ2ا*>e ! B`wEh}9oo E2R]ZTQʸ2xb1>d$37qv8xu䒯B@! @19E]q`KC\^9xbMEZ>eB@! (C]ƿZI2`. B@! @8iK'7_-?@JYVpm@A;M-*P:! B@f_y.ۊUk%U FsLԢd ! B`DV/fIfU2qLYX B@! YjgqLY+>;iP2UHfZ@:. S)k.B@!02tli̴t \ qyB@! 9VΛ6.Pqc)UHfap }c.(gJ%B@!P@KQG>Ϙd+H&R".QfK}5B@! SU hZA2Y, IuMimeW)M! +TEv{{KW-'* IDATҢG[sB@! (G ǯ-_HfyeEx?Q! B@z ¿["~:J蛓U|rq ! B`O@+Vƿ鼽r^Y4_'zt>I ! B@!Pƕ-ǿӜ$%+Mdz`'|B@! q-ꊣ[jkj-).B@! @$o2Jsa6мOF?B@!  ~UıO[ʷ>l9V̲l 1hjQ ! B`7CstyVĭ|-]s,ɬR0~(cʴЦ&X! { g6K2ԏceB@! "PV*! B@r\:J}4$[A2Yl/ui2[꫱B@! `<¿gh@ b9_HojOYf~ ! B`OC Ti¿hx\d62':i++OYlB@! ] *Z~[¿jL?aTU?>^B@! @99~uE}dm E2l-+/! B@ԋUEz(o QPGߜⓋN! {e\2EUN̢89u3>cNR! B2m9 އtO%Y/M\iN>{]=+B@!P@kQW5WdXSk(OqvYB@!  9|kVL, C?A}4)B@!P"xRWfеd\fPЎAS%N! Wc"nUmifIfQCS64B@! <-YY ~S(B@! @Zd/YS֊N/G}K'ԟcZ ! B@ F<+#[+r*$3- t%Ct}B@! !@󦍼>cy eY1| JR ! B@ RQ24ǿ3! b}KsR_B@! #T58CVLBR|S{2S_! {)JO{E4GZ$ =1dױO[YU|eB@! 9UsUd sxі:B@! ++#kKW-Y^`kYQ~1gF! B^ȯ/;GH_'/:d\tB@! (J/xr:oܯdMɩ9(uB@! }q%o/d>4c<}*zIfnJp,%_! B@br\Z$sŚZ@|"B@!Pɡ[d`\ :4ӧO! B@*_q,Ӗ-?On2[$2ۀv ZT.tB@! +]q2oKs7K2" 2-E4B@! Y_>o!̪͒d0㘲@B@! "{)☲V|vҠd|=꫐̴t\:A0S֊]! ;(Y93 S\AEpBWq^\x ̽ EqepAT0@P!$$~Ou?OsB~;U<>1X%{QgEmڿz"xrKa}c\LLLL5VVukc}NjsbXY5s]a~6:U#2IBsFdYLLLL*2--[35:gZv@ky 5ZXkLLLL`9D&"1ژms0008hgG6?&2P!59sԴ3000Jv?<,kLdفb,֏:byn&`&`&`&&+Xu5&2_Ͷ: TW=Sh%2ܐ1ZclOM -\KFYe1wϧzn-blMLLL2LYel㮍ؔ\k&`&`&`&P'i-]Tm=2v x3&`&`&`&`-ΘSdpa^ C Ck"n&`&`&`&C\[&ۯbsց[m;]*[1000gTciZ5k̞ZӧRq1&`&`&`&p ΚSU^1V @J`LEEv?t_{Df<@ XOvy0000U-uVڦ'HȌ,$(yG?uMLLLPceQwq:MLLL*ޟڸ\gC̵SwLLL+j4^1fxZ?ꘋ=&k4 @@4VcYטl5:^Ft#&`&`&`&`S P_/NݣY? pCh6=5Yc&`&`&`&ps-e4=*2k9c?Vk5000"JV2bgM*26.~XcSr @@wfjSE%pౚΘ P:ckNy1c1 ي @諚B?sQoϚlV._)2[nltlALLLL`Rjh.=o*2{ChL6tK움 $:kNVn*2{`O[=&`&`&`&`)1u}ڱt!Z~on0$c=}ڱ~MLLLV ^YjH"="3 ܒeXu<7000#@U3GgX}S="ڜ$:GiyOuLLLLB RѲ5_ZseZaL`rooc\o>*}{ʺsյ᭨/xAD\pN*oVwu ̻ZZIsk)~*26.~XcSr 0wKK#]]?}{ōobq͛j}pH>}zdJNӄOO. +뮥墷?~ŚUk16X7Udv/<]kM>|W|En˫^a׸]^ih'?y7 Aȏ//xkn|[?#?x,{+^Wz!4 ^}q_菖_r饗E;qEC7~7w[=wgYP:ckN^ C Ck"n& /ؿ˿,__Zc.[;27n>.Z??)OxV^???y%n--Wu7"~W꫾|'|Bwsi:x?!))R^җ2d+r'|DH񕙟*zԣ/η(y΋Cc|7~cςگZOzғw~w.j |-xc[}P>?/"mo{"߲5¹ЇV/ru-] XzsrkrjExӛT>?}x[xsVog=0s~1zyE1\.r/^~y5x񝲿(w^oύ=AxLqlx}ٗ}٢<)?ML -xc~.8gMb/rZn6Tc&`w}sCtMK"Us=wg #?Wh `!"r}ч[?c>f!zof Zn{.}-0y[޲,|GP_W]uB$׽dp-a=}}K.Ybr=$x+g.Z^y]Z~W~eoٚAaw[lXsYy5:|{wXN׆ý 2f~s>ЏG7 GaV?S؏X(x3?3b} y/oo-_LmC*W2qګfY?D2n/Wvc&ĵC!{{;? ^=#^8ūd O:;΋ PwDݧ}ڧ'N-wvZaWyNBWcU@E?>Gx?_ ԧ>uQWa_u:8Ś9YO 5\8#񈅏W9~ۿxs?.wى=WfEVX7Ys/]zMEfuitL`_h8yd9vؒd?21Ú=zt' ŁW x5 o/tQϛ(`l XxBse63BYXb+bgIjVN!!s= "W xӞxgЂ/-gie/^C -)o _Qx~K^xECF[7=؛g9C`LBvg0a/="3 +z>j#&`/&,oٶ^qx_L#?׈~im]6~y%+b9ަxk_xe?py66^0~n5>x=Yb39ҏ؏]% =a;Yhdk]??\tAsq ^-+dx,0=DX :Zõ5 `?*$+<"cdx5M~5Xџ<^8 W%!\x|1V6/+xe+Čq[X_&91Ou!z\+9೬^IhUuV%c}Gx&zYu<7KxH1_NP]{{_ˌ ^򗿜 ecK,;̀W 2v D@m/fzu9-/_xr/\İ>3WMkg|o5Rq~yD|&/h_W4>S:uX mߖ>|-ëxUb⟷g79o-Xˆ{qyVljֵ` 6$Gϸ/<ـD o#3?3W]ql@ⱂtT a !92 xۿ*&jX9TXo?2[+|{kQ q =vPcduS>\jg {)&ޚ+~Ӽ^۠'x| gb#>WhkjjpQx 1W,kgwœoC@}. IDAT|3[1Rέϙ,x;5]֝Z9썁W/X=^uԏlUl bW #s= ~F̟IW7q6Wz\S5;uᗢ:u^-j1|q} 8拱]zYl3P1GʱL2oz^dA+0q޿kпcMK` LFNqMJ>kݩ* u{ϦwEϠ&=kqc8{ǟz\S;;u}^zG͂&n:xX1|gl+u Y!W1ƛ 4QS3ߣXX{%NzZksZi;g&`{Jt˞nML '@Mg5ܔY+cأkFc dJc9VEWCeN+:b&`&`&`&0Ub=sL7dV/k3S9f&`&`&`@K+1_QVYL"^3F8h1[0000--La!,~t٩"3۸k"56e-ך dZzjf-6Udn[] @š3z\<К i,3k؜"uVn@FtLLL+XziVڣ"8iA7T\̾ @_n"W ::a&`&`&`&{QgѧO7C2ӧwLLLL`@KE}i$#2/- J^яq]s0000>XY5s]a~6:U#2IBsFdYLLLL*2--[35:gZv@ky 5ZXkLLLL`9D&"1ژms0008hgG6?&2P!59sԴ3000Jv?<,kLdفb,֏:byn&`&`&`&&+Xu5&2_Ͷ: TW=Sh%2ܐ1ZclOM -\KFYe1wϧzn-blMLLL2LYel㮍ؔ\k&`&`&`&P'i-]Tm=2v x3&`&`&`&`-ΘSdpa^ C Ck"n&`&`&`&C\[&ۯbsց[m;]*[1000gTciZ5k̞ZӧRq1&`&`&`&p ΚSU^1V @J`LEEv?t_{Df<@ XOvy0000U-uVڦ'HȌ,$(yG?uMLLLPceQwq:MLLL*ޟڸ\gC̵SwLLL+j4^1fxZ?ꘋ=&k4 @@4VcYטl5:^Ft#&`&`&`&`S P_/NݣY? pCh6=5Yc&`&`&`&ps-e4=*2k9c?Vk5000"JV2bgM*26.~XcSr @@wfjSE%pౚΘ P:ckNy1c1 ي @諚B?sQoϚlV._)2[nltlALLLL`Rjh.=o*2{ChL6tK움 $:kNVn*2{`O[=&`&`&`&`)1u}ڱt!Z~on0$c=}ڱ~MLLLV ^YjH"="3 ܒeXu<7000#@U3GgX}S="ڜ$:GiyOuLLLLB RѲ5_ZseZaLLLL`@K+i._XAk45]v6hHy`MY˵&`&`&`&`ub޵YKM#cj;c&`&`&`&"@qz9E^090f+&`&`&`&`=j E>kZ~)6l[:жѥ3000}FJ5VjڪU90u80}xЍ.o&`&`&`9[ź>mN ^YiM kEGdDi7000X%{QgEmڿz"xrKa}c\LLLL5VVukc}NjsbXY5s]a~6:U#2IBsFdYLLLL*2--[35:gZv@ky 5ZXkLLLL`9D&"1ژms0008hgG6?&2P!59sԴ3000Jv?<,kLdفb,֏:byn&`&`&`&&+Xu5&2_Ͷ: TW=Sh%2ܐ1ZclOM -\KFYe1wϧzn-blMLLL2LYel㮍ؔ\k&`&`&`&P'i-]Tm=2v x3&`&`&`&`-ΘSdpa^ C Ck"n&`&`&`&C\[&ۯbsց[m;]*[1000gTciZ5k̞ZӧRq1&`&`&`&p ΚSU^1V @J`LEEv?t_{Df<@ XOvy0000U-uVڦ'HȌ,$(yG?uMLLLPceQwq:MLLL*ޟڸ\gC̵SwLLL+j4^1fxZ?ꘋ=&k4 @@4VcYטl5:^Ft#&`&`&`&`S P_/NݣY? pCh6=5Yc&`&`&`&ps-e4=*2k9c?Vk5000"JV2bgM*26.~XcSr @@wfjSE%pౚΘ P:ckNy1c1 ي @諚B?sQoϚlV._)2[nltlALLLL`Rjh.=o*2{ChL6tK움 $:kNVn*2{`O[=&`&`&`&`)1u}ڱt!Z~on0$c=}ڱ~MLLLV ^YjH"="3 ܒeXu<7000#@U3GgX}S="ڜ$:GiyOuLLLLB RѲ5_ZseZaLLLL`@K+i._XAk45]v6hHy`MY˵&`&`&`&`ub޵YKM#cj;c&`&`&`&"@qz9E^090f+&`&`&`&`=j E>kZ~)6l[:жѥ3000}FJ5VjڪU90u80}xЍ.o&`&`&`9[ź>mN ^YiM kEGdDi7000X%{QgEmڿz"xrKa}c\LLLL5VVukc}NjsbXY5s]a~6:U#2IBsFdYLLLL*2--[35:gZv@ky 5ZXkLLLL`9D&"1ژms0008hgG6?&2P!59sԴ3000Jv?<,kLdفb,֏:byn&`&`&`&&+Xu5&2_Ͷ: TW=Sh%2ܐ1ZclOM -\KFYe1wϧzn-blMLLL2LYel㮍ؔ\k&`&`&`&P'i-]Tm=2v x3&`&`&`&`-ΘSdpa^ C Ck"n&`&`&`&C\[&ۯbsց[m;]*[1000gTciZ5k̞ZӧRq1&`&`&`&p ΚSU^1V @J`LEEv?t_{Df<@ XOvy0000U-uVڦ'HȌ,$(yG?uMLLLPceQwq:MLLL*ޟڸ\gC̵SwLLL+j4^1fxZ?ꘋ=&k4 @@4VcYטl5:^Ft#&`&`&`&`S P_/NݣY? pCh6=5Yc&`&`&`&ps-e4=*2k9c?Vk5000"JV2bgM*26.~XcSr @@wfjSE%pౚΘ P:ckNy1c1 ي @諚B?sQoϚlV._)2[nltlALLLL`Rjh.=o*2{ChL6tK움 $:kNVn*2{`O[=&`&`&`&`)1u}ڱt!Z~on0$c=}ڱ~M[g( IDATLLLV ^YjH"="3 ܒeXu<7000#@U3GgX}S="ڜ$:GiyOuLLLLB RѲ5_ZsefcLL yg5?:"1PiX/G{{D&a(JO_oqEhϖ:+ߴ?xzYul'=ig=aWz5 "@]9.0?^:U;zczX'LLLLVdZ1Z6eKktΞl+c 㰽Ű&{4jb}0003Uo|gyKoV~{7.=\p^Kygާ\!wXs{txS=kc!2yXH/cVN<7000=!qyԩg\>[CO(wrrOw^}]yK^SQרL*.|M1>uD&6*̵SwLLL&췿?I.|rđr Usc.WW-z}O~o_)OG;ҽTi^Yg_c X?|짽bяu6Xm΢DT&CeNSoLLL8ydy36W9qX9}9ԍ8J7O7m喓;z|ăWrQye:gaP_/z̹D^dV/k3Sy^LLL`:7G_>î,^rQ9}h׽< V+˕My=<'~t-Ch9|x =wrk~Y{'ZZbb}&3.̷bע>]<T`~|^gx ^haO^ &`&`&`{G_U./}9s$?D5ᆭwOsʏgWKW2OO)7:T.sʝ._U˱c>pK+i._8l3޴SEfv!z`rPOPG*O/y_{/ çO]A o^xs_Pi,l\[&;^+/rKv6TVt:^hczZ֚Ι lF̉#yP92Cz:|~Zyʓ|#>gx|g4o:MW6?WZ MKhP-inȌz)ĴNq~m<oxLLLXyS<45>A@a?<(g.>NG~j6jN4B?trx|セ>~l@Tիv枚>m{߫{\ʋ F`K:^Sn#Gxmj|w_(5˩[z͑r*7-t{svBcb/,c="0atQɈiLJ պgw100 ;wǓL G3B=K_T~[}=˅/>y2rɛʉX?|.=U}׍:+ߴ?؈8g}c\9_{z`/n&`&`&pF @^~;7o{s3Ë+eG/}I=pe>ćW9Oa^ʿU|w6Ѻ+ۂ9.0?sy%ڜ$:GiyO7W8պޫ 8:(;N}}yկ/_z|/^|[*&>9|^ͼ=הr^{odfZ1ZU؜=k9D&/P; /<{4ZX?y뮝R׼fJkMLLn_|qyPV Sto`(Ad/r[?U]ו7?7O˃ſW҉OT\]F^LLL`~wk؏W~y{*GKo{\tc73sRT{͍ۮy]yCZ⊽|3jo͘/QZĆS㜹{jZ+9&`&`&`&0F;sv}WU_nrwbw~\OOrTG,&tTh^Yg_c"S7cP~1{tMhs0008#(4rE~[˛/rr'K.w.t/\z饋W0P`?Wͱ.Jc"3mj[Pu:o, yLJ!x+!8rM7-O>% .`1?˟$꫖bx.1Z^guVs&`&`&`&0G}bneKJXg۴PK+1_]SE&6rVLsMa4?6~XccΛ ȴc}+lUզ)#}+^Os5mժ\\{Td:>4is0000]N~ؘjR=Em*2aM:clB 6N-̸a & .훀 l%TgU(kk(F+Y T e&`&`&`&`rRh%cka#2;Y<\싇cCozMLLL VʴcZ 1q6su \^qMZlMLLL vBڊ:9N!> ׃e9` }q&`&`&`&`b2P!I=EZg]r_c"3. hNzh<[yBMG=7000HK|%yeZa=bc"S7ل5!_ř5000XR2=5ਢ?:t Dfl[B_49{0g.Za&`&`&`&K %j)ب4($c|wjT q1e'U]10000-j$u5mh'4yVk#K޸ |1=/1q8.sx`[.첧 q5aO9tܬz[~'{fϟJVϙ9lӇbsB2G xqX}51ؗSE rcu:g ay;2α/%yàD_X5;#ưHomV~1?~}du~=.zcNʊ> |a8W"_ebǜkXݿK cc^Y!]n*kb}ݿK cc^e\w dlb,ݫߋ~Kyk\k1>8sE(sOkZ;Z0Ǡ:gdf@` ,s3ZcN}yaj>G>,D3颎=Pwa9XX9o~|l𱢏X9?~6 31h~??_ajLu1bVtL؋=:u[2V80_%M1G{䡳? ' #,js` ,ڿ(|8k.{վ7ǢΙ簸"8^5*QG.|^]Kh9ǀ"uчччччччччччччччччччччччччччччччччk_gk_G]3bЏ؀NE( ťY>`N?W񅵲9-!Fu&yđ爾ksgcQy|$5?~HXg<4gڟ?ɜs2=c&3:0`=b֦q38g1\FŜrG\@?래c |a0: q֢F_,0|qysE<֙@|\cFΏ?~'f<>|A`=1WK _\g,ژ>@C-k3s9Gj{Df9I9ppx .Gm62u\9hG-~[io~~!휟?~~~xt a_Z&[ k#ݓ1ĥ$<]N1c_BsP3au:[?[ѳ5?[?x Ϗu=}/-mo⬡e}b^עpsj1_k+2q<0a3y f=*JgJ uj5jLZyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyט٣6kLyGsC`9"}Za3G kg,E|KtLdbq 1vb1 UFAaNXa tV$zk-SMv5?{S~O3,90b~:Gb"1VuX7>؃| sfyу~!x;9EPA8uB ce/-^a6gIb֘iGV96?ص5fgĮUN9͏$vmYm~$kSmCq"ƘD_ÜqAk %;"Z䠋`k;n P18qBEXp(۩Ŝka_@vw000،u -VV.b"qMX AwFqݝ$b%,@*ݻ!ͻ9\y*eeY9U˻?c/'by~qN:(kS(dЫ18\+MIW`@$.OѹHl~ܗ#~vg;*˛>WY%珟?~>/z#<9,ȩC>j\&{Q:Z"]$7քp]Gdb#XƸVkESV}g֠?Lwq{ ~ QIDAT /S!}49's;wѢ9̡1&20<xaq8JyxFEby$*}`fErLLL%@9u,@yV̬q3cDNPqC|13z|!Du&|`=| 9lMLLL`S@\>cqm=yu·@l+271uG}1ODqX y / j1spN˸ IVAQq~E}<׉{q'ǑbMlĢf8 >19#y&ú>ܝs`gd &`&`&`&0';S#Rׯ.`q>вj0-G~^׵v58cVf|sB{t>L}ˏ1>̯>ftǟ2ӹPf:O|~XO}ZY88G_ackz1ƣRuhuM9tΘZj&k"ck r32 RPbZ‹mXGu5uiYW>mXGu5uiYW>mXGu5uiYW>mXGu5uiYW>mXGu5uiYW>mXGu5uiYW>mXGu5uiYW>mXGu5Z>-P9Pǁ9㈩sWѩqưccvZDtM1E6e1"~BA50`cu\5-= T7=Q($y! Pkq=s?9kub^ݿLƩ_6Z 8~8LƩ_Ʃߔpsg^-j4ιjs֪ź1ǀG5;~Ģgh7cMl&c-zϹZԩ9_ D =!Ns 2<#آ8wϦƈq+Yw D^7.՜˿[8\VܿE >حϢgř9At0˜0/a>lcs 1ǠV}Ɨl&lO41]s\Ok9U,2NKE#|>@jLјΝ"Ltn>й~|?p^=3qP N}:X18}9uŀ[ۍD&K2ZCrZuXC[|y16g1?6gjb5y&Cu6js,w/?X㝜`3VYL{tf1yVŴGYmgYL{tf1yVŴGYmgYL{tf1yVŴGYmgYL{tf1yVŴGYmgYL{tf1yVŴGYmgYL{t2 5!/±Fs؇>欍qZK=43j'&>-9,cϯ㚴̩sEn@iϏ?=g?gĴsPsZqŠP:iYW>֪9kÈVT>`cbyr<|2Θsݪ1Zzlz|3u|lǏ?|6L~=)cqi:f=c~̫Gli>bcs31cj s ")ߴa@̏Y?cϒz???2~:?9F̩ź9j59+cʓ8|9e_÷5? sc1EBiVV[ZZ93?h=FZ9?~ϟ֟:~`88ܪ[W5k{e>c׹59FoEw=xHYjs,\EEki s#}e5o~~gE珟?~?_b?@L~Z9-z~isѢ|Qj[SY}ѧi$khQsr>akm6w=3b~Os%g<sQc[?1"Ʒ1kOmνVdi7yBbᬿ'6Vc~dyu5000)zX]̷yc,YM-Cd1}8ƣ:sc3bOָ陛15~Ǐ>#=3FN쏽G}kɓSlzc#Gg_o{n&`&`&`g@M޵ZY7ƽz᮪(1U8cju}s<,jܟQ鏙_?2*1gU_F?f~[+?K#4C?iVqk=no JAϚus8l&`&`&`@K#V?kmKu/(Y=FϚZ MS^O\5kq9bl^Sj "# MR;lӽ7"00086u[P5i-n20003Hଈw|7008nU|s00000000000000000008{? nԱIENDB`davmail-6.3.0/src/site/resources/images/osxIcal2.png0100644 0000000 0000000 00000101271 12564151555 021103 0ustar000000000 0000000 PNG  IHDRl9IniCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx]$E r$% Y2T **""Q% $A % w{if^ݽ]og^^}wʹ"@D`@JWl8-V!=?}7W:n~%}g+| S/8böya-ۖ8<' G$y:cDIj*2(1t #J$co#> B N+j$4XQS(O3]4̕1v؏ 0oI04#q:|DG W? 퀂L.V^&c5:,I"N>'(X"~3VW$&qceO6uf2 餢 :m=3aZf(ox 36LUgΛ?]6|he i [ Tqxݤ 9Ĝт| ?M? H`1菵, Vua'0kⴌ(% J#8MaC2 M)N'L&F8C@L`m t6ER'VĎ.'V D!Q_ٹ¹Cg,VHj!C>VN:Ff[x I|H#O ʢ(b(ꆏl}E*?*Jrn?sELH(/a (@(⧀@Ǣ4YNpp$%5'rb7){ .r|g8W,9nbB{xoEӴͣq|]M}*}m-BVnĉO|qTY>6xMT_)'-IH;6te(b}wl @#&"t ܣ>*_h%%#ES !cO{ ~K,[y]gggD*>.ٹ z|z~Ƨ/Ok4>O|y~:^'|zZ<9Ok5_Χi|:^|SLqo >p/7-)a; ڱIX'7ִ(O0b*~rYȺ;*"0!@nk-Qb[ eHOxX f?ʷ0~ܣ."0 @n/;>#X%`!^T>f\L"Ooܒ6Yf85Xs\wо_Wmz(i+>c?l^3af~(Tp.[isy%G{?=䓣Ef(gp1=?+}S;m[T33_Cfxm$<+<ȁ{k{go)na%~7_r%m >䭭տ)T037|[qu Dfw0mt:MQɠ:)X[w;m2"q f%~pu֩k^}su׿ީOi|mY>{OWܮڅWz^{ힻロ:6`n?鞿/%XO>YޑC|{^'7n\y0a9SO_f=/b+ŝymO/`'1f_ #9yD :E}ɓ>;ոSN9EQ?~jF9$_{}pXDCꫯZ-n i]wG?*oS7[z(@D قt;+]a"2&Fr?i-lC/[ .5䥗^NHW|Kz￿TB\dEjwuW} bkV{߻&T@wL.tMPn/H+Mo|d?z@B5a_\_.\p ^yWJBxއ~* ZF qqrַ$ oG!h;蠃$ ms{r~s1鰀9=_p#YΏc=\G fXrQ ?n%tWw5׸{}b "`7SiPp2@ SC24OAKfgYƌ#q_}",vq>ooX}}}$>#̮T*I;(d&~`W`}W~6 W|mMz7n![WbJoC;C-R=:Uʾҥ(#g9,nnwf!"KRW/2 23_T~׭jnVp4i$qWe8 Qug?+fmqŅm",܆ 1uEi=Vn,B ʻ!{r{K2ǖ]4.,yHʻvۍ WD@H뺝!ټmzȳZ', fhPҴ0vʇ[No,RK=yP^i IReiT s!)Ғv Mچd'F?IXeQN?x*Ic"jk7z6K$:jXhn-WTG8+oV- P0}W)p/}4B1I4ߔPa,x]!O"&B̗_~lpFIwbUF>}(V22MgFہ$ ׎htSfY&bg^؎-Rs?&u]gwrKvi.<0+|ŃXO~=xxك|M&PtrHȿiX^č:AOnT K Hy.G.la]vM F\ 8uYWU>mKҢōg$x(B[BXm#/e{G}u}r-]vYK}]-"4V);5 D$ > cqx?UFgm5yZl(?Ջ٬cR~Φp|'g-b{gyMqQXxucy6(GgiQ$IލwIF -l*|`4KCv2g"g(| kƥKT‹ 'y>_Ѫda#rl&c56&_@ tyiϽV+i#Rd0RO)d 瞹@~:/D}PP}xG[1h0VЇ>!əZ2Rccx.GsF3LS<¶M:$@$#[7Wu>8زO)˖ ^B[lk_l쁀ᥖ/䪾G}%o!ZzӉ|'?W54-?rD|{?Kg,1nE O7^g *o/`qu :^5|\GpALf_lIXrbƱyNkzZtuƧ5_ΟΓtyrΟ|y~::ONך/OO_iϰOZa5\r [2XK\(B(߸bc&`??8!,c2DŽI"liqtQ>JhuƆ'Qw_Ą.Ο| =adD"l-g&{BkQ>saDKB;W\a& G!( QX&Nˉ dr0XE?=?Wny2sĶU,l_a ̕K{"--k~%lPt9 nsof MtعDI¦D`o=c#s*?;:K["k:xGy`vV1R=y)###Zwa۱Y-M-q&royW_xqcUmsLsώqD;쳛gDB{WG,&3Ho5|r^gGcwԗ+a'X)rX4B4^uʣ]1~i(W_ew(H{ \.JU:(lݰsH8*YK/8 =n„ {9??y)rv;;sx/J" 3n :`|A!Ec=#rfs)]v}zJ,R /m910~mm4:m,Org|erኮ%ˢ6a댖 yKr%-Q˽ &d3I+cRXE&&+xJUX['nR;ʰ(=,~u?΂-RUXeXu袋iLYAH;I e=?4_UbG˘m!$馛Uve!B@ Viwwn e]q/md|a8ZI?@5./mF$O597-%\REy  `wׇc$NnwluHI~Yq!?#d9)AhZ j%\}C<mKkLY ɊO }Rǰֶ2i*Y@jL`"^'4͟$K8w6,2'$\2-a^L4UAn90{ږhM*[ctOɫiBn6C{Cjq .U',yZc>ev/;iK~M/lzG3ϸW^yEiE |`0ٰcno>表6h´7b Id B-/JV? K. &0{\Hw:`qw ṅO#/дtL| efI:d4lelXظ* RM14R%ЯFLZzcǎ{vnܢ)3 kEMڷ~X]5>DZndn$0m}9累#,3Ϝre>SO=.r~mz1?;ԭ\#)HVs6`{ؗ2Ti6kmխ=l[.[n9Ďm?A֓}W*⊥"{ЬV;f~>m#_( ga#=ql%@b&'5ViH֦~IÂ>%Oΐ4dBA5n~8^҅?d=M+%Iy$ʴi%kVCet20ٽ%!ɚEJd8}Y3mZȚr¬uu)i?.>Z4|ev,Ș6$q6/38IQ ;q6/Fʐf/ ."0Һ>= 4o8yMK-{I?/Ί 0ʊ%adY.Yyb\DNg9uGL[`Y$POޥQ{>XpV}1OEH:gaR 97brgK,l_#ذtL;n ~x[EKcVL3y|rnXl`XplUH{l|y"Nt$d2%L|N/ꏙ'q4K.a*!mf M|71&S QXKԟ? a³cU IDAT!xW_.1C R6`ؼ dF|pO`'7՗J bj hX zQ>10? Q,?C?uDWJ؁L|։"^\JZEy k7Y}I0k>&[jEv6y63Kk0 vőhuInuG6M0= 6kۮBpDn8֗G7ϓEӿm$#s |A?1Q^ HRȭO LP|z:'YM#s4yVNff H["M=2fA6$q6/38IQ 4ZX;:ӿp{EҨCRVu99fl((+NI>[p.Q؃ܞ5\$Nx׬Yn zd p#s8-3-_/m:'tD633zO=TGI'u fӂ?dя-n3JV>of-mv믿~O#;WI^/~O^D~=8}B{hhHS?pt,n“K/TixR;OSƒ 6ؠK.i)=8@~K<wwqdV>ks>]^<OMkVY./>ڔU~;rvH"8fY& mՂ?:iBъ}Wܱ +P袋@Il7tJ >яVA轗^zd?yN;'y<'<%* |뭷8{73j<SOXwu+<@O>Ȓt^{x=Pw7^y$һǓ}w~=*}5ZhCRK-宺ꪐW\)'cayσnm<3x}.A[lܸqܳ>b/V[mD|^` D<)e/K;S /x w1DŽ?MpXp'|S(/[O"讽Z ҽ;'t/⁝;3$_MC| D*jm%[a*) ;i:g0ᖗVYgտ;Tdlatz衝&y+樂d'=sErުc{3~&l2 Tb-aV|孶 %C,`5G njc鉿E+Z-muyar .X`i1#\-_*6O:"'会 y_K,fǔ8L="/l&OoW mI,V]uisx}|}򓟬?Oo|ݯtA]K.dU9<+~-,Ţ=-ܲ+Ov[ոWw$t^#98%8ZÂ-`Eaa 0/vw}A7[Dpu`p'W; )KVaя4!̜иV/m[^˙Fጟq->Xtsibi"ng˃\Az{'I2 ma@C_}^­SaM@Aoy8/{#tN8aorý}هOj.^x/\e[n ,^<'II%,U,"C?ȭ죷x}׺<>๓'Y?lҞc'a['mZ>hld<֝@@6"7Cp^m9Śc? R=㙇nD8ō \Xqli#Lywϱž?;f!PG/>%6<8cm7A6.ʟ.oORZ㭷:g^ۿ"YP_%TƏwE&fg#,/$8K^|⇁j\@0 Ԣ0IcfvH}1kv6NQØ:NOdJkeyΤYjEB@{)Ǘ0u(DV&>[V@ Dy26>!)eO.lpJ$q'c //I\@ Dy26>!/Ng1Z.c֖/6.,lKl Ѽ k*+MQ~qIpzLbOM#4 ՟}Ccv/[\[`K}HJUL|#~ ]'I?s7@ )EMDIgI"ol^fq6/3i`t#G}4?h!4a3(/(KiR>ާG_N!b.#bx 70WĈ_sM`VEd"'0/`2͜?ڟGL֙&O#Sa蟎BaKI%$iL|M8Q?qDH( M%v962B4^uO L+Hԟĝ)Q놪?ԯLr+U.%v-[Ӣ<! _c2'e<;1^F@-3~lX䏄6jAp|,Tx2J(Rȸ(?2i.>~U`$_|?RtmÄQȨ}ڎ?-Æ;v~C8Oy7ËG?"C"p`[ ?_03 s~(^ىƅ*t\9u6]# wy= T3o-,C*{キ>*?" ^SjNkG8E98$'G?3 ~ITpy=˛eg;bufի50M& ubn_uH2QT$35 1 C`%q8KdP9,8!Ƴ'yF$C pZ:Ӄ;y@n^ԧ>5sic:(qpp7dXZozp{UW]B w69y6[oL̮yM[+ojl a2=k&b-V;:aO;<Șa%uiBe嗷cf 3opua 2!#(Yu]g2j ;KRWaq .5R/Sy]8^E㐩?>)灰҈rGҌfIKQ>*͛UfgTC>wIF%oo;:V_} L`xp3n8o$ֺt_<ȭ3 I |_Pq}x0J YɂT*x(9a`1вŖ=N9vG]⋹԰(8mV̏FKwGoK-T'.z6+ltU2nrˡ[V_! ?(-FTZįHaz%F wCSc^|lAq^o @g͊K `daY@܏'$Rx]]vZ+,”͔~ˍ?^eu*waY ZggEc!)]|T j3}œ|أwi3v0 2G~oj'GSxƎ?z>QiPp 2\d9*(I Ҕ,Q~G&n3- 5*Y'g^C? QFAa4qHuj4 S_ @Eh$f,[F _J(!}!fԿq{ f5j@(Ĭ\b5iZp'R"OO'EQ_l?Wh zV_.O[RIępQ\DW ;WLM K!_/:'&$O>s<": r+EVص`M@$W'?[L?A,u<|oPHGyA $,8"d.LyT[ X+!; yKZ:юqi,`)ۆϟPτľPgb\2Flu&ԟ1꒽N/ ʞTol?a G!y!@&Nˉ~.ޠs܁۫rSz6V00d\J/v7Ra),VCa|V )cFKN:Sߗ.3ټg"=C,&ߔj o[qyݒ 4=^VSeDQM2#~?NS' ͉۹UnJM$"lYڐɤEis-m&mt4GR }+σ/y{3?8T?hZ1Zg Ȧ1MW)qFGVï St8Ӑ̱."0G!@KDy0%/t6p[+Tsn4ED;h3d+@3tNVH46/Ѳ$b '!͗HH'0jufEGydT6Ԃ(ݩ:tvn"}-gSU"GضkdX^홡^d_..%ڵ[d;K/<wߝXgy&Ow㨣j7n\ l؎mVe܎4KWg#m ];,r8?_n g?K}r8ܭ*SNs$R}kt믿G>»s;=C a<26h#{vmOoXb Cn 쭷/ s8qAvm%Lcu> v/a0דN:IN<9 η cV]uUM6_O?ď7'`ƶ/s (4Hdmݠk`/}K/+?µ0ߥZʭ;ލ@M;-;2 IDAT# 3 %3̂Қ H2(SueG J)ⶍӎiٚ6S9zvmK/U.+N8sϝr}MFt1jwuW/`ҧ? #ҪeIe L0#$Xm=C%| l0t衇\s5SxO ۅmP.LAh.DŽ|;ߑ>Ry3}9{=wX p,ܺӹI&IGB%{,- WJTDq -뮻&I8qs?Oܻ+׬t=9i7@g8v O6~Y}YH>–U XƱ$;]veK![yG} ?$=2iCZ(,8W^y^KH:6.Ń $JYi_:1יgGm'Y< !pZ-XCP*_.i?m+a+%DtkV &q"2(O `EWj2,S}S~Y &Mo,A2'sӲLֺ%G *1J"݅#i, M+-mNZVXA&)J rh}Қ<c]v%7O,f:X˸ۅиArVǽxOT*`ъEr^ve@y Ƕ_%1 HH?yNn%Q #%ls`t`w}e~bwłλabj4+ hr?'6cdHI  ƩqAޒ>h xpAr|vψ < 4f|h  v@()J00 ra`QŁۣN VMle)b) ^%ǭq8|M'CB") N!i~sqxY5\[~XhUlhC_Rך/Q۲נt + -2ZIH3Oh%\X3ґ$'|R+CVƮ*$9u;Z;S,"fBz> -mlՐT1,bU7:b. 56y SNncZ2e|Nj[%iEΖK?/'v?6}㝐:[ך/-$FZ5k֙HK]OwY,o%c-ߗ+BUYFʖ`u7U7̅{x;-,|puml# @ R]iY4Zx!<-, Oe>ng'1Gށp{cZǴHX(E3,ⲗL^m$#Z>:7oG?y|g%Ov*| v-Z$86Ěcýj1Miq|.=pbƻ5P9ܯqy5nqa]n\ٮE>a۹lmX1K/3S:h_~&O2^^%}EPVBV|glnm)e兇Zfŧ_(?@y;]ѭ"Z3B|G+ޞj6ZF$iNF5AK|hD+8hIO[o%3?$ZL˪'ۦ4G"TG y iu%B]#a1ӑ1VGW9^K6-zZna߆sl-t>xΒU|Pz5! qSOwӍ_bC[r{7Q\A\KZ3Q6">>J eR"n!kۙ)I$|maTFuZ?,11S=Y%ʲ~̆2Vʄ}"D0K5㕬Λple5X28!KA #Gcq w bq{[ i_ZJZ>,h<}şD&sOôs$f~;/UƏoLCG)B?.f=ɲ>'LvF4!#΂٢|ߓba;X؟Ih$\Jt1=jZP4mlKs諗Y| .: c|oyν][v ْ$K̈i56pOtȬPٸ(?BXf4~<ۮ_N*ՏmCE9g!|=rRY[t d^iHSR2g9Q𛷫>4o*^!\6V@-->ۘt8ʇ ?mn~Ƈ/W<=Chp+Q5aSV<k_-P:!;Ǭ¯.%ljq f~(/Y'MoO[PP[trm<*AZ_[T#l6>2?[^%m)r,=a]*w*ŁJjin^*>|Q>bg7]m-k5AO#l; kyԗK@ĵ2*c"G мָ֢("~Q1"]yS}QN\+ZbGDqɅ=NchTR}U/AstB.>\+1ǒiQDw\Qģss& tM:MJM >BTq7(`X䣼  Q[#qD8*yu!;IZ:юqi,`)Fϟ: 6|b=Q6̆g~<݅,,)=0yUfYM{G?V[ġE_gگm2N)At<|Lc8q:S<O ~ޖ$&1z(*(H7dd+q̚Oy<)Q [?ϼa[l<|`EB Mڏ_ /OcqlT?y ΐ$XS$~1<<`̓n/u,m8|e?U:_ƒ<,r|>xObp ,F? 2F#SZQ뙡?;dfz $Dy2iys(63 ?3ɚg$d6aON ]z}Ͱt 8߲GlGm4͊qSG#nk?<NgUZYfC8ٞQ_ii?ϔDB*~Sg>w͖WIq_=,"n$yf2} 7u^ΠoYݔh IeM?O)-Jz8}~@aL9'%Ɵ'΍6ڨ'[o-z=8'g_zYz yFوsNɍqn}ÑW` y'5_RBkX |p'gs2#G.؍>;Xm9HĩŶH:pvdCMg_8v[؆dd{>Oy]hc gFr \;ȪJ_(c/{p`r7@]kz08-3 qvر"S1]kƳSN9g<ˮG} wH]!{ʰ. y)U1q/+.oY)Lqg"gy#g-#m} (+?gQp8z:}bl? WgX#=s?UZoaۂ*j  b%V?Z$c1<̖ch㶹"cL <pH 'Od.ہ3\BA<ګ*=[[^0i'@HEZX& -Ҟ{9IEw)=X|{ <<0fUܛ:/pt?&c~]5n}O>Ǒ^)'d J,!V\qA.#S2Oalg^łNq9|'^s"h,,lgFr!ij+u_W\k)*čgXھ%XBwaL4Ǡʛ7)/¶\*0M bv4Q# ?wև<Sp@japJ|;k)Ͻi$Y 0BpY%@Bv-q%?ꨣqV?3& @&b%p eXyo۝,bCHN$"i < }Ufpw7pQ.ԿN; 2,-mWW[l1`ªy_җ]p!b{5}!i1"`J$3-W"OYSd2/#@LIئ.jDzFTDzA^ӽ_\xC4$aAPt{~Ԉr\?gg߷StRAgT.6?Mè ӂlaL/*/"ѬƏd̰Z$a XO^D\Z_~?jYWU֚UW믿sϕz 3DʗQ%qBlפIz;,Xu4,"Z]ػB08,B%0&@k9_[7ÜgOOlAZhږ[n9򗿜Wo<- ,òpMOnIڰغaոqgNW2H:Y(BEao}CXX*#r~G2^jj\p; A+"2}a9h[Sm8ta%X]h x>ڂm=(Nf\o7뮃Ă[E\sM 2`~`F.CJ<Ї>Hm0ƹ,cs ]ui4?3vr~)?#O?WI |+$.s0eZ'xOt b uٸ(O IGhu%gTrNC@# ga3/8&L2T*(m=kr)1GY0p4&C ? !8adcDخ|L! yפQ>saDKw~F3 IDATBٹLC&VR`2qZNW S*12D#\40:gvSF?yPg8l͋(OEX?!O+;W8wl I-?l"ۙvYm365d),?7P*+.njGȚ+YqsQ0gMLdӄbR~Q>GgCݏGЍX@ E|A`_J)>=Gp 1@X̥`#`i;XjA'f5 %1%c4C? K-fNOav(I72DfM|70 Di`珲?ea)y -Z"1(_G)#M%v962B4^uO L+Hԟ}8 yDu\)a29Z'Vxr)kH/ɷu&@"tM?oέ#RNEKQ `9& A|( "~ 2O? Sl\*H% Cޒu#~u8 x/a'!(ҍI龞(߰"~Q'wk1O ;2_ -ظ(d"~a,VWl\ԟ?sQnKֳGDI}SG`Uwoki1շi k>MW_ϋOˋuy|G}Etz^(_G@Q_qQ?/>//~Qq5v|ϼ{7΁Oe54#.G̩2'2J\2Ǝ?q|&3 ) Sb$ fhuq6q6/ңfďZTwY'f?:gY6W 4 &*W.7+u?#Fԟ]j?7&sEB#63 xE ̗D>:|zE$[qb ,R^6ԃyV,gXZAW$1,c4C? kUm8юvB143}$̓A@c 0eJ(E G1dpw[}#lQ|D-Θ*eZ?qc&GTN8y) ͯz i2?C?uDWJ؁L|։"^\JZEy |Au: `~ :&VH})aå(c_y>oE'Ο̅)G6z.o$VVE!oIK]G::Q@?<y۰qG ZE F$_t_OoXU?a~;5攧φk}bsW֒X>̯4^^zibqJ.~Xpŧsˋ==ڲS]gՀ_O$lfMZh~^54ӝ 263 ҟAwW{믿~auq/3$tMZ*ȩj%I&s={ e]Hp:m2/ͅwve n[~E]ϼVb/3i9Iy} ^ǧtG?O@}|?6BY aďX7M9眎}kn-+1c}.<3f~$|gǽLh*0FAeG"DmLiDVǚ&?zk7pok]Fw;aZA%0Ș<(ettVެ8߹e͊@/$/g8 , d$#//>+oV܌ժnhj՚{ 'VZi~X$Z]wojOe]ee,z Ejup߈n%ypTk`X^.=vvcO*|3-=l;4@)Hyʌ0⧚-i?Y?kE W-lroeEVIW^q3gx|V Ɋqqo^PʮT+7Mk=miK (}w9Ҿn븡n7MKO_o{l]5{!WYf?~!uvvfgZz#Y,=WG" 2\t@\+!-GO 9D5y[l+>84::])Cs't޼S<z}YHL˫c$y/Iue,yVYeņ*nroooȀ?"^?=Jܔ& G]uSv JWޯ$5s0Nx?v}'y}x"Y 7D"3i3iQ<<®8dCf=SdM i?3T'r2_|qW.5HYچ{W#Gqwvz19lۀLMAD,.q !KQR%@g 9bd@2l1]{wg&{ӯuMwwaa_YU^Uׯ~]]=f"ӕW^)/P;1*btMtGoM^{--^nV1cvm'zwy'q\s(C˅0O?tKd \516G/s1~>Gx e2F۪O6M^:ڶ t͟TfV`cI7?;6=hy',[7ӣNUzs <&OMݽ25ܜ]1 Ա>1i;Ϗ4ww^m4e ^IH%6Ry?F6"NzMlsv,&%\\<7NÞh d l,/DLH7n(z'K[V}}}tR5k;$^_:JsC=D]v,,Y~Zpx ԛo.b: .k1#72YAǫuW]ҁ '6CjHILTy9ul4i4oo"u{__RǤ }q=ܽtҕNOJ!=*uӻNOYjs4C^60|PGwoooIgQJ&KUE:2B|" %~#o'Y:(֮5&$fX_!aƓOYc3j!_ vd,X>7dEZJnX޶m="qd_4v=_`?ǎdZgr/Uz]mJg:82 Yc,V4cTo:Mgg̤I=E^}k~r87N}Z=S@ݖN ۧ=6"Ke6^ct 75\#/$W^-$>A ! omNS+)BSNE CFǮm@Lc@sF,#%7żXǎzipTAL1=#+yMR鿦ǵE"Snמ}yٖgrU:N}wuv.&o􏺲5a9\2^8R ysokxԉо#54M[8NT%kQǶqFra᪍{$31՘w_!F}c2wMBրQ]X~sΑ[nBo?>l hܹN>]־&~W,"ص܎rۀ2'RxHliMC96%|X3ZmTǍ', ]H4ES64{6 =O]쪰RIvj4ˮ:;hW}J'r)7&uuS'L"5^i Aگc "|M0ts0Iz c}%\Ҹ ~@j`S$u} wW͞/+!*A)yF*Y^a-oQַyf!e˖E]D^x!=tgҺuG8@_6h9+޹A˗/?VX!K#gq]}t|hWy]2^a4^ /LN0-9oAۙjyR}Doxx87ms~Լc$ꌯB6E%v`t,`Rґs+ ҋ;~9;8?V+R5Nm>o0?/;Lکc=k[ۓzQQ> kfT|ySwU*=@ 3Yٱ$@yom^wΟ?9?;IY;x<#ұ8V, 8 %P45`e?[}=݃e%^N[eIz>P0-"yrc흜?lXqAf}FЁ,{@ӎ Vܿ}cU=] aB[y-Ph [ɐ| 24t?իWw}s=[J|Ab|}x(_6'^? fI~oD0x<wdisx_>~ԉwת27alմu;_ZNa3@ήIP8HyKuf|4WVXy)^2?yƱ킼|wGO%s&:}GvlݺaȪ4S_7MܤFLjuƫ+?m5 QgOG:[@>i.Ŕi[<9~,7ğcp|Ɨjҿ>P8Q-Ԩ:-+)>^t /OX.s%KIu`RɇO1BGڻM-YQ2C:!Öuj>w;&^PwQƇFXMߞ7}I]~ɹ`ﻞ+O9'urS+ Ym[:g2{\ qVYe_~0y8S*Cϗs7-\ k$߀ `"}bQYa엮??U3አWpጰ\[qi,SqhN #6`C ,i|t%`5? 6yGرa:M o@[v}E"ICt:h3:yM_ciiv0T!xb&Eަo״&>0;^wMΘco1n?>?3˟\*aX Aѐ4Ѽ.O:?CN9%@&ubEkK]:gD̝j#@Pl|dpwvTb@ \R1eX\,/u}Kyn?>2oLp$#,J yK]wڎ_FOE2ϟdv ^TC1>)K>^ϟ@ α>wagl~QC9[e8~a,6Dk+J^gw?J-iaC9:}Kuic) [ǰӗϟ=!شuA>ul=GT{JrIhyctbR #̄"BAb2eڎ+mr &n? |FO5\oHI dE[fUgˬ,l*MROa?&-V @p |e -XqD` B*22S'q2m&V nu o.'s\q/pD9!y50)i3E2Eu@:E6RT3 ?ḍ8)G~cUF>e6c^vggEFxG#x9~@!#|lP諰-x'IioV>)as>6$p2(a#.::VP$ST(:b?S3\ o)\ss!\y/F +k;1^q+F +kN2H[c]AƉBJژ10q^X{ 8Jcwb{piEbd}|QI[ׯq[Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxf5) +(W++vTPcE}-]l]}3|3{L6>%g>w$'I9((((((((((((((((((((((((((((((@cA1uZ_SR@@K`հs0 #+sCq|;|eH{m"eȯiM[䷶L Gp;2RZ _>~$ȠP$P$P$P$0|Jk>\rۡҟq^%\$P$P$P$0%NvhDC5P4)4;/I_WONr30Nl4E{5)I9^ŋEEEEEHNIsx[vK?XJ.\| ¥*ؔNiۥW    l 4ҧR8KrukR/㰭LqQ֖QEEEEgU|;q9)WŵRJc\V%b|.˥EEEEN T)T\ÒbХpUxȭR2DUyquaʴ4o qq<4rJ/c7NׅKwW%""v=nkX鉪OOU8W<Ǵ6_UĞ ^xï b|T>':\Iߙ%""N~J~~E b [x,-qVϏ%6۰Ö /7Ö.K +GWEEEE#S(˜*$X?aTc:wr,>/W4a_iӓFqmX4UnLᒾZpu"X^qȯZpuby&4U鉳@8jK^r)㰍~9r֊A¹8cc6:< |;P//mp~h{q#,W\-mpn'Tm9FmMqy <ιrE~E~pi?V}Pq% \6EmLSXsa,mSpZ~*jQINZT'mDG|ΟK[U%`SߙͫK)ϧ.r״?Ƀo]Vy6l D_˕\+"Bt ˅\Y<~(+ ,P#Thܒȯ_I>~刺T] abe/hMi,)7xIJbG/Ba\*}0Ec,n+rS-LKIߔ_[E~ڿi,p/u+!,[nҀaC *.?vTXigdGuy[o3&M%(((((L ,^o/oҗt/,Y]& >Z8Hsa] R8,M/ucv\C}O=˖-s+WJfbEEEEE/cǺ'K^vOؗ2?VIWaJJҁWXkqpt] Z2&l U\)z΅>3fQHHHHH`h$uuu=~޼y Z_AIPKq{T H'Z7r;UqbRxƯrI?V6`}/_N|"""""!:h/$HoIR'ZtDzT; -(l]rG~qn^I""""ᒀ_)—-݄P9ayo-YWSnB*&8hD'uP+,[b-n@@@@H`%E2/Oe1(UpFJ:n3WLpTQ1ˏ+2;G|F~BKE)JՙDGOM瘱x 鈳p @@@@@K#E+?<::OQ0q@JK߮BOdqHAJ@-?.+ ((((`]@kNlg^@NJ4wPUhOS.,K-(((f PXQLE'\ps  P*7N.tM% ŵܢ]"""" &X"Ճ.;4(st? "5U0Qq!%%e((((+'Nt:q\~B3~±}KK*@W\)hK_zS>@mA; ]n\uav\\Yr[EEEE$|([Z^[ Vc6q1@x$u @4rE0.ǵpnYr8[$P$P$P$0zKH⤨O>U[Y?>PZPW ‘F~'|PӁ[:b(P$P$P$P$0$ %VkġJŮU'oLM oih hS"""" tIJY E.NtZq-0b& ݐ qbVx@-_W EEEE#AOEW̺j]J0 'Bd"F,N*Ǖp{R    `Dz8~)g>d[SR}*E!S.8ކCa38EEEEE- /;+޺趘&VC)t2KcSV\xxJǝ~>@@@@@J`7z ƣI ̽ ZS@TOT XPRNʯtSz@@@@pI@X0~xVS' )Xȃ0 W~хD?[^     WrVX*,&rD 咸)`1J8QZ1KX\Q"""""ᖀtSJ)m| /\}Ы2L(fH}hSʵq1.C+QW~ge@@@@pJ@IJa$^-((((J hrjutq[rcl:sm>:*qo8腯Ot-((((j b*7Wy~ Uql91dD     F0tγy@wۮUm'^͈eFiQS9cmX:S˰[m4Ǖߦ['(.r|[oszȭ׳sQ]ǹs纍7޸̙3ǁ'>ydtm(^L5()] /tկҥKRH{馛K褖nzJXqԔ6+l ur5*4fq $#X7a5nn7fJ5~7}7]}_?S?9կM7}_vx[l}y… ݮR~v!ȳD  ˈ81.>Sm*t1NV:eg8MzZ3޹w+F ,vm'=yLkuַ?nw?لs0ӷr+{CYx3I'/w{G>*㕯|e >``+ ~?~y oxCc^׺owBs.կ~ 2 f1?qЇ{3"_^:xZywqn޼yA^yWȨ2fm>~߶/P_G}tP_ C|;٪կFfo|N;7{ғdky܎;~GC|Y?P71ڃ[n ~ -Nм/unmHo߽h@_┦-*#&HoX Q.=չq*Lrw[(M5cƌ Qp?ORԧ>%nXr&Lp(I/BtuuM6ҹ3x`(dxx=\w)+>Yx@m{0(|Lovw 'Cw!dg@ĀN̙3C~^z{ի^&NoS#<5@W_1h>}zJP[o5A]zk{Cw]nҤIaPĀ/~;ݞ{ַB+Vp/ݟ'~ֽE/ 3Kk ?p(i$/}K7BAmL_^8~ZDJXIT­ ]Ǯ-( +Nq3vOiw֘ƏW3{~Vt(F::}fy{,Q tO?=($š08xֳ?Giu `w%8J~c9H,`&K:wܰ騯ԩ#>O .<1!l;?O>9PvaAis1aNm-VX@Z[xUp7VyJ'WwwJL e@*կ黦m~_t(vA& _B2@P dY]zS;xre/{Yxy_,0c},2]Ͳb+ K _Vt45rQ΢BTL[Z#\Ѯuc&UxćVL3.3e3 ̞`v ^2?=(:#Q2f̘ctby?Y`& t,2Re9m-Z`f00ld&?ro l(:a (pmRV8=G̸-LS6|l5\kiӂh=6%oL(uy\tlڒoM.SL ~l{Ӗpb"O1M*6*7N{GwKoqod {TvѢE3fr%`ŅDz0o{rYfϞ kJ Z)ڇzh-EfKrLu} uww,(>Y!@Q2kXJX:S7ldvȅ JYg!f`%V~ӟP뀕1)x 8W`@$_gw@+tJ2ٴScn\=;pVuعwFtE#4 gkrڝ࣎:*,el)"{Z| ,w_%f\4뭷{_%k+Sa0Ydٔ` ^[lN/tVK>L'oOiECeS ^-K 2򖷄CwʅZϼfx}s[:xJ\` =؞`Z~J?﷊\@k7 ARv/7EZE0Xc;Ü|V S`@$`uZJ:b /2_ Ǟ=~= ܝ2<zϊܬ{tSgwxL)vnwfR5L3UX v `OÜ"gy <@9-Iq:vQZ^Oe%Cl7X`ˁצeRy  SoH߁z6OS Wmw!VX4جJ8AUVK5aҕ.4zg50~cGg#sԏKALKu8-2 & P.}nWUc7{3}9|&erIڻX IDAT)/ c'J/_UCgo@]Y> -H.m4Y9v eN"qy%?j=D.ɞ?]reN86.$4Nic7>U=Nv(0ւK9.ι870RMx<5^Lvz|u8fi- nGAmtq[rcT?18]pc[_%w.8m8= W:,pi{Ywn;+R]n_Y_@@Ȗ_ɛ.k]ZVǵ(pɏz<_0 q8 b?>C3'*sjij?XSq~߯4Y:)P$P$P$0$`uJa4_a z`-qz7[x2ٟ Vmw-G0/Xlx?ݵdCӖOV'Ԥ9 Wy‹.Np[@(\)a>7j+vSfv.QvT(HBSr] ZzZb[$P$P$0TP\W~j? ]̫bbJxqhFG~N_6t*]+/p }E]XJB/wjs ̣] 9Y`!g tMICgn]wu\VŹD=wIBcX8.wԅW<-;WښzoruŸb܆0_eò*V l-`9+km|SMm c@wRP9s渧=i c.2d eoq|!SVuH;ZZ28Z"ZN| ,;^>mw,Rx#/[6)?E-z3sߪ Mwߩj`._#GY)MW[U9FlA9?LƋNq#m'&ا|jOv~1ȵ1͕ܡԅa *PpG(\/7)XbAԒ;.Lrk<ܑ pM*v1pguL{ѹSȇk3{ _3E. )op*yaʓͦSem[vY99kHYReߡS\4A^(._ =6t04U)#^+US|WIg\|l H{I'2U B ^x[".W& +ƅ2ܦ(ʷmI^=Vk>pkBWƱk 'S܈s[E~v>^07l.徣_~u^c|i#wiF,amV(Sm(t*Z_җ=ւ~aiY;(W̦~ Y!0暖@&&"B/yK~٠1/ 0/$-+oWbc+Q*:4 >l?# ,Q3<=q ɪ*Wˢc`pccVm 䈡?QdppC`޼y@l+AU{Tz;*)$Ƈ/-n̨?(m5:Q!ϙ3'1(.2 $t: TZ?>*ЖbJL-rmT|gMG*bV8j7e._jdi?̝ЕzdS-ňKR OVP*tΝpX.p9_r%Ï(|+_ Ӭ ňsd. vfr9ʝ Ӵ,2Ĉcplu|U,b ް`LٷV,rªάyX:W\>wUBVȞ-.0`SedR2_d0h[0+n[H-8.SP 1#)ژ&*#Ii N1n6ǐO]u7nӦX+sU_I3ykѯ,ūeS:.YJdU8yfRa)Rt,cČr'pBHʲ%eup,Y;II p < PR $l`Nn1;b &7- ;EeS,xS,p0Ozuͷ=;VI mM ȱVQx?9: LCE*Q>R8+&Zۂa.e8i4ff'CUv)Έ_’zw*7:;KgCSR:C"+f42#CA9@,С91F18 ?Y): kM7 + Qco`DG9:R^!@ssoNn#rFBo7,(F^p1XX3gNP^,7Hq k]Œ"|mMkO:jl0af`: >P U%uPڜ/ai&PU#? +I괔sUU*Ԅ&vH]/24;KG PQ,/oXeҦrgi0o.ЙJGF\(,:Jf)0<9ꨣ^/KtD@#8"(,:`̸~bH{.Yp-%~~~ǻƔ_bwgr^٦駟Rvf;+&P՞j%VkV8 A0^:|Ot#DV+pH m8֑Uq3g3U&?2C:m]zD|j,Xkk³7n׹qv>\yg[@?_ioRkF@[n?w D N ,`T'ŐNLNrxw$ìofgg.3H*Ň"Nn).o|>kveo E-| qbj)ԵTյI3]l^6%D{ⰧdJcir2si ^ %WޜV+?ԣt H;GX~-<|Pxd$u"n xG@cR4rsCogxF "'W::~Kw"U_6EU|A+nf1Ò@ACӺɭi>)zwM9e+#GRO)21uruu` 8.%&*3K #NzKn4q [>:^x2Y&Y -HhvNm-Aa흝Sk[sc63vo?ս=vR9 NA<K!"o}ѭOiqkX|ڡ_kǶT<qS xOѧC7`eR7}7ݸ~v^űp9B_3}fn 빧vf Ŏ&p%,O&O}{SiZyc%LqKzvwŸ{?M6_3     t&ۃMm(^U*&-m'{^ښ8V\:~ ճqƬp,Mx{Inѽ3fV.\g3ō7֍3֭jeB7&7]u*)6 HHHHԛgq|'SqzniG1[ZO27ٹ;`vnkL3!Z[Wz`{in1W~m\W$c3vLy?fحq!3(>zzܢُu]㖱NZYX;uMDw-^&̚z|oEs(((( G3S>'Izr@z|*20x)n~61~yxRdb ƍq7_wݾ^Y}ZۦP^9wM&̞qe1홛Vnwzo b6C_@@@@HqV7T)\.3K '7vDOa|;olGKt?߻(a6=w"XtO )0bϾW,NBa,Ɔ3> }W=nqK6]W\+:@RW\‰>v6]rW%lA)\prm#gv>ZƮ/:\u0n7֛1]?Kvw/;oAz^_}_Iv+^,x|qcV,s]g3{܁3g/ފHHHHS z8.S&8ы8,|Vq}ܦ Oe<\ ˮ\_rw>m rW A;͍\tY:/d07nw+>SOO8uMeYlfn;? V,Ijŵֲ|ڗm.)5khn M1WW6~HA!.MwQoyu$ŕ[t\Շ87cgUEn=C+_vKܔM6v{%~7C:eM&{=fflg|*:(p »ᄏkݓxbAa'?{< e׿;r=I]l?J/v緛SbNFr7P =\qJ5ɥ7N{nC^ +H2V?>ٖMZ>]ӟY6n·zK7E9sYL8;<~ތ$.ݥ^6h ;昿d7禛nl?r)B/-ӯuq;Wmp~rY^O{`(o|bђolX@ N8TÀes49+3 Qs{nc{;KguhUn^Z?k#&5o~`'y.0s9n=P3S> am ^?lY.B'=)Gm^o{B=CG F:a֚ 'GQZ*tkK'Fn)\! Wy(KAs[麦~n>(n{Xηu]|mݾeNٱ2OҺ1+F^p~ '-뮮qn$~򔧸;h`v~*¥-t/~ܹs>VT.3L=iOs'tR[yw n`Ml޼y!ޯ}[r{g>% _qgu{s[K_P}bĿot?Exe`yog  ~dؽ op|p.BzիhW] }}_ ?Øk7dzꩧW򕡜 V~緕/%j?0 >ꨣ…R x20[?LU n;*'?0l/&/yoЇZ19yV{;BWVi3zֳk^V6)ox{_װG[Z?-yG U8-1U-m.SM  (e iҫDR7mñrSWE[;{= ,3n6oT%'xbK+6X?{6x〳OtW]uE; % m7{ױJ;<ʏեW_}uX$ v>O|YQ?ϟty{N|0dACgao3J3Iew_A `pB9?)  7?yyCebt `)ȵ\}XAᝣ/"7}lBԉ% j=zqQ9(>ޤcoOOnEB(XmG?뮻BTNJ'6Tin͒GJfَzc>蛀[oS[@e׽@<|zKoɵi:u!N7$f0* q!:VΧ ׅqvhv_%޿a}DŽu3?Dʎg,qH믿>568f8yʮQCp 1N?m_>NV2,$֥}:r_Ύ<阘a0#:ftr|뀎mʠ,Q׿ZIK à. JIys &09Vcs0#J1(nVkRBfmuÖL9Pq㸳WwG/8B1Йk d\/~ri!2!~S)@9Jm' 45T%J :wק?~ gS6U>m#>nHRX.Y4OK5z g3-9-%No#fvnniNz&QS^+:-2tp,cmAǨY 0q A5ζnp1Ε[l|E/j)l' IDATtե'- kpwm0+aٳ(6p)XG &LZˋΎ-f^{mPг@C,8J±{b^Cök?u~1Xh U!N[A\ffpZoGS:wWVXaFohNfE3iҚHT*qRXŤY|n tYR9~5]٭Pw뭷UVT*t(t)kJӑ[US^cv/Zv%9Nek%˂MA4M -+Yz;{w*q@'JǬ `@f4M=aɟ}NeJ8T}C/,_yM 4,e~8y3Kff{:H'-2мQ'N hf˙Xb5A[)UWC ֑1`fl-wvmΏ{9lN[]潰-@/A.o9]^SyULL O8Ͱtc4;pY9gw_u-`4>_zkD̔c>hr2#^/|a,JyW~aYc7xq@ =i3t1+쩳(\VGG\`m.C'k0Ò1PHlSD@c0;^ ,pX@I1cO?>ț=n79v W 4ep`=0sO}So آ0{F#HcfN[Ds" '3~NlqЖɃՓ*]fLt7 ^ڌ /2~Nx ׹;%Oy!yOr7orF Ϋ}D~n=VC:Y ʃNewRnWK.sK-#M~p^ ,2;d0 CŊI\s(Po u\aie'ug U%VK3 dM~Tʬ[Ax`7m;b,smY,̘1#.m; WuĐ4 mDz\ފ*8~/ZK+x=)GZqPhoi:Ʈ\vwJ+?eOtn{W7OM~k$β@HwgYl,nf/ .<]׾?0cJZcnjt8vi~dAI剁s'ʜ|lXqzI4oݦʧ*;ɏR!? O 7Q%e:@/M TiZ/[C//,ɯ4MܵW[,\ElQ<`76Z5염oz?G ] nl䮾@?,_ivfv<˖|^W~s{C';U=.mkBىEEBJ1mWo Ze7Udn#v G8k17U7q.Xm~B\3ؑBKUUaE(pzݞp*ri`Ϛ7JܭO.rkٝm{pnMqe@@@@@[W*qԳ=}HӤ1mSJ.WpV86awMn:ͺn^X"S8p*7a#,>j_BL0M4MTN?ˁ~˗/uK=&]6X7Ogm{̎mɱ)t Έa=l? R';eaH9,ֹK{]Uʗ~ͫ{챭ȹß: } & kshnI1WW6~@(s~(titWQδ~nn)̺^Ϙu=0JK{OB|馛;,w|\)INrO4rT|>cJ۸Mhri;£ЙC'K{iuK0ӧOsy?nrfbsw\iO\8=׌EܞH@o, .. W CR֙R(SE7WU͸AlAKxUO FV׽u ,+Q>vY`9 A)rn;#I,A[ܱ%(\Kq=tXY.ށC ؙ%6YJY*K#e,rTTUm]%Cр h,|bHk-Y/_eP3JC>C7ք+udU\ǵts!s1MNCjά-YfC5C»[vnƴWn/7fM33XŪFJP@b΅Ώ·Μ[dz&V\bg~A)B,^Ptr&9)c`>,1[f;1[oug +S be+e@H} OL:>Pr\u5fAi3Sd@BMI{tvt\ĠA[ kd\E1[xxX~|8?U@p_ o}㝱w/PPwQnO2p 2F`9|a?zp2r"l^ur d(Umfu >:oB1@)yk+b)ަ=q{ U@A!@nQU~C7֔>C]XY6˥t:N!e¥rL*KwQ(s`|#ـȐ r|xy1OܣV֙<0I *.{:~:y^ֺ '4pi@Qґieba9 )e:@nâSWcK*J{ɃvA,rt@Fl56Cko)eBɂYP"Ҽ\J8޳oYbsK'+_YK}6WZ&VMqg[?usMryzPd_Jm$gw?GڦBVǀb{6ϔƚgqU8-1;&\zK_ЫQ&1$k*,x yl,yYYEa=Jv5fa6fj J%L@<3{ R2#S򡾩A2Sgf̽ԧY&Gcp=3ԍ]CAbY]@oJ/7âr5Ȁ&>UOUre9syr]Z`A_;>gNrYbp̶ 8o5@'>Okc9KtU ޒkXo>ܽ^i]|\`&* q‘ϔ3݃U%ŀ@Xޓu3 XgV"Ka, ?Qb'>L:FYZ,?%o9dAG ,BƉ :owZN$JգY,{Y'r&=hr<#'* ,eЩ5Bf) |6V|pցmmcFYm?R:wKqA[]FQRX.46W'mܘ8l+[6 ,(ʌ$e݌|YG3m ,zQr>6u8 !Na/ K ÂbWJVt45r*T%R\V '7%]SI&t|T`m pJy{f4\ɽNZ'h'Ʋߺ|>9r >;d׿5|V {g*GyX0iRT^m6U誄-01NͻD(t ,3+ F[thpͧg\x#~>χj+pp9_=Sn)ژ&*db.KdP(!7͛7/̀9Ѭ`vꩧR`K$2q)eSc (C9#ڹl@@.Lm$,jAK.n:#pCW+gCP۽ ơ0Ė2zU%: ^kZ\vC>)H*\ ifYy]w HE}ضko)`̎y'#,x!ǔ/`GZ%DUeo]_s }C,]ve:bW{ 7mU!f|u0ʓ6 ^]eȕ7"'ǽ̖Y=2tϊd 0 d`dԂ,|ȷL-0@c=@Jqu/Vr<֑z'r'O m E cYYˆ8m*̠A4oPܛϕ.0ʠB&R<JwbgY%.fB,sq!6*P8^!@q4#a3V؛LY/˕OG¬?Y#G(?>%,jWzY|f$T?gb5Hqj}nꀥXs=JUPDXbI}ue;Axwne̜eaPlvX_oӉ+Ybɘn7!ND(C=4(%0[7*{.cO\{䯲ҖV7Ki l-Ue80{Qao}[Cv_wȴ&KzKMcu*}]+>.pů T?,C7~u\.Y`F0a4eA:(%єo P6t419(pP}K4(u8feS?a ՁQfZ";jYeidMŬ:W-[}b /-~C MP_ 9[fb]:~ԩn{%׆YA~coMQ\pY0b (+C,:<~\hp-NazR Jy[prQ_J\ 8֏":t) Ȓ^ˍ)`&^# $: *q_J\< W]J\]Udk+t`(toEW"+>O3_f"+P$P$I@b-˫q<U$fZxʍoḢDԥ"᐀_qVb&B*T6MqFyC1.'Ny#H;ZZ]$amp,?43.ﴮyik,0"$Pl88i*} =Lj-( x1)#Tp>q9clc IDATܓMX>g;.Rk]FɯW} Xh-S=>A3Ca>xG[':٘1݁)4mt# bb4}n:COe­UjUK[@,cc9ܗ4}?cQGnmOv+n^4.dEyX'EX32:iv\gd,X.UQtpIx'B\^wq{ #OY ?t1ȒA\rZ5,JY=Y,o4;1[BVv##Cy,;:VG>UZKYK{m7J\s+8R +Ux0iRT^m6U誄-01NͻGg%(SYgboJo:GA A, YZb] =Ps 7*+:pֺM74BȊ`ōP0(f g ,D\Qfj+` ` ."%:@a嬞,ʝȏZЃWR.'Y0ܡC^ %VWU1!r]ݫ\`m`1/-Ц-a@JoIqqS8+iBBO&N m)RD6m.B hflf0{3TQ\:bEZfu[+T͛Z?q#倲ȋeuv,T b{ƱT&XBI1`ƌ6eF #󁰆Ue,e,+,й fĂ\\]Vb>s>Ci3`cPJùRS+?JBL\-qM?>)"l\lIdzv1xJ0-iSVs7wMdrtˢ\[q, Rls%@$u2fAǨJ*Wpm-K>xf,;0|#.nabaaYgcZ@MyֹZiYU``4Y0QGf폳ɦqqVH#y֟z6^~!6۬e8^0d_i)Վ먒mE,#Uq67?L^{Z. X^0@a왍U־X)ߔrYڵծ5Vex sNh0`@v_]r@KYCNƖrq?ۖs>08`ɻK8y`z ʆcY1r9ːnj&G'2 p}pfK,WGΞ=NglOnU23ā6lǂbE'O0E&<`Ff?3nJf[ou蠹`;y1KgSN9%o8_lt6 icakw/ fXg6ʾK9ı$Y+/2!hZc!stXcʻkbbU Tsc!'r:'1g)B*h|` mCG@le7>Pԋ V=yp*4MU+?qto 18g/\pc8= (˹;>(zYˑ|[)ՠA9[`T 3\˥,ZgsNñQ7ԅǯǣZ8fV+M;Ì˹J/(uc6St)e0iʇ]'`;8}JC魼ruʶeTfV!@#GU9yAFrquݡc``3gΜ]'&KzKMcu };af\i]<qhS xOѧCW`K%i폎Gvqǰb*.E_pZ 4_V4֏-]*ܖfM2Öߖq?%P7kU+ َTť H`b}ܜ:2.>`T(2+[$P$P$P$P$0^KtVuy5L.U11%<8N4-((((i+3Y\L$VRUbbq)n@@@@H_1o8>)tdiPKbEEEEE#Uuƫg4M\oW0Az/R8HHHHH`%0/UoS̀YR8HHHHH`8$Vt45r*T%R\V '7Fb)iq4)\*h*tUL ']EEEEE#U)%a)}\mLMz2qi N1% vhsy|@@@@PHϦ߁).W0J24%\$0{42pBݭ0e1Ayģ˵mmY9|[fi B1Wm\BMhri H`$qgu?WcѮLT1 Lxxʘl%P伇3θ][WoYJkK7;oFy{|Ρ b -8[@eNxS.zW&TkMfjZ)3;yqMRIa^{0:lϟ^xn6yl0{WO­l7wvm7:E=~`w] ݕxӸWbזjWY"<*&N+̥Ʈҡ#K= ŭ0p(_ gy)r=tw'{ǽus{-+K;, f)gO>c1G76o@2ij%}^GPDww}B=s~hj4{ҷRڽ[[+q[nR_:oH@|Ch㍼BFF$!l;%W˝p zGuT:wݲʽl-]P|^GF"..U+{|[gԹnmǹ{(u ?<YfvF.[jvѫ|^@txCV*k>|H`H$.K7t;cٳ]Ow[9fe ݷuIS_;كDk,}֬YwgܯYW9SO튥eMYo[Bw1$-2$;\O&ϚmrW0;TY=fX?YT-;-"f0[s~cKh"w>a^1̼5;dN@sKRV[mv[7w\7sr8=psL[Q"Ǐpg̜dwyy3fִ=|nLYƏ07 {x_~nRlhm.OM6<\=x=>7ll? r]ٷKA/>Nm!nx <ᡓbp.} b12+6.E'f{dMܮ/]M4W)}~wanyiǝ܍7N;47c > ^*rF@YhV_t ] }%A#ڝ~۳%~Oq=s3-Z0B"@BĢ#vx 5dž'{/~N08/ƖA6ٱ evĦYH-ﮮ9홑F:wιշ޾ݳh}]l/^y n;4^?./PkSϓ{OސGc=4^ȒA1!ߓ/(Ĝ?hpȆZTa[Fy{xfwd/Ʌ|L]h-ngٹ#1ö>r\zzhJ2g뤵wZZEӛW\qEÏ?]WpmIƍeQvM4\O>2a„5ew^hyE2tXim$KWo gad庍e>Û^;^))RWoe <& : sm2,\I8o*\fѻ~$FO}SN҃Զ~,o Z/nxGGCǏ*]7e+4fe⻫M5q ^ZМFPpp}wK[{ewdٲer-5\#UWU'o=8,&M9~ˊ+Y="MopF-{o}'/sߔ]v%@׵ˮnf`cGj /j:hnf+?3oį7J[tMWo*yenc? y5um2uyoBF|3#"kW0d9_\ߺ|<{2`]e__#{N<*M{osX@"'2奧W{\~9_1SONά1ANtS{9-ZAMZ} y䆯ן5+˨ɱ'~Nk,Rp,w_f8M)\E||`v:Ŭ~3뷘#] 46xR6Q e2lx1fhL1l_ghEqÆ +R~ƳUeƌ7|s.k{ ;>V[K|q^]b[adS }szB9;+n~Ț~3w(۟~˅'GoؗU+2Og)CG'o~)N5jÛ;?'xuܢyGw$ׯ1m+X#71YƬ_D//=c3ȳ./u="/̔Kn ;>Xi%}~a@i5٨i?iL|Bh1e$ܮ6BD9@sa)>^Z80~f&E z31pV\wiAp?_G)W]uUHNٳgG?~+袋䤓N!|l8K,@^pnFƧwO{]@M׿ /x:dʋwx1x٭mu8cdcZ̋g懞~1fB=bye?8iKY=@zs՜EseGea'K2r¡d+ҶrQ/o Ǒg}^Sao^+}Cw~!|_F!'JxYjI_ǜݑoacc'ة'[O'~s' fɀ{ N 6<}?Qͩԧ(j/n/߀:8N+:]DV~Ia l L,6oH4(4>6?,N͎`x9??Doc`}' v~G^ %/}KoXpl\QǚA3wؐiXr2i:æ%\_o 7AËE uXd~Ʋ"gԄ)q^R >4X4]G&qjQo scִL>p![ecO83Jo =γ)(C䅇fIϬm. w` wt b +ƜȸG]y{<4L>kzW/}7?c0?Po)+GO8'\-M&Kˈ2da2%^qm~'ΔxW5~XfSx(pKgڶpds7bTiFL Kj[U;'LaE(un׽=R4C;hh4Ŵ?2>~q_Qs[o /ˏ7.*ά6ց1.9nex΋oP3<-ZTc2g$ք 6]Ӳ*bpf?rj.˫bSg}C~P$}e2˩Uy[gﴇR˜pYz9klʞ'ɳlZn.Mr~eD~bNƹqڅ_ Whe}RY*\>ܵU|o>{o[+s.n~,UY1h}5忿z_bà2v䁛9-b8A e"zBޘ q _F ik]}Eedx T>n1}9:dxq:95C86H%e>kc9)v)DlCO'@=qjq),&Bps9 4]||Lј̻]r%~W:>|L:U&N(7?Go;ۇvs1q8kǼl\7?6m=ZN?{キL=q6/Fk&6ֵrʸPfn;r޲imŚJ3/x!9ݎ?b^7+ k/8Dgɬn 쿽U?^g猗??O.~ C眕3??@9Ϙߚgˉ/yr飢WϼP//Wn4OF9O?)brw<#h}9*̵~9:Sdͪ2#~G}qgVyǞ{Z\'#_>~jxgǕ.74k3% "1iš]XMeꕡ [,W,]$v,}o4t[_w|<]7>+//wR]sw/ąW6|qޜdk33O|n/4AƏm`AK 8lHKm(:9 S:,GRpr{:Ua'nl/R:p4u|;5IMrx|u?v͍#* q1>&%j@ gؘ7w{'w{ث9;J1`^)ew0?3'tG&0:'ɝ4xW77Hbw P{ ?8brYGNgꂛWQT#F&  Ћznq%ز-:3Yf9?۲;fs'|2~W*j|k7W'ࣆ1l14[B{I_('nkJa^: (G vY={#9Qm9z94'!|!FI x;Gvn]j'C|Lpo ~a 87Sw̞uǦ~Gī]xC;o dQ{ϱ}l{7!B, 3ݲ 9>?opɝw\@eunㅅv:Jh:HŸFg]}0^zu!^W|\Fճ)S1<}bΌK{^~xq_V?Joow1)wک+`T`Czڲ^9O?/Kx!w|TwJ_[:F)0ם3 p!ԭg3r[:K qڞn&}xz8/d t腛`_oW*5?\Vs=eGs`Pw]|>?O=~m 3fL뷘+ x=Q%8o 9n*֨&ԋi_Q<D.،+ x=]ݻ0++ɡ=XJ2Oʗ5tNlk[v'6dQ^s+ x[qlC~9]<Ɠ}:F C8$uYbJW+ xzlS)5ǡubĵyfzn '؈qZg#g%c( x^@OV}k͑uσOWCZ3 esZlZcd^W+ Ek78/7/ÛmM`qxRRcЭ]`7^W+Ѓ=6^1rzm%)5йhNA:mj_7oꐘ }A~`v}z?~uH`[Z8$7ƘGJ'~8fFR:1H4QmSGN6XLJq} E%zGtrkƘS)J5tʹkEǏ?_tÄ5F4qbFlӯq :s[YV+%Sg>9}āAƦM8eā"`~6uzoP9 PkԾKkZUtʹnDfh9eu6U#'q։Id/:<:o>'R ^U͓4: +Xq6ebSg.>U}bش>Oe"FInFD.0 *V&q̙GIǣk61J^?T2tx1Aゲ'?w`=X+$0Hi4k 88ĬnmaPg,mhC1`.pg}uvن^Tbfq} ";̝a>-cv.t6r 9u pEmMZ~ǚ?cE'R\mk51H b[6&$p&^Z69`)ӆN.Ơc0tb/737Б 80#;<}gn"%u:sM||A>փ(8`kTTJׯFE>_ZW ~؎?GmW :?M 8y)C8hCb@XD^ N.tfNiLk9v;1ps):Àbs=`#CsYY)1O ըEHϏ'<0 {H[I.OƆ\_ab4>mr:&I5=ɍ Qd<1!r1|S1$GNG c+V_rR<x?qa?~q%|zC_M]Klй!:u6%|CRzh:v|hʱ\r̥%C,v)Ma>ߏ3ϟmmn$A.}8$kQCOr"8!'NF4ͅN:$lƻ#=\=a>]:Ds򭝋#n&/'-ڹ8omr򭝋#n&/'-ڹ8omr򭝋#n&/'-ڹ8omr򭝋#n&/'-ڹ8omr򭝋#n&/'-ڹ8omr򭝋#n&/'-gΞMȧ91:14VAj톲lCdc$pnX<7w\ڌM 1ccQa3oP9k eux]nkƺzY<<` ~5̏JmbmVpkMuC;C Xn;7W<  >9R}UY3I퓀68sb,>Ⰱ:c@ü1` j;Kᖗ=O?}ǏBzJc3Dp ;pa~˱xLԞ\`Z''+4t$'L 66]N#7!EaB[5I=qX8$57{Ϗ3}X=>=&?i?2v*?1Χm`mG iu't-*w@f qlڰN?$:'iny|1I*y~M=3aC܈ Æ6y)5>C\Ḩep׍"_љEA]?RcCqx  RcAyi5悍A6o=R+Wy\1Ǐ?En8ΞI$l#Flagep@<e*QCGB!ˀF.lyy>:=$ jV|^W+ztHMc?Ы4@F Jl`6E#;006aCبty!(՜VX ^WVJ61 8mS8Ns1ѕ?e:&Mb\(y>nӃ><9\) x^~+0({6rӆlb 8uz hNi9dن $Eq`l0l6}f~-E<}3wAb+;Woy_;mm^?~l;Ǐ>NscfmO@چiur-ι(WAxlaR-  G2U :|76z .m!Bq1H4/M<:.b~SXI>L#:ٜC$1Jc<) ?|̟\CGr NV"N6v;̛‱ l)n7Y5:^+qom`)ŬXȔbZRk^Tm,fm_Xڵh?RՏF -|6tk3yCrpr5\CJ* ͦKnlZG(T'ɡ_ǐ%IAZ-mmXH_:~'O}5kmb 7FQ#x.f:c1o8=8Oa~) 8c~`N#NIs>u_~裢ǟ?>R~ǍmCgN46m48T<}G N ԋ$|o/9)ưjm<`<0 U_#5Ҧ$G2GhSG2GhSG2GhSG2GhSG2GhSG2GhSG2GhSG2GhSG2GhSG2GhSG2G}ccΣ聑}:rsQ{|}X;[]3[*ӽ~~cvEsa=~O l)X%lA%Fɇ]44Ob5IR:0rcXV2(ϼF 1 ewb` <)_+IZ8^?_iǏ?cF#ɆmylƜӱ5:Y,)mC6}ؖs C:w[[c^C_)gyϏrϕ˟?)эǒr6qHȑkY}V؊U ˜c]Д)B/;ʉGI>%vn7)H*ӏ?sU HqSǧ+U KGo{j4_Kaџ#7ank :9bܨs:8 `y1?&PZR65}WFg|n>UFz^7:nu̍>J䠮%u˜s=e<%g>-ՍOv#Ԙֱ ӘǰX+Yjs^h9^ ljw|)9^ ?#4N.UmuaiySRcE0l#@Pl[vSCm%‰eO\ x^vXS{})ɧ%up.18e9x,z]2TsԸ] ϪGn(J`9AZ⦰T,7y|Zt?UKW U/U9gsc~;4F1܎yi+~C9XN8r87mJ94l͎T5u6糸:srPZc]ߕYe+yu)zV*LÍgдsӧW#k <9E!S麉98i[Hmomͳ ,7lqW+`T&hEvhӶ֭UYنx3t#p]z^Q\Yye\ eg.넩fYKqt^bhkF/\NU+W뗫L9WN96kNjWd['0(4\\I:YqӮx+SJD=X4_=?~^<jm-CLaE]9tҢ<)_Yspƕh^W+@qr8bSN+%zNR`q(@"C7|k{HsׯzYV9\,{k֧FofWptz0"YO-UW+ tKng}\XQ<9eQ,X&wq2|׽^W`۪@ʹ 8z$dkffz;s xN4T5k֓ sw5T x\iIDATڀߩwMqZ jQwhoߤk`3i5Y0C4iv~MNטLlg}^W++5i8׽^W+ x^W+ x^W+ x^W+(WyIENDB`davmail-6.3.0/src/site/resources/images/osxMailImap1.png0100644 0000000 0000000 00000540664 12564151555 021740 0ustar000000000 0000000 PNG  IHDRP_8iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx%E}M0e4JTDTĬAAeQ[# bX]uUUIPW% &U@0"*T$NSuw0zޮ>uR:U}nUuwQ4@c 4h,X@9Z7h,X@c2=TT8:}V?I[Vxe,,P7˲Ѳ ,F*k ,GUO?<#{LCDx$Ҁgt(˲Rry {p"_?YWchƏfhƏfH7V-: <4ʃ*P$>VypeW=xB!rfY o8U?Xc/3Mv~}?MiO7b!ǑYIJ:u+<)M8`m?Y Jw3~D[4g3~ c@1g OCBKV0Ҩ9wqz06d`}?Fm1?S}~dt`2(L /߁Cлd~f[:%X4G/Uz|kkO>0ć &b$|(("-,eBEyYf_?ޱzju\6k|??}#1?enbZ_EErlp73e;yC5MZ??ӏHs|\?/ a)2}9Nz~% j@G7`c?D86#;4'F3f$ЌD3~<&G>7 ApR~wG %24OF` ۦ??ь6:/#8{8}ʃ'3PGy?1Bp5r }c?w!9±?z4g3~6g+r?M@܎ـ_& u7z^?3[&3oΛ3M٧ !I-()ÌT {,e9e,XUدX,@ҥKGt&MTl>* G#0*Ey*sAMA i\a> 4(+׿7tS9yjڴi&Lh–2 IyG~yg~4?!!SFYVk-Zhd\sZ믿>z$]jy>:O 1ue\цk[LKN"8q"v Vrpn9^*W&7X&$Ec4# r_Kk]'?`G^p!+K-~lhQ>UGHQ)`Χd?A\s͒%;ΕO' Ì\Gqr:v"6cc?YJwc?N?OZ?5&Qg`]_ 2DK('2\@PfrXrXЯXÙW_}uXi_T;Å_9!~%ڥ?Glc?‐/9OxJ=rߘ6~4;/4~tЯE](or;qރuqY|bmpo<_V~3tG0ĜazJH+2q=y<\O83GǤSNiQxP^~K'Q_=#w}۫_jtisvoM#?3}/͏%oK7G4/t,'12{P_?)Y#ILRyЯ}wgtŷ;{a~Nܙ\fЋ)˟{s(Ǖ /,򖷴~\?NOj1J+tmҴ_2Gr+MVHyw0 _ӑ 9s@+fCR}"yˬ:c8W]uU-O~&&~A_nr7%z?c}e=Wh"#ҡ:}{9ŽuWGU]r%%KZ/\t#);} }Ϗֱ1ڡcR1-!K~T匑9V2ٱр$3M6&fnr+̹yoo~SoO11.\X}ѭ3fnYg:G_Jh?iOk{챭9{n 2F?QonmmZw޹}饗r]wmO6 V_?̙3naE/zQ뗿C9ӍNJB.2p5lΜ9lm;w>>ZF/YTɒ`RW70aJ`z7YbecɏCCد#-Y"!w3P ^*Wq!ހ3:&Z_I 4p@׾ւfrc9 }qwɞSO_|qKxnJAWʇ}A |%D 6; c%׿޿Tol6fk >LZ/xXټy hW닫g} {-nRw-Do?Rf8ۯ ESO=e;BZg 60 6Aqj[ FlV, )K,fԮO ]'< \T7I34jpxGqsrx|ktY "cT(}M$(9φ~%_7'~48٦=ܳZ m0kڪ`=R8\0[3?y wY_(xIw*Uȟ:usWr FWRj֧1cՈ(zif:^r%#;#pOWUg<xZ@3iҤ'? '@Apt9')^u:O.?B8O+!4\hَ=bfWa.JWU L(hP<:VQo "C~%zy#;>pcL=`p/YX#EY\_7X60kLs л%1FfV+ja/~;( 8~_W(nYif]zfWLKM=N Pi+fP \&_Glf _@>4FǬ|4kTllӂ띖%JܸޕZbKwYj,&NXN>PBAFl&ʀb)=\(r 3q d*RB\fW*u9462]n~4[j }6lc_?=1Mc:zp){xj'S&Ԅqk f~=(gќ2.g[|r'df_"k -W.=`Adg*D, G7ߜBiqrKR3fhiZt+|ҌlfvZ̚5򗿤Y5s{@` [LҀ - Xs*(X@J2!$rɸ9Jw2* dfܔ;ln=iyi(.{oy ^6k)άU?rY⧐ %cGѬ5(] J9*5{eAk^6O@QDۗo|Ge3Ly饗%t8V'/w}7/˵RػW;?%)XnS QPo.v lN\*=ԝ2K TE|*RFa\e }4Oc};P?|Ll<}ǘd?he˖E/slQOYgڃ걍TڙjU._=: F,&fl?~d֪+F V漹NUՂ J=ͼ|K^R9o׏#b6I(uW,^Ft۠-] 3٤.kn7LP+_ʎto{ڼ҆rAT}GO^h># Lu{~H^GTzP`3W#\?K utLCyx1m=Ԗ O)Y <a!2֦#"RneŹRet&+چKد1~0^G±q&2d~Ge~tg>質>/@7 OTJgx(~z>x nQ2pc~G wq_?zĆsgAǘF{g2f,adu0h*+}OS,\@ːhg/)[o=U^鏥7fPSODt!D ˡRooxxDz/ OƼOe<`~/Rݗ5csf&'?EO_,2 _twe-"\sMY!M-&W(m ذMPkmЖ"D(X ":tbt$ݮh2cO~t ~R0 y{3!Lpd0K /w  }?7T</XO+]"4 #a|΢rGa G|T?gdxo(5Yyr;[5z|oD)C/# XdEҥqb bMf' 3oY(lũ1hT6*%!*=`@1Β7N@g``3r=K,haB1 )pL7R3$F,ᵟ˄R;σ~ !5k'ys?{8TL)g:^}SO0KPhMޭnE;ͣopP~txQBYNj;UE ^]o ~U1bֈOlX $ ?N(3YSeAHn=p>gT@Y( ɝ ঃfPL(&7婇I #xNzH:が<ǜ^kEn0B?LvAlV:26j1cW eo*W? GK rFznW2_Dgܡ}9fՃ+:SS r?`wN6mx5 Р(bߢ\NР" jŠG2ZM1K^jZn3zR2$fx%+y8ĉ0dhE~DB3[׎BsyKE><*0Aʻak2㱡oO_4kqD㕏/<+59Y;\~#0`u8_9헵9UKh>gg؅\0{hs@vHqCC1lx@g}de{) v8gIq," "N'\ 2Sb1[}m~"=T:Wz[t%:IGxF}UԿa%73ߒ7|Q6W?2Qg)_ o$4S`b9Kq^au\rXCߵ%v!mے2긔aeVu/q,5][bR&-)#9KY^au\rcBq|{KyKe73A\(y, mSCsp!J|e1O;iL$Υf-bc;墅c``j $r> 'wρ:&܆O??4T=m^|] CB6S~ғ X=cD {-aw25?\%“u1l9fZqm=ѸP#0_ o JVr0qN 0W!pBI36#E9)hKS 21y2z~5ڭ K` HRLI TK˄Ov8 r_K S~4]#cW=J1 `B2iݐ_֙Bȕk<̋ߋc90Q"Q dKobs._?z ~T]ɎA*HjQu702-ΈlK{{( ZP $d8|pL2m^p3#=uBYu0^/۲H>ނ 3?Wҏ&Q9wXR!sǏ د?gb{r>Ɛw,(29,*crR~,I/Ȣ>$^|(:]jo=."xaG@D`BplMv, Dd-C<I xG5ivng6%l6+/lq =QW2GEzV I[x5@LI6 \׉A?q ;oe#R pRjFSle[QE6`F,H.8lh?CXq1WpeGy(c0JQI:ppAxTHd6 D 'nLBXų=kAWnG Z0z0fW2`,|% 1n}ʮB%-'-}Q =Uo 'Nzp΃B1s Eٝ~': -X0r ,)/Y3L=qԉHw]-LGJިa fF">Q#W" 7K^2WS&+SյiymxȞ_Qu~ `mL /xŏ8ڛY(s㞁^kp6>i3fh2h`@/fOP'"ز)JBvp1;Q6I[[tpX2*{R -4ȁHp4XK)13c2LMH*YpJ jZH#A!S%x L2B;ELӰ+;n9⏢\o.>AT{o}RV3}̦s@Rd5ayN2[ }f~!bZb|c*S4[W.$rbfeHƤ1b<#l\-.z_˹sl%\sooo-/խŷSn?Bm-s=˄ ŅFCEAROIxߚ)jNFbʒEKnmhU8s*F1=۹iX!G"EǦj m 8 a4.J 7``K%#ZY ~#Ք)S'=QWp֤It%85\}12u*ӨѳhJw߅GoFNjˇ;N=4-Ew?OӋvŤN_W_ ,8xpd#6;S|;^_͘0sB0pըr_SZ\6tJQz`N9Ŝ9H-Va[f_ Tj1qՊV]'T/-.Mp+@kClj~'JJ- f/ P1b4>^ɒ6Ta/I.NjL^ݣ٦A4'?s~ 8|Rh /g_/Fv;'eyhOlK8To|glIyԑG,m";`sq. M9gS5H 2}{Nt6> \[[o%z+PZ:\ܥxM;}ykFiVl2Wxa_Rw+z׾b}[(M(9k1G)5XJm}ųحQ8W k~E$mYՖ[瓿SY̜E)?*OȉU?RW=<7Hىm0q?iyg;uIh:5}#8EPozӛZ ʷ 7ܰ_o` /x ^{u=\f^M9SMӏGcX9sV[mՖ;Se҉{i8H2d(o/=JLr{=@_ߊJHJ٣z+^avGO{/+/%t۶ [x3u?R2Z7mgu%:&oCj٢ۂk+z9q %&~O{X)cJ߹v>8Ʌ 2qhV8z:LtzK̓2y#27~fmڞ6mbOim h0%IR@ڊ@B"T]*d,Eb`¬N,ssB3 U65W[Ks*;+M:[L _}+q;C;jTEQ o(e~bÏS~w?|\4%n:Q/vO |Cj%:gqMWifp!1~rJj)ERr_j)2[n)L&;]qE]kQ(yܑ<~PV(PEnV[8N`~ ǎô?qw _Ja.ff2pKAȈ9q8Y}®dWy# 3fTvڬ[oML@˕_\h.dZ{H6:cqt=4QbWp\a|x: \}Tq*вz:eIu]7LӶbaP (S{^WRߘZBnPKrb]_~t8=dΏucoGGc3K/^Ap.0$$++fG7n KfTji% tóiMEd=i|^X<؃D9tu z&bZ0; P#1dN?{ zͤ__)v9<95Irflt;L/ UY^~.')?eϛ=tԩ+<ŔRYV+-UTn)T"CХ dw`f1iQ̢VnG?W^ia7?W1WSop࡙0xC|VuKd[ 0#'_*3NIA[!쨣P_jvڙY q%\fGtbK@e}Eԇ2oRM>|ig}*ƓxՃ`UKG5[K@[ZLXc.Wry+A`l;K tM_A`D>gAvSF9c$mS|[߲1+8ɎƯ%_An2G I|T N/~Ό?Jchۼ]Î6a,g(Ay%G8-:-"_e=rb1w;jr+#_߂uzr^a+BeO̞L ԇ<깎 N?h`U[[jp:8N9Xؔґa`{u@1mڴ6 _: чe3It6а黣$=`I lU=RijcPKvҳ_]g`h8髗Y>  -\2\)F.Bo*.vn`F#v4:; (Ƌ>I MgJVޡp($-˲ֆl:Dp^nj>[ö)٧D~DKsuΛf4Z!Ŵ r[o.]PݯW%d2vŭR4 2T{Dy?5k65f HyPGzp@7vmk| B$P_fΛ[hv_ -; RK c\c} >.I!C-]`ء:3Qک&3U\@bE p$MϹ &0G/\O6+DkOLYi``vJ)8R{`SXIxx1yi?ujZ~s*Ֆr :_2b &^JNZnh"Wڧc8wtF! L>e(fV`k`|=ҞJ{ZjS\ٌG/drGF"ݩkl"{; 9E/zܘu&v?gdžd?9OF4SXbY[˦#޶~뼮S*6?\DWcn//˂G^au\rX_zGkWS9D>>dg=Lp0R*ÔR dRHkZ*Ŋ7zKTӿ;"*3̘i!IZ`GKP2}+gVoȜ&`7Ch.m, .:9S̰g7+,]ogyVMz WAaFZ9Yn` mh]ث4a*v۶Y?eӬ(.;K_*a>}FhƋL4l)J>_:鿊s~V=1#j7ts-?Α^]"S%%]RJm.4g~"+ٷq8On:R^nf i .Ru%Af1W3k6hwpM\)+oRr]," ,_jv3fuM mb\ .G:HeStEG(Dpg_6/jFJjw>h1,.܅VK? ,pxeUzUl˓N=^{Bô@Х_T3xU@f`M$x.=Կ+3-=9}5CRhuŦin?-d/˲]}:ꪫ&hc2bLVڣe~@R=:|+Mʶf||NN_k*s ۴Q^1LCf7Xc%;#o@%M/+|Y0mo,~-NY]Tve6sW' 7ݤ\ͤ<{]j,!&mB=DfȐSQ% H/_ܑa@3>y=y-4FR{ZIBY=Y=y>zG>!4QůWAJ R:GNQ?@yy|,I8AbT6 %fa^hzD} y?Sמ*'ggZ;M!<ʱ_Z-~K(23c>>C\u<񱠉)J;c X:ME=e_;ڹP~߽jFMOd;WVb*RTh3N71M DĞb1[G aRHeu_3. σXolk(XbΩ.=858 ?,q+0UD ki6>KEbcIBf)j&@{tdL:b5&0zxà S>AH=u/x󑇖/2'ЬҔ(/Qȯc@ܰ!}~" &6/m\OE -hdpfX~S8c7&ŗXƈ--:cfy(F'q u`,FqW05ʮ@LscnfHŔB᯾d_^-;C{W[pY.?ljyu<-Wܰ&vc3\gʃ9zTǨÇ~NAzs[`?[;a^5܊sQGwmL jeCvA4+2 9@=:@Sխrw00u R:ؠI%ص̐)QpdXˑz[ ZYV?Xc b",!+36_VP`~A6 ˴ME1僒EX:UY0"i!PҬ4 v[mJK(lyzh xHދ&kP+fڹꅶȰܘLaW;gH]Uq5,3]vݣ_29k:4h7Tc6*2MS`$#aGXO2evn75=b n8ԡ$jDޏ%/>./~3[,MWKG-fWSsDzD'x P%(ǏIHr=HvQn?BϞ6*S=rCT)v}j%ʁ9|"@iT%h3K'>ߎJ>y/^?D {xXZy\9su+ߗXꛦ=DʺZ,oK l,n:}b_B{78PC(}%ri6-<0K^/y3Xڟqp=Ϧ=)5_afmrwL| +sKx 1{\eT!<6iT- h}צN.D>kng~ 1 _LraSq{m+c´D kv;39sYxꮔi}T$]9ciLIQ&+,A-5gezڜTZJTأ0@h1ᛩ\kAb1Chf5nɾAQ4Gdj^ʧ,W,)xѵL]ˎ.Tg =@o&-j0~eۭZkӐ7 ! .E2|O󀴹lUҺ3( 4$z_ʾ%(;[’o5AF$\;05%pAAc.I3i ,%1\ADR@Vn_"tVY8& }gXbJ wVI6 Q$5"PJNa^hg)@P剁:R)K$O*JO]5f1>D?++QtSCKffhI2Zh``^fssh|^:,?o4G֮ǔWZ;P&szDt./ɧlt7t^wѬS%2iy =5y;[x~=JH(uܶh$6WI?3&Z5'D"&*,@B50zҌ6s2(aB㔱`JmC'ΨQgM[p|! H |Mm8Y8Hy I؃e,1ˤ?&ďNH!RyPqR(sH8vaػ[:PXCG ,t HO,h\x`q مz.H}9 2p7C.D Wdg8 D4%t#ޅV!myƏ_"(z:@bdQ2<?2-!p c<[yZ_E}D@]sЖ-z)/wm=SrZSֲe @gIk/"I.檼Q`&8O(Et)!bՋ׵.8XńŲB}oW.v4ABE@z@Le`7g#m?/1R ,tg&mm.р>3D7(%V=@;rS(̓܁KO9'RO502a㟒3r7cqJ ʳBp.f@HيM~KJޅTUeI|nv"| $1@DBLX/且5rd''h{C~2}W=Ѓ'R??P(ʲÌwTU1יWTjC6c鮸P.,_Im͵5R]5k ą]i©u*3gnrI)N$KAQlB@QY=TG9$A/`ԅFwAWIBPژ+k̖&@I@B!DScґ,Lq TJ0]W6 !] lz7[=x.ZRݯS7''y%ٳy0$ϞҝqJV'SǍ*MҐfKVwtXV j*nt'$a[Y 4~?19NSsKd?X\tw %?V|LF/ Z6ԓ zi.;bv BSP%LGh}i(:s^#lsJ='DrmE1S,9^o_4 1B㓍q<'O:kd1pcȀ)+w%uzǯVFl^!/XpMrf:𪭍ګHf#Q} TO [@DB3C%Lө6$-v!I!S9{2iS(-4A}C h'@y<< TcS\}K^__^^ݵ zWiw~O/_Z+2|^[>s-˽ܹ+?owzUGVȌk׽uEܩRmzHK +;x$Ai9GZz]F[lKLx IDATWDoh7mЕz+LlCS7Wh/̀Z]tAӧ86OW87{8?,y=~t8 =FhO c#'O1xw}Ke)e $kxH>bz`Sճ&,HEY6vq[#-^T.YZd&mouWy"I U3W*%@сLXEfp.vN0C*Lӑd P¸ zL$"\rΙcbOR v1~h\5a?~+U.X˿rgqo(/5w/?(sᏪKWP񦻋fkQm[Z|nf[\nЫ<[ADyU *S}zۥ69{,'pF+^@lNf*ڀSq1ON \HՕW^R`4} M en٣ (^z_ߣt4N8@|,x`Ǜ@O"ӇLL k'G;5e=}$br۱_:vR>ZKJ^9NÇGhSr:!?"ǷXc@:Q$#vaNLQ`l\aIhv`՟ѩB\V˾`b4tG\ԌTC;a׺RKUXw#[0OrڧD4k'Js uWܰ:.VVMR4AA_>X-^VŠf 3:6<hӋ_ȴA\ǵW{I.EδDRRk?P7q4ԁ] d)]ӵ (f7kʉd'wbKpZJa"h( u"҆n/ѳȓ  .vzNpb=k<=Twicy ʅ h/ҰJ)術f&v1nj 87ihb7G)Kgb%"BP) Δ't,eyʂJm3*ǢגXq.<3C{N30]8$*5hTGqpͶWZQ~~1sT* 6Wp;Rf3/4U:/Xpʦж}_+BBǎTPш**DA" ( iR@$I䥼~gι$/PrsffZk֬=δGko{ƃ<2o{v AU(*6 gKzB $be!A39+KumxW뮃W.jwy]zի|^$XWB^GiCyq+/zGeEEqeY"YtW&(GW[z.WKK>^M7, ek˵[l8pgGiSǞo8\}aatbUTfغh U2H@U鲰KXQdIӨ*bOHn۶pzO/T,i%^*V;rQv'=Ǥ%QP~s}?z!c>xO_X [=xÉ'\^,N>]~Ņ^hwn($ GC@dPl D.I{HK6Wj%GV/dNݶ CWӟا. W/}붆e kXoG6>aᰍztXz}a D~%ICow62H Wf+||}(sCktU Q1 Yb9W&RC?)pbO88 W{K^j{N;f'L?|^!(ʯ>='GY{c29 ᙿEvqC6W|ţm}(?=1:Krd'ݴQ!9yNmÆ }'tRY'1gOSCL?C뜎c=6ooz<|Gh 5Nq%K~]ѐK^x_^;묳 N0+zR˪CJoLt=Im!!E05Z8< 32}N/w@fν{L|ÉH6mabgKh:yƤYiLO:ZEPJDJdk0[à`Tb*bE4739ħ-3K+2WB$-WT;qҞ}{jF3^kh9<2VvᱠJ_kU[1sU6dˇ8QdIAL{a K8x#h)f(u+]a97LX *| CN;Lk0+,ܳi;ZFFF D0ptט/jPmoݺ%Z6;,߷o1&c 8;ypviHKab% 9H}J5 u$ ']u^,A fpEF96FX>S:jT C#ֱrpM=llJ:&)lсp$+O'ى@l aСV _^4ab1|I7.-ݺ_M: >ÜS* %k2t^c20\ kSZA ! InZD<+SKE#auAP^Rݗ 39d~5a _ =䩪k`QMY%e!Ӫ]**Н"՗OB;}>VNDqct ُD9"*8i:s\+W%[kN0tp.UN+VY0zKubajͮpλ?R4m 'S~f<ɉEkS:9Vl1Ckd<wWsq'*Xr X8^*}OU1'ձ$Zs R~ʚrܤ/rXWɷ(xIδn'=OySH{+;X\)ٹݧ3%q0G4+rDpqj`׃RL1Yb,q3$~{nڗ+Mvޣ Y;ULN͆y-7*z1Ptm" iV}aJdːY֋ :Ņ9AVfSf[(MnQX`eɷ^ S$p07 iK~dɾbzpMWiύ.3U Acf"Ls3eJ(+;*Hy;,OjGyeN3Hs)էz]gdR5mɞS$ڟ7 ``У/kU]D>[NSg'|9"5 XF1/KK(@P"=z'{>z0??* I" EI_;|̀2CyޙUdxRBՑ3j1[h?5~Skrf6EE:o rqP|IԜf.;aZưozQ7 -imHFa 76]@ 6ViVE.OS;cTMX//c  eYcpJ1VzkgWCK!5}?5UzQ_QuN\#f8uNe9'Ղc= c!d eMZÀ+YzD,Xd}X2<[4i,܂L=ViYa,+z:d Dg \ fM}oE]טeBXrѿ˞47'm=6i2|"|6jFplp1o8Xlj]0ͫ*km? 5SqfLbnhQa8VE21  }PӴӫ,[=rd_X]CV|ZXvC9>2dPR&$^]RZe(sj% (bjףK:$cˏz͚I%[Nx뙴3g?DEuq}OOgß|~* yYZ'U1C`Nkn##2͘L[ L^2Ɠ6!.s!6Nܬ^ lW؍*JAU(hbTe6@=eEC7|7+c֌ 3L0cEX) 3 n?+]עD2a{nO3t#h7"6/Z kW]NX2ۿn?Ccͼ  hJ@XfCR/5#IRtҍNb.Ѱ{$]UՃ?e7%oK*7ul TO2҅Jq/HVUVk*&NٌPj n?n4]BX'襍zfI>?>n˟Hip܀!hǷx uшN_:$gHwڌp]Y(~hYO{9ݽ$C qM:nä+I3Arŀ ecÚɚ-gg)}\ݒΰ IDAT2GctfL Qgs'W,:2]/\Ӫ Z _!btp8\> w|s kqcX^xV/aԟ Y&6j~r#Ni *O+KJ ><;v"4ä6#n3U_*5}Iu)xV%wŀ"(UNQ2#I=w q/tj``@&/Tu.N> c vjܹNIRwJH@<~U[$9E"@>ײe*xΠ$aЉYՌAp6+uS5Y!gU9G unz>B kr Irᧆk+ƆK_ow|= O\}xXs-rP1J*mr,(B ge‚!iK-j;YX[y6`aW:贜gcHTP1 *J{ yWX6>jڌu6r0ÒAni+&b nMb@XCa}1foQ*,]0lUs-/3CcA UZ6/+;9XJ/:PEʗΛ//]v2odyѧWΰlQTz_4LӼS{'yF}HZnr偝2:ˍ Y2hKvA>)}\ijWP~ڽGUt-hAŒ(.LɁꚖԫjV)FfxtA/hn[j~jgCCYtc~2y[de-im|g w-ֈdTe c^0L )WlWѸ-::wiʄHJVRFla(gǖ |xz6yŖ'4Aߍ54(D©^Pm/&V/7wvυk_K?T| t #i?SÊu'3a[nUv+c}dh5u]>lij^u\Yq]?MOφ9X bh,D&Yߌ+{ʲRRzéU, jϖTUZ7K~`Frӭ`2dE ؞O%id9WΞQ:ZK[5⥾ >ū']Ptyؙ0 Bߟʧɖy`6JKyrA}ն'~ܪ+61ÌGZ͊e8Vd'F8/#;{Lh' M fcqMPQ٬SilSDI f 9$7%7;SÏ.WN{6kbu_{Ɖ;C(aߞ g;з8Y Lo } j 5t(_V[[F@q;GR&qV)f2 ,շR2?aK+%(=|JC<RW|-wsNo!ijS)CrZlKpWϖ*bA׽(3P(2\N-z=yCk?|=(SR*~/y3&p.ڡM020x92a/e# 7Pr5V7\t\ӊn`MI4I)+Z1 " A'bg~-Q'^>h!dӳ0 [nAFz-啐ܫ`29m<ⰽ7"ҹrw;ʕeb0c[f&/Go/z7W^-QxT]$NM15ȝ]aZ‘*qnzfA;N!kǀۯ,t K? I%UD% z+׍&JA\$mQ" d-mFrЬ, ͈iFW3O^Vfx0|pYuc.<G_lYk?Y뤟 ./#|%*!G"LPkK&5X:bC9w7|sM'>`OS@=spLu>L}(ɘe.-X>(͙6m$3%9eaSf|2J(3=($mOq0tb?#81'9WtRXXpb򖯖[( 6^0gWLV|@128/-I@FԀf02VYΑq5/jh@pPSki>-+F5a.5Ĉ%zbٗӬ!m9'bI8(C[.Iǒ^escKFd-esJӓN~0QAꖿVZj]ȸ-s<7;JW^=zAȩh?[hDfb4^EQw(2_S)i3,tMkqłnώRJqС+ŶeЛ={Y'/lnUxq̰033eCHf$yMSڗ>#ZNor51~fE±܍;=HK~^ѧK Wb|cX{fٷb~ S6ׇΓ&>:̔ky_Ǟtly 'Z̢+ĹoP3e4&} zHLӀqQ\\ n H*}j1f)^ }Y.AbMߎcџRzZDꭙ{.WD1=QL_O?A\/?xp±̨_0.Tn WGԝ騧^ɟg!{UW' ('2䔩2H39,5b}W˦2O֭)ffrV"= 5ē@4/WFGjޫ_ $+HJn,)Ռ)4unF']2lP(De͗BF(B Kc+kL 3Ӎ05S V[V6 ۯ av^* Fk7]7\[l>fFK7u]vv-8'+*kO1qF߾x :@M}1뷨za 5]=+z2)&]&<)֮d@=dW].IqayZ?CKhσi+a1la9#%?ocՂF<RS&̰N>vEk. իVim\ֶ'-i"52s$ iS8v d<#u%@1j3bJ5$%:2H03`W}C`8O'ѷ.9bYd/^ƗkM~+ʹ)uOb0GWfγd=\^ 0=]`K*|f8:&C*x#Kte9u T_6<#M>G),GKaBoVjDꊫz=^DM,yV~ҟg>kwFfP3vN c4x&Bm+ftYMemӘR5F@p${Qɀёi^P zrOJ&"8M,b&1 2D_T 5gؖ^T]3ACsp-έw\&&Dl_pԱeqoOӴf8a1T݆2 EQBҫe0Ƅg+ZH ԆC.KC%!bX=.1{psfȴiD_ttzN2+AuOMMګ(KXZBS9#9ǡq}OyvSW7<^+ɀ"1g|W,>@ +c p aG\(__L$K+IGʯcFe˖)<kά}eKw-t0JyUA 1xqAFOC(zݤ7԰IsSh7s{7:V?r||BɝڭŁwajTLnqg,K7$Q<Q}u*垆6s'm’ O?Ƭ. d%S6r~fmqӜ*:Yt,F݉u( 9uXזCk%=c) Ndh;Ѝ;xzA~{@“,ޅqxWׁO{a8lK {LΙWC+Cd@ٞR˔Փ2!dH"l 8#@d;Pu܎c̨X1RG'a13Q2'k@BsОiwM &4#,y6Y%yKBa=Z=,욜*vr"YaP ,ӓE^(f0}:.Q10(=~-cl&Ѣ 2Bi]д0XVexL`pPNjj@IM_jjCXozE:q祙'[{n6PK\œ0h{Ztu_SG~z >^M󛟝uTUiYa"'Rub94HG# c'R0"?q_HbXT7&ƋzəzF?TL4{\`@ Hf&pxKbfS(}*פ7EUxI<X*_,k+;M¨^,nrHaC5*દd}xe[q` IWXA_q=N[4|A˲]5Sq ]hϖT( RA-^.ƀDބpj]vSݘ1ub~;<3n_ e<,,WXܿ[n v{gkFHC~C ,pϕU7+3!rWan6o\oϟCm~-zz[M(˟9?X?/s'߹##9M NqE@;_Uh'&&[lm.=Jʼha@ʊJJ" )LTj4anzZ<ΕBH&JN< *$)9%R<$$ %4y8 *F9?UNn1zcX2lOQ{ rfnXf'ŧQb$q5{ܘg\96`6zeZ , O#yX\#K>>wW_[TvG(u?A]NI$Աa 9 0y:Frl_?/~15P'/\{|qY/o 6w]#xS~W(X)S-m;W??[^ũZ_^\Ljժk\\^<<:ʏAG}ӹϻ)9spw1't2=7}^˟.)ћ(>-!/A^Gy/@7x7rFj o=;MOtA<2R&t5p!׭[[} D7A;Ie$4 ieC`!Qf5t!^{IJ[ymnV3&9pT Gŋ+*- IUGzC,@4wM-.󓛋[udz ה##<1emh [o S{A׊]s E]nam0Lb#po`sbhxVyw}e[YஸaqhԟR&(]+a4ǦiVn eD+^Ww~-{`9U}n9KkU7AECcNY3Z@G[t~]vY~U:P7xғTJQ81ē@p=t;<0[šڕ^86kp/>^ oxC/^83r9\N}UqsY0j_G?G;kLRxk^SE%-K*ntTt^!Z~Otr}І NgtG)%c{N<ձ-(+`4* /+ E3Nefnղd1h± ٸ;G8N4tހfYe+/ѫ'}IhġKT'[^u#\9o[mb-af 5/5>>1RZ>lٲ7=y Ҙ+FG88[< HʛFg#e;MTi}3U3A1)Yd0qVo_ה_?kF魨MqRpMBG{sVG.g~O_Rl8*t_2 ^3dE IDATxU_%@[jF+tP̫2!G+_JarÕW^ s*( \&6!@s—v3.N;)ϩf 7`K\ķmO/N:ɏ?׿:zԣjww8ZO]e$;3^]N}ƍg?5.u++~ޗ__վ/O}SoP3$8{XbqhO~;q{\_Gߑ^jxFN;_" 7-ُs=&[*eKjڳë7 \?Sַ챢'l ;:*_X݂{u /˿5ʢٕCbۄ[c9.7~z7c4_ο??<\\O}cMOȯOǚhe2ӞG>O\ʷ$)h9{ֳUZ 6ԑՏ>uF>=6VcGd7fW@}Ѓ^rk6*7irB+?(%>70_3w<ӿ4wR ђw=xoKFLxRiM188^!ScUxM̌؝B6`FWkWM;C)BR|cZ+g2//lђ? #0f]3#=<;y ؑoL U[#*k[NzK(8pС(W zM7Q읜{V;w)IP "~p_WfDbEшBSNyBf`_n4q+6v7u&v5.W_,5Ӊ۞=Y /o gY' ;.8ثeUvqM7X&x߿=Ň/D?Q]w(77]enpٗY^zs8g]8agg?2x`x+_[~WVP >o~C=Pz/rOe>pхd~Ɍ\;4ۿU<Wj)ZOG=)˨Aq~=h ~??6m%W+"_/R,~@kĢSw^E]lԶ |sSuY/dYB ˎ(sR_>Șx)E1$2.Gx/g!c>d鶜7 2BFzWYAzݫPSJGl0#_'frwX;x:Twϔ6.ɩi3JY Qxʋ qv*>ihۻ/LOM#{䙙0?7LJ<opٗg=CxQ^y7We}ⓞ/ ~ʠ"20 aD~Ⴡ_0N0N|8q+mAs%2$E+"l1$ 򉑰}ҥV-2GtA:Q M rX;2O#K/f7xE; g̟管;,zX8d)e)l,8Biط{_6f\wz,_9tAg>-8UQ01ą32gjk tDG]zafjvzO[ !R<-#z7L8֮JN[o S&3q23Ky1>Dl7y,G;ӡxzN驩bJ!i>*5[XFN2 k#;(/Iw1~vJȑgإ"pz҃/[+>L &5= ;i58HT`2~ [[<-~-SX6ݴ]{Zhqf,2}d,:ҪD'qRi 1j}P@rg䯁1UWh4jX&e(r}Ō U+y^42L0ˀ')(ub/e 32n(NK(͢}ł8SDe-hjV[L3UIXq_[j?a=ՠf,u2LS kf.`gbba2TNE/@IIi,_f0VFOrGe4m2K,%vzᔗ\rIŜ|}hio {-̶0,yNj~^s]''"~,It\W$ttC ipA%'<)O!N>oKxvJY=--h̛^.ksj2ZO~ɠ+Y928nwX`GrRCk=z).gQ-q$$@EԖa1 4lcTkzhb6_g_{JIA 9^˓Sn%7*&0x`qo %77ipQQ--?ačq5a=\'J*)%6^('b_0_Nx}Ҋ_ S{ůQjnvnطOeumÒݲe^qerk%)++UׄPJTdQ_ 1zW}jՖ7]1`:A++W2Glq ?~eOأ} N>U =`@$?2Xۦ}UJJm!dHBFl=lK2{o62d J;'2#ސ@}koKhGH?3ԎٻimȟgU̢=(£n@aIK_ؿ=V%\qQG5fR7/fķmpq}Å׷e_jt;}@/i1}YD#@2yG,R*wzHjp$dߎ~=q)U}J>)`Ź[* [ OJ|]'1%0d|[mw.?&B/t`?F/cڡfѠQ'C;W0׿'h-E'8((9}>|Oo1^\FetҿLȜv#X'Pg0qzSD6p{?cø!.R`YŒfLsX9owl']9teTat Ohi{KPCb|?-8HUXE15xQ=Bn«9#Lp9ѣpM&;=x!E&JIvzhaf /3UaВYy:f=J h̡ו=xs@e"+/8Sɉs7~;<9/O+:D;x >{1w:=1s:1Uji)mnj4Zrjh'22<ɲl!- R3y TT[em-ԵgO~_a\Do0@O咁꘿ebϏٚ6׵:%qKg*;L'٠"[Lyd _†fj˿K3w*Nujdx]cS;WEk=ZbWm7Ƌf]3Ї>Tc%k}^}&c/1et$+ -]` 1]I >쟡V'Z;F4kZ`eyQ%~ 2;uNjPLo< Ki)f2b\uЯ}Pbϝ2 ~rltY kf Bj6'ApjG=UUFmOzU F,W х0A!_j8uq3ITua%~T C 2LF_fkyZVX,e6y9;nP! OL,W!F׉4`V͝hiKX}SIǽwU+ԾNPRG!Wlud۔W%=qʭf|l%J8*\fXRZs$Rfo\t"R8feNa7 (tlnnQ^{C{Ɇf4;_㚲bxQaÀ,LPD VKwB@28s-! W&:(=s 7b6 xQٶQyZ1StǁF;4{qf9>C |+i؄i5-Sf?}Iuڟ\h8%qԉʕEF Q^ 5:2.5Lfdnݺ5s9 d|WO\S&h 6R+ĩ]Ux+K#y=,*sZH\2z 6,Jg2C7SѾ1;!%]C/㇠i/{XcQ3_VF 71,ZF1cS:O IDATaIX()9jf|)( E;_ِj^w wܶEʁbם;.t@Nƺ`FY"NαtgF2tk>} |;͂uȰ 1sbTÐ:S-bX1y;LS*6cRBte8xyep%.s,y8=7mK/6agGoysb 7L( yW'9xΛ9Wz0 pyZ%@Nyd#{θ/yCwcUKOk|ȞAHiBkKpK-ҁgG^< *Y!diPG `XkΈ# l#2vaxc {|'lQK{4Z;LRE-Lݣ{mfla`P}j6Ȳ`!"di.:pYcܠ-lеWFlZQ3fXѝ_S`?NzOXl"<|}"GG[Y#{UkOQb\8;J⌔t3LPDG8|<|&pM35zRTsF9R^t*atXrm0_/z}f IrVaq샂V-$NkQ)9D A1Ur8b'i#P|!s î9$y XS~t˫9ːŸ%+-($i_Q<#Oqmvn13_Ix W{=OY%8I+RZFOPZʟr^r3b0‰KhOzC3L&N9:7C|$:s niH nc߆D?36Yec#zm@193iPz 86`8^nM:qCHwWXō>"A.Yq Jg'HcHn (^7eՌ6hKexQ]mDq3ZR^L;uZKKrfjA/.zB&~|sY)5$2n贰M͡z0H \# ezImiFJR;[LCIK by*V%XWLhfOM~O"]eu_̛VCzѭ-\ {=;s˜P"N'iR,EfK}O^1 ueោ6J=-/'0Wzv|m"4~BYXym+@s`#.Qau\VslZ%F V&w+ z}F}a677ub#z#USV'g  2xbHLjs0@aCD0 JO@1 X7g{̮]r2Ka-2WlcKعkKҾ&Dbrf|^maî8P8c-Q%zy#XMUfPuأV Q 5heY\v|ʁEQ"Ƣbi/L$Kx1|)!踊A8Ub4.b[)v㨴٤G.,L<9;Gzmj xq?뵟%Ge)˷z_zg3g0WziHzsN ԯZM~5zyEH/ H/uLbl"CF ׎ة1}H7o :gt(ô!``1"qW>ȓ}IT|%`KЈkp*F7d?#;}RzEOY캾ܹc6+V۱s)\hj/^!|`KwoN2z$ RP X]%8%-I{(pZz6!m$`#}4,|m:>%v5=֌%y GIoU"_9k+f^\k8 (Ta6l~|`q //34nS}q!Nq-֌(xĩ]*>trеu;nxN~7nps^7ӹ  tww:u;nxN~7nps^7ӹ  tww:#|qwO0g9'Kͱ!*3t!=-#,dِa۲wڙ!82*O^À4X* vQ63s>4IC?כaE d7`x6)2-dKȯ &WQJ`c!$]+O_kfwEfvie_ɾ'Y }=Tn,]8-3r>CFR!Jipf.H]*XWqvn~>nLgi6}UwΝRZĥ1}ba [>fD -*. g-W/?AQ/fM(bY]P+]n6g3Ol UM̜Pti tCѣOK^Oϗ?O<%-R1qxbķ%*L\UzbK-bjIq{h36tYf4GXF^6ԧe8(`OYk3UꃗOgbmؐ!N# P")If?RyP9zi f k7 %Oy0XYFwF30ozhZ3þ47vcaʉbbrnք6E߀JpY 2p, LQ( KGT/f4a$a0 $ a-y(-1`)!$3ʧU=&kP4J REh2}…у\l7zķ=g!(1U?4\l @"_j)YG$\ ~xD~#9裖\'"渞v\rXKkIKpk%渞v\r؏%=} B&W!/`)^$)ݼNKxUz0ϔ0a&Ss>ۯZ]ٸkGuV6ګgVdDijDђQt`'iO" BQSF-h@X66Z i &Q . lCU\kcQW͊6$:#̈gLUl!U(֏GZ:."V,Dfvs®\{ئbf/L5\Pگ5Wh3KB1c#A@t(AV?eTG2#T#bɺzAIV aPf" QyؚBT^ t!Wwy}A oya4?sX.BņT7f0ƔNV]1 AF*Qǃe'TZÐ KxY0ry fwǻ;}ѧC A7p{kmnqkPN}Ŕ8l($=X@1&-OhL<|kY=;vԯ>{|1;? kU/BNI?6DX2{ITdXiQ?ڶƗSwK@ @ 0LX1!,@l0`&,̀160 L0#!c%a!aBR~gs}[{ٵR}U{w][(eO`d1*l˨ha .Y!5pP=65> ' pC3?c*4EGVPWe3ˣǎD"} vW=횎n'#UO*JyQ0y20_C*'R i!=5>G'?(44M6چ%[/0k[s۲8 ΕY JW)߽զ+6k}Y4Soxmkf_?Yna3 7T33yohx5tmGބ``]'<7ya=N<ƻv_]9U>3yD]pp4ÇZ*8<޻ylJk$-`(gFz*EV\VьU5H:LT2 f͠T)tׁbǯar}N]UС#~&~Uݙszvom1)RfX3 '%ރvLfA\.|"d B?L+Q*\d@NEICol2=?%G-$σqLc昿/tk|c+~rV:i(nz;ʁ;O~l4K1FjNlD~ju@@`~|]hF_0̓zlel 2s@ߦ|'8S{_ɔn^zZSOTDJCZ't<8H9*'ne͕\h*΋b8ѿCyWppī[&=@w.3\$ZBsj_tjéM9 bSNQL驅 048lAyZY9XQ*%L&pñvoep0<Ō~5JMa)i0'}{uz6i׿R?qk=o98ۄ͆ &jnOvA_ >j?i'@=ܳvj$a]Dny#26RȢê*=rgc>Q:ާH9mƿ|Vo F:{'mj%FYGRz1/O/*eN(I]mőxMk7;(aDiJ( % lmëjB K]EnI @u2E;zGO߄U3x칰_]Y_]]>T$%rm858e(uʮדnuT:]t^8MQT+`sCmq)G0slUgשSx&(/eVثGf?oQC p@O2HVaE6aChǪBpާ߷ߨO\)(Pܵja~Ӫa 6z8a6GX 1pwO%*scwo[xl3.zNm߼sbg)/kwv3<ҙJ]eo3M=_3USESmd]KГ:OREQ<5nEc/Z(^^Q@Sx9Q+~{mtVXt-v#g* ]8si!ܙ(7tMwJ5 $TEЗ6-a-חK` XRV|CJS)a#BܖV;>~LknAm7[qMI^h<MrUhƲM6gٞP>ud~]Z𮄫vM9P2'!@nMɑ"fo>irM7i$^_LcJ衇uǻn24fkUϢe0Su-'CyܡY 63⺥TaAJUgl` H(u4T'J3Ax0F9٥{Q,-yu u*2~Z맻 wpA<=uf™ Dڥm݁G'Ntr;@DiUTe]ΒN&c;g-:ETgv=X0NAnO>.Xxfws4J1s$Hᖜ 3#K-k'8v%ҍu}ڑ)jS_'|mOzKq+XGbd)PK| 'P\57pwl~}e6>5"LnToth3cTu^tzw=6}%̆- CGtU.ͧamm֤̖bLaNqg6r4]Vql) ͘PFSd4-H:B?Dvt x$f1.l78kt\$ѤvTBR-kk}dEO5FM^'S8pLVV=NE]\dkQѤo [MqD?1a*_\p-8{UY o?~nkq{ SP5S3F؍ņJT#F .~RӀȸ|V+]DD\t)VW{N߽_{ .(Ǚٚp-C>@bi%kt\uNQ[&*IYxYH؆kr=TuFs(ĔeW\>Pu Cc~m+ͅ{:J8 xx3C?5;_OnswG/m[}տUkY'Y-(,)E]gG~H?pbCNtIaVOx`,o sh |41\BSۙIۯ]/ƞ_ҸA:hx8lF|FG%&x>&Ut'R>C[[tO^xӞ갡 >(N xYsil{r\ %0hL (2R!  Z4od~),BPd T郢W-`F4g|k=Dg-6㧮b@dqbZRUiFttviu/tM:կ30sft&c IATL FVύ~}XH~XP^G,F%@P[YwuPL& %v\mW9Dr&<^`!k^=x!훨SD.ښ2}*89yĩFF]Fi%J\T[2~erSGYl8o*Swih;db< >3>PXʦ+ϟ[mMjZAK49z^&n#qm^'tr߰4ęcS >}n~ }v |T>79@5fH885xHւǔ}!2?³k:K7S'ԳZ~ۿpnMu}NYϳ0IQPZlh̔< X[}AuGPxrgEf/ )G:f8|@W,QfZD j`pS^CT@'&E>)ҢLxYKwԳFHㇺ#G櫮>CĠH"{9g_saK @BF|. ۧ an/reP7Q+Su2r Nڟ=0xd59-=W7:W )Co5-[&?DmMCDqKvrabeyJ4F*,5)*|- 6O >x\?~{#y Co/@ۄoưBG>&ܔ 'žOKN/\8ϋpvzFI݋rvp R;<[ "V=ghIឧXs.NDipἘD@S%*0ɪ^9EJɾoS?EԨMR*Fy%i0"k=VntO^#Gqv~M.m:k]βՁt`) hF M9iX@*)ktHh)`72cKg^ǰqZ~\~YikF¶Dtntt{_)-}f4y0z*4ˮT}}~y\?_apc앷~0?N~A]De - ]p *|10e\b1:SP9r?2z)\İi<t*4kX\P RNycR3t]\*:Z4-W0*640u ~/e~i_scӟvmw]wgϜcfw}g&]n 18a53St>fklyz^*럈LPz'm.B k iQe.:O=TbF8|2|D+ЌRXZGDo]3:'}>8uM~| NţM)͙g. ]z<,%,3p~~){ΐ[{T>;v|&k|Cj72 kѥF_(pD6PU"Nb|;.C/>7wɉ'$!\sF6zPo,U`0A?#1OP!g* Бe/C9K;K(Sl E0F`%_ ?XE+Ot^KFp¹Gv? Ӥwh F8Ddmyw]3 :(%JdI' M͚#_.$Vu:=/x%AB\YxIǎμ+V5_Ӗ4`g~~P#`oPiMկc?t!e8zEd%9X0DDIPl'˹-щƦ]{y-=Wũ(7 o0Qߧ߷_ ^8Ю]L'ZFlSxcy#`MܣEeR|vgM_@a:>v5HWJ2Wya|ql`ɉGz#6`UIP^,@s&ٷ0QHlU.}jEl!pWx+}-`#;wDN}z{&<lZ%`Mq}e&yItF(PTkx#T qNjkIErOZ@M( ,e{y;czᯟV} ~z0h#@2篟ykD9W@S+JY8qf=rM|}Lw}x3ثi:.V qR6TT8ߌT2 O 0DjI+yH*J}x.D\A ܑQ ^2FZvcCqK(cuF'L\0ޭ\闉f 3.LN8g$'~`GH'HMQʖo-R"faȪ l#*~5lԜOaZd>}8úsf\=?"h3j/IIqf_ s o[ez;O雾i(Ma]*h䇋v?\>+i5?C?T޺6M.11޸l o\suMư9{cvvsv&}If#!c{T1JNszTW,g0 ۡ4@NO= ?a ϵ>d}Bs9 !K'"$#/3|ERG a腕gdA9Q0tx뻃zw xh%+It5zA1I?*x>]'":[K:NPg#"ImhmTMk-}$U1|SSZK m kv2cz%_E/o~W̝W *H4t*ui^ta}ĵ =_ ( rX§lqa:,Nz ^{%*ڇ[ e?D7K0'=qw3k9(xW•~״%y)"яih=G'wyNu_x?ͻL_zD9Zb@ԩ9MS$$N#K3'Ŕ˄3s]1 \@* 1*Zihh _\oe3x@AVcW`-ҟ8_}HwqmcKM+tE[8e#k^d˕TmSxh\#W7KEc9'¥vR)hLnTKA!6S"KLHI#JJ9lH ל!գ*MO4Ouy_һv)*nQcodC'2D@O _}yO av7`kdl޷N?^IivElxe >?iiMW[]cH9P番 (zo;vl]zWww'3y^{`jbҰecFEIC,& 5ދkCKtz9w%G>N^U' Gtr}lyFs,m2.׉L0X&JQD 1q%\SW=Sw͓Lm42H#JMޙ })ғŸm_pq0m [O?36 ?l^Tɡk} <-67z48Ojs?fF i7frBsƩd1v@~Čwzd59|pz,Teqm?6o,`n,jRq= =9~dsR(pz4HqN_@ b\< !5 d)tTFՂW5_ '~F_tO-B\Yp@<+@Oyةk&'N5-=wֈTlOpcxm#RcSc\U7&퀃:-2#T= \ű`nU"]±1B9+Ki.8ӺɁ+O>?J(xWA>tdWKy(?)KulI^P'+طSulk_'w~kpqqY^Wcюc.;|N zL7AzyCz1 ]Zqc>:8z-_YNYYvQZ\亩*En[(Yk7}ҏ\@fS9oj8D oʣ+7t@Uӑd׭9I/e"/0cqIɯ)K?g³nFel#tm:;7E!5* `ޱxI'|Ӿ-뵐ddP%]ua'lʠ"U0GU O*~;L5V!b L63k>_>:~ |f~~w{v}?=-˵୥~4@;oGarX8c' u25 ~1kٮјfEy*'A26M9E3znH96*M[q`CtG♼6vʫ^[>)_::FeI^9=݄?0v⻎{*_*g2#9i7kyA4ϰUe\IUv:Ѓv-߸/|^~?3>k['g`|mjj`9ōONՐ.n_:tiET(/}_^(Px 7}~oҗ=r7曹I||fK^6^7tZi|[6e#OhZG+d6[;hv"؁J{ߠP ƈnj w㩇 &@&N0,=Ƈ6odh_"vn{LP QtUpқɐjf-QȋI susG[3#LG0ޕ'Ԑjz#JRB/N@ akPz^\MܲAfq)ThyMк{;|ʧ|JWrG p C>C_)y)|{g?V{ -5RS`gPUW.=譓NfMWX=*ov(~`P6dž3lJ6NFLY\΋ޤ =mH^쒛wwo| <?q(kx֙BB8u7~;]FOB=W!>7,E~ceI9FG7zy"a.q֗(dU^|m!pTA'<2QGViKã <!HԣV*ok^Q}‹iD(GbK4ߚm)ֶ-˿ ?__lh1 x8#z?ンV֨'Ͼ'}ާ/zz?P97~W|??>؏ۿ>?[ood~Wv{[n[G п?fduN6ܭ<@\0t~>?=??{ݩSi{tIAtݧ}ڧuؽ/ /gvʚ|}g|FwUWu_%_ꮹ;??>>;~j03ha^f_=iO~~.eFϤ5ٟYE_E[44F+L'iؖ|۷}[^ٽ-o~{soVCO}cw??ʞv_vpI<gOZQ}g8s,NV D읐3#hPhL`|(,szֱNܽLY('qΈU˛) SIFvcp}'|o1'nc'! Ѕ om t0R'P!xe)q=P)Y;A#aёB.!<-"[d?*eV0[#X ^y|eZ " e9y8:{ztwu:*oxoJt~ Z|ҝ8%a42]_oxf 8O3]??{䪫^S?R?sL۟u?˾zOONxDw#_ӯ~k^ɿmlu__9ys>!AmKr뮻oL2ܱd_}7s?j8F:+__ǻ??N$A?ODeۿ=tBL[[2hYo9v~?هNwN}~jdoK^_{GgEoD~~*__''OI11^8cm_g~gv:\.uԄ_EG[wcH:fMK_˯//d뿾쩞kv o˟Kur|(|wf`qƀq~$Hpj Ò }<УOA8qPr3]xƵ.r?#tԸ Cq݇#ΊY;8DVS|3_+";$Y}q̫Y6F4S>Uv|PY̻:q_=78Y: j'UKi!qv`UzwfHfER7tBp\z ]8`ciP[ɛˆǽSr!Sh J(Y¾u?{S?#(0?ʎdLcOyNB?O0ؽE//|m:G~Gzyko>}.D\&/yu 9aKh&OO/XȒ>"Z}~w-_.^Th\eݍL)MC-7kh|gw- .#D&iWEtɵR0@;wFw.No9ʳL6^.1fTJgFgri799݇~F؏@yNF2˺X'j%O_nt;F:2ujI]t<6T(AV~cYOk6Wd2s/Y^ gfʟ+v_+;ޅ+g>? 9' 4#fG^UAo<=}kǗX`NqϠ Xn*%`*ؑC˓s.62Ҙx#Dy(qQ9R:%wY RAgSoLY!i9˥ћ'*2mo5(N)Oţ* EnPE2ŗhV^<39:=>V 6JQx92&Йz2mиN'##o Kw+񞟳41CW#^Der߼ZE胣S,4lIypC&FV(' (l^;L|^~R;>#q vqzFa^r07lLfX y8FEx w 5q6ċHmEѐ|?P"5œ|9M|I ixz/_ Ҥ!cn=Jd<C_Kpj$g#- VyοƐ`*(mz|;^Qto{[/~U4X;p+GGF~O St ߢmzL4GGt>1oNZۿk94Cjc$_ȓ)9\dDvl.85uDF\3iIlIެIk6k^g*x_w??Ȓsi&2רY ~2\["Br,)̵cN۱Եvu/~W_yzNn^XC2 8N2pIjX/RU }E؈f|#sM(sU{+DbP#rSn6^l\Pb-tX}NybP\Yna"G?qaCTtҬa"Y%oT'Y&R`(ձѲ@|ȳW]1+J--/+b?Oď?>ы?:kkr0&; 6'Yճ֥gSϢfx:}_ k&gPnqyOm ScN9`;d$Wݷ~f;Kaq;{^G__5<^qUzUBݿwَ|\tX8%y>ԛ{EYp/h]Gi92aiI۸Evu swߝuc.vzЧ[& u`8ڶ3vSX׮vQUqٓ~w^}Em01>0|'~a8G·BBknzSi(;^tuvr5LZϨծXQy za#%[h?n؍ݑ7l8& "j3p/vnvۓL сRqڔ#:*&&v@ @/2..~OOX *ƜVfӚ$u˥~/:q (џR7l5ILS=|'qyaB.QicVO .Uwr-C|r s||}YU3 JǍ4hicq1M݄{58n7kׯIՒ-:_-Q9M,C:?w\cեn}>f pNu:`G =zލBd("DL:O:4v%2l[:OZl,B"7RD1Q#uģ*c˃z#XDdX* > /\ Kf%Nc?t(J];v@B&g84:ۓ5@FhTEGjCEsjFL#{]^Rs/Gs2rO2vhy\4<ϟ4ά#M.W1( cx8TFPS{x{Sx NYtuw3'%Q,l<@q8CranćN..dK4/f|p6׶'6{hX;(31 Dڲ-O4Ʊ 6ZEW`V,l9B7q(cP' &kOWP%Ö%Ee#/MC#Q~` D^q8Orq[U'avo'ǩfh\3YHډAZC: $4!Q)&u>XT, 'ZE6EFV9OYSN"Q8_xMNtȜӡ:V1$"ӌQg>A)jsqCFȅJo} [0pkeڪ]U&kR䔧,TT+OSJ\^j㥸iQzSڇ>s0FQTsVKsaa 6|h\1-4d؎/۷^Kln㢏oFeKA?g{~"4@-ӎӻTLk"^11!mKc6QGn>t@mOxZdr7tx҉#24>H 2ajxX2n9,p|Ο98sS#D*A"ZzQ8S,`C8UbuhYFՒggPJ匪 Ą%6IO"C12i0'”}S8\fk;ˇ{<"S`B$n : y%bgbuEo#v8o8`)YT֠uN#Xk(-]AÖjbߙˇ'O$jE]Y9!JZZ)lR!+Y ~8Mzczz8߈NzFEHC/x*|raQZ9?JyKHIv HSƹȓKne(Q }$,2oݑe5Y ^Z+&$p Qk 8Akm!/qtr%l.֖g*^zω%LYŖ>!g8}עRD9 rkםc)VAw%{)~}"DL^pJGv,gbyz1#nVO4;ô"Zvz jO۾$jMXVPͩ.lmipҗt\rrҠ.xȆ18? \!3@6i 18xL3WȌi+ cq~@BfL3_l(ӌ2cq dC7wxo2VGWixy4cGCVF͎cߑn7!_ cM~ 5GDxBeoCgn#uRקNgt`),t&wuwwkr&!Ҵ}p^ /bA뗈6 )/9]=C&BIR Ng FѤ p@ظϣyɎQN,CSt;O o5N 5>hLdTB.ܡ:iZYY= m`,:VDrSqR;VGE8>V-æ(4ӣ:X{ЁLi:lnV!C'm teq{Hzz)~ 'd<۩6lwiV>ǟ? ǟ?~Fp G.MqbطFLSKAVRuKFVصFF0 Ej{,K\B[ie7ua O̚'u,u:X͋wmk|wvTDY^fn]uˠԞ3ΉY7?K ߳8C|li}1KYۍvoQpjTsSO2jiB9c5c}'Sio{FW(hv"GR:Bh7(4#Ȳ1"(e =Bc$uaC"N4SfucmMKMhnasBv OzćbZw L=ҟ=snrԩsKg%ьҸUocD$_=͝:KbQoH"axK(g^V@`=mvaJJqOQ.i:L).8r Amc \5bدUlz3z4h:lGҁ2C#C 6k; 'mt+ShA]+N.SlSCV8/ 8t]M2MVM7J EM/7\`IO l E'=MpӚ5Ni4[pms)vMMOI" ӀZ.GHe*lq~~}xM{{]׶xWXQy4?F ߚ6 n6);ӷLso4HQs |0%ځ,Sۮίgà=wq'oU}wRE6LuuoGY9tW/\Wrԉj=g{z z78iz3*]:`m#OU)Q'& q"ȓ-]R(Jc된\KCCA2廨} SuL  Gy.k h UP}BpuRD5EmDjBʧPc (^N*B FQ#"]!=tA9XU ޠj0Jh5g8|NsZBtP'>ipyuG\rT^H~$MͣBĦ.URæH6I":J NV + e6KUW@6|.;$-Y&&#MvPevVO__.F0GGp˜Ο~>COoz9nTC@ΌHx`|( wN`JM.W *p0B^&z;}6. ev\a`g'ly)'gEK-L9tS}>X͞삍īEX/8G!t*\,]r`b;3Z#"tΘC\wxu?p/Q-£1a  sAۯAmҎk\]:s W3-ǻt`dGN%L wQ9vğ2%;h::@Fbx9š'ZH*9݀"Y9<󃕇TNkF 3:<<ԧ8q:UxM.aJ/N _9Ic_)E|GkWzm#_XT[:9Ud:3:T*5R8T7Cr[lFٿDivkvWycߗoo}AJ_wZ&e;kA;G;PpJ3Ƃ*SV5%=|F'>GN[qV)Ϛ(l'6c Ce|rU^*bw? PI#S\WXO=~bLG1}6VW|Q G]^FDl ;fOJhzrП) ,^ ASѨ“OKiQl,d"\bDKtH<<-/LC+TY`N̦4\\qDqpeO%$6D7T < wz$x8嶎85#>5LFtt0:}1Q*H -z.()>f+oY1?N{U* 4E8 QԸi/ESTWȧr]r/OלGx)y"7NQˉ߅7<˰}*Dd*cQ<'bDYn>/<{ا>-O՝#?*i2%C|~^^kQGʣ0P7Uu Ƴ>QZ4X6/7ta>p>qݓ͋޽!{XLf.xOXC\N dE#<85i^C\f eo*?.\Q4%)~ '}3(1 "- [:drk*(f^}bS  EyL\?qwJ'.SHpe:Opz3<țu4>2BwJճb[v1 o`<=iХJ詣:Y80]VU^)}aUy|4eN mQ)ZQ"G~z]1u''\;fwbGeQSmd[a^$ OoE~ڵ>G@`xtz@MKJn`>/pp = 7py%K{D΅Su昌ϼϜ;zܝ&k,NH=t; }8:]>p(4+O.Ë1Zqb󅹑,Frn8bcY6#=㭣:E8a)T3KpuL[.£F2LFKVF ;[ $ Xs,Cp*Ӓ:Y.?_[RJ#5౮dž) Z~K$ >= ,&C b6G_SiVeR$8ꯤST}‹j5yz#zĶ5M `G}1 W=Ko*:y78Nq†n;q $#XTР0Ŋiy.4Th}tӾÒʍ۵pp,joBS~cV#5L#HX!"hd!=5:+)Iޅ %o?gtW?yynw5W"2QkԳ5ք0okyԉo<:Y\]A> :)hy7ίOeH&X亪գlxԃ/}ga"C,&`-cTt p]|>mw[f* Sgt>t+& n`Yk6o%qm`K4i 5d+SEn'PtbuvhȈUsr:aSb~ur_2!o;J͵sA& )= wmXDDVFY6~R[ɀS ^S5ӱtgZ5EImyJ*K&7|?]`6h9ճ2ӷ~22#߬Ew_RC?Cegg qTyB5uFv,uƸ 8ۮ"1Gw=ki$FΫuݳ[59rkz6 ";- L38wn讻Z|lrCobuC ڏeX™Ks\. a(KݡG%  m3 뱈.sw0gt#r|!AkMl`Bb3K7X |e:m#!?FI qؐ 3,'}i10$*"Puo's1L]@i>m+8One i1 (VQŹÍ?xYǹ!t L#F3VYH t +z t@kF&#}=z, Z쨚(b_B aF ^|@ϽxX r_7̗Ki| O^{R6 L]w՟{hR]56'y֔)"яiT@_uu3̎" d{>);:Na|]mݖDqHgرc];9yU=tZ=l,@ ;/j`gh]<),"Dm6@  (X?C8qP]NG&>g"~"]2uY3ŌG9fˆ&,ǭ^{Έ )Q>M+|t&VZ&W FL6@ r%8D5@ʈxbu%֨YBOUy{0KnzNܬB*g#6؀?  &|6hg~c 2Ad X䤄jUg'}Ou鹚+{©S~ԩSa VPUTM/XoSIs'w"1f lKȂĠY}sXBhXg\Sh:543߁JB>E蔏|W*?dP}Yn3M!cyh'6lؐN8(+9[2u_,gbb"9yr:xroF\vZk_h=/ʣP& wRE^ #M,M|Uuw1¥SN9{+&haI%ƶ۪lo m=U+ÝR'[}j WIw42yB9Ԍ4 xbRۂ p;%z451*8Du`?<ĸֲ @LJ"J_N֎5s j IDATmUlh}~n2MT{UD^0wZ1/x'TqpQǠ[ׂ#M Vi0IӘJSe(Xo"p!Uv.D^Yv2fI #rs0 ٧LOUX8pSm'ݸ>EI#_T _O;pg5P]?5ʫsLFo(,_Vi[&K\cZChdY?AYGWns}|:X+ͼ:鞷K{vޥF4!Ȳy yʷ @E% ZJ܏Lyo۽[ E}0uMC믫\9YƔWrN#7axxiQ4!-.gF>LiӛF _-yL.`c*OI+p LI qz&@sIPA5dI fua]/LujtÊvP81-F5BpjG(ޚz[4 s. -pJ@'? 읔tIp m.g5U i:yBn)W+}# QY {,{vU*C{Y'bb` P^`:J;tQْT|y]yy@ 6 #!DKUΑe@ۜ?]̀V)5Z"vJrQ[Ɖ)0 '"D mB¯(/B\)ZGL F]YOX-h4 +-9&6={Lb8e7v͑uIMQkN_ @P{|mN)`Ю k%H)>)An sm%M~lTQo9H7QI/ebey碌w͐=[hW\?m ) )L7&ȨӟP _ aKzyAx)k|w(J~SiP~i*rj*e9ol]v;]J;/ 5㏟gۈjdtm+ZkV@@vI6mJ?vG_:|s^ĺ{ؔ@*ϳʬXF㟼he+тoܚ}ғ,?{lqGw~TZ>/#hUѝߦ/ Wr" N׾֯_8㌄EJӺdT.G-$Kylh7+G~FoBVKZu:Io1~xaΐcw8^"0Ր2Iyv*[$ʧY >cc{_^oXFY]N9V^yC)VxQ!G~ސ9עكm;Pr}-!c0m"[sZ@jB$OEKy4ʡ4n4 G׏o{&Xa6ζ4Obmv޼yɴuO]j%_7' áj2 Y1=L2)1~ ǵRkB;$P4q/ Sʷt5's^ŗ\V]re7.4vCBN! V0uj˦FMOOPSu>W_:<_[=U^v҂)_K/:~:ץjB)e9/3(GʣQMR.f!3,cc(WHꫯNsN?Ä9A>'[OTZ\kKgʴv|'R~l7m}m,!\svk".BG}*"Cxky3:<t ȏ:ZUE~6S8Ɯݶ+`5;7&(f]X,yQ[9PO I=W}#;@ : !4O iq.0/0@6A3m!;G\_.##kvA;4%d~^X`?xM㯊 NT,KsوK;S%EIt 8tb @Y 566VZye+pCTZ$P0 eƓ( dH78(W*⽒Rkhx >큧^ ˣ R&vڒkGLN Ҏ+_y?3m6=Lu Ǟ4cM̀0MMN jb[gڒ*/U $?Eԃ f.lwA56>_NTwܜV'1^Gc5>0 Qgs.|ɠ$xk@6AjӌJAx@ZJՒ"k)GGq\@Pֽsǝ[}g=iY"sկyCuY/=|$A^)OyJsΩ^ߩvo1.(M/oWxF³uw _| ^_\:cs]ܟ6KK_|DO?z ųNk^AS_>:=VL3V2cyQuOZ=Ӫ}M>tt&[p‰m G?'> k͟WМ[}wȷm~:_cX3ΉIvZZfMzJG<^;.}SJx#Ĉ37?? ZguVWҩ4xg~g{q3PWo]G&7!-''#4Ei{wxbp˿km :}s՜~Z_җbd`mC״5N*N73کn馠W3;yǯ7Vc&7pܥ\MgO<>c⎜6 Wfկ~k6+%eH8]8x:(O$TKQZbƶܝvO%_ǘBofTఆ4ɡ??UWv0nru$D^f6Ă,Rdi`nb5U/׫H5 oS! ncu`@ۻ18dJ4᳭+yV<ִ|/;/O5REIŁ64k>bV[z0mnbJ/xtrE|Ї?>%ڲUy}?>o:cu^} ['? 3m>ϯ>O{v ]閛n K>$suھtOO_gN7'>m gTOx/ԟ7g뫯mp??beK2ǚ77zWj~`w~~y6_sM;=Nӧ/j}.Gz!^U{뮻'>DG<uzo<>cʟIa˖- Nlx+>Ơi 7ܐ~~.<};_$Pߺuk?Ӑ??H "myt`Jۿ7~7b KX` /LJ?|tԏ,(J xHf3?iOKDcyG.Í7ޘ~:ε^`@5Cӟtz;$X5qb?OYZAQ[HNU*;Sky?^t??Plm`s6/H[J-k[TY(/x] Wq?(Q/"hKg}Y~4g*<bW5^l<=]v֭Kqz:CIX0 jlx$6~0hUk֮[nYۏxĐ6vHHghkmf`4< pB;(@lлgۘn VAuidHGgdPf!ݮsNiP&/kjrE;O5020xd^=ZYK[a}WT|5 JZW]W y}KXC@;-C'!ټ̇-tx#2h؎KBA"> V#N&8 1"N ƥ\|l>򕶼5PȳI'pX:_M)=S^}5\'=)~Wom׻;cehJqv퉃mӇ>p>uj0p~aH= \~8| ^=ُҵ{OxЙ9] >>7_(wz(yfد w<8Hn_ѿ[W ` ֨˻iO}jڴio_\`4 KT 2Ԃlܸ16"6 \ 5_-G=*m:cxx@gHe?t'].३M;$=SO=5g x/Ly{//.S͛7&E/zQ68oPկ~uh~>lz T)Cɋ_bҙg}hd-#35A/A-ed[Q`EEK>]:CwhYK5yMg`6 (lX%dU7D_P^:ii7hQb-8=)4W 5xoy$ظͲwcʨ|yȔ~iƏ[ ~g Rёf|!Ӝֆ0h F䒋l{ Y.K'oO{4m^Z! ߽ޡzJmqqMM%2³}%8բ*zԮpWA-Z`[Wq=(є5-N]Jb&SgK&K^ R)??M.ۖm(j~W~%lQ;T(mv:;f=Ai*ʵ.s_Gy}@ya%;ySi(] }i#NB;V UKYX'^Lu`7nB|.j-\ͯ,ֹ/do^AzYq?#t/gҚk+_һwJmo]M^  jÆkVZ'fpxuǮzm; %) }WUCSP?Sgx$P %meB)l0ӰWZMR=z4z*|1 v p ei3 /wZ7^seZ;ps qsLut=69v#;/H.}u=jv+%Zwc'1XΠ,\49 \jux)_`D!9 40!#ٸXbA`(WŶ+o{{G?w,2xm丞is4PT1׿@)OyZ}I?z} vuҎNuԱ7n5i):tCy󢗼,~e_}Emk^Q|#>|Ia9QD7g<1 IDATbTW͍S1NHR Fcj|Lro_5Poxb*M =)_)G=QS׾6i _rԎYd!/%[(^5+Pח5ھ"#Ԣ) 8iyh7#}ZǶ9n<6Km^ept̀>9ŀ1E*c@r9# "0+'!4ObY;~vlL9zl8<:\Whvs ;hfиaJU[Bp+9>F T4BKS؀b'G^h\`,5˩m %Ή&/H]Q 36,GA[+p T-"Ab|0Bο`-PґsE$]q%+y9ʷ hKK lD ϰOJ#C: ubOg>'=W=3kJɿ>U?✟Irs7S}yssaSEyOG>Ǔ響3*G?rAr'~l߼6rD}6Tbp>bjkƍN/6_ Рb?3 c;q.v<O6mZ ;h^ p;I7#m_z^Bw\iw+ɿyuU`| ~T+崖1$yP#*Ce:̲uOa`LyȮhf}{_ߡŀd?hi)r6YI,AbV P3F K cc< {]J3ig.RSu %wMIX9i[q 5D\cL v^3q$+y!9D{i}7_Է~TU[倀j<(HAn 763L; ~F?^>kcz4+FL݇Za 4Ca0pS[2E a5 cs6 z͢Mea`5v+/5aV׭:xMBkNϱĚ}\mnRF=VBTD93m Bia0u ^['W\;DX|5<8L{)>:P-Y9GeO=s{^d±LM'9ُxDʡ)O~ ژ%e ,/ miȱL5Sw >g:MB5jAg?t4gׯx 3XAw%_~ģțG?_~lr03;(*ЕjANԳ7"Z*گ7M6\Ř^;"# -FvL#vD*6it[+۬[h򐖣 d;jkǵ]m yaŋ[25Ƕ:ى߿I׶9ڂ1|[I&aKݫUq_r%$y;NU$5`/?!R]yd@3Ezi80,W4r1 @M*_Nj|z-5/~Wvy]s:c3(p5S;&*k F !@+ɧ1A@[&N50ԇ1y?/Tn:To1)61zh*}=IC 31]OLvACu\'n,@b,q`c9bP|!*nMi7Ak"Yȳ@rKzp h,!wmfX XIT+ 0$ wp6,Nd#~n }5UC9rOsz)^P'|R~ݺop4ߚ; FGGo 'WׯK[k<]8˾yub#V5^LC1"Яxdgh9 *:'F m\aE=/ȁRrg󶞹6/V2_M o4d|0ɣ!ZiԓWh؉UsΔ(ȉ؃c0͐ɒm~?{. s#偘B-Nџ;dPt_,LНjXJěxHkJXNll5D/ӄ~i? N^%@T6IF42zMC`XhLJaϗJ0miwL\z؆Fn1]LΆrժM 4G?=!7%2n/VXjl%8<{+(a_AAɿѶK__#MR%0H#B^@}a>J1֞bkGj DF"PW.soM>:ǤoduwW2Msݔ*B2*jUdg)V1v_q6'\ /(U +W] ŖpZ5Zx +_M7f{X|A(*zN<.-VLg]|7u7TTOme|`uas U!SvPjtY t@ 푢f` Y;$FB m*<0䡳R d+ezfƙg*ՀiRcq`ȭtly؞j74XЇvJVTd\p&3;0I'BʺBTk4Nt?}BaTأxB/p0)7QSz V n~;eczeͅ>2PYO]E_ jpxv'ia@$6KD!9W,R#ɮ8j$R@Q N 1%sOrb"5?sOC6ŽwKNɜV0`r6Q=lb;LS^kExv<0i׮qd2pCE&(]ֺؔ/I4G(U>Aya8mϳ*6?I7dZ~o>F@x#0B\`6C@V j [&/c(%zp=.S qn%{ݫٺUڙ2+Tp BTFeObѡ!!-9[Q s2HfJg&5}J= hl 496cƣИ-j^U`A#>/PD519lz'\~} v9HɪlK\$,5r.$.Cu5ӧyYݞq֫o[fRs %8+2P 8υiA~>0Kt?Y=uJ_Ep =JE fކt-U@ !VJ/rl6Z*C!˩sPi7*픹GtgYd+7lׯ]*4==h1 -,bhG/|U[6eU҃xPZ~}?SZnM}ʩV;wL6nC5cV1 vWp_+{K +|0սm:6B1-;) ',_Q K!6`Q,y6`=1 p@ Eȣo%Ab͠j|n}Z?:z7;@SӃLQaK{g:l0顜*i|x@yAXAҰµf#_/l0XBǍ':*˂ѥ6Ze .&LGa@.kKlEl9cMA/!A#x%BpFzʹʵuw%?J8`U0>aޙ d sW]|%Y|uv8t^gw2{*xqoxQR&dk;qVQCO ?M)b#yjr]Q&Rre-??Ϗx-I};>FPJE%sI/K!dZF2 ﻼEz ޜN+JJ^{G'&u/_N1j86Tu[|5IOOE[h:ncxLa]|!9:uE>h.j M% coQbi@?TqV# \4&9FeUtLjh@O61ЊHa Q`z )N4G3PO>=1n3Qc^hׄۑڕCJ֦Ujtd{h3GSSv\V[tVv@88|f(tV},o'msMGCHXlGe\ r~I>4s*\yyh,BubZ@!3 ňWVibv8dN\!&m(2 Ѯq(qF>go> i^3Kٟ%d+(p?ϩ Rܺfd\'eH y#R-&< Kf\9rq[.[Pr,{+N;oߥkB#@Ej+CC*2`0Ҥݫ[zt?P6n8 T]023u޷`;X7 (͛7QuuUW1:gKv[7tsڱsG4sscx&J߈Vvl`E5JTi`col ]ћt]ynUQhoOuXsm#Wa- Vyr_[Ylk bp{WëF >]4=IR>k*Zč8y sdl@ri)T 4z6ETDa'R/"N_#_ө#v\ `Zi bNwUk旗sx Y ?q"Kl* mۑwú'=:JIHBŹ[>H1uyDD|֐2Wv;)WO:\ OӐj.s9⏬/j[YPr#GT(Y.u,_z~yyynyO {9[|G?ң<_AKTC筗R|Q:@ KhuRfh QlK#a\R?BZ2]B.8{鄭xT:񤿬k qw<ꁧ5r[8ˬéQGPMnsol;;9QqPI5D LUר `oGZIsQ a&P¸9e0I!s~~ 62vd5T nYWi[?+;jfe77Va( byCy M"аܛ20OYBOtڧs5cc@4٢|m^O$T"'[k \?d"OH)`- IDAT,)DX26jV!zl~;"Qӄ 10>9weI+s0lƨ& 4,& 7 @&9.IUs_./2YϠ-kK\GA,y@ʶ5 JRϑfrpl h0Lʳr6.#%,Giݯxl^w_Ģ]K/VEqu'!p%fɁ`5ꎣQ1.Y&[Lzdt1xTԝ/_OJ=zzzӡiS:ci.2 GbnU;wl6nTwܱܗSLW]u:voo_=C gbiWN1RA-G$qԦ! ;1"o⌕ы EqO4?s{^VuoÍ0gș齝wavjΑ6s1f]MfcxD,90CM@R{؞fjĊ9%(۹6Omhl+{>:'e 7<$\֯f,R ثЋ2kaEzBAڶ1NA`D @ <,TȿW(ӡ^M2rܪ=g@(fZg( Ha0}t %r&A%[%iJY #-qxRYIRvrrisN#tǵӗgty,qyK[qd\ 2i4CkZw\[<%OIo-iHymn"B9*5ם&w)$-@*Y}^*ky{<{QN0Q=6l[m~7te k״qƹF5kC9}DK:5\{sEK'|ru^@u2@W^yU;YA7[mצV 5P`EBH1àF͠3M |5h-p hA8 ^8w.2\-D=T]NeڲWÅ='JN&+?5 P-!`ff)?+ !OA}DpCs(Rohaxgk;s~ &_(,㜼ob41>"/BZ`I$*.ֹ\~Y~)\-ėc_r_%r|y,) ӎ]K38%U֮~&Mn{ME/* {-oct*G:͌R^57u+\GX~c:6 <`X=V_vؙ?x~25@x҉'ɸcN:׸[oַcA6>LGjbr"]A)ƪ+l'C5b:3pBDCb8izR'&΃8)ȇ`{z=/, }clI+Cz ѓZ*Ba 25Y >e-S<љ[AQWq3\/0h. KRI@X/h|b>\p AA_Q%`ВWH#i,g>5C*iQgX+yl5㬥!hB?@V^iXj4? 0< &8+cM+y/x|)Ehwݿ7 )g/"|wWA/*S*[Zۦ)L)n$^5H\iNnT[H;F(ؼcPaDbTvNW;O<tj0piáVC#1-w-7'[BV8_vm*GFVCP=p2!K<ű'қxn;i+uo0=(73ӛn;sl2R[QU٤sdb Ne2ξ|XB[ԓ[8`&0c7M2F5+l(KJ1bs/-RmR2IpG 3Iq/vDT#|\8t|!]a[qνV͒յ/nIg S|JOtg-]kqoV.s0<{WjZZj?jӑnG+GWV< W6NW^y{ᓇAcgrk.]eK5=&lRm8z`uN?4ڛ ts!\UO{< L ekp0g3]VW{fwީzU.3`9!hŇv]v-S#W1̼Оp)R=)`Ml4F 3ˣa@Ti@<6f`g|pG e/k$HވFE5ҷFlYʇDEugl;N JMǮPT/SW zYGEkX]Խ`/*m-l[Q*( 'ӐHm&D;mT}Ӗ{R+#閝3Ֆ;|uN!Pפ N'AsLbWdr_?v~( `'nY y>nq ߔo]ei}F^ƕx#my-*gNnC Z Ly`hǵt\Cy@N MP7A6LWC8p1FVͥ}͛{uy[?^Z5Wݪ7oC> =kgf뒋/<PɺoaC ԠNx PdM7v:vcUUܒnδcu|zw#\PvUuPUyl-{Zg!\$ݽ#)uXYF&#}'jFˑVPC (K!h`0>iB7X<Dny!)h]򊭬Ƀڙ:³F{)HtܿF Σm3M>(hCCW  :hlU l{(*/Xf;{'P M$|vhlgܰ7=xr`v  X+ AΔ[gr '(rhܢ/s{ȯJ;#i6b\ye%(_1?XZ,ke.)?gg8"N?hUZ;_f&'Ds3η#jk%xiy$ɴPw JuImfC' nOOwH Kשy(y (K]vY=icLڴMWkքMUL%1ArɲSN׬^] 716exwڸqSlG2ʶ!Y `3!<N$(nQ|GlyA*g;0POMWsժ3isd}"cr7* `CRi\p^ h(6ICtT|PGLϠ$Sc9X 5u9zs{FJu;4 D%mZ,{)/u_'Hyd=;2ThFD*mm%Ge} b\ZQ5.46p0i;ʧ 2cCaҬ#T>F˚/ JJ3Z@^Liv'# 8]<Ȣ8 kޥ-_Rž7bz{ھm Rӱ8v`/Cy9wiSW)"w˫L K(uKR+ 1oiڧ T.@aqiD% _K4}d5|ȏ8~[A=6mJnb!@?Χ{z ǫ9+I_|I480X&ħ$;]r%SLyEt+gcYUb;0 a؎ _'c<w7%y/;H]^ [V6΃a} )͏8@Obd ^TThTy#N(QFwA2&zTgyP'o'țCYhU4kΡKjnb/R/Ƒizd{Gl҃^~-?Gwu_w /_ߢҶ]i'xLW\Gvz;צyODxqϛ]G',Ll\7"VM{N3@S@Sc}ROL4* |y:N=A6U!vwЕ~G&}z՝QʫxA:քR'z^ru:e 2 PP]5\T.v7J"1ڌ|Nb這VJy=o:F)tfutqc\f_- j~p}s*4EłE8H< : ;8r|CV lFDLi?TS@L D{0 бjZ Ai'%$Yso(QFb\GS0em@8$i8E9:A|h8wgSWrN{,u2#>Tk DXnuE jhC:瀏L) |0>9N$aI]>.K'R.Lgę<##F̂fMاˤaVTMl%{R !sV2jd}`BdzFq0'-xmX cy?\ Bja\?H2[АGAKx \p6~=U+)8DD6A/$5  2(&I^ͨx#A&G~ ]cqed5݂?/ۈ4:r~AG$rqnB2*r1C( l|G)_`o0lò%sYx$#X؎k+x ncW-V|}f&uI9 @K&*VtL+% ɷV=*4+(6w[4Nps3&VSu~ j>=ӎItWYM7[v"dj*_`V'Ĕ6S3S.!!N3W=v|,iU~O9g00r`ǞE3mKZɗ{r 3=Q8ƨ]^چxc1Bfb(=DC(30B KNaYCPP@*2u46 @ W_Zqjm9aj|AC aʳTaDDR5Rn#0yE947֢ݓe4{ŔZVByb%^]R(Z+Y<}tiP!mTh䑶*7a'ogqmwsϡ*ǴT`O*'=w{AT@Qiw:R MZ.6۰%,. 5O^IX4@ͻ s#R9-WqKP"hŢ/%O3R p? QC01͹ivjG8?ﲹ)")6%N=n)#chWv gZ>YO=9_"'&Q}^ 6ǒD7u;e).j#'9˴ϋy"_*C! sbgyNNz+TE+q2=,)3״!dڦSO=u: /s1z;g}N R~+ґ bkj@@>zɧZi0vb 9|8QN=l5W=Fi9_繡\Q;+N$kqPxF)XN- >4W[ִ5"^kӥ,"YG?VC){3Qʽ9@,]o793id B ~xA&SPя|$p!~X?% ޓNr(n<5l9m*vy9H,mX&Jo 3>X%$uZɈGȁsnu֦7omJ{$g`B׸_\+jtY?X0taI<]k\ +oK#v[ngKF2`ڕ9K %-F)yON˿Z{ }*jW{g#8"c A[J@uPK;-x!g&ՁOMO BChG`*5+1Df')J`C q6pb;"xt+hlz=h@2a ^ IDAT6 ^#=gzZ8G?fq`;-U&j4VAX /M~3_V\hn!`60ӱj,ﴘ`|qV  nUUwNŕeB-Jk^Gs+4ӥ^u>U6}A9aMCS2u,_$CǏVbǾ(C!ھh٥^b"c ܧ\R*b9,K`Y~G>? ORCY;i6*N6v iARf5D!?"U2t",&bQE3rZ`{T^IlW5A_:T@ʯu{\?-!8Oan84!JVokh?+x|!l(sHd/@ ތ'1FQpѴ1szrX3+dFI%X²Wʓx1Kw/`K\RSzC,QwLY|7ӆmr+ ˓눳^ }˯AJљW$_f Mc9,K`YYy"D|y`ʱx˓'E?6 A;ҋrΦ("KBm-f".* WƱoNyiȜJGGy~ʕzeUojG:VjG:~LXh[ÉjFFq<4Ñ@Q.H[L/ ferSR(bA[ӌU޺#o R<~oʫjZb`PdXl-}}') UWY> 0Orr)#SF\dKED آM[AC33F@-G~ v,+NGŀ46Hө9{k=~'<ꬳ^e%#_z_=z9a;T+:mH/Tg!./ ?:/va3<>q\q4z|@maY(ﰸѶ(Z|u9J~SEmlZu](2++o6yk; <3*λ)XRWbyP̀Kz S :A^ͳo^onxͯdÏ3%U!^3pܑ4 c]dV$הj ##dh44fGl ~mC^ ]bx/RɄ6}뻧wncKna YU45?°yh$U}@sD}[4j^@D})tWCiNoIb$~)j| R;u1+OHp4.e;=~w_-#@;r9%hQVY}N:,[Lg>o}K~ϥ /Bo}Σ}u^zh-l7/ e5nO:1}qS'c/@=hd:`p:]oIo7-n uK yF H6I0^%JlB@Kfp$[Z^|>ߪڧι~~%8u9W~U/|_ߟ~`x|bF~˓~ًMo +k;7M/e~T|w~'f l yԔ #?#$ i뻾-I:3zի1WS÷gc[z|ٰ7|]b[XV{I]' $+RkI_3p=ϵ-c#0ѩ$Rj^f{X mt(=W^; &gΜi|!n ~C%3w- &4agk@ٗ1+eLT.&;llG\PVlՎ jyr%E }U}SW;@Ɂm-NR7ǿjG1Z~’^2RhDLjeq3p<6-A:-yn1l{ 3LYd590"Q|Jr JM{h:>b2U)urq93]HY5#a>9Pb4N%utͿ4y}>s?78__N>9:/2]~~s_%>xmkK_O(>{_e Mg}Mq&_/aܕ?7/K^b?o?Sb˿w|We"'{<Ҕy]$9>5SoA-l笀䧫nhqV~0׿y}ҏkkC_Gxhu:Ih!ZG7x;6ƿovlz:;Xuc%1\\o_=\ygIz>]z 8&'_é:sRFF|O^]Os_ ['wP%37t4)4s9L}% puT{lZ8!C ^‹Hp髝Sۓa749*Gz7$_>dC#=ɘqS! Qk'DvLᐰ!py*"WKsMr}PQoLiVr_Zӏ9+D|J~qG8x6FöwOgE'1%"N`x:(dlmzhxS?Sߞ I^/{p^4o&ly҅?)/?xo&_xϫXOdlE_ïWM~cxs?n$(3ׇ/{WũDp>?55O >9η<}qDηm~| 6eNuG,Kr'”bM~[6ǾhTs-}z|]ߧ^[W-p+hzqFXמ2ZNFHf|8Qs4Mnި/e@rlK=2yum G_;!:˹}=w"k.<‚[|p2]#}p ''L?򌲿DG_OH(GTAO=v8]6/3>y''OLZ _Kx9W={ iOkgן~~:nk _~M[e>ȞN5_6}'|R/y_Ogqۇ7 r/4vǝZ/I;} g~쳧z;stZ+p"?|ku--ߒy|wXsu=3{Ë^_s,|aFTƺEUfeX`W`$5bOlh!$10{um/UT#EB;Xc葑u#J֫C.ňU7MrSw'yR>yNoꬰez31y;rc'Fj0cwizڐ(]?O1@T"ԎBTO|zЁ?=3a[N$\/GCr?TBQCu=ؿFnPܔR~zyHP~2:dpiWc X ?#_{7^=8]4ShW_ s?o e?:/ L^_=ïo7){/%./S'=o48?zsJuKj!PGڪoo1Z 9Uا__^Wf/y_uJN luZꧥ|'&]]o:,3sFZ8@?NvΎ[U{Y=;H2ޜ# 4Eڱ seȽ"_q]ı`QPıqZyS䫯&44odwݵFܸ|Lۙ<[Co 71Y)lL' E]dccӓ''x"smy:-֛5^Q m`iS81x; "µsQ3j:X5 T3ׇ%[eEc aebSX(@׬?G8ƌLnJJQX>6'F`dm> Yڤ=(UQXU68.ycgo=7)| wӾأ7zh \'M>s&l0rA6x}(O}>vϾ˿{y:S|jz;Ynpe鯾־I= w _/M爐^~پz?mj? WyJ~N$3ӯ S9W]IMG_җyx*q,}/ƙ<*u SYZX|""Uye=m^%Wo /9$h{7 mMz؂6coM|D~$G!c LYXSӤ#h+ QYpH.5r`4[<ڐqٜ9pn >! 9q5@mnַW0ZSD'ׇ]S76~t;sҥG9ץ=npivECn*{1M=xA+ydr?rbw)5d]/œoΕ^G׼5<=xp{9ϱݫ\ ^o2ħ~;O+ pluB-7 Í.û>1mˈD̥o!]p{- |_};\[j3ԟQn/({>$'/lO-Sj42+UJo|d&k&B:'! 3Lni("OiSiANK86;yBFTiײ/SBSo}s ġ`798lH$/[Xx[ou^J)W"@w0=*:,RѰ2P aA9?e&W.3X/1ZÓaqT-ařBֻH<Μ#Gd[׸( ; b85< h '@q2G q̷zm/3HG]Iu 2S}p,k,Xܼ|quSmQbt7:-ymKhM^}bP-hCz |S:\q/r9txEE8b+ϭ|GG=%sFWNJ"괛|-Q?M̘ǔb- 0r 66&.^`6BX.KkՍlT#ѦF蘨ֵ+:N F@Z/]^ۘLvue8v %Oh sq*SPmKѼu;ud=FR>X+z-:\Mqk}La}^Tq[R 磆~-{E۷hOZSW(jȌa3w -oN~$='86\z\y>DH5n|xbMlp7(ol9b<5wǜJ IDAT!bIN3$K$ ku9D>ήѓ׽O&= O6so&: &HS(C W%´7\^<`Yg* ;*=.q2bBȎ):Ts8G:'a(_:{0ٻ3Ŗ;Wvyt4ET(">N1SJ / Od\N F2+} zNFn;nPrHKNAMHA\.">Dy$~സ<ʢ]eSXiupt0XIjRj 岖*e#:A貦C#MF܈D ^y5ڻr6;W:G.hKpv/t1|j*m!jXbqK깱x~E[kÙ'>2^Ҥ~Se,k~%GFֳs'6ǸNHse> TnKmixfHCٱ3U#VqHFqNd齱D//?W^6G.;,DX+Yx̎|B_`{Wز#7;ؐ$hȀ&26fwչ롔/ekN㠱.jf(NW+e;t:QTydesqL_&_ʒ1X`DDґ*;$-m%iAx |SO7Fh/RXukˌ\c:}]ST\ V~oJCych|Սq| k''m/tJگ]Ƶ1 gwqѧo^__Rlɭ(s zǞ~׳[[ov{g O~~kpX{05xH΃zu}5\3 QK_1= 3[;{?zjBchW.=sA)/(:<=StS /%9һ[!.N)'KoK=\gv^#Kq' ~,o::$5œn3׏Jk̈{^7y;+Sc6} \?mJxV"Ò($kpETΑ)oOetQ8fLYh^;˭Q\3\yrr`tIT# g|1J1 O ،"m`}E-ɣ/ ++JcΈW5_аqעr׾(| qsk.T> ȗ;?<=>HtoiPEV9TD:6y;OLj>lI.m⥴k8V:h⮐ _w>O BNJM %c#w8DiR 4)S"H/bK z_Hė.^y; hRόmE~JNK29O TW .TѫNhSMo-cj!ZKP71\8Bm09I;eòaRG )>: S:DxuLft[$Q/(łGؾLC$pb  $#-sfaXHJ2 p2SEÞըy4}>^#]4}~oEYko>7~,p̱ վ -uv X:9סu=\ rkq>諎SȦfHi 2,"#PZ#FY#MZw]zR~QfҪYL|K2dz嫣:8,^q2էuܙ}yg=cϟx]2ٵjx͟ss:gz 2둊]\$6!d~ .pRQf,a@Q$ | 0_ _XpwtVg_'f|&YmHi?qӇXf2=vjg]%cB2_aT.9Z-[P2G1P9$iA=r&4%O›RSP_FL"\֤5\dXb>rl_YD; SgSlr!#CNMʻf*1Lhy{We'l)pdч$im;"毱X{cmй8{ZɯU v&/+>Hײ$^gjjsN[ [\gk/v6V:]6;i]0QC`]YqP;; >,-pS}?[ߞ;.3Gi_;zd{=7k ١`ֻRWzW^ 2!4 rOs ZO2b4VCwG$u.^\n5Yi{r|7 }sg#_Pָ Xpbd~YLf8.xu#/YSHW|$_ b]e˴"vc)hX U]R]Yߴ/} F(c,$̸B-lUGPFL$ia#nPEqJUkQƼ"(Oɩ Q^IL&W)1B ~a}*:[8L1!(&rmm=tXOEIv |/*0%N_҆riOQ甚Gۂp]%.\ZJT&NsD ^+^[V[gr$׭?xs\HJnrZlLZ(05t]gE_Y\u{,Nb%گßq^Bq엋v!74;X_ n^G)@ᕛ+Gzz̍Ԋ*W#HʮOe*Q:vݓʵWm{԰|pso^K4K:|pyNnx{nE#Q+ޭMh11st-rL.,G=jԲ D8w1,2Mg *zI~;ONrZf(=ZeS9E3jZp2n5F~a珖_9Ƌ*k{ {P.bڰL>uUѿlPpzbZ$c43D~#N`Ϲ|mʩ3.&Q2+iY9;U+iM7HLfp]VcptNgl&S [5)YkiQ5k촀c nɎߋh)ZX+V/n` g.&nmIy%2e Ru4}zT$rozX7JS` ȓΊ7FLFhڈ"_^p*nyQ:ɮT؅s#cW)PQ9jȇ#}]?Y5..Fu.ݙl@=>+^aՅKr 8U:ۣX6PRF~2@,*N0vcsE^ rq4P`ѹ@ M:Qz55t79f y[~]z״?u+b쳲?׷Ojڱn~7@h 1Vb~NzaJxFйss.u4Dr'R%N kBh>/!zgY~뭷iߡj|] Ukl2F[w/ zY8JCXdt&Ҏ#/0FBFst`0&I |jؙs'tZ,䦬z֊f`!ʽVqr( ݱ4°EA<ő)@U!(̂'btYH d;=yu-=^ 3>=Q9ʿ:i(D1Am&*Jsĭcl@$]$#7AbE߲?j~zr t8~v3Z-+G㡇Wڪ&fccS#p3)D ([WO䧛[D6yq }Epxå˗B*}dsCl+'x W`;~ɡ"OS!>gٳS'Y.({ L3g7@1(6uG߷U'CU`M!" NJ[3,Iv.Ubo"(zqqLM<]{LK\)'"Ju09yzf !,[0͂z#[:[v;;ů gx-?H 8~HJ̣ @pdWЍXca=uHoHӉ:G;gOvmߖݻ՛eA SlWĐ!t]YMtk .Jc(a1:$#OuD\K,Ya=g;O10֜M }ìvjh9`#\+N[H=G%-9>h6yJ9 EQǼ#i!CwПu[m!95hTәT΂x-J+]-PN?|B5&ڮ?iܩqe_ٯ"_qµ%{X[ <9qR=8ǛKf]!di2N 06:FZY52V: X$x}ڹ[αoSYZt"n5   /U1Nѹ@8k9,oln^,&?N$M{瀒@R2 Ws&=Gw;>(X D |1d}2v!SlFxhNQYWicsZ3zQ"5iC0gX:&)+ǔG:RѾFYO2}\zBӠ25kݰ((M%}Wf\ 4G/hQb1;+BV+SGU[/z\5ӿ܁*wyCnJv~Ly2*l< '#'WnwjU]Z^~*9nu>k8H,} yZzaցzكic8Broz땎g:WZzrur֕c yC,0p&P\#Jy^ _WUoK=N󗫐c=tiZ1hk:FW3U]xU r4o1gaG吖|p*4nH!8\D~.~vIn! _CXőeCv,,f/alXmeE_L1ڦkeU~uz}C긇֥|}G|'a .<:s)=Ys݂ 3o 7ENT7u1yMCT]Zَ6ij&wP_zV6xkGF~^׵m_EXD|Eh3zѢX[_ٯ}~>Owj{RTڞ;_+x(X3VlZyBc]opG3;MxHtCñoM8uOM#\cf۟ xF5ny\Jm 5"h<'ϬbSMA1''Q*Xp &E߈ y^o18Nv=V gLK[u6 8Y<}nXL.$}ݘ/Q~LjP2udp4M_gwzZW!NR.W^msU0^h+ IDATßgbMM#l>uޅ#(BeNZd 0 {mhBS&.|tjl(M/O?7܌1'{|kN`|F~ Gz2#FNd4wZ1Ґ_ѯ?]@:5ٓqT=FP#qc3snPe71_HX OgѶCn7[>u2BZCM_\:"EFnJ@цߎ|hvֆ]n<@_B- p 'k.^M2CD $$G,N1زljG.(WCՓ`ZwMHLY ױ&Ƽ #0)[a+lO %mLoŲe#5e-8UxJY8.V_XJ3+|OPKx+IƥpɧfoOew- #3c eDxuQx7^3n٠+}:ptzVz#!櫦VnGyCZgv[ٯWgG׉Vjvר5^ XA)/\=Mos,"T99J%Vh.4ጂ{z~=sHZ}"oqJ]C: >i6dc͜}l A{ͱ Y;%.{A19 f$';ۛJe0啨LY^2RfcTӎ=(;SWM扼y$ؼ^:>BeIJQGrLHOoE|jj =,߯)(uVض, !#T,/:p\,J2Hosl﵋i1xRRk|6^#NcpIOZgf<}*ߥ~'=@\oDoc 7ߥl\Xhy55F׎ .ڊ^#?ZxmuSCO D_~ ;5S1] |]zGDžn\c QGM6 uptfgtO ܸ3e0!XS/  (@쭞)8[lE綘Ŵ8f8RܳNjcs gWָԔw rQ V\($e1WeM/uVkHtC-r޼|@;*բBC:UM#m%~4K|iˌ4
n3Q/A{X4\ր?G}Sأq#ftSS_uY,ZUj\0J:MT)Ai(E iW"Vߎף8s|];菶~cjCU)k6*_xW='z8́jN7㦯7+*sCLkycצF_OTU>L.1VV1/3^8z ֨(?1Fp/2]ǣv2rdFVݬӬʹw@@dP/iF7_)8/о)j9D!u'🏶5 i"$c¾ϩ2Ggg)(I9GG&Hkd~"X~LfY^>~rU)rSʏ~|E !Z'L)ͲcnFsSW>aikiGvIweq-e4-ՎCW-Q(q:J(x:Bq(:ZH/U>JS{ŊYb޾+?Վa?%_ sCCX9G 3!sT{:v &IuˀEEmoqsV?$#hN OnjO>uYbcSx)B${Ht8[}q4Qͯq7f͕'9cm+ 2G+-<(4"'Os ?v(j;Q{O[6˄ `]EG_@/"$KHC`s5k4UR=_֤٘i0{9GE# =͜!T>rOq*Q5Gy%>?Q=z;J+mȑYxH ^s* $KVT0j78+DaGũR"(9]K* hH!͘<0,)p`59E!gf`/9p^ȻlŞ1r>*8G*EE_(?b?<5r;>XQ3#ѢNfvy0w80Ft,\sD hNtb|JuS+5yҁȋCXjd@Ήe9x߼w+gFʝ/~NA5.ΟK4m8/ym-(;;>];8d;`<'*=rO݉ :˲1'^S|( [&:j`b$O&A?|*zQn𗏌6ѯx7&4ҫ{%'$_ztsxu^dr-q:(+:عSA6>L]zlNq=94/`>?t㹦"%Ri}!uHy-\x C]`D^*XU6 ܺƙ㑰E.㹢~GU9|M>kz}P {Ҵ́"!rk un=Mo79zntYdԆ(ӔZJ8'͐o[\0NlNCe~nޤu4:N>iO VlƱ)OePiB*y˶S{å+< ǯԧVX;EGNnʉ@If18.W 17&w}mo{+ óMmk؜-x0}G |i-N"B$~OD f,"eȡ hnS~:XyRP?a2݃6j1X"M@`-O1WeϩrVi=Z_@-rRA!l;WfG<5{L,bbk"D?tѧe>1T`s}UdL˞261;2F#e'84VԘ :llDtçPʲ&k9.m*,ʞ]*jIG2&QYzF<-(Fv*%>umA5#L]đd`Ұ狪Vi{{;)|c2ߗŁdYWê|z-ٟ{vzՍW},_9* &4z G^q:OQ~$=8. >HF'ױr:)k.@5Q\x1<"2utN()Hƶ;#&Q$BlnӢ-bW=;/^@딛`F ky@6=c|:al pי7|"3,*#Ét1cEl&=㬧a'sM#e[Ƕ'k a.0mHQ[ ƁF#QWp&q `fϗݥJ4)+՜"b;٠.2uj|GIceʛ-=Qһhg<}?ѩi֌>q}Y7yϸ{ 1 =C+aۇ~u{hfa1.|u nq_g]68cQ;WNU-Kq{*yBp`̩{_a0pkL&'ejp$bZ.(ѯ #9 :&0 ڷ\=m2)"qJpZSւMSW#*(D(/VoYSoyBEaH_:x[Ĵ8KYحZ1fz:RSR‘rʑм=Μ>qM^-Y,\g~>ϝ.<<ԡ0PLwa]%Q=3²@ۊ|0j!^Ε8' 7wcy2e `OR6"le4apD&G@ }/EmR})Ҫ1GGt)Glav K1bNSѥ%- W IQR/]ۨGg5JeSNsIؿ(*${/UX*ޞg#M&}Ot )3oܧYHҢ4}ELj^Ba~Moבb`MV(1N GON4[XJ_)z"EdYdA :7 S}NOd?Ht8Np67ZTc,TeMc|S%YYN lYtv9=lQh3s!X9hb&`2%c>keTUtϭT$V0bIzo`V}En(-X+/UzN|85:7p˝}5N7O%?v9un١ΆǷqOQgO:9e!y%[(сbVy5뙈Bvqu֜^O: Q,vjxk^z14'}=ZҜ JpG8<̇' Hh{#l\`C+p=ٵC}ҧz)_~+"8ucM lrFE4W[9BJll< -Du<.IԴ_ٯv\{tsXʱ;|J4;e屾|Hĺ,& cqH Y{b]Ռ|SMxYٴ~w"_lu>֏8K#u:bFbyG ;7 uwN>?6W/_F7lor_K4-D>rGg$l7K2X3`asQ%˰gNc9~rgr2*Tf9c`EB%2טl~j6q*^&$Ig1Z}^@r,߄{?zK.֮Ji6'̧|"=[ʪ" XGɻ51Ш5y}\xansG,*dѬnhMz>90ֲw{s3=6# mlmb8+j'wꜩ:j++m0i3Cj6 6zoIa3ѠcI>Pp(ME^Px7ʼnԽь VBQ2yT֌ Zp~euTXۧ ُ}e|CCTcqP9*!;e|J K]+kj)/#]OʯVUwq\}wv{}ɺG1DlZ.ܶػ>y{wret1XS*|i+o tߟ7Ft݌qi: \3e v*O^T9N8屿>T[kO=}@j3ku6#%#ZRٽ)ku'}PÄ72hٶ<9S`F# 7VGS^fTi8A̙yQSxADeҁr-St#9n-_G synӒ:y>c>CO13QFH_ ¿:A#o2vqǩC˅gs*[ q>jDp&/i3SpƄ},3[?'}2?[1Ff? dv*lxq)r:brGeTȩ<21qSFG\/WUЉ;t'{ַ'8nAz׽7xگvىM>>yxSK'3Et{sk' v<`PؿjLmn_ YǮR8L71 q$<%/RfB1dT+8pJA6{VďxS֘o6Q!W^Q:WT"a|(fC٥{`ǝc8ǘ> 8JۙS'&鷝cjغm;7]ՅO+,!V&&4 o/|#*KFp| 5O9AŒ>+z翴8pL][^FouCƏ`sz+EAduĬnS,*`c\iwz+ffV^+ubiJo`PJ|;uWq{ ^|D 0 UXSD-GG BFuIg0paXE\a=/JzD\JX(\]65h۬73 ;(G@QG\ 9} riâK;ZV'G63]ׅgA?[@!5g,FPhFձҩo+[uw LSWɅ6e,*..ܟV0웶z3UR>?¼$ i4^x/ɐr;苍Vϓ]~=5»8/uXopac7] .:%)3q@u#P.$w*y(OXL}J'xbnb䦥^eǒ" 6ut ĉn>xw-uޅGGיh8LF5~!BN)2D( ?rcV31 ^SQ}r*#ܝe'87rX6wu9yֳ5u].`OM=9lrײ۱PqrNcuyZ0-Nc7Koϩ,jpIz?{o-my}'%'ɒ-Yekj꟦3gN>sUj/U-N(qח9d}dJ@@D^|ŕ$N=x T0 /UK/E @F(]l:Se/LܩO qP#7 K(ޣZE '#JAKM/"GI5HS9Y ,]ҊƋFt+YT?10ۡ\J`Mה5u<А9PUҷȑ_E"J[ ?$[,97PR'2Rzc4s):y'y uM얠+j5,仟̡Lz]7)sds/W'!V:-)%0&mO CtrQ6@*ǦH#f3&OKqbƯT@^=rLxjg)O>AH"Qʧ h:V W%Tsb 1h_\+Ցh?Jj̧wS gX?~zm?zrv*5 7=6Odž\\_u@|d\-BQz]k*oYvn=- B2/1-_xWѺͺ%%v5RG:}LnJtڏ=ZX̊u sRۑg/92@e38 尉P>q:DߣAID8>1xUɋ/nyޜzՕ&}r (@GJsWÌ6)S=Y & -AygUn}6llݮhqH)J]mK!1?<*T^|+O͛ԑZ!́Lfx%Ae})A){XoϒZ#] 8yu# ߱L '^ qPYhx)7{М_2ˏ|j+JcFBZ&:2N=MOɤn,qE|rShۋPy+}B$ S_|+~e<,Ž͚cHM|A .WDπHlo2-&Pd=ex#{׬PS%ɤnʧYfُGM_ygF1?hgMr UK&1M]Ƭxs^K =G{,er/Y1m;,!.,NUIy77ߵW}K& pT*U`$oJ 骍]qh8d*Zh\v],Z <o!{r7 H@c\}_(6=l5?ǒ.F~QLWP7CyYOk )vܶ,*rmۯ4|YwHW1x4|_H浪1aۃ'):Qd.9FNḋW>33N 5n|ʠ]_ob/a|Þ`1ZC/o_r UW>,iB ji~ IDATOf:͙ pd^nwED 0-h(R~*+&Ut,?hqWcjғt/'׵? }y8~TG^jxDr6}Y%4RWd/O83wԩ/l?yV&'k_7e&Dגm\) /yl&ߣɘ'=o'f;Vg/?1.2DkO-Ao2 =*e1R{ۅRTpJRpW?W=,y(&'dd;"t>@&GRf[6 APĵS mIwC\G c}G\G +H؏7";h5v9@F\¢pky*rWyNioo3[ݴh)@[ !գPZ/ĴE?+"M6ϜBu3 VNSKZ%0T@We\aLZ.u]`$[7tz|aΛ3lnx.7'դwӞ&@薉QǧkLXEH@ReJp 53N6Rn)uN+RCZQ&gh]>#^(gO ]F6y*<ٚ&5Aka0F&Į 3jq+sy9S;+:<ԓFXFRIOFsAD=3ВH>ȓS;Rb:$%_f(өb*V dOy >iuM6=-y,Mf;\̏:0޳1|u@03&'M ?~p* Iq:|Ϩd!!72X@+hei|rU@ a3:|w0ؚ|O Cd$;Dt[QR"" X B_tRGWM((Z,]13x".Mۼ_r*?Zօ׈A}&szW,͟ʉ~&NoKʣ\XGeUԙQ@yhQaR|dU'! CgWzmB..?v?|:rܟɏ9x}\<TqQ\@<yBU4gϼpE}8f2nj\N\{)r,}wҒW_iimS£ȩnޣNO<ɓ/L>ղG/]<wuyV=,m$h`۱C's+ =LXRM4}0;x tFtt$B@6vkfz ARZ٫=v??|! qHQ]<9?ߺ<߷ u0: 0wݔ>A2Qw$\qWZd>D}1|D1I ' MҨ%Q{&[y0d {'δdǵi҅}~ns${-cgm>]Ows9׮ 7SOs>s8[o y10E*lvEO8` a:phߤTiQ/~Mx2`U+NhPk/wɌ 1:Ay:I(T*9Z9,sMp0~@bPUS%ʏ2&b+V]Y)KT kK|3QR%`Lo@uy0ä3i~VaL](l2cZFqƼ72/l]cd[Gژ1-x#8hcyv_Pn<ߖh:~3cy+nrAVHυ㯒gt{.y7 \K.v/ ö9S{x~XT@/䷿@ :|N[}X7;(6?ߞ|7_{ؑcCo? /\._,՟'Nۆ'<1vt`rj:rp|&WɃLLoMnjޞiM^-ߵCwM?}WdAO!d >W!A$a楗_{YL'Z郁?d̤y!/>*AcZMEhv_rt(pWAyC#x@O/}`@@y Fd9ڀO.&lRŴVuS\rEY3 h[M4e]7W\cW#ER Fج"wt/\~M 5K7w)I[!:O,Hpf*$ i<@|Ѕn-\-jzEPG_iz}cs `3i=Kx>81 =eH` x~ɴ$99_%/!0FY pA~ M,k1L*T>RiglIƻ$v :tǟxl38wݰa|Q;1Sir;{c&ڎ;:ianl>6ə{֛/|eOKV;̶KN^$wHn$)}`}^sjHdžeS'_|`bՙ6plҲ#˘W]} ,6zڰkn{Ş':. "0m ۛ/p44~#MY6(6<  3KYYSPcHB:(x"(T'(Go]H^NEW Qڅu]_KDt= Ul4)r*E;f z{3t^ka( *.Ґ8 U{`[j g؜P&v*d8s̎'˚@?8OǢkŗTg'?v|x~'?S7+SW4[G:.G2nm>Lǎh>o8_G-Gçwԯmkș^/-ߺr 'ukR6+yGIK'/<9r68s3u8{W D bdKpxx+,>'`̑xOJ(Qcc~ ~+O <(b^uauu*ضjKL8S(Fy*]#D:3XUMր(_T(_@]C>i':%5(zcRTqUyw S8v^ߖ1]T1 *~WL]O@, (|F'~@S:h-?E(!t/=}Fn?,SB?}D_zq4ijД Lj%ZNAa^a2'޸Ö`.LK|zvOʆ:oA %y11>'?ʵZٟudžz/&' , 78, Mkey}4INΞ;3bى^|3=,p+NnL^~s=o֘lK#7e<2A9 XlRg# eL.I_?3ojyiτUV2'V(ö`HE^ŻvW򀍓'On^(9it' R Kn,1y#5'jV>;)v)Xg`\boؼEMr^:cf$~}<(V\:ԩAG icioOq=y@ /^䒖ٴh%+u&x+$Y(iyU-6 ej!6cGt:RIA|Gls딻arC@aɓ/Ο8~^z @C#eGec"g(@|X]VAB8 ֢"NL^?*By nAGR`}X-uSx/R<(P8MΡ9C *Z=nI [l%#PF|tXؑ!<;PyNe:QTCjު#VX/(un>~ʽo3&ж6h~Tڝx'+*NV29O8gƞ(&-MYcS2F$7hx3K'OW[z:&U x~rbR6)b^^-;3 jK7&3#k׻O>4P0S@Eo͏?~\ Loݝ9˩,"6=?̹G% (>}H%.Soyi/Z=NԘ ܚ]h>"&ǚ긅'@>~-Sz>J'w?vOG_XLou,ؙ])g*x!KNeDސ21Z|=乨aI^4d[I7D' OEUId_in>~?FY=Jc |зW(C:ۃC0h$}xh677gCmv>5\DŽ))ooz( :h £Umpoh/8o?f;pHbnj:TK-d{rb IDAT1yɅgt˗>d|E@Ï>}6wkC7{X3@D'ʥ3k._cޢ=u.A`XG=M~P4ũ `D-*[TDl$"h*ps؄ A@` oiO?ڨF&K T3p2!PW1WX<|o}F@&~AWsAELUx8t*za&IZߒݍnG~9Wq}*v9k錼u*げ,1%1<;>"΄3L'дN ^Ғ@o P\ l*g,%? `d<mZr;'D>"]^z; T{nxNzP|O-Ló?;.R >j\iXU]~6L.]B]Sn!tMZZ҆s[P%7cvx_{UT1G7v+|Rb9Rh1[D?6V Kd4!=xc8<,k!Cs 5<jJ $]0"m-P9LZpٺ4E<[(tZE 4ibxqԮ}!'& .I^G2 x|/B%zS~Ռл$Yl`y"|̂ڳ 6Q9?mnGt}׬qzX~f2ZxtՒCM滖m<x/gɏ<"KzZ" KAn/@, dIeX:fxԁÛ_/l #4! IW`e0Z3` u0״.;v\" rQGE{K@J^ $_1Xǯyx.[U? 6;Doǧ]ޑǎN BHΩ[nR9 4#.ʥKɊ>NxYb2/lW+5At7OEcUEqLt@D/sbNlފ Y&#uКzgΪ:\aV꯲nu.?5mL$R5q/B}|9K'`o((&ȳ|>H;gI@tLfH x^uŧ_@ó!32ߪm&wb`0 y]fhͷO|FպH?{ qmfURA(1E3 Ȱ t&U']Iћۤ [j p5y L'Oɧ<%aM9u>I/Խٗ(&}٠m:2?S:[:e>/>D&|^.[s–Q,OK6`_ 9*dPaG-ybf? ^ΥHz\Č!;r!"BSyd2[Ň^!Y>"^'^u)ZiU]~u"^gux:zEo="^Ƿr[G񭣇\C.u|!:ux:zEo="^Ƿr[G#]|͚vRO2 * !`Ƭ05y,i/&+-y3NL,L'OԆȫ5iFmyMustD[:isnc&|O}ѣ:%5)V#5:]04ФMOJ/IyHdvP)`?֤o/̏Jə [#ǎ7\oO\?R}ٻoj|{m%@!8߼&[ z.v pqju6@37>-z0':.\ t 0El21P%4"2t5͖L6'\oqNj/nTiTx tN?fc@`es{5B<(~@k@xldT#@W ߲n?UmBwC14H󋴒cZo,1/ ƴoc2& mu>.yD,݋/$s-tK(d'uFTˀs2\sNſĮoͤc <^}e"/M.^8 d&x䷿>rM LǏON>r| htBN?8̍gSލG'Nyrʹ,8ZOc.Cw72|N j%Py"^E]8Sd˛7LDXЈ' ^|CLDhrFfMiy' Al3Y$&/&S[WI^!qӅ+ZRo"}׿nnxxXϏ(3=!4kYJ*Ra`R2;*IvNs-ЂP÷*ϲ`^ kίE - ΔLߺGomiOx"{tH@`jٳg-u<\sŚ L:rzē:|6?9SZ:x xcO<۟Nf:#G h-G7o޳o7~ں^^{͠LϏ9s?O߽ udr^o󅓃N,:|6\ꪗ ?xQޛ]3)2VO ?F஍k^:Jo{UAGXϏAO]yNfC6\$%ɧ]r[PChRv'ʡx׈4aWɃ`eU+<'ҪB\|dBPGx_V#`%r'k6yՋ"\?[TEШBZ#]_qv5*$ovF8 !Si֯]؄~6_5U?uĘvy(O%xfռ+o[{ MTH羐7:i 3%5&) BMx8΀e#-U1!;e mɫwZ,?YM}Z}Q}1'8س:a`ھ'oO~wZ '7ON^GRs~%}e]>%swn'7U>,|/g}~SOFs}vџqڻ[x -|ͭb ):zPdч3{YN6NH?LĈ-!7 gҔ=6Y "Oǃ]Er C O㳣Vyy]XgHU0 =rPRjM^*t6SlEi؆ePMlGGyrǶrΣG>e}B]o[_㺆2A(?!CB.␋c~m?tBAtxuO|ȷp'-*2W*R[ay&fyf~%oa-PLJ9lۋ`%0C6Ax #' 0 ^O$ΔҾHkPvH~6hO>VD>7pPdI2o3Ν=Ǧu.!0z x|yrDϜ9 W;.0)<ě9w' ˕و]h7Xƃ7=a&!@Y'T<ÆeAy ~gRYr^5mRd{t-QcӔa42#3#yε. >h/J󂟶 NS}@zqtm4%C%NӅIy M'Bu*M˒SUlq)/f>~=]H܇\wϨ\LK_h\kSOぴ @-x !LR!Y*U{.y״@䈃'OεiFp- PhyQwf9 y&aSȋoc:׀ hn{'I/L槆5C)O&Ot q5 G"F8-؊|׼U?E-,{%My z$ o,4D!_+uJO:IzR/Ө3j=֖%gxWr]/lX{m6;2VU ecm-*ă,"|ߋ=wVom iL8i_nЄ7 4t^h&lAOfs9`PKb, h(pY@|U,WH`Olq~o)j5=)0ɾKzP;kĻfx6dWۃ؏061iwҥGx$k` BN޽x2nƑ=4>Y~$΁ktWjU$/kȮsiw٦5:F7ƌϺ\h쁭5ٞ\+nN1-_mZWZ+v;H?Hgv_yQD sMzY52.B.A|j>.Ǽh.Jȶ i#>.Ox_@<Ҩn쨟)z[gV{K/y1ep/\]92\ -✇My%ӹ$ן;dlM!їbi<֣j?~eEh}F5<#](ydYM:*m\ԐZSZyO+䯺$ l_Pi^,X>-(3PSe[eYvسDŽ嵘kfТ8)g0_9 z8\=鈀SO= 3=%&Z#S=pq6ۋx2!&DtwByڲU+x$y9r?<9W^*xȣZNp"/vsMu(WЈkzMڟh6Y^e=]^m4QEZa+l'v5^=ѦukLY|}6k0~46~*O7K}oگ_qA@-1P"~ <71.bIKLF&@/m)6Ekl̆L"`NW/o.w63`I  |D ɟ5%;We ;M}" sYEtغO 5}MA?y #1~xgQ~Jx܇ O|/)3355K7[d=0S :E %T`oa)<@ xy7H5ٛkh3+U0xlW@~tc"n7N PDdzdp#-@<QԟkOT5܆HC$[ ¼׉~gϴ:ZiY!_ԒH"QLs:*L}y#7I>De9Q| 4bҧͲA ?)` PW7g]x Xc=|DG@0/j(s@L דG$x/#?z]~#qw}~/7!=Gb<2|qvT< \#d40xkyy\&&'MXT'@0U)iҲ~lF|bKgI'm"D ` ;}*#&K@ɳ X|1u+%O d@[1^5</RLܭMiKB?7Ji1hQW75L^6vPZ;6&q q#xELU=e˯52tSp?GT)~[/W߮!n22qknGB ƒ%96W{vJ6VkpxPLtLx ˄<[xH TMɴi@2೭)]I$爲 %2t*}U\ (\+ ]/л!OO%PaOL̓D$m"&16vi:K.ɣ{v5 YYGZv5&|Ǽh.Jȶ i#>.ڏ[ٝ!zqs*EfVܮTV_e2Y' 2D}0ƳI_4Sy~AN>V&ЮDK `EvO@>@)P74|AZF^^յ'IL{ͤ hL"[ؔ@^qƺ.o;@k* Tq|T|_#}{uI~mtO$_+Pf]'Sy~GaG}T-T0cߪ]2ayŭP\Zv6K_<_|5T߷?~V¶ JPK*T  %P >LQJ?O?m Tx1Tl&O0*xx D%./kLLA/Kj ?Ѽ `Iz}d:ٝzRNΪP)}a=.跕GquOi -Es?1qпvJmy`'FMWO~9BF>}oz\V~~#֖>μRXъx$Y |'z'}m>5y32Y.{t^P)XFQ"M'Xzc 4r&jst#2k ’1n勍KE2߲n0ȫq/C?O[}+˧tM. (l5t_*V4 ~\?fdl_+|TtTi~[=DZa?bPvBsE+'ץ)T.fn~]zLlOCYaЎޥ6&,;wiI|AO** I1^?cfcH䵂|Rؤoy|`MVG1oD~捼L [b&ٖ6%oL #ژ7x"?F^u- allKA7om~d~x1џ^yԟi ,=?-Vu-;l-Դ1YieZp]-Ci:&֎<-Mac*,Q^cϲ=S1F"ְi[Oh ~>' KUdF>xPάa -Y(~C`{_-5֥ytKL휨._lb,N=۵kŋ7NzZB<-?Qqa}~2\pizBvDWʪ4wvJSttw˗ޱ{yKcLqvcd`[NaLZDwasڵ-+W=N0 ުDcY< &BOgNj~Glll̿꫉Ԗ3(EmdqKxI(D15_cӞ36GoE*ϏA{~M/+iNv[;v wfqډeϜ~xKB/J^S՟;2.`Ճ*2oiWhe._,mmu?СC2~[~3ƨ";85h5/npdVѺl>~Y;{d3?pճ.FL˼5nepj9\ RUh]ۯr>HzVG~G~`{,^ @QdJ@ r;aEQCQ>gD}lOœLU WwlL<.˿UIM?KV0M0B?;bMџw\*j2SKvſBFU a_a>~5'XX,[b0SI?1rxPKY*K6tONv?{#& \Fቃҟџ{?p]G] V1DGr\}=zPvjpv%JǏ%џϏ.џa]=?Ql23dO'ZQAmP?QeaJ0$7{S>ޛIwUkU^֪j'O4v( H~AK I n$? ?P G?F"@i SuHRR:ˁ2#P*d~>+A~[Èʆ7 #^&6l8ˁ2',QhG@|j GПd25vH#O@?D~gurL f\]йQ.O($8ApmE~6!%rSLN;yƕ4/ 3/ȏMAL+Gapfk>am+PfUI qˀho2- Ϛ 'yE"OП>eMEf?VW.TR'"`9 z1^YpeYʇ see .EQ'%++ EoћmıFYތt ǁ\~_VX5}zNZw\xV`0@~chu7?~3+vSW8HNqk ?%5x eF&UCayO?L&M)]=eȋmO߶gx?d:SKg}ӎ4ǜ Eꫯ.->#X7iLȼvISFIzK POjҫL_5?'^?~iDiHɯvH?eʔO z\qUr(8P"n ~g|Ly#VʵKϽ'W*y= ]EzٖZ!pV.[-l6OsW>58"w;&|E4~_|\AB;Pא/w(X~qQ҈VcKD{Y-v+|Ӌd”[SQ A':*Ro[e/U߽UjMI,֏/}X'o' 4<[t)109}*x2d=Y5bIQpkZ|_|SR'*om(]F ۙ?cd䨑'۾ ?`[n;4ϝZzȐ۰a J%ulKs<ƮG(2n(ZCp?8 nVބU]\7Rdr7t\)'j{N+PŵDKGɟލ؂)&8.L4 n1i4V.趮-kzJ.'3[;y,=RB+9TR"Tsfǟ{5l ?X1GbkǭXn=]䩵 @aC>E0Є1_,oW#TG|\.ˌ3[Jgr#"WVFdMOy];>1b><&g c=3PPZ}e9R۔ņ[}UNl!~)1c.][W:{^{JW߰3ibI.n+'U5y7妳`*liDۄIHU/8WK ƖA 37q ^E]^Տ[w\kRT8Q৭RN9L`IGq>_\7vԫ%lq rwaz9T+Xwɘ#e,)xŁ9L3f ۏPw$[ ܆*o#GD8b3 c\a~'ӟ­ UE ]RK.mny-wӆ{'[V` O'MyxQwCn?0j(YQ2p$Dž!@傫8S{+#jGrg4L dDz*w}vr/9Ȟ{ɪ.&̴'|Q6`ĉu\!ѻuYh|piU7H:i~Ӣw龲?F›4[CYuFoZ4<ϭ=n]h;~7n0[xDH /0mH'}7=]2mL:QzGH >]+/^^QYn:|NV#Lslk-ai̜9+X}#Y] ߾xNQN=g̑{އ rϥwhR93s|&C OIjP:zYSd@CVȴ9)`Ä[=GLRP-4ӿ+)er&'y'#@ܤI[(j捲f E?%]^%Qlj!(,a%j>لJO/O_H˷~Iw ND%uSxt(zR|囊gΔޑ]˷sRks,U|ѹ{N3>-Pz^zz0aTK}}}tܾ{ON_}'O9¼ytj@F }P9Rb%Ln}poTlǂn8N8l׶%ᷣ5 fܹ· nS#l)aI&Q ?c\iqcgi@IdtݵוT_Ŭ(s ȩ-N[{ kik8]W\^g ehY-zUj t\vrXvmcPN_ j-X ھލ[dļ^*p^d %oLKz\sE\.X'Gv񇣕-8҉5G!r@Y'm5[r}m)ZBokCX{&Ɗl8d9S{)>=1B5*,k z(kT Lra.qF)GƎgG=%LE0 RW?I>q.4rT8^V=3*rXffCj@A00,^S@ekƒ&-1"2 ^+"? .Pyٴyeo~]>`-?- ,V)rLNr˭ު83gΔJ{wEygk/Xp&Bgb?]/ρq"Ѯᩕ^%/zx6^A~ObRQ #ynA>t+6~K^|"E  !wwMڔ㧅ފCLŐK1g]""G?z>6W_tᙧ8˂8zTje?w??GI}*2YrÏo;m,92qAZW '~\?od-W<,]eٲe9#֑r~OϢYzOeĸ)ȄY ]1$Porܧ/UѸYt1.*K2N1;Q<\qbԨѹcG@ :QKyLy*vCKϻ\-0KG: N}z +, 5qBcN6CjxO<* \;lUY|t-oy >bhL?_H7 O^ IV^=T.0 V}DLwشq*v[L$op?\%۲SmǼ#wGiKN +_ 9s~JY&L')ujuU~^"+mn~yy7 GksII5$v U6kKo3=r79e>*w^qڼA7X/ay <oq܍wt nR~!_0$@a3pܠߖ7ǧ(ƻWpNtzr77y3ϓ{K`BK%@Gx2^9"1/b@1G8# gN;L!ʇ'eW*f!j4vXF\7`ٟOLjE7t?,^X~˅^<>_t~H4a~֬Y^3Sn[Dt'8YK{?.=vqrdܺC~\;7Nq^U,`rcM+[i |};σQY|$W贐iţF=AHvP0a%zުշp~oJh=~zvSz^kJ\)kBH#ߢ?EM!3nN28a9ؕƸ}Ɩn5ań9M~Lm8&0KLPyq= x#Mu=!ݱ\k³w(N[nJ5Iy4%=3<|G'= ^˗s@[mk֬dI 0ϕ)~ˉ~a'$?AS(7՘[zݺ3;?x_K~FB><ò?oDQ4(Q+dypc9CƳIu~{i@ƵKe㚤"|>㎑҃dH8I/=zr5#Y-w[ҷ9C}p6kZosCNpb|n=q_\Ggx?|?}VG\uYx2omeؕ)W)آCcG_$['[.Tip\ >~1 LV"3J/.g.qp[94ߦJK㫫x)Lʽ{{Vɸ V9y+s."?NyƊMwmBUIm]|!/n7hELXףvV\'Y:PxG6§oz'a j33d%Wn*>m>Ѷ ,V?d 8#OrU]}aǟwyrlk&f'h+bޗMt$nFՀP #6V͹1gFcW0QnZiB/{MPj̅}+(gV;j]G8OcO1PxZIY ]ö--UR]qm+Yg?lst?6Y8‒ۘ50̄1ǧ8TH< ܭ7_zU*!R@ Y<=:>5MGKCGfKlkaz6VǟO8;Y*9P4^gCz3.`]VmRPcE:Q0y+V83ב?AG$j,WlE{7ESݴD`8I)SgcX tߑ@r*c0XK_! }֍>1!TG 796GޗzlO|e7EVdvhoD0IHQ[{xL?#z\á>6+Gh]1̦ظz_{Ӭrh7!dɽMMɠM3h2f~PZɃhrzЭ֊|Oȏ%w+ _P |$a_/vmW-ZT7&Y}Nq.;PRS0VbRÙ ńON9Pے0` J^oD|[ީwXg_|`r =U^LDY78UHT. >X oW'íR-:'UlnSʭngXQ¾Nw/(RZ?Ά_6LoU'U4 V^U~`ѴO&ڌOõ.XPa@ =|e[x`"(npI~>ƵuI-->s쟛3.#zzs65yv<ƲUKjfNa]'pn>>鱴3W}{ XEѧZ=jT_UYfpd!Z1n}wLwDq+S66 t~x[q-j;@<Ȃ; 7 C3Br|XK.J|yv|)Ʌ {L7}e(DYrz`p`otz*U>^ ϊfrH:exD~lX6N_E!ˁK*i07(^RY _epqЏn@똄`L75 m_^9_%m-`+*W/ xGs*.laۓécv԰n2I )'*m^,)_\T[k)qyIA:թ䑄:4'gK#n>́m :O?9ǯ)Qgf:R7Le -:_V(伭l;j3:V?~/ T+RX5Ў2 6;V?+RE8?$(P( hqVv߿vo]v3>4g7+PQV@(\qYLs礷j3i_B;).uP 5,!1s},pJ\Ye:A9Ū36P<ϴ!/Ͱ߱C-&<ޖrk([g_`%u`>.?.}rX('\ GΈi%l7\QGBHqApq¥W\ٵ`<'u{m?onip0P*NP>#iև,cpa>1d +1H*7ꄫ+'⒔8. \"\܈:/'.q'rTLEAB1,,X?RY G'Q09h wqȲgY'hQP` >/54yF*jDF) G?~6-RYñbz3f==!9a7A~RۑdM2!#jD3L~M3T;JbL lӒU+Pza_Ӧq'ȏq"GS.hnے+)h)J ȶοsR(L [i/A~4uu&sGGGH~ԍ~4K9 n@ !7B;U> G@! G8h5Pg":PY6gt}|{2s08A~?)G#؏XGH ~'8Oղ:q(wʭLMѽ1z0 8`oQI9R&#`?`?2 nIfFM)]`_kbRDca>*я?C9gZ?Ȕ0u?(Dr 12ʱ@0!@.[74r Kf< 7$' aS90:_oF(Slw=0i;tnu>˓? c4$FП`?\[gMk?|.Nts^bq%KB+ ceӊ?,g?kX 7uPmQ3?@9)qhQX6\] cOJM^R 3aOqV]'D9 (}iud%O-ODH VП?RL8GG&bl|!dW@%\ݸzq5x\cpE8ˉG|7B˅5 U[Z ӪC CTf\qõף6"ī@e+OU"1Յ\e PaF?з sOdPaA~ UVɒvD3_t6}"=s&>e@ YL4NeC N@'u* #:H ?A~L_:P2(r=0s/H̶\ DBщBWѱ2-[x$㤅qlQt"e矐ly:#ћFv]Yvt,oᵋ}<[܎>-6vgydzņ.,oq;:x>-nGgp^dz Ybkx}<[lxb3gy ]Yvt,oᵋ}<[܎>-6vgydzņ.,oq;:x>-nGgp^dz Ybkx}<[lxb3gy ]YvtEc;؜+h3PFȘH lE':Ot-`ґqQ.2pit\QwygnzhA\q噛u?gnE9QvyaܲE"CbtyB2s4q||?v:we}g}~;S:s痟L痟=gm/DYl,;Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx}`]ŕySolɽ۸YBl iv76Mِl6%M¦ t0 &y:h|{OdKb~3gfΜ;wwϔ+׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀@"AaNmċ555550d59d%;:}a!  p?kkkkkk`4_n‰D}/B-ǽF/ |kx\$SǽFh%gx<ɔFF'JW>{ x x x x x x UZXzݮ??`D冥уhA LO_ykkkkkk`k)Y 5FW%JW7 Ksnṉ 7/}~?%D)9z%-7NœXnarŵlʯi_}Oy}H{yŻ}m sf_iǍѓ|mtx-<^nZ8˴y찛'vn~;'gadQ">7=^MF\ZENK/ )o0O%h>7niLs.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍLsKs6arW01!,KvEq kJ#ͧiչJkh8(%}ӷS?ܯր307^<4S;n4[vN g&(Miţ3.#(nX!ͥq7M2\_lzxR/^Xӂ|7O&L)äWԷixhae|` *WPA U-8A yk HWAûv[iT/(/mnAE׸ c̛1|W5l:4ݎKgNaS6$^${"Y5Eä14i6_P4W_PdDi3MA>iJoF%.i꘦C1͎+O;Y1i6 5볼,|Xz%:uyYYY׀׀׀׀׀׀`kq޽{~GףC5A1!БWff)1@Nhh&R)?xPr`iGW?48FJy`@6ˍW$+Ͼ$a:t{1Jތ9^1̟5t:Mpo咵)X}aW0GxJl?S).n鄅m/-~Xkx !-uw6c Ə1G,eRZZ*J9m4ʤ?J~JYt 孧\+͵r{ueKaw ӽgs9G^V7E|CpF43lJg7Ʋ>VAܸ{;d cӂn:ySaןI,<|X^n9 ִ&wHсҁSdvfEީKNXq1;SO.[RSG+@W /TJAAAXr 13rd(8GZ3pihz0+O2&K 9KdxZ}//ȑ#~p7{3gzE) XБ8Gip!?NK3AX@9VcLc}ʣaa?*.2 hz5Oyߟ%7dL]@!/sM#VƆ&ijlvI4y⹇_R;dSxRwJYnYwd^ԥ4;ybzX'ZO;t!CA/׀I< CCtʫ'̏qo_-vNuSQ\:(ͯ)_M|ժU裏_oꮬ4k֬l6S˗˧?iy /wulڴɼnj#V5&>=tbjsH'MiY 8$#o"WQ#gHnnES xZ;R ea* ֺ3dAn>(oej?Z

g!wHz/9K|EHַem :b/vjw}| _0hɥ^j6K}7f X@w}qC׀Ӏ1s33% tԑMLPH#Mm&͘mK,TLpA?/iw0.Z)Η'i粈_N>d;Xy{nȧ>)\B[g}OI]7/|'K%Q3?^^#IY&lvx)a 4r4:)Kͧ4о8y0OV>MS8yl_ä+.cǀ?ӧeTfpqiR\,ipF@3}ZmHSK)2~ijheJAFeQ2B@IϐLX*;ZrF+ڵk c4MnY*|N܏J踦ӠuV>ӧhcN}&QYNIND?4@tFQgvitJ ,vnd ,ӎSt`NbW7}Q pW}Dcc:BGbW1aց8D}q@[=!/+s%=U3c.7jS3c1:;cikUr֜-x C ,qIb;yOqJtZ+Ӛ&u׫M ܺu5n~1^b-gt<`:GmP:4>S_aiQ;ef=꫙׀@7FAhQcŞ%X? m#'4-C*v®+%hUK_Q _P)ȘbY.Pg@i/ȔVPǝz!`#ӟNj>> /s.TӲeڃ+c [4CKPe͒ O,^>k`j$h ?.\sqϐ܀\rIg,8p^~eɁ &Ɂ ̆ޛ< ʸqLӧ5t'^CO(-2V+ZX)S5_Ӽ5504`cq ӷT0a;0&.حЭ#l~f|3`qeKX;tLtBg̵fe˺rك_sub&BwYJ yonL#%F%S-CR; !{[sl}Y)o?&^n^]Aќ9s UNrqÊ+̆/܀+n//rg7Ms ~}g64R%e^qrYg]:քisΕ?_nSG> 5,{W^^#BQ!MS`r #aWPm 3CG_㮯JiSmcxc= Ӡx?E0mLj>7Plqku#c"E8x ڸc MX>Xh9%\C`Ƿ}  rnܻN?.O&N "u{`i2ori^Ao55GPt*1NŊw>#XҩSޓz qyҒN^ޣ s--,.yXH/)>:ZY?2LFkk`Xj-oy |#~p#c&PSWnH׸mamё0})84̑f8M< j:@ozm{qiǴL&j9F e+%%bd\62S``OhOPSu6Ra=O[?I.XzEJWO }2F:cXZ2:sgyt)3z=׀! 8M 4 Nyƙ0t5]}ҌKf*66Zi޾fv 1]&3HoXcVZjηd3񇀍7q͞a:>`t-Ӗsk夕r51,-e${*<|PB`E:1W^1LG_ANy4]|6; cZ,@G:G}6?k>ԂpR*-iBjiao g>޴g|2ӼT(5M q v )Q4G3]i3MLv0,̮-\yg3 t;4*g8q'ܷ^93Q>kkkkkk 1 bkc\HWC4i^W<`+CWD+S!tZp;n c9g0@ kkkkkkk4@Bb.hX}ո"8Vݱ;VN+McXlqdc XGwux4@)``zDFO1̇N*1LNb};U«qZI 4M<);KAC:]3Nkz555550L5Xѷ!mR+ͣac g?NVʸ(Mװ楯 ftjXgb)b4lLD@'c;yw^^^^^#@m M b6[黎4uʧ]޸;(H VB\`J ]4i\ӵ(Zlg:Z,ƃ2ȫaA+O|lw^^^^^#DOg&~af[9y5бioqt|y8=' k Ғыj}nɔ-ϲӼ)RƸm ;DjaX}MOk^|:[x[8fW^8\(u 2L-l.Py'(?i\_שX[x4!Q+SB_AZރ,MgJoC9+} ] +Q gtM}#КNǺ@Lh@M>a嵁ҔWOO6jiovIJgG4u5~>ޱc>tf-}@[Ҍ{iK*p۸S̛>Ĥ46vQI# wi&Rf9n]_ Y 2Ѯ2]1q>]cVpņk8 hqn57ݍk^ҵNMc;i.i=(Md>yGq2sLqǏ{55UUM|h_!Zu})liƵL4:vj͆2eLڢC28Eq (ٲF>!]"7`oewnZPܶ (M}3lľ YA)+^Z>o$~vػxxR.u'4i̫,q̫nyZ֧묳$++˨`nٲeOYUf϶vX;cc[wH;ÝqGu*?W l:3U IDATKs2aܸ^ٸq5Eq,XP(?AM+>JwC/Cz,;E^)#k^|AN]8c(܍Sb>1=8; i9hǷAI+R?0s8}!v96˰:$7|>vŃV@/9i xG e);a7V[^0S[֧e0atlv.LX*u1RP'-eR^^.&MJ3%;uTٽ{xkH@NNqӋq:~koi\~d)Y%W? 7}3rʩvg{~Zij뎏@]]̘18y]RXd1æk_i@ݕ+N3` 10"ӇB;XEhQVMcD+XcXj_SJ/ `}Y[RGFڊb݆7: xFS[\ć@9>lr6&+sK$,}г.t]֧e|eiXniC5K I{n%K޽{T-yzMk^#A9/TsYAAYϱjL;֬Evsv#r䯫]zpbrG!бR>q۶mn<^5Sn0pkشnigA]4>k*NqklLls8i6 S U 7]F3?I4i>&~5k|ߓλ@fa@ߐ]6yuzYhQYӇ HWevӕԦ9P,jHCT5Ic[dEۥ0Me|nL>"1롖)Hc<<}\d=d挒+>qąhg7O1~x0͕9H-8ͅS$u33CF-[)żF#T 2J\ lIĦGDߤh+ ZghW*++<8i&;35U֮}SkoD2~+zGNhww.Rgv93p@<ꏿjڲg_5{@nBr˿I]dijĀkq eTBLdm:îcD\ƕ/(-֟ eE*,6]3uLM2%cl޺EN;5r RũL~!mwSУv*c"~k*CӷLc`cD3a9JHNdbKwʑyIgمe2;_/ >l۩q}"m<>_j+J׋-ҀZeɿ|Z i`s`/uɳϽ gIIdrdF#a:ɯ/EΗdcz/9(KrdRqL͞,#i*Fi;]Z&M1MӶ#M o4,MϿŎc3_q{W?.WؒB9u^c<Ǡvn= _~]<~,(#G)kV;ulnCeO =S3@7NqS隬i1v**%ocx?SV/O8Qy;Z s1XRr׻2L,_]2T,ia>4sxybV6I2rQ?557R6&Cܴ&S<ۢ`[uqM>90M ;ƦNXWD.Zv$#z/Q:-PYY{1cQND0u4Hv\R,\75LdlAFʐYX`otF$7)iq_WWɾ3,DG6InK 7N`ᯡ}=ռZM:91p2cjfwd -޶#?7c;6yD9VpV]]u01]I;@ ҹXM(I|.JNf)4>Uwʮy`>0 " G!5-q;D}mo2eKOp;|' ,63C T31:d)K1 "x8K$7) k̯al~_ߚ)kK'ʎ:鿼h\4*gϐIc`ȈUY.{kMI! ieQhXSl_۩eriQӳ+4ț @[g5tJsSMMHfvDscMHol wi Ѳxh̸N̝Z۝v݊^7#8KeeW^W pcejX_NTnN@\yrN$,n3CkkH',ig\g9fbq,33ӌ5Aߙ& &g.%mɝ/Jwșg &)=ウ Wx\;a<* 6n±0>L/C}7%\/g^&\Yy gm!ȟ.c?r>?9m6{)o| G`ZpOMd]@^$DfbPvO ӂQ|̝,v~Nl#(a!I,byM{j'Q6# oMWŲ/ӤNX.7_S,7ʯ)]iop4 u|3~sf'N<2,jғq:-y'㔗6{@>G s89cA/^;`/KhS$%v0o-kScjYL=;lA|?aϩ19*!vdȦݭ2wj\"ˀ??{ ^2K}K4`u@]4]mfYdk8Rj*@=;Y|՗eԤ}-eJYYYS>zO)NS' Z9('R .ZOHw]d_0v6ɋ`£Q:sq/WL";^=NJ[vZ*i lz\[ccC?(;7?,g-͗l]eR_|9&#qǫo0p23G`Hlَ2%=KCnv|xH4CǬݛh&;,㞇+=R)v58\cͰ(o02K0{w~ yX'Q'Q,IGG A>O6:Ea,w ;aqnQQ|"v v?cLSTY7N'{wy[uS)@+[j&P[&pjJf(cznjdbq|\6尼X\O;)ʩ~P]Z<ΰtn *wWXmrϚ&7]+SƥJXIVi_>//˔?jD9&LoFk/ɖw̖e;0LuYpKٖ|i/)EJw844=+lȌookAZknލM6RWOG`,َ#5vkR4keq;"qg=IJH+ؔӀ&4ַ,ܻv.-E$f/&b Y>}[\6?p9UgV94LCeekET{A}Tյȯϧ|RoN5* /+"/<@,9}Y2ctl3v1Zq-m"ϯoZ)uz)/ W-[I)[ZLuhz zH%{ s l+cu$|FfJu~hן,-Mpu0uCS|9Xn2C$?CrGH y聇%;KgI6dٶEp>WȯЎ5&F sLト-7受?ECb/SVҽRUU%\c:b~O۠HS.:ޗśJ6,14󾋦KSs|/`whoE|9rp\sX6OaˮrNmFim#(oe.ֶ ~UƠu[b/oY0+6Um_yA/UpVҫE /<ﮖsf˕],w+ih(X'gaJ<7ؼU~sd]xٙdʝwJ6°K.͆Lcܦ1Ǧ ' BX\^l_vF_k=?>Y;=rwisOhK$St7o.ha.p|8!)*=yn<= #ػÿG/Z%&S/lGxbyjc)(ɕG6}lWyb,h6{P iM={|m`"muw.4w_#Oʥ⬷𧻓>WXfk{jXcSa2YUS0#+X鸞4փE"\#uxHWJ]~[}),%xpgȨ,(ӏ ̀S53G8F#Aٜikud"sw? _{7+7oyu+R 0%u@hx)N)هONM;Bps-C@i:.Gj{AHRÙrx^VZ&.gxhՏ;ӚS[W$RL9O^Dz|kiݺu9Й^|NK/ot O˴iB_2vc]l]0[6m#w7!K/fN1)o賐No_pC\\X$ˣH.}~Q:iOZ}+M#ON`g lnWvNB0wŲS͆o Jx)-uj3 8qa-CÚ4MLxJ'vnvجhiϾl#Z'5X3gގln"S%`4xr)CX1/۩ ƩX pe<\uuZq{ezxGU2$U.=?[Z.%;?wSd {Z,_!眒2d!,x{w E$ G4}\bֶ=2 _sNevE۵5;WcrLCc}jv+Rjg2Ix\L|.3U n߸)NzqGKEEKqry58/kH7>4^onܴb=|4@g),? 㦠lO5 50 K#=Fs+Ҹ6q7&O/ qc< D|\Ҽp&|ewgѲY.W;cH:VfO^5~PQLmhhf ,|N( _&L _V:j꺀]^G%H 'Gy9%Fk ֎]Hl!ꃪz<-g|)RMer- {}p D d izH'L9ie&Zxq,ȇ;D1CR9h[.z>8pڞS4XE\78˝?>qctX`;֑cY}ũׄ}Ζ=sȣɇ?xlx52yH/5b˄dj/-'rwg5l7M|唯X}&s*30Jlԗm^-ǦV_bla%"N8wj:8|c#ȡð~ӘݤKmMYKֱx'r8Ptlnm  VY2;v65ֽՒO34.e{zDж&kaO 奥O6b_lZ{&unjKl,;ץJw4c-_3QFLNs٪V/@%}~ۼ0.g>ZW'xZ> ^N 4bʷ/2'm߮rR:'-s5LK:UHy6T|Y;ƹ<:|`ݽ -hl~ 6kK͓ӧwLF*sQgN:Opc5OgǙggn֐~#Q6d0tqЃČDMslV >]WA0\^4+?;C\lDWnYwvew%x),(4Wu275'Ӂei'԰SX奵c7f#v | dXY!okrǿ].euОp4=3ꕍ8%sCo_"b&\mtg\2'aac}U7kZ:vɶSz_P~CO.3q}mشy)@8X㳅r9)pjX3iWYIG.+8%EJ D, E/SimiÆ}ഐ|IӭiI9ղ'wI+_̘DL;2Eo WZrX0C׀΢ROM\qƙ5Nqk8ϴDepWlKėN X!.㈼soڬ}Ƈ=x a1tpR);fx=N_ڑZͥ)rsMNSs(9- Ln^/ZW ^yNY*k׮s=GK] vN'?ēًW4K r,_Ѻ4m})4v\^7Wӎen@Jll:,ɇftדq\3GMk1?*?Vy{ES@Sde:zF? SQ#U8mY.u\uߟ5vr;NǟyCV=_KX>U>{ì5Gb .`s3Ɠil8m"]י5v]y] HQUކCwW^%*w[7qYYNeK7eieUaaF m_W')0h>0Lb?4v8z˱-VoU/81b`gkd<:--ޏfsֱfwi9~Ern%ueݾldUa:%a07 +fD8"GK}a'{}'HNF_tVG6n+"F0Oleow]+9ArxR mYvx%?E8!NeG:6aVJ Ly_r N;Wv옉k*|J%FK؎;dӦMƊwgʂt,PY+dg cӦRUYi - 5yU%u)`~/(6N +Ro*Wiayț',o7}0]w ٧F3&Ľ~[̎X _NŎT vބ ңUx͍ssd=M :T2? fviuw[n\.>s#__.V#r,ʗ>64k_jNahu8;2%H>W6[6*V:vfp9{A@KJC1VNU{je.6D8&J۰"gamɯˤqQ/&숭4-g䦢Ntm9Mӑ)cOjb;zGehe;YQ5 J?3v4jqP'-eۃA}TЧb&ḓ7vҽOw~tE`o^'Mh,Pikį@öI%ROfTӦM3ܩM9dL)ZvxTN`@z<<>l,0?Лd}u/Jҵeg?%1&.9sb/^0GuLg80aPu~IcO;490QSSoԌ^׮\kżꪫL3µ [ ={cd^Z/7='Uz؆Aё3@'_븝4un$ 2^Cn7*L'nجsViY/_B~򓟘F}["UY8H4bzt:qb7vnZͯa> )ub2CɮC<&w)/^)e<^ ޢG'o#J;PKF˖=0t` nJaL.%52 WZ3s$#;Ub>4kEbv,LkHeD9vEў ,'"Y*o+gZ.~X7,v>se^x]mI0Akх阂MBTXL醙1U ?T#lZp.^9hxMAWnOq`pK.%GsMf\p\t]jBC4%_FZtt &܏qIvc|Hfy[Կyłxaq-\#7tݵ70@}g&M n˵x~w׬Y=-7αku֔)3Z5}a%x¢EgBs:㨖Վq#1mh:w^;^'H͛wpXnMwhݻwҥKIx  }~WN jeO4Pt۷o7t3^۠MA^Ox㵳@iJS@sP07MuygӔO~w*no_ַXxBE'o?; A]X#Wc_ lLXOZ3|E&zɽw|D~嶟?)߹\v~@:~38W>޳*vuԣ, hrjXytQM]Ξ˼YmW"1geȜIzk 4v n:XpKa`q?Qu׀[jXMZ2Ӵ }dgYxY*7?#g+\qiyHrfFR^Kl+ M LLޫCܹp>|)VN7KEt5 ._܀:NWcyqy䢋.2m+k3_aFcci.eKر2[ (&,+Ô(v&.4Oa+ہi l (3aX֥*#F+|Og/*Y&]&^,<:O}e-kL>4.О"Ͼ@GƮJAYQΘ 8vwgvOVXl)z8T;867K&_*)ĩص-<:QC8za-'x ֌aCEOz{X'ذ_:& gǔ?N/{𹰱hR΁g0P5UʫvػK. ld6al#dak';=/;bѼ9Cӻee{0Q)Kf+O1xko;#%y h]Xx-`8m4}R-]V2's8ǐ W\h,8ӧO7->9x->i϶yNTS$F6۶T<}hc!_uW/eR27ּB?g27p^ϴxr&oe>oy '»3~_7 oh1pqGKpb؁ũÛ!ߤp𴴐.hҙs<_]_tptnl;Ҥ##_w'TeHWݶ 5TR;Rz VR-5M00a\UϙbsEGa .O\X'r?_NKiY-M\CD'?re 2q i;H>?6nNv{&dHl+]5k qliz?nо/֊  -rqʕ?i+W./s!ؔM tҎNɱc0WQ6^{meI`]N aw^_Zx,Xe& 9sNҪ}eHgoŮ9zOYx㵣[D}i.#g/XQM)I:;Q^b튍/0 ôbeE?VF+رwѸV>m6ғ ؅UقB2p]p߀xlDqq_8&6;\~:)ߐ9} 72;?<€߄Yiv&9RC[q .w%o)&mhpwкU ~m|Af6GYQׁ4cQX 3.a7 ;vMRXMba;+*|3*.R*>5_̵.7 o|U@crq|;IfNn|^`gpuȋo4Țm̩26{DZ3gGz  gn3P*SL1vmf8'G_|ELϱMK/mjGg}8ŭVt{l{`dlD1@ˣlG3O}GXh6 VnU_ Okk5A hNT~]( Df +π}Īc@ y\r4lϦ' vs\rʎ%x(0nkNaMweSLYi(3 Wq.-\WEyXO ߖE˷i,+ Σu):l:m@Ѐu-ܕ/mO'ŔI Za=č&SpvzsqkjNC$'g_A-|@3vvINi']&m:u )8B&c>%Ͱg̥OMtpt`l$zj3@GC9 (}zJ3u#21rL"hdt-]=y"tg@-3zk:>Чx7C@=q Jk'CIM1ؿobz={xPNwmKHe:Qmex'?Y`"^oe! ^Gd>p@AHѸaSiԑpOY)BS:v4q2LOVяKKѱlz0_eYM]H ?ƃ<.D4czu+yB^+Ӹ.V&) i,zJ:R!/$5َX;\U^#~ TOVpe/l[%[2:Ͷr2ma[{DgN.%NB^m?uvzxދ>{i2rzqiin\L|;>뢮lCB}Q1h_PQU_mADq K_Z`׹hظ`TѫL):cz{1 nDpivXyhWz, - N0kl8q+s L ;0NFnxck|SZڑpS/67bFD'JÞ:T>./&-Utodt:Ei;~@V4|4͓{~JJ:b lg+ 3oaiv=a>d9Xl' kiX}6Myk~kK@MS?e@Ik0CPZj>6m`xk@>b}4+'O/K:%,nܸmtSw(rJ [Dƙ+XzfyGyrc)^S7[1xKlLԾD_-k1!.״0\I Rz ?w5=1m)n8M1]H~ IDAT=&19JFn_H6Y4^mcud: r,yg _Y|i d]åb?fKx#Y5<\'Q.ħǢ5LDdzE/,Ot汮b<֣ӒAbTlj96hF8`@]N4VDZ~tk3LOF/nJ/?/N]X-L|.eO0R4@<6"-;R+_g;e4s$_Gm/lDSnj>l2%Ւ+Iۯ>ͯJ}M wN,s0]%˅g0seʕIc0gn&&G|o$rz$g$]\O]Lz KM / \rI2.SjRb*-,y. !H0//p)O[7E!'۷O=x.jGpDH~*ꫯHJFOݸ2]>E'#1{e:s8emm9׋5x̙#{$L]8cuV2e; go|C.rkg."~6mZ7 CsJո^>r@=4>IPsYp{wֻcͮR}y!4q 8D^G>y_[no~OZկ#.4>?$3Xp_g<୨?`YbDQTbYPYEaٵvWׂbņ Qbm/|z^^2wGܛLrrrr&$|w'/[\tE5Q|2jZ7^{ e(˥oq4v=S إ,iU?'_N`Bi@Wq]Cj2cT @Bu ]@rJxڴijrN;TXx*$u>^nQ,`,&uaG=C:Ǡ AG Dp6i@_Pw)qX@䭇.KtƃҔ)zrv+XӲ0r^pMnq}z!^,D<֜ˮ}N;^@xh۶-Iy~{CF:L# l97xGGon;{~}g?k-&LÓɎ޽-JQ-Z0~=hԩvm ?c{,"'O6~y V",أGOŧDF@̿⋶\28ⳔN V!hCg%R״$0`1lf*iX!1(pPڮ8/l-뭷c=l?lݓ3WX\>>nuֱmqWC8 8k^Px6iϴI[ntG(7h#|!%G)3ͱY8|/r]T?ld[\s/%<;!mzv8#& ҀcYϛeE>ls%SCc,P:n}]/j9BK52!VWTicyN`7sƟ~RfC;)PǼ[\Lb.Znm'+^9Vzph XIO\F{נgcذao0V_CO/ 9'.-Ü~ }HF}h,>q=>.*\0,}i`g\8xץg t9贴aA~tfkZfb2E:1o4w<gJCt7p?CNvԇAQ_neS@G HceCĢe@ޘ&8tp:U, <9ҁ TP{mԓcƌ}џ K )4Z4 G$ro%*:)8#/ЦI#/Ot+擇OG 8Ӟ\‹h0h|prBǎB D뮻N9K~3Pac9E-A B0mrt< ,?x;J8Q~޳Ai? "C=طkyC_9xW0蒗a 6ѣjGW]u}yVEwҎ ?u)[裸7,=CVV[>R>ufyiG=iiǍgGrjJ7ayg|n 2 t\Ѓ:osDz>KT>c!}>/St+͑ϧK_/&#('4ӎƎk;Gr-a@.StDz[:2Б/qz"qY},tXlVXa YN9,qxX?+k_{:EVǐ7 Wm140g2r7x2 z3Be^ΰLVpyQI km5g8h!PsL,o4H,tyRuY/]OS(< Xg41:وgkvI7} "qWG&ʡўpŋ!a/#y i<G@x?b  /~Un?kuOZ#c ȇO8p}x&yq>@atYs^3˂͑ϧK:_&ϽK`30c]CH5o\LMJH=䉓E#v!? %BKiUԓkO;|+KKfh+~8}xJ7u>jЋФg.36tK7E}軰a}}#;ϯM|vUNDwk$ :]CCy` O6a:P+`M ԏAPY^WtIVnP$T;S XL1uٶ7}quzb5X pL2˺6Bi:4=bc  32R-kpK<[oe> @ru49|Xs<Ǐ/ͳ8k1oH[Я!;.?/{Lqxv 0Tfug:xfikiM){DXs50慈8/1d:\V]xK_*ch\GŌg5\"0 ^K|fWYrGh_qҎԗ@i*0cai)#]Neca<yˁ2D񕨅 ,<@l@p Zxȓ !24 9 @y:yCGgPL&+eaEL2"2yX4dȐ // HёӖЩ @CapX@pAX'/ 78hfz.sP[;BS3ӿX4onHg\W5/e|/I/CZV3ʋniDsoW8qk/e`u(-[x#D>@lSDx/uk|Ģ͛gvF+8j9f-ȥR˳#`3CÓ}K*{:2Kks>]ZF9(i肗FWg9,qt:ctР'|t繧-g'a~ZI[U)Jn\fRMitXP8%$M+q<6DS4:.!݊h4uu@@@@@@@m@UOu*' 4 \_ue\zQQQQQQQU2.4dwӪT;W,B4qne\x5555555Pp.ϗxƥiWI,@ JDt7QQQQQQQUi؅4=H˯iC5Mp`UJGH~-M{טGKUpuɦaK/&E D D D D D D ,H 8EG6yt4M&.+suࡰ\b8j j j j j j j6h)r-~HI]k ؅ оxŸڨ/e?+.pK<4]15555555P[5 % d=wNL"pt;ܘ5555555P4 #__ gviDbMKWFZ>E D D D D D D Ԅ|EAaɯ$O_W- ɛ?V"j j j j j j j5(`I DWlMv,Bj̫jKoFLլ~4k֬KkRW]cLy&jRWVMNl_ K8%KPhф'y+p@;cƌczeƍ: Vnׅb,|j`3MV-ʑ^{6ܸhU:JA9]e9_ueB<5M^&,z4*#X+olAbGEfXzuߢܢ1ͯ/hЬ{G7s/zv^uK`8i*D*n@N4)^_~ŴlZEYP S^ۜ-4onիoǩ4g-̝;wHAA$=-(d~9o~ݬɺ桻^2 8ȗxƥ!͍WI. 0-󥅄%Ue~=FQFSO=Ն\X|fM75 *"8h3/zA,iu#~ƌ[n_YjFRj17v+%[y( IDATfw6_|;GQebp6mژۗeyfAz[Luۙu֫=_{Y_;쒪_ꛆ͚/ypbv!Mpi5m(2bd_ á|eY쮿zsy?#P-3xCG}d?a&ѕ|]^z֏5}lT)S"(wfV0K.m݊ow}.[o*Ikϼ+U'Ͽa~H@L7_̀.L>7?/uC,]k MM'Ly%37M.;^,?hLBC/C#<:$y-,XH0׮鹮}oӧO7n ntꪶsǑGi;}6ߌ1C0+'xb>cXж]hnY3Mm_?Ϛdz1 g{=;4hH's5ÿ&)/jI[؊kBKbͬWo1ӨB{CZ|4кrZFZ  k%:-wkFl7O=a[~m>:I&Yf}{`[ve ⍒4h+e1XsM+]Vjf-{AI\o-)/<_fImb,?)>l ƍWËGmui][n}Ec} |LّvQG=Ӗ#Vo^`vuB^]ff["Mݺu3ovgk!9'l@O~19K^xkyg:P>uqŞ~9-#?ƚ\;Mxp ؗ3$o9};`l~^o(WGu؉l#)ZkNO?s=W8eY΄,6X̙3 Ν;9qO0P6?_3 ?fFG}x@<]vŶ_1zڇ(w3;1M=zHϱY@}}̡;5|Ͱ!nm1kwg71{sӇqw^g<9Z.-stNfȎ#lhf?C9rS1-N]y9Ǻ=0o:)v҄\M sq\</tRgZ3؅ оxecT;:W:UVY>6 `cd*u&Ml~ 0qbmCKKkMG9LCa`~gm#Gt p/?sϪL.59֟a} 1u7[/xKSu}{L9 `LAc9ƆH_}8x)uX _~A<SX%eL%zp cY١C;pPH*&'>V*dԩ |,2] ֭[[+9j+KJ+Y`(5hux` Y 11uy/r߰< Xb #6}ti[}ӦM헗wN>o|kLҠcsϵ|DE\xVǼSxE~H>}_o>|{f6Mn{G`k-q'`m9?ϛoȌ>k@Yi ̇}{w{`>K~'ߜ&fđ]MˮL:x-v?l {?ye fnegwf=1_yQf 770^?n/R?aŬEQ2KSW 폱# p5 MYE (\ U /q4oMsuSIffTǏ2v47ln;.4Yf͇7;bYz䷾YaVK-lңykh3n6u-:{|din3kۯ?37/e:~O;ύ5 71=Sߘ^hL`u-V77_~V_m.gh7ܟr9GlxJW.>"| d;V`'V(͹H+:]vw/rdJAqg輘ba5״S8<ļ 2ľ@ S\tL 4HT54: U΂NG@`A!'tR<4R⊆XCK3mKSt]) X -a:CA ޤ㚰/y K MO|193;Rɇu@7Vwȏ#`XXq-Z2ʂ뎝%^L}f֗3.8Ѣi%\3(i3<Ӯ / Rm}fW;mXz"ŵIX5׀L,1:MhO=uKK I><)OO"$1 O]FY|z]|-/"&}::0zz՗XD)'}Qc,wL>s 033Ųi7lIl>=‡Ŏm`&u3#m ԓ5׬g\E=—6$=7nG /=>֬v;sµ= 3;մ߲y/>z|X赇VvfٕV37 ;twf͎3OKcQ㤟Iqʖ<'rnEӨIS{Q+6ںKfOLߟ`F_/ 1˯| 5lsدb-0.z/Y,[r("N8X4u\ |**dt։"0q0yt9E R8>'Z:- X~tpBHzkT=h72uz`%օa` ͛)}>.8s3>lLb3ӘD€,8Hc`3iȉ 1p~z:vz`xɗ&'ru3eQ9yt5֢v,2mA4Z^%'KX}|O8Q/w\:Ү 5AZkxYn=4H^@b/>o q}k)q !<?FK/kR$^®qn۽K_HT#>IMKvXxУp5mۺIE.b.+'cscPrij>|>3ii V0mNϚ3k~sЙ;Y^"}K%uc+mRI oڜ-Wh\9NhD 532.\>΢\\qnSblܗ~gx9~*B}|?g)yRyec>w'ε<$O_˴t㤌|25J~862K/E E'?-jVӤ}y1΍w(.7WLtQ @ӓiK{\t/ExQcmwɖYߍjSE?՘|],ݔEUSF!BmBиxǽG;/y{ D"4:^huzp-r X694ɖ%| XjS,i_kmi\աe6(dצgv]zkb/EJ\(hBy  ̓Oȼb8jNkE-4.j j jje(Y#/4U?%r|ו 415P4{dE! e?:UX%: ˸xF7MWعHM\tЉ&4яssc},sP(uuC|i`g\8x; IA8_ZHX^яXd5uv}X4]H#6_T gvY|~p(g$vg&k5g=bIa; =TYjc66y-k^Q #<:\[~Y]Iw v a]'wӫ/$9<`n\ΏUفg~m{!;+ꫯK19nvW\Lb`g=ӑ-;؝]䣋pq\O]tZ\\N 4ւK~uZ198@:S8#\@h1cgw?15;CElgѢEeA2k&dG}dAݮZ#\dcQQQQQZ.NkCGNxr-i˯ʼnpZp-qqM7dj+C>氯y7,Ls(4޴i<7n=8T8_eǔifQJ8rB1kÁ蜱x7X8{̘1xF0a=(W^PoI|'Y1l0kI4(r!_ |D$a[H؂$nCRlS@@]@ ۂ_4 ˪;eBH%s e 3zw)S;5tm&4SK·3{p 3fg-9ϐG}t/ 290[od9j(׏C/-ls5S8O>ק~jGǛnlP#m6<ô*`N{Ӗwצރ?RǺ uzE D E p-% dQsY&DZ:wZ%1X֢E I P C JklJ[l{2`sۯb?s~Lg54O>dI2zv 9ꨣ,:~|8=k#?@+;J G7خd _cuY{],zQ+[n1sNDFHZqiڛ;]puͷa[abJrĉv}YGX},jZ"v;Z۷9C͗_~iy` >X߇UW_~ٜuYvzgϞ7ݺu{ /:wladL"kQ6: ƅT\.] k۶>PȾ|!+f`$o" nCj' N q/aGX|U\$ qma&%;3ͪ[qV,n&Oݻ.|԰ knf)hXXGX8š8]vU€&dCӲ.o> _r5k% ^cc ҉<+{ XZ/G D D D Tؿ*.rh{-1%&ɏ4hZ$Ĺ$ɦ.?G:WV'N(\Z8x(c@Yc IDATH=`-BZnmv}w8Ӱ'|YeU,Z2˗)>(㎬5. w}?O :bS@[ G D D D D d@\MVH!㣕<|,dvZ :^huzìAcʵe˖v S|9 SN-2dP1>s\ڵ -C8yAQl۩S*Z RH>IbYQQQQQHi%.b4vI'dJj~e 5(s|8>}fm{q͉/W!S-Zݘe_;m.l[D555555P% T\x9]e9_ueB<5M0MA X7&'$`cڕ/@q+Qz[eo5xаV k]tQQQQQQe\haJ nPUR9V8uy|a,G>M>\jRi؅4=⻲״R8.ϏZ@嫶ۛ~:6e N`:,rl˾o7xp&+9k}ve;KU` 9\͆ ]vLrei5ӎ8K{0]83?x`TH@@@@h@pp1i$1 Y] WPlZ@hJ|GoPwv:TGizekGe5~5E?= G}^v\![ı>w_RoE6VF& /ZॄDmNhi%6j j jpq\Oa0iwM\.e*6 CWPZ  r$:acJ`] 6`qgrl{mj b3c6M2Z q"GpJVǾxѦMV;,|!},X^m LsSBP&]l{,| T&^E D D D TQ.NkCGNZ$._.`*TӂkuU)vJuVO` c:)bO{i矷_e]=NMK*Grz ~V'+p-PV!$+MӼ5rt)P*,^l>ʮdq|A[0LaGׯ_aOBJf7_ڊ]۴ptȸhn|3zߖ3~?2{2gy/=h۴?&x9㠼Ƒ{!`JK+ggu>`ڤ >*fΜiC JF,tXcΆyW8/a`ZW;V'MdY# @:b%n^W{oA8^æMOɺЋOjfS6Y7]vLoLLW&^>w7:+wi_XQ̱aA݋bIS<|#m@< P iGnG:."P1%L^0-G+-LN8O28q1ֻaxgeKt*N qdcRV:XOJ!|||euf֣sjX7ilkشZyaXs'|m{5]#2+l9ԯi<=qf뭷%lx8pq /Eڍ1._aܿoێoJK.޽{Tz<# `)/kqG>>~ϥՁX#U|s9Ѭ%^@ӽ{w#sRW\a uY~@@5P }h|#BK:,uK v!t0y*T*XN?t$n<-HpX91 :T'ӡ>c|tFD^Ϊ/$썇ڵhLOΥnh:\iдi,u_nǘKN?*Y0lyfF= .̜|϶dо}Q:T fpѣ[m<Xy^8y$Ĺl|:'Ұ?4ƍ3;vG!ɓmV-~8;:'NM0~@EK/ZǏojA9.2ıT}2qʗn=Buя(w0 GB [9MYb5a]"Γ\tgasboXƎk#,΋fo=:wֵa嚵J^,/]e 8\k~.]hجIմ>Rsѝk+۲c/v6^6`}Rö:|#<1űMP>}TIps95+x+밪pvCq,nPxYy@@}-Y+c}lk35b.K=QQR[GP8ɂ0`T)g20%8ƒ.)Y1ciՆ%4J|]t;\[vfKoIkX1/M0 F@ v~QaOG֒b!c۠9`Y- /L컈]z⩁ISXyr]|% JA?o8d#?b.K=QQ \>B!ZM |q!\Z8xr捛p ,wtL :5'aqp"pd50_L6jP,t޶8zm>xAJQS{rXX[0+'> QvJvZ }A&LuLu T4Bu^y(,<Ӭcʙmijp˞LU3E۹sg f$e8{͞{EKYN ek4 B~8`r+Nxe c)`7oeIX N k MK-4_aD9x7ŗZ:)Ga$n(,۝0 Kpv@ghX a##>P` |!F|׬sΚU<[hQ,TyR 3[q!C2LYSG_p ^aud-V{$(]w]S,έ3x 'EJ\(hBy @$N%L?x ~IIysL Q)[-m֗TܩLeJbt;Lmw2ڷJ:O>`دlbkV:^xa)ӯXͰzYC4b4n~Y[_':Ƚ$?;oXe4|p/+yˈQ;*W^yhF>?G NI%хx(v\8OKt15h`mv1טi+!ӊuI^JX{H8 aBƭ Ձ|7dEй:j j"p+555P#<:\L2硷-ؽ /ĸȵȖ45q\k-h(Ȩ38txsDpq\</tR{-,Sy}#/ޓ@KqQQ)x^r|zqǥPƤ2ks4hXEgv* J>M|Mc8j`;4>|zü0b{ct@@@@5 % d)5wS"`i_piƴEJlorʥ72_Iƹӓsd[wf nRŽfܸqY}kb9]S‹C{[JŇ퉮暪+ɓͩj\v®/G~oHJ?#__ gviDbMKWFZ>E y poW[|J>\~)v 7jdOH)>C_RѸ)S'x(KCwyǍuT"9&ϐ>쳒1bm^.L曽p{(6!fbslyT (߈ǵK~'ym֩ @PiCi2jf5 Қ,c6mb~=\|P3MiŸ3ͬogd5`2Z2/je}Go߾_oo,L?s%|Q#WC!]va=iVexŲVg}XVS~;Q<?TN7/79,vJ*E"'%X{oڠi~G„3ONڼkѻFeVXr_o1 Y\=̣>jvqGӥK39lVk׮.KW^1 K;uO?;߿ #8tZ t~[~O@駟n(%iM7yӧv0%y;ÜuY<`gK8Ж뮻^{ͦO4-ۻwo3fK[om{sAN:8zv2;w.܇_|/!b~̀on /`f]/M: 2D. >u:l=W_}u!<5a{/?3gjG[;e2n{:{mO=]u3j"> Ty;y J"5Bb|@@ tunдiPu_nǘKN?\aa,ú}'v0馛(2p1pwy/7 B_ i}5k%q@C" V\sM rl&tL>~s 6Ԁ;ځ (-Sjef=j(oK0> f~oVV3<0}ѣ-xf  Or.;H?mYW^y9餓,-R,`v嗷*fmq1PpO5ؿ;m]zGSN2syk/3qDcU89 W_݊1sLa! _vmg2͊uUt%s=״hp2hرGyu]xW@躐<3.W# 3C;weО`VYec[e}8i5h5MZؗ?H |q!\Z8xrc8j`@fM` MC.5{iٱieo(!jЬqf]8~u)5-lᆖOVpʰ4iĬ@ 6~9̴i )ITxXՂkIuN(pD9DX/8X2@ۗx^ziv,aӥ+iڴի w餡?0uhaƕ"grř8_^^͛77 EuUV n+%0@矟n-bK8hR>z 9hڴicZliKh2sO5jbQ!ӾJ+dh>qUW]U.+>yBǺeK=clǺƚXyq ajf ?mv׿>G,@\MVӈ!㣕<qXLyS[ް`aXq!9EQiX/rx:ܻZt1U(ۥHL 7b:I"NmG@`L^25`/\drGXʹG^.Cgl m]m.+`hU:"Uy*2YN`i4k]zQZ.ifU(&󷃏(\jť[_B￿ n|=:]w];Xf5LN2X#H.tSs<,@~bjL'#ŲTH'H>Ǵ:@0H3}>Ay\HxpOXد?VL2uMyxI> +`[o=7^~Lz|+堃2@aX3޹XgL_xɧ hX÷F,_Vj @ TŅOꌵ[yAPV+]>c&ÒoZīR7?`Hݴ , 'v},| L:>?Ɨt kZȏ4o|snW 3t]2㘱NhA7ἎA֪RU r;Lmw2ڷJe5O>`دʲ2v5*䰢~XeKH(/oS/x5U?bDV:X!" K8M䢜d0|s=ݤ d@\pkBD70 祗^>oݲ0?KRhh+u)=RCɚBV%keO&Nr&H0 0tԂ  Ȗ:_  ACTR F D 4@gmv1b/CX66 IDATxj j;![je's  ^+* `YAX{w%PtQՠ=NZM<_`W`݂khnkI~x5Hk iWYL[τ}%_+4!]tZ\\N 4ւK~uZ G D @n)D D D ,P 8Ea:ג&q|>`N'i:'Ÿڨ/e?@YzQ뭷*&j/e9m/h:6jQ4$k’O|'ym9X3MJp"w!xɓQ]!-y>`N6fk"XUYECwyl,.լ}Y}rk Q<?N'狛Rߛb1^IqYyCQq,N@8F>;`{ΞɉX9$ HݫQFcBF͜9eavթ;~8\u]:-SP8ɂ<; 0OV812j6j߂plynt |0A)}cO hy3Dj{ 甶nݺZ۷k0_LGmO Yz饫]>r!GU{᱀ OK4ia_ }`'`L3ŅpisʯˍᨁB BUVY{ Xꫯ,ԩSQcq$5kUvl+pl`c d.]ɜQ6olQNjӰG/hO @td>}ѣC;3i$ӢE oX;w67Cz2S?#xܸqH7>:ottMͪj-CܵkW{/jM9^ӂ?4s̱gu!묳m3ᄏN:zcz-r#r/xi/gr9cvnbEpMitX(cQR]a Xy 88+ SP89 ' >`cQ-+#ۨ(]v:BcП1cYwum߷<|ȃ ;u]-( u䡮'uf:zM61ݻwR,9x0Kk FgY@mim@` 8N~}W^Fvs!' Rm@g5oR..W[m5{/kh\UE<<E @nSBE ~ѴʣiC4EBҭMy kZ7-^G ,A1\Z{ !`WLy Xȏ A8,`X{8C `ʍ8sqL֊OmV: 0ajٲeḴ"#2Ao@/>P~VWY}u@vr/#`ڴicu3fK8 z嗭ukT3J<J+d@~@ t¾{/Xi'N:QJkR.e2ϸ4:M*) |$Ns+i4G?j j & X[N;.Š%aX'E5X#/ğx@,gM|p+f4/*d-t%_r2:SOٵ||Q ubjC9jk?ر }3K}X`B~zmסQwtՐ5xD|CfmVI4^Ca@yYñcڲy<#=rO|$A}SކxT;_%6E Yi؅4=ŧ״Rǜ83Rx am7s<%;ޚKČuV m۶]?d|h37NX-1 iȴ,zx`Q* CLÊ̔ _ʤ T}Rwh:YҔfCN疅ծ\:}Ms8@ˍB^7*-+ZF?x'߽ 3UwȢ /Uq,$[ɏ~+ S&N%L&K b4sIu> K~%>QӦM+L !6!pSU%庠Nʕt:/^xdE|z?ɧ c(|q.oÕ_@Kϵ{CD}vBܼrKϪ)я! 8EG 4ֽ&.+B#{ _|QvXXu'0XMczP^BGBmf 8Ea:kI\~]PN >ߗY ԰zh+O Љ,i@~@^ Ю#˫H_qQ(^iޚNp@@ Mj@Kft"sÇ,NLM+:]N+7E D D D D D D  h|=g):ZAk.@Ya?_~L?{Bop {|W^B ,r!nҤI^/w[l1w7$zE:={袋senS/ʩc^xyωsN*}.뮻ܭ$ȱu䜻;袘VXaG998kΕ:V\qE4=s EISO=]}ՎD_̟sM6n͖\s].DJ L{8pXGG&I%ۭn̶OE $2Y.<).b="Z ID-~OV_}u&ms,q#m/iݺ_С'Lbw.]xE.d \8,Atӓ!31}-C\Zh!(,Ženg SY Y綾^?}"A$ @ CtSNF) 5\A IpC!Lyqh~9y-Rn ?!D80Ĺ@D0$?p֭'|wNuQYXC(brnpnC!D~%~;Zy%, Jy"vy:NֵG%mV6fk:蠃!?',#@'NtGQr $Ҧ2HE&: rD D4L}8~HϺn0%lHvBT]{~d  V0eh_z饞0gR8s]qMq1b'rCzcAsOO1G?SDۈX,"b9k0;!K<"=$zI'!KDx{٘?aObe;ӡ)/I nj=wR]qsK]N;Q:"rHK,ᗲ!5D~AdsOFju>Kпds~wU/4# ET`CqR ȩmCʆlA4=w6Wy] n˲zү@#P?U?Ws0 @vgqڄH—euSZV9s:PYr䆀!0"x&K!мxN]<Ԣ漺ѭ~+lh5=kΣ˥f}9яֱ Xb/yLd!Ђ` /Vt_W)T kp <1o;y 6<}4NS.9nG2aYYRN;a];*k^rfeChuíΦ5T<ݍ0ݽ?3oB3'v_CV_)>/k$kpu.Qd- ֍?Gr'DLV\qE뮻s=[oߖ[nM7;b!)nƌeryޝkq2dH^5J2DWewك5)3?s)'[+9-šC.EL*kݾбcNN>lDNh9/2 .Et Aխϲڴ C#sE0ydǎ_cyݽN>d_F $$;>Ra4vG}[eU>;И{ٲ{c:5/N a=ne#5Sg) =vUn葮MaŸ1#^?֔>vkպkӾԤuCjO7.ۄ ei\WkTbwvXwLͲOql- bGZq*qq>R?7vm7OR(CZk-7xq=Xwy/8[^ۍ=˟yGp 7tӟcyn뭷v\sMGT{e[^k}x"yj<}뭷=ϛoe 6İCgqW^yy睽-x'Ns+4hg}n;&x<䘲D.p,Ë/}u]M07ygN8wcsП;n~0o*~6zc&Mwdm fR#m)E' t=jߐX8mDl-15M4,kOAn6D}i!Z20AІ .r~2ko?w}yB0tˇ As=>!`.D p{nw|B;dK.q//=;t};%K/uoT9ul$mS,CD;H' u-+:eC`0KSj"2i1z闘?s6IF]cR7162Y )> 3!` }8Х:nHb:. Į~=z< 8zg&cyʚuEANʶ("N2ҭ C!EQ*a/wcj,"CJt-z(mr~'˄pp衇zW_}/rc$MA̐q˯m>+PD._}sDk.oò& Ÿ<.d# (~Kv=o$0o\r’o ;0|A-y8dR7k6=Cy;찃'Ȑ; B@3#pԱg=XʇCC?4Va@\J79e^'www>\m~x]׾? D$GH."vʚLJ ,#yRQ5ɛ՗+ķT]l%Ďnkb-p [j:Gk5yzrqItvGrW7go ߅*Jꢃ]8kh>N)c0 RbՇe!Puc2p14`y RVKNuK}kkh t6uVƶm Ͼ+ݤo܊sPGNp,B y8,{:y]^ju>K A]Nٙj4Y 9xh/ ˳ @S][8˚Τ[)F7g6 oĿrq\s].Rё ea{vM@#hy6nRpCtVXl,lCh:s owS.9net:Rvºv4U֎ʆ!::4o0fطMAlh(R@H.M\kVإf٧jL*!`!`42)瑶U 6aG+A  y6_+!`!PmoR,ߵM^-k*!h1]q{rCjX!`g}A&KJWdcIr1YLr E/w^keC(  sC0 xKphn:|'>SmSb)6PqYqNi-]neC0 C0 SR>Ѻ"KhݔNIyC;=(Nюmږ ۬n!`@5"P_S9UإH&gNlz2n!`!`ՊLg özͧ>.t$}hY8Pꆀ!`!`44!2τ:MUrb: e9۲쵞k!`!`Պ@wMxD/f2Ch?M60 F-ET%v`$B{_ئzZneCH ?>̍?[ozXO7n\}(i?뮻)xuX|0au~'| J~w /Y':e%v`Ycu9OYZ!` xn뭷v[lyw /PzDžnp'xb3fn+[ZAϵO?e q^P=u9ovOk/7\s`R-+f,#֡^KyWl3RMK۬ e1!0["?-b U31j{k7|n]vq?J9vqǹW^A [,ER(={,b3}twYgV[uQER_vm喎eiӦytO9꫻M6-E;=5T2KD%r9aÆ~]~SOu?fm#2A.qM2ťoO|'s6r'OͩqyzNy>rH?&]ww_~Q||;39!mA(piK*mzԾ֨pY8m*ug,=e]691VEb^ve{'o $ꔹCFXՉ? -j9e")K??ؓAZa1cxSsq{/<&"7wqCo&}Dsس'Gzcǎu?S+H\4ٗ͞{MQiV =D>8/M~O R6h ww{{eER/tq,KnV )0Cr-D>Fq袋W\ I ,苄Or )GidB(8})WcK.)c9u5׸N;.k{饗soƽ'|P2 eO?;^|8HɄ82)`ԱcGGC-}?$9A胔;ǂHqe9v&e_~_?VK/ oYXh,h[9.Fb@,egrC(\IJ6|s9p݁} Apa'm k^,qL:7"ڵՐATuE!(Zh{ r ޽{{իj<ж2Ѹ5\3 )BٕK/'LHjnl?#<`ydr9t /;$kӦ=%%瀶Bc i߾qa<(/b\,嘬ꪞ@#Ed0kYp]tt@%6c<"q?f}߼ |oK}iKwb6̅s~sqS,'N?M)곙c|RZ'O:Rl2V 1YʁPPF){,@C­* WL `y?,S ңGo)#K;w #Lܴ28X XqQLGԅ%FҾs] aAV\qEH.kR0A~a_D VZi%OMdo9j\˵ 1ʋj1T"o!Va~[n$eZ?ZI]ˬG-hB'GuܱKٰX`)´5ۤt NX?RLwfKr"v(P$k=墫ۭl9> wXd8wGB"cPm"*k!!˅% o|~s!e(/IDN=`,˗D鏨  9CH, |GSR3"Ⱦ6Y&&{T0~;율a 1#EAX/ge; R8CBL|SR9MҶC1 ~M~PMrwG}:'Q:݈E8QդZ90>H3>uS6k,;<_bd2qKl7;h˱O 䚧uEѺ) vzP '۴-eY0_| 8K8\\ش]*AR^6ݳD { EoH")rH.bq ܍uGi qwi0ax㍮o߾~Yl {h"7I 15m9+_I|8o88lI`\QTJ}ߴ>8nv`?V.qRqO < ?>S?<&ܝ[}q^}O#ND.0"#2u6_SF 7ȤM}53wU~K@ .:Y7lFj\ Bm˻œer #d35*?cAʹ(CZq3A>}j8CĎ Wx!DzX,RH%c,D>q:~e-F܉-$k%ƈp@}Ѯ{ ˙7l?V>DHyKW9`ŹBzɑqc#zQmM=L7)s~ce"RQȈ jL|@>oG!d#6®uN>!* IDATtQ\>qQN'T]@0bH]9\H]&uRInzpiKo$X`R>)KO}hn)s>vIm~<نc4)qz .LC[(:<ĎC2PLkK9}Vҗ冀!`$`OSj)oc7OXeo l$(s f>"@;듈hwi>W5Rc_mHa1da96K1!`!`M@S.9enXGVVN@X׎q\Y0q[}5l0J<:7t <wCʣcͷrykW}!̻D$9SX5! 4no6[^KġRMK[7!0" x9=Oꪫ8 9 ZnPAꈰ r yqw}٧B3h G$& n[}^[bGx:6^#&SOsfoEb(l$o OCH 1<3<~힔xy{xcNj/"#< r"H8G.Û1x*~$]$q̑[C"xD%| Hn)B@ jAX_z%)p#Cƃ oTٳH[IDaRT K[H`I3SWqF·?GuTw9X)瑶ax ]6aG+A  y6_+@Q9F.a2/,%0q4IU,ƖJE'+o_b21=3T~pQ)*h@dl{H?cO z$"kB -$>HX m:u~;2X[5! Er|K6YzѶr]dс B+NkY䆀!PH ,YBRK 2/ DD"q$NC{CTJ,qe~w޵Xdo 2!ˇTXvcqJ&UYj$JDI5cIPYƫ_FK+YdNEѺ ˵Ip%M""",|K)}9˹@`?R)S~~{Ye$%C d.tNV9f/ ӝd)B]B}V6 Fm7QRiގ"beXnvmo7糌'Ay%!x}^a"36sq' A{챞Az%bO}i&bN, 駟I4PB^x} +أv!xa/" 2< J^{8vBTY&b?qY%e[O;̹~LS(ḩ<17X qBI,^׈3@3FsR'+622K9!r% 1+J} ..9F~ֹ3l\5&HXY,׾􉸰,ɲ!B(2{y!9cqf5+ LG#F=zKTGùuYcż>˸ hˇ#K̴!:FB"vDcu*oOm+c8d)y|R%C}a?m}_֫W >|Tp;Ym2ʐ;K<)r>}藛CpF'd6KuEf!`$fꎽTl"ur/aK'"4 5Cڴ}9>t!9=z9<X'$u7O;K|RRchԗy$v)YL۬lD<9/Ghnf!д˄|F󟰭^^ׇ؅p(l'CL$j CGR"P(i<3Z )cmpgBB})߭TJ mYZ/ꆀ!`!`TY܅6=gkݔ֩UC:PYr䆀!`!`47H9.ؗҫў0HTBG:fA]u)tLf!`@S"Ko2mZ/VGVV  TY;.6+!`!P &c[n4  Ia6{oo׵ٹpzn:Jhgm}g68 GRyۑb-5W淚L IX㴶W+! Xy~ _dn4)Y_~q׿Կ\x *g Mb A:,g`+hYA!Xp2,czm|np~g?48 8@ :u1~9NȘ,&K9;eǵ!`U@v\ǎUQ2 y|GiJ&Nw:b3["W扰pBa8n!`U-V!2f<%+M锔+YD'Éhö Y0Zo9rr-efy|?4ʘ6!`ԗJFR$MP'6q=P_Y0\uUÆ s{vӟjhw}^SLq+;2 ⋻u]׭ n=wP*T{oׯ_?*^=J:wIzw / dןdSnsk袋L0 r _VtCBG8ЇfV7 ;w)O8i5z^y믻#FG}T7'KӋma{uGyd(UO=nUW>ξ0!`HB'kh>6Wy] n˲zү冀!PaAt;GtW^5F뮻|GtzߏM=*7||Mc39*{f1;va뭷:O,3_~ywqg@=kΣ"!,UCJA{hXGG;˴I%ۭne"{2 DO'7/o-77@XŒ~n2is_{G\6m37B bDb)˟c93 vWPv%^zcqٺk׮~aouC-y%yt6#++UѰOb/n!`Fٗƍ,kL6np{w& l ^5H$n0`)إKiVYCG b]s5x:t _ƍ#~a C( K<"=R.58Nky0DK/]s55,Y\jwQջ GQե@t?K췃D5%7i^~ze=Nr|ߛȞ:t"?KԆmUs²Tt2yb:L"9 [0.N8M klD^!/«_}NjpS\ 1cƸvQny8#b!kmf!6}-=gR]X!`8y*^֝#B\:eɉS2Ml꜈ے!CgDYnOڶmwU>KHA&9眳ѣK p]x {xԌ%C{yHKkN.tQóBs\tIF",.#} ⢜O*1YF3t$IYyn0ZBꘊ&u1-%C 1 %2Nr-<%Vߤ}SelSmz+> C0 w;Q8HP2N`K=j_ zimmuCȺcɝ3WŜ(ɚ;~15-3T9kI>!v rֺҏE4!P4jT99J=^Υ2@5f@)bOc ~b|RZ'OC섌b.zSz\+!Pׯ3 D<;/@ &Nw:b3["Wb]m8]zZGEW[0 C0 B@_R6Z7SRNDau6!`!PԗyN$v)YL۬l!`@" .i^ dCZN&-Ե!`!` @x63n}թrDGz"0 fi33MNO lS,:ޮM+ױm+׭#s'VP @#]h/|n^*!vy,ku9egrC0:ȉ3rAb<R7_6n. FZѶ5R]b_/+50a`X&/{ݮy C:Znڷo:uTuU!<]JX)Ȭ76c-ZKƳ8n2Yj5e!`T|xMNyT<|MK.nwt}Q#Y:bEqXd)Z&6yr[ b֝SelSmz+!`B`ʔ)nԩn9樅IV[-Y޵m;)\_~tkfͫn6w)rcfe4>u5\5RJVHq88ۑb-57^nsvnnUVq'N,[>}'i,Mtbɓ'޽{QFz)7hРb 0s1nwvz*%_8∺gv--3T9k&K/VN2ZW2ѳz>T%Zpi׿+,;8+ګ,V^dEܽviZCgO?yb ԰}衇3w:y+Ν;iӦOQ: 6s9gjEN+38?<%Y#P۱ 2tNV9f/'b'dLwu eZhrb'Lh׮#z'ѨW^ymfnuuᄏꫯ>SnڭjHs=DHoFEC R<1 Ow? {9!c||P(Yf >@뒾[~Gn'>kmڴqo;vˍ/)y cT=r>Wkx6)]#.OLWljZ v ȴJEW[hr*0a{g-n;?ݓO>]p_v뭷˼=h,[ GjD:/#R_{n뮻֚?KW\q\R*C nȑ.SbqZlܓO>#Rsg=~ݻ /Ruݓ~I)[|nSRuEѺ)rbKvQp"-BmV7 C$"27x`iwqD`ȑKF9HW^]vu|ZB裏%\T%5 -T $sq;Yk"  KC4Nʖ3: =PQ8UoƞI|xn#=t)y b%]ir&'6+!P"RD$iu s IDATX*^b;Hh"|~際)~*(uĎhѬ޺q̾;ףG ? xr=K[lᣵDom}'B{25LhLg4 ~nmZYmc!`X}ݘ1c7|#Sbg! DRrn7[J2I,a %vIy#vYQ=YfeǍI,ꪾ<~xOd${h=zy? n |B"V}Hqe4 uh eU1vHbm)gC0 !ihnV( H@*\Xό}y<H4g&c=/;r)-Yqز/k:inݺb9;jJwm^e饗d~InF7߼9_w'z y (ǍHB0Yʗ9@wMx!YZ7eujc#Ü.6J.e!,TLၐl>C [6/[ve˞$KVARH1;Iy#Os=ڌu[[c=We0bAtO5}N׷g;׷W[zGp72˻YO?c=2cDK$."3D~@AhuJɵAMd>GZV")eed"2maYS}Uu A%t.6+!Po!u o{rSXy<.vGh&&+qsG,DOt s/Oda(䡽g;B"uDsʺM J"viTY;.6+!`43 iD)HѳX|AF *B )R\豲ɔk=+ERsqX C*ڵi 2}Ô^M-Ur:#1O60o柕 wܽZƓU֢aYt* D^bڡNM'l}k=-!`U@Ƕ\\׎ o/սŏnĮꜭC&Ls?OLϛIFd:2dq/{ݮy C  uvmğ9ݘ3*k'Z ϛ[2fs4,#P6"h9/Fv)c5Y[f@u бu9ZlwnMMX~׭@<\+J ʦ"qod"NY$2ɓ} J| ús=`m}MceC0vӭ ׾m׵Ck7yگnt*ܬ쩓gHdF8 _zit ec2aW؅I]&E=,qZH!P@nv~kVU3 :! Er:I&OQϫ 1YtIh9~Mn!`@c"/}Ijr>_2;R2Nql!`@S /&ud)Zy9ĮqB9)2rV6%jrgC0 T)qh]lnJ!'Éh6mKYmV7{Wo!P7iJ<"i:kB}feCh?M6O<f=ՍÏu*>OGF>{ؠl2!'lp#246 u2ѓK A]Nٙ0 fԩSvqGGC۶\iCFOO4y&^}TOqK|]f#<\ @}9< ƉVÁ:F2P%0~=oÅiӦĉ݌\-xwWE 0&HZ,g_/>uíΦ5T<ݍ0ݽ?3;L]Ŗ3?M J"viTY;.6+@Myӌ3Kvm%vvaW^^ JUDuǏ/^ w MZh!7~QVXaPÇw7t?.U9ԤL2M/3ݙ2yuYr3+:tR=7iU׺};رcH]r F,zu'y]j@qN;Xbk3!`"/݄ j/^~ewUWԭB2,zꩺt*Wm`ɓ;"twzRw'{LZU ԜYsQy 7nʍ=ҵ)lI7f{+\ԚR NsZrm745)ېA,:#/z ؄΋~6ݷr+@N;F"6l` :ԏmvnȐ!n6+,z=doXM4AX>C*?޷Ock6m.nFZ]{>G?DQf 45F]c5ܹ:u/|IZk jo)E$ĎC,Aw%p='K{;C܀_q8zWX;8D {1M޽{5of?ƣ>#t_}yW'| 0;s=9ORW]uUe&Q M:I덙4 WP)DZ@qLlNr"kpu.;k\k3 : ! Œȑ#ݡN;42e'-wٳW#vD}gD=w {{nO #8y6 +_}?+R1b)9眎eH;UH+G ='HK.ĝr)nM6q׿D5!RDЃdBrDouo'=z8p[||Fm ⥗^?m[f޽{omGDoc=1,{~L_׮]8DϹqe~q ԗ^ziw뭷eƷdhMnZ\8u}uٵn;o{lBu[Eg qK4.el&6kx C.gN^|m9p\!DyםtI ED Ht ٘1c<-eC[*"z# Ttc ,SkV[;o'F]tQOv(CJ;q"5;3߿Z lʾ+,\sM_q:(/W_}!ނ .r-=\9LNIO Z.?/LVc7Ҍ"v1@#2Nr-<Э2Y6= Cu]>^{yk.D}B4i%~R6Y}΅^>#wj"ʉX:eT&-zN^*? vUf,%C%#b #+8)b244j0.BYN4o߾^DXx_XffY:Nq.w .[EO>}"@[c:if>ER#m)ÔH1̖G+Aj[M&$,qZ֫ C5ʽ~ɓ :7Ѱ/ұG^3~A6Hs5_A":̫RYVkA@]~̰ A!e2^xG|1Y;b6B~ @$i^,~Ad/޾,~GSOu,3|˝DX:~=)[nW\e̟%].=0_묳'Dx2I9Y}EK4sFߦa^&Oɵ 8zg&cy [$ǕT9Mlh;a9k]Gˢ0*K\ą1 bDN8H[>}o\tb7 2X Yr%&{RV{vplݺusDgD2$$-/ˊ3<,h#~Ae%HD I::m[l9BƖ]vY7x`dw2.@҈!8PՄE1Ygm!_s'] DXyFs!b׹oyAsnOt^L|kӦkS8I._G/u1,LRֳt26:?AˑA0%e K.*9q7ކnXg{3lYnD2qlɉ,S8ʓy,MYdJTB"1 c"T_Dกyr3 7@ ;uWljqOJ06D(MD]"-/C iW.uMKC ?ȵ*iinOw#ƺ? ޭ߇J%Gf}Ra_2?.|x1*s0::.N90GWd}j> &i=墫ۭl@1|^RySV(1BVn_y}q!7I;wĮ\2$\128uIaY}Տ\uM~k;]ݸǻ)|Qr 5OIy#E,en)mQĮysIl@#":7Al?Z6st6uV>7iۦ»Mƭ8~UVإdM\O&էֱ!ǒ!C"=2f9}ladt:tbWrړFt#3nr#%((4m?\, ?a[$uCBGd zZ&zg@ PɽM2` /vyg?olhcC#wfE;+*7;qp9|&ԡ-WRb`!(&>rC9T8.Rx-@n0b/,[ɨ۝]h# /y萧NrbׁZvPSv&7 CY#vAmKP B=ս5Ra_/+50a`X&VcV1 C0 CHq8N趶 t=j_ be=`X㴶Z0 C0 jC@x*gmmɢZWֲ C0 C&b|)]U'!vBtg1YʁPPF){= C0 Ch R_5ۤt!bbS+/2N1'EtWZ.ʆ!`!`4|uEѺ) vzP '۴-eY0 C0 jDs$K4MBdB}feC0 C0?pHmO}]H'Cвp2Ym C @su;!`nbmpgBݦSmrD!z"0*n&׮];w'VG0 C@wMx!hYZ7euj|@쵃3!`$ϧܝw}ĄƯ7.w8p?K$Ll!PaH9.r}y]i20a &Eħ)7ܮ]g w{/\sU+ 2d;\n2oܽƎ?x׵kפ[oFrˤ5  w;H]r|C JcN#T9_؏ֱ!Ф4Q>}jLky܈k}>n3-`0M<ۍ5SOAu- 6߿hKuYǭ>?oKm*@ҘHAAIh* D*(+PDz(Adg`@BBц@*@ HC<]osy1[k5wλ3_W\1tXwܧxg7뮻ny-___U9C~6߳g _B袋v.>eu 58q8m%jf,A\s \eÖe 7=qO<|#(79r=r/[6ԬOm˃db[G>x#&4Z 9!w.[laO~??ڿ}B#~\KʅqcYnFm^_wˣЊP^Ox+o|[>?qVb??[V 'Fg>-oi ^s-{޽P(]/x|g+l( Q\k!> uV_e{N|[ g [|O ?ϖ/8w|o^{my[ھ-hs_|q+DW^ye[C~DD"JGOx|<-|8DǛoo]zW9#Z~OW͛ۧx O2DͿ뿶|AE/By;9{8l|𪫮B$?V C~_//1pA(/_W~?wG?|T{Vp{WN>xﴋ>Ol|k_[g~Ȁߥxzq|Wu-Ć& 4G-=r13pP0aFؕ}r?yyٴOϕ[6ߺiQpxaNj%/yI+Bum6/x&SC/xꇧ7{\Zb"~p\ >OO! @ÿڵ X9vӦMϺZgl(2'^ccY?5|vrc'8֭۫-7olzb9_Ri%m ִ  ` ۷p ^[Ox[n\rWrCւ8'wl@ec׮]틮V!Ώ F?g笃՜@miӇ~Sj!xz qtnᆷV'?zQ|52c3u -]'5]4) %@˰lzH=ױ5=:bG9懗㎛V^z~v 7J7uC;49yNyK_ھU)2`-47}v'kGTN )> o|b-`1E>&D8lר' CEDo|f7kd<>~ ޖg_ Jml?'G%j/GO^[wu_rY?;{S8<O#A,Aŷ:Z$>Å_}|~lSŴ'|L)b2DQ a)N1'VA^`}ەTXK^b@,LEr%DxPq)cg q5LQZj^W}ԏt}fuRwtO?=_5TԚ~Q,c`'ajsvs7NГ웁3MIE6BI.w  s}x2 3+its ,El9*_]ŎLkξ8hIqafjOJ==?ϝeQsKm).6@C1&#8Gە#  Xz0@M㠣,-z&b1/*Lʹɸ 3`̀0@vA6UZb}],/zmPZf 3`̀Uͣb$X+Lbq2mPlIf̀0f 3 D9-zSͣ>r v8k6zZ7f 3`,0u 58q<8gm5xqY13j 3#֔76f *+wEZͯD_ac=qf`7RWẀ0X/]O ;6D׼}93 ??oh̀8Xݪo@a!űq|Wu-Ć& 4G-=r13`̀0f FQ}\}k5},ǰvtÚڮZn$<1f 3` 3P(<Z%&51~N7Q_7~F׵ò0f Yc޵ Let&X6Zf 3`̀%2ULWCŘ.j D,p1k}3`̀0f 5^kT԰9Oe;D-(IKiX7f 3`j1:b(_ax"xi-|Ɯf 3`̀E}Nv5,bדx7f 3`2@- s=t>Kv>MF X<\zǹ0f f /A˨Z7jDs]㺶f 3`̀U r=<[WX _s 3`̀0=yԟt^vcIl4Q -z 0f 3`VS8EoyGNqAcZ.6xYO9f 3`̀N᜶y'v t .9f̀0f YdEZ͟j}9O"3bNP3`̀0f`V~8}z\Wر&6Gv׾Ιg`޽0f  ХH\avF+t賡Ik>jYż+3+5WlKod̀0d`fg/ c OƆj!j 5]IxbVeҧ̀0S](<'&&tOC&Ӵ̀0f 30k PТջta,n˦5Vs 3`̀0@_㡽ְ*~ŲX.ưv^ò0f `_ tjV1<ɰY`ŕ65ɘt)yf 3`̀X-Tz~Q,c0!tS4OD9ؘ 3`̀0RϢi®&TELvz29f 3`̀Ueaܒg).6ҧɈ'ӕX̀0f 3 De9h39]kQ~aF]h^q\ 3`̀0@vA6GWbkYv}XAku3`̀0f`cV5΋pc>n29ʴA%YOa3f 3`j2u M5).#6hLKF\8i5g 3`̀0@)4\vZ®a8e9̀0f 30 PPScC7IzƱ^Ӹ}3`̀0f */]O ;6D׼}93`̀0f oOaq|Wu-Ć& 4G-=r13`̀0f FQ}\}k5},ǰvtÚڮZn$<1+޽{ 3`̀?X5B}FL$0b~ŽDFOZ :k]_0f d`fE Let&X6Zf`X?3wn 330ſݙ~ARU*!ŽbLb"ڵz׾0f 3`V~A/5mjXj'òf"W@$cӥ4N3`̀0f`PREj[L/Md<m<bcs3`̀0f "K?>i HSq1ىD3`̀0f`Vz9sK:H&#kh,LW.b=7f 3`r3eTDtE}]lu5zq][3`̀0f *]9x]+fGm`կ9ǹ0f Z+`W]^Yk_̀0f 30 A?]Y~_a׵$4Oex̀0f 3 dE {` sY1NC k>jk 3`̀0+@M@0W?hضĜi;D}0}]׾0f 3`fZWzך.\"21ҍbٴjuc`޽0f  Lv%ULWCŘ.j D,p1k}3 Y]ޖ0f )ͮ}qank'òf"W@$cӥ4N훁Ug` V\܀0f`a`JUԨ~Q,c0!tS4OD9ؘ 3`̀0RϢi®&TELvz29f 3`̀Ueaܒg).6ҧɈ'ӕX̀0f 3 De9h39]kQ~aF]h^q\ 3`̀0@vA6GWbkYv}XAku3`̀0f`cV5΋pc>n29ʴA%YOa3f 3`j2u M5).#6hLKF\8i5g 3`̀0@)4\vZ®a8e9̀0f 30 PPScC7IzƱ^Ӹ}3`̀0f */]O ;6D׼}93`̀0f oOaq|Wu-Ć& 4G-=r13`̀0f FQ}\}k5},ǰvtÚڮZn$<1f 3` 3P(<Z%&51~N7Q_7~F׵ò0f Yc޵ Let&X6Zf 3`̀%2ULWCŘ.j D,p1k}3`̀0f 5^kT԰9Oe;D-(IKiX7޽{ 3`̀?m) b(_ax"xi-|Ɯf`UXƗ0f`+7{gC)j"M_"&;q05g +b3`$Vo7L3́ޘ[Kv>MF X<\zǹ0f f /A˨Z7jDs]㺶f 3`̀U r=<[WX _s 3`̀0=yԟt^vcIl4Q -z 0f 3`VS8EoyGNqAcZ.6xYO9f 3`̀N᜶y'v t .9f̀0f YdEZ͟j}9O"3bNP3`̀0f`V~8}z\Wر&6Gv׾Ι3`̀0f`P}~5^®k!64Ii>jYѕ3`̀0f`%4^ccY?5|vrc'0f 3`VFa*1m9va45}3`̀0f -w5]47Deb,5AŲi7f 3`,1xh5b"(t,Vk b1]}3`̀0f`5]ڦU ϡ2,k!nAq% dM28]Jj޾0f 3`V)_XF5r;McNk+6<7f 3`,2Ts4gLkξX5[px3`*ݦE|`ܒ]i2bt"s3 YsE ff %00ſQhWY/1ӵvnՈum30?3n 3p00]9H_WbkYv}XAku3`̀0f`cV5΋pc>n29ʴA%YOa3f 3`j2u M5).#6hLKF\8i5g 3`̀0@)4\vZ(_ IDATa8e9̀0f 30 PPScC7IzƱ^Ӹ}3`̀0f */]O ;6D׼}93`̀0f oOaq|Wu-Ć& 4G-=r13`̀0f FQ}\}k5},ǰvtÚڮZn$<1f 3` 3P(<Z%&51~N7Q_7~F׵ò0f Yc޵ Let&X6Zf 3`̀%2ULWCŘ.j D,p1k}3`̀0f 5^kT԰9Oe;D-(IKiX7f 3`j1:b(_ax"xi-|Ɯf 3`̀E}Nv5,bדx7f 3`2@- s=t>Kv>MF X<\zǹ0f f /A˨Z7jDs]㺶f 3`̀U r=<[WX _s 3`̀0=yԟt^vcIl4Q -z X56nXvڵj{c3`̀foG)b;<#lؠ~ƹ6^uujξXu?rזkזui3`ݻ__{#ikq16.+Ƶig>]tE> P0f e8∲}wTŤ&sO̤ ;l ݄5yƱNڊxoN5 em}k3f e`DNK!cp}ر&6Gv׾Ι3`̀0f`P}~5^®k!64Ii>jYѕ3`̀0f`%4^ccY?5|vrc'0f 3`VFa*1m9va45}3`̀0f -w5]47Deb,5AŲi7f 3`,1xh5b"(t,Vk b1]}3`̀0f`5]ڦU ϡ2,k!nAq% dM28]Jj޾0f 3`V)_XF5xnB'\\F1kYe gֽo`?̀0f E4]Md"^sw]o\ 27/z}cm0f 30@-Ꟙ[.EFxh(d1hrtڛfs,&yy-ۺ5f 3`0P8nǍ`110f 3p1Q)Myo>w뛕Mח(u7NZ3<+};rGN[E9-~CQhN}`A#f%Z6@k5_we=3`̀0uuqټrSXnV~vMv7vOs-?vOq͛G˦u}q[u8NV7|R3NK6IhxqYn걳:0f 3`f]vSeMԲyƲg皲RnlD܍7nǞgyKvOٻ6_/{-%nqƦb ;68tS6z1{(NtM0f 30; )_~ 7r=7v-_YgzN*'~x9Q(x/;o(n*)W\ʔeDQti.ksk^>k>/zzf 3`Te_tE9[yٺmK 5eO#eCߚ٭-~ӋG?r>ܴ{m~ȶF̭)ǞpLǯ('qK ??0k. x_ IMQuB]}/<o;DCÕ\0x]sϞ=m=c573`̀0;v(?7Nkux ͗"H4BoŖ]PwpJ9ņ3u;vl=kˮ{];n,۶m[nwZ2\vOmMLdm6~8Wi0f  @p[o5W]~yx<+:|=_~ěy5pmc|6^#W`P@D=ڈ%'v>MF X<\V%k8à0f d`CҎ=գZuW˶#75ag6{;/3U_gckq:|s?R@u4®yW]~׾~wk%~K GCۄFWkY m@J\kꏁc򖷼e9-˵4È0f |.+ʽvrQʡo,ߴkͺ밻ص,\}c'.,߽+3('xRaV5B|^a7icq O0zژ=?:ܻ`=̀0f y.ٖ-['|ab}>W^/.' ԟ?؈[v\_}wʗrZNձ3lEn[)ќ9bƴ6\8i57ȷHDf 3`fN:z;NַU..?'eWϡxGqD-oY{{N8y퓺):u 58qsd%j9m\x볜cf 3`A٦{G۱cGٹsg7_oKLb~Q}b~Pu`MlqcNP3`̀01kxkuso˧rW&.ӧ}jksk^>kw0f 3p2..XxVԟ?P̆& 4G-r13`̀0f L/cW/ F}`jcЎfqi΅dl q3ۂ 3`̀0^Z>oRԅQ`{myja^bldinϹbYok̀0f ea`ycS oΉis’K}b9}ؕ3>b110f 3`@& ]M#wa>1+7H՚d6u 3`̀0׾O ݾ&tj#U_cS?i\}`z>Žrq6yfQO2i 5zhξ0f 3`n D\u˨h#楤uP1W_1 >N\e=)xp0f 3`D]&I6QFc\ǹЧ~"N"!x#AHKqNr9gNc紌ўe 3`̀01󤦉6Mͱ9j>s䑃9cn"Yp`69oRrSkMC1N}}x:*Ud2 0Ǿ0b.cmD|~!ʑۅ֨z_zȮ!ŨO|,d@9Rzk<cso\#GOr(̙clcQ! j9`zs">-9Csg=dZ^=yϵTWO.qjI->^^8? 'Z'epȫ|]Cץk}U@DOh/X ,E}Α-rc }G9q’lh 9j=s݋5j#>]a+͟ˮ _?#"7qOvMA!ǹZh9}3|\yX3kc-ΣEq ;hdO츘.qb`8194 cgGnO5 kOb!T9G"lB-1 鷁gό~pq~|ߓZ5g \|=+p}` |^31ku@둧.5|+E^s n80uP4[Ӈ}Ka_5܋2[I9Zbb͟=?r-=wY>cj,,wFM7Q?6'vcn?i,󈱆ysXxXcX X{6qA54N#VyD?21okihG&T6db88ё?wS3滬csaO5E\I\k;-alľ͑I G'9!qMI[>0յC)r'q9gѺ~WL}7ΓƯ g3Γ?`?xS'IZ3O<}Z:|#'v"t1`P1a #b1srMXP%`b4#D0gqZ&FC9B5A ?[f1XgsAΉ%{FZGz?Md}`7s8'b7ٯZ1Lj18C͟w<?P b6mb ň6fXybGaX b6mb ň6fXybGaXsCȄ*|ʸZ # 8WK}bSLrobl1@ 1h8cтTs}7~)9?'z0?8g X?}3bL}c< =`8Ǻ-|渮 ƀmܹ: XQc`,kAà0f w @`ЪȩOK,< XX Ɖ|揪F?~ᚊ}GclO8QX9IE=D,Mh._I6 D⼻ztC7ϒt{8s@+λ}EOސǁA199}s #t=x}Cs}9bN1SGإ!,,}1hXy94:>j\>?GܷUϺ~Pg1o$_?~|Ļ|У8XΉ>r*WX8Cl6Caa 1oI#V,.|xj?GrumpP`<̀0f 8SG Z9Xꏘ@=jx(Nc\x iGO82>NvX)󹡊%ư98I 1`Cf"V dn3R}",̟tKfl׏[bdЯF9r2V̫mۛ>,p36g' 9ᆘGsnIZqMYӸfq ͫ?LpqXŽc܄" ԪP!8or \K}`ph ~\ '13`̀0f`@(0fCcc1k+)[O}`uN_m 0 vsI܄rbp*0bX]1mc܇q9ӽZpcmMqqPܐbuZn L1k#948cpM\6Xj>F+7v}G]97b3`G&9k>5q1Ǐ~!NbcZIJu9ሉkٚtNJ)4cq0G9cjQ9G=g_C,9CM_lsˮ1_?~^+׏}}\yz1X(X5u=WآPaD]CT$j>`ocC_c tnC>V2_?u7Ok%/p06n:s49_X+차bb4@ÀZӇq/ĈGLE\s&rf g,s<71& dXWs7@M|󃁿| 1F <5cj5_sC|jc3qvVs,ZbPK1.C3z` FU6GO (1h6un]+~|Nct83Z_#ĩi֠mab-0ѕKk#6EƋ.1 E4"x [pևt;tV+]u̟]HW׏_?#zg:$9'kMXӲNIQ_qNYY<Sq->\!^S-nTWן+@~:ZG3?g' 9`pO"1@ـ GM;bsZ>{~9|hq$5S9aZ39קu`1v9GԽz(qn"_q]=~{%p#|<g>,kc^cDD紀ϬpbQ!:ƴ>rqTŨz gD1_? P'^z A b(>9̳aL"磨TQ#n>-髥<挩e1W>khA}Z>~>|E3{3^+׏_?ٝ/?#럹bZ1j\ժ54CsH8OG#V)@яyλ梯#qQ? Clf]o|dwF?+`p:K?4GLy_?0_0,[k!|t?6#Ѳsye5ӎڜ1;FʰXͫ 9,껞i\K`n4bȰ]ݗCgjfk׏_?}s?8_qƼ~񁘾6\q,ܜzCd㜖qN88g\muq}5jZ^]=~q^gm WYG[⬣jqp8hkZu5\-:gm WYG[⬣jqp8hkZu5\-:gm WYG[1#5k19W Qt>ιb5Qj4>JksƣvYl!1A2fk̀0f _ Dua&4O{p^YlXAŘ1h }Z@CoQd_G\Vb6mb ň6fXybGaX b6mb ň6fXybGaXdN,NL㱝\ D 㱾65\-+ g}3>Ɇ 8k8񳵴.#qhϥ\X6Ixok̀0f >}$\wc,XgZ c¦F8g1e8׶5f 3`rY<⼶fb}D[G k,7m2Pz\b>`P|m_̀0f g`XϰY ,r^g.Ĺh#!ܷ|ûa3\F-Wub]:_ .}֟F3`̀0CEU0m[T⊆!Xfu}~ O]67h67h67iu =_Ap{/5̀0f /YGӢu0f 3p3* s~7f 3`Vj+{ 3`̀0f 3`̀0f 3`̀0f 3`̀0f 3`mR~IENDB`davmail-6.3.0/src/site/resources/images/osxMailImap11.png0100644 0000000 0000000 00000030716 12564151555 022011 0ustar000000000 0000000 PNG  IHDR:6iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx m/gU%tSχPTBIJoBz"WHu𢒿KJE ])չZ{7XϞk9gg7.3c͹kJ*3Pf@2C*hjU;4y+{}+hg: ZF r7l /1{;eȿ}+g5)Nt>S74q#eVE5ǽ̚m{"lSҳD5{ NcW$eiW'}L= Ǿn LQ6o#9O^og(۞oۈmXdaE0ҿ5>/E0V57mGsJ BRhBOqTo1c8[\[Us5xPiͶ\JL'bgm)y9qOHy)ҕ))O>'(#KwliC/vZDoްPyˊ//ZXC-FUZW!ǩsb<D~ % zdK}l<&YҿyL\(GʙKT͚<9LߴWq50d%_x&K2~Ɯ͆6s^X&670LRyST(_Ysiȕx,;䅚5Nṇ;s>FP5!cd:PN2Dz&.N~St,; Oӱ'.N~St,; Oӱ'.N~i:'δCh~E_Ȭ_޻Ϸ_?qn;<`>iEŋ8`h뭷>C)q 2N|Nx1>+}jh G6p Er?&dEţ)2뮻z=\^E~c_~slttr~=7|7<\p_jlPۖn/| ?#ٯP>g|QӪoD5׆Ƒk,@j(?HE1\񄥉?w`3zs== kҗ fgcccQF8񑑑vM}qov9~T⊕3kJ4 ~f?Tʿx9g&I8{R0q&SWN$N6}٧zG X#풮gpp0k7:j5LLL64 ox&vuW94b B׸&?h԰0xeCQĕ+18ʟj:1}kF16J3\p6X'T|"Oztmy.R}衇vm4'nMZ] '_k753,_?0˧|OuMSIǎc>'9h0|kBZPK`78~"/y;?>1 ]V>/x ? x ^ǭr)c'?s_ gA\c?5{c{/{{dH~`8G'}!y/{{dH~`8GةS)Qu;n ?͊Ml![m\ju;s{*}Q-%<^_hg'0>?i`>g^Ȑ=2$?q0eo Ox#C>^Ȑ=22dwjtbӤ_\8q^'?v>/U}e揜Sc:4@,o#L\:-).xe hU_?Gߏ3i,)A Hu~F1#:?J2Q?i/3i,M@~"1,?˒r mV:V6{[<\ CkIcAD:`,RY6-z{\{=lqjFl~M7y3xĞjG;SzpxLt  3ZE>FK_][i 0+*Զ~Ò뮻Ǡٳ۶d-:yM6DU5f%j)W:F=^/ {|e3OG -Z;#Lc }1s=ozӛ&w _vAE2 c,[CXvąXvڧcO\xje'?q}:ąXvڧcO\xje'?qᲇfzjaZ@섉 {gE/z$\pШk'?q5ӏ50qc ^?mi@*\ŅwS$x;Sygy?~p'Ad'>nq-+:VmcWcap ^̣!ck39K?Zv^'IҸ/XOVyūq.?q0,_xz7qcS?V;ʝK2^cԧ'#MyX8G'}!y/{{dH~`8G_NNvT: 'N;'3ʛS;|R]wjBmKEx9ť/ y-Gy&<%Ώ(#pTDzX_Ou2ꇘ"͓֟|&5Cf,|ov|ϯsK*f/yӞyG?zgk .賯Ʉ{s^< ߆eV뷟G 6`V6ּۮLygҠ~" yLt_z}cBOle#[mV|ʾ"?iJ*Ȩo}nb_[Gm_Ggދ.(UzK^wl#絯> oWo{& j׼f(ɯ~w]zנ5ڿMݟ\LG~LX>x9vw#8b8C_c?\veKv[cσGxh7k'bF4{+r)pгڏ~X<ήϚ5o۞_;r)x+qNo|cavk8vqWoG} W. et3$ݟAs;ٞha8=}֭co~󛽻밽~\U,YU|].fm?U?<=8'>7/nF싔D./>[n}"|o#[oX Xi}=g=c/g.saq}voͦE]KPݞ__]}pqhf׾ֿ;g._8c|{ߋk{3pQG w-Kž[zֳOTո>΀?Oe7Ф0¤z>AN+˟y&AqP(T7϶lжm̶-lڶm{=qزezIsI{5?ǎ=16q+1b;U/^җjEKh^{M̟?fP?.7oX"%^{"{oSӺe2 _OYFloG>evߣĶF#Z,e]zַKlK٣ĥv&B_WM;}?b뗿s$>O]}H-ytv81LX%1O̱u le+_oI'N6t3޻Q[֩Ml6z7zwF_ rGg,LUO<Ϝ{ 'qbgI'ނ[qW7l5C+~>+eV/8ۋ+p& o_/nrcџT?SmP1uƊ`# kKɪ\1y=؋䥗^ڷN ?\+l⥨p =v65s5q*O9xܛwq/ïh VH3m,J~OuY<ȥM/e h)]T)~O5MG(ḇUS;z5ݸ]V(hkoag_ݱCd`Eärww/  Mˋ- ~kvv[k1lSCw,sϚ=^u7\3k}0T4W6?&b&q .qATfYصC";h`$YjԱLak˻]\x}ʾ҂O,_W\wڒx%oH%s=7O$ j7mr3)ktL]KIk^[c\ ?+vvjol_0 0o쐽Nxq7؈_|6.N;:|Opd^6m.Uu\n{9vI]U>rxG fgq.;qePݼP{]O}Ss8{b>]c$˨v]e̘<-> _P8?g Ψ}{iFOgIܦ͏QrSO7tlzm\3u^ab.|~I⯵QB(ad8⼲j*_7I9%Ig.E"Vo]“(t{;jv[/͡u.SDASZ;= %_C٧b WᲗϯEpn֮Y@ۯ%Gc^đu -O2[Qc5|X1h#8LV Ń$M |f6J,j?Aqlg> waB5+Sgּj)roAXZKqH\ %1Xd\X:c`\2T`ȾlؑTszSz/;rG'> v[sz.>g^λ0n8cav:S6V8]ˌӅj,v1<˓Op>{#C>^Ȑ=2$?q0eo Ox#C>^Ȑ=2߬S;J'v&N‰N:x̭&N.75$%TǝС`yaiGNqK,i@Q=*~O3.ܰ\nm_2]߮$ԵEF݌/|qbJFKOU?|6%*?:򙞱&'){ϲ󣜠c-yTN/>?iR,R3uik(R S̏e'L\8GX(O^'<>HTTҵi K1z٤:>)9JsS毙VSJWgz S&[f vٕyq -gWV4e<6Y.@dp(>ŖB3=h}.\!ҿ~b=սxPsVPęR?A.Wؘя%g}\Pt@r_j@5RQWNXhOFJa%XQ28_TN YNyxd,q w?5{:ڤø=!;'Y ܫ?|{ƀ=lu?"\Ph[B_:;&á'>ZKz 5[Y]BF4VhZ\IDAT'&*y?м4ssmVP~Y_xtq%ZXjLoZ ;dN8꣣ ׭=}-|K=΂/xfOw`q6l=~jopÿ a{7 W OGY < kEK~^ 7p?yiG74޻?|K6l?|>7ߴ'ۧF߰G_x #Õ _|qp=L| v;~*m?Ù4&P|Z(ɷni.\Zm&قoXl~J,kn^pBV=^i,zιxl1# D^]c}/ؾ'F̦?9̨kךZm>y}gHRc0IcF+$̖6ƲG?ϢvzvOZab -&jP쉳!gZ&M2ݟ'w?|#}gkn]lyNֱ# =aUïo΂]Zxa``2< :߶)4)  q{s<<8[C:UGG `Ǎ y@yQ6v-l_1_vQ%3m]k}Hf'Ivm@x;$V1j3Ǜ ['`.77ٰ',0DB5PsqG+bqDxxQo˩_ekvVyBDn;=7\l7VmN%m]]\.YShë́Foba8#N 7q@EᒟT=iFNDsgv/[Ir"I+X @aqj+j&ӷ(uw4'^y}vml̖"샽\3[Fx-v{]‰بM3RW ۥ˻OY w{.Krf?5[=Jɰ.˿? ׵3_qڏ,^kY(ӈz_* 8&^O>ZjԷiW֠Hב*!&sҚ̬` c նolɃ+57VG4v{d*jKA?b=~8>r@҉xAsqp.p|vs9֠'5/κh<|= ^樄!-[WZvF?u-lݺp/UkxɹК4?k^|jv3 "[]OJdo6kwQ{~vHKq_?vi89/ _D̾}Xkmc:͟]\BcXH́?̅[d=^Z\rj25a`#jP\-_ \~oh?!82.~Sl\/gKʚ_f>b=!oU?[WsMufiMǧxmz8fV1e3=cYHd$']4tZ,ٖ V{(E/;+Ԙbnn%=l1\cB4i@wFd5f6vqJ7{_Ԭ|}PGa:)v`OY$:1#C+(naEEA? 585128[,($}HXƁ4ւ=&&?p58MHEEX EEX_\aYzEGDF0#MX t )gR5:1Og)H1d}<ލLҿL۬icDj65[?Kc0ijXr*"i5WXÆ _q7U NbfPC(5*ЁÉ%5(c6jEWX2S%W\1}s58%X Po[(s$2zKIhY`a,?JMݑ:Qc&E%kSҦ-t,,N*4X$V co.Tf`d׬ \`\H$Z8ICp.[5Ʀʛ YO[ٕk^8$|sF fH`S(m,FDbۣ4 Vsa71b鸓-> &q{jѥxU3/U88"r\Z`WcOJ}0MClJ!okSpFb\Fq̤3k,$LP?#ᇎowBdžd[H0h~bTwn2\H$Ë_RjII!:ȾY<=K5b=}7vڑ?5!:`Sل8 g1L`-L8:ckq4;bw+uQWNd85Iݩ~҉v1_2 0q&~đ.:D~|Pjɞf׉H&n*TtBC^ΐ,=}:%Ls떼K2sٟ$U6t ovbd&^r PE".ϑے ׵_z^ggkg8 X;YE)To#OuP8c/K_2++j{ُ{?)m{~eG${}r_毨~ <&Y\v‹b 1c/poSeVV|s9>/ef!էc,:eEtqw\d,330]Lv9|[R-8k[-3Pf@55W> F~YIENDB`davmail-6.3.0/src/site/resources/images/osxMailImap12.png0100644 0000000 0000000 00000213351 12564151555 022010 0ustar000000000 0000000 PNG  IHDRfiCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx}l5v H( " ("R>:HO+bEtA邨|4+Eۿ5ͬɞ3sf{.+3'Zʻ;sfpGp;}Pj6]abGpGHgL3E)"Vh"1.TN2LYhQ2H2?>~cy`?I #o;gߔ#0I(qNVɍKS|wӸ&. x\;`0С:5dPYB9Yp{ǯ6||8 ͕珯?:.d[@-J.i!VȡρzX/ޘ`׈b`e~A;Xp-yW> YZ`x EAZIT@EyrѾsިQ,Eg@ZRޒqAJ#3V>  -dfhN<=w8BdHi8M :>D7~ł~[I\\;~$dt2K;d@J2.񭂪 c?5 :J Vlzq"MBd- CB3dҤI 1 Om|2XFg  # d BOg5,E,@'q|Bb?fCxDdLBkL ;e#"B`T' u;~:z|pnbRxQq)3&J`bʼn#,KÉU+-~=_?Hʾ~ׇ?EGg*?Qɐ%y:vMvXs?uoun$xo⨲" C'>. ?:망1zb(Gȼ2M[6=)c7nXD|5 !~I UӻWe i躽8ObY;gl珯~.R2%d.Qx^)m\Pgo\JE3 Ò)aO񡯿Ҙ FVE&u-WC +>|(fL1^4/!ڳ`@L qY]w0>옰ceVfu@vuMX 4>~Wv` XJ2~O3B&GCI78W!cYP ><@O=J)R&G. FQu@)6_|>Jd|>h|ନž~Xz7Ǵ"䰃%M=xm_ȪȨ6&TCYNnkq{!7N|ɍ _?Y^?7`WpR^tWԑr5 oST'Py5r(؆uY'rO}hxnZY4<"Ћq_"2%X0!7(QWg: avYX\!^_âotJKT.ʙNcـr\aΜ9]zW8xZ/#ʴ]mH[y.Mӆm4efo79ub=/lmlI8U.5HldЉHeYYfi)@W^yexަ}_ o.K.qLYR%g9c=aE e9{ \}t9]9ZIo^l]NqCbv?ow7uT~g0馛|0,|W f~pk,kCXC7=@l>>я#8"|K_ ?OzCڣs .m6 gy匫RyvkO4Nay匫c\W%(U:~ic=S/,iStqhodrTB1#$OK:3j ドw#}I_Abp饗F{,[oux@]w]c{a};r;|wUZko~?On~AS~uw#sgyJr|_2+G:-› O/n/r[o뮻*q?na8g' /6|s=5_Ö[n9uŗO;O>r!zp #![#' 㳟l'?C w_xާ;[n%o }뮻kG#:= \s.[o5Wփ<:۸v:E=ÿX7ۇ=bӲZJq5f8}tMnk9\o64ly䑰N;W_]kG?7hq:i$~r.q_7|tOaLrjvGO[K?_[4OTT?SoA_izoǬm^'Imk>!H\!݀Xi'@S{XGx10)QV},ڰ@HG+";Iő%}^LZ9Hob"= w´itG(oU : /nEcwT&NwYga m MSlz0ˁ#>}Ypgyz#"0]ve.0ǎo ǏWr. W\ $Mϵ^ 190OӰ +4[UM g} K. I' .e8{j@~8->y}8rc⃀r7`yEnAil`|_K,(5_lwܡᨣX }k d\cl<37'N0xG[(q5'> UWp67NqoO>|v.1V^yeߓ@aO҇]n|3}ڑov^/ i.ae6rK I DP"![iZ_;fi G ~<ĆEtbYtw5;X t. v.>KmtqGYաǝ9&.&/ Hwhu`"V'j+N7,lm@q]p~'*j3F؅ uF ; /Pc\scׅy͑MK/m$?HG/>Ho 1"`ǵ;vlXns=or֋F}SO7f[z|Vw6zꩨK{G a2 3SO=UI:.'x>vi5 ,vx$,nN8m7 dq) v `|a<:.P0J2nL89,n,806fzUeCs }iUXhI] ͦޖxZ#ctQlȋy!n,H#,(Earw8E@*h=u!wީ 8&c&Oۧ >XG1ˠq?SNE;<!/zqV\9B}`X/uu~\bco쬐_ 2.Mp|} |X~ cX+-4їfe6? iȀ/Ҭ1_ )tq̍q?Q'ˀPAyHUNpʅkAĿ0m62ŗ038 .luϥذj!X;b\;PNNqߌW etp}}N\zKhJFht}Qk!Xg|;B EZ&fQYu@3Jxx,Gu/g! 2A 9!uPRҰ2ˤ"̓ 4 ՔtQ&Sp p'?I-n˫nnIݨc axn ͝ e<ԅS\ɫ@}]߅YqJnu? u=݌q3Bj  GCڠi#{P8_P8x~PQ[xX8t݂=S/]f@tԠ:EC[NT`$c+W2jbd<&S:*{I3}kg!ör2GY.$8'7.|O>Cxc a 9eLKg|&\rȡi+C+@\K7?ǏD;?CeY0'hϕC1 ?wK |Zn-$}-zhP"lȤ)S%kϦnOE9~9>~ϟ9x o7 zBi9BNRo5/hcȚmY=> ZS|ui#[˭e2Ӽ7G +7vSҼ4z$fŖQfO)W)![e6L)'Ldγr507AIӼ f4_.O֕y#@XJKWqXxyǯ@2ǘz-I;qjd:%d\j8S:(lYSLKG@qj_2k;kcӬiG{v0~bf,q~x!ޤ{C{q@wyibj^_?B۟--v ^*2rREQYk`Kr'y:RX:J9R\4+{mMX}jH[;DĦ ?Bƫ s>ke/g]C/O3;R{^[kB 4&~yu U9ݜkw_l0O&mZ>#YYe}c5mS^. r2Ӏ}-6iXO+:ݾ@/Kx&~D;:>2kNFVڪ 8L&ѤQGjN+Ox&^Pb\>kN+smd~ 簂!}*[9O{?c&[.~*'Viqexc36W҂<0E;%~OSNїNqˀ%Ƌ%4^E"`e}m|8>`exO5_ɇ`ĎoKB}+VF=w;+|J~َ/oO3$mոwx1i6hq#em:bmzu_mUl]Z2=&RQ|/1Z7U;,_kpɄG> o[c oaXQ'^7E obx)_2pQ+R w"_ կTEoa`.4R=`O{$~}7W`o7?k 7qmuȁ;v:k6x)@8چ1$k77q\ȵߊu= nR~oR; |p,yƫO ܘyG} ;pgw_җt~zygC9Dǔ?)nؐ,GeiOVנ8qV.m`oq2T4cX 16$,?v 8~̀o`Ns n[LV #׼!4ua8qbbrwxcEbE  IDATMuV)W*TUj佴G[D%3q=x. /_ۗ.`j]5 =?^ىk^xꩧǂ* }:y!wjc$V`vrsüwJp168~}}q~ cNCUrCSY3y[NTT%]WM[iuR#qC#)![]a鋒jȨ-t!WEE/X [A[2;3zCN .ƚkIGb _^Q{%!iUnN^\7\?PzE}83?p mD5Gh7a1õ>묳1v\B뜬nNy*RZ8~k;p-w;WxZw כ2-? W;aוRtFʙ?}ΌY}y\㸤oI/ Yaс\HZt2IeVVn,qcdaXlqBg=sO8qa'ԙcǯ moW]uUAcmɈuBr!-I~59"^TcqLϔ;'X񱡿QqBq]w+北/*g8Į< r%kN֊w8C]w]iAk;6fQK{;bށP9SK0xF{{Y㦔[?@u$ 7 s2^wwy0lg.Y t 9us2tӅ K=\ 6 ?b[o5lVM7TI;V$6l;f|j^{jd>|sH<Bgk hna=TkDgU ?i[6oV|[nأnԉ{/xsIz/|(Y/6h#}6oA7 q]qcӃ:Ho]#<2V/tI'nl}QIw?[_fc}Ty4+3@|4NE;8UiwülE;s:@ f ^zi8&~ qb'(wƵq-4(糣3V>x<<1(Sf&'rD &ЪR{&LG8FYSJϣP䂵ϕ'y9.b]0߀ſ~=ԑԇYKBqS?Vq`۝wߪnwYtaeY+1oE7űf{<&/Inr _?h/ߟ7MIL4!E/\ub 5qozdJP]OuR{1/f̟~w  A$P%>mm=L/  }DHIYwH)~v|2ۦ>x[\wUǼCYռcǷ9p~Tw:R{xa,ũח_g^c/ ,+亹:(޶]Eȩ֑o!*ꏕ:ؙf:ʪ9}h饗ZiqBI4kYhӬk4èY`y_ÍwN@ykܬokk Dr+3sFR_RiD9b[K{܉_t>Kco>4{ySܙw{?U-ueCuoƹ>~By޴W"Is߲nPEeZIst pVJ,]&7Sg C oBhS%xkeΈ_L=;Y/0=vGpX#Cb-SsTh*k82%_/TؐuO:#8E$K>bLme9SW&)![Rb`` //LkZr$XCv7ˋNH;qW Q,Osv#8#+,4O+(+BWȏEݱslhle$luZݜ=t<8#8=Gkи-3 nCޖ:?[qJ$P*/kiVٳGpAC%R i|*Bdl&%*)[&ypG&-t?Y-qXVϤKɔm:`NFL}GpAA@x(PbF+0:#*F&Y+6 ^ pNhVfutGp "m+%gsc_$ޤȟ9|4ts2tpG))1HVFg u lq3B$]qL?Q0 ٨ǎ#8BDlI8Ö:DȕQAb)j'Gp"`6RFȕWn64!EEC% v=8#K-tW6/RuUlޫȊ$ӔiF^z]UbpGL8!t1g+.'r#=+W%kC#8`#@e\EƯ^36#T)%X'm YԞrGpAC -ĝ_S>L *a2%_oBԁM=pG9$Y/cʭ(m_ܼ6N *[{u\T(}G&9#8CHy&5N ThUI*#8#0? ᒘs>e 9!WE'+(NpGXm w厧+WaǢ9B 42M[6ċ:n:Gp#` \hܖ!oi򟭋8%d(rVU{#8#0h[j$#BSKy2r{W+SM:#8#M, [~ڳ$Z ;#8=Cd˸?K\S5/hSlM_e<8# $_hLle&,ojkɔ2˔|I 1S6UcGpGdI),#'uqjd:%d\jX lAsQ%/LkZr$XCv7ˋNH;qW Q,Osv#8#+,4O+(+BWȏEݱslhle$luZݜ=t<8#8=Gkи-3 nCޖ:?[qJ$P*/⫿`x8#040DkI'8i9rJy$^qfmnpBFGpG`HIPF2:EkO!G6'ou Ҟz8#/@ĖS?lSk>oO\$VzpG)\mC e\9 i0*,Шj d#8! <۲ a Ζʙ87#du֣,ʭ,GGpG`P |NqNr:[ՕH-ȟ9  %\ {#8#.dmetlq3BlN7'f=pG_- ~2Wׂ}ߞ[1*H:EC-#8#S,چ@r`UYQ-r-*xniGpGXrm|)"d >ȒqGp3ɖq.t,Ky7rk9AI S,<8# -*b6,9ks9BNRּtʣM}7}i-#8#0(|Q3eSi%SBlF,S%&LTٳ>Gp#@%2:)ͫm锐ra1eWIEҗsϾ0pG$`@M,Ȼ$x6qJȥBC*OtT%DTgGp Ĝ!-Kmk>Gȑ` p,/:!]1Dd#8@%ݒ QJ_ʳ픐ػx^)o'Gpn"`IMӞ%;gLL 脑Q?::`t}DcGpAC@x(e4_!Nc-3qoF!XSԏGeY[Ybb#8"@M,4uԷ2+x[đ?r)@>J  GpAG %]8@`?fٜ,oSO)*6H{6#8#0[NeN=ѷrcTXuZ"gcIGpGXr r,+s(jhCr[Z4T"݀mӎ#8@*A'z%nKnRn-UWEt}%<8#  g-]Xnrr8ԫAXxpG$[UlYrr*y錕Gbn/[iGpG`P 2F$f:`(3qgyT[Kl0XKM:g};#8=G$KeLue9SW&)![Rb`` /qܟ}a#8#;HlYwHlR㔐K\U`bKЉ~n8#8.9CZY׊}#rX^tBډbbyjGp^!`զўpWxZ]AYF~,ꎍ #d@c+Ӵ%aCpG9Xm9q)ٺ\SB&RA|-~)_}cGp!ZK%A9.:忔gc)!7wZR:%pkߤ!O8#8D!=K%3vR]ykt)-TL #~t6uǎ#8Pl˒3iB+0:[?*ghߌCWc[ʢ(GpAEě39Y9%NioeVW#R#6#hS4|4ts24=8#8@Jp2._ 99Y8~˟STmlcGpG`~!"$a__ {o JǨ  D֓#8@Oj)#YVNQUgцFU;ȵhDۮGp#`ɵUNJܖ:&Z0 KxpG @$[iб$.?˭ #%qWL#8#3H8+9UJ Z+6_ӎ#8 @eFItQfN򦩶L *aLɗě3u`Sei9#8BM=񴺂"t >XA>GVViK†xQCǃ#8#s 6| r:6m9SuLZR. ǎ#8CCtK΃sD](u)ƶSBn` ztJ־ICpGp%aC6O{DKg줺3R2%d[FFl!-Gp ؖ%g|,V`8uTѾ!`OS?ƶEgQne==8#87%gssJ,QʬGnGdh8qόBcnl.tGp4 u}CWrdsq r%eSkڠikNfIMU u/91dBA# 8~qcB0b eď\ =Q!%W[4$ VWD>~_?||]!  Je2v{%F_ۊ%l8n#c4F| #^??Ul7>H3YJoshoµdsH .>~ʧY>sO _?xH~|l.v IDATFOͣDx㌲TBJ%Cz*OtPw$g-k&̘1^WRQ6,Gl.v *ރ>U%in__m`<|󆱏CY)&KȸLEgi~ x`Q^tF\ssN8蠃sU{[M"tR7&QħeGK-~1kUy XAµ"ouebj >ʐgԡ,-ێ=mپȣLM5>QbEގ?5P,&g(0ɸ_x %$dmlY{huH3427XNA:as{Ǐϟb9MX/_ l4_MlDUb[R:9{щ>0-zY4 y{eҗ4-&gNǯ>JXSGƌї~|`7l/8X8v@PdimZYb苝 [=F뮪+4?>GܹsՎ1B9>z'MK+v,&Lіܦ.? :d®6׌JBVv0 Ι2-G^[bW^-&1@]M4IIE6yHvȳ^-(P:sueű6kQTwd Ƌ?X4L?a5҂ \J9lKjAQO)yd>?_v ?ԅu+c;ļ[u+ ?ׅ#SAB[?M$!=CnPB'u4[m ٨RO^tEmq߮gLt[͸WE?5 |X$bHO}U h_I9Bf'i''W豼#%I"zL27+mmr&hN\7k;s|GJGֶ\HjcSMc,LKuВA "߰EtTӟ匩˸Eӎ1Mmz}u{9gȯr !%dfi̖AE +mDT{VJTt"9UɭNQoɾzgy~wlGOƤF_?f:֒#먄3H$] }JdJ<&2Ĕ#ǟ r@9X^C, Xڳߢ_"P)i#e3MTf;jNs{=y㫸>2Z'cǏY$g>r;qZ"h6V>%I+e9ZYE9ˬ^ZulL,a9/!>u%k񃉉}k_8-wݝr*} H-Y3)66  /PN P^Š?Ҷ}Zos.n{" p#󧘇 QJ$֨(W2KAN >3bIvV\uzek}v)mPlnFkļ|>ꓮ?_̚;^(m!;D:feԏΦ0OmfRg=k>ed}Oߚ ?!MA%?Ԍb0X !&rϐY8Z.`Y]w0>옰ceVfu@ߵv_}MX 4>~Wv` XJ2~O3B&GCI78W!cYP ><@Oϟ߅bԻSK5#d2b !'ljE? Q>~Xıv 뇯POő $Vb(w:P?D>>8*ju<|,~/@y42w4I&nOǯa7@t|"7z~Dž\"R2~ p#q,N`qF1Bc=w=yϙ3'^\s4p,ziaK[e21BikZRBkFMrHa؏5|,?3\nn_O ] , x#ofls`GQD@ *)$ȍS_x{ᇇ]{n>0zB.c .v4K[nfcˬM[fikclli,mml-66muM7Ykfk.*Ʀ2kcVYt3ml4K[ɓg]|#>/8o뭷}z1cdĈk@ҫƆ**EJJ' \pA4iR߰袋 viUzUnO97LJ=-#1E(SDNa(y\GחԎyT)sχͶY=UT˳3G 7fZ_/Dy5 $B腡@>j)k ό ]5W^k{/\cꔄE&-KPXWZ桇> ^P?ߢ4g٧?9Wٳgky(dj)BR}/<[VCUFۼgMPF♰P36_5l㿢zN_vwg=~oO|;jk۟.~ܓ LGfΜY[$럯2^9!srT0ƐnHfT8+>7j(%ڑp]h#?.p'X4u̦;-'?w}Wd}նilwK.$d[F%\~_Zh6Ms慩31Aks#q6#;o6qp۵=<-9*k?g0S~/ߗI϶mϒ"'&#sƜa, QB3nÆĬ/uYڌK.,A¬Q&iX~h2AZ^4H.(|K_RR/E]9 gº6to[la 6oqQ9wwᨣ dtgj`.%>Z?򑏄uYGw7:묰뮻Fl_@^Ѕ 믿>|mQ۵Cw=s9 ?#=餓lQ|k]>vЁco8׾5%d#+"|_U;bf}9 'w;L2 1M >Ӆr3Aw?{񝿺.LZ#_#z 3v>K^ؿʤpޛW߃g?Yn[0S 7\vn;C>pygE{-džۯ>:aҫS+_ g8j'yXB8샫8 !3}-Y!<=9.$K^r*!@P.kU$ap4tegn}0 :ƦQoRzUiՕ6n_C 3+/' W_}UYN'>Z7l3ݑ^}^ziXnH$~Z?ǰ{."c?ϫ/cꩧ /3 za饗h=SqjA@ md$]vY@oy[?~mOA_f' o`&z;h[+4Q{0fԈȸڑsMǘ^b0zجVo^vFaeV kxvK,^-/:aLX qyx󡧅?rA"r٭ɂ6O͕Ab6R*3hKFAoaA!F5DUW]|%Pve8;vf|@Gg.Ґ!oA#64IÆ $&[z`G ~R~}bf`]Ky|16nDpN!N!C*̠a:Qg G өd̞b%s/EI{[*W\x'K.)d6fpo~# l|{NXcwz2|v6mE# ƆEƎk"cGFӣ70]^~Fnovo1k=}bQZ/y~<'̚3CJK.9z/.K}ruNQ叮E *Kt?<;Þ~ O|BǼ^?O XYƹ.E&}t*#c_mE^h ?J %\5,$RgӢu\wu qHHvIvwgx }HI{W8>~A8X|#h[ľ&%8.qaM uch3O<#;nֿk%Y!–{"_eG g7Zn\Gg"]48^\罛N�&lq\ÿ;|;6`[+ LsÃwZn%m޳Ô)N~ܸ>YxȅW`=O6NѕgeI~Er_겊5miFCɫ, #^>Yl_;f#Ijr%PDlugeС\n~X!#t~HJ_$@@(믿~_W<_dMIX{ Mx<-ϟ'}N-/VMyQFQ~Rvy:'F?~r:i[<ڇ~ _;yi8v~WK$ϚOep% W_;\c,qCJw8AO  'po s?=9m~[Ex|pw>ݪ nVY} .+da8s<7/R aq7|b.m Gn"Neȣ|q ِVٳ}k4P޴4oȕqA#JH}qs`5[}Y1ΕY޵E<3Р|~*_'cJCR&xL f˯[ se;bKɸ2:S=iM}2lwg&n>{Ĥ.N -o^X i"7'ه=)70^**:$LA_MDB ):4؋dpTk՞n?ځ|e6oUW×@؁uQjW[KetS{| 2k]!2096B>uRʐFERqaD eH=[̣vפ,*{[wvW A_UF=Ǎ/2~Ǎ_=˧ ֣3Edvơ3{d}Cb?JvK&7bi9 \d5G90ՀHu{Ax {_1'z>U(6 SoQwFἔǼ*a~W/ΒD`|ijL @ h4+Z3fe m%v6~O;[~lb_p>ٕv,z IDATc^wO/,!X<:?D{yL1_Ӽ^~m߿,<+׿A^dhvxPW^3AI Jsӹ9)g[٧<׃}ݾvZNݹ3 [#( AkU҅f n_r'm1WG:\g_*q1 \ra/IWja(CN h'-}ysyseiݾt6Ţ %4\B2 qen9I,pc^|ppL8V|tL߁?ת!J PbL4Ow{'q%>P-O T_RV?T )!ۻ+կ ^WJ'جp"ژQ'}$! ND9~$z]?0&t23E+1#k*hXtDyۑ։&bg^}#wd9~>~ta $'_FO\oqf,Y;/'(V`FZY1aKYu{OQ}## Ơ\6u}s6r]rIyèU{%wvjσ|1?>t]R kk"|xM8a[ bEC6bӱ:aԗh}z YNb.wodϕW={gUN?>`ȎFaL|^5 X~_a_֢f@ɀA S U]"juڱ/k;ٳpqqa+/~7?GvapпCy U#!2&I˱ZTudIe3-`bJFokaO500_[`_;s~ÄRK-Š3g%\2na}&:c+6k/]=/'|_}nkV*ke>sAnRFmڵd;X7xz~<3}r]MI>eEbAƄvYur;H%cpvۍ,i ǡYtW^[ouw1\Zo!}t'޶篽~=*,BiAVӯR9HQ,vȓQ”Ӧ#>o}׮Pg*~&M&$:b]v J/uG !_?\s5#f\ 6WL?5q~uYӗXb i37h4!ۿ_վ0)ٲ*N1N;m&rf|spcy^!{)/bb$q`{G}XP>isWNCb?M|;ӑf0嬧>R;5z'F` &}xe*tg1gE GƮ*Ӆl\]nw{ESSm5y7I&I޵YyTy 1 'thqbrg>1lx|i?q7s)>ǼK}o89QG5zvo:KWV[M֋.h/@`pXѣGR9tFlK.7yv0r%!>!1_|TeM ǘ4vyW]uȟSxr{nO~rLa~w,q,!yR6n*< ǜ_MQ;x8Puagg}pI{SA ɘ# ˕xx~-&׿p7'@hc9fi yF>UnRfy~r?7kwF4VZInC-;d?@923OҀ㊑'| @Yw$oTBTƎjndg;6$sd[؍D6}c ?F }o|cU{l}8)A=ywKD?7)!kcFa28'ݾcRwzƊ/`ñ&?ƍH8_ME&vR8a'~gc7(2ԯ]nϖ뭷4ϩQvC^{DBJ 2-,BpÞ~i;NpTPDrG:øϖ@B幥&d5Jvdp1OvW=vq+}so5֘Ç~8.ڗoGnkZNFs|+ 8nKqSd;MNF}N}H%77rc,[sb_?U=;ړӃr=Jn8F R\G%; Hs\Y|b|lN(D>7[nC=gMۯUU&^S}M. Ƽ'׾d 㔐)ט$O1؁Cm5-q@QWa$GsAXA؝CrFTa¦찅;My֬}\wuS}ѾmfUT|,g8SG{r=lnP|:a︤%6=ԕo V^̘)j?+ {1)ޗ' 7NCzdғ_ +Obq640$lg,ì fL9~Oj}MEWXa2D?Op3pc6YR.6pá 6ؠ=j^w:D^9a9V]uU'=RyKE1e˱tF,Hef,'`{XRB6ǽK6F9.C#$2:&K' {lUqU?خ%p~򓟴@EŸ(=f9^,x(]1*lC="Y5 W.¥f%Š)7r9D H|6n6;! + 9֟KѤ=gXA]w\q尜2}e#S䣌1(3xr9{x8Bq\jw%< 1_|qW:pOU"k͓ؗr! -M!G@] K.u"]t,c]p- L|+XA yTKKڟ^~sR56Q[cx|'Ӭ80C8q]p ,]dIk9-%./PdW *"~Q40 D 9,J+c0R!zrF12ppgR2-q$qIBMJ,gIx,x\&`"{✱C?9LzJޞ R\cE]%R}h!\M쒢A'.02yɤ=fy6ǃWfIcegRxzZ-?-0S?yu[dE>GZ_<$oB]h3y]/rʢ,|Ň[]5Cks\*f!.IyVര RW:~jdM:Ob bkke?%˩e./"@la"mbe/}*z˹wuRn\NI=?Be} nc/h[g-Ё(ʅ-xZ~Qĵ?[u|D쉌zB u`vhr |3u m? !ʬڟxV_9ʻ/凂s{M۱!K'njH }!:JE/N1gSk*j6ckcMMϚY2KR # $4J,vP#Vxcޛq٥ P쾒mh\}70-RsrZj)N1GT7%x5/\d۝qa Ilil^0%)f?GdIl;2K= mk+qK& Ŭ:25iT6|{i2N/ܕ/M秴+`YY%m~OVIfю?JφT/ 82U;+$vO<.ѧ6r+}tɗAfO'7~}0@Ws 4/ &|QiXƟŏh|~/i?ۂWTjQ_c g EN -# QP;:ˏ/Ĉ4\ q0>{Xt«-^ܿtϼ1{s!첛 Ŗ͟}}m&"[n*Z/?;To&˿ 2&y nyYkz٪BT~%fL Z)D /qxޮ*;w쳏 ?nd_?oV RuY,@ m۔v0~_aJO }%[j r:)0WX bqGL[' S|+grUt={~p½4=)Rm|NI1ǫ zhGSݱA容:EOvxsÛސv%s;^R8y=ɾ>s12;@ kU)J:~Y+hXrA;Y1A-fLpmW/hN3u(>;$W_}uDT~`-c&qUW3m+C3bց"*}WN_/w?yw}K_;{4wՑx7Wwwޏ.mM 9e+-_ƻ{:Iu 'nUq;r[xj[xJRvNBU_'\y6*bEF* x["Ve#&=3C&I|w3g^rߊ f=f-fă䡀{e|?Ane-qٞo!3+Fx㍋믿~ v9&O<0kdk,X>~jGSǕ*6㐅,7a/ĭj^±+0u2ZIXWe^-TNze)k?(o$+ @!:V<x8zSN5 _/SID3*.r _Cw^?AZ˴SUE?|K}]vYGw3pR8g_CJtD7[/('+0 Ba`x^1P^^7x)'ђ w-[xz-й\^ȹn'Byo &l#8 vYƯ /3g㠎Yd_b ` )aO~*}<zg0%0K:s){+9:ٯʷv[C>G\} 2`\~ׂXs| C3'{GeݛU0]Mp/?=>5<Rbr =,+;gYe+v@^S%3an?ӶiI\=d1e>;T?UN e",ʱ0rҏU~Ѵ߸ACsf.^rg]w{q}[h{ʥ]?6Ic}B}'qCS#.b/ugy&)`AzhfeUƾj/iu.2eΚٷ[JWE~`P{ ӁSmpl>S.$uQF>cƌ2x bv޺=vک 8peS~Nz&CnOr+ #<駟nV$vaW\ц^OTL>%طeTm8zz뭷:,;`sX.ÒT59k` e4rڔӣK.d5jpVP쒧s`[xxU?Rc[V^{Eiy=;˯=v f%b Ӭly2&f9fL$\Le;X(stԩ .c?3l. /X9.kSiʷ*:T@+`o^WK`YWn$hZz/kxW iGVqe1&n喓C^ͰcB !^Ay8󓯹}ҽV\bm,^(XAXXOu7~<\'<u~Lժi?djg?_^pU>hLTؙCleJWaZQ&"}Ɓp;oϠG<āG)S0ucRs#ZZyev@>?$?蠾BgQ?G=Xx)z|7?l e',K˕7q|5a/>)T-WedWfrSQA+#pfLq, Z>~nh?iH_?~h_#˴̓7( 0WƉp^'+W@" "ڏ/Dp8W|wxꗳIpQS.3sewkJF4~5U쿢|?>&QzPS.;Q*RƁ=t1ГXGg?gxS{?JK,Jbo?.'n+~ LO+ơ>I֌M#.{~QOIW^Y<'S{w* J``T y g`p̓)zH?BOq_xxyOljOX^& RuбqW] H^7=Y3$2z>Y9 E *eʕfL!?sߔ|/H_ig {S#=^-}x; Uq&slooTP,z{~GsЙzKL\_q*T󠬀"Icy&n*z3X)gGGC0Fah?@q|yjGMȗgSv?{YSQff<~RGACn@-`@GDM_} +KcW5 V!X:(yO煞r S |@/,#7rF%?h?:gzg\i-ՐoZLxuP, qCG0^〈 ʕHȭ;~իNOUG fmQoYJa@)ed"Ա@k} g#}jO?o':0,>5Cx7+W犃dx^08HU81ܡ2\yi-%\lɆ_kdDd>TݕϔT rP;{R>'j1}/W,ٴ"-gВ+%]%_ڞ/rC <#쪝a^ZAoSޏvr3ccܓC?վ檶W0^pž\}m#V{1YMc|1zrjp!}IE'@V }E;/cS蜫0tR&7=.;wS1*qHKjVhOqLa@@! /]X'Ho'*8 3~GIŷ7 a,IV }:Aۧ1)ZIk}h`RDI <#@ eɠط=| /@FLT˜4>THW4Fh4 ;Ecbۘxzus( H%Ιfa7W\M,FEGOX_SMG j/xKOCumlӆA2NYMI6N T* xϐ^'y/˶ʋE}>O~xZ'GksbM\>I^'iET {O*G?OBJܕW^ql{ӟ4w 'Ac[&\o^z)Y^pŏ' ȋӗYfߧ~7? Z9䐡п h/BЮnmu)/O[fAKDדH H? //Mlp$eJ v:A$(*" ׊ _5/W+-̙#Ǐc\___hJod}j9o>Ou}_mu]Y|ūGZ~#K/xq׾:Le oDk#kAC9j/e#6K^|<|%vDv$*v[i[=[7o||(jVGާH_y'0y|+թ Y*`|{DyO5L3D'[c\~X.wuu!j,A$pMs1/SN9eBu˧s= qਫ਼I?#;]wݡ}ϪsZhj}?Xc"j]mh2}A]M7mmm~Co ']<=~_l{GG2SUtP*„+L >7BOO)= M'd,A%h&m'#/BcX~סe~{am WU'FFq 7y)9ڪs\C=ɏM6٤{->;\rI+g￿c=O|]weњo|! Kfke˜ܞ{|;p[k?/̚5K*iM-Y;{Աb@"! mC}[ݻKx[omŧ|;M:/c9jOC=~ǦnZ:zy}ЮXrҗ4AQYY7?|+FCE }h 7,ad zE=p Jf9l?D}XOAvG۵bO:Nn;-G;.e}Mtvۮ?ۛN;wC?OO>~)'&S6ܿ'tjm>M=#5yf͐C&jg3[1#dя~Ԇ`@+CeL8cs#ĬXfoZ׿u8yc@=]94քg0P>ySo}[)o%|@4j&fo%o<>9rg*2C];>t\P@F"_-آx'#P7S'Kx]Ж_~̙3˫Z(̞=}-݌Nn@AcJ>b-&uNuž]q?gڻK;ѫZ|ŋ?ELjo˽1Fz5V0~ 5!ʫItqxt,d+(􄏊ȉ4n.ϫ <f`{?; e KHnƌ7WofC7xcl .ONE~J*(38cB.O^.i=}u#DmJx oWO삋.noub鲲KP>V lIU@] #j=rЇ$>I5Nk#X`BmfQ?^jm3dS$ nUӼ}*T|ּfH?W0ؗX`99>rG ԁ7چe\FcRҬD3<A3Xk=蠃:1-0c 7N϶3`-bGpi ʻ?_~yfT/QGUsf+K܏",R?\~x;,}-<M:vNdP+9o[ Xoa,طe]hwv|cy$ \H|P~{~|ek?Sޑt'N|qg <_+u@њr!<(2#'r +ڤ'bGV_}ʈVYғó%RoLEY(3m| fFz~]ck x .Ly(+Msӧ)AYoև_쿮V>`"爀}<`eBKe{ʖ˒$w IDATuY]"zyl?TӇ)P_ζW+O[]icJ#NxY1g C&)JF>Wl;|褽Te^y}щ>0:Ja埇RuQjʁgae݃{YzU y O qUd)PZYEK.Y2_i] #85hڟ <-lv ײ و|eSOjs3w|! ]~$3 KaL:͓ŰH;1G7VZiH|a-,9+Cϣ'$呾bo>~%c/{H~3M0Qןzq ''h3.If?e\GmF}'gl4u20 u"1?O?pH p_Gʷ ᗬI+ Hf Kf+^hujGc]f?P?/0cכ!k\Te.dp|YyM8(Kϲ1Q&/=IFL\ )4U헶@?TIT/ [ķQ^kzu2!xzWX'^ypzu2!xzWX'^ypzu2!xzו6}-B?('rӣGGk^qWBy?~Cf99Xp-=jmVM΂),'^l,//~~Y`c,H_@h𞘳n$RH[9ཷ8uLvzVoɽn=vν=Ж{< &b5MA}&}jxd1{_p F|ܠdQވ䏄s\^ǗG:# 篼JgizvNOo?cy}JeW!"+'I$Kx#K,z˻6mDeg(KqT2 k/u)Յ"}'{mwʮoxugvoOrz#pkzIQ0.>d؟Wi_EOjĞ|4M })OYk'yoachHwUh7K`~<_Ǝ`ղKjDpw.>j|oFAȧgj QB݀ ^-еRWa;]y骫r,;y?=U3nHAt *DFj!RiWo\Bq 2sٽΐs-P9K_ilH~'CPdȭ^Ik`>E˜<}!}ފ}!.;_}խ~:]x  ?[Tves9}Μ9] <9)f }.Z:sZj1#`[Ֆ_>A,"E\y?A;va.ށ܉'vu׉.\rIz+\?!K^xa/^N^x5ݻ 7ܰxix olϪ{+ E?Ā̼nF+%uQr;蠃$8xo|m2>ݿ/Ǚ99{>}w}/,-2nk8vu=Qwꩧ O8l`#wo~R[Oh%[zzףH_Ngΐv&֜{y֐Cl/]A{ʇv[wy6 ?|Aٖu]xm{AY?Zt#/wہЖ5 /X%x̨ P/#HA\ };~_{!.!(q}xfm|Ayv`Z'u)$@˰`S?m4sUԥx~V$pVV6e"FA?VsYK5@ \sM+"@['vlM <32!qm3Y%4V~ M3b"x,Rs?ϖHu/CyX#>$l}BMV~p$ ˱]vY_3gȇrl\JY4qI_̨1[wo9AX^%waIaim喢 3aΜ1sġ|(l!e!H?ݑs 6ן~ˮSGLk-[A>eqUY\K0k:ڍi\WajHoLyB`(WF'ȓKSCMzj+X豇_RsmrEs9s{-\Zz LjK\ D%S8kp?Ob߳:[n9oe@@jrj/fp%wrI]+;SzK;ZvqGyp?"C5D$a%ncOl"p Z$ ; ȇb.Ww=, 3@rtXɥ|3w '8sد`.a3]jO|oVΤ g9ʐ/{)dbd?kcAOpH2 t3i=pe+c =N/3BEj^뼠i^]2q'Ǚѳx\"%+Cc)Y-W %hy!г J25y!(+^|W $s8ՍJbC UnIg˴~dvOIwyG{ MR 3Ӟ\ dIO\a0gVOFOD? ~fcݮ} r#D|]~Y{/.QQƥyA~t7h|/XY&-l]o[iQ|f.>%#P$iJV[eji˅r*/#`?B^C9BJك8àc,8=W>8Xz*$ "yz˔{gP_.{"- cĠydN,㬔)M[ !lⰌz4JJoD,9#kioꔼZy.gK ϟt}ݯOvnlXˋΥdѨ_4 >G(^@ : TR`ie6xM_#'0aV;'vu :mM$ P88YjԈA9/XAq-5~kގ_lBN<Y +^ %S5H H9yP_$(k匉ȫԢDӔH~4x"/=Xhڙy|]|V|]|V|]|V|]|V|]|y>ZF}o^~?f?{3O­ps6>W ~@S +"߃f!() zJb~.02^.JֵɢSXVYh`?|~Pd8~>h|||xXD1L)L!NB(G'PLq<~@O荜H#~ J[n?؁FUê&>WdYy2oYy5ҧ-`풕W^ pdZH:~NK]'3vcUГaV EN -#/ 0qX~~ R1۟3V':0BV_1Wx>oRIv680} /HI2" V:"'|, ,,s#XpR6|OV"}DuGے5,kOJSwٰ?d^_e]*d|4+ޗ'Dгr .!=C\Ȋ~ODa@ _?qg*Vh`"Ic7\V@O<na k:>i,n FcMh 42N7LV~c:HyQu QYWʢ4?UB0x-x.7hJtʌGKՕEFJ쪁`64=bn+?+h7C ZD D ̯3HƿĖJMYC0+ 0UA3Xk@Qܱѓ3boJQsUȑ׾SLv<_Z--0Z Ǽ[k 7>`; |7v8]pnVpm{N;^zi: uc&Z Zi k~,(Y Jeb<5\43)Z\%'?E |͋,xgmV-Kރ9|w'?56sguV%\OHC@~khT29߅@X{zZqʁ@.# s1 TgB](Uwsq\fg뮻#<~ ?& ݟ'E-nV1^|[nqAI?|͡FG^93~mz衇 wU aE D 4W38#?7ʫn?nBoa@)ed" a9+} g5=NN`o'N 7i㠏_g+_iE-3 "?{챝?J=P/-exG3"gxgq^1p)Ҏ(\W\QmjZ2VG]Ex9%oa|M>(e]d`-"nVs/1 /JJsͯevЇ̙3E$h3p'xOYk@0?MXxR>Z#H7fha`e% @l֢QfIψQPA+Z|/Kȟg=}S,;Z7xòC[5\3cݣMM>O;~~KO17u-?G08&;}V@4Xr+Nۗq"ե'@֤Ǭl_GџXq։g24=Wiaa)_*bw" xHM|91{+[H̙3KؗăBg|%,P 7ܰ_s">" )́\g͚w݂jWBK&x#8nU8TV?M1fu2){I#ml^Z=@.kr`4|ExK1V//K.YrxSH%0,{1(W =\r{іsK,Iyz3z:˘5O2MOWĠ\e;p\3K4)' ȳ9Q`lH`SSf033 5վY d=[1'Y6cƌQcPc?`L:@045~@t|J;e㚗oʩB](GO:€ L='[Gz&M"ُ~S@@@b? qJ`:8ǟQYc Z[eFks50%4N#S^pA; [!XGx؏v2?\--09,L2c@O?wVhRuMa1'LL:0tAӃCgOpO?헊A+.5 Ksef\n,MU͂U)ҹ,,XzRsYY4U. 7 VHp`i]nJefTջ,,X"͂wYY*E:0^Koҙ7 ujP^i,NF[E c2jyQJ,vٵ#J }'_9^}+ /Fb1Q_z\?8@YXcdaF.L7>!m`U&CAkca_Z19*P{DvR'FBT<$zyXLK"2{*8,A++~UbI%7+O˯^@;O-k_k1=#1K?ؾaqㇷ 1ş Y9 qJA3-4A5r'{GJO|C3boJ~S=glOej8~c?gLq +.'yPV@-iy9|юy6?t#D/3l+0 Wzq r x獨Fc~XO7~|!?( ybx[ xa}1ǿ7:%8AU:SyXEu8zSNt @h򀯗 ~cd?8hhh`,p7ZHck c8;l =( ^)? Joʞ Nʏ~Ec\w}QΩ7pa?-0ao4Ǹƿ&VԥHU9 Kʒ,n4 m|p7:uor-4#miq'~|Ipr30aÎWha",n}ۈ,r׿ 'J"_\h .P|jUNP O'3QG5qguVGX#k"z6~XŘC `?8FzAfU Y:rYnS\.Øy9o{pw$od/A^е PFu,/8WV?R8uG%7¢`Ilj ^:FՓ=vPe#~G'0^DP^F9Y҇~ӣe_ז|;~CSLɭJK/nnVږrV(wsj=ܶ8`#6nUVq/~ _D+\q .;<ZhxpӦMs;6v/[s5Ok_ܘ=13b G,!(A ;l~|r2׿^~ewI'2Ÿz)|~UW9<@8ǝyRzp]xof_Zxr8PpZ]NBE D :~a?TF3h`?4(Ux8lyxn'y_~;+;ێ>dKK/n*8{rݺt>.kG^r!­ڂ6۬@™2h?^XCZ0毭1Id.oS|@IcM)k8 />}Ճ~Ke>`%i86L@@p0xǕ9Mq)EO`  Lj+ T֔'hcQ?_K9~Ŷ2u+! sb׏mn̙p`άqr[[֯|+s4gF*aYWY2ì0%l}'DE"p[ON˽j[QG =c ,x 8gvcaE{g8%vt=G?[n=NRyk@0@qr3 =E"Ie=E%`rc, ?xlHOczc XneC jC j!^c}٧`CS۲˥k8C\{\>)aN6cٻt“lg?ۏ%N,w Jf<ֆ}^C?]?[g=!KTNP>_a?CNN5 " Z Z d anmz[__*ۆONg>c?bS0@A$Nℊ}UdRG@QOVzrr{DE7x<VsE~1a\7;}yHOH}%fiўH%JYrgKp(kezWIAy?~386`aӁh-^Pgo /wvQ3ǘ铱 =s >CO*YaIaOi@EU Ǭ{Sb1H)?F'u8~R1I*L|`g Ɇٖ #@nfĸ髁˴6'5,$aƉoj6m;n/1xiEkHU’镥 qMh;& (0+đ>گ2KO`8~Usٲq:bF${O|ru`:@KrNP WDE QI5w?6~56ծ>Iz/Fg=p#P|K/<Gh?#0! o$i(OW6A_mOԥ2fa'4rGirH=12Oj؊mhL2O'vlA>A6:^(X߯cau3.ZPi' cU՗U~=ҧ-'}$$P25/?+7/|@3s*z*@<;AOX1p΄-g 7xMDޗ[VT9;hi&QAgK4ї/Fbbcp^!C>bha$cIIjw7~P!`K hK)y'-gD44r ^U|2͵W?J~~.Rօ/e90iy=gI <`ӱ*ٟ~T2R0IOV/M, K& i/2|h6y5B1de8OE 1щtg0ND>VmY #-_ȡᙚe+o d'ю`Iُ ߦ?Q|kQJfKSJc'e) W^ ?k;iO5j >yKc9؇@Ul4~vv&𭒧\Hi@ (#qT9eB=❖wJ|0??OҸgۦOQyПNwI&irFi5Ec i3#Z'dhL4Vy3i!+V ?m3r0IaN9JzDm IDATr4"(/ -V4&O@Ԇܘ?AiDJ,'@h'M#VBgPy7Qy7 6 ^??D@YED_$_2 ;9I>Pt [hK}2H& O2N&wF_|7-BRe_41"a7޽tTBPJ _U=D5I˳_ݷ*Oh|7Π8951Q:c<+X@L|/ٟ(~Tۘ|E@y ٬?mDg#+ SV) ?3?ųv:|׃:XOp򺿩o0DgBkcW#T9I%Ҁd`6ox efT^3M>8`Ïʙ^e)_gҋ3, P8S'6H^ӀDDOƙ&6u3rlRoc#`$ӘU?T$O}j2A?1ԆʃGNZ>35a¦n~D'J'g, rzZ^_/uratG yb?8I? &c)ys3l%8Gmd6yadūi3f ~#B/& 귬5^甃B1kdsSaT^7!y+$OY?HܑDm#jvZG*G^Bnc_`d%p{$تq'~՘rG'4~?ŋ^ Ku_?qF̤O*+He9eJ vdQL> K'(?^5g^ُFjVoqc^id=yQ|6<'!"wGB.KfR4w .lܹV["Rn2؋ PlcCݻw dZ=ڏ?k0FY@Iu/Z^oDC{*?|@ڵkWM9 YNy9ϔ2y"TbŶfe6+v+mfą)Dc6&lKi+m̅ k^i4/$.L)&K1 -e[J^ic.Wx]JMXq1^͙3aˏ1)'s , k\|YO"H:ռU[ȯ/0bEpsT蟫2yO*(kTgжP&͟A ^tf#@| LKLُay~ԉ2 2:䣘| ?`9qʘT96s}~KZҀ_pKwxʘ<@>_#48-5y8rG]61as?*D4 LWEe}NL%,] ?/M 0^xBQjq;*x~Q+H׷' V7Q֢l'C`F,,P}*'ǐ?'q>~><~JfcBI8Y=zt/$bSʹ@ \e|š ?xOp4/asַ7|sm###ystYDŽ[}}}7_җ:OFdZK/quu{S'eZ42o{ɒ{kzkžQ6!kFB_J\nb]Mzp㘍c.c6oO#z2Z{u7t{3_r_e ꧝ʽes4:uJs[6pwtۚooy˱&HY)K.CNp 1&ey R1Jmm]W.=sYk~s\O_ -r߿g_bmq* mcK6 f/Qac/Q6L E]Կu9p,2Ïo}_v ,y{޳Wpn?{u}t{x;#rLk ,7mCO(>뮉j5[׮wI'9 b7"R+NޗNN|'؍cB9!9h!@`Hoz__kv׺/v=%ߖn!G~Gp#nػ^'۬8s{GG40ݖ?}҄ohh}s۾}{[r'B#묪;߼rZj ycoo%AYq\tox5t́,<_xe{k[FgKLq<ZyA9bnp*cchSy 9'8uC:C9ܷfO~;{ͬƢgy gc>Hw9sC-7g ]Xj[[ouYqk&za|̦4~=:r(4}[KO?>߼?z?888&wtm2zxs8~81Va˾ [Gqė_*Yۿr=W޸nyni "X5QMBFQ.4ɟc8'2ssz/r߽|CWWsO56sf~/+p-jD? Ql@ٽX.kᢻK.\еծ0Q̠|B- el}tOםp?^9w-˄ǧNg&oLg~x vmYgfϞd%MY&' 2(4#n˖-Cq~[v7o\|~>m`g}{+^>jqB?=w\W]{=gqܹs+7nDjwv_`qRך5nFw#X#`Tt$jr.I8d;WD]۞r7#[t[}+ܑǝo]߹̝k pVs۟n*wYGa[uw7n8x>0_ myI|Ѯ(bDߌ;&;&E!迼ws#w58f[`.V ]{sq/_V=.tc# lCsg]Yqu*Q><՜vap_wF^[ϸ0]s5˖-{챎=>Hq;:hq4qCh|15y?3禫Z6?}wz[T^|tcb<֥,B^\dk܅xgӎ9IRrtenr{Cw醰1WqσS,30}WRn{nOvx[|Jkvw{`<#nSO\kN{g|ypG`''n,[~;J?Ե rDgiYhGoK^g=ݬ~:nv7k{?VuG]mo~/f5lR<܍7*yPMa2?SÀg_]/zыvаm Xg s%Kcs/]/^,M/eʆ2yC'I!哺䚝4jW5yP[׫WvׯF-Sqj!'W41;ܢn7zZ]@-VFa[t_1ͽտ>'~{ٙriq׾㣾 եZ=~:&MۂHe~;h4R1`瀖1:ܤS4=ОK[[L3E%yGw.'G;l1->lJ~7 \`%?y_waGu_n㦍ntQ^f.?=q} 7<&2toӻ7۫q׊+|M<WaObe:~կ .~ڽ+ /bwW 6>ڽw/~w;ܹ]r%u1?4Vw' 7yV]}վ?G>~a|3nѢE_a{0_߀?27>[Um[>u]]6gޗ;oG_prĕ92'2Nev[rܺ nǸo}o׺O쥘۰u]swW{#"MvBgKn#b-n޲nӆz] \wZGC-L3h`μLq&* ?'k׮ZwsvmyoVǃF@w[z{ܛ^P=n\5'<>'ύu'~ p?@巘g9'2̀\9mnwo%K;'?/~񋡯M67_Wo.l%t Ff6ʽo[1W\9RdK3ss&C\H~'77ǂ}n׀_i]|nֱR8X!va 9uMg޴5AGMNwO?aڴ&weqKܬ =cыsB;ufp#O?όؿr.(u#~n̙36gOxѻz1<>4+@s[?O]tOtۙ9spW;P6sd>y]l\?/Cgj?5-D"5 ʸ>~(<p&s [ be3=/יo7WݹٯWϛ#|7]wg?Y._i _ǧ<J:۹ f:SC{oa}<#&9A/L"v?i,󆄫h֙w u&svn_11wkLN"E9p2MK׺kpsD}mz|/rۇ'~F@ egp yrべsO, s%O9I\B3z@exy(Mշ :.z.gx5z(U5<7&89vqA>;[o|LlZ7yO[ta2/2yKkbqKmY#0189 :ytx_;ݥ^>OI C=iw 'D/ *W-?ir0 sN$R}9CZ fi}@*۸X8"E9b엎Z/P/|iK=Fwio,PZeaIDATܡǞѓT͚=_}ßw/N-"_0@7_v-497mGBaq fi5{G3bD%_>89&-1_ V>&>?,ݯ>}.\f3'&H@:Z`plXi/6s*,Ia;VYeeʑ'~ingnhVyq{hݏ?LsZ ݷ_\ .<7c7?>Ħ~GӴ_MtZ,pbdؤ,92.,g^K%C##Cs> )(sW|65psW;3Z:x oZޅ4*?M#`279_;ClY0 2rW3+pmhn]mcŷMlNe/{[p__| ?=s_җ6vZXwy;ʜ3(sN_vw799n4?F]-_}`m^ܪ_B!2I|]?wy;`nGKܹ:ȣ!Xs rW~{rp~J%OfAA4? D Ѝߓmܶϲ^|Hs RcEe\X%7gtFL=\"b%4=Y<|BIa1nݽwn}za~ 7&l~;9{׬Y3{ˏZ O~&oLg~-{}nW r|XV Lc1Gyر7o.|hzσ7M{I>$S_scLe믿~?¶|i;N)Cӈ'|s_o^yāYcECϓ]'L|1s`ku}nn.N2291eoR nvڪ^1_N$0 EK[|`n,]!tִEsoZ,g藏?6k~ѹgϠ|׏_ c"2۶5ܿihWaO{y‹|J7՜L?%:9wrWy …?Pp_8'I|'󟀬J˗/jH[Y)ǛxzشHLdj/9􁑟=~Kmh]"nUcqw/Ä$ ,I\ǟtwb.iK | Eƚa|dnƎ9N<ŴÔ)hu ȜO*A4M;Ln% `{CWOEq5Y3r&!@='v{_׺gçܮjq&玜cM Li=w?57KӟBh(VoٽU*y'89t¯o1|{Nm:?Yo&c;naE3?1a {]:me*zoRog=zƱe #.Fa&7X*BJGmH ?뺖~Q'Y_͝ŏ[(>c۹c}k=uڵkGEctm`؈O6OuV+>Yя~ԍr.x$sorRnbۻ6ahdkAqgkɊ5U_)1RZZU2Y~jQy[?yG_H)gCZ[kk8zhj=ؽW.is+W[q PN^~?b1q%~ ᥨ:^uMe/طk­[rum[z6O<|ǽ~| &̉(FVAsEԸjol'D86=';KH eYﯹI|!'xs"8Ŗt GoO4(/Α7O3 yB[/nebUyrQS\`Pċ`;T,Oy#ϕu<!ssl~1?̟7:Ĕ9togrcAr{YrcBIcN߬$_r[.B ix)9`j|?7?G͙u܍ٗ rGIٖICϕX}BA׃~)c*ӟo’|9WrҤ.sb"x*lcEy0OQ1 )u F GcK bbc#7?b0AQҀI]D D%uЎ026Od?"js?e9 C{G!)|.#ۦa@m'ȯyAv"qPF<11 B?!bCD~O5Ak%u;Ji@ L8]h]&~NP/L~1ie?`oAFJ XeԹ}|W`a'?{W6pMݓo[ ^0輔bY@C#QV:tTD+3͚Of%f?}1~HJX`<`]Ƕuz 0P.H?spټy?# ,W%7L `cg1/ŏKӼ Nq 1&Rr/W\pчeIM&ߎH ?ӟTڵ'(O&ߎHbjG.ht_'@;pl$q0 vQ`"xrQq8՝OUti.rWUEN**I^WE9ɫ"'y_]$⫢U|Ut.rWUEN**I^WE9ɫ"'y_]$⫢U|Ut.rWUEN**I^WE9ɫ"'y_]$⫢U|Ut.rWUEN**I^ŧ.]8Sv$ Lph!= )JڄO6Q6#tSOgaXmiSs+3$زB"2evnk`ձPpawН*k3 ?y3-jO(@:`gFp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx}|\ŵYiջdr{0`ii{y IH $|ccl.-7I{wsuVѽkKffwg̙v=S.5VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVn9h %VVVVVVd}(@A|}b%`%`%`%`%`%0%0`@N-Geo%`%`%`%`%`% 7~pQo )5Ӳ~++++++C`ްHpP )P5X%PℋҎ4 %}//Tpᳶ@o%X £8)]p7ͭIK¼+xMoM~o~7&7MoM~o~7&7MoM~o~7&7MoM~o~7&7MoM~o~7&7MoM~o~7&7MoM~o~7&7MoM~o~m̠?M~#_puc.m{K<&֣;K+I_rey@7+tLƷ7=+?ӵOgO\uc%LFFUEp'i ] gʯډklvj6U^ċ5^rGR~SIyOxBCA§n{>@ %[t% ƍ &4Pܸa6~(r >ǫ)oWb#m[7HϤpŕxbqz !H&_wK8l0'n=\4 $yK\F~^FuMxhzFn7^7Gw8ۍ׍nn4=vuqtMxhzFn7^7Gw8ۍ׍nn4=vuqtMxhzFn7^7Gw8ۍ׍nn4=vuqtMxhzFn7^7Gw8ۍ׍8F!a:MHbnBu7xM#G?l==mq1T>F~[k/<_l7Ewο\=/X'l}}B7a&~74'ᒏ%tVBm&Fvh:n9 5?J#i/a_hzvuqtMxhzFn7^7Gw8ۍ׍nn4=vuqtMxhzFn7^7Gw8ۍ׍nn4=vuqtMxhzFn7^7Gw8ۍ׍nn4=vuqtMxhzFn7^7Gw8pFiNh?pN|ۋGEpLź&A4asKHNb1- eOY*BavAz#k n= M‮w[E B62Mn7G`/˾馛f-Ydј1cNMHH߿믿ֽ޻;W=_*b M4md@cyBm-~}Zy@>~vcc#F~H+++++++I **1Ȇ'|9Bt/n7[n.>w2۴%LfFŭ:7l貴%uH+++++++#`f2dHSO=sK4( t$G *,y %eiX X X X X X X I"٧pdw,nX=ݠxAެtR~PH=>x|>Ȟ4uK iݿ_MiRlJ 9_te F111i`H9m۶QEEJDEESzz:M4R8}F}N5,.SFFF Vf%`%`%`%`%`%> (NM@.0 v5W@mI3M&xtnffr+A*J;;LB{W 9s }qj@JJ"@6 x)BA,C-Ӣvs"c D؈,nظ`-=˔dɲH?f ly3OWSMb,B3q?qnÇWkqkL,OӶR/J>h08qH`fss Y HAPDHqRtKx衇T׿ձLyQ}[c%`%`%p%l"@@ ~d:>/#CI`nPn6x@p߄oYNm,C,ט2ZN%РFGx 8Ntf8y҂[:HQRRcvx@!ĕni ?+DبNw3軏?8= ]xկ~U.]x +O+%\HjÆ PUF~7[nG}T_WҲeԲ &_OSNU8"v 8%piRx:6kRS(5_1KKxʍdӓ +:گ]t ŀPCs;vOi +^p ֹa/e?1xMI?t?$>~m^@e ׿N?Zo/_N|=3n>:n6p0B:M1];I^;IK½ #l{zbM\?hâ`i;4SrC#)5w/ѰCG.4_xt/PTJ(@U…/_|,X|ɴn:5jC~})7hӦMSx>6oLgVڸ* 3f(m … .yh#t+Y@ba%`%p4J@p^7(Pv*7 ?h'tn|BS¤y nˍOb¯_u!!n&ףՖb@c ϫ0ZtQЈ%s͟?_M bp$9Lii$87s< o* ғ1 gR&Q B04٩ܺ 7x`t>b K!t.= g.o,4A Kegñ*|Ӟ ,] xPd&`ˠ& q}L"My =IqT[ "W9hL~p Dž>#J|> S}OTӾpIWj mQo1! ~Ӏ7N?;(] &vPÇb-B? ]«p%*KoH6ၼ)p`G21CZ}b4J;<t/3Xć$#M!:x+ϊ5oe.Rz饗9lZº}|Ne(fɒ%:~:2^F+W*oVV F7!:-t&n==9Ucg-+z!_"+7aƍ7^;75g 5t+;5pKi/'8 U 0KFMԁ퀄63z܁NhtJh\n'аa-^D}.@>M8.4I?G[c4x&/Ϛ5N?t+oի'?I++^[`Z6AL ;A8*+a*WTb#L/nuz^7y0La׬ych]b*_V^g/ 72x` @ cz߄5ox`x(Alp4ZA|.䅰 @9Ш]8GαC& /à|Ch$.,FZr"~4/^FDnIֶ8:%pg\5':Mjp7l€# t-4fۺ C\p/[v_Þl5M $n[oQ+xAǀ O_DMQ: va//Yà@41/F:x``^o 5og%0$K_f"d֓ie, ^yD߇ %ķ#vpm{ 8 Lu: cȃ[ŭp+ӛX#63 _B-C) x;,Hxaxc%=0cQ,0 XWp&+M)& tZoSzz:oou[ X 5E0/ 7%.;/@āi YwKbɥ: [h*hLgo:~4֗>ijEN++++++J@0 r-l8_lv-4I4IWhjBvH@PwK⒱TJ#f_Gq@q;=Q)8h~@JKl9LʴhgH\O@Z T[ #GpNɭ_8&nILی?.S `PXa^nz=:YgʃxؘapE`$;9[L0AsfBsb^L?x֡b%`%`%`%`%`%0@% F.0 &tIO1gWvR ^pn0'vi x (C= ғ8nA fQ~;L0++++++#P:"6xЉ[#i.4AXLodg`f‰_E(OҖSt Z:P%6nՁЄW #_gB(?3A; >SoڵK}3n)YJ 4 w/M5۞>,ͻiԱ|7pCy`aM< 7N/1Y'qF)!!AU`n޼y|rc|+^<~60η4SK+ w3cRD:TBw,?^xyK 2v͛7SMM(Χ36Q^^vY zx;x3e4}=֬}1n[p nЁ&Fl.uӍ80wvzFpdxt4Pp ^kܩXہέ)JGii)T[B4r@%r0fڳgdcuX %HJJsXpzM IDAT9x>SvMFQ ڳEߣޚuPW7n+K; x<2h ԝ8 O;abňXGE^7<=5xCwwvL*FGW܀^|Q>55LxXa)3IkP^:e|-I|6q3$IS,%3{lڷo6ςF{s,EK94dN mv%O㭘**(8D7^[|4h1ǐ5w0qqq%lYc7q]fM`~gXk׼7(8FAoG>;)^ d.t.B chH**:h„ tSO=&:pttІ阙3Nʂ|)>( ô3(60}aÆQrr2 M#|S>\IH 7N(ꨈ7(]iH0J1LHQ>gg< Z'+r>nٲxjlu>tgQ<ESGL/ң~B}TϾt 0<ZUh/]w4PnjF?8;Q0:0v?: P᧟K{?x6_O=.Kͳjs iXNN1h/ۛWWO-vRSP4-3X3?hg>MlYa\uо=2-rAΟexJ~F 9tuxiG6:MY" 5P^8ݙuw&nytJռy2 |( GA_v9UVWYsxa.(rH/~icX/F&eG91Iy#=[Kd)&./M9jSׁX/M#4o!JkD~TXGseߟzYJo}Dt漂#3r%ʱߢv I/[}|)O9+Tv`;/*AMgM*Z[GFn q4!mq+fy(#r.}{"G7=^&lW]]hpm5;1bJV^M4Pfj?L[7fhNh3+&y]01zk9}S[ Ϥix.ESR|,*-W6WS~Av;OsnYL7 4itC^pCv aR &4 8nnбAp4 Mw;Ӽ9sy} H6= "!y/Im-m4{V~d q/8z:R@09ԽEKq1⯧siq4rk<[W^J{ЋkhŖv!c6:9R" >ڞEW-ab h47ouЩQ|ѬGζq@bvM-{#nqn:ORøXjmC|o͚=N9m<x>&N5^E&KҦU>A+ V}sk1݊ubZR|2R P*l14\?~i%җ@8~7hıj ~|t9Ӗfյtu7W}K/1TQY~1g.>.jz?QZ9x\/O_@,h )֫P3äB: n/Χ: `)<-S'vG΁]USf̠:F}?P;d:IHI u??'t5:;#N8DžX^^`/\'_AS'^N߼d"vUH';1f s1|ni _ƙ&A7=~[T]eO3MC/JP7⅋3]2_HVښB1{DE5SU򭹟xNJ9ǭ=b2D)B=]O{)m aXGqTk1bP̿VvM-Z[_Ne1] x@K=1m\ch*1-J;oԾk1Klӕ*J7zڽU:qN*KJ6uLFD/a8lb0I۶<]̉d6ɉAϿ M4rm{b\l` 6$egPѡrڱ{Hg1X~sx[xf$~ \f7it< mOAKDa)0>ܵ1@<FsL7Dq ɏq*=NRi$ t4fm M#k讫+Pަ?ȧjdP|J:cyz@6-ƚJzM4";;3~bқ/}q1>{[ψ+9~J垐C_Lsi1kz-Wa|}Ni뫩p^v.^kSҙ )j;xɴhv*}Li|4kZ鮿n_~s,}D/\oT?M΍FVb,Z:۶.|oHNP] 72 AS0U< NmgG4qy`~)OZcҨٚRJQYCyHIʊV_AJM jM-88;_knxlNj%gPۨ8zW)ǃsT#f247JLo=1Z\q#_бy`,FPNv:PG M&{S'kƹXs[ ΂^e&K:umG @ kjj=KiƼdںr +gԩz,`WqЙƮP=Ol٥։H8:@ Gq@W}J:댅*/~ھs'm۹OG q~* Gq?Gx.c~|{ z0c/ $P> ? h8n*LR n Ŗʈ_lFCçhPB: ċTt6l º&ILύ_}چT 9EF:KA[X_i f\uXjhl{>b৫ew.L5tlSC 2hF*)J|i/4v,SD0}3Uwq0mLW.LѴqk3-_/%3*me\3MCn:auXˇ3ccy-+-u;<ݟϘź3 ¼ ^TacM: ;ơFldcҢ9} T֊$쫗 Ciʔ4dHvky;b>m]yƅ/U`ĉ[s\t͜1Ӵr Ѵs#>Nu#(;׉sa`'C_ˊ3egJwqUXC^Y@ǒ0EhpGޓ1QvR!$%CJHa&qt[tECED2@Ӱ/:=rwޭcNׁmv0#GKʓx)ٴ| `'%HT`*^tcylwG Nͦ ڏtGb^2鸝y?3[h-(zocGx^wwxu]yn*}uE2!ϝJ֚2t")tXψu׃|"%|cՁ(Khd M Jy$ʋH4i( h֗zBtD#%=I'l<$mf:khKiӾz:kש~?$  B9f&hpQVJ層h?2m-\Xv9b"''G-/ºqix٠"mGr Q`7ޤz mc=jbdawj_y&n)'56u<T*&4ҳy{wO@[syICf^UAа{%v$.4bcg4jC@xcb~qQI9.!dJSE fO= ʹ}_%%󧙚j'(7F>[KK}tSe!Hhp9_|p3эWY'W_PRn%̪yd}; ZibXҷ*Z>x_s?k󋤉JH:گQ  \nOKk6M=ew5=4>mhW b:δ4mmw҂+1^!tcetڴӸq3U5[ݼwrCn=wy'CjqX-X/p@|{pKp/sN2>۬}I4y͔炀8ظo S1 -f~ wWݳۦrݛh~ŚM6 NJcǎU@pe² qNX3 {1: IDATί/? 7D#0xFrj b^爲gS@q:* Ku#ѧ Ju>Gs[vE:/r-ҙ<ёH:vOS6deAaJa3z p ;Uy̞2=H/<*)BNE:;>̇{ddgi_~e|2!'dDZ 5{d0Yi&.fZf3i>xXϧBlw͋岦WϠ6ҹ';ǗW2pgԈaPOi>.- xd^X΋㛛htv251=6?Ś68f^4OV7\D}SHn ;XD{V.+ߡ=Bͼ̰&̦Jx׎|u^2ȥ&U,.A̡RN >Bǹjz Sjf;cx#4+6뉯w51PfemTׅk.R.;A.8 :?\85О=Xj6, !D]1 0w :6(S+74mhWs4ӺuSNwfR;yq yg9ةE%xw/H^F3CDE:мb'z$] qvW4o @\Q·p±$y1g MqD7.UT'%K@Q YӢ£TR~̝}shga}*jq| +=z㯟kZK[+?E'M ΘFNu u?~wftƇpVca}Zcױ gE)*J[ZOKkpMsb}5iYhk \0?}.j8 ȹU\ ɢ1p@ 4:8^0ܨАYow nxT>8wM(V: ( fЙN\sb蝍5oj~ ?Bg1-:!ju!Zvt47DlE-"Vl6i~VJ#sO[xGlO"~\r4rޑW[T< 6wV 5]U 4.׎%~fhAдW/?DJo$wb*ڗOrEdzj edΠekm>4U^^5N}l!CMA*u50ܼ+yI'S/R}Ae_SbzuCLBPDL9W=^mQ?)QiL$ֿ^ws,yDUURR#香]]YYXyj{-6o B]^QY_~/)%B{xy?jJu6 |lx3 "@0)>&|bw Fqm)e&NZJMNoCF}gPw <=:@TڼO#e?Υy7I#b)/;m{zp\OҊ5t;z^fW4C7gkzPܡ9E:M̍Ý)Knj+O(.13}\LhOk28_Os ୭56P<>JOqkjifk-g-‹ I/8ˮIa42o90Yjs[ZnV6M|.^)XM5V6>rq]Cg^Z<8sȧ[g*X5:n-7pOxW1V$jtp95 -GA1}q-X믫6t9ݱSA?F7Z<?Ck֬ L s욍5"-حFs[~,JΥjhbPL3Ajq"Gxǽǎ\*(@ ںu+khvϞ=4gΜ R>`Ifn40"~4TZ t{{PQ[_qtg+m:4^h:s,Fs'N:izQ67F#EN;M%=`3\G72ZW?w6nT_/1#qC+/uu##9t-̠g =†rx*9x03VPf3:ڗO'ebnem]C.S׳#54s< w}Ȥ'(-O1xk1L>*-x nMü<mRMZ2iYϩ";xyӕgر A>Z\0b9" \îxݍOsgZ&9Wݰ)ر{ 6Cˇב*|Q6^j/hùCK, B~&c6oka sd ?mtwO!Bv=ep3c48'*!'<ť/y-:a8{JOK}k;>M %Ѣ!ץO=#E5~ H3bHV0z3&bePS]'2gd1/)jkjcXCM*lD72$?odv PCI8tx^.m{ cZa<F8L>L[a2y k ןg64V+qKEf_MaKT9QWat9/4 %x}:D'ӥS`ZY4i*WBPOG/ xpcf"~Qa^p;( .CKVF/7 hㅜ(> Dֶ%1KLP"HJXnhV)#RͲ%+O0x;_,kxJo>s{ =ǩemR>1+9~:[aa|%@ Cs:by!%!i֭ǫw4@L*nh#r-?e#XWR;t4{I~/Q`w 1ڶwO!i zyJM{o>Z*Y´xKiW&ʟO 3Ns*AF| 3+y,SNX0 h- 35h0W2 (֭[:Ô. ҃@f~,alpp_`vd2UF&kq.H'NxA{-6a=40 b/>ܻO_zvWR8zu[|$ '|0G 'i℉tSnGxxćl._q'OŔWZk:ui'Q|LZI1|Xg(FS[h4Z2:ϔs_,ʋ+,P^ BOC,akKy=ρ8ܚUU.h cʀ&o4/O131y? VƁa~ѕ3ϴ ؿ򷏢݁<޾F,WQO1m(5i; 4/!hmnа`P LBxbz;/v~֑4*fdG9~zGYH~n3fLOL^M& n S0wۛ|Q&mWlxAGDL/+ 44y;NF[x'z 53c^H hCLo20Ic#s;ކ6ŧ`00 ,YÍzJ97,byCEB5^m;Oܠ,?MHe/#sWܑ"i  0,2`NDA @yQ\x9/&SXk A C(%=bRՋQA?5翨{WSY@&+ڗp%`Vodc*!ޙ]>`x.bqOh͎QZ8,jc~CY v.2+jrT]$δFѣGhnxǓ#k׮39<nU SܢAh$F@ӓR4Q wyG[p/L>suq M htoqF|X7s:4=!_/²LWL{L +X戯P?-7n ۿ1Ξ5[* iaXVZ:eE4ᾉ%L3U ;5ͬe5&,/h$xk2 U*`'.NL\W8jxWr*ŠٖGL-ǕAܐv̉wznUUݠvOIYjLuǭ|@#m6IR k8L Q|LDN^AUOd0v4(Z5ƚ9ɆM˖-S p06Ga7@aĭXx5 |b F1] W43wuW a`pq`̕qW;v6dR}Yr`@pɠFtOi(#FO0u|,)Gn0Ww5rB{hz7Xt SG]:а@xܹ?F qkcعD.n|#YF*oH)x~`<BPhɰxhW." \(^V*A>μkժJO;>TcHV-AG 8a ~9s[qd6̐k-8N}(t; OElnYD:O!!1ԥ0*5 } ] \KFeA6Fbg3C;W0Rfɤ@}q,;8c.y뇇=d(|nhxфyi"HLhRGB̠0H9 D9@`0`}*upɭe' |΃y" JoGhor >Iw: G|mdu֯uv IDATYx\p;/ ȹU\L4p| @C|R'Sl'|G R Lh+\ʡH2x#aq?ԑ_~akOoocpe]PWD^~tUW)Fo9$>>>?`WtRuPvܹ~_yG_|q +|fG[췼tChNd/k1zfV!^ 'xB-Ɓ^zg~vG}T*Їgr?&@GʀeH[%d,?2s[#ȸ/ej _hp ncп{oT4,yeL(#X\G>oX|> Q }<@p|P h78Hkdlvء>`F /,>%_ZHʱ/i{WoDZ`i!stcGIs1CvL/dFs *,KCbC`=u au1xkѺuԩslݹW_}Um-@NpBIoݘkLK& /~6lؠ>-.Lu<ӴqFpgN3}+`rrI&ѕW^]% 2 *hg93iɒ%6m"Lh?TgKj ..egd@l_f mٲEE^pEO44X ~y3)+^x!^N6M4=-X@isZH~(H oӧO'a~ s?i@]?"uש6j<qu>M7ݤgpϙ3^~eV ;1;gfh~!/=E@yJ<ď/H`lBFA 7߬kLd~aC_[7o|VlVrW;Y->`1V~6l\tEn`tILqh3<c)KWa=יl,Y\E}7>w/PGc4}+oe=6nՀJD6mD'aòw"^ <;L<&D-^M_ VWy)i26^x. <, Ge2c"2'vpiysԀ%O PYhl9M穦pf!v7?GF;9k+́AwD 夙H3#(?auX:I7 orc[{We~ jyس?O>qiX{SLq1m2 D,7=80p̃>C. xX PWgS.EUx#97)IOoJtҰC7c/5žq7.!KQ7Ex`\lb|੡I'mmF4Ăg+{^1{u>n!%z~5> vhcɇ %K$E*qΆΛ&CoveR~q(Zǁ>n,?\ǏOa΃s ;dr%f ڣ|c,@L_Ă?l1^W}1&&Dj# Z{C98q0B!P_9ԛ WHzg6vAxAy>1y <sF}`>quui]I1d/c ?v8ն!nb(ؙVg4ol'`Xpj4Vxe `!$S'9Jz>[^ x. >UՅ^H[eg| sIs8櫜i^AX@Aj8k5U2n%/ H\U9i`!,{:LVG&փ7ޚyPsc:GOsIS(K$]G߆ 施=MI <0)x@ !mFnLt98/_9?nN ؀ROߓi?I%l^rQ[8Bb Y}g{m :iy)b(YKKiD_1u@^OYf3x^W)GJ=}`{!ksY57-KR1D,3KyAX >G3s >h^?{>iy,yrmso`7ڇA@X H\[턴> Q=XE g3V p&p-1慈</O`)_t\V,yq6rR A C#Ǵs%5+AYPi>~'zx g䍗<xD ܴ@=Vј!K~U6zsUy6pG.IrRPrVo7]4h#M=^r2!؍>(}`71˂Q'{Alڧer< h*qE[-ocGTBZ u=Me\%ue9=<mc|k[Ib,Ҥd۴pxF :{A8 zkb42 HLX 1o}) Y䴟`1HKsx0hk&x&c/r&1ϸ,ѵq5>ʲQGl[y$k'd.QGYmMm-e5Ħ|l;~ f1F N;R-}"򪵉 Y#b=C|r6B\ic.KkS4uYld3/z꩹y4c,y&l1j_ 4x7P6l"O5x#484_C$mZϓ╣ɯ11!%>w(͂4B6jx29CFυg5΀}{EKLb0 cf.f(#nf$I=% <0 LX<,x}R *9!M%{İ@9 <𬐏9&G\#GikO'ט ? u2 ; ^:(ӷG[ׅcUp &IגkDA]`"L6ުXa\1>xaprp]X͸F?-c̹/06OqmGV9Ƹs2D_5Xxa?Xf,r /tӯ%['xqguC ܐBc:=H5טʳkXn5g//rMy|0-ryVq|&]ݦ7M?m,Y?&0ا8"rYFS4f ɽ)d 4%pn ?PM+ݴcɶTՍK  sV&.&^b^Yc`ǡ|s~(ոBm";)q#VG? m$N#J8tZ*k㍜Lz@0)^:sgfmm[Z-H$PoٽYcSYY鞭|싯syV2yl y6M?BhX/]˷6X( ^0!r'DK 0?ɼqu~cEcN,<)BXcb TJ\fiZcյ-ӴIu'zҪ12X鄼@@ Z,q<=IV&-(_S2f+K2Eϣ@@  k,IE߉9\ղFq!ĮrB!_L;b嬌ͯgB@@ ~!$⸎%Po>$\jӒ'⌴뀕-q€@@ ̀@&%4K|,@@ Te|>e՟boH#}y~g|p@@m/ .c/cl]MJg!vP!,Mi!@@ RH.)GMҷ2Y]VU>/C6@@ 6hl9MkP5PH8 Qt\qL @@ ykm4eV.Bon OJ[U_c[@@ Z>Os8櫜?q]Rqct\~\*W@@ DX.YXh __/mX9@@ Z*_8N J4#Gߖt e@@ Z`OQ{}W}{7إU#h\~\ieq!/ @ X~6h66OuĪ@. `R4'@@ 3IΣeISU7e}СKI' -\y+yI!O&I7.Wy3NB: hˈ#d%C9D_|6ЫЅArۉE57ʃ'zҮzaU.4R$iG/q_ޖt@ JewI*˥6oO\UU믹 W^2x`)++dIf@@#0fzL]t٥Obr/˅{I.8kXw+0Pǿ@eEub Ley*qZʄ8 hETWWWS6_̞3N:٪= fx ١ $ 0eVL4~\xN2oL1dT}gYQO4Bli2e5Q2ThIz!!gɻfi RVYY),LA=[nnф{)R[o_~f4Ȟ={ʂN;yӚ #^7L0Avm77{dr4{|!l gqFIT ^GUw޲;nA>h- Bu2:_yL2IF\~xX9 SG}ڹs^cZ82hl9MCB]}Y])ϑi" /ȥ^*첋ʑhylmu| k;CYg|/D,RZe+}s IDATґ,ؔU$CjPס[ܴ%f)ddϤFR!z|E2ѣebiҵL2i~^q8ھَ uQ.orI ꀐoN;!>9_| N_oVV_}uyΓ{ϑ{cdW.]lvm,Uxr[^Y#F:4>{ym#s_ ,D5u2&"r"e+gC:(ǖ49yR;k4Ф5\5e!݂`_O>>XN>d$$kj饗N(.v /J.AM ^ښZGvH@9$f 2o|16ڇW!뺊̪[4zIM48GO쾴u4X{~'rK|Ur'7:aǫ*XWrAۇn6*Ȑ!C8 3"R7Ns;_yx>YbUrh54dk)hnNt#M<ѧHǮT l[N4|xh0qiS8r9n8k5qe! j9#O?@,11ImFr4ސ#8¥o&dkwDz멌?y~\&wd).$هVd~5ʍ,ګ̜2~{/t-c6z,ң{)}a4qlԨQ999l>;tAs%ux m~>yk[:GPm V=/n82gh);d3#`眛F*Ɏ^+e`EX hX.1[AVZ [GZZu*e*Cll~H"6pCg-{_~y9ㄥ$&K',3-J>;<\q㎗cc}<Çe]Ō9D3~ǜ,r-Us-g,@ȹ'X"fr[O?t-^5\S]~V@:(6@՜:bS+\=eѬRlE#%di`;50͈ѷ6vCY GG W^yEj+GJGFq9$e3; pz k׮Q7zS9!^yPAe ^7qO˨ʒNPYYzKuuxu!Z\w"=xXrl]|X%s[[1"c#VWr&g Uy6MieKA15n5nZ2t/n~)*auuˑ)˨,Xj>B]4Js^[~\%ӧ2}C_>^=#O%-U+:w&gϖ$o,mz;C=$__QXϕ̎էrCΏ=X r9K,_uUnPtµ× m IENѬ\s[Rl7Y~iUOc:Ybo [HpuYm4iIenu]nC? 1l0NeU<x,?.kdr0!}#w LxJ &ruySG?Ò ?Uj]}OFƎy;KNeҵK;Yjwݤ}+o7M*z!ME|*_/{iU}qi cYyd#d7vb6RkZ r0>N885?c:VxbltT.];7W__'L\{/~Hʢl=b<$Ѳ$CrqysK?ePTg)Y:)3l_r(^J^!{ 豬2.* -k}¾@=| /fH,*Ԙ3<,71d9  N 1~+㿦~,&Ď"̜U-GQGq|{ߤz?],?XfvH&D{~Z>jjD{䨏~} ,Zftj x03ؗҩYyj!pR?>?P?ɳ#82ԿїQ: #R׵SFGȻK2gV;:\m;v{nz.hIRzdV'^"%bG򒚳jK <sB+/H5^!<z ۟LX|Qʾ<>`;c8e'CvarUw-;u/Zp^|] kY~ӏ2B=|xacd88fO=KH5OlQdѾdjDr $ !2(- H jKc{'sx(WEC 1z|ТS;jdӐI xYB>bCUgNG5/s‚Cn]-cAko Cv8ԍ57CVUڗϻ;w/UO2i8Dy%XV<״C#ӜcA9c klW3f%QYmup]؞">^y%*Q#$ƒeeGo!'_t_dX`Fd}(ɋK gE9GǍ`6M9A!t,1Gڅ[\lG A󬜕*kC GBfIO\бIu|B!e?v!FW:GgOp=@t!(:vذ2dҾCw+g̑Δ}6)(&TɗLG{H^="7">+[{_hgыc~],%C xk/!,QwCνyuЯo+b)52GOdC~B8 VwjYçih ,Mj8(-HxX"& VMkG~R "{tUW}(|MY*Nl(LJepKB@KmSs[j;C}͇@3ԧ5ԡcLZ%~͹JS(T^TJb2ӈ\\ǭIuZZ/>P`y_^;x:񚭷ڭwԀGw %okTEETϩ~zs/]y@>e|>c_bov25—A橜ie*@@!+$6r[nE ;_iꜼ.=&OQo)yZv~G(@\\_2?;iCqyqeIƢV@@ !+jcg`oZ ܗ|}oh5?qʔh[oeLtbՀFP}kM'@@"7)D—GCUl렼Gcyl:_C"B5L߰vOs/@+GɃv{~%@@`!M!s5+N^AT54)m W}mYHm0Xyky4_9εL n-5nq~\Y @@ PbyNRg%vj`k'|}ͧ>̶al~H@@ h(I8Yl/X?+SӌHk}[nYNk7@@ h X~=iGu4_ytVbVrMqmɇ@@ 8bڠy۴<~R$lIitt"@@ $q8%LUlXR;ۈMt7@@ 4h}I4ۭN\lY!.6eZY5%@@ - 8B$Y+O/)%"Qwm7@@ , k,I2ڇ$':R@gYBlH^'Z5 /xz1X4fO.2tr C),RY:I7U%⌴뀕t@ ЊO1BXb 9CdoŽ ,Nu/ʈU=9w ^(4r%4K|,V/-NRQ^.'G`::K~C_ \pְ߱o.,ˊy17D;A~ gTN2 q@ Њv˯xi^#rB@ 4ORǏ%} H4N& ydѭ>Q~!/H8W|Ɨϣ&,ĎƬAP\^\Yաux!BI9&Mw֬Y믿JòD2w$4ZTTTCǎBF@ )edcvW? }tBUV';̚Ҕgflm33PGc4}+oe4|^[m:I/AL"?ذje_^6xc0ajK/Ɋ+X7ޫZn֭r)̞\:|嗲SJ{」 C3-ӥ<"W:qKO>uYGV]uU5_cƌg}Ak zѽ{ew={6!0ef̬NW^ ӦL''^<"VpNm̮vC{wv9Ƣ7SyƖt/D՗kra_[!wq[l<6tMꫯA2;"裏Pb)]BuMtK쮸 9sڹbVʝΓ[/4*;/&믿{(.t,}iK1R>|mkw_F>"koc#CjeRUMDDWis?̦+(Y1?&᪯- V3Np.k _L4I^zVt^{ Gb.Ajkj# &{n"| *6K׿P*ҽRO_WyN3"R7NsWWW+o,ƍsy`xNfDKQ]W&{qs>$5RHvZ)+RlE#tэ r :ҪTY/Sb+gC!ZJri&쳏<Ӳn9"˵^+l0ICn LB,;]zYRQGZYÒK.)W^yWRl>}K,Bls@:L/ /ȱ+ ڵrD /oF.[vcRN/b^Ń>ؑxms4oG}a7,B \ }:0sO?q+;_ХX絋pcb@n=zpr89E?cctgmu@tk3ϸd K`Ü+^OJ]tQ_,w ל~Bhe2Þ{)*7nYB}qeLCwqG7fƏ/?sV^J7ve0{a .+^xacXs48r @՜:blؕGhe)6Pq4R~VfDZrRwZ 'W^,eMlc <6C a↰j0Ic?@I%n-"f +#쳜*`%{seEKCq9O*Ch 8<#s hZX =#ZB:6A~#tM>? f䌏N$_QSε\!PaUݻ2 EbT}C>/'Ƌ_Du #2V>bu(Kn7?o"h櫾=ϛ.- H \u(,P`P4KPh40O:y4OEHLIK.qW%^ xi!d E%jSKĎ/stG鼃==ST.?^%&sH6s x-c~kIA" 2y{/~H>jbgϙ OdIΣeIF4?VS`δS秳muJeSg! O{zLD3Y9UBee@|X"#9g"@ؗ%8 I㵡Ra_!X%@cG_vnM,mYˣ, JSǐ%0~c O  2!G>uB爗2ƪ/|9='mi˓>K^0!6/9궗8VSA qX>^R>/$#nٴк}y@Z>__TLVeGo!'_t_d;EL1fȗ|.klí03gΊf?ǭ&C̏o"4͇БVji.knq1O A󬜕*kC#إ4B'4Lig)K_)I3 1J'.B t!-&O]fJ>I /lӽIq{AK9-6CCg2rtCνyԵ{.O3ڞڣ~[m(l>$\~s\Q"B;i @@#krOb=C, ! ӑG6)֌SѽT w+-?.e[c2!" s~>vR_KhV]9q/Vq *$e|>c_T_bov25ƗA橜ie*@@!s!{ب ! h으.S&OQo)yZv2 i$q22yդј5Hˋ+K2:m]Wy4̙Y6Е@A//翡i܅2=[$}+(e5Q2ThIz!? h o2&?B@ 0sF,= Gcyl:_"B5L߰vOs/@+GɃvcѭ@EO4.UyQҷ߀DI3dLk|NZݚ$,qepg|,27o'5XÙ{GgRMuKK/% ӧO\]Dx(AO>{~_ߪ*ydEޚ$s"=#7(;Ð/Rv ᄏlvĉ裏:o.K/t\͞cɩliBE!0ef̬N+/iS&Ɉϓ/+8^fIyvR֡O;wŢ7SyƖt/D՗kra_rWg}&/hkVsVCo:䈝Ɛ:UTK+?\r"ꫯ=Ñw+e޽{];Z !}ݗ#2GdW2dP7<x`B͛8[P{Lͬ_䍑k#]6Y{5QSW/j""'R־B!dBJ52F?'P*bgƶ,9U _ .d׫k=?O8+uBڵ<#rAgϞnS+I㰲Iqje]j:\luch,mWfk(T\43"R7Ns7OXv\o|@ Z+ShcW*jk-'G5&.rVN3Dž@qJg F|K~.#$>Z|M׿esi&Q<{xĘ4QFɆn(,}fΜ)n~.b;s6q'M7$_d5הZ[auM6X5 .*"{{Z$u7%n6l B5o-4-vnVaT駟~rY,?pꫯ6l#뮻kfJ+ڞ;A Uڮy믿vHl xV^ye Lca/zCߓN:]/<ҿ;LV]uUw)t 1>NfDKQ]W&{qs>$5RHvZ)8RlE#tэ ;5fIk'|}ͧkl~HK;/PD1As@n< &Eq /PqwRzs?ڂ0BPEs=H&{NkHҷo_?+.%̄?,Od9I\poȱc:ڀj`"LH.B 袋)u]1V@2_ХX絋~ꄏ(ky=#v!BrQY8p0!' Ӏ,HdהWRC9ra7Cnho[^mx\T\lVW!}בwmxy@.{j+硻]:猽;4,‡d!v1(GƠ[1"c#VW]r~*6hRr O&mMPZYrKdB2Ҏ;ȇ<^ d1Y vr#xvYb~hi&PȔP∇RFp5%,-^@H#%U>,A)㭁|^wurQG _^W }vie?4!뗚zNT{D2OB:gI_Y.IUVVq!hL׮%4x hO-1y^'"K'We6x,!JQڒOL>,O:5nUy-`]F"еStx_\}}s>2W)_7kbgϙOdIΣeIF4?V`δS秳muJeS #pgK=rKtxXZ@lwDo {Cر|oWX lPgyI)7 o.3RB 1ś=!x,هƲ^!a-ѣG=m|la=}]B%vч"2o|JS xXbEI&9jC,Rח\_>ѺXõk;P,AҏG:AS!jOOOR>@ҌUI_sK_/)(go8H>V۶)#[5hpF&-کc[z 3[vt _cc]yxMOyTNŖBX\^lCQUm^^dB$nĎ%--e,_j`9xy \11_l5KYmI&c9jЙ䩓=PLx% |#e<`i#B"A!,i z#6/.Ď J(ldB cy|>B?5fZu \_p% UƏ\r3|ANmfn0m|Yѣ\1\;(c,òwמPxq_۶m?23_yq~1ŔCn]ՎǠ7!;ޚ!*Vyݏa{/UO2i8Dy%XV<״C#ӜdcA9c klW3f%QY`i*K*k2KrAԔ珏;Kj~9ekj(AXЀ' 3 ;_O9 K! Y=U5U.;z 9Ǥ"kvx)2fb4Cl}To7Ch@(訍~V _dsb:JY#BEv-.yV|!(0Z:?m(%:Z_!1bK\ )&@d*++(]7j75:`IkkZQ7@hgEޖ֊zS/g"k^*|(|,_; ej/S9T&@+BeW>2Ts/@@i􋾟Ꜽ.S&OQo)yZvN#25z8=+X>PQWBbGc m(./,XкB!Xvu!dU^jJ@ }MKϰ="ҥqʔhWoeLtbՀFP}kM'@@"7hc"3@@`!GQ5FRWuPޣ<6! we!vo?GF;9k엇@@#~;/?B@ æ&MxT[fJE[Cpؖt@ ІJ+IGUN\4yRhWǕ@@ -/$KjVbڸv|lVt@ 4;50͈ѷ6vCY@ 7ؓ^_GUߞMg%viA-4FZY| @@ 0?(ߨ ǹMS,7-K26F7M?A'I@ @GhYTͶ:~=/شmOg1zC: @KC@yؗNŖs'jeYZ]@@`!B N IDATZ.B2erG/D] Z(q<=IV&-(_Nɘ,./_9?m!,${o7|#mB̀@@#_0^cMѮ&8Yika 3R󬜭櫬-@@#gc?I=.z9#eJ@@`> `yJRs_% O&I7.Wy3NB: h~3΃J՗+oԕ*J7.q-Zde;f(K۷/}ƺ:o @@r&4"qۙ:LHȧ?ϑg$Zͧ+/~NB SO=%&LprzV[M^ziW{-C38#^p K/-+uvM{챂(׏K/Ɋ+X*Yf}';Sn6[_nvgu$|5hBE#..h0/S#}liV2!Z΋ֹ̪+uFnT XE*:/+&A| ?r-a?^, 3Nb- .hXЌg矻eudk 3gl]s_~q/3v /묳b\g7W|Ɨϣ&,O$5feiVί#m&N|掷_z2"zxd˜k>2x#'bw( 7 ol΃'"oKeeef>={lf_4sKW}޽]vk$ϖnA_}2" $P*}#liBШyo $Q"VVN_nm2jt?e⯿ʯO;ˆ{($u. /|WDg̘!dذagSN:$CSN/G :˼,2>/D{=Usu,j@^Fɓ9K~*/.`;輨 9QRn~2&M_]6|sW'6|OtyL6Mr /8/Zk%w}|w뮻.('O=PdMoΕuB7KH \0oF(7q/(x:駟vMWkKj'2I)x C@yƖtN!! Y]f\PikM7ik'V@ED*gcfb!yQ2u<4ryȴk2:N}\]2Ѳ b&Py ~ȑNsĈ97uTw'0.z[m[Rϊѹ+&zcǺ'ʨQ\ 5+%7z ?¾-!C/2W?,oO>D+W]u 0@;8yG_~y|MByѣ]!C`pe]&sE];Թ[ ΒO>)]vբ\ku;S]\s#|HB.H~W` zI#VwӁ(}:+㈐k3i<2^u%Dyk<6M;'P*b[Ópؖt@ `Yb׽s{}ޞJy䖛2WSn2d]92uJ5oYffm9 JEs=yW]uUIb U|ዷK.nyȐ!K!|hLد>>}zx2գGS$Ě@i,  ôkCR}[Αḋ6hW|dGO[n<|ϸ`]"^s5ݝ:ur%Ѷ|鴺=s{K.)|X]I2^7B)zq|ӊs%5g8Fաrqe!/ h@:TD""m˭ny%;#}[8W'vAOyXRe 9ԥVC`4(i~^q'K=ZM8Ν;'Gh=q`~ċzi } vJڵ;.95#^3H.rrN!c".^h)!+I;^bBtIaU,Z:A|2!r6?V@Ynm2wkfEwnKD&-\wuniOď=XdZNwyg[ ͒rbgI=LL֫c[o'O.y >`HQGK%d?_=,>SD /M cinSˢuW_*-̢'V}c\SB).f4HG`i' gةiF5-,uV{7%"xz[;?HhUK$džicߕ6]c>=KI;{믿vy+c ovpU9.C>X>d_Kpbi`{2uu_IwwgH'?m~]vũ?NA~Hdܸq?*~5% /Ř8W2):IO/ZO ` iG}W}{7إU#h\~\ieq!/ h1^VY0Scz +K163a[x40xi˰Ȳɟ[OXC'(%!ԉq˧x9 ŁaGsK[GM 3ȸ[AяS|XyůG쨏EϏc|_شikڏ\i g~PG's+SƹA.!r v !LBx XcRĊ oʢW -4 ! !B aѡ$82)>H1Xe Tj=6/k=A. h@ hy!ziy~",>^}7 eB@܃<=,(IV&-(_S2f+K2Eϣ$}nHuI4_WiÉ@ jmdN}8ٹ%1BbcBj26_emyHmAT@A$XYKA6Ln.n,i_; @(4ٞR$F:n;T @@ - ?ph6݅[Q*Ƃ{Jbh#h{GF#56ذh tXs{wf{v}˹:{{ν~gwν3ub:mp0iu!`!/.PǯjV9b:9ץzڮ冀!`!`WҸ u{4Ǒf&:Mʹ\hB$;!`!Pl(<~9۸>^\]#p3Aפkc2C0 C0sL,R.t4O*~ C0 Ch9smCx[}i n>a$iGGڨ<ޯ-Jb qdzU~MPZ-3 bC^F-+s1+_C ^?or3FQNs_6jH%߸aR4:+@! + KJKF`sdv߷ 17 ^ݐY,8 CA PQ?18Y.z~\̛7OƏ|饗Zk%]v )yrw /PH3O^z_n|*͝;W9H8?x%~׿o߾fid 6p}u։i !w}7xc+^·`6g.ZK*ꤢ:yc%sf͐WANdtbUmTIiNRҥvŢ.[qm~]A';>tjbCbcEB%uu|V.Rf̘!gu뮎KϞ=nAȖL{GV]uռ uTTK.+N6dCIq$1kP9s1B&M$pC:w.~ү_ZwNNRQ!0'Z_WQ?佉x>zE8a&㫩j""'RҹL8/-%"$%UY tl3 vƣBo_י( 8䠃^{M[n0%cs 0@.¼ 㭻ښZGĒSғi9M^z|WSOI޽]s9rvm9w8sn(G)W++~'[*eUհƮ.ikmjq# ?&Aӳ* +M_Eӌ_]b̘1[2l08p[=A۲~k[p%șg֯?ꨣdر}>SO=Uo|oMr-Vryp .Su?q2dhe'N;$뮻tIBT(-M>ݵ馛ʚk);sF= ïኽ_ǀ~;N_}aZI綾^{=N4O?iU2Z֙?lo ';SjG~r!?ֿ{zjߏ=_Frvf箻CJ3:?χ..zm·7|3cdxddZgysfId:RD7\@5vQ$2k)qup6MuLuΣØ5%u;6ץza!T޸4F,!Bx1D=7;nk[moz?8\]|. Dk2ۍDXy"ʬ"7ܔBH| {" D4_ARŁl&?|9]T#/ D֗! ܐlIb!vlVӆ_>/@ 6ԏ5E W9H9τOa>:i+^;L}rW ",(nz$ix"e>}ÍRnMN&^^s=ƺ4kA4Bšٳg5j3j$n|?BLy/Z'C~5!K7h.b](4B^}UGN!P$Q9nL ө^QQnOwӵ|O!# C1ߨTCfY-/?S~KI=Ln0q\Hh88XI_q{&2}vr&9Zw@׺߭c:)j$oC9?sI۶<<1\JWDzt-o~wTWΗܶ˱Kh)E_ޥ_ؕw㟐IG媧݅*9oLs6Y1q5zqu&+RBX4عjb 9.np(@"Rcڌuiܸ!}G| \ IDAT  y?X?,n$|cxrf\@=xu`L2 a|`}! c%peYHW^q4 Y#.dO"-  >3Ӓ;ƒjč:%@䪫ϯg,Yƴ6L*0Գ.RLT}orN Sqc-eH-{?';dC 97xa_43?@ݣrO8p6FC ﲨ+/ΥU 禭ivQO²48CGrLtOLyDU_*ƾ!C2r|ɓ'"RԱ ZGD .i}>_a5qK-TXU>Fo>mH Fr,qgUIcȆ!}}*?ȴ3@X:5H%[Mk˯]0Xr<POϙBvQĘ9ᠶI9DQx;ڒ! ,'[ƭ4>-7[8iGײ+*MqL>O&Ϙ/~4I=qZd1Ҏs" ;n59|=]t<,CTNp]@r9tr.m'kl__i FHKH n4jvvK>?ʬKA R6 W؏} It1@ vJE/@Rƥ/>f:D[*1i,ջDH{rJ %g$b)52w{3YV|~rBu\]B!x6k۴-2C( uD1HbKXXS=>/M܏VW)Csսeyү跹TD]eG2)LmrվnK;aqä2iIu~?V6 "B21Dy;K ‡%C >ՙem^|RSCWV#SH(pK?_'ki7־%]n預\mj%C(jv˼?i q)AbDonKrdi2dΛO^^-<";]R9m“bȇщ ӱXMh ]BxOB[k6C8wS~>myD_7뤕!vJdI2N!`1D 7 \K!v/r4H]_0&IGm1 q_[0:ub:mp0iu!`!/.PǯjV9b:9ץzڮ冀!`!`WҸ u{4Ǒf&:Mʹ\hB$;!`!Pl(<~9۸>^\]#p3Aפkc2C0 C0sL,R.t4O*~ C0 ChĮqw Iz~S\uz+!`!V<%/ʒl|$ v~8w u:fs!vQ#~]Zn!`@{E PGpinӤ Ձ&/_N3!`!`ņ}㗳K5υ52H  1qMq:&3 C0 C-yko>zqJeyi'+Ieuܯ!`t}YOdΜ9dD6 C`#ؓ+HyYatWNP=IG媧(u*+o)bԩ:;;P:@"P__/GVZI9Yqt$!}l?WA|O2~2|x}Sl為[@eiQeܗM.7m b;7wT6>ʋ)SSO=%'ǓO>Yz%_~yc=&o\&N~M~i~k7.)g;vmj6g#qx̚5K8&0`Zgu\>;. ?w\)_H"RAFqwmvXبv %YuRQ<1W9f+ ^2:V^*k4Z[WҥvŢ&q.kZh)NPo}K,A! ˹8,jJm*ᅲ/;rmfT|DzꪫJϞ=!NBjfmdq;smL8Q~_k!CuQzK8/rsI.]8jR%]uUxl3m^{r8rZX zQ&NxX8 Z5u2c^MDDJ:e%dC@y'&F>ĎN|i0}]mǗ:h¶G{:물A$l-nL3N;o'Yfy7LZU~982s6)W\՚ b[w5%W#D,UT7ʫOX?-wҲjXcWC 2M/i7p"a]Vq$ ѕ|>Pd8N@^(${_+/F&zu׹ݿF0rI'̙3OBD(-7N8∌ʩ"HW^y@Ȇ &o?3'+=\;]=v+3mHG"nV|>|]_}*[nqӑtQFz /h&%O;4tMe 6pF(K/6?䓮z7pChWUv|<Ə/ӦMsxJ!`2>|ɖ>Xñ7/3&S}lm&e]sGefϞ?]mb44~'GuTGoz ŏuRYM[u]xr3!*5RDwZ)!\TT F6MIe?[đ4zS\uz+/f.9CeРA}y1uTG~_ˉ'(#t!d17|ge׷~%S/#Mk;CrK1n?_tخ|7;򗿸Y]ۙc !8Å%qܴK!D{_*[mtM.lbA"_ȑ#Lc0 K'p6eJla$1,ty ki7.x㔶f[g~„ \ǵlIb!wk cKdm}:RNϭy#`wweGY2^"k%͛GGj!id6XhmU'?VMuƮ4 Dw`b-"$E/ʒlͦdGUSUDЎH/* }>dõN_('1 mA{=zv"+ds:D !cMdr绗@碥LgS_xIde!խt//vݍkj|dS-wP#4]Tyv 9BGt֩zL4OS[ nL֌_h'kJXdOw3^1G(b. _ 4dȐصfN>]GB*/ae"xfKLi3CD4‹'%^FᅌlIzJ\y*gm&g%|D:n}7C>cƌL~BնᗒG^ѵ3vvR]9_s.Ǟ/PKøXcWj/Op HKi܅:=mINr..W4P~9mwxV8^L8\M!(~LTȗƫ27sC!imz-⫏|)V)c=8G^^`O\"~d] ~ՍʐV^AxF0/sk눲{.Pb}u> 2)9LK}q%^eJx _E?G2mD}9曅6-9w8>*OO_ 1zv,nm#[96`.z\hk5?z<~9[jMQ}2k9!H\ )SGtω*[7k:Xj_t҇YG$%9"lDH^idg+M>=º|S0NOׂ}CHd( & /]'/QR};H [d$g0,Iח7oʆ@[#0dVԛf' _]ZvŦ dҏdy2yFG>$6Auhho)>YpCS G)[$(x]9?8)j_gv]Jr|,%-94e.b996&nTߧ|ʼAT.))~KRIiϻݑRK{-t8;}l#vR]#{kk B"Ibל_ 5Z h!5H!uF?[eyү跹TDV*yNXV壐+sߡ\PyNXr+@"_`#QvLmCX&ZUe^|RSCWV#SHC@KI׺s%vvu_si;?@"+o2)H8]2 6ConKrki2dΛO^g ]SS70(r.xp<A뵌mڀvo!`Lqdd柊33dmK wӖGt,8oOY4ejKt[&MO!`D7e-oU[2 Cx1Fr>IΣuIN둑d 5ڷk͢=Ӿ͢VdnV!g0 ^lbT 4TN\xRl;:|:u_ Cc#`7}|mt@E vVOg18Y.z~l!`@[ _^s$]_GǐtզIkb sReߔ/W]ʆ!`!`>OIA$_7I'5)N|[ʾnXg!`!`G ?SK$擳P'n`B}ʆ!`!`WeB>u4B]H.N:Յo!`@k#:gBoY\]v_fi!`!^H.)<Gd4)BruI j;藓Ln!`@!GslRlzs!v vBG}|r\jy C0 ChKBy2u^>R>(Nk8t4O*~ C '|bX96A'Wn."2mQIG媧u*+o)bԩ:;;P:@"?!6zhYicW\HGbnm@ݧ{_$Ǿ-G;nyt_|U޼r%vt;5ZTyc zʆ!P< +ȰR-ј@"0yn̮Lfeae̍/ȅ=/~7$i!Αbϕة,9_si;_3 "BMYJ#r^}W^Fm[UvzF21tΩu0L3^Z/kt5#_\iӦɆn(?:-',z/<ﶯZۥgϞr駟Ɲw)wq z=7qѴXBΝ+ D\ʬ2o洈Td 9熱VuZ(U)]d ǓĹ˚k)-BŗlEkW'tݻYCzj)fUIEurkc%sf͐WANdtbUmTIi+Nu1%Gp\ִ.`_'ki7־%]n預\mj3䬳Β]wQ>cG^n4!ӡAap뮻Nnlrh?*.]8kK]&nԙrQG7TJRvAR]WSU}G7ZQ.cm]uURQQ!n#x_|7rXВCR1[kY-h}]?佉\Go('<,vD^f̫qR%DPޢ9I崶ы_^l]>ĎN|i0}]mǗ:h%_2g9䠃^{M",(| &T b) :A9Lg͎H[D\U"~L5KJr^eգ\$NJJS]C qDNs"[=[S%vvKim #RWQvZWW+>5VVZcLGO'UJa]]!b54u>Xɒ0G7:枚^y=ZKr G/Sgi Dʿf=f̘ o 6,mFnV9i$vmeN(͎;(%\"s̜9q'믿0=:L?~-}iwη~;B;Çwtvn-SGaĉN;ɺ+Lѿnf|ڮޯ2#8hS6^s΂~bL*n䥗^T7[o<~^RX%samEnV=SY-تje凙em!L~=K^|CnHܔjdAMnf~[ZvanD?U{-뭷lG{өS:]9Lq-QT7ސN8A6h#9STlO{p}G|Lıb-ysl8L1WXo&:t;m+F<.~TjUוȁg_/_:>rޭR#eMṱ@^s$]_G;˕?~lw6Izs\uz+/,lI?ECu7߲uL_~裏v7wHC=npԝzrg5fr<䓱҃hnV H"oBd SO >~Z ى'(wUWuc/_|Q*?\}n]$bw| q}Cv b/K7'/`JE͈V Bҿ'glIb]."7!NREyO,I}?mݹt>\=QG^r Kd}'dct S}ȑnsR&L3<#_;}󑶾+wb9kF?~3?`] mγ/sy3c7iᅲK/I[SLiAΩz^-e(~?%XK<%IQ$t$faldlUAzS;vs3th[&zB n$H7V7W_}Ց!kb",jU Qc!GDHlKߧ~ G%%%nZ{.[:-|iVޠ]fe?H|sJ Մ MA B0weG0Y8 z!< S\b!mlo`-ꈈE̊(jW'?ͮ" 52Ff̙/ ."vRMDč(Q|G?}0fD^&TpMjd-/bp^QO:`?0 ?D0& W#GAH%ʸi%"~3"gL1{Ʃʲ )¸へPD}HK-#qdVO|hBUf.^^W%;|$29gm7'~(U#Fv}I+x ""1%Ga&>|2 t-C%Rgͷ0)y n-#:RU Z7 QG^[AX+W/_M-[~)þ2Ȓ帾4B K+/r2xO>.&2̲H~ȅ/"cy>e}$uDm!ڦ8C*"~E$ֹWڞ]KGu]pLK/_򠔔6b XɅ$E\7)τ:ԅ2jV4n*3Pp* ! LGy[F%fϞ@!G|ILYBe]( (@voNB!|!h5T%* $$qsem ȼ9-MDg^#2䚲M:zhɺAMH 4z,%^eKJS52'u/OZk.soKEe4=L+n'P%cʶܠ+p+|b=+~ 8e u+tQ/dWo"ʦ16[\=Ǜ~XSz^W)UuD'O֌2nX$=8wx1+"u=7zFݎ@+KՂynW4ewi5v?ߴ(oy 񨣎ro*l {:Z)ȉ0'g:fL7믿ti0j(GXo8xY(!kX@)1H&Hk!$4r:iy6B[ڧ?HxDX^aãELEgt;ƒS mv(bގMZO>| yF)GݒRS״Vyم kdzSz^1y8it90$D2 c?MlHJ@p^yi9X_GT~,= yO$qܓo:St=z-{md=돍/ %V|AUBRUK. 6 IslxakO;Gr-9>dl$dɩ#e=쇹֍D/-țŕx ϩ~)LD㈈@h SvqW2r͉0nIi:Gi:M>x0> ֲ!l.F/CtrW6.*={t])hg~_ q壾Mz^A8os^oasϫ4VF`+%_/̛-W4T~uͣk٦K/poҏdy2yFGq\,5F ZqN$a~ŽC|tW9pCS֍Ke?n(#RKȇ8)j_geC ŝ #q?ք!!b.-)ͷ_GUa]sD!tQ-msh/+A@悲ln^$6"4|_`,yi)oZ;VXwto:׽Go9gkkO>KE ;8ݻ3C0D DKTdWV=m}_O9-E:T|}}y\jWg2C(2 uLc2."aѿY=F* F[kXc"5B Wp$H!uE?sKeyү跹YHl*!9aYuW}Ď}rDmBUN;a߶˭lEdq)tDt͙iirCȂ2Q6 oB,(xU/^6]j{jd i(I8iZ}NԎαr.mg2C(Bvs4I:E>m:i. ѧ %/ɏ3ɤ7^9o>){EZN<"FL |~~4H~]l9WbkPCtZ6m@iu 0 Nx{O|YX-@!u._'i;o8اv2%WF-A|ئ'X0 |Ɔ MaK!vR$K# yrB y.:~=2RX vYBsqڷYԪ CC ̓v;,@!Hl B@Ԝƒiab>ĎN|q*}]mǗў%CXvm@@ eVO'ުdo,N@^(${_+!`!$|&I1$8]iC'|T7Uׯ!`!`mS|P,M*o bw@|:ߖپ!`!`BOԒ.,ԉ?P߯!`!`?phub:mp0iu!`!/.PǯjV9b:9ץzڮ冀!`!`WҸ u{4Ǒf&:Mʹ\hB$;!`!Pl(<~9۸>^\]#p3Aפkc2C0 C0sL, }Ǔ~j_geC <'?)A mx}i nAo!yQ)k[%uN6>d!PO=ZVZi%9cdW,ґۆ@#^9?o^ 4e)7\yM&t^u~/!`1< 2lTjkkx4!жL['+n|oz`s re˨ ndi()ss%v`l# ic\N CvӯDꪫD:w҈Y2 !0uṊK5:yrΌu2Bߠ=3fD}HD7(m$Qy_[Ε/g#h~MPZ-[$ڴAkiq)))q[KL~K]Sۂ N7|s l '̸`Z<k:lqZP/*3 KF^;N[-ֵie:TM*jʅiKc;8اv2%WF-A|ئ'e>z޳gOnd/ʱӫޑc^RK-"n',z/<9σn6{L~߸(ʚs3;w(H%qN2E|ImoʯkG{!iӦ~'^3? Gy/.2/|7#v*暲r/lMǡ>yna]Ϫd\=J̚!zXŪzNKg;֭[=4:Q|$eMEǯGF54kĮq7tPHr.N6Z {N 6lSO=U w^FEE\}@Y3c".]jR%r-M&M=s \{D|>cYuUDrꪫwuC=4c1|9ȋy8c=tM ϗ?>87 iD_*r!W^ h}]EuTN&Np^}֋2q2haMj""'RҹL8F@y4TNkf|T>ڎ/%*$ !_s5r K#2o1$?Y~ ]R[SnD{3h4˱n3;tPye6kٲ^Zx訦_.ZȾ+Ɯ[s2di.{\ls;/guŴ??"uMouuSce5=ܾ>a rW)-k~5vuM]>ԠjQ_u>ɒGW@qܕ7N@^(wI _~RYY)W^qшGគ̙3]T sQGɺ"~UBtP?fp>}p e6_WYx] \N'K_}>gD&oV+e7wKx1uq:㦧_z%5uM6D~_/嫯?rE9 &@]vYgĉevrओN`*iCH q+p n?ns0~0'pKsnœ v#DO?;Y2wpԩZ~~RX%smLQ!t'߽S>Z8DoEi/2[lX9x9Ժ?3mй馛w:bĈL[.t7~;ϙ3M4h! lফ_ /dTGs~>I>+!eD19L/.z빾Om6t9ԁ'pm$>S>NLӟ]uRYM[u]xr3!*5RDwZ)+XK$5lt}_W~7*CđdX~Ꭸqb11cع}嗮7 7],E׈4򗿔ɓ';=LrK37~nv?LΚ5+#wei5wLԄ<3fnFtw8_|ɛ O>.z3rH]wnF{x6 IDATcigYX@w_X>OiGqCSO=!Ǐw7k1;蠃dvpL" mnm"De&4LP伄qQ|#]x\c`̖t*E"F-n!y gUi$ܗQPk0g&r9.jC3t!A=}Y>c>N>mZ)AItf*R*>OIRT,M*o bw@|:ߖ>$h֒8]|C$R͟'Z.\?|1_|ik 7^m3$|'"Ĵ{< 7D'm7RШS%/1(/P&qE(R> xu]v[w#eÝ % &AЉiJM5׈) !ɼtneCqzeu;bCdrS%ix:c7z䜳3fpLñ!Aa$A HMBh)ǃ%ϱ/~+qX|hCcq#"ďh+cOk1>%u\C&=`guD=Lj5ǟÛSm'h[6׼wn.ek榒 DZ!Kn~+ o/&7_GP gdIn'%d)OXaHdQCHMR4Z&ډFhczz%t9X#zFԐ&IjDT;(lYj?I  f<ԭcbrLb*^<@;۷o}[s Yy qz>tx[yn{{ݍk{Fsfk7#Q2 [ș:N ueyZmEw!SLSr!*GD3X皸kYyzq', QAIxt?-׷ C i QJ u?zZ0>VONG_L M?Z1%/c$>cnpX$ 51&8Z9>1C$*|R oO ZND!$7k!@äk9a؈A!tL8>?Xsqm_}o+ÇwoC)o9^xX\AID4Iñ"1|D$KOq(Fjh0Qxz]cCuo#]5[qsET,]KG i_/z]o96z+!]bl>`W3uC JwET7ʗrěi!zEtBs7F蹘Qп$ӈD&Ob*(7%iR"BJX$mmc}Yghjxq? ùp3@B>A3e'NJ>D`5;}!tA5aGc3N7A/ը%senI0Aj2s:eKJnLQs ע!͝}Ĺqsh+cuB ?Z~*slT )fYuq1e NL?r|\98^Miđk/@4dR@)O~ېyU:~,'s#:⏜*z=tqh;Ȧ?ئ)tF>p\|Ӿ9]˛l=ݎ@+KՂynWtބ]~+'8%)QIP7Mus!v:ФIvK$KbFbsa#,/h"7~bv>Ejz"QEfFA42I;n$k35Fʷ}H eDr ICHc.sߣEܹQ=/gB53Br-9Cɩ#eĂspΟDKR)'sBoqd̵\B9}/DT7v9ZqSQԴ1&|_ĸCd m'"ДvU%~i/ 9v_?qMАOJ)vB]0庖1K?Ib,'[-7[8iGײ+6U$~%ϓ3˧M{O\ĵRcb~ǭ:XTpCS G)[$(wĐ\a<,CTQe%pE?[2 Ďh!Qi=Ip)<xBDd't%]Z6]9} ͑==SfɤhC#vM \ :J(+qS9:9̾#XJ萤DQqrQ@l!Ppc*2;?RjK^!:i"ޖ~Yߋ& MH!uxJ`̝=O|6Wu3o'/!с"WHc2ڹڄΫv:m_ϗ[0LG2 NmPYZrX&Zqe^|RSCWV#SHC@KI׺s%vvu_si;?@"+ .d  eC`#wn,r* -9M&yI+-h6>46*b˹XBlͯ2iJ[ؽe!PL0ʿ[L=)4(&~/t88okOY4ejKt[&MO!`D$7bK!v))6[qH(pK?t_'ki7־%]n預\mj%Cp`]~2\ (Bxހ-)oќia Om#bG'4OǾb4!`tlұdNuq,T27'Kr E/v߯ C0 Ch  k|nO4!vMqN[0 C0 B)I>(uUd&d;p aoK l0 C0 @cjIbD|r LY0 C0 LgúS P6|Y8P C0 ChmBWLm5 Ў}=mrC0 C0+i܅:=Hu}&\]4i|@}r C0 C(6hsm\jMQ}.ĮANh_kR51!`!`m@St_s|9_׋GWi Ie}ܯ!`t}YO ӆ6< R^Vr>eUS x<\Ney-E:U|}}y\jWg2C(ReѲJ+1#+b6O*ȑϿIƏ}[/wܸb錕<',Ny-Jwk"6*8| CxdVa{%eR[[[ģ1 E`:]v+_{˘_ /{^FnHv#HC@Ka&#+ScY(Ls{/vZVgE@uu~%RW]U%ҹFΒ!`4sjdne]ɓOߕuf̯" yFFY4;'[E">A)h#r.xp<A뵌mڀv߶7|㦑qU>eܗM.7mb}ئ',?.ovzK~{9sEU?.%|Ҷ*m͉UTO~yo7zQ&NxX8 5u2c^M)\&F@@y$&F>ĎN|i0}]mǗ:^owqъvI{1|[,x bĮStiTPW_}%| 7l,C;oo뮻ιI_K/T47}g2c `>B[§~0`\p-#RWQvZWW+>5VVZcC-wҲjXcWC N< i/NOTl+oCq$gC]BYhpc=ꨣ//\fI2L\o@e.Oqr'g̦NovI')}WȦn_H7nqN?/nڼ[3(zoY "k& 묳^ҪǏ"2vO3:sDHdۆnTq̙/g9#Q~ꩧ~TM"K_kH_2f3Uxpϟ8 Fm$v<$h{y>p<4^L o8!kxw߅*n? {3--1d<ƺ40aB#P#Ӎ{キ#Z[~+DN?t֌?^Ǝi9Vj;qD93*'~ CiԧG~^o&1br˔)SR|S}?3~k"z\:&QaÆ '믿ƽ[=ɧѵ;*Wlrw;Yo SNq0nΜ9󀷢UPD{׿bÂ={{ ػƀ%jFF[{AR8s[rٙsf̮;#z١)cĄ-qaX|6pCa=q913zlV=7>c7yNڱ/y4d(5MV=r*vP7ŵ';穮䏡X  JmbZF˟D>5.إVM3R򴜮F独.K.x{u{gC\B''=b_8q 97:nXөS' LI(رcGA=SEOSKnJ7|ӝp b޽rQ? eE'[J{\ǎ]߾}xn @sKE1DF3 osQ$/U'=E}x7$ ?=[oÇ{B76!C`M7otYzȆ!O+P9f:(! aJ ŰGvx)d({տ=znگRMqCR1GQC暒7nOC <) ux9OcA-616%QȔ\9oy}ၐrq Rwxiu;0C2<%&(EJ^LGdJ7ӍbdmxXuIkٰlmCPx=={P*0y"M#O@  6<xaAy%mRd,B0$pQ? 'p7[@ Cd!x9vj+SN>deK܈?Avȑ1"Bm&6Ag`J+7x#U;6K_?EY9ڵOss.y1 L@ԘyHGZJ~iぉA=&SqxFy@9fy`3u|d/ﭷe\OY˪97[l` .C5X7+^a9.xS2z*m&}iGxr+%v,gmwεOX5 k5?eW?_KZ#i2iם uYNiX[LLxJJ*7 AZA6!ep6ByN)7㹾1H#! e 9!BxnI|I/:, ' ІpL`26ijE}%A8MqX0D"ENd!JM%Obp>ppOXj̈́et(9DQrxfB3O~ȓ%/i2ӱAi33kT{i\|\q~*i@$ޒ<5^Hynbr>Pl5O a C&w I$f(9oPQWEaƣVj1mdX.raMzdx ]%q#C̈́7r`(En>T ̀ RmJ=yR-fRƅ~)^1XB0eHsӸpdpI3ˍ ;dկ˨ / d!dM"!<q#aBR B^ 2˼"^V %a_{ [(̋X U˕ž ' B쐣q27! _ BXg^;" =u9a?}Q('$<>K(0K_;˜󋹛o)r}YړtZ~ONdH mmbc谒}y4?sy5}J]<9ɧORƜ\/v y.UOh3r' WKֱ!5!u;ض^ɿ&MyxRCf̱km'Y!P&GⰮ,}-2y]^U>3C:k<TǏ'xBJsG=ܳh8r.x73$ O UpS2YM_IJVP Ɋs*?MZúfR+ɇ\m`Xzb+ xmKҫu}x e?0\ʾ-^2\/n`eanPچRz0\5:1 Q,'͜17I&ܧRxYT*c}LhgbXC!:BDئn @dϏH!40m+8I:sޮ,C r,j9Ik6c jlu8!x*t;ϐB@ z:P"&PH8V8>Cl=H8@lQP?fƄcr^p }Mx9x9ɗ!OI3bvXT=Fr\_..Yǂn/+ݵK`O-nA{ou\}T9m=|l7ひylQH9NG+Y Ӕȓ|I1HYqd YPv³sֿފy~us鋯ǺߏwHWygb{qIS_Ǽ*&m'/!OIGZǤ_U#C#O%AiH봐7$-Nx$[H`8x-Ɔٸ<bH5 7‚!`Tvw֝8>y5*<ƌu_$]È]}b'.+7B܄i2!mi=G!N? [&^?nō1PaVPz$ rx6$.cx6K ƍ s73t u(☛?|Yf! %?CH^M⼏4۸K>en-[dj Ϊ0ۛUvf/9"0aHak1>{{elqmLw'Mw'~閛c*dY8YRV~^b'JCiqVrSwZ{gML`gZsX@P9M 3 u#}s6O^d#*S*?H#i,5إ* /EtPV-2 înտWP‚!`>8/Yyi#r4T"yl=uEHN+ ft;6 &7Ǎ2`>ƫa.~q8 #()_ bWo[)rtoZ0lnEm 2C"f3sXc Gyy?&3]~'N ;݀K/` >ܭކo۾V[Zʝ~酪]P >[gu/N>œ1nW7Qk|A7tS[oy񔲏U_uU3~WT!l'v\}~BWZi%1 8NB?Y~gb-meJf&8`)99w96Fkȧ/}d7xÝvi믿2w/: I8_9i) r=n-,F<8CQ嬳r.8p; >hyi_ ۖhqoǶN<ւ fʊ:an۷wTIqqŔ-\ĉJ`^zK.D܁w>N}Fg&'PHlHP,׶'>h?~饗Wf;p{C'p'1Bٷ^x\u0r QCms{ckUc~q<&c=\sB]T1f@y,GdBNXSkAt#: y:^K7RڵkV^yeYQÛԻwo1b[eUD$g?^ u9p4rs3f+ OxdAhfdx͂P$CbI$;w2,u_׷oߙVlFH 6cEc[ٱ_ K,w/ߵkW)+&g dTvϞ==& %>Fʾ\B$!i5ěI'1b 6nBcжm[" HDaI?8u;^?ސ2ALGsy'1/r:n zMOpl9# /B{wD_9,8,1Yh,Բ6限<MjӲR90 Bj {x~"Oe$pLO.tbL0? 8+@տ .ڬ%Dn)ʱ,y;k#1ayTiF>#k IնnN9X|2d ܼ3^*8!1a3xU =b^Mg8 ^r<|`̽bhBrڶxus,T 2/|9:#@OűtWV^2ZDP:V1' Ȝ5Ȍ BJbAx3 #vxxK6aV4dg Lg>(H(ű\V ͱ\` C5&여п?M;*&n&}6x9/*7F)1chYɋh٘L vQ ; ˴.i-v#DxbHVr# Τ|o:J7_ޯ`Ʃbd )rL xCN2cĸ5DDrcd(OzhX$zn̉C"KCj;02D}U&3c7cVO!?O~Țyd$vPO؉ s1'YdQ !Yx-ehW-x*vf}n o9,A"wr5u^c>l/m f%4:$8oX#Eeп=cIK Q[%diuAaq<r\o+մ7o?Fȓ|I1r B옏ɧ ?Ļ>:Fu=/Jˡ~mb*޼z&ײHZfjcIwV˘IS.4yi$OXđ/0ylKu,N~ xB[DȂ!`8 W?aGx7V CÃk0Z ;6-15iGQ!#?!{t# e3R%ZDFIR&12ZN-6 bH6^;Иfa S# IDAT#? !. 8(K_Ltb׀z}mN,02`C C0{$֜GK~9>Ck†mڐE_43 C0 C`v"ٖ۲C6&P+bƀp[KkE_b]fiC0 C0!OmcGENnK~V.`VȥY!`!`/5?/m\:K>e --m!`@cE@Kc{yeDVrSwVVf!`@c@@?bo#K-U ax)%nVJe-ɓ'SO=/~-EC0 F@GFL Vh!`4[$X: t:!v4 rֲRK52[G[w,K^xfN7>;*S ,?a0 CY#_ȓ|LVd܁bȅyZ"|ۡ{I^z;N#Glr{wu#籰[pyL6Ou]箹O7C0 @x61YdBnS!MvFIr]zjVءPH rZF独.t3F`ʔ)c;7qZkd\?LMdb7-9:V\gs7MǏؽ+oq,TfҖ0 C0r"yJLEdb vʓDvRgf]iܻovm[r}GnwߎuӭQ\:r)M/ y0 C0jOfbU4^|W.J҉.թe,KHZ]]+7ς˻K&=q}Kn#!Mwkn{޺KD=>ps[tEO?^z%{VXnذaEU_uUnnEI}O?6h#+Cچ!`@A@YpH`eUT.4$ u輰3Yem7$ĮMVѿ^{͗qߺ !|mO'K&\˴mSW1/z!?ᄏ[}#<;0;;?ܝqr{v_}Ul{zNp;ҥKm!`4YB;V|&,u㱋5 eYZ.ö[( BvlztV:q}ܘwv:uqlu/G&u9 $ı-nuu:tpk_?_۶m/Eb矿ۻڭjn-t'Nt^m!`4i e{$;ecZ^:k@gf6PczBصkuIHY-~x!ڕ5Om6M5<~n}qk;蠃|CVVBx"9A-!`8H9NFKW3+ 괮GҢ/[KO|}n['GoP_bW.R28\Hd 7t?+ܾ^}U׫W"0 Ch5ay0[7s׳gOآi C0 f@FN&)9b޶d8LC$4:O'˒X@_tcZ~3C/G+Hnp=6U46*ϧI6Nб0 C@! YGBOe.Uyf&ax)%nVf6oQsB~ρjXwϑ`!`"8܈tai)XcԂiuX,Xn  a3O0B%1 C11瑲dt9y%SkA슛mK:ENcVK]m5 C9 EbKg<<). iӲQӳ|C0 C0iyVWWgD5 Ci#](#q,}-2ybP 阞@N&N~\~u o0mWO1M[!C}O> 4Ab!`<%%EJ^LR21B~CBI"r;t3G!΅ZVG{~.i C0 ل@bkIb,3ȥu\w&Vt3C;z왫gBr !`!0k ?aYUUCBC r:O$*)Fؚ鎵n!дqzV|&,̣ JXcȰ]:l0 C0 Ɔ@wLxġYZ6eԫ|fku:g!`!`45H9N藒+*C"6j@NR%N}slς!`lC@?bd#i,5إ* /EtPV-jN׉'믹oY1Q|ݷ~+>^aK,Q7xwG{/+{饗\Z}mݵ^#4 CH(߈MZ$y'"Z;m\7K+X!שK.4u>.MV E]&L_~BEcb:|ebNs뭷׿UTyn7tP#vE؆!`8 GbfOկ+n-9a:ZZ-լ`Hb|$MKNPת렛]w]w)5;{)O=o>oqs=o租~r'C;vlvbC0Z[$۱t$вf*6XZV:bzܹkUW=XxJrT\p[qfm^~B5;r-Xѭ't[nu]ݟgwgtI!K?ns -vm*u7|gmvKѐw}v}wbyf-VYe{ zuYAaۥZʝ}yW]u"ۯP?C9K[oP73_~[k܋/+и% C=i<cZ&+/ ӕ e ;۵t3F߉ś:!9dwu=c)?/bOnF׫W/w%3ϸs=1G.e nrx{Bv~7αae!~p? fJ>V^yeV[9րdW_}vygwG{3zh9>| ELzkwwd _-n*9~\sM~(T7t'pBA!^0}$Ow"wuy}9x;ucP=,a@mZhn2b]ɊNbWO9 H3R򴜮J独.t3G@+<I>33~AT|A^{5_'z#֮];袋jUO6pCO7|s2vN-!C6hs=Cml߾СFR<_0*/}2'Ҵ;R-裏}p2NHI&ll#Fiɓ<<' W$iAG^ ѷUW]A$@%` P=o!`5F Tb/ZVbZZ6&S2!8FцeZ6,fĮ.… !bE6cqͱテT<= aW5gB^&axf«PØx m)cy KKQUw6Ct+ǰ*^J cǎIlv18^KF`HCߗ1. 8Fgw$*'24 C`  94aYͬ*WWmȬu\[SX!=vyw'#wy}ޭypo[Yb-j ۼBճgBNe-LBdG|B_'+NbN x֞ywW}׽krBj8?Wpm2̩jH5bC0f2!',jbCC r:O$* M⅃UO~ܚk,_`5+,1ɢ?Js$c/~ Y$0pesX0?3<^OR`gVCQ{Ȝ@!7xþE/@q̘1~o6w}udJl C=1CKiep~B]&2y]h4e.rR-M^%sN`dM k ?aJ+J@Mvi'OX\:T yb|IizPL\蠯t[FZN.!<ql}Oԋ!v#ڀ4#%OtrK!`!0<%f-+y1-)N7aGa%e26 C0 C1"P-O$v1Y(qݙP^Y0 C0 ƊLg òS cd(C:/LVY(kۆ!`!`44!e4 ettb e˲k!`!`,B~dk٘CP 阞!`!#<:]__J<+Rlۨiu:Jї8M C0 COԋ!v#ڀ4#%OtrK!`!0<%f-+y1-)N7aGa%e26 C0 C1"P-O$v1Y(qݙP^Y2e6mZʕ]q {^xy Fc\G_w-rΩ+7C2τ2LUQ: eYZNmVg +:;3YUwQGϑց8edj _}E]tEM _~ck%alc%5g;Í9A?tA~4hC5/t}YMjs{q rk g0<Y܅2=ײ1}-S/5^33D_1=˯Ν;yҨ[ous1GUn;_o\"{r6m謲ҿ[wug,#W^ItCO=cPԲ; :U#8r-Gq]se<ɏi!+A@xh.ո藒+*.ZTMJn@ĺ٥:skt*!r]|s tsLf7|sO%|w3:=w'|1bkժ'DvpIN:cobņM}Yw 'x*Sv؉qѮw>V[9*3DL ZkBN0tEkپ}{O֭[W_ksz[aj!w [)<dk9t|-r~~(v>|߿S ^{Հܹ:u~G馛~34޵kW_MYP˻ۓ 0 %\V\qŊC[o{'}"m)mnb1w584P>Sǖ[nv[ Yp|u=~h\ܔ~k. &TJ[:jeg:u@_\8ɷP=\>rnn6I-T@x`ʶT%tpB6mmh, }uYKsSč qs$Cfmq -PnjQs7pI<_l1ק~ Cr}ϗ`#t;찃'[#>CO!.W)JCHBq /+8 C<(p7NmS̷C` `j]wc_~裏عY4G?y4J[LΩZةۛ]i!t[dE6c"5 \vC*=ڵkF[^_4 "SSt;5BtB%z2]M&W>b4sE 6Ym 7 @HH^C Jl~- rL>qsCXG>I`- ؉7ĉ bb祗^Z ޮ4bWPT C';Iݒ/1^"n,x :ܔŃGbahOH I[׋] Nm.;C_ǎ=F}{BJBꐑ@[ Q!oCp\LbfXol;]v{H\s͘hf~sZ;3Bꘒ៧<[ rf%ͿdkCɽhUVp1’v jԼrfq<؉YFd5.}|+K/ OQ%6?xBpI.&m+!cn"+163Gc҇\f] ?Q_HC`Bt.$W)R͓)i{d 3^UoL `^6TJ"΅]eE9)CF_qN0,p8v}fJ6ͼBpy`z[Ꜫμi9,SLuZMq %wYAxʕS笒ᡓю=ӝ}[E^fMo0;HBOeFŹ2ŠRMK]Ok,,Mcx0"ō N6 Q.'!7RyB g1Q_hAch ^@xЕM2d07£OCnPZx ~LJAxBSxF$s>+li]Gw a"xU!e :ԡe?fߞ{IlY-8dC!؃'`wYg57Cgd } 0 7|H%vnr|C^!jy,^r-uN<} 5i;H/!yE۪W09 &XǶ4X9n)/%/rĜ}@~}aXۜW\{[bC9},< %HL-]&y輒*WYՂ fʊ:ј7Xɼ*.Z5c%"ð,Td%\z';zyGu\H^+eA[ŎɜNʛoK YgZ`E$$aQiu1!e1ǎO:bpr Y CXed8~LCY,:Yi1Nj*?n!i ] اmy0y<1$JSJ#NZZZ.ꔕbƜ4m,Ck"'Ct~ CwiuMJIk ɻT]I]_e5qcf8DҦd9s -;7yx2lUi9ՐvVڿ,=TK:l|vdjyY<_p;oS`,;B[ٞ*67pɵQ~\xU*cOSMK%v3! H&N!G>qfH~Iv!Jyyzt^z$CiNd ^̱iZBUJy9rȼ&~:@R:t[F1JC"c_L8c.i)9l7F1S- ;j9wu6ްm&NE\0{ؘ*2QcmxoD L2= e4u'í~t2W)ȁ,4y`[nZ[jwOu;!Lk&<~o괩`1-#}%7> ?1{rdH~4׾ck׫nX]WKiO7v@pqC׵wޮw;qwsݻt>7G| /&&eiS/.SdhҌ<-"-m n Cz9g(^H HNAeq ͐ak$ĎìxL1/H6ee-Y|%>^7=36 \cP@!'JEc؆.sM!kkgMh71@ξ7d{ܗOtg\\߅{ɱԦM2ߥӯvuܩt_7ѝϿY<%-+y1-)_PlR026<, вam!`4QAc؝iB4!!~BҼ-Rΐ),Ĥ>sY%Đ&H-Rõx\ldF`؋'0@dy_(uBB o+x.!؇'mbljڪ.6Ivס\n#q7t%s'M&:-Y|t@wUOpG]:y ꫖߬%4MBkCy]fiC0 &7`C,v!d8EE,,jDVSA#NBdBW x Oea޴r~!حz>!K?rp+$~2F_x[@C!mXOZMCPIxozjw*biZ) ˬK8< mMO^IΉ]n5q|vsn?Jl˄|F,R]SZ?4D:fX&2<8Ld,6<\`57 [ܴeW BCUt,Q6؅!_ w1G;G SI'x5䕊iGoqȏ>}u[d~n/][7ur]uvn]dw./?7!vrr2_ѭ[tݧ,*8TV|&eU5C5.F eahd7iq3gBڿ{iw1_< ;46+/X험Xg~7p&*c񉼣1˶8{ !Ϊ7b3C9nB2hFZdN+m 49u.%A|M&0K=sƆèOJ9I}m^@{3nEUQ^|ܯ_?/A[y$aQQԺ3}/Wɹ]ܴ؍aԱ;pcˮ{Gݤ Sܞ;x\>r{O9yTK? gDClL_KUNK:yT!8L$3Me;7[# $e"m'%6X`.yQ+G=vǓnCYKR/yVDaXX[¬(k"/>%fag4 KgH $ At > H )wxy,_]7;Ȧ eƚ -'9X 9塾1-ϊTF~<~S>2D'X{tg>#H={챇k_JY uO>wd=gi<=zylq /cQg@_ }>;]P.ڎEHǫj؂1dkB΅lm9;tA:tJ>wپ.!sJAwjmhNulkӶ.%'%s#Kd;.\/jkeQm_4QKrۓNO}anC&fs%xmX 7n4\ȸ1q5 a^^#8)>0yHl@p@F% 8!:n &>gH0~wF֝p $2ݭ[7\,VYeѧ-<6agX7 4{m#Dx x4kr 40g )Pjp\˄!|҈z(A6α"<'Aұq8&s VGNl 98xsǤo'zo5>&`i{ ~B9F<|^+2FU- #u#W\q!<#N{Z@JA4>1dyPVTC0>c}gzrTגi5Nf-_6kEcB˟ǺIӢMBw{[br2Ԛ,H G?wa)zfJ4kkuRH ]kOouNKiyRK~4K$D.4Y*jQq`/7W1'*z5NHn4Ay{gl1@Ď%!L!+'IƐj4 9H\*0,(dZ` R!`#Ɯ- H`GOdd w♛(Cյ x86Az9:ZT!o<'dU&K/w6Y"`G}M HHf Ā_€0_0Bb#`EPblGLDG0uuk~Vu>}zk{멪Nu>QQ a>rf }_>#]s}6~2Asw0U(?XxK$܍ySUx?ٟlď_[s ];[ǟ9w8_~]xkhgO?O~||ޯ\W=J7B:mb_q_Ec;ڽ.y|Nq_9̼ !%񋓿ŝ ~9 ~d˝b|_Lt :.u_ _n Γ5q/Ժ׾rW1haИ #Fmy_Y;|q X#x;[>rY=8<\?=95dkqH _h>55ޡ t 4Eg7Ao __9}?ӯ}WOxn趛w۝;wkNOwSk[nyo]|w;x{+?Ac(y0 d.id?I1t|Tam6~ <-H%wkR _` /K_:$n(c͓y抦gȉ;~3\|ǽ<tU_`|$Z٦9sM8>:;w>o Λ_Qc?=gyo7ѥ٤oЖA'Fݴ#i 8j}]Vs$Ɨ+GzouZ| `@?Y?گbN(OksCQcR i6k+kh*Xn4t dN@/VpmW'5^^^DSWj}11wO?oQb>~Ķq=?;o~vG[y<{Wp-Zeo[k70pblb! Lڷovx-I>^f_a9E\g OZ3hPy=ĭz/r΋oJR:g;Ѓ[49 4}4Xx6èw4qts2냁ʵcqoU[[}w_Wwxm&1`}}}rGQ ;Oٿ;տtl; 1=ӟOO8}~o?=c};[_s("GzNJि-1a3ƂWKfFN/q6tWݦG>sqazǛ4&4?/wAW]A(0 W?y|O>/o_̧NaG?soo؟nğG{Ώ,1xl\ޥIAeic'yАa_-4jX9-X6r g N{^ 8٪߮|{iFQ-U/&|pN?K=w}|o|Ϗ|6ubΝM wmۼUQ>Ǝ&F.-9M(0 (pQy܂gh3|4x/}/Aս̝:?iiٸƎFU p5hCbr{? (0 4g<#_7Q>$hxgW?CZzdSsc4v@<f9X9; (0 4k| zWz!,E/L'W4Ǡ#;ruK5vFQ`Fa.{uvyE[tX~W7(0 (0 o=yҿu^]4vWMPƔ_ y.9 (0 S ¾E =O䒷@=@cLئ ?e=(0 (0 dB_cjcz:j=`JI<GQ`FQ`[p|B9Ƚ8u;zP`pH(0 (&*`CgMI!w;`ٝzZvVW9kp(0 (Ipx6xY/O['m wR[ :'7 (0 ǭ!穾=N_6vW *'d@㱣(0 (0 nc̞F^yzkYgMW/09+,ZcGQ`FQ`x dϒ!kȡ^V͓=Zcqlr[f(0 (0 [?2g{={;v6cUWjֲ;K4?GQ`FQ`x dOdbщ'ל6mcݎųKo̜v*(0 (0 NWgNcX?ޟ\'j '\s68n#L|sϾ!f|s{jN7ޫ?\?s<^zy1⻑I3ٜ+?̋0.+TWu$΅ x1Ѭ÷c.b3{^g2vs:[s=r/8l\K6oԁŚˆN >sMî0F#TlgNb6FךsQ[yH]SRRY?ڟ3맻N:Z/Ec?=3} 6 ]?r*N '-;ls SEY'&Iwj Z07s+>;?5lcĹ?&]rWԏ~~VW1l~9vXy3<lnlgO_pq X҇G&}ܱcȜb4]氌9qX2pi9rx<]_44ftkcyyʁށp-UK,xmV0-|rdo1UZk9b)bF2{ǎ"wHsp7fD=s!sb}3ˣ kM]Mɯ~:d$'kM]Mɯ~:d$'kM]Mɯ~:d$'kM]Mɯ~:d$'kM]Mɯ~:d$'kM]Mɯ~:d$'kM]Mɯ~:d$'kM]Mɯ~:dL¡F֞۶Թn֦ǹ 931>E9},9{9puXr;n=ٿ]4VuYjwѬV+5\?^Z&~ލ9sX2/ca^\n=6vC_Hwn c]<]r9CQlyOymڜ"ܜ# (vX:S?j3\?_7V OK93#0V,7kg$fC|81yPsr$ Cb7_5tb><9}qs‡g5s;ME#Z8]RY?~fԫx^?7&f=ʷʓ o1q/o;#UNΰ^LZsM1BõIܫyݏ9|95(0 (v(`k3g\\p{9ia*W4vFHˎ7NZj1Kt3:s,}}o8~{笟}}~X l?ȥǰOI\klu|x&iXL^G<y[eSͽjh߆NɱɓAu0V.9 (0 owx.bw[6x~87v^r {.?QQ'FP'7y|'Nر:rnuuڎi;^[xnuuڎi;^[xnuuڎi;^[xnuuڎi;^[xnuuڎi;^[xnuuڎi;^[xnuuڎi;^[xnuuڎY/QK c#q6~b΁A#3Yl=:I?KK da7<%|k ǜVcHV8j _OSGz IDATGzY?5 ZoK_%w5YS\6v4  B|asĭsڍva~jwsϱa c-$PҟE$gA\1yב#{w/o捼u+jV9ƎI1;S ӈɥV>nԫC~X8;<zWoY?)0ϻw֑vڇ%ʇkg96v9{ S0ybpल#'8?7jcyƫc̚η~eWub|+$K^]ٮ&UX:_v5ĒrWI|U'Η]M:uܕj_Չ%lWN,y/weWub|+$K^]ٮ&UX:_v5ĒrWI|U'Η]M:uܕj_Չ%V HkOQy7_m9b^E(?rz 9Qq'`Nk#Gލݷfzŕ_◨::|tuw:uxu_+u:uw@S_W|&sl{ crn`r+f>%.E1MQ@t%&nsF ͦ+F313ʷֹ91\1?*P575}\=ڈqrSQ`O7˽  1z sadb:{yo py|$gw9UlݙY[V<+%`{khGY?O\?ssjyʛ&uU5yGm*qƑ r2Ϙ[+Z^CL?-~֛.Gͭ+L~+ u+ _튻jW⮰Zg0ծ++L~+ u+ _튻jW⮰Zg0ծ++L~+ u+ _튻jW⮰Zg0ծ++L~+ u+ _튻jW⮰Zg0Z8%s&ű6y`%w':s؃54Nkl%|ӒlVԻrf{}<1#cњO[U v5VMEPyW٤;4ww;/6vFQ`VQ2עR*njn9=6;+~ŌX oybsX3qRcV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~:ʯV~Wupe~_f90qı9V?x;6TYXpjl]k /OD_<+>9cWvj̘QzMKNq5ҕ#66]][}N,1NVI[՛?bGt3~zum~f9r9s<~d5*N/yG|#1F;?_baUo+捏FQ`F7_ -^5Ja7ǫjlVp{+zq8GF?R|-R7{ښ3gO^s\tXXj /^ܪe.xoU(>V|rnQNFQ`FwWUU϶t8Q#ѡ^r+|uq9w|FQ`|m᯸+ :V.?&Ȝ{n8= ~~ٿFs3{#GM2 sd? (0 6UGWl=<(0 fl=upW:Fe(0 (0 l#MlczS4 (0 T}wgQ`FQ`xxgo(0 (0 (0 (0 (0 (0 (0 (0 (0 INIENDB`davmail-6.3.0/src/site/resources/images/osxMailImap2.png0100644 0000000 0000000 00000531751 12564151555 021736 0ustar000000000 0000000 PNG  IHDRP_8iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxeIU9 ==yL I (T@y%|(IO Q G@ a ?Uk:=9t꾧VjYUNU@^z 5k2i^;V!z 5k@BHGu".c  #waݼHZ=GΞuO'_t^Ȟ\g$M$O }^I0 a84sWQ^u(De 'p2_5mL~~h50m4G}KӨ4 J aUW Pvi`6yO@4MW`~>ӏ6Vӏ~q{?*  9@tUT!6->V77?G?~1B#~Ⱥ~+\ JUm\KƓ T 1N T!MZxO/:q4 я9Rg?g9-,Mi@%Ƨ#︘nn>x=4=/|OC?G?[3c4o\':-O l3DV0,̧kv|55-mOk_?m?tkjP NXi 4pE B;m۶U333P@!IO F#P0_Tpq7OE^@"\T lTk婴.𷃎0heЄT=}ahR~z͚5QG5jժA_xۮ ~Re:П2' LI㧟?!LSFVܹsqӦM 9 ]zI+{"] Ht]_)hO?.']p '̮^=W)k xm%G3)XZxOP_֕JGgcvOu =К-; OOD G#8%<`N{HJx"'TGJx"khm5qayw)(`d -ҁ {3eA@+*a%nVJܞ~CӲGϼ,N]켆GZG?eOgtRY}ײK\w}fc73bg4=~r牉_׌Tw (*r m7C)=~♇WdB/(o zg)g<o~u4>6^U=/g@b*(UQ!\O/RG e DQ\2{='DI&ҏ?vzWGE엒WNQi@MUp`Q DM4&%I^Wz(S돎CB)}D ?cg??:sdK*Ҁj+6UJ%hF!h!MO/%W3_`PtOd7?oehPyPz~5a*[>^2 Eϝ6G2cJ>묳o^=O<9ϡM~>{ |;֭[KuE".>?N(^haR/hB/QqyBO{Z9e x[[~rprѧP0iĒa!:Zi~D@}O#^}e~\xāȄb"[2xVK Mi^3MkVЙ:k+|o^G>Nw7{,~_TO|7GuԌ >1xE-G=T <)׿#3?=1W)2?3ouz 4w]cz_/~-n1[;xi?q-'pOO/| ]?g6~nzӛZn'l81Z[kjխn5|39 A^𒗼db5FT7ϪEHƝ"9(ߦ_IV}IcL_'?+f>K (OQI )^RaV(z&t6.Ҧw :n5~壭]x4cm# ?g<-Q##fF\=m"NP ]g=Y7V:$1OâL=ڒPc|K_YC[򗿬^W hfo!ooȠ1B^ X?2X蕯|:ᴼp |=F \%äWd='G}GT2F7э7M-F^arץQf>YyVTSvdNr 7ׁ}ZFկ~5Fb?'?Y?Q }W?яg?ك}G /8Pez>nw' oP_ϼ=y_B==ZUt?SIJ?+}_vy2$ZQ!P X&W~}"rDq,Zw^*,ʓ( (_~}#osFGx[??O^䅪Y|ЏET:`=^.IR{|G!狐 >x2F׽,`0HJ4aHSԈG놑A3XXXߎ0ba{Cmd3ϴd7G<-Z Ƣ/J;N]?2^<蠃Eۢ C.⠋zM?\'?%SǸ>$1I^ [ AdX԰bbLKX KX3/V9Тj7:vao|EIN qmFt'֛l I{>Zi{uh Vw$o?gy"%_NOՔ`c\Ɩ..gl_rb cX{#V~ wquD+qGFRVZ??_E CO;8Zz5IG^*DM2:X p=ORۈxcly6O%蟈BĤ]37?!?%l=8 %]5xN| +NÝ]MtOJ>nٹsBL}Mq-^:* A?$ene- 00XZbĀr 4c{O}swsöd!_6ëu;fLΩR蛩d4:6A7?|Rߜ^A\UH: r2ywB(LO3PBUe?fmvnY4}x`J P>?^ěiZG}k[FYY!"ޢ 8Z%2`  va ^7[gիVÓ+]~OOGaQSW Ao5?я+\qk-DlQ\ضSEȦvrpMHCR Hhzoo|G2Fҳ>яV-uffy [tEExsRycz1`&6жJj"E_Z:~OO8<1Qƀ/4t0[ ߁㵕tg̛۪++I+4e< =X/IJ]EC~xF_Zzm/y{}zwu':In-qC4-=ॴ *apcD(&AS/guRWwtƇCӵ<+# (#ˈI5 zNG|p̤!E]e2jm!%<. ?fcϬFm?ו_+K6sCeW kyFRKGD*Z"Z|m†空w[փ[ҀFǟFM/Z)τl1mx* qV,N;%x[1y)df#Q__鶳D(M/= 9CB-;W_Nȃs2q$2 e#H.L fUF}M/z6Qvءէ>iq9dsʩoq(c&xHY\2-AQvɡz8ZѤ 7{PC _ R '뼔:cx0UjiY-t/>?!E_a6D~z|lmO_ K":J'+mfmKSzk_H]T Mg.Z0iiz[}'tG ?/}1@L 2P\ 8oe[&Lj˄gE-!` ,*40}mt9e<@n~e/m2Г ;%"܊TCQKFPw Ä&'PJN^gM:%B$"8M?4G G )H}B~8ZHa?1>Sm:'_^SKT!Q*ʓ+!(DZe=~i>|.'7I0NV7~D)e9۳~gGv_ Գ\2˲AuBe~֟;Byc2B0-,s;]?BxyџQY ,>ao:_k48o|f)G{2x k!n-J|nX? QB/84ATI,eekuAoIE>W-!FoR.Z8&;@&A9-L*?*nq{^})D9N#JS_B]TL~O.&hx캢?b t/pdx1nƓ6~@ϽJlWykq,'.?" Bn_θI'ƛ 3oa{4h1u_&#$rI噾 a{dԟҭg4V2~vaL- N0ň"GeHy~)-P?&ƑVKӓ ͥOz'h(J X[_ǃTcbxLPmANDylX!P XCoօc!dC|ɚ#{^ F(M$jw٣!"C[oC>Rbe%6~TŁຳ /W`٫EY to`1eҜ/,hI (-UqR[vZ!2XD[ aXHWaVz2M-SdGord8mhWeN)FWsQl!`Eld3[cX8Y2}F{#%?냱d}FnqO@YFhIJ Dpz \c%Qpg1V9U>n\!V/]tpMY /5 7ֻB=: [7Ö́ p3g3*`N2Մ8Y z!tJg`c6kö P—Σ}eZ:zi3(̂2,mYTRNO O"V,^ 8 Z#p`B{&Xg#*5='m?! ~To<5)[ xV')˂oV{BÀa?7~͙|̣SV8*e 0ΓsɠLSH% >W0z&;zh~Ŷa<nKo- |~FP7 ҢՐ8 Nrεc;NiӦR~7Tn" 9ȿY07v?R4#<ӝk-R-/ړB;uҞ?465,g@y cΥ0ˆɬ XO%O:nu1HmV]r%3Gq7<޶cWlQ/\< `Cp.Y(vM7QH?-Ə`HWZH#2&6ϔM7_M`od ֡sDR;#N9IaAlS"&Ѵ5C%Tzg[~3Ȇ 5B @=ZB@oQaIr -C $BĤ͹(εvMoyTGu[ĥO4~߉SJ">iȒ8us.?_w餓tjZxrHAS{챃s~p@ԢFd{Fyp4i5zKܠ#sk /~2e%Ix]zeu@z̿0J)cyH6LB^@8g $ Yr*-1f=sCFB^X"= !C-4g%c8(];̑S)Li`3dD- -ן F2,+J:/gZ( u'oՏycݻvqVGWsNg}1T7 *Y钦LG⒦L.K2{K27(/it-.i袼)Q)nY+ 2W~piȵ_ 3j=T{'>ggGsqc,V~¢g9. iɰM K+ږl?گ2~M5Zjʕslۇi֭ciŜܚj whwleu ' {(A ?^ .MZUª5Ћ +m-Bygނq/r-h.Wޥsi:ʱ^(\4:ڧ LX-׿;4ؠL/c2 h=ش!_DaۖC) z6W Iys3pd$Xr,xnsQ =*I!ڔ3-,/˜W(/"N^'2*JXn;C-= %^/W;$\c"P]//~aݺuqW]|~/zы;Ճ d:v_.wrq_.]n>𖋻rtw\旣igSm>,7\xy{uıOeuXlU7 +|ʛWWWh2 n~t./|Q)ӁEL6**81}$pb&}>mR#6IVLts533 pÆXY V)0* $<7;X%7W1y ՊU&juF 7a9~ nN7B:$6_ԢN)yy;Onz{PD՟k>ᢜm/RN2ó8i:\leI+ B2_db@tzl0`gR!C <١@&d FX 0l(٫$zS+ Q'C ޤ81H_VU׽#8ɓɆ#mκs] O7SŤokBzn$AQ8aQpW_rQqpo{67Mֿ7zāq%x|+FJi/| yzlFu[޲sWU|EIOG?'խn3+}~7=yOu'Vk6QvgW{n?x/f>-oQ \ 8ezߴcTԏ+tin_UT[6m?g#p#zm0T-7ooo}W0dk4-i ͤ/)Df }_P]`8QQ0*-P"otGEM'xHdE*ӕе4vkMkƆСńƍC9jf$ co[w=?ԺX.ynմf[@ڬ&y~薉ř\o NMݺI؂lk“ #-#9?Pe vܡu~я~,]Ҡ9-L.'vGX09x 0H{PG>꒡`+cFM$Hz|)eC)ߨfY-RH%mneMBG]qɸ^?3u-Xu֋+ԇeRR4/`BM{l 1!KDN5LZJHqӨlEp}m HoPX|ȷW0[tq+AoV+F+ xlC/XN9___Սnt㏯>ϻ>$"77՝tN3 6@ ԏ._j?O~V7 xw{׾5R_җlDl{K=EvlVGY? Vć[ʏqH/9m؆a/=8#,'ѯq#-[tG:ÐS0Ë\)M&vf@R2N^H+X N^,zhS%[8,*ȓ:A,uǭ[o"ӕZDq ʀZ>;I1ay {)GA^׆\]-bo~F 9GZxzx1GϬv-]$SD7 ŭ !Bg]oFNàCNt $aB ޮt$1}wJ`z _?t3^+ ;˔$sUK) Ti.0B _a$zyk Ci護M`,! =:ZO\  Xwnh2Ӷ_BEY F)@R?嘴B8zֶ6<4Q7 %/yHՒ_/|J|z2o?/L6]Kyz]wۦxt=.__wwC(<}Mx֬Yc1& u^]6yc\j"Z3K5%=|%9Ńfĸ8E䛰E/@k!b(F6sH#(Jk; ςntlwxb]Gu[W-$OBDvhA969#ąl4J}pA6" 0L؋aC“SOe\!&*߳zvu{[u'QF5ox[^}ݽ>X\X^xasfӟ-oo?sp;y(o|#My?ma k+:?`'VO|#m++CVP_>eT d >9tW5ri ϼ/PF<}Ǽ@`4F6^!U?غ{ކ~Pg?!Q|5/ɈO/P;~ /~v7R3<+Ї>J[6E`l;P=WR-N r {:>p 0ѧ/MZ NZPoS*IhQ-ny괛߲yX'?I׾Z;}Ww>4qxqF?38z_^ukx;V{j-2nL-c (csbҶO__-~{߫g G-7&=z+_96/$ OhMoe.g_!2A,/IͶ"?U_jm-ʈgd_sG>E /mY U22H[:R/[nFnv3?kFm˃#oyi۶x']=qչ?9l-,eD*zSyLˋǂ`ꑏ|>s瓾mt䀡B.+`C##K,2zkᵶ 5<˲wHy%ئӎǧ@52璶na| DJuV{uG<Q16Z~}u'&`0LҼ̹+E yCϹ(<\ 3Wo#r|x[֖%kEF=}w\]si龴[G@ Ɵpk}R #ںG^1xKB׀"̻ d|Ut" m^E:#m9Q(MV3(EUbB^:+Y3-E [ftf)j4a.jBBgtI^f\Bke$dњx8H1Lo{<yUN: !%0eVײx6F xʡn*N8G jy+Ɇ }ؠ$aR+!u/C\ۇDނ$-<Y(uFկ~uNS=1%Dh/3̖uMozS-W)4E\wpqO X%~7= '`wi4E\wprZx^Q5_Wyë~mw1G~ixq.=n7W a\CO}OW/}sBGc:mˬ֠8dPAd䲂B ,T +qMV^"P& IԐK% 즠 =ڸynVmV~ g﨣Vu<&&j\:4g[6z!Ye#& %YN%(Vj"I-"c!e0EiR[I6sІ<+p"зr>gb>"~s6Wnn!WxF[Vo~S]WzA9}GPuk׼fC=<"``{ymT UN #[v6t,葉vBN[ץb)P@Z_dȁ P +j* MƇW3SE&64x* }JxCIa>oV?IH5dH8%fFru%IϐmP"H NebyҟOgy#7D=:L~ߴyQⴿj^7O{׿kwkyAœ3&_ [[ǹ'7 u7={:7+1n[fj8#j֏ʌփT~HV {󞍶Z-xP=6Z砳yx2-#+C$c.eXȓ3B? (9eIUC_:,qb{#u>*(F %˸_эu'IxXkM0'W~P/_Zes?@ѻmp-P>W}#gT&w ܭ3P>W+}ZZ#eq{_c@h.INRWw-ynB-Kʮ,z)#&`<iR[ޘ͞|>D:X{L>:`&^,;8f9ӡ +,-kJ)Ad_ʖ9[1]([`$~8'>Ik Yd[@rǠ\%-~дRVk\ L#2(SLPRh r0Vi̬+,'&Sd'6)FҤWIRpFk"IpJ`6&jLIAO~0`Yg2<]oԤy5zm~Cf{⟝J! )=cg«}tA2L*+Li0˻Oѡ僇2 ڶZij9> q]#%xtq39Õ&΀PŹ%}9yoqh_1ۊr/sK \}6ǧ;;m^^=:;~/6U\`{:SYl@͙ie]X7_Vօu󗊞h9>JbfNR('p?7Y[C+em%N-UIO'WYD[t$d|Sܑ)'˄`iLK*G:#툞o#M!M\Ø=t팾ʃߘ6T Ue+1d49ck!7F"P1JGɂ '1L/,)Ç}$;'yEYdj1չ6%OhP55mE 22[ Gh(I  $y^=ƒ4&i1pԟ=0T&W@-\*Yʁf'qejm/q}ҾPiq7 !O<$<КQ^l0VSߙ[3Е:wgLpFGҙlBFT>P * m9,n)=P~OgƒU J/x.s `/^B9q!%w4=!{е~>7S]NIOoojvܴٯ[?Z#t&_rec]hz.Y'!FhNA%r0 a _j[ma24YWPBׁ;cxͪVfuȊ9yVpOםN;|9$jd-yut6S$~J"9%_bXÔdPA䶸yjB*G`A(Z䍁8-v6 3\fA-׬?JS~uƂKr"u% [lMm-8 % d8M͹-%t,}Dn-o*TSڶ~ h%fdl%J:7~Z]TyYg!`25v:#3;;cYpce E8,\ae:p_0 t+9 4zWzל>&rSF%kƒI%qnJDO4%~y_l=-,}~ ;@S7 4pT[uﱃ=1S cXҔi\Y\?c![/%XLPIVALTo alz:{e%!x͞"Le>Tg8/{}ps\E?/Y9ՐT 頺D &@4VaKdCD fb9Rҍ~eOZ}:̭w7wwJw*.{I! KMWP۴MUarHЎ6TBGj6=n0GM =T/>ۅj;ZIn*wY0}g<y=d\i cLKDkpv\y6Biqچ[j-V/KoSUR[zXjQYnn/[1D{}|nTGOo2d>:yGWhԯ.Us/h~尋GPǹj~皦PcrJ䶝FGSb9*KzjlLW:}$-èA4yڊ p޵پco曠 N˩p96)߽悯~񵳚;Ep$dV|I&3F/cZ#$4`4m+W*}4z6o W\bo!ͭZ'2M} k1 ʟ"FIrkSL^Ud?ِС( !0ThU-|a;S#i=鎲.~73 6;_=͌kt\ųkǿoe;9ߙ#J2.BQYYTo>8QQRыF6Ȯ C%¢%ЏCA=r~}`PPm3`6-ԏIPa$Z5o ʓ1xWA簃^Z/TdȭD8SΪTx |I9BC04aXy#MטC#9-l :3Ir{;S9:lTݬڪܴi~dKqz[5;v-X>2W@ZuDuڃߊ֫kkHi]#Xd~% П'8,pJYxAz֥ a^>o fiPzT^uvU M1')nX'!(w1q N|joY~=dVDOt7NMF9iE-{I zXēӟ8ߍnz~*58ό8z9ҿ+zh _zxy#¨(,ʯz1d{^z>#MҬƲF>!&zi\/~+yx"1r$.Q^_)#z":8'ثtźBɧ'gd) dlbj IDAT ޡiR '1J,]ꭵAZC+}wG핼J%Tlnl*#jgk,9竻fWlfx@3@@qbX&G5鏖bV\! Mܑ{98&AU{M>Jゑm%HS3E{i#>*q_+/醟Uab2ZmY9D*ά pȽjdKH] 'bX\JVZ:" 2 M[vPZoY%K:lٶCBzJ]vȑڹٕ+VsF\,\Fe;75:d8e-T@- !^nץtnQ 97Y# vLr@4]D2J|حo ^ϥ@TB2H#<=в z 4VӝS㹫yHi%O: tuEiQF.nDye%:)uI!`]\ʺ2uq'K(+a$Ma^˶2(z{2ʊ̰ B-<.yRW耸\smQɖ.,YG_A^166Њ -\ A%ZANmZ`LQ[KB9DI' !)$ي4/)-CgShٗ ,H;}׿ңM}y*Fxp:08m^OBǯZzX.#I>V ح 66mYͻ*yv)bPyⴕC+V iu33-8dI&9VDKOޥJ8V)iiv@[0iͧ44e&@R(K_\01CWQ,,wqwSOJ>lmP #/wBqyXOSjsP9V.8ġ㉷& J$ y-㫊^܆nRߦL2D$/,TVJT6%0>)l28O|Sh9u-ZAO.NrI3w*AU.GxtUUQoֽJuN3Kuviuܥ[ff JJcEʚԇ:QrW=1,zz2B~.}kHyTLJvC+m۶5J$Ufp+ktbE#Fu:E>bHGlxO?aPytL$7,μU7L!aoT䲂B ,T +qA WE ϴ|(9|gZ8{Ny/V=8H `䨏,V@_'ͥFxbLjP`Gۇ0AZux}|sNx7& >iN퐡$cnPZ}%yVjfVPwK " I2iћχQLXEFRZD/ '9sؖe?χ^iHY'<$C\3Z=yޠ'bQRo&?dZ'Ӯr c3x.;JH簣ׇ_8Q-8jo 7tss֌EaemIfzC2F49QhM=!ѻ$.. 6vZذaK9т%(xߛT'');ѧYUO! D[ݴpvkA2@˽xNmkM~gWS8Cjlb2y7B(g-gZ4g|@#c^q&eBCPM@1=\̊r5V D}[%>ُZ'p4e'@,gdֲVI}+n+lDIh{8?i课GKm{ueA+J=T]нK_'?]Gpz*XO6+_s;<9_-S_NT6X1rP.GU2 mGvP-uD##gsmQRѣYnę-fg_]D>/Ku\*mNφm9iH1kQ>vDMBc*hM9?)##p|%.ʗ42ʕ75-NzYe].vsca \>5gtB}p4l]i)ڵs<#u87K{]&=DCmv֯8U)O&?ݛv ((d۶Cp$=ōx9))?/vʕ_8-y)t><*u9k!Y!sZNk ѱVD߉oiW4:pʇ(ÉפL5ov- NKU (F1(G`r|$j_ՊAB, H$|6FCirb#Pŗ#PKi^r$ M-blh$l#3aaŽwj Sm ӛ+WVC)k)n/Vz–₞R-kGi{VEqhZC+}bO>[bK*ҟe-?xFofxۯe'xtEe.E 3PLۖpVc$^JU-QSkhdX8QzrV=N 8)xAW'&^)t~,.;0(} ک7~}@>Oߙ)xrVu|N<툺}O_0R},slfTC%g~Ɵ ѫ~uD2"Ӏ:/Mj-XYD]ÉTwғ#mt=QA=M<a0 ]Ir_m7|F]6<-k&N44yFyC4*v' ˷{5k2J'7o+FthgJ0u읤tg #&{fR04'jԒOIΏ8#_V"@/2 ^\ng:dSlq>dɜ(-D/B r_}&xx mד2[з}ӓQyJzo<߯_Q>A1Y~jr|W|]@9C'0Ĝ!"{0av_Eg 蔭F:hc9Czҟ Ԋud7@G2}RZnbrbE bP\s~|(rAH_+ p*ķfSZ _"LA$=5V*ːrtrSo{ ^rdzKsʦW蜪]jsŗ]Z|*LqN9ucdޖ>"at|̖Pj@;tj;s3sZ6cpUCS9p/;/*q1(DOj=Α#Ozz:\xK.; rSD񧙨hkZR5L6޾>gyfyUWYZ8~5δt|kgqFh~t{D$}nopWT飍e˖կ~5\veGK[,@[έS&pO9qG+?o13(Yۙ~XI;z=Z.b 7XJWIqG 3M4 ǩϫ)bvvVG+||,fa4Hg5/Te/F y]>rqacC/ƨmS*di~uΏǝ8绳0dĂr V5,?MsuڴG_׮DXؿx#\NqvjHO [~beq%~+h& CEonuJtHfw_kaNu^`:ia~NVUqQll*Bq&rkċ0U*nY܎ b-i*ϵXKIUlmѱ߾Wԧ>ԉn!L*oxEnSgnKe[Yv$UrmncaExԣcufLkE]w{P-wp\2]â-x><~Xzo~wۄ<1>~9PO IDATHm5o߰'ö>ESW6XJw@ r]Xx.4SK1 Y.To6i[6۞u꾥 ;~'԰QI`%’&buPqp׼嬕l6V|Q JW:G]fgHһ'yL$rZ&|3CѰWIȋ.*ܵn/~8DŽ^ ^22UnEav н|=¿K>qP//x#M(g]]i& ½f,"˘DYOғݯt;Y!uzoS6' /׾/<I\҄{! =3>} # 7,""t|t|d1v/vJݨ{7fK2Aә<45]s5N+۠[FhuryҘEq1t*+tԊN^Y")b9 c,\zHғ CHTqie/O+%_CU='颫X<1 W=10Ҿre}uFZղ;&_p ז;4 F!9GZ3Hyaz̽Tu*I{yҲ/h4GfjC8!Ӈ&GFFCҀzr^qPMҟfTZpU= ozӛX^ o2u ^ziq;(|-M])~G4扩^~?] X5$j A-5aYh)^ֶmV0$"}gG;?-<~; .ỿ{ ]lƊ<ٳ'<9 7o??%-\˃CË^?{<Y";jzrns鲡ӱrbPbXBG1/Z45=ɨUYFBFJq󧈛_cB"2)-C8xlW|+<9Bm @'G2l LuEڸزpE]ϖ͹rLM/NqaZ~&6}F1:%l}ADɟc px:` Jc@=mzO{D`ެ= nm /X,xu3(|ۣԞL̺jMR'%lͱb^LJ]}kuM!'G>\ٟY7ay[)o5yU4x7rs,W|ůگ~~(oߎ Nhs\{c[Ot?S?U~~k?G?59I-)w}wg>'>5~v5ט[nV"9irFfe>OwXe?*wI"~+^/9 e/ +Q-??| g]z 'YzV>_E{oYok >ZF-8|{Ɨf̡ڱc /x v n ?s? *95,@B~J!z~~GbJ*뚗aFS!G[xUVUeHE)0Jhs>Ǖ>UdɎ=~{MR .(Vu2]㱊Ɉʅ%schBl342Ҫ6V015bPU:+G+9\ ,_1WKn%|)X}RڬLuq, NbCz8;"S2یʀ#Ϝ;z8OOE}/8ɈF.M6}{2ԓfAʟi>a _ӬVБ%kc`&+z˿kls|\mo{הcP>gk."~J+1NJKY q4pb>򑏄OUf݂lc9/}K9z/ٟ O{Ӭ?hfxlbz"f)S&1D]iq䠆oo\?AϘu=se_'hWͤw>6Wnw׊8A^/u} ωs"!kB)ndT,-ŚAm ';:~~:|zc-:ޘ)n-aFOssŚ5Z C =MS{CUJӞd=6) kz ,gD|es}@:ϘNW鱁-]Qﻮwm~^=˓_ގlyg~FR3X+Ќ0q{գ~0"K'R(W1͌r /~ocש(*jPx1K\˱Cmx-~ ·n5b˟݂7abJ^>8OJz`Lۿ͆|[c aCNSÅspɺ馛Biڪ>y{FѶ8o9~wj 導9,5W^:: dBrp =G${)͛6yRS_^5ivQ[x_kjJ /dcŌ:択c7' Yg!BSJ%5fm$M0_pT nq nCl0s" )Ԉ\Ų%//f12R=5lқt#rq`hn8+1lڰ N4aHu8d`k]PI7jNRB\,H`wgaV6pL҂9V>!pMM7"{ι6j NfU$+mC\/JH:`joWxғdO$/B'ky_*\wu4%3X N77v|J3~w}wm?$oRW9KOuzr'B5^= f•D Y(kC}jtmQ't%zQKjR13\q3BC^TZ~~/%*8IǤGn,0 ,\|eŀ~Y~ }Ǒ|X.k@i*\ c|( !VPV"9*/QՕ%æxe?fFȏ/~ f~K^R} Q᳙p@Pݱ,k???Jj8e~q˚C+i1S3 9 ,LXZ=DJg?[/? 9QѠB}u'M*kEYd( }{n) oT^x9Vl`0.QOyvyGGQ+tgv GxnnΖOKB KQ}?$@G{mm,s&?GG#?#^9PXyc]p7n*(V[W2!4sxj__L\Vi1YG c6{Ax Oh)(&'r SaveEepp8z 8B-z1rmA: 2<Ѥ=1Ƌ;11Xʹ}w]řc;BceO/2/sҔ nܢ3i8+jPD\ը(iM:S3QXzhLFtJHʡxXVy--[4kÎ[yNO @}ӞZ|DMۅfJmZK_WCRh`M7~#|w|G}Qf;^nݺUe 3UגS] gA-aw}K'IĿd8lFBrQ^zj0ȁkj&ZNsTUQ&ިK:<-|fnpJޖ_pJ~ݞz"if9n^\\_ؓălfsT 8w6Ї{7h+yE]dWԥrI6@,Iu{AlecW''zFުks"9M?ftm? WuDučAdXE*m:fQq}kTV~S׆ϻ|yrڬ0ue˜Mdݑ^Q!G5jgp24/Tԗ|Xާ_N&:6sPP㬳δǁhu|'@8PL!nY/? 4[~MKEc*b&u~qXwr'wfM̖3SU@@4fYB8՟۟A8 eq~#@VJnDG߰b ]_5ɵti;ۃ.AE*\[GF߅&CgE٣q^HrExh38al.CSmG#䈪)ʩ =mӚڵ]9tď+{kI'C'E{>zkл8/媣 S 9HU' =:$=G\|ce`l : zhŐt6dccimT\'-K,.F?)M=!?CgH/ A~ZF+0d\Dor9bFA;f.'b]f$6Ѱwv  &GM[NgS1?5P5.ӱ$T\cSCf2 L+N!:|@SP΁27T<. c * AqhhExWmҟDgI*"zVUֳ񶜾Ehz`_M)[!b?ċ:$!y-cUh:,S? U8~f%M~ \gZFl=a1(ULÎ;~ᢃ~M5#УZ.z_ͥ ;~{ՕL3*'Gꑆ^0%-)3nA,ge U!*̨?Z4ӴNIF Q~bLYVA :9KKPk/b3DU9#6l^!٬҄?8P,.i)>A1IJ]5ہs<-o:G j?1$&j=yaGNOvchsy{VcE  1}þ5R=DӯƉ] ȁbfDcq`G*8G h٭UTpJ2xE/X'-4DžˏS5xj>oW;K%~xXTvHߗM5Tѫ?9rޝ'𴿢~%Im׬ilhi\E`2H,=輙0w_\jZM>9BbI%Z.I' /RI_x]H.4y)>O(˹#vTl,a\..@Ɋz{̖8I@iQۇP<"Onj#H1+a8S*9Jq9t7?rb`8y~+K7Tq=IZˠCѷLޒ߉ߙ>tj$]Uy\^*_a#ySG`D/ x$8e;]I5>qxVyp(y:+M7|}}:̀9Nm7NGH|j!vzWy?b 9MT,'n T' 9c&eȦ+" ty,Zl\SUj3YmӴtNՓsk:*\rUɹ☑&*,J ԴfR+F$ k#ت:*~fčDL!H9p#bE%,%F% D Be^uxsU?S7,ܶⴳk hiV=3S.+Cz^ (k'j%3Km7q}6D91dNRȊ%t'Mz%%91͚Í*d(:[8#|c<ҷ#^^9ZWZU<Ɠ^jF+tb0cFWɮm.#hSp}ՃgU@t]p'Ӌc袗g]{+ On^vo>m۶nM.x]F|z;_#.GO0g9'78W @9ì[flgՕN0;n3F=B=)ǫwq皜SRצr6wڑB IDAT~YGhIݨ?_!'$Ʃ *%*`<|,GVL5Pm\JFjPT[<[FPeIL5%=?CKle8:p_[n*v{w,Źnaڀ" XF.s_06S=ݑu;UT,e>!/d)&'U_T2l@^{idڐ"=89oK'9ɈQ 5CTZ͔a6\ӃtDP fGEח1oX]o4;m''LLcAZ֎ٹ, C!1J;o\ V#E}&HvAv$#锼rq/jH?Կty*)cN#] 91] <5rS~MfFL!lP`j`WU?LG/$755'łڡa`DOdXDi,IZ7'"6yVD8CX&kϘf-WA%gD9aSX{n}G13m}8A ҡׯmtxڎ}QPДpfٜ+qb;Mc3OQD;)aeAtty(e# [̾YKTE;=0jCdnY-'G:.]<#BԿB6A:/I<*#)*yu09){Qy%ې6fvĭ mv Wk[o?cuW#D"g]ʁtA`q, =gPtrJ9MzJ\F cc[n͐H-sR(KDY(LA301rYO΂6Gba&ۈx`cJ 7ّȄ5ȒGa^_~x. ccajdqEi^ĚZ;07`N#9 6>ž8ęB|庬V9;3t~-DE%4PSw›-iw3d\fwH矬hk)tNE8(/ǽl^<}, U Dgq|MSwCKߧ?}bn~-!S>%!#~ 3Ff8yc[G ՠ饃u,'u.IGΛ[6oMJp~CDO>bV + _!'F433}@ˋ.R\8 7!d Ed8`^1ouMQ*BGsʶ2Yi;yӅE}`'>RABgÖGOӰ<+vm5˚lgBYRb@8R ۠V/.qOibdrĵaRצty&fΕQȁE 쇣d8?#fb"1$ˋgƩ #Dubm! L,ƴ\VΪ ,Mj6jÆ1-͗wOI"Mjׄqp_Tp5rT"4ram;zW_ R]kDÁR BcG *J۩mz a*9MTv̝mjr ;j[5==k}P2>z_bS:, Oo~@OT^6pF;^;D0p:&iK 0z3Yʣf9gܩfN9ĵ3烎O% AU.,'H^z/a%GkhpG/ b F@HD.DѬPo:Dt複6$bࣖfD?w`Z aH3oӋuޓ(~!-sx('tAc6~3;`\1 8VD3vu9<AL N=HL`fM1O/%U=vl7 MÕE7eݰ;^8hgi/i[W`^-M{e'\`<:Sr>ѷ_ ' }~duz{rv 6}ޑNNF Hӫn>XLͦr'kãÊ̤B(E JDCˬĸ^219GWd\1UZG В#92L,s>:9BF,QDYFxWy9FecFF)o߾rfߌ -幅bi~9 iD[ UohI3bfppYo.{ƬDi>;8RzQ)aoQ0bJ^\* )u+ОxzWXr|hssh2}:op2!2k, 1HN10iPxNX~DWO,Oẃ"3g|(fT\z:iu؎4/šލy4q4@otעڰL G!A%0 ٧rjbz^ƍb#J3Kp7c30m<2|GX3Ahb,H9c1LO*SpY ^|rxaP,8թ9P߻/LG7IXSTŌFMPZ$1C e=qWIN7*`_z2U5åemӷ_2HRqO)s\W^~釪d+R8gLMP[^+ֆsF/ʪ6@WaQ ~%Uk186lByByiiSEqsLOI%K.L舶6gmlw<ϟ'|s(k+$ؖ[ zgӐG GYקo٦o~9n6h }CnmJrr!tskeq7yЫ[_^ iϒOXOzlq@znCV<9O*4Z! z,="zG*3D`n"J D&ŗ] M.Vq*Pti_AE'FWʀ_BU-'z1״l:Qጋ]]&5cR-kʜ J6~OOۤg"ղ&?H,i9T@p,Dōq9G04%lj∙](6Ƌ,̈64)m_jJ'x;H_ǖΝ4 gE-xt_9NyͪG %+Yb2>8KϯH"PAm:)λXjh~F+PyÑ>= rx~┹ZMJ/=O8~ΆxNkyq# O\ڄC] Ozؑ/ڲ R0| @Do@р;!@*ŢMj#`cX+]c>H7g՗-A@_1p"Hf̶V'T0|e}sM/`5MaeN۩E}M'/q@. W(S^T}[䍅4E ss :G/].JTd$XA2 A飯f".G`;O>%dtof8P`ceg`Q],.Va8Z,,,iTР5Y)IoӟZTvA‰$ rى<  # ąAd6(e! `$f88;H9<~ѫUy nN*GLhfO3?TF]W/_٢5?hw@!^~EP" MLdާӷ_<botaotm{>%5=G2<2beNoU$_;X # sޖHO?>8ە;s܌cҫ\6Vys֜(YɌ@]O: =߯zίzίzίzίzίzίzίzίzίzίzίzίzίzίzίzίOWq O0g9'ǹZg aT+_U`fC>2 D m|' Fa@Y< 5:r D_ 'Zl-AʺTazj8#Lg(Č$y3ȏT6@6V6 ltT0I|Ϧt$Bb`3[Ӣ^_ae@ٯ%# 6NS9]F4(ƠJrp.m!D!\Byx:zW4$0 $a ܮ3>]9l83TQU~qٞP7rScthpbcQ3o+3hEǺfk>2[l➏D5=q}<WUq[NJE[Ȃ/KK Wny}S888[,yAE~),3`FQw[WCΧ \7P55ޕģ pum{@˜(P`#nrA㦏N #BF_rTDҒu_x OҶbb D\"22xK8iwz 4yN/oXf zOrz@Ry`߾b`pXa3gMfùN2^#JG06pu|E|r) g0M7`C4hˊ̒hOQ`c0GWbVVrh&eNoaP3'IN)@XVU7hd){^~l?O/t}U*;Nt:3~pe]rNLF;S1ߺukxC^6{eF~M٥֙m¯sζ/)1n}Y:+ `Uǐvp+.ͥ)6*jlABtBut rTN¢m$g爥6*! J{44K`p>Fq[ljT9\*XY jt%U :TXQ(X4RUDĦ`5 n Pņ9pOmzOESdw΂yC᭬Af,Vtqܫ2VDzO(&+IoCdkOtjg跅f}Իn: +)s<tqK~$^~LSВ^qw8sI[sM(Gu:N )+j#,GrFkFKa%C7XХHKWB7 蝹MP!!y٣(ĠJT=}+"霂]a/T*sشec1p^'rq7n tXԡ^App2ܜ6G)҆Y43<'\9c+kv)q9) NJipQ ]`nWEes j"6ȓeўS^u[pã#?-d,؟HlÄ1ۏ+D?:t/-vߨf[0ixNX>jzN tWO?)cZm}ԖASd%gf=E& 灠LsplYuɆrԙZWc7Vw|-/(f<5y+ g?JTnh˱!oX^Z+eyv N,)J0i&FPKCo @߸p a2 -nRNDm1XŴ+5ר/%,g@EuBSxa|ä^̈r[̊0Sw-^07/+4KQ顕ׂ9UW!YU~TyCc)1 Eh -ƨiU&Qxs15\]Pk=*@BO9;壽)Йvxڷ@n t~ݿ,Gx7iS?À[=U@Bb3sQu^U\SDң>&+Ӓ8R,d=P8Nt8TnOlV`}G60%VYVY8.8SSPze Pmb$@ʁ1& aJbJ,Te*Uhdv%)_RfXcZ+:r:u5 =80Xr7M%Y˵c㚠aCr82Wm/-{w-jTs3rt>KֺY UD=L5.ⳠE- ?0Y9sm:1 MJEQSJU` #U- .ZW3AW{a3,F~;́NTX(Pc3y &tG>};eCG?wʆV#0Su7d<(^r Vr=5*~kGT7>WMA!&!ey߉#F򔧄׼5<.׷-᪫xw~o8|^NՙtfnmJt['BGN[\iqA#הP(ū_䱜'~D h#F2+C\kT$zv3xE:q~Zˋ Tϸ&w0Lʌdϙ1[o(jb8DuQB$#a#_[ӣ7YIسft2LrafiOļ엙y9C|N4#|,Io7}rLE(#Cf7F} rOo{\995eź\gpz/B7)/ih>ϲ}PmQ]E/*t<Wj%?-Ll+\'oqkrvR<ϭݻ7<9i^Ox]QE'c[Iz+=m`.惾lY[F~pTK^.GhU?g_ئ-rdsHॄ_u)nGH7fL]vնlRʰi} /p0xzd~rb,. 0ΑD3 $!*^hѮʪ/!K='z@ޅX^01_KyrTqֳ43 M(*&7DSUʣÍO-9)gbDd/k/2bv%VE O(af+MW+ հј|DOT3z x" Jt n: iUˡ#%YRmLλ­7\βiGԜ#6hh4`Kh‰bKy|V eQT;Ux]ύbY [1.%@'DC3M^Xˋw埅?~·=s=ŵ_!@wŷ>a嗞[y{yUz#Y'?=6vWwWhs ʯޛjvT{N edRD/x\ \D CDx{Q!y"x@ҙN:cwyVU@҃9kWV޵Ukg?[=|sΩַF ?1yLm۶zk^ B}so{AYq,zmyW?N]nu6O#oGw ~']fQ/u_s ,7H駝>8J^64NGa2h]S:i7 A%5VM+}6@+oX>};!G,⦲$P]" LX^60[~)XĿNnby/8;3_\חҮyjKC OR%6zvOdἀA8ǒ qP!-|\%ߒ|8@N@ S]qN\08^w5tv{w_7w_[/\ͿvuV~=ՅW^[C|w_yy}P#OzL}9j>>\yeՇbh¡k=?ԼOW*~uWc='atJ k<\E>wP7 ,RW2FĮo|)|\|ғtE_??1"=oPe…Kzիʽ't+ #HgC˦/aD.SQYvޭqyq{\uqDžA^u1 .~W~%(o~sa,^!;7~77M޿??d낌W]uU|'bi%/ cxFuVOx|@gg9qm"uL+.a2z__aIQ޹PW!-_+2FP8 +O) 7!~ n9&fVcXRî&emAIwf$7o$|깤?x&(L%syL"܊bp\WR%rP%cPg_U@8:L‡9_>rECJ63C7T  6vlnڌOޅ4<ĆPO1J(&\(a%[sOH/O.C9X+]t1\tnrҔXc)Zk|ꌀ;oiP^R (GT?{Q~啗Wrgܟn'DxL ۺz/q2zO)y1?˯Sѧ5?VN=K ^]Wk=T8+_>x/2OnhTd._kL*XSIfOj0_OǦ8&y.[xHHvp9N}Nظ;_9._-rt7@> [KvD<̡M;Sx= ~Ri9,(ܧ"!i7cp>80Mv#zdw5 *"-E,+NǙE]$}„o>%s>gZy+Ċ¾+A'>d%^Q1и) Xq3fO7md@1nU{'$v+ Uc 4Y fix Bbn.z#ZमN unj:JQnV>T~g$~afMu5M~hyuՕW}4$b_U+׎Ƿ8ʷ ȜvY-OtsKǵcwo7QAx>?,N=T΢S˅\Փ0l02 KQÑe)O<1 ' h: IDAT%/|OU~Wt=@y:na PW蕣=yMZ׶1/VfX2+51஼Oe\~+^_jk׮*cH3Mzsi0 /F=)O ;Jt=Ҁgqc|r_`7~2;;8mr/ç=i5Tu|y>cK~v94?59x`ӄҢ(M q(MwlMx,5t)q3HdnBi5L!VҦ5F([2p8φA!@?!Nd r'e$URYչLX_quͷlڲڸiL{k1oH/4{9M/gy2.PZ$Lɧ0bo^c2 DYO^'o'^v iRMJ.Ec!xHѸȥ!zduuq"|9BFt;TyI}ńo$#LoN'=awMA[7rOxgj>py/zø0TW5zxG1LdjB.tqjy˸zx,--i,qU.Y-ah,~Ї>4P1KK .ቪ cnI:^f7_:`s瓾Kzvc r)d|_߇YU<Wߑ˼W+or׽ukC3[F+cJue:.l%kU[y:Wu{xa;ي.# !n=4555}=٫q_;bHjмtz[=O55Kx5Os *aHNXi/&/ :*R5'0z,Ū_bIgPKiUj|cOGؾ? |I~cAYy7 Nn[O} {yKgzԣq>Y;L8FenY²Uc|肯H}%hKOq8@j dXV/T~ oKe%5r̈́A/"~_jb2-+ԭuUx7ٯ`=AA-$/CiCewk r]k|?s7\+--Z+ozݨ, G yMuS-aTO!۾(B4!aBw??Q^i2k`ο  1mb7f 3Fv\J./hWʔ3Y? !E>KD(s2eD<_Z-ߣМp {n;@BuM/~+APϑc,$ēs6RIeF|Gr .(Vy=ڕrddOy tiQ[U'!2A?_|U%7ҋVɴ Iq1H?: î!UU#`lp#Ϊb2CV}C>E8}k#Jc4vE}xvOy_1P=`RxNxc]ƞK%`wËW׏ǶK3O_}iQ`ah8ծ69_;IYyUnSV'>rƍe: q`zx쎭GĻKShrGqMڒ4v`N)]X]umIaI5X:H"aEM{_05Ȧ4D ʩ{%>Ҷp-|H+mi ~p㪫}Ն+.w͎g0v `x~`])<貛D(qoRRo kh#e:SG`4!]Z=>'h<2®w ys(DWr^wVÿ[q*\&$מ=|\~~/+ljp1j}5FٲX_]/.KL֭xt3>@d{5BT|N"% (w>bz-I_짶o :ӫw'nV]?`]*߱~5/O9WD~ >G.m,"M9[%7!A#P{R_N͙RL(fpv&۴8 2@yR qsD6N)o$VdILp&0h2٨ !yb!B^aɐ2>dܞg$BLe~+ru74{fqo7޸qS:JGc"uK%v!ǐxRjK]#wب|ǎrqYEcxylxחR!C]}7J /x#Nf(/?ԕ[U_ryoI;S gPw tc"-ϲ͛\J?^JhRaTSi‘VIhbg~9NDCjv7AEmu6%Pp(Pw&)YVʱ1ӲO+|"ǪGǖK5>V4I:>E4nZx⮧_]4z/R͗kN)^JyA{ߦb+}.`@}u%v `ua2ZqK#C#Ջ5TYJ|G}ļg@86 0HAa%44J1&JbGΊ({ 8 r j;2` !Q: C<:A_$*:FG0F74cu=77]OQ&tavs)< <1Fhpҝ6Jf^cd:Íܠs۫>Mt k:%9TlGk[zA(JۖBʑlHZ.sG?q >_¿Տ~6y'do_~u.'Ճ(nN$iy}GIBohn.ΕcAU=d-זbwh~W}?73(:Z]x]>qCZK}G 9BN{o;LN85iUqoP-$ǰvЪzò<͚N5".m-x gwp=S ī-H91cLR$A (S2\HJaF[ _\4dfxnW6c/,`|mxfZ6083D}nfpR7 2ҜK,N<(v wGG9^A$Y㊾UxEVCx][PǨ ЍnV)1TN;ǃ ŗ#"mYR򲄙~7>='(pЈv)rqiŖjwXSDYx/mpɎ|,dP:NiU5پYj|]wx\*uGAU;pzo^`Ѧ2i`*Ֆd܏B :X\8|x86S\{ݵ='|2nc3z-C3f3Dh /$Eɨ$V|'.^*<xxpXDTQmLQdH"VҍƗۄ:TI9G„ I2wh/S34ROVUn۶oxpe!uz O,e.ɨI y_b%>1Eyrx$"Mj=e_ME.*?fiII$_a8(b{0o=( ??.)93*es n])/a|$ݻw[n*购[}|?( %N?e._~5=c]`見Нeg.aK@[w%?}tsՆzIlv8' bd"=|&l/HRA9Ѻc1(wWxHs&>86.t #)ԑ-Ɠתՠةu1T,uVm}qu^rWo+kNY-Ow]v=Ȋ^_:i6~r|䩡6OLkůM6a /UW_J;gJ|rb( $8~O)ƎkV ɟqH)ں8L=U`H 9a-yJ #GC \[ 64l~4R,& 1ENЯOL:8&{!Kq7l* [ ~^pJBF~wʣ %E߹#BnS>~"< 4[+~;_97V*oLkJ"{{S{ Ck] %u) ؽr Rx XntꋐG _ Wx׻OWDXβ^syog}Ȱ $ .R[l6N IV~-jhvFB(lJV*5˳sѺTȄzI.b3ϖgݛ82a}z@+ 1εlX³m.Z.mQ@+\c1ƈRo\,WxYR*/=U򴮿4ΊV~^b̬c܏=~N}{I |쇏|+GxpHO~iHqnCM@{P.]~S.59oԙDdtac 4#<6e!&$L-N N{˶OT~ʹGV0M,QeK,#t;旆}[M1PjފGӣGFֱS4 f*E"#!JjL^,h9ƱW.~<5jAS}߹6/rdPZ/H=tUo)W0~(P=:oFXQEE_RE}qHƝ0zGGGjЯ*.mAQ(%zA2e38i9[__wltr^1q#s{lQO] CYaTK]A)0V|fOTl U F[oI}4M&f dcj}VО(׹'Fi,!J^@c6a /HҎK?$<[C)$%1\^Y Qn]y+Kh32b{n;H?fbRxS (VjO24^00%zA臏8s3`Y(6~v 4OK 涆P,>8>4se鈬%F%_ m-x^G6]+Rd-F2B)m银ذa:5/aH G e.bh8*`ཎujw2ڱ>~'׽e.P ˹G-cd]|fUbr">͋mY.U ~;ErӴe^y&Lݸ f7P }I}4]2+ԹgߡpbP7E ݛhjE14p,\u:c6Hkɏk}+oɡ4)ǠUgEoK6r!lr;Ȳ^Xfю[D#25ex|]i8uu\?:>TsCq;S߅6K*w*%=rCCYVw^,9}2]*Ј`F!B0# ' PsEkTh;x;RV^4RV'}h87yJ/ԛ-Ɂ44PvL F85bZW#EŗN'bG?m//)8FX3qG=&Cml5Z,AP+ =-t1Gv~҅UQGӹޗ#:v.ѥw Uqu0QL3veM݂HcxBYe ,B+a-4HqJ)2jB1;hY1k ɛze5ٰ;ZApGa2l]-oc΄`T l>ؼ TƠ*@h\]; ;c(w HO\n):[K]SsEЭO}GIy`We ]538O_IFAKؗkl xRd* +[sV/8]|?-q>!ɓ!2! ٶ,H],%#Ț@9FzBpJ|gN o-Sa%_VRZ_Cc[<~S껰[ӥz1q)8ouɽH},jm\3 #¬[G7c?]5Z0[=n8q gRU;ќX?$N䅰w`97LTen^Î/C#nYvmOy"/&X1X{ցM 2~![o޸nL6reU9J+L%yma>A+n@",gaP1XfFMѩ=U{m@x{0@Rv*i0dN#E 7:EėG0i4a,tV %OfO\@kȗQ.D?vy|ᱽj+@ѐ_YUz߾}gN \׃7j%e Swj΢E3^“hƉ֩( @dsIJIsrlD}|;1S-(lҙ/Rp(. J/K LJlKqㄔs{MUv5q ֈ/diǘ)uƞetZ 埱Xq.Ol@6_i,.BPp'o;HӼp=g+/^x<:5*YRO(ݙnTJ`~J}^e`_hue{_||!Ll3t3U^-?(li&Hj6.JP#OYQIQ)o}uaw wʏq\VUk.ЀjɗyK_*Uwp_]%߹DQ^?ޡ߀դ\KaGV靲Bσ(6׼[&< ެƂwR+%{Cw {kh61kD,uؿq,$LBrFS&)4$P0zjH}3eJrE#Rba:,ޏ:q!hAEcԥdĸ􃹄R0;Aa :N > b7Z dǖQ677KbKD{`鈣c G76EC,2Dfzm6e9Uuj-SFmgLó;/`|ki\*fU zĢ<dB%h,EyO.T01(z4YVRtO>׽O(\YתK!03tu 78μVz:1oY9/rݔ~8;?9=-2ڐRe߁M3Ė1$[e-N|dpþo׽d7x0J\!i?i {JR~zYTLYrL.##OᓸͰ/ 88Oq@&IҘ`:!Wx,Uy4 7Xۅ?RTd;JtÉđc8_22 L@3FiIWI\̝XӢNDx2ouxm:d۸H9( YnocSyKM AD,Vþr/4ajkn/CayIي7x ̑4)m)eG-~(HSTU67WG,,ɬE ۬;?1gB[ʽd)&4IѺ;'|GGGca֏85u£z_%+nY_{W oƊ(a%֟V0äKt5 >JQP 2fر};v<Qqw-hZ,7wWL{ =L5Aԃec1SF\HPQzo'c&`wJ pĸVpANF1] pTe> )?XoӚBG&%E U6Xyڑ$ jhZyXj^&$-ެ0x@+H~\jZ{nLzLv-,*0E@Ē0CCa?)bs [/0 *lKRMzG373,Ny^8m MOn󏐤Z8@㡎tE=H5&5aWy'gzn]GIk^:5yothS_(Ew0XWMy$֏Ԋ@A,.]ntaGָ4;ܹ3aeB7~'Elћu3M 3z \ >6OԣCnw!k94\pNCjލFxaT;4t80?GCb^bӆcv3P,(cI{B>JL2 ><< /Jbj`$*CNfS⧶Zȿ(V>&ŜhAxzj̓:2xf5U/(W-KC.t!g/*Gr_hxBdLcߝ43xF@80RClHVF;ijSK'yw`j[eAc>QW0D~9^>z6F GJfe((f͘uAG)_=Wg[W˺wu +^?Viw\WȦ<˺u5J.1Nb|tzxM)mRoUh8 8S3Oa7r 4B](XZINw9~ia~\Ѭx\[|D|mA=E:ˮ rG_)/+kP Xw+7IV|&V>dћ>F 1t&Aq(P ``s?<Ƽmz-7G 1s,&X~x}X*uPU R~0b 6Z?B 'M.qORZ+8n<2hR5p$y] p B^e-`!NꈺX)R_AKϐ`*!_6"N!O/aJŵ1D5HG"ŧki : yZ>U&d'q Eb|o ){FF7 :e%90BaZmՖ-[kfi̓'pB5U1 )'TgzFtTE02Y2<ɵtnV7pu3?}31EfV͢0 e^oNىATr7r\Ca,ń&]M5,W:W&;["A~tc Om֘A41eQIlm«`zxDQx8^1F Fd A4|WML(HR[ڏE>e|WR ǰb3%Y2r. dEwq?}@x4(+d&ɟYhtD{Lg|YQY |!3\H?u?6Jr.1${}ȾOV>$]%ŨR/,5oYSZAOd/|@!9SA.JG Ew ~.B ;e#z?@Q֩_ߡō|Z'ID&s]?|ц< #<۶m[ڿ}uWi8Wz96ʉSV CO0+?߫{o%.Oa?(^`a6VMlk6l6leҟޛ˶fL]@~a@,α! {c V11lY$o+Oq %/ΪO=kwӍ7V,=g> k/yi} mџw0Ko~}ꫯ*UY'< zȏ xj>O{Æ9}^ZsگZ"BSo)^yET?ԖO(Xl۲wՏ؏/L+{|3Tv*tQzT<9 |!umZVDzi??~;ߩGW|ի^Rg{Q׾[S(ȯvuZX8mY殜Zԯ_n.¨.}|/nS 'iӦ+rO_/[ c]"/JS'4Kj%|:p`2 %bo|flPqx3Qb,S,?غ@na`s8lS~Luei:wqTŧ>p4'7M5SJz,n<3VD9K1q% |h ˃6yH1UMl8/@u%1`ҌkV(x{1OQI< H4'n ۙ6A=ʩM9sHv>M`BKtnHr(K t^"$8KI#V:'1I-1罯ƓWΣ0մق|+ R):?W5\]}_n4NaSS?ܚ)׾E/~Q˿D\}M*:ԧ>w?xC-9%/q}FGyOַvUoۋ곟l;=yK/{~gvD+Iz׻j }c.]% ͲT:*uH^?/"lF>2+p὜է?iQzғT]p4Q7]~~z+_.ʯ77ۿ0l7D_nQZ7m2^tEW^E/^kV{~Bz{Sя07[\/Rqm"߽:*pG~{I?Q1?T52e+ekZƨ*.G(IxCvyNA\ⱌyc,qZ̍;<TMOMz̟L1ա0ݞ`8&ٴ 3)Ϫqʙsoۄ1 6sqB5B3.Kt,-TM0xoi<]y趙zjl535WbM-D~ Yz}@uA<sl:`0쟫o4]vd\`Xagt^*x*xlYJdYJIzeW;?ZoO_W]}‹dl]~eNfuU:A%\BPjfWzd^/8 [We: @6l`QzL刉G8͹CІB䤿WixxXěO<hN;es}\:>=1Ch_ʭaViTڵ+6RE#QOuRoeD7%\Iycm:SzӞV}x#e?l޼{W\7P^2t]}k_ za}{Z^뙣[e_qc?R^S^Qީ‰o2a YdE*!vλ%7pOֱ7*dq/`TʚZKu=険ڀ"<P Ku{nn$OU6N|a25]w܎[̌Wݰ=xcfge SMDu|20\#ĜFkƽw‘:- W"sKdEYm\9,Jchh9Gxh |4P>. A=P٠%,8q FO-,? ,pk|QG::BԔ${w^p ~am g'3'믭g/[2ȟwyե/Y@Q! OMpa\5Tx__sνfm@oL_ A5iU+ KW0Ǵ>M2Y+Drj˹9G[ٟYb9KV]p y'ͺ"Ưp<餓:g){ge+G>P˻[PYgvn[4|WR] |_1J ;/0or4m{ϋӞRn۴U*᳌QK0D\6#D =a@9=F/k'y2 *Eay3 R) 4C <`PN!LcUկ^d9j/yYejg~\›DKWI1 /ebضRnWx+SMl:Elyei\W`VUj#7$Ws+wy5mݻ_L/|2{߷0yummy=>x lߺFd=}`bwdsa8o29c~0``T>>A6Pm>~޸cCŧ@覑jdP=!1#}F0|`=@c웎q,m&:'v%2^#7T1==WWx&}3,c6$ܩcjMek1!5b6FLI; +)M1e94M 'rr0|"Ôw)904܊/4Iۍ0W 0- > <_4غs] ˀ͞={jFj)#e}s0jyVs wU|Ἄ3=ysт&l sK1֭|ֳZov-k=,Ï*ٶ3F3(rpLXwNIRdQ;_Na,D}!u9k04nܨs|UM7V4mpq*76wK%B`x=!xT!&kB'n<ޱ1E^q"9@ LI\);y+ ϓ4ܫj|x"9ū@gŹeOSF%5!'63@ ))q)ϰsHt3F.N ݅[OJSq^y@RƜ/eMh&FREQq383_l7|][>֏yCG?5135N-w< Zcms{ߚؘ+_L[)#Ja@0b*s<=*X$vi~ꧼ8t2 2g%1x11ZZ3'=__.h}[^TY=C%+45'Ɠx/t{ȴ* Э?Zս遃9->gms.P1 sKQ9*HSV4>-2Cy6.O8fxrشojz8_T;;)pC}cócƪBʺZdjIumjOF3h=zs6+mwst[~8,lKLhFyH{+Xևacq^KcLSGZ!?D%~J^ƌo'j:jNNa\&-+x6eQ^=q\>4VM]xa-é>eWʾ]K3 1;;bguiƽ'(m;eZ|]`TA .@nY6ua'b(I9 Lp/[UgS8h3ׅ'wsb)57xS۷V;OGgM(`᤭09/z~r=Fxl9M K &eeC.5n& '6@‹@ZE!6bsqxmM<0bJ)NJ=|B2cqqcYztzkU%?cx3m%&&gȢ $=V1?˥LKaP~IiDy!yۤ'Jf莥^~A "|t4ߒKgEDʪHVqjʐ?KYia2(4? , oH뱑Ŏ'>;vK;{rX?Em "2rIO/S4cWm,k<-e(|NO"Ru pv"kp^?=5-kouaB{XՀXZ@.`W+;nB.򵁔<2kؘۛjUuƙgyFҝq5 {ϢfBab̄  =N{{=1N3 Np^сAh[uo !% d9vZ> ' L#졕޹̩1SΐN$"%?_W >02F:Wetys 7{:*K#‰0˺taF]1J"tjV ?{7L6Gdb$~ĵ+.,N^Pq<Q*aLe|"FM9 +'PWC]u E(q5ԭyM9{?d]k'ZOtG]%~ $Pbqtј?OybE $[w3Jrp2JbS޽;~q&Fpv6vaڲiB_ YBk1+0^Km0mKz> c\"xQt)y6y(uu{~}Ҏ{ÊmyzZW {_9Sw k'YPE\\dWkGUk/u v>Ag 7A&ٿfU{ ܝxM7i=v쿤q7׻/𮻘am;7mDݫvb;٢Ub`D"3# E^rblY0H,2tg,R'Oáf"6*[#"ҧ sc.&PUF@s4ҞV< m-B3sp46h$'{y3 #i|jRZ|՟}j:$.p ]xS<H)iu2j@rd@&v(CafN4W+(Yמ[PM>z Cb@փZ& I2Pʥҁ®o}~:y|G!TkPvA!Kܘ\]kfT;G&]"ng#jm~1Ỿ D`C|T} Cf|gV7nv^pȣFL7ܰ14`D 2(ӝq03klڒdDO )nw5;/0f2S_/-8b >$cH 0Sޮ'~n=Nנ9pde܍{?#\@\П`MCCɭԕA//fabfzMc yB: 65 #} 0M^:M:5\NBh,U#ПWDq+Vlb:x$r'N.˘dC9[Xkˎ4PJCJ=EM lVb\٣. {#<#I \YȦԅ&>~k<}Ov.e DtaTZTaH]rlˀ=M=#xl.,nnL<Ɠ+淾U7li0==]m8QviP'bK1[23  ˚/_O}6E%A|B5ffo&|_B쏠pK)\N-\S.Q;A)L0»b_'._G7j$Ty/|/qqfM@gy9^A;+cq^V^`Bc>8@7@z9.xS F و,O'`p9GyLbO%+1cr &c~']w8)צݞtM{0"u !oXm>S(mq||ΛbD8D]=qc&^/4teiP9E\iVb7`9HKm(T;mkiC^{([3־z$YOZ1| 0`4l6 090 AC0fal`fl,Y%Kj9ynU=2ތ22_D~[fDF[z2*qۍ{1`F+0N{?Z:.m2ۘ襅Ac=gRfzi %M3D0٦Z,q~#ȹJ]CmŰ^0C/^dzD-?\S#7}Ư6='}43WȝK9->ᗴZ4J;2x? :$HsNfd-0~D=訛 (x5BxKs;tKw +E" թ'֏{EILB3P;an¢HSxpѐ}*'IqX1w dNEِGƃ55!aK1.Wp|eә [^Zm9d&\ $5#EŖ+2xn1兗˅"Hzz60F}Od WÀҨҐ#3.Q`(j#R|;[zPw|͏h9C(l7KUDױ44 ӢrHI9Fb(O6&kt0ly ycV*0|>xCOui!kNAi 뒞CHdbƓL\?~t074+0sy˞?`liJ.c.*O7.ji,FD` S%2mࣁNO;:SoA+?I =S%(S,g=>ɦ0m獺(*8[ _P< eBp\ zנO bk_̃!0f}; *Miaۖ+$*d4^ xH! w+{VЇ.<,~a޽{73b1v=ĐGϓc Vx3nE Hmﰹ|^ej7 3ڃwH JK-#G: =١VYױӔg ;e¾8P(yC*-qφ~i0K Е%| Ԍ-_X iEe~h*g]Q}:$kn` ?@T;8%nj'EKƯ6A$ݨ#'*g'QJ1uRz+7+`ځۗ * HA`OejN(ļbXgoGdQ%e0h- d^-'OP:OkD"Zmʗ-Y4,XK,GLhW kv[gvwT {gFsVoC0z_r'=+ܓۮ|+ fMQޖE}nGlآ> ʀ22@F`Ѩ:/s~Cm;k1lxd y]w&.<W_}:Su/ B;/SSSӱUe_^clOrvYTm[i'&<g<~'à?^Ma' 6=Ȉndoj<$fd%\@5)f=IDx=&v뵂 8 KW_BK_8ކ~MҮzUU \9u|Ui ^>!6t|I DH$ [Dk"4ik /C$ԬoN&SlFqسފi_IW\Yi>q 8 ^SgJs`2h|*})SǧFXo{h~Jubo"Z=|eE&1 ?|ԎN J̱KN]&ǗV[[x|Άۢ(Yγj6LDʀu>=X:eyWxbn6NOO<.Ɠ c#az/S]b$t}ˮk.b_g3wN-9vT}7way}Í7Q-ab߮)V=ڌ3߃珱6G*W>st38Wj "f3iH/>Uz45 p yub6n4a[a /:Sr&Cm.l43M!xOA%Eh j ?XXD֏X@?Fe ZǥrQ"yDlF{l2kB@a=7ৣ0kjH'BI"j) L2zp*)e(¶`[ϏaBUHv/߶(랼N݉RL݅xm{IHd4\V>plVe6yeɅ~ɵ08^>oʶiX\S/|[՗ee>ǭ˲2_VeY8q̗x9U}YV3Nyܪ,+%^oU_S/|[[ڛл]ޙjn*~>|/d;r:>hڄV g3|eb̬,|wqvk{2gCq W_~>KK<Sbi~2MTc<0Iu={p4nh|[18e6/})ާǢwy۸433LuE bǓ^5lRgجx:PpNCo Z< ?6fi`2rhŔ4ČL{.y٦^\_fݢ6LvU_yի.,J6n|vK]lJ2Ve%N voUYSa?qױ;`C|*TF}NToYڦ9o )e}23ǬMTWQf"w| i5q,L>}cQ"jF+'Iw)U[I84iA#$yim\W?T`G•훙G_d1c.ʇ뷃ۮ5kbр[ٟGZ-==}&/oM3~ מgk0BiQ9t=Wzڽ*=ODa@eY{wizLUL`Ā̴R7տS7̰`GT_qK.R`bT}ԉub*E &a8/pu`*^feJtp=P'0p0"1l&8?Hp3MÜ^1`A6 2{N! PO6w:-8Bfz-#Js,z+ qjI2niZ V2 ,cEW2v:f B1Ֆc]iL|D H;֊kr9s 0r$lbJ,3,GSV@ B'6('ZYY3/~bchEL#O| 6^*hjko9%SY <|2a)#X: IC9"PSuA=40Cbz?`]m'^Yc)֊Y+A&-#Y˂ws,D..e-@e6;3$u?gϳqoyKρuZ~vEYBtⴠ|S*.ΣeP0 /dp/3Ga .-hGL)<#F@*a3셈94{z٩Zyef>;,!MeCWY~+Hw0NP0)nUٳvF'q޺Cw}ީ{w  W/e=kN̰In;u\[vIX5]h &+ħ5+O맘UǏoʻ ޶GC_l0jݫ/O~7Sb-:.(1#J *F"W"򠂜`1e sOSb;5Ft03Tq< X@]K- qv5MMk qhɈ =PP!qEcYk$:x_ Vr7o.9ϫF5p2쥨<LxT;H'4 &DA](-#G8Xlg]j۵(o(IihmW}ˏ .(fhcI (WzLA8)u=P,ì9)ĉy&.*<7ˠ&,q,bĵj4Ј}jٕEW˴-,@m荸Jd[ L΋L^h;6t6{e <\׭z=|O(? `;2E6X*aM DBXK2k)+]E}(M%@͹P5SNz8Y5Nvsuky䋄uϹ=,2_.董>yiB>xA.^WT_qesg'pNzĜOkDd5IT-:'l#>eEzZ?JY"k{l^@%X 38k:DBmxfFvUG,Z kיc?=]'yHj! K^X'2܎1SwxTm[;XCEjml0cDž70_CԊ䭢é}V{>~`ܖ';ڄʶq.d,^? ƀ iwϕ!#*ph̲4cU~Q#ctOJ̩}* ^7d5zV=Nȧb){e )]2=Q([C'*#Ù/rpYyegɦ|++O2, w-Vn`ނahpi(#jA჉As Z^[BR?D A:1xSo qGmEl3K$! 5%]:TϱX ws IDATE{Ҕ['5aلgTxiTИ020Au盈SErZ T@!}̃P5 !>y<*4GL V3έ1I]LsVbZ][]& pOٝnBA!LT$kv',3mJ'O{{74xcOX~3+tA2CjWc7<#/kHCٛ< ,-ND6t0֋~=ugZe:RM2>=)/D;6tKڦ68ˎ" [9bdh+*!֗V ! b+Z&ưs1"XD&lmJwpbvIHXNINHщyzl{tdK&0F奚(ĉg1DЉ\-,N(m]#6Zd<:NCeaG:6J# .֔".he'Q5MjOPjWR5T7 ?sa@Zxb)H}%V ٸ~ SǾ%J*9h^)Lj 5ud 27Khx30|B||_*f Y(#G^{Ӎ__Tyϻ}>x ~V\*5BI0A曍pH >~ ('1/, #$!4ۺ$A 995nM/W{l 8/myƋ3؎.;n䁕χ@]]eA(VY]Qj_.G>ܴ{@Å_Ə S>X1puWj,.MĉzqSkiկhՓD#37ѲȚfr3dxb gFȯ'hSffֳ|NcM@"dG}0Ƙ=d d=knT5WgjuXnsCC~B=}m%IZ|SƌQĀ0ƈ LbPЃ* 5kdetB.Q6"RM0';MCuً"=奔U_Y3}]oKcxk^Ĩ=ڌ?կ~u}!o{BߩAJ=ST^_u_7bXtj} 7rO~J+=/G~~/?4_U_5L#x;jG iwo|__:@f=c('˺/.K:~nŧsG[>oK|'EJ82y/dgņ[l[(ɘ/q|0ɴ U=# pPA=@xrgm0vڨ:0 G ޾{:|ayקNh:d6 bM7} A7.EN 0G3D3_9kBxl4]bLFgƙÀA~x?;sT=tpt5tuS#'G:}t3cy T~]A3257ZCmjn:4T$ 7hx`iو^H5IX`O^Kk)}$a84bT]ߴB͵:QŅAEkzz?kIKh-6 ہA7~ DȤqRqģSl#bqVv,C (֦cGʹL$pxp VƤ^#c YI#jڍ'Y< x1OT哱VJVFSqdzB}zگ}-[֬U7tS|?CwOT>`#m77swn+])ٟ1PW? ٗ ]k_ۼ-oS:}˿ww׿[yGV}v0X;ٸcCYNHY/Él{߯|7]]xWuG:]g?+n臫m~__/o%#۔->Qi`apecLWl?[n5|+eO'>%iBqNN EVE<3||=V 6I9l{NY</O?Yw=xUWɟtk@Ze/>O+:~;qOO?T]r%r[{뿾;=R1oo7[שyӛD'~++#'RȏH CF !?,Hf5ykPQߍMƔ%֕ LP|OSSQнwkzO8ynrjzO/V?>yЍp^?X4_ܷӲ8jcO} 4 Jw)Tas]dAay-Nwqx!{1E{Gr ^tT5_Ǯ)]Fnytc,"ɓX8~Йz8T]{ƓEr_uͷT_йxA529LU:gj|x|jm]1ܓA;cx鑘'w2Wl1nFT% 3Ǩ0 OT|fZb ͋+ Q5Q&$B2ȓQ)PA 5rF# CN#:y36t$/@4:>5!cQۆH*z\90'az[yッǏ}w;X/sIb~777!ǰvv }{_5FWR UЪ}CG?뮫;Gu+gTRFmov5^{mt?BDXk<[K3!iKٔG-D_-J tt>]VVqK<\w7wG{3D8򥇪0m+ܶtձ@_ --e [Ey75_@{ JmOȟw=2̮ K9oe>$۾(/ڛBOZFK82|J.Ⱥ|eAںgw{lK.dgY[o=bC /`W<s߸!<۾#}맫︽W/1bnzi*O5g}s\ˆg;;Zjn ۬ҩ%`8-TK%IkF1bvV{v{Y{lrX?{i@g7qsĮi #wq3VXgwl3"~L .^kzn|S]t=v_zee9F;#y[40֘jSvJ,|N!k8Z=L$xUP/uM?w@րSBN!4¤k'|cr̀SF Խ4TP )&SG[G Ӏ04@Dgx0F*M#rjgpqpwln67)VJ G;P?aSIm*_U]w#|_???b~ kk8 W; ?~Ԟ{Y6liw}7|C?Zҍ74zJ:D vj^="u"e:A{ݛK#7F^Mu;]xzw-^Uo8f`s[}78ݖn+ymM7]Lw2dYv/ vH;@ۿ(לp\g9۞H>ž2ܮVoeY[ 0g9/s]&z4]MT括#Gkե^h /T፻Ӊ6 .repy3@1aY8:oUOji0ևc{o" xixHG, 8W> JyJ $5L*!\F}^2=CC8>[^  '2[Ÿ\JeE߷-)\c/$J͋L F#|dFp %$ ̯y$A>UQd ėD F Il/xuO|ⓆaC@D[wxկjZ-I-K/o9wΎ\u~gjS9 wݭ ۿ[<uPmQwh{L6xj oo8˿T6ޕe QVG?bOյ7~MuK.*buu_Aŗ~ڜ@~@~(^ on>XH_Ck# yc0@򞇼;'&m܅r0[Y ~d,}p;|۹syns22|60K%u-g]ϒ)I6GO^$n !/=`4zTkSMh bݬԷ~V<"31MwO8^_r+_)dy.$-t ίA}`_zu YH>n8FUZʠ&N BqDSEH T֩L /T̚ 3V26}6cPaL y``aha7#KBX͎ lsfX,yEabl88D?l!!$Bx^ !A?,KKcĹClJ j7AIƕ G~j|]H|J$&sHȊ8bbt'|Eֻ)4eә(+"yClOSKJyZznVv/>0%\`{4|3o]P (/fg6>O:9zᅇkXqEz,>~oYMMLY.pu2tI) ^- 4~"4_|EqmMP~'1v] = LSijL-6=pl8D}ɶAMCMSM )@=jp꼙#\ƪ||eJG hJ#J;@UyN^6߈뱟`//c 4o&*C0{eϝfy $ F;\iYВS^GWZqC>y&I3Ft1peX ęo"#p&=M^DxcccM:*ĔSOYlCP|j_IGaB9]vI҇kfu{j.7/ηҼ>!/Ņ0%\Uz@CF#MWNZ mތÿ.՟B9ZMWV_uow贁ė:*YMU隭ZSB?x~:^o^vh m%v?öv/'kE c!6ҶV. Tg*0Ry{J KguHËR2/ShL{Ԯi^$^OjjZiK 7"k =7!'?䉓UW^󈮮Zy/ֵ)>Xs`5O5Ӈ믚 pG kXx_&ί'#ķsM\!8 DY4pe}Y-p@ bA5B8SD#g%xsJ=,2{*6˸:*@&`Afْi0 JrcԴXR 2d擌K LNB`Xh0 r>1MB5h͇%F-i(SKefZ᝱]P;[43Bo(F>vQx¤A}@&8Ue>PGpḋe&^&i9/ IDAT,5FZCH@,h"iu*u8ԛ*?Pa3%j{0iaQu6vD< n}> &=>egç.ID)* |u 0l.!Mɾ5n]w<[T?Ο\෗GS_Z8vDݘ 7n 8M?U|T+ BЭp34|eI^CO XˉVkt}$A4\fީmtBO+ S=f5 Hi=~8ĕx7NBc`к͈$yܘ$DJ'^ds}4MAF '3Z!F [-IℜRA[Op2lY:ZWO> U2U|5$5I <_DYӊ]dRR?hZwGQ{Op "ܦ4l@ tćeγg)p+7j|;!(=8<+gƢ{GXt`Cqg^Ux#h}K0.kv8'E̓;=;z ddrV﾿jcް l/n&k^rei @E9P>,lǝW8ovai~^_i'j_;U,7x\iyFC;cq8⤂`\ 3V`ib@ &EX)BcHh9 2 H+^ԤFH%b2*i;X$CQ"Sh#QP a"FB9`ʉ^jFalC.B(S )CVბbu HFF%A]lxx}VLDCl?,VL ׷, W-DY򯎤9%vE%k 叏zJ"dG1#Yj@'xn@*%7C:+hbK ܤQaBma I=;5 \(k,NR JXtLj?9RO8_|pW`;gq fYȗ,)h ^'ap&byriH=A*mLe_hb2K:>ֆIVrTXc;h&2$^1^D7ы Oh{B?IƆlJJeu">$OQ\JPR`ÏvX t6# e>m*%ij4eeg3:ݣE{O.էVz۪/3RrG+ˢR(k_诸E8ƣ Os~tB<7s5Ce>( '˴Ć61Z_tݞ$k0TzNi.|u%XKM.y3i= o}P=_Fv<|0oc|719;s4 io|-5^&O6_Jq;[jN1wHC0̘yX[b, # ty(/yrN:9 Hܓė~Fꮽl q+ד̓뼇]} w͏ʓ0Obdu{N39# h ( pduA 2=`^2w\8kFE>b% I%nx%1SgFZOP.K^U 0}!sQN{K϶8թ%! 4N9D=w=TNBi\|93N)smj(J1 meT&3Qc-0 hcH~9P=Tp&Bf8e].o@]kNK"ӥkK%Et8effv7CQHwǮQm3Z{1%V\ G!Ϗoe=K[PVk2 -ȳoL0"uY'Xs55Ol/pbS,(wM]#t!r}Oo,s뱎f_:~ǝmFtzN7i:vXx4 ]k޿_(S0 s8Wɮg:~g24&`:ch_+il`1rh}P ,fo_k9e"Q1J2y4(Br;y:a0[&v&p1ШMI)e *Q !D [coI!PF%~&kg1Ơ$IX4"ʒ`kpAr![q ergQA; iHRL S672::yt/zp@`v)fZSWknIxw``/hGZ6\' n \?YĺՈz.7, ަ՝%M12TSӼ7r^!&I1'IgF6rZʜzK^O6J/9u!k+bx#N0" FC [mNO(!#E$ '`k\ФBXRd,e 6AӑU!$iR phl-'<ԧ $Z7:u$ucfX!.~#J+K7v,`))eK)XY/gyN4ȥ<.eh1k/6I?z[l- XEF˘s\ C 50%3Lj17us dK:m;I1;ASrsE?$<%c+|BFbd|@]]ei2ߜ]=z,~3ԼRzΜ9~wwji 5{^W̫kˌ!]|k L4s +AdyY_iu3ʙE<^Qx3Np|;ix['?ofΣ-\WǂdGiKmsi&Jc8'/hᵉv^Z$]WHoh2ik~K0n"Tӛb ޗxcM6~#qWI6hi OCE&&qHR)\? FHR ZxdM;q_yt$Cj?2We2Kh'kxپ>^CW ?q}Z[{:~K\/>FK }znתkSc1Zьl~Lh4Q%aV,qΙx?H5 ԕ/GR9]/_s"W9AGvT B2-6Tp߸N%0@OLeNxF\XNPcYoUiuNxč_xT~L8Cu</?z~q3UǏe0J*1FGS,jv^lZȭ (c(?3NqtY8vZ `)DͲ1 < >XM5N3Rk(fѝOFSZɈϱ>m.BaAWJO~}j FezE!|f^@. 0$PZQ"C.fOhWa}ۓy(v \ "OMo1=o!|H'y[eB@AhSB6)fA,$ zCd<(#kb,:#m.y˴EE+IG);?vi/y> Wҵh)ld y˓E=1.0ʔD5Է!H LmZ&G( Pҽ(OLW90z{cw¸MSzz+ nz gMA|ʈAG-8j7ڤQ| r \ktf=\? Z&&!ڦ3,?͇i:K4h6q}$}reX' },ShJ려!dn_*`.lOj@hoFML zhDeTzM;*aG;EtO^.'/-ay7NگL0?H$XuC-U@|3}r'2a4h^Gio;Gpƙb=5Q>?H7K/u!.FIhL=!5Ieh#iؐNX76ϣ۬,v0&!ۃ4lFiyKжf|Ox~QOK *7|DkZ/Lo0cr$l(Fa !V1pۍapa5Rk$ d *oE5 CfЈ)G12޸cc:8r)O +4F/1I,@4B,QTaDD_AB**]#L'΢G*iFDgg:O[[9 XY5)c3d'k2PMg=)/ID˩5c2$.|'}I Slu 8[ȥ/Hym"c?TiԵq?) hQshCW㹼(brgn o<-|hU48^L}dз點oa@ņn[2v/=P/ TM{L9}l}9S4JQDAvPLO?Y?r#^+kohu^2M<Ǔ_c_ƈȌ'Q¿J4Ƨ'Q"!e t㧆AXF`\ \c}TLِe c˒lgj3naP EL8A&5jmXŖ3a4[D{wwFu7q8wcx{l_ IDATX ( x2}=#wgyZGd}lâP?ҌMЀ2Jjk h{Xd!I'pV :DiJ'ì-BFE'k 0DXt /C?+ӄJ^4M;2>B'=K2ȹF\۟ڋFZ|㾳zxv>* X (TEue6yeð&ח,RuR:S.n,:l66וe;]ӰNJ]Zgeð e\1  0/LK\ψaTS|Ѻ((#3S23eih 0lلπ+-ݻwwr #{V=Z}RU9pЩ5.jr| ÛyPz!$m!!VެgRyqC upOdB4ဎ%Ҍ:!ی/Zf٤ _6A0"tfk$lh\YÂ7 5D_1Kb p-ݐzɈSLx i%xuw O t6sjIFu JyKx:%UEʗW.A? KHxhK .򔙄5f e061U7:cd/vhPW'@[W]Ǎ=UsDb1,x;Yj덎<e_xhTpQ!IWogK7zwk8 ^*3QOAr*mC $ Ý'ngrlLCP<1!ЄӑN@ a KT6iBQBoOh?jG5[ޟeu:J4<851jk(*)c7q7cŴ}ExpHtdʎ. [_b /<0IϾɈϬmd-)qCb1@Z5w#LWgN/ ѥHIZGQpoY"m&tFQzu˼mU!1AHOB8[: =p8ݢ~?i Ծ~vv=O7ytlml#L tC^%\'J1 6HmwX)l]`s7>wWN6ܲBZE^H|4Q@yp?Dz<<``[iU=/Ġd8 CEڍV0XoY7ӝSݳA!_|ZOSmE Đ/`Ua t ADn@ݘ׀"M']gd{kS)x\RXc=#4Ƙn[N8[nbluHޗ-o .$0]XDW"KXz{gl^72Si@c(cp!yiV3va۱7˖0Sd26?'LtvA4i᝖29A׭Y03 C*)  ɩufbfw5A !!j~~i]S .H'HloM׵PdtNvNR q пWv&& O6xb&Zq+a;4fWX,Y4ެFT4[])SNϮu0c ?ɑ)T?~d֩X|/|n!'5d4@nPP&VmYY?Æ>1tn-؝?T6oHq˖exfe%lj[PAli[&-ෂݪl (pSx%sjMFoڊVe'>{$YnwfVuW{DJʢs7«X[cñ?HZ%DkGUW~>߃sUi:Qy.pťw~κγYt{7G,ꡦ6 X鬁C0d|6ȫwɀc:ajÍTX)7ǙsV]{G+f6L,11Y3#,!Ł7g8Ƽ[9[ nJZiel^e4HD`TJW-SQU(p3"n/p4D]2@3e=_>{dVIΎZ?l~Gǫ't^|6n[LJ(TY?'zNUg6ųEd|>;| / s^Ţ|iAYPD=--Lv ŽE;QV*kT.S'AEܨ (.GdXH:$lM8w2a !m6xܤ3vSG۰xЏZ"(Hr'ȁOE)+:T:VneX QvLhd :}JK^F:ZH3RmEUz?]l 3t?HnSyrf{:p?+C1ZNi mW¬vB6|`gY&4lf:Euٜ՛pqLu͓̞Si ]&O]C0 TTՍ`y;nYUp'f o`-Bg6ex缆`n'[tЗ^sV :\U3%=.5I@8&Y:AQ {ls7 Sq =(|בϏ~W?~/~~sxQzG" a\{1@ -S]yxNϟ>q4pxe $R9S$S9G&=H3h>,k3ߞ d l}u ݓ;J cqR2 G7- ^[H9F:}0pOi 酫^w勫{h6rqޔ`ɪuú͔S|Qm:I /9Ki2|r*@+cUnJƏ'KoVWx|=79;r L'ř')OMu1N62f8> X 'أju’%kޟhm 6O=hy2㠊ά#q3Dn;O Kxo!B6j4SUO”gzF9wh?+󸗽i{/e:7:*W05H U!ގ٧<фqR3sy,y*釓`b=PQ=zkZBUļ=mrRj?=]~,W`2{x4Mq*SPrj<ʩ]QYn:1'UpF F7a/'loAym;{vL '}Ü u"2iiZBv\0l8a.wyȧppW&AQ}<.z. N^?b3}; :PP=E e$ ' Gv7>O~O&a``0`F#Ĭ eSSfVO1K ؉ g]=lA7iQ6C Ptb}g#n?:K=_lpXX1Jv>A +333`f-V婼p/B^\t\+NY4ɲ8-+!3&Mp,K|PN6j3c%2~YZcG3VG8Uf(Zڤ𗭋2r-* àir&v&z9U3\_ G8N傦qlj|sVލn/;QB/0凓Z>9kxoc;C&> E^1lrso@o-`l7E+}<`?ߡ^?ܢ,?ݻwNx}ϸqՈayӆP2:Q7K33 gW%_}} =)z0˕B=:zGY, z{`U2Zfp*BG=yyۿ7W?ycv_C3 7,JJ >NE}97fΞ熧qmlC W4ʶ"26;'Hު8h2 yڦYrK5D91h8.]rݡcmPtMox @8rm:o1{@ґ*ǘ Gjs(@KZKB3(4ż"kt_Bю4aOt7_ ȟYOaIГ???)M Z߳R#;/Vt #͕>} i=jY֜S©3|P]_u(9{/8/Fo:?\Jr78c8`;Gٟ3,= say! I7֊@5|-0f_ N )79cƬoM>lΟG:JDYtIG֒ShD`OqO9 Nt tR~]/ F˯43.jyabqՆM_\|㋰Jq 1O;8 Ύ2O`c~ܱ)q8Pg <^};%ܙ+g2:bfi}+dO -ڷ3Vq֗ G*S#/@|-i"4BNlj9*W.?ڠyqԡq }m0Ie^Gt5~[~6jpmw_^`ܗYp#5"׹i Q ,/x΋̘9P]P@ѧqD/'>랂AY)OlcƱ/߻?O??\Tq2^%I.># V3Oq[K~q<0wu_lV32!QCdS_ʄ\"/D ˇ CӇP7wa&u8I#\IPhKI(4*0AҲd;&f0TiTJq-2k< I\'YXN8~UHDZղZQygLrFӍin;,ӛďًh8DLt8uGl:J9+XhSX[p>xgpxΙ:?4LWo5J|?.^tL +@o|ͬټ%CQ:R)c1('7Psε/A*>iG8.aU _.շOk\?/56A3CyAzqU2G'RO(?uY yȱӧ G%nTwY%#fnfY7Ȼ2|?>>z9J͑ (Xel귾-[/{BegP8eBė,2(ShPz\@vsf@u},qu A IDAT#fc 4d)6FrXf 4\uU(fJY uN);׈7NWE=5󔜺@L!{ir땏~BQPH狉YFcKgę*O8::/C`?3Hvf҆#^T쁬t%mpnv乤ղ`pޱ_q\||J5XZ:Q("2zB(g3JsW܊U9'ηK^ \/ql$6BM;6%$vzڡGhÕL:,Ix`#Qa.(ҹ(-:1LGjƐJ䫿3HOe)Q:v]RtUo/woYKK::򜜯YG?v1b@83occHquٗ+?@)e!bsGIZ8B gω|0w{( [T^MHܴh RQm0rR&Pc$]Kۆ9~V;͋,sK^؁aO궉IL W'o(27nj{|99u,X;ⅿ(9ds}`ϹgT]Lfs̉鞪N!l K/٥!\>s Ωl[;cpz`eoPG'o(:jCÂ[{ָ"Lm}[:?`M-q7K~U#?9P>-H9fXЗ%̓ |$?{ 3 J AtA:uSu+6O'rNqy\0CNPC>V#{ 8yu-(6gSgilP'e dE\H,b9skG3 ޤp՘c!՝w"O)ţ.<K~A(I ;cYh,.;l鷰on[Ȏ@8O%"?Z m1+t嘂;x+KOqqS1NI ?a!q4!zrV5+vL3N78) kK3j#CzlKU=2^>ԾFz)=nhB;ʌff*}q OGttz.%t.Yp/F[ɛ^Ma&;ɳfgl=Q}RKtn(>iߡl|9Xq~YGlL-K_=< O7,Y`ql2Rw`$'FnGH=M1.Q@s9᜸eF |jk~8i+)0%?2Frk9hC\@tť)@',ʸ &;ss94P2~w,¸,[FO iQ tkֵ2f /,|f;_Y:iY(a;d+ ${&3U:@(Ɵ^qFZ Ƹ3Oُ$«/?&ˊ\]ei|uqMfX6yq >Nmx1/mT'369󒧦|_*s}?đOùɡ"婐I[;<)tBS10(UE4tN jd3 !Dgxq+ޚነRBė$^G/jìyfxÄ'.|"3@e*?ݖG2fk/댷َ h'&ZK;8D$/'W)eӽ-g ]>%yr93RR]߻ēR~#af`ZλÙ--G Conu5/~U8Hf7ߙʳ/2 + 6j(e8k!wߓW{DU!hB+2un8@m=DBFw3'ה\q8א0\@ 3(W_WX哽EBZͯYU4QX[A7-Uh/]w܋e=H maD Hu*W6l;q3}H_IFܑ3\Znr h;H@5Qü0a3naWY<#Y!?nvO~3}Loa;L.9ϧr@a;a?_bNWorݺ1N$r\AC}z>8Olf6[1: C Q'JD{չ5`P.q<GCvW{ l/}ho^>v?+p׭ĥN s^lJ/Y!$QF `;:)KœypëoT%8T@+s͋>ysx\mr-~c=m>ü*%:7 go>7o_6e&7{ˤ/IS՘A%#3[9 bT7dHʯSX܄, d;.RNwjm x$َ(6GO&آ脔6igD`#|ƫg) nv㦮.o? $cb؄txq`Fr/* /|5WwY_⹇\<}؂D^  ;,1dO+%:nxnW|I_mU֝zd;q˰(@q&.Ў|q)S}p^, OYimQӬ'O!!l(AFzF\sL/DzN1uUZd` Ć\N1 "w/]k^+TV=W{Me6i+_ ?ZKʁ236̗!yȀ-8/KAtJaߑ,$g;U$4%=5YS`P?8Mfpn{~'q8{qq(s^e_>fË|9&.s8OOyB5#uJ[D8Onu6R HU]*WzqT4lp jgR'YBۼ !j8 i{m5NA9 3ӫoUC?n\;혚rXNY?_'=e$ N]!"B;$ FqHGu*6pTavI#t"au9З;'No_3t$iZJu+gp35+QT=Œ;RZ3JDqS.8lR犐M?я/s3KOA5W t ZW'sb4xyb=Jqnt2G{w}JOԱY'((8{5A<=G a{8u̎ (U!;\ŦPPD-(Ky;oP)=u8Eֶ6ۼPHiБW){ S9~7բ.2^V(ŤKo Ob('4Wqbә"oP~F%tTӒ*I7?XH +ջC@Z.ڳPL/-gH([~@KmNf)0yasqBo0;ߢg^~0}ot4LgBKoXXLk١Cg:#)2vhtZ3)#Nr{C{Ł^x29g◾q xF5o_‹ 3.#>g^x@>(h{3fXOcjF /F#kCq 0Ke`̓ u1 8Y<}Xf&Od>-Bd'D Nm`Gŷ&+]`y5.ѿ H֛MիQ!Q *<_D:8ɫjdtT,Rn س_ 7.Q(,pߡutwzPRA[ƺ'n9 o>YѬNE^pe6@ߡ|hOfo٪~|fc|]7Ո2Pq;Kہ2^h=%N\*#сGȤ3>B?9yī[Q\Ҷ#.^2 x07lǀ\s8ˠ}m|#K}9lfhͻ<ʃ\898{֪N'K) _dӨ~b$šKeiYp]6qpS|-y]D4N@[u0/DJH9jK,5ɿB QR~8Du^bs{Am[Gb؇ta'6ac?ChKL-n(lod'WDgԋVo9_~p B^v#Ѐs?~vC' "8q lrunR\f悒St$zYгi[GF)䫖k,᱑bP)kk+9_L37U3ڱ]+`huJgG^Ƒ8T0'={>qlw0 $G,.1rlFCAP$cz+0BuWCdʒ%?|?lm.qaP"X0!;E D1'^( Bpw7p?-*rI瞲#/m^R` o'c|RKy% Ab[bPi=[&ttg?x/>-˩M.loPeճup:=>YGrrJAy{iELo<)'ԩץf8hG:Mv.!kc T#iEUx'«;%]rσbI/r.oߺ{Wt:~yeVFE#rp_|\ {Pɓw2\]<;_扼<,^W|T(c d@tGuҥt}|$5.׼Qy cұf781ʨ|M[tHz,^>Uz^rނ﵋)qBTm+9 ۰K8'%ךYor^{*Ă>mp߷#6Lt,(_(\O QEBkf&^O'hWCQ|r_.*x/O5`\h6<,Bx6׆ K\8B5]_.ځ^#wh?^ro}3ڈgn?1?-}o7 EEі|fo -Bw\K QGw:8:p Js2,;Kk&kMADx8:9 v,݈xr#9{Iݸy+k܀Ԇw }:Jj13%AQyk\\$/33@DL8ߓ)JN22T8KT6/(c,D$M/7Χ$ ͥ zw"Căd L:N},:Uaܿ0JM4)A)(E afxEgo@C [\OlU_?㉽3}ù_@5B3 KjH EFeM(5>|L7w}xœNr/>𣋛9 wر_f蘙*Iӯ3wwxNg}nve dր_:m < *]aw=c }V>"5ˉYBS~~+G~#hc^f|xؕ&'wz-7mڒj@܎L)29B2 :¡CS>F.Hp4:UF}tq,3}@IzqdT_WN78-Oo#Y,<1I!W%VctX6QHcBZ^qÉZ΀Xݹ+g eS|NM[7>}O坊tIȽT| ݁Z;?*,9zU-:0 FKUB%;UcM7&4#K`1ϟ|1OcLFQ'=?t&]x~0ƴ&K9L/m*-~R[F8,̈́ϼ8ǡVg N:IqEULu]+ͳ aQ1_~N8mg^>0)C{zͶ.6pb | np nty3JzYFX/%M̰9>P^@٩ x3aJ,o;B6mg± Cy1+oݻOMDpdgYOGg8uy1G=}߲'ƙ%y$ /w fW8f7B/m;yק9{8h9 S^颙Sv%Fu8>cpM1I~eb6JG 8ٸw$fc'>ar "A2$:ZNylXl|ªGđ1^x}!N@];kߠzإ֤isX"OfGx2vCs]|xBY9^jOAoCI|9= q)TSY4f/A&g0a78"#!p7nu/{7o-O7k:%/,mwY N8RaZ%77]*tˍ84_ccxk[?O_\qā/&vM~9C쓺62Ų߶*7nr"99$|qdjI€lowS V'e2~opԇ͜}P=ǛU bj2Ew#F/h5fr 3ǻ(٧/آBɩq#AdY43'/>|Tp~U}uo =\ڇ9f.SzS)ڋSlM)?,mFYk[NSg,`0ɌA0CS@ߡ'"}V?}/x$N>\΅ϾdB/pR ٝ]ÁpH=GлA'ƧfYD2\^3@:P8yqyߘs#kY.{(5#rˢKwyˣ7e6(|l@煷>:gnpBx ݵCsrc/RԝYK|,suć zڹe%)/D}gIzJ/ x A`ʻqbBA#ezђ/}BSԞ|sYIҁ-`R$gfa.m ȏE鵉&K[s"ڌN;b9$)2g)C*xK@j >fN&ްE (k0@N:*.2KGlW^[S(R{ÖVʗoML׌R pΒ3J %f$(>Z.:[`ƣV2^56e u^06H!BL#?<):p _6,S; We6Wơ?{us=pĥN $_:18f2`3ӫp;/t!qÇ)tb\RsV({\qyU-g?{=_rAz|Rf#x%o,ݼeß@t1p ׏xCC{=Ӽ|֙z);6NnqK[>;óAPxDs{O[KB[V;GH {d@xy %Ky)<AJbיҖ;!X ʔXb+3i8c.[pk*̄+X_[h3!觐OM?̫WH:biDOUkI}HPD)_l:fFFv=nPm!yHI=Q+Afl8v:0G㲞Beq8`G>:Tȭ~_f~:m;i6O*n@:6^ݼ틕S6MaeG|7LCۙ#!~*xW7U'/H4‚=$@ĩ2V"]Y~)ͳ@ɫrTm\ɧV{Uqø&\^u~{ݣ`0[_&Ys\Io&nq:!Tл_Nlvg~z6>EN`,zoFf,rfWWn 3]v NÁ7_W6c6uxɎ2Nj9U:^`^|(-NfI0k^͢:$FexD qO+O '7gF#k )ӕ8{9sjғ+#ԡ-[A!l;<5m^|5Pr37VoGqC,н 4}%^]8e7dzReubR"^!Q**Ibf4gSyͬptS]飆Bٗ8R%Bp{&6R~{2ο}i *r|D~發@Pү>U~g8&j"QFHވ{[a3̬}~x9^FF3su"N>OCOǶY&~=. q0";gl^|x{s{G:su16,!L`Ǭn:}bsn_mdGU>L,0e2-tӽJ>]laee7k)%E"5;Z+B-˞DV6;ಔFgn24ZEwy %;D Cc/y#1XQc6p:Dtb'QiYIm#K &nK9Oy@mt$cb%%߭ :*`0 7ΦmaYا:E٫t ~D^=c믱7Aɣ]3CaJ MQadJMS~Aئ趥,[㊣-쯔AY&sZH<3g؁`=ϯs;|'oG*}ff!tBW=w8т&<&)['$ 9;aGj^4gsܞWpA?gC=/;rŇ~upbf>>uQ&Km7q`n2d9؈M7-E Vj[o~ȉ~\<=R<;jٌ'xNٚ3"Z^WtD`BNV10.qN_Hb3gRl6σ6);sk}tz¯B1+psمi#MWm2[bW}B0G)_=íď $m8 EM7ͥPsjGxɟXΪ k/EPMb]mqEنGkљW,Rg)U.6O8?>^,qvٲ]uzj]$]gg;CU%m)8G8@Vy<nK_v Kyti-_%hK 8Wĉ&t?;ߒgǹU޹'qD+7ۈad118DuiRXsij87~;3PvwwӸDz|Sx,9o)Nf_19 מ!,UrzK_Z}kɳSf\*A9?f_4p8cQy[/2JUy9>ag^ߎ T$S_0hrh69}O[dap$b:e|5%2Yp`7!U1wl\+m |H\'.{Z >C5"R$Bx;ߴo9EwdZs }NQgx3,ec(rQgY5<@Ar)I,H.X}qLs|88^yxwzw#"NCP҄UIq5̍M<8x# | ~ Ӣv6_giCci]-;Xba)F9-#(rJKZ {I rvn܋ڧ䒰\qREGBfb}JKE~m < iP73D؟1sIZH3v5}O^ddi%$#ebz`V'HZT'=hwf\I?(fy_c9Q6ibgALY _GK}7ph(+Ni|ΦǏYa HV0gbJ㹿$;щa:S-g&|ಝn߻Am!XhY12"liFݺ\Ju8#3%݈,@/ray,N\[۪(iaK\s2MiѺ"Pk<aQ^ٰJXڈb[+,w[)\%?dUG^ݹn6\F(vYlC`^KpOEݽ,=|?F0fi[dތH<{)z 48R!znN3Q8LrdFY,z@0Ns>YFā:׿ƲgcV^qW081Ete溷ju<^_ ]x`!,tB4q8N 4IK3j@`bјMK8F{}ODppC;裑236c<̖lS 3=b%WB 6HbI|EMIjbGN]0+ŋ<%<#ۛN%.,&NL l8!l/8M~${n1oql~GIgso(сVoj 31 U墪uXv\,kk)C ɲS qȌ1՜;v..pxL8,3a}YiC+p'E'"k,.7: RlM_?wUg`CkTOmiS~~|aW՟+@5þ83Tgi.%oq Ǿg2[oL,_f8Z,]g?L(>X01cy뭷.o(l}t{{Gƙ0HF_8Ql![/7,steǏaنeqq@@k0!81(9PaGgb,&=h:9% G%dLB`ɝ:Wo7iIA`ƌ桚reKRNd4=tK b%peucTax-ݘeUths̸85g+ b8Fl:lqD2m̨$ȅ'3I@-IO3"7dk,88gvO_NPV/iK/EGN~ MjTD~AR*p7=ٕO:x\# $32`n7}=O{L; DMqD%>)H/W,&5e6P8Io>{!}PmW" Ӷ+.dǙᨃt{m'kPcBgn#G/u#9諤[x^TLKpk\^cfFיdf%8;'TZ~3Kercnr'˅e\{z>\1eiV7f1Q'O.@z뭷_{+=6g@,ɾ{sr'DE S,Ցc1qw`qU˟5 |.X2d=7g6KAE~ 8)Sx4P 0R/x B{* o(pSd>U>^:JM[WI/uܾk9Kiqf힎<PNSGY*UF4 1V`%3Ѱd]~7m{ e^5yi[53BhU[Yd/MXf:l7 :V(DHԡx7r+z63è0QJ&!ݜE%>gHKkǡ>md?KK%/9PX9ͣعQ(+ӻd|J}}_J9^^L3 IDATcx]:7_ebw?~=Y9t}y=:!b pYv8LO'lB`M򥭼-У|2aKufڮ︟)C_HQYyXS8Curƃo;lb$?աZ`gO:IrF}:8O٫3K,mncJFq||缿SUfo>(fC9`wna'U^{po]O>&:lRߺ >)4: ܆1L,a1/lWt-#8}b7鈓nS|W*lC %SYD_?Ur:w\ܦ7Q#"'zJ)ΞBUmpEFd@~i9~ƽ2'6WfxÖ~dDMR|; qgz9"hO`VD--GG] B@y2S>'\{2GM|;G>%`̔̿]ϲ“zGpl^,ܴcԣTI,/|Fx!t_e~4C?c_Ftݎ2%-ٔpaK\S AW)qǁu)@ܥ<(PñOڙW>IL,`OA@Vo 7s~_#Oѹ ` ckI)J/@Ĺr`k_[7{9 2gNᘽ4&ԯ Xt~ǧk*ESܜ?yͣy, g g8mS̐_A0ll/0-ع34)5}ZNwu&$*~?e!KwN:1^ ib3ЋnS:zuR29q+l@~ߖg3U$!o—3 [TFgXd5\G$[qX'7̼t']R-*Dzo4QywyJeQM^уASOOvС:)V-~&)K;$wB^$e 򇜙>j_z Me_8&,vt9/6nmN$&0/QU[̯@IRQe꥖t=uC(t5.G|*H9CUeu0m~$L OkaȞĿ7xx7Oµ W9P2'$@n䤈টix7Ӊ5.DQ<& ]?ftjCO-&vU;tut>;[O/ٿwyN dt(Ycj 3U)X86 LΛw֯hw!q@ݰ=V(#!6? 2|nUcdم+'I/Ni+gg=2R'^/hI.aZyb@'?Z7pk;J)%0L%)uB~3}؜6½ vߵ~ shTg|k>lN~"姟 Za_{,*̙Tmt4 (eo2aw+0f@@T+QGIGƏ|D* A߼Kר1[!?3A`X~u.y3{T0POei ,7ʸKS^g ^Evש YzO!yMuzGWr |BֵӂC7p7o?wh?q/ޟ{ܿS}k<^8S|8 d35Si?r؂ Stkf6AC剼_0Y#oò93cN<7_0Ŷ3TGfW\O>ǜR1gO_X1DT`eV"; , @=+KGTȄA‘ ͟r?+=|k련Oi@:'Ia2/(y(,tGq B#<^q@Y&3(aܧ9u!_yTzЙO OD+eZRn W? Of.l]vsTyJ?E->`˼`\!+ kgԂ rla̬Q7<'>f R$ \HR1Uu||Dfθ!3Qj<]6tBtn>}롖8-4hOӾЍ툙#s6i?xK^B 8<n;3.I[M>e@1ˣ\ڭg얥f.ϼ.[Kp1COt0STębF2EW%hC9I-3Nbeʼnf/+./O<-cIGt3 ȏBnʟwsA췴uFʽ^k 79P-|x&3h(9 #^'ft8]>.+ww/<) jyoY2,%;86alz+^狆7d__?"O9+bV7S_ДڙF:LRz9k̸x㐰ß\PAc镹),F0-= ,.y%PJ)LN:kfvepGE)#o>M!g{~=ɿ}v fB!tuN% 5rfjhrւF䅾S3{ޓ/);4ogqN-!Xp^J#,|ȸetxdw/gx0t> sۿY3)oACtWFQ|HECs|KE[Y^:/~. ,\b\ꂖP GW!`G^trg8Kπ?gAd/|M^ֿXs߽àw&[#||u,ӑ"PUˤVΑ3>8448(g:QN7G|[]ʌ.ꄮKCML휕h=a/|E033S~uT'yqRx}c}1~;yC L[gن`φGƁ&pi-B,NKkt =×<"M/}f~!M߿4^>^Z 7;P"t:Eфe'_   :R#use3su>~b9#$3Hse3 8Q\nZ xhac'?G7&ΈHH}#O?ϓ{ p8΀%ޛjdu~~}ʭ̬knh7h{d6ٖb,H`A lY0eff 馫z2kͭr\{DνﻙYUYDT}/8Dsc牸qjFV uSL&(IɧT:b*V Ȟ*e}dyz}Y=-y,ZMf&[7mhWk<}JmG&ۻOroΟ;}:V)&EtҤ8jN3*F2!!72X]pN'Y1&|tW{ ɧ1ԏ #YL~ CD7ZW37v0#qĩȔjX-$0<5~ѹg/u@r$-&]16D:=?2d6m*jdiWRVkAg&g%7~gdidNK7<ʉkxT;Z&zC(|1$^|deCL<Q^zUگ+??}lk?;<=7B00T&iV.;"^ F,;u^8 gr38p`IJ\~+l>;in5{S oqȩnGKߛ 7v1w搖8`>uk_΋zyVQ,-$h`I܊ڂvA Sfۡ&tf#EP\:!} D53m=M )R֚M[}NFol޴QmؤVΞn4c˧'lnFEŗ^h5-CNz'Q7lgJ+ALLkO?f}@(&i"D$CI$j^,<2D=rʓ]Z` dǵѤ ?x:"#V@dhƓYF|gqRĆw@Eu&̟ ,uUfғ۠a|O6o' cN'.Iu-uP7NǮMܓ>IrPOfKt<il4e.7v$CyvzA*SŠvQEOW1~ڑ0 (*4좰O%?+x9$S%/6i3;i9ؒ ܚptrh-=p;FZSO=5o|c~}CcM0b D1!:UܲOIƀ/ym_8ٳwqyEѣO<~ڀ~Dy:͑65@֦ m=X|c7`Go*8,q=,e+Yr^Jfd[Z֭U~(z>ivc+/>?9;7ܤmoX}bgq̳϶/ba`Tmu T,ayduT:{^&gy=i}^yV姶.M-#8K^漞G>x~H&7[+[0ӗ7ET,A/+Rc%?x[2`E+ofE};ɊHgC갢|^oo$ < a}ه:.=W(︵s5fC?n۲ `~\=8Uoܵs" t`rjڲqd& gɃXXo5Z~E˃浡{Y~]m&[6Mַu,:y82+mx'O9#'166{O{wHfhS[>L>1ƍl6EXThHY2)- \Y2pT }1 b2w*Xg١q\x\[M^)iX4pYΩ.>{Mq=K^Q4[jT3+@6$ *(}{2&KKڻ$GBtF,Hz˳ALG.%OO)Wp]FЄSUR/*|wo~= {\U.㳠siX`iVel!~:*`*'Ҽ4oK^Bx7=d)UklfL^`ϽW)NKYS3GoywP[HN&f&%]sp4 'OՉ%-ʴ7$/{Q  ^'k^$gAV7YN%6YHxg~`{3 t+0Ol *Ӑ8 QrGgmrVY2"~| "@>{ݻԺvzqf;Oҽt[MLU/weΜ>IݚTJ%Qɞ{[X/p3l;g'` #2N@VvRiA?QKV -mS-YbS*(<.<iK,] cQ?⮽| t>щ- Di=W{0I,SՋ7[oLb;yyh@ T tVu2z* e)&iI} K(!"$ӐFtO=}zj?,Bm?{Yz%v4iVP *yWAa^a2'޸`.XK|G|beN:q99J;xYivlU'k361?k-=^&MV', G, ucG׵괼>$#GؙVxtvr[״wyLi9Oy%=M\R~mC_7T+M-A'DwRzM2% j?Te떉6[l>'ࡃd/qyɽ~1Ryn؄~&FKu;HFfo | sK=LR(rEF/tFyaٖyS0!WN Y4#.-yOԑ{D?d3d¼)9W"=<^c9ޕLA`=aO/ *j 0c'pJ#K0VRyd}C(rBN!!\/L$MMI#8Csr:K: *iHoUAy޽,zCNeXya3߲6\#ؿc"Mv>uDA)4K}Fu1կ>oen׮tx44zSph԰KK]Ũs\Ge8J68׼N^#gYjLhfNKt뵄FoUkDo@i45,, ל2MdǠ ^f,d㴼*F2ňg2A{؆m[˴&:RI׎x$.1)wCsA@a޽wOvlߎ~[z @CF:s,G%4ثD*4@?1庑&d=쭺|oXN'Y}Vz!`OIѩຸoL9!c^8Czi1#ާ*_k= /ϰYL{YqR+W$w[^e&xzWvl2 9=s(Ce7lILy+eP!11e`0'$4?a΋ T~O5dC,oělu@޺;|Sͳċ֟WCg(A:! J!i<}9</pM V?&$N HVgH `oF(d|I@V/u6wkC7{X3@D{~&Ni_y!Sأ&xx @4n#, @(p:TS07D.*Dl$"h TΥb*i )trălhO|3qyäviuHc/ x(GW>W]c:5xxfdzt>Q[di/O[>]'QY@' cE.+-{8q$./ _tϏ2ŚQs<S Y~ VxNsmDxP0ޔLl\d"93ש59<;bdpIP7Ģ~WbV~/TyHqm?C#}?ϭ88~V/S=LQT4*v2qu*q{0i?H"@`2ʶs 4PKKicɼPҷ|9cL)'n2Ћ _i%=<9ʣȣ'k{|U+k~7YWıs"cN7e)\AxUK:B<N2@2g;Q/GK~Q9'@qv$0Բ2~c&8xli}5XP>^Ltǎ7y8ۭ7lԁe;LJQ/S{]w4|<ZꙜ8yŽ`s@&VyU@ϟS'OYs)yMz&yyxse--oiùx9(=%7cY=RQ* s>)t)@ڭhlL`+ Kd)iBz$džqxXB A 5Dy )4UG@ #r XirJuh4G7yX _2f1óBWN}f~7i<խN;I8 +BP\nIg-Q9$Uȼky\ ygɏ<"KzZ! Ŗtp;,LK3ҟ@O:0xr>zg^Bwп-4! IW`e6`geI9xaiMy]kbL`9ިRI̢]F@@mBg6Ƀ"WLVtF-{7L[|]gYut_e{b9kLP˿_}~vOVHJx_fc;'`;發ޫ]gI@Ȗh6=;7N~`iuҜXf_n3I(X0?'/KyP:| >N'<0C4u0ZjMbR8@Mzo7㴇G4oܱGyyS:IKso3&JJFV/0/OԨ]Ev9#iC'Z%-I+{+@k~rg@m>bئGes>$ne<)x$'eA6s4\֤Jݭ,Iz^oiRm҆etC3kd2}Ov:˃[HFiu _I~s#: `OڱZ%oӖut&y'i^';¼;  P'uFg|\Ξ7Ԓ<~jd*^x `@d>Yҋ/idK5R>G/plx.[-esD<:X4XO#>s TG; oczQ&eKb? K9v9iC*J%b(҅ MK)?ʴ|ׇ,>ɏ.=R4ӬvxNCtxor ]!!y<7Dw9.<C|Ctxor ]!!y<7Dw9#8>y|q3-?!O2 >, .`Qa)]GyOwnItB0oK749 |RtDe#/O`%s IDATeTg»#N(vYwYS_G_ Dz#Fʫ5i,1ƛꢷ6舄un&-c>oLV q ;ٺuD]&0}7j]liM|N4 24jӓK'myoO5ڷВJo%bs!alٶun?Oj?cV -r ukVss|Dh-RfKj5@%^]0"N-mMpyBam0':'NA\#f(hK#GC*to># vRav~bR~)BG>f?4Q6%KW_Wj؞jI!(uYFYG\mg s;Tc'/<X{D'ٲesL^)5tbycg\]870zZ.&޲2\UQ^E扱?[Xj2ݾgukG?v:Zp-zCNt5.-})el \'}* `K5t@M4/Y0-ϝ~ƀ"[d*M~,v p? 5 L1Zb쨣?YFo kwyGЧ"OO)Uگ&jImۤo+yV姶.M-#8K>^|v]fɧwdyHJ 4xYb?@ucM pɻ~(&by^o}LVbt}VŁLΈip›|ZƛpΑtz>rDg9WӜrN9noK{n|() :q|}pD'?{;wӳN}3- NNj봖A9SÇ1![9LiM߯j*/7u\j}el)]2U_e7O X> : <) ChJ[D"t0## SW=2|F"KWy\trѣVS_1~xaT2}4KYVtVKSR r&* ^IckOQyKLlyP4/$,5ǙR[w#譽eq7,H FL ?rȈظ.ЁkXc`@YvܥǓ#3%6bme-`A|P#03QvĀ6r|o܎%/6hY6~/-/h2PS'۶lչXw4~–8=p8c4 ۳Չz p:R_+H f|QyM,.Xvs81I֎ 8'@h Dn </'Raϣ9x:=G΋Տ0Cu:<fAyey-/+SLe~"ë_KN}JTy/=S> TG%N2JY2 @PLU~\Sk)m~n5cT|"-1xZW2I :2Zl`ƻ}Nc-8h9&b(yL(-ILe ߧ݈7@ >2؇E>?@. ͹7Ҙ>1y'i:ܵ>@x*}،.Ov<ë|K_n7G?ayN^zQ9w,[WlϤp(lO~ηʹ^x'loomk^uvSQ[i`x~o+o 6&q>D4٩x^PФgfCQ/0T+&荻{LiI g'8 ^!'P`@1=󱳣6fbļMzG)hsv9M^r^*fC^Wȋk*h : 6#lEfS ˠ7y3;r V</ xl,gy<7Ob_i?{PџK':c{rUWWYm?Y)x?'}Fӽ(/R***2T "-^ yMܧ%0f-PLJ9l/J`dbi(`7 !LPЅW 'm$ΔҾ۾ۚ;SK_xye8 e^V{׵< -|N6z>7pPdI2mg6=rM]hh># "%*Of6>|Dϴ޲]`lYSy7͖Q ,ې,2"0OLmV0`G9P6Tdz 򌍦|'x ^.q+tu`{r{sdvzx BG\?g%z MV'Xž7<cTެ4_[Yu]Q0y/_~ȫSYzԧs~5zʪia7W)O4 @MGuXYt,U eFڷj# @+ěy'.#HhHar L~ !Iܓck=7 iL8Y}Xˋ4ᵭem6򠀋=3l. jI>KB1# EKd,/3˜_[@'{:7F8Kiw )/,@h,x{Q P>l;y G啶# Iր) 9y J#`8~d8I^E-u2@޻luNl968F>D#`lOQɵBHb@eR֠3i(꯼("isEYzBCh+.N|rp>.h*Rqi)#ާ*OܞN vO{(a"3*.YVW$]L[ASd(czTMwURQ|m[J.YH$Q|r|__ 佾j?fRE~gB3gsgc%ݶȕ9)\wyV|C?z O}ZW ec|-͉33"i\qAW+Fyו<Xc O ޸cw-@4lkIe=8AGlږ^3@|[ain/-vuOޭ3ΆZ7yXRsP,,3M3f37mIk9>x#j,E5t(xxPR>lT;x=ddӉiTx樛{m2l52di!8لYYytتRWۏ:EOxtj?g󇧽μҶv2?Y<'Wv "/2*;g]7ܧAMc@,{؛_X^Cyb-S|%;_5yW YUthnJ>, y^٣cG5_]gG]@lmg%LF._z=KCG+XzkԓT;gCTpM78_)?8*߳glnS<~SOg<1N'oG:s.˸ֿ3q@9Z,( G#ທפ8e?b^ &~>"Hωs@E?N<ֈ *)@yq19~xx̛`L@x>xxpV| l;^B-,-R@NeR}΅'/ ثE]Mԋľ_v,:u!dHo%rӜ*6 3MV$11-|]̐Yb5Wi/,, E&^WLƛn "e9Q| 4 be5K I>5ǏI憮;eŞH 7|@? \m{P L>X.[óbc`TX&c^3DZdL{d*>5˞jzH$meAϖЩ"`J@εc$A@`3bQvoQ6"ܧ-v{392Ξv\Ɩ 6 ?Ayfkm˘6;.nH8niHwCy#i%2c@J(Hyv,~&v;Ǚe%-CU dy6@C`ɀt!Yj" 6CY|Ӑ:Wdli:SLPnZ׮Kl5 8_[:DZNh9+m-]c4)L4M>?C^F4SP/v^Dr'S{FNKʯ~ ~WgzƅH%~;@VC($*;v 44 pZ8&li%CP:220U]d:)30{OmRoŠ,cSy)Ɓr ?]HCZB2ƥx(A6X~Gw|_h#_tYs?m | :2|T\i&˟*?'Sv`FĎ.(qI@#xd?¤L /.yh6aSQ/<(V&g3 52LJo<*ϿoUr9=3[zgu&fOz,Ʈӌcv>CL>OU{Q6~W:_oϏ0>+'W\w9b|vcKφ{ϬVPtm@uUtJ"bq>L^JO?m bؤM> ¨\bǫA`JtCYeeB@zYRBN'CX^;I{xN=)'gP)}a]@)/*\sԃ{!뚯{m]>!9n;=dxxJ_'Izpl32(\YB IJd47Ay*hH9t L wTOنбk1ڏ?wۏH: v8 rˍJX'Tx:$-s>+RWO?i0Cavöp{ t2m:݉'9=f(g.*Z)$ThgU&_l37Fo3\{:7 Z̯Jnjn:}x~HS[bB&і%Os^#vZyY2䆳__;}ڏQReƏ?V,ŇKsqVd4i~}Йcp\Ty_~4%ߛ}M_or}T/ę(0?XbGSul!F;E^wd_}rk~_Wl6U_GIISO+D{*\xetvbJP%#'P0 Fhʻ!{2ڍߧ ~|VVm~dl6QǏWn34V_XicP.dPC)ț N^1Pݐmb(?ei {hS~zyUڏKm?]{F/y}z"x)Fx&uQy2=@y^,EcB.Vdh~MQf]ﵙ*A(SOg̭z`c/+JjkCiw AUM.Ӥnh-,,LNU#!Vm+6t`0B?:~#adZǏ:~LS20; vƿ\aʻ4Vצ[DkvQǏ%V鴍RmJ~P,Ny!]僥]jg7" P7)ຎS'J?QǏi߸*Ǵ`7d) nA_CpU哕d~jGuZQu\;&,r}~ U>[, nj?Dkj:~>RǏ.|Ԩ["uޭ]s'T!=佣ny2S,m:G^b!#񣎟tuWiTQfx *U-ZA),`~#V]NG?yYQQtI:, .`RaU,V ^' 3]ѻ,Po?͡7^^}\jX< @9CDJhgU~j~JLu``M},P:>QEPޱ?"0HtDFy|jI$ QO?XQ:~DŽ:\cI1y8Ci{pq2WyJזPrj~|{E?-񣎟uО|2(:lU~j-ofCljj)/X<>DpYǏٱE?lYc;+VE?`RT*!`jl`~j,P.` cE?s 6ɔ_ϕY1 hၐgJ#-DZ~&b[!iWYa)H _uR[mKGŶB!"IuG7.k1,27s( HA~-JۨGZVggJ?QƈR+Rb2G?M]/1i3 =TU-oſ6:%r\M u:~LݰJmL͔Ro#W:Lfжc[|tK_h)33LmQǏ:~ ̫uxCʑ dЈ@J~Cm?LuZ,E^S!7? {B,_ _ ʇohvЌx-V׽|f@v+6 4x o~U z73UPM ύ*& /yYTU=/0B+1d4E\_T !v6(3yh!8O7ys_W|qzd]|OܿBJ˯Wfُb _?>ZZZky}\XWlٲex~臖D>aG7yoU~ &cU_so`阗xKꇋX}mc2~^}0:n>u!>=to:2<-[VMxpc}G7HWn/VmCb Y蝼gqdžfڅȫ'&*SE_lGV&•,?G?<ͭ.!z_G6O?t=? ]AGQZ_۷oovf=H3!,?~Sȏ01wnr? usܿyzam{h͎]ь4:sQ"n`9rT_in:6G ? IDAT1-3 vvݵk~g߲6(c~@_uy#wG﹵Yf&ˋ漀_k_7R;ou׷uedE}*WW׼k~'~>v)zӥ$_eۿ֭[~ꜼSآcuWWl\zU?,sL,Ν;k3}3u ;u B`eO݈0ZO577]5kL p+W:+)Vkԣ_ԸEaeŴ*f4V_'nan܏}ͭ64k֭i^٤;<aY:?iN<Y;_& U`fNʿCpDi'V|sN(N]@ p3^ZW?<//_m~W~YnOO}՛MŴHӘ9_ڿɿC̒<{Zik:/~gU!nrCܧ;hw< ^hy=Qi1}'4n. usM.zwlC͞{HNK2b,.e9.[Znϩr c/mYn/U>Q:Vd-ގpSlO\lX4._@kOL9mm^Mv]a_;w b;0|ގ\oE~_=^|]wliͲ|a\'-?Jo K -*l6W5k|kL}xDz_}\-=?1F#׏ETfߔSB?Ja<ס OX 3G|£~_mfJKu橧i?4Nl>j>]l~>,-35Zl޴y5_S /|ȅ7_VD]N|@̙3,C-|ӟn6l` {<]&%ԡ|??iF^fϞ==|l6of^ Qf(=wR|o~~u̵Ǥ47n|}_ =saƍX'MHp/F[i"ƬӐU7ߜпh/`We?ћ^A/:K'>|GGϏ)G}Sޥc~_%w~&O^'ؔxM cO}S6m7L |-o Ci疚UGʣN~//?dg  %V]М7^\ۛu6tգrnl5j~Ϳ{@Vlظ^;w5OՋ z3m"[\hgɛ%:sͳ'jNa^6g^ڟIsjyuG c፬ꆚ$mmV?΋ ?5ss<7ͯ7_җMg_%[ƺmmjEįE@eHPT+ R2! xC{ows/!y{Zk}^kut5K}4?QYr"9C+} mH'e~.?RT~ ,)e%z`jyǜeřn0gi`X-KfgsTȇer)o̙3e.Sm?_u;V}e^{ׯ8766J7?4-^ёY <1e|{I;WnXtSF%}s\clH[\|7epC[!OÍ Oy4S~Pfޥ7L9{I}%ǒF=M3 c1YؐiDukւ1yeNnw~.sDD?@}jPfGǵ^ ]Tn;w=p'eGO˯Od?)7z)\nzfg/N2.؄ >6L 'ۧ,5Ff H_t?y (CRRFi.# v1* P |I X'[ZGQ bƎk;MVˡaumk|a:Sm7|`TF4%Kc||o#_\r%/7mQ5P~_,Ú;wa#̙3Gu 3ejY>..\(s´]wݥ() hq0(K Ё?^mb'o (?[#(_D(S&_\w7Rqcfɒ%*rơS|2{6n$r tK/Y*cɅ^ )_b rgzz'~.0!-]cBWh*Ƣtw'xr?}|~k[hMXEA~0yv_JPy% Wedw͔ODO}<[dϒ+ s/}ʭ_l\/gP_'&O}p;YX7vZ7y|u0:/y,nVurgʥȘSs98Wd}^;1+ 3 섩<xpmn1?.df0%0LH5@V M4VhCn c`avx1CQ 4`<5 {.ǟzH.?ah`hqPpU^iЎ_\2k܋DCE> ):UCBP̳>tKKL"묳tE|/$~ud}^0|erI_O8Isd석/[93 .t] r_ޮr?.rm'|e ¸w@k}Fv(w23BN~Z#hwn»7+mټ&2f1RGz<9M2jI] +6hʳ 0Xȵ`9oMyinɷ|ʑ'+R_1(1_1 SQTo6_)PA?*,nlR }:f1@ѹpZBItrWjLd]x\tE Mo|CW\){,GbY-nWJ|>Ike[^Y#Ψ+Jqv4HعTAQLb6 J~2J_ "&G-̷58Y$9PWn^j*G?^˺x':Mf[4Έb 9&n~F:4\_t&pe .@N04,UW] 3Ua^DXC3&SZ(?,A0>Mcr8 ނ4_~\ax~&wM4E;jcWyGȜCQ\y'ߖMϡ g夅И$Ϝ+w~o۬y2fJI;A5';cgE{fɑru]Ƀrs2iscwˉ oc|Uu2nΊ:"WFb&X¶^=1%|ApdV&(qH\R"lcIA KMErԵqq pZ5)Ba||\ . (F#rM+CGl'OKZ3|.*] dV{qq3+әY&:ޖnma\UI9@c o88H'80>.#^KG%qI!. KI觘[F@Ε/yBGh|/r4,Xx 8eK]cz.K~>[9+OXg°Mw|On ӱ+l3`Q8š9LeR!?VƸrj XM\CuPn魲TV0qjtc&.YWawϖWVjZh7fd8iQ!FÌw[Gz$t]Mzq%#3MYWh}|9bjNvutLRi+`G &tb_a";X7r[7'ʠ^ऻUi1YQ-sY#j4*Wξ@>wƗdƌ=a`<р˸uW0`_IҍX?aNF_I?2N/Z^o<|>R3fХo]o5' ?ApaD$!lgwtthyJLrP ,css',3'q \#%V_t3Ozmsw|T(GI>|*Yh0t.8#el.ct}a:g&[n SNP_S9.ůu֪ʺOc'7Ue!4 僓i̘9̠qH+g9CǮ٠|,Rד[v/đ=O{ Fԝ]}&t#|HWq4Oґ.FI[RjF1xTXLS4 SIZ[2o5W_uiKt\j[~~Mwuu%u*ng3S4 }ٲe@f+Bz nn [v5|7lP$-=ρ+ڨhUяRz[qvND~;߀ T9{4%G})El`w3 mb]e.yQRO [N-LN=ModkVˤtQGT. S\0Ӭ>ɺ|ѡ0;qL㍆Fqʵ| 3–nqH'-%(~~||?Z|+334n?߰)9NQӰ4_fe)7UhQ.N8n*硎v#ʍ?OTh+z#qg~` rG:cDU1߻Jšݛ0F.4p@ӆq w'=^8|g!|dܰd)u)џ9[}GN~Kre,_q㋰ML{ށ2yΐ;RYMXgi+nNG~Ly{su@{Zp +GGܣWi4dqՂ_\} bE,+|3t8H18u=L8gh@\Ư Nm={NnvV#uV*pjB'>^^pO_WF?.ݼQc?E|<7iACuE2f: 81W0p[٦xnj9r$+smp Qyӈq{gXD%~x=H<~W 5P-)_I@r^Z7sÖ9򶴟%mqYM#ݟxr]?PЂ;#BL%2t7ںLyNh4͎U0ѳmp>Gx74*E*-*|w7ùr#J8,R}WE;GLJ7 )cp77e> 3Ϳp9X[* ҲHMK{'sW_-|J/?tz Yu*vs[J~cj)Ӄy4Ucy&FT(P <)_Vd`nŞ='Kmo~4 #Xb0|gg'v.XJ+{kHo |W.Ac{oJذ[Vv-D*mFo&4*G$U mA~-+^%8=c~8$?C*ªɬx{?>.y2 MWV,U u!@~ ^w^5ŭpWUaFGpYa 7q2ߜY=>nY kb%a\7#’ܾt HXquǁ_,8|Mc o ܬKEIVXIbv"fnVO',?qgWi;1{e8-!'x' ~tZhzOg1AAnw\3+Gڔo\uXS#G};&YaM:Htᩘ7ð_!:݆ZڨQ>gp?C-UnjNTd*|(܁ _%amS<*n_Lx7[aN-:m WIO^x>v ۔ػ|龳z I߼c%ES2?&Umos89KT?c['߸[|"D9: JY9?~<1S(O8bU.!lp%?nO>>L8'1a~B,&q'OӠ’>~56ۮhyc?qe)]S9!iNtZ <:7ͅEV'PP\YR*\^A~!OXX ADpyTp\;S (-,U09DMMK AV P MV҂QIħz0DV H0~m?ȒdD }f@!(iB?b @?Ç/ /')o7菠?<}5C4\i@;̬iq<ɏ _ ~ APF G?\HoSZ a:t^e?K@?24$F?\]gПN[?~TDn kǹb1/QߨRIK_W ?&A~\^#0~8js>oau3PT6Y~E7~jGWЌD]żj*x!rHПABյPf8'pEDP4-<<ЯR`^ KC ?'O,Rቘ"[l5[lD/Pc#CCmQ9ۤ3ǸB0݀b|8MEC8'>Y iZ4gՂ# ԢQ@@?R '%?g:4hЀr옗j@kuAZdtPH.P P P P P P P`m ;F'8 EPZ#" '͌})` 0e9|oYgq,݇p7? }8opYgq,݇p7? }8opYgq,݇p7? }8opYgq,݇p7? }8opYgq,݇p7? }8opYgq,݇p7? }8opYgq,݇p7? }8opYgq,݇p7? }8opYgq,݇cmBm;}3@"})3h<08XŲ#.ㆣܑ8nxdq> 4sawiꣀK37\v?fn8Я> 4sasi,>{e7U3PD3 ƉLɌ'Sg3ɇ㬧x-\~<צO/?^;ߧM^~6v?^~<Я6|z؁|z~V'bFf<1|ux'FD1?85˺F=~?ꑔt ?[1\Q,t 9 (S|=7m{:o/FWIENDB`davmail-6.3.0/src/site/resources/images/osxMailImap3.png0100644 0000000 0000000 00000560751 12564151555 021741 0ustar000000000 0000000 PNG  IHDRP_8iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxeIU9 ==yL I (T@y%|(IO Q G@ a ?Uk:=9t꾧VjYUNU@^z 5k2i^;V!z 5k@BHGu".c  #waݼHZ=GΞuO'_t^Ȟ\g$M$O }^I0 a84sWQ^u(De 'p2_5mL~~h50m4G}KӨ4 J aUW Pvi`6yO@4MW`~>ӏ6Vӏ~q{?*  9@tUT!6->V77?G?~1B#~Ⱥ~+\ JUm\KƓ T 1N T!MZxO/:q4 я9Rg?g9-,Mi@%Ƨ#︘nn>x=4=/|OC?G?[3c4o\':-O l3DV0,̧kv|55-mOk_?m?tkjP NXi 4pE B;m۶U333P@!IO F#P0_Tpq7OE^@"\T lTk婴.𷃎0heЄT=}ahR~z͚5QG5jժA_xۮ ~Re:П2' LI㧟?!LSFVܹsqӦM 9 ]zI+{"] Ht]_)hO?.']p '̮^=W)k xm%G3)XZxOP_֕JGgcvOu =К-; OOD G#8%<`N{HJx"'TGJx"khm5qayw)(`d -ҁ {3eA@+*a%nVJܞ~CӲGϼ,N]켆GZG?eOgtRY}ײK\w}fc73bg4=~r牉_׌Tw (*r m7C)=~♇WdB/(o zg)g<o~u4>6^U=/g@b*(UQ!\O/RG e DQ\2{='DI&ҏ?vzWGE엒WNQi@MUp`Q DM4&%I^Wz(S돎CB)}D ?cg??:sdK*Ҁj+6UJ%hF!h!MO/%W3_`PtOd7?oehPyPz~5a*[>^2 Eϝ6G2cJ>묳o^=O<9ϡM~>{ |;֭[KuE".>?N(^haR/hB/QqyBO{Z9e x[[~rprѧP0iĒa!:Zi~D@}O#^}e~\xāȄb"[2xVK Mi^3MkVЙ:k+|o^G>Nw7{,~_TO|7GuԌ >1xE-G=T <)׿#3?=1W)2?3ouz 4w]cz_/~-n1[;xi?q-'pOO/| ]?g6~nzӛZn'l81Z[kjխn5|39 A^𒗼db5FT7ϪEHƝ"9(ߦ_IV}IcL_'?+f>K (OQI )^RaV(z&t6.Ҧw :n5~壭]x4cm# ?g<-Q##fF\=m"NP ]g=Y7V:$1OâL=ڒPc|K_YC[򗿬^W hfo!ooȠ1B^ X?2X蕯|:ᴼp |=F \%äWd='G}GT2F7э7M-F^arץQf>YyVTSvdNr 7ׁ}ZFկ~5Fb?'?Y?Q }W?яg?ك}G /8Pez>nw' oP_ϼ=y_B==ZUt?SIJ?+}_vy2$ZQ!P X&W~}"rDq,Zw^*,ʓ( (_~}#osFGx[??O^䅪Y|ЏET:`=^.IR{|G!狐 >x2F׽,`0HJ4aHSԈG놑A3XXXߎ0ba{Cmd3ϴd7G<-Z Ƣ/J;N]?2^<蠃Eۢ C.⠋zM?\'?%SǸ>$1I^ [ AdX԰bbLKX KX3/V9Тj7:vao|EIN qmFt'֛l I{>Zi{uh Vw$o?gy"%_NOՔ`c\Ɩ..gl_rb cX{#V~ wquD+qGFRVZ??_E CO;8Zz5IG^*DM2:X p=ORۈxcly6O%蟈BĤ]37?!?%l=8 %]5xN| +NÝ]MtOJ>nٹsBL}Mq-^:* A?$ene- 00XZbĀr 4c{O}swsöd!_6ëu;fLΩR蛩d4:6A7?|Rߜ^A\UH: r2ywB(LO3PBUe?fmvnY4}x`J P>?^ěiZG}k[FYY!"ޢ 8Z%2`  va ^7[gիVÓ+]~OOGaQSW Ao5?я+\qk-DlQ\ضSEȦvrpMHCR Hhzoo|G2Fҳ>яV-uffy [tEExsRycz1`&6жJj"E_Z:~OO8<1Qƀ/4t0[ ߁㵕tg̛۪++I+4e< =X/IJ]EC~xF_Zzm/y{}zwu':In-qC4-=ॴ *apcD(&AS/guRWwtƇCӵ<+# (#ˈI5 zNG|p̤!E]e2jm!%<. ?fcϬFm?ו_+K6sCeW kyFRKGD*Z"Z|m†空w[փ[ҀFǟFM/Z)τl1mx* qV,N;%x[1y)df#Q__鶳D(M/= 9CB-;W_Nȃs2q$2 e#H.L fUF}M/z6Qvءէ>iq9dsʩoq(c&xHY\2-AQvɡz8ZѤ 7{PC _ R '뼔:cx0UjiY-t/>?!E_a6D~z|lmO_ K":J'+mfmKSzk_H]T Mg.Z0iiz[}'tG ?/}1@L 2P\ 8oe[&Lj˄gE-!` ,*40}mt9e<@n~e/m2Г ;%"܊TCQKFPw Ä&'PJN^gM:%B$"8M?4G G )H}B~8ZHa?1>Sm:'_^SKT!Q*ʓ+!(DZe=~i>|.'7I0NV7~D)e9۳~gGv_ Գ\2˲AuBe~֟;Byc2B0-,s;]?BxyџQY ,>ao:_k48o|f)G{2x k!n-J|nX? QB/84ATI,eekuAoIE>W-!FoR.Z8&;@&A9-L*?*nq{^})D9N#JS_B]TL~O.&hx캢?b t/pdx1nƓ6~@ϽJlWykq,'.?" Bn_θI'ƛ 3oa{4h1u_&#$rI噾 a{dԟҭg4V2~vaL- N0ň"GeHy~)-P?&ƑVKӓ ͥOz'h(J X[_ǃTcbxLPmANDylX!P XCoօc!dC|ɚ#{^ F(M$jw٣!"C[oC>Rbe%6~TŁຳ /W`٫EY to`1eҜ/,hI (-UqR[vZ!2XD[ aXHWaVz2M-SdGord8mhWeN)FWsQl!`Eld3[cX8Y2}F{#%?냱d}FnqO@YFhIJ Dpz \c%Qpg1V9U>n\!V/]tpMY /5 7ֻB=: [7Ö́ p3g3*`N2Մ8Y z!tJg`c6kö P—Σ}eZ:zi3(̂2,mYTRNO O"V,^ 8 Z#p`B{&Xg#*5='m?! ~To<5)[ xV')˂oV{BÀa?7~͙|̣SV8*e 0ΓsɠLSH% >W0z&;zh~Ŷa<nKo- |~FP7 ҢՐ8 Nrεc;NiӦR~7Tn" 9ȿY07v?R4#<ӝk-R-/ړB;uҞ?465,g@y cΥ0ˆɬ XO%O:nu1HmV]r%3Gq7<޶cWlQ/\< `Cp.Y(vM7QH?-Ə`HWZH#2&6ϔM7_M`od ֡sDR;#N9IaAlS"&Ѵ5C%Tzg[~3Ȇ 5B @=ZB@oQaIr -C $BĤ͹(εvMoyTGu[ĥO4~߉SJ">iȒ8us.?_w餓tjZxrHAS{챃s~p@ԢFd{Fyp4i5zKܠ#sk /~2e%Ix]zeu@z̿0J)cyH6LB^@8g $ Yr*-1f=sCFB^X"= !C-4g%c8(];̑S)Li`3dD- -ן F2,+J:/gZ( u'oՏycݻvqVGWsNg}1T7 *Y钦LG⒦L.K2{K27(/it-.i袼)Q)nY+ 2W~piȵ_ 3j=T{'>ggGsqc,V~¢g9. iɰM K+ږl?گ2~M5Zjʕslۇi֭ciŜܚj whwleu ' {(A ?^ .MZUª5Ћ +m-Bygނq/r-h.Wޥsi:ʱ^(\4:ڧ LX-׿;4ؠL/c2 h=ش!_DaۖC) z6W Iys3pd$Xr,xnsQ =*I!ڔ3-,/˜W(/"N^'2*JXn;C-= %^/W;$\c"P]//~aݺuqW]|~/zы;Ճ d:v_.wrq_.]n>𖋻rtw\旣igSm>,7\xy{uıOeuXlU7 +|ʛWWWh2 n~t./|Q)ӁEL6**81}$pb&}>mR#6IVLts533 pÆXY V)0* $<7;X%7W1y ՊU&juF 7a9~ nN7B:$6_ԢN)yy;Onz{PD՟k>ᢜm/RN2ó8i:\leI+ B2_db@tzl0`gR!C <١@&d FX 0l(٫$zS+ Q'C ޤ81H_VU׽#8ɓɆ#mκs] O7SŤokBzn$AQ8aQpW_rQqpo{67Mֿ7zāq%x|+FJi/| yzlFu[޲sWU|EIOG?'խn3+}~7=yOu'Vk6QvgW{n?x/f>-oQ \ 8ezߴcTԏ+tin_UT[6m?g#p#zm0T-7ooo}W0dk4-i ͤ/)Df }_P]`8QQ0*-P"otGEM'xHdE*ӕе4vkMkƆСńƍC9jf$ co[w=?ԺX.ynմf[@ڬ&y~薉ř\o NMݺI؂lk“ #-#9?Pe vܡu~я~,]Ҡ9-L.'vGX09x 0H{PG>꒡`+cFM$Hz|)eC)ߨfY-RH%mneMBG]qɸ^?3u-Xu֋+ԇeRR4/`BM{l 1!KDN5LZJHqӨlEp}m HoPX|ȷW0[tq+AoV+F+ xlC/XN9___Սnt㏯>ϻ>$"77՝tN3 6@ ԏ._j?O~V7 xw{׾5R_җlDl{K=EvlVGY? Vć[ʏqH/9m؆a/=8#,'ѯq#-[tG:ÐS0Ë\)M&vf@R2N^H+X N^,zhS%[8,*ȓ:A,uǭ[o"ӕZDq ʀZ>;I1ay {)GA^׆\]-bo~F 9GZxzx1GϬv-]$SD7 ŭ !Bg]oFNàCNt $aB ޮt$1}wJ`z _?t3^+ ;˔$sUK) Ti.0B _a$zyk Ci護M`,! =:ZO\  Xwnh2Ӷ_BEY F)@R?嘴B8zֶ6<4Q7 %/yHՒ_/|J|z2o?/L6]Kyz]wۦxt=.__wwC(<}Mx֬Yc1& u^]6yc\j"Z3K5%=|%9Ńfĸ8E䛰E/@k!b(F6sH#(Jk; ςntlwxb]Gu[W-$OBDvhA969#ąl4J}pA6" 0L؋aC“SOe\!&*߳zvu{[u'QF5ox[^}ݽ>X\X^xasfӟ-oo?sp;y(o|#My?ma k+:?`'VO|#m++CVP_>eT d >9tW5ri ϼ/PF<}Ǽ@`4F6^!U?غ{ކ~Pg?!Q|5/ɈO/P;~ /~v7R3<+Ї>J[6E`l;P=WR-N r {:>p 0ѧ/MZ NZPoS*IhQ-ny괛߲yX'?I׾Z;}Ww>4qxqF?38z_^ukx;V{j-2nL-c (csbҶO__-~{߫g G-7&=z+_96/$ OhMoe.g_!2A,/IͶ"?U_jm-ʈgd_sG>E /mY U22H[:R/[nFnv3?kFm˃#oyi۶x']=qչ?9l-,eD*zSyLˋǂ`ꑏ|>s瓾mt䀡B.+`C##K,2zkᵶ 5<˲wHy%ئӎǧ@52璶na| DJuV{uG<Q16Z~}u'&`0LҼ̹+E yCϹ(<\ 3Wo#r|x[֖%kEF=}w\]si龴[G@ Ɵpk}R #ںG^1xKB׀"̻ d|Ut" m^E:#m9Q(MV3(EUbB^:+Y3-E [ftf)j4a.jBBgtI^f\Bke$dњx8H1Lo{<yUN: !%0eVײx6F xʡn*N8G jy+Ɇ }ؠ$aR+!u/C\ۇDނ$-<Y(uFկ~uNS=1%Dh/3̖uMozS-W)4E\wpqO X%~7= '`wi4E\wprZx^Q5_Wyë~mw1G~ixq.=n7W a\CO}OW/}sBGc:mˬ֠8dPAd䲂B ,T +qMV^"P& IԐK% 즠 =ڸynVmV~ g﨣Vu<&&j\:4g[6z!Ye#& %YN%(Vj"I-"c!e0EiR[I6sІ<+p"зr>gb>"~s6Wnn!WxF[Vo~S]WzA9}GPuk׼fC=<"``{ymT UN #[v6t,葉vBN[ץb)P@Z_dȁ P +j* MƇW3SE&64x* }JxCIa>oV?IH5dH8%fFru%IϐmP"H NebyҟOgy#7D=:L~ߴyQⴿj^7O{׿kwkyAœ3&_ [[ǹ'7 u7={:7+1n[fj8#j֏ʌփT~HV {󞍶Z-xP=6Z砳yx2-#+C$c.eXȓ3B? (9eIUC_:,qb{#u>*(F %˸_эu'IxXkM0'W~P/_Zes?@ѻmp-P>W}#gT&w ܭ3P>W+}ZZ#eq{_c@h.INRWw-ynB-Kʮ,z)#&`<iR[ޘ͞|>D:X{L>:`&^,;8f9ӡ +,-kJ)Ad_ʖ9[1]([`$~8'>Ik Yd[@rǠ\%-~дRVk\ L#2(SLPRh r0Vi̬+,'&Sd'6)FҤWIRpFk"IpJ`6&jLIAO~0`Yg2<]oԤy5zm~Cf{⟝J! )=cg«}tA2L*+Li0˻Oѡ僇2 ڶZij9> q]#%xtq39Õ&΀PŹ%}9yoqh_1ۊr/sK \}6ǧ;;m^^=:;~/6U\`{:SYl@͙ie]X7_Vօu󗊞h9>JbfNR('p?7Y[C+em%N-UIO'WYD[t$d|Sܑ)'˄`iLK*G:#툞o#M!M\Ø=t팾ʃߘ6T Ue+1d49ck!7F"P1JGɂ '1L/,)Ç}$;'yEYdj1չ6%OhP55mE 22[ Gh(I  $y^=ƒ4&i1pԟ=0T&W@-\*Yʁf'qejm/q}ҾPiq7 !O<$<КQ^l0VSߙ[3Е:wgLpFGҙlBFT>P * m9,n)=P~OgƒU J/x.s `/^B9q!%w4=!{е~>7S]NIOoojvܴٯ[?Z#t&_rec]hz.Y'!FhNA%r0 a _j[ma24YWPBׁ;cxͪVfuȊ9yVpOםN;|9$jd-yut6S$~J"9%_bXÔdPA䶸yjB*G`A(Z䍁8-v6 3\fA-׬?JS~uƂKr"u% [lMm-8 % d8M͹-%t,}Dn-o*TSڶ~ h%fdl%J:7~Z]TyYg!`25v:#3;;cYpce E8,\ae:p_0 t+9 4zWzל>&rSF%kƒI%qnJDO4%~y_l=-,}~ ;@S7 4pT[uﱃ=1S cXҔi\Y\?c![/%XLPIVALTo alz:{e%!x͞"Le>Tg8/{}ps\E?/Y9ՐT 頺D &@4VaKdCD fb9Rҍ~eOZ}:̭w7wwJw*.{I! KMWP۴MUarHЎ6TBGj6=n0GM =T/>ۅj;ZIn*wY0}g<y=d\i cLKDkpv\y6Biqچ[j-V/KoSUR[zXjQYnn/[1D{}|nTGOo2d>:yGWhԯ.Us/h~尋GPǹj~皦PcrJ䶝FGSb9*KzjlLW:}$-èA4yڊ p޵پco曠 N˩p96)߽悯~񵳚;Ep$dV|I&3F/cZ#$4`4m+W*}4z6o W\bo!ͭZ'2M} k1 ʟ"FIrkSL^Ud?ِС( !0ThU-|a;S#i=鎲.~73 6;_=͌kt\ųkǿoe;9ߙ#J2.BQYYTo>8QQRыF6Ȯ C%¢%ЏCA=r~}`PPm3`6-ԏIPa$Z5o ʓ1xWA簃^Z/TdȭD8SΪTx |I9BC04aXy#MטC#9-l :3Ir{;S9:lTݬڪܴi~dKqz[5;v-X>2W@ZuDuڃߊ֫kkHi]#Xd~% П'8,pJYxAz֥ a^>o fiPzT^uvU M1')nX'!(w1q N|joY~=dVDOt7NMF9iE-{I zXēӟ8ߍnz~*58ό8z9ҿ+zh _zxy#¨(,ʯz1d{^z>#MҬƲF>!&zi\/~+yx"1r$.Q^_)#z":8'ثtźBɧ'gd) dlbj IDAT ޡiR '1J,]ꭵAZC+}wG핼J%Tlnl*#jgk,9竻fWlfx@3@@qbX&G5鏖bV\! Mܑ{98&AU{M>Jゑm%HS3E{i#>*q_+/醟Uab2ZmY9D*ά pȽjdKH] 'bX\JVZ:" 2 M[vPZoY%K:lٶCBzJ]vȑڹٕ+VsF\,\Fe;75:d8e-T@- !^nץtnQ 97Y# vLr@4]D2J|حo ^ϥ@TB2H#<=в z 4VӝS㹫yHi%O: tuEiQF.nDye%:)uI!`]\ʺ2uq'K(+a$Ma^˶2(z{2ʊ̰ B-<.yRW耸\smQɖ.,YG_A^166Њ -\ A%ZANmZ`LQ[KB9DI' !)$ي4/)-CgShٗ ,H;}׿ңM}y*Fxp:08m^OBǯZzX.#I>V ح 66mYͻ*yv)bPyⴕC+V iu33-8dI&9VDKOޥJ8V)iiv@[0iͧ44e&@R(K_\01CWQ,,wqwSOJ>lmP #/wBqyXOSjsP9V.8ġ㉷& J$ y-㫊^܆nRߦL2D$/,TVJT6%0>)l28O|Sh9u-ZAO.NrI3w*AU.GxtUUQoֽJuN3Kuviuܥ[ff JJcEʚԇ:QrW=1,zz2B~.}kHyTLJvC+m۶5J$Ufp+ktbE#Fu:E>bHGlxO?aPytL$7,μU7L!aoT䲂B ,T +qA WE ϴ|(9|gZ8{Ny/V=8H `䨏,V@_'ͥFxbLjP`Gۇ0AZux}|sNx7& >iN퐡$cnPZ}%yVjfVPwK " I2iћχQLXEFRZD/ '9sؖe?χ^iHY'<$C\3Z=yޠ'bQRo&?dZ'Ӯr c3x.;JH簣ׇ_8Q-8jo 7tss֌EaemIfzC2F49QhM=!ѻ$.. 6vZذaK9т%(xߛT'');ѧYUO! D[ݴpvkA2@˽xNmkM~gWS8Cjlb2y7B(g-gZ4g|@#c^q&eBCPM@1=\̊r5V D}[%>ُZ'p4e'@,gdֲVI}+n+lDIh{8?i课GKm{ueA+J=T]нK_'?]Gpz*XO6+_s;<9_-S_NT6X1rP.GU2 mGvP-uD##gsmQRѣYnę-fg_]D>/Ku\*mNφm9iH1kQ>vDMBc*hM9?)##p|%.ʗ42ʕ75-NzYe].vsca \>5gtB}p4l]i)ڵs<#u87K{]&=DCmv֯8U)O&?ݛv ((d۶Cp$=ōx9))?/vʕ_8-y)t><*u9k!Y!sZNk ѱVD߉oiW4:pʇ(ÉפL5ov- NKU (F1(G`r|$j_ՊAB, H$|6FCirb#Pŗ#PKi^r$ M-blh$l#3aaŽwj Sm ӛ+WVC)k)n/Vz–₞R-kGi{VEqhZC+}bO>[bK*ҟe-?xFofxۯe'xtEe.E 3PLۖpVc$^JU-QSkhdX8QzrV=N 8)xAW'&^)t~,.;0(} ک7~}@>Oߙ)xrVu|N<툺}O_0R},slfTC%g~Ɵ ѫ~uD2"Ӏ:/Mj-XYD]ÉTwғ#mt=QA=M<a0 ]Ir_m7|F]6<-k&N44yFyC4*v' ˷{5k2J'7o+FthgJ0u읤tg #&{fR04'jԒOIΏ8#_V"@/2 ^\ng:dSlq>dɜ(-D/B r_}&xx mד2[з}ӓQyJzo<߯_Q>A1Y~jr|W|]@9C'0Ĝ!"{0av_Eg 蔭F:hc9Czҟ Ԋud7@G2}RZnbrbE bP\s~|(rAH_+ p*ķfSZ _"LA$=5V*ːrtrSo{ ^rdzKsʦW蜪]jsŗ]Z|*LqN9ucdޖ>"at|̖Pj@;tj;s3sZ6cpUCS9p/;/*q1(DOj=Α#Ozz:\xK.; rSD񧙨hkZR5L6޾>gyfyUWYZ8~5δt|kgqFh~t{D$}nopWT飍e˖կ~5\veGK[,@[έS&pO9qG+?o13(Yۙ~XI;z=Z.b 7XJWIqG 3M4 ǩϫ)bvvVG+||,fa4Hg5/Te/F y]>rqacC/ƨmS*di~uΏǝ8绳0dĂr V5,?MsuڴG_׮DXؿx#\NqvjHO [~beq%~+h& CEonuJtHfw_kaNu^`:ia~NVUqQll*Bq&rkċ0U*nY܎ b-i*ϵXKIUlmѱ߾Wԧ>ԉn!L*oxEnSgnKe[Yv$UrmncaExԣcufLkE]w{P-wp\2]â-x><~Xzo~wۄ<1>~9PO IDATHm5o߰'ö>ESW6XJw@ r]Xx.4SK1 Y.To6i[6۞u꾥 ;~'԰QI`%’&buPqp׼嬕l6V|Q JW:G]fgHһ'yL$rZ&|3CѰWIȋ.*ܵn/~8DŽ^ ^22UnEav н|=¿K>qP//x#M(g]]i& ½f,"˘DYOғݯt;Y!uzoS6' /׾/<I\҄{! =3>} # 7,""t|t|d1v/vJݨ{7fK2Aә<45]s5N+۠[FhuryҘEq1t*+tԊN^Y")b9 c,\zHғ CHTqie/O+%_CU='颫X<1 W=10Ҿre}uFZղ;&_p ז;4 F!9GZ3Hyaz̽Tu*I{yҲ/h4GfjC8!Ӈ&GFFCҀzr^qPMҟfTZpU= ozӛX^ o2u ^ziq;(|-M])~G4扩^~?] X5$j A-5aYh)^ֶmV0$"}gG;?-<~; .ỿ{ ]lƊ<ٳ'<9 7o??%-\˃CË^?{<Y";jzrns鲡ӱrbPbXBG1/Z45=ɨUYFBFJq󧈛_cB"2)-C8xlW|+<9Bm @'G2l LuEڸزpE]ϖ͹rLM/NqaZ~&6}F1:%l}ADɟc px:` Jc@=mzO{D`ެ= nm /X,xu3(|ۣԞL̺jMR'%lͱb^LJ]}kuM!'G>\ٟY7ay[)o5yU4x7rs,W|ůگ~~(oߎ Nhs\{c[Ot?S?U~~k?G?59I-)w}wg>'>5~v5ט[nV"9irFfe>OwXe?*wI"~+^/9 e/ +Q-??| g]z 'YzV>_E{oYok >ZF-8|{Ɨf̡ڱc /x v n ?s? *95,@B~J!z~~GbJ*뚗aFS!G[xUVUeHE)0Jhs>Ǖ>UdɎ=~{MR .(Vu2]㱊Ɉʅ%schBl342Ҫ6V015bPU:+G+9\ ,_1WKn%|)X}RڬLuq, NbCz8;"S2یʀ#Ϝ;z8OOE}/8ɈF.M6}{2ԓfAʟi>a _ӬVБ%kc`&+z˿kls|\mo{הcP>gk."~J+1NJKY q4pb>򑏄OUf݂lc9/}K9z/ٟ O{Ӭ?hfxlbz"f)S&1D]iq䠆oo\?AϘu=se_'hWͤw>6Wnw׊8A^/u} ωs"!kB)ndT,-ŚAm ';:~~:|zc-:ޘ)n-aFOssŚ5Z C =MS{CUJӞd=6) kz ,gD|es}@:ϘNW鱁-]Qﻮwm~^=˓_ގlyg~FR3X+Ќ0q{գ~0"K'R(W1͌r /~ocש(*jPx1K\˱Cmx-~ ·n5b˟݂7abJ^>8OJz`Lۿ͆|[c aCNSÅspɺ馛Biڪ>y{FѶ8o9~wj 導9,5W^:: dBrp =G${)͛6yRS_^5ivQ[x_kjJ /dcŌ:択c7' Yg!BSJ%5fm$M0_pT nq nCl0s" )Ԉ\Ų%//f12R=5lқt#rq`hn8+1lڰ N4aHu8d`k]PI7jNRB\,H`wgaV6pL҂9V>!pMM7"{ι6j NfU$+mC\/JH:`joWxғdO$/B'ky_*\wu4%3X N77v|J3~w}wm?$oRW9KOuzr'B5^= f•D Y(kC}jtmQ't%zQKjR13\q3BC^TZ~~/%*8IǤGn,0 ,\|eŀ~Y~ }Ǒ|X.k@i*\ c|( !VPV"9*/QՕ%æxe?fFȏ/~ f~K^R} Q᳙p@Pݱ,k???Jj8e~q˚C+i1S3 9 ,LXZ=DJg?[/? 9QѠB}u'M*kEYd( }{n) oT^x9Vl`0.QOyvyGGQ+tgv GxnnΖOKB KQ}?$@G{mm,s&?GG#?#^9PXyc]p7n*(V[W2!4sxj__L\Vi1YG c6{Ax Oh)(&'r SaveEepp8z 8B-z1rmA: 2<Ѥ=1Ƌ;11Xʹ}w]řc;BceO/2/sҔ nܢ3i8+jPD\ը(iM:S3QXzhLFtJHʡxXVy--[4kÎ[yNO @}ӞZ|DMۅfJmZK_WCRh`M7~#|w|G}Qf;^nݺUe 3UגS] gA-aw}K'IĿd8lFBrQ^zj0ȁkj&ZNsTUQ&ިK:<-|fnpJޖ_pJ~ݞz"if9n^\\_ؓălfsT 8w6Ї{7h+yE]dWԥrI6@,Iu{AlecW''zFުks"9M?ftm? WuDučAdXE*m:fQq}kTV~S׆ϻ|yrڬ0ue˜Mdݑ^Q!G5jgp24/Tԗ|Xާ_N&:6sPP㬳δǁhu|'@8PL!nY/? 4[~MKEc*b&u~qXwr'wfM̖3SU@@4fYB8՟۟A8 eq~#@VJnDG߰b ]_5ɵti;ۃ.AE*\[GF߅&CgE٣q^HrExh38al.CSmG#䈪)ʩ =mӚڵ]9tď+{kI'C'E{>zkл8/媣 S 9HU' =:$=G\|ce`l : zhŐt6dccimT\'-K,.F?)M=!?CgH/ A~ZF+0d\Dor9bFA;f.'b]f$6Ѱwv  &GM[NgS1?5P5.ӱ$T\cSCf2 L+N!:|@SP΁27T<. c * AqhhExWmҟDgI*"zVUֳ񶜾Ehz`_M)[!b?ċ:$!y-cUh:,S? U8~f%M~ \gZFl=a1(ULÎ;~ᢃ~M5#УZ.z_ͥ ;~{ՕL3*'Gꑆ^0%-)3nA,ge U!*̨?Z4ӴNIF Q~bLYVA :9KKPk/b3DU9#6l^!٬҄?8P,.i)>A1IJ]5ہs<-o:G j?1$&j=yaGNOvchsy{VcE  1}þ5R=DӯƉ] ȁbfDcq`G*8G h٭UTpJ2xE/X'-4DžˏS5xj>oW;K%~xXTvHߗM5Tѫ?9rޝ'𴿢~%Im׬ilhi\E`2H,=輙0w_\jZM>9BbI%Z.I' /RI_x]H.4y)>O(˹#vTl,a\..@Ɋz{̖8I@iQۇP<"Onj#H1+a8S*9Jq9t7?rb`8y~+K7Tq=IZˠCѷLޒ߉ߙ>tj$]Uy\^*_a#ySG`D/ x$8e;]I5>qxVyp(y:+M7|}}:̀9Nm7NGH|j!vzWy?b 9MT,'n T' 9c&eȦ+" ty,Zl\SUj3YmӴtNՓsk:*\rUɹ☑&*,J ԴfR+F$ k#ت:*~fčDL!H9p#bE%,%F% D Be^uxsU?S7,ܶⴳk hiV=3S.+Cz^ (k'j%3Km7q}6D91dNRȊ%t'Mz%%91͚Í*d(:[8#|c<ҷ#^^9ZWZU<Ɠ^jF+tb0cFWɮm.#hSp}ՃgU@t]p'Ӌc袗g]{+ On^vo>m۶nM.x]F|z;_#.GO0g9'78W @9ì[flgՕN0;n3F=B=)ǫwq皜SRצr6wڑB IDAT~YGhIݨ?_!'$Ʃ *%*`<|,GVL5Pm\JFjPT[<[FPeIL5%=?CKle8:p_[n*v{w,Źnaڀ" XF.s_06S=ݑu;UT,e>!/d)&'U_T2l@^{idڐ"=89oK'9ɈQ 5CTZ͔a6\ӃtDP fGEח1oX]o4;m''LLcAZ֎ٹ, C!1J;o\ V#E}&HvAv$#锼rq/jH?Կty*)cN#] 91] <5rS~MfFL!lP`j`WU?LG/$755'łڡa`DOdXDi,IZ7'"6yVD8CX&kϘf-WA%gD9aSX{n}G13m}8A ҡׯmtxڎ}QPДpfٜ+qb;Mc3OQD;)aeAtty(e# [̾YKTE;=0jCdnY-'G:.]<#BԿB6A:/I<*#)*yu09){Qy%ې6fvĭ mv Wk[o?cuW#D"g]ʁtA`q, =gPtrJ9MzJ\F cc[n͐H-sR(KDY(LA301rYO΂6Gba&ۈx`cJ 7ّȄ5ȒGa^_~x. ccajdqEi^ĚZ;07`N#9 6>ž8ęB|庬V9;3t~-DE%4PSw›-iw3d\fwH矬hk)tNE8(/ǽl^<}, U Dgq|MSwCKߧ?}bn~-!S>%!#~ 3Ff8yc[G ՠ饃u,'u.IGΛ[6oMJp~CDO>bV + _!'F433}@ˋ.R\8 7!d Ed8`^1ouMQ*BGsʶ2Yi;yӅE}`'>RABgÖGOӰ<+vm5˚lgBYRb@8R ۠V/.qOibdrĵaRצty&fΕQȁE 쇣d8?#fb"1$ˋgƩ #Dubm! L,ƴ\VΪ ,Mj6jÆ1-͗wOI"Mjׄqp_Tp5rT"4ram;zW_ R]kDÁR BcG *J۩mz a*9MTv̝mjr ;j[5==k}P2>z_bS:, Oo~@OT^6pF;^;D0p:&iK 0z3Yʣf9gܩfN9ĵ3烎O% AU.,'H^z/a%GkhpG/ b F@HD.DѬPo:Dt複6$bࣖfD?w`Z aH3oӋuޓ(~!-sx('tAc6~3;`\1 8VD3vu9<AL N=HL`fM1O/%U=vl7 MÕE7eݰ;^8hgi/i[W`^-M{e'\`<:Sr>ѷ_ ' }~duz{rv 6}ޑNNF Hӫn>XLͦr'kãÊ̤B(E JDCˬĸ^219GWd\1UZG В#92L,s>:9BF,QDYFxWy9FecFF)o߾rfߌ -幅bi~9 iD[ UohI3bfppYo.{ƬDi>;8RzQ)aoQ0bJ^\* )u+ОxzWXr|hssh2}:op2!2k, 1HN10iPxNX~DWO,Oẃ"3g|(fT\z:iu؎4/šލy4q4@otעڰL G!A%0 ٧rjbz^ƍb#J3Kp7c30m<2|GX3Ahb,H9c1LO*SpY ^|rxaP,8թ9P߻/LG7IXSTŌFMPZ$1C e=qWIN7*`_z2U5åemӷ_2HRqO)s\W^~釪d+R8gLMP[^+ֆsF/ʪ6@WaQ ~%Uk186lByByiiSEqsLOI%K.L舶6gmlw<ϟ'|s(k+$ؖ[ zgӐG GYקo٦o~9n6h }CnmJrr!tskeq7yЫ[_^ iϒOXOzlq@znCV<9O*4Z! z,="zG*3D`n"J D&ŗ] M.Vq*Pti_AE'FWʀ_BU-'z1״l:Qጋ]]&5cR-kʜ J6~OOۤg"ղ&?H,i9T@p,Dōq9G04%lj∙](6Ƌ,̈64)m_jJ'x;H_ǖΝ4 gE-xt_9NyͪG %+Yb2>8KϯH"PAm:)λXjh~F+PyÑ>= rx~┹ZMJ/=O8~ΆxNkyq# O\ڄC] Ozؑ/ڲ R0| @Do@р;!@*ŢMj#`cX+]c>H7g՗-A@_1p"Hf̶V'T0|e}sM/`5MaeN۩E}M'/q@. W(S^T}[䍅4E ss :G/].JTd$XA2 A飯f".G`;O>%dtof8P`ceg`Q],.Va8Z,,,iTР5Y)IoӟZTvA‰$ rى<  # ąAd6(e! `$f88;H9<~ѫUy nN*GLhfO3?TF]W/_٢5?hw@!^~EP" MLdާӷ_<botaotm{>%5=G2<2beNoU$_;X # sޖHO?>8ە;s܌cҫ\6Vys֜(YɌ@]O: =߯zίzίzίzίzίzίzίzίzίzίzίzίzίzίzίzίOWq O0g9'ǹZg aT+_U`fC>2 D m|' Fa@Y< 5:r D_ 'Zl-AʺTazj8#Lg(Č$y3ȏT6@6V6 ltT0I|Ϧt$Bb`3[Ӣ^_ae@ٯ%# 6NS9]F4(ƠJrp.m!D!\Byx:zW4$0 $a ܮ3>]9l83TQU~qٞP7rScthpbcQ3o+3hEǺfk>2[l➏D5=q}<WUq[NJE[Ȃ/KK Wny}S888[,yAE~),3`FQw[WCΧ \7P55ޕģ pum{@˜(P`#nrA㦏N #BF_rTDҒu_x OҶbb D\"22xK8iwz 4yN/oXf zOrz@Ry`߾b`pXa3gMfùN2^#JG06pu|E|r) g0M7`C4hˊ̒hOQ`c0GWbVVrh&eNoaP3'IN)@XVU7hd){^~l?O/t}U*;Nt:3~pe]rNLF;S1ߺukxC^6{eF~M٥֙m¯sζ/)1n}Y:+ `Uǐvp+.ͥ)6*jlABtBut rTN¢m$g爥6*! J{44K`p>Fq[ljT9\*XY jt%U :TXQ(X4RUDĦ`5 n Pņ9pOmzOESdw΂yC᭬Af,Vtqܫ2VDzO(&+IoCdkOtjg跅f}Իn: +)s<tqK~$^~LSВ^qw8sI[sM(Gu:N )+j#,GrFkFKa%C7XХHKWB7 蝹MP!!y٣(ĠJT=}+"霂]a/T*sشec1p^'rq7n tXԡ^App2ܜ6G)҆Y43<'\9c+kv)q9) NJipQ ]`nWEes j"6ȓeўS^u[pã#?-d,؟HlÄ1ۏ+D?:t/-vߨf[0ixNX>jzN tWO?)cZm}ԖASd%gf=E& 灠LsplYuɆrԙZWc7Vw|-/(f<5y+ g?JTnh˱!oX^Z+eyv N,)J0i&FPKCo @߸p a2 -nRNDm1XŴ+5ר/%,g@EuBSxa|ä^̈r[̊0Sw-^07/+4KQ顕ׂ9UW!YU~TyCc)1 Eh -ƨiU&Qxs15\]Pk=*@BO9;壽)Йvxڷ@n t~ݿ,Gx7iS?À[=U@Bb3sQu^U\SDң>&+Ӓ8R,d=P8Nt8TnOlV`}G60%VYVY8.8SSPze Pmb$@ʁ1& aJbJ,Te*Uhdv%)_RfXcZ+:r:u5 =80Xr7M%Y˵c㚠aCr82Wm/-{w-jTs3rt>KֺY UD=L5.ⳠE- ?0Y9sm:1 MJEQSJU` #U- .ZW3AW{a3,F~;́NTX(Pc3y &tG>};eCG?wʆV#0Su7d<(^r Vr=5*~kGT7>WMA!&!ey߉#F򔧄׼5<.׷-᪫xw~o8|^NՙtfnmJt['BGN[\iqA#הP(ū_䱜'~D h#F2+C\kT$zv3xE:q~Zˋ Tϸ&w0Lʌdϙ1[o(jb8DuQB$#a#_[ӣ7YIسft2LrafiOļ엙y9C|N4#|,Io7}rLE(#Cf7F} rOo{\995eź\gpz/B7)/ih>ϲ}PmQ]E/*t<Wj%?-Ll+\'oqkrvR<ϭݻ7<9i^Ox]QE'c[Iz+=m`.惾lY[F~pTK^.GhU?g_ئ-rdsHॄ_u)nGH7fL]vնlRʰi} /p0xzd~rb,. 0ΑD3 $!*^hѮʪ/!K='z@ޅX^01_KyrTqֳ43 M(*&7DSUʣÍO-9)gbDd/k/2bv%VE O(af+MW+ հј|DOT3z x" Jt n: iUˡ#%YRmLλ­7\βiGԜ#6hh4`Kh‰bKy|V eQT;Ux]ύbY [1.%@'DC3M^Xˋw埅?~·=s=ŵ_!@wŷ>a嗞[y{yUz#Y'?=6vWwWhs ʯޛjvT{N edRD/x\ \D CDx{Q!y"x@ҙN:cwyVU@҃9kWV޵Ukg?[=|sΩַF ?1yLm۶zk^ B}so{AYq,zmyW?N]nu6O#oGw ~']fQ/u_s ,7H駝>8J^64NGa2h]S:i7 A%5VM+}6@+oX>};!G,⦲$P]" LX^60[~)XĿNnby/8;3_\חҮyjKC OR%6zvOdἀA8ǒ qP!-|\%ߒ|8@N@ S]qN\08^w5tv{w_7w_[/\ͿvuV~=ՅW^[C|w_yy}P#OzL}9j>>\yeՇbh¡k=?ԼOW*~uWc='atJ k<\E>wP7 ,RW2FĮo|)|\|ғtE_??1"=oPe…Kzիʽ't+ #HgC˦/aD.SQYvޭqyq{\uqDžA^u1 .~W~%(o~sa,^!;7~77M޿??d낌W]uU|'bi%/ cxFuVOx|@gg9qm"uL+.a2z__aIQ޹PW!-_+2FP8 +O) 7!~ n9&fVcXRî&emAIwf$7o$|깤?x&(L%syL"܊bp\WR%rP%cPg_U@8:L‡9_>rECJ63C7T  6vlnڌOޅ4<ĆPO1J(&\(a%[sOH/O.C9X+]t1\tnrҔXc)Zk|ꌀ;oiP^R (GT?{Q~啗Wrgܟn'DxL ۺz/q2zO)y1?˯Sѧ5?VN=K ^]Wk=T8+_>x/2OnhTd._kL*XSIfOj0_OǦ8&y.[xHHvp9N}Nظ;_9._-rt7@> [KvD<̡M;Sx= ~Ri9,(ܧ"!i7cp>80Mv#zdw5 *"-E,+NǙE]$}„o>%s>gZy+Ċ¾+A'>d%^Q1и) Xq3fO7md@1nU{'$v+ Uc 4Y fix Bbn.z#ZमN unj:JQnV>T~g$~afMu5M~hyuՕW}4$b_U+׎Ƿ8ʷ ȜvY-OtsKǵcwo7QAx>?,N=T΢S˅\Փ0l02 KQÑe)O<1 ' h: IDAT%/|OU~Wt=@y:na PW蕣=yMZ׶1/VfX2+51஼Oe\~+^_jk׮*cH3Mzsi0 /F=)O ;Jt=Ҁgqc|r_`7~2;;8mr/ç=i5Tu|y>cK~v94?59x`ӄҢ(M q(MwlMx,5t)q3HdnBi5L!VҦ5F([2p8φA!@?!Nd r'e$URYչLX_quͷlڲڸiL{k1oH/4{9M/gy2.PZ$Lɧ0bo^c2 DYO^'o'^v iRMJ.Ec!xHѸȥ!zduuq"|9BFt;TyI}ńo$#LoN'=awMA[7rOxgj>py/zø0TW5zxG1LdjB.tqjy˸zx,--i,qU.Y-ah,~Ї>4P1KK .ቪ cnI:^f7_:`s瓾Kzvc r)d|_߇YU<Wߑ˼W+or׽ukC3[F+cJue:.l%kU[y:Wu{xa;ي.# !n=4555}=٫q_;bHjмtz[=O55Kx5Os *aHNXi/&/ :*R5'0z,Ū_bIgPKiUj|cOGؾ? |I~cAYy7 Nn[O} {yKgzԣq>Y;L8FenY²Uc|肯H}%hKOq8@j dXV/T~ oKe%5r̈́A/"~_jb2-+ԭuUx7ٯ`=AA-$/CiCewk r]k|?s7\+--Z+ozݨ, G yMuS-aTO!۾(B4!aBw??Q^i2k`ο  1mb7f 3Fv\J./hWʔ3Y? !E>KD(s2eD<_Z-ߣМp {n;@BuM/~+APϑc,$ēs6RIeF|Gr .(Vy=ڕrddOy tiQ[U'!2A?_|U%7ҋVɴ Iq1H?: î!UU#`lp#Ϊb2CV}C>E8}k#Jc4vE}xvOy_1P=`RxNxc]ƞK%`wËW׏ǶK3O_}iQ`ah8ծ69_;IYyUnSV'>rƍe: q`zx쎭GĻKShrGqMڒ4v`N)]X]umIaI5X:H"aEM{_05Ȧ4D ʩ{%>Ҷp-|H+mi ~p㪫}Ն+.w͎g0v `x~`])<貛D(qoRRo kh#e:SG`4!]Z=>'h<2®w ys(DWr^wVÿ[q*\&$מ=|\~~/+ljp1j}5FٲX_]/.KL֭xt3>@d{5BT|N"% (w>bz-I_짶o :ӫw'nV]?`]*߱~5/O9WD~ >G.m,"M9[%7!A#P{R_N͙RL(fpv&۴8 2@yR qsD6N)o$VdILp&0h2٨ !yb!B^aɐ2>dܞg$BLe~+ru74{fqo7޸qS:JGc"uK%v!ǐxRjK]#wب|ǎrqYEcxylxחR!C]}7J /x#Nf(/?ԕ[U_ryoI;S gPw tc"-ϲ͛\J?^JhRaTSi‘VIhbg~9NDCjv7AEmu6%Pp(Pw&)YVʱ1ӲO+|"ǪGǖK5>V4I:>E4nZx⮧_]4z/R͗kN)^JyA{ߦb+}.`@}u%v `ua2ZqK#C#Ջ5TYJ|G}ļg@86 0HAa%44J1&JbGΊ({ 8 r j;2` !Q: C<:A_$*:FG0F74cu=77]OQ&tavs)< <1Fhpҝ6Jf^cd:Íܠs۫>Mt k:%9TlGk[zA(JۖBʑlHZ.sG?q >_¿Տ~6y'do_~u.'Ճ(nN$iy}GIBohn.ΕcAU=d-זbwh~W}?73(:Z]x]>qCZK}G 9BN{o;LN85iUqoP-$ǰvЪzò<͚N5".m-x gwp=S ī-H91cLR$A (S2\HJaF[ _\4dfxnW6c/,`|mxfZ6083D}nfpR7 2ҜK,N<(v wGG9^A$Y㊾UxEVCx][PǨ ЍnV)1TN;ǃ ŗ#"mYR򲄙~7>='(pЈv)rqiŖjwXSDYx/mpɎ|,dP:NiU5پYj|]wx\*uGAU;pzo^`Ѧ2i`*Ֆd܏B :X\8|x86S\{ݵ='|2nc3z-C3f3Dh /$Eɨ$V|'.^*<xxpXDTQmLQdH"VҍƗۄ:TI9G„ I2wh/S34ROVUn۶oxpe!uz O,e.ɨI y_b%>1Eyrx$"Mj=e_ME.*?fiII$_a8(b{0o=( ??.)93*es n])/a|$ݻw[n*购[}|?( %N?e._~5=c]`見Нeg.aK@[w%?}tsՆzIlv8' bd"=|&l/HRA9Ѻc1(wWxHs&>86.t #)ԑ-Ɠתՠةu1T,uVm}qu^rWo+kNY-Ow]v=Ȋ^_:i6~r|䩡6OLkůM6a /UW_J;gJ|rb( $8~O)ƎkV ɟqH)ں8L=U`H 9a-yJ #GC \[ 64l~4R,& 1ENЯOL:8&{!Kq7l* [ ~^pJBF~wʣ %E߹#BnS>~"< 4[+~;_97V*oLkJ"{{S{ Ck] %u) ؽr Rx XntꋐG _ Wx׻OWDXβ^syog}Ȱ $ .R[l6N IV~-jhvFB(lJV*5˳sѺTȄzI.b3ϖgݛ82a}z@+ 1εlX³m.Z.mQ@+\c1ƈRo\,WxYR*/=U򴮿4ΊV~^b̬c܏=~N}{I |쇏|+GxpHO~iHqnCM@{P.]~S.59oԙDdtac 4#<6e!&$L-N N{˶OT~ʹGV0M,QeK,#t;旆}[M1PjފGӣGFֱS4 f*E"#!JjL^,h9ƱW.~<5jAS}߹6/rdPZ/H=tUo)W0~(P=:oFXQEE_RE}qHƝ0zGGGjЯ*.mAQ(%zA2e38i9[__wltr^1q#s{lQO] CYaTK]A)0V|fOTl U F[oI}4M&f dcj}VО(׹'Fi,!J^@c6a /HҎK?$<[C)$%1\^Y Qn]y+Kh32b{n;H?fbRxS (VjO24^00%zA臏8s3`Y(6~v 4OK 涆P,>8>4se鈬%F%_ m-x^G6]+Rd-F2B)m银ذa:5/aH G e.bh8*`ཎujw2ڱ>~'׽e.P ˹G-cd]|fUbr">͋mY.U ~;ErӴe^y&Lݸ f7P }I}4]2+ԹgߡpbP7E ݛhjE14p,\u:c6Hkɏk}+oɡ4)ǠUgEoK6r!lr;Ȳ^Xfю[D#25ex|]i8uu\?:>TsCq;S߅6K*w*%=rCCYVw^,9}2]*Ј`F!B0# ' PsEkTh;x;RV^4RV'}h87yJ/ԛ-Ɂ44PvL F85bZW#EŗN'bG?m//)8FX3qG=&Cml5Z,AP+ =-t1Gv~҅UQGӹޗ#:v.ѥw Uqu0QL3veM݂HcxBYe ,B+a-4HqJ)2jB1;hY1k ɛze5ٰ;ZApGa2l]-oc΄`T l>ؼ TƠ*@h\]; ;c(w HO\n):[K]SsEЭO}GIy`We ]538O_IFAKؗkl xRd* +[sV/8]|?-q>!ɓ!2! ٶ,H],%#Ț@9FzBpJ|gN o-Sa%_VRZ_Cc[<~S껰[ӥz1q)8ouɽH},jm\3 #¬[G7c?]5Z0[=n8q gRU;ќX?$N䅰w`97LTen^Î/C#nYvmOy"/&X1X{ցM 2~![o޸nL6reU9J+L%yma>A+n@",gaP1XfFMѩ=U{m@x{0@Rv*i0dN#E 7:EėG0i4a,tV %OfO\@kȗQ.D?vy|ᱽj+@ѐ_YUz߾}gN \׃7j%e Swj΢E3^“hƉ֩( @dsIJIsrlD}|;1S-(lҙ/Rp(. J/K LJlKqㄔs{MUv5q ֈ/diǘ)uƞetZ 埱Xq.Ol@6_i,.BPp'o;HӼp=g+/^x<:5*YRO(ݙnTJ`~J}^e`_hue{_||!Ll3t3U^-?(li&Hj6.JP#OYQIQ)o}uaw wʏq\VUk.ЀjɗyK_*Uwp_]%߹DQ^?ޡ߀դ\KaGV靲Bσ(6׼[&< ެƂwR+%{Cw {kh61kD,uؿq,$LBrFS&)4$P0zjH}3eJrE#Rba:,ޏ:q!hAEcԥdĸ􃹄R0;Aa :N > b7Z dǖQ677KbKD{`鈣c G76EC,2Dfzm6e9Uuj-SFmgLó;/`|ki\*fU zĢ<dB%h,EyO.T01(z4YVRtO>׽O(\YתK!03tu 78μVz:1oY9/rݔ~8;?9=-2ڐRe߁M3Ė1$[e-N|dpþo׽d7x0J\!i?i {JR~zYTLYrL.##OᓸͰ/ 88Oq@&IҘ`:!Wx,Uy4 7Xۅ?RTd;JtÉđc8_22 L@3FiIWI\̝XӢNDx2ouxm:d۸H9( YnocSyKM AD,Vþr/4ajkn/CayIي7x ̑4)m)eG-~(HSTU67WG,,ɬE ۬;?1gB[ʽd)&4IѺ;'|GGGca֏85u£z_%+nY_{W oƊ(a%֟V0äKt5 >JQP 2fر};v<Qqw-hZ,7wWL{ =L5Aԃec1SF\HPQzo'c&`wJ pĸVpANF1] pTe> )?XoӚBG&%E U6Xyڑ$ jhZyXj^&$-ެ0x@+H~\jZ{nLzLv-,*0E@Ē0CCa?)bs [/0 *lKRMzG373,Ny^8m MOn󏐤Z8@㡎tE=H5&5aWy'gzn]GIk^:5yothS_(Ew0XWMy$֏Ԋ@A,.]ntaGָ4;ܹ3aeB7~'Elћu3M 3z \ >6OԣCnw!k94\pNCjލFxaT;4t80?GCb^bӆcv3P,(cI{B>JL2 ><< /Jbj`$*CNfS⧶Zȿ(V>&ŜhAxzj̓:2xf5U/(W-KC.t!g/*Gr_hxBdLcߝ43xF@80RClHVF;ijSK'yw`j[eAc>QW0D~9^>z6F GJfe((f͘uAG)_=Wg[W˺wu +^?Viw\WȦ<˺u5J.1Nb|tzxM)mRoUh8 8S3Oa7r 4B](XZINw9~ia~\Ѭx\[|D|mA=E:ˮ rG_)/+kP Xw+7IV|&V>dћ>F 1t&Aq(P ``s?<Ƽmz-7G 1s,&X~x}X*uPU R~0b 6Z?B 'M.qORZ+8n<2hR5p$y] p B^e-`!NꈺX)R_AKϐ`*!_6"N!O/aJŵ1D5HG"ŧki : yZ>U&d'q Eb|o ){FF7 :e%90BaZmՖ-[kfi̓'pB5U1 )'TgzFtTE02Y2<ɵtnV7pu3?}31EfV͢0 e^oNىATr7r\Ca,ń&]M5,W:W&;["A~tc Om֘A41eQIlm«`zxDQx8^1F Fd A4|WML(HR[ڏE>e|WR ǰb3%Y2r. dEwq?}@x4(+d&ɟYhtD{Lg|YQY |!3\H?u?6Jr.1${}ȾOV>$]%ŨR/,5oYSZAOd/|@!9SA.JG Ew ~.B ;e#z?@Q֩_ߡō|Z'ID&s]?|ц< #<۶m[ڿ}uWi8Wz96ʉSV CO0+?߫{o%.Oa?(^`a6VMlk6l6leҟޛ˶fL]@~a@,α! {c V11lY$o+Oq %/ΪO=kwӍ7V,=g> k/yi} mџw0Ko~}ꫯ*UY'< zȏ xj>O{Æ9}^ZsگZ"BSo)^yET?ԖO(Xl۲wՏ؏/L+{|3Tv*tQzT<9 |!umZVDzi??~;ߩGW|ի^Rg{Q׾[S(ȯvuZX8mY殜Zԯ_n.¨.}|/nS 'iӦ+rO_/[ c]"/JS'4Kj%|:p`2 %bo|flPqx3Qb,S,?غ@na`s8lS~Luei:wqTŧ>p4'7M5SJz,n<3VD9K1q% |h ˃6yH1UMl8/@u%1`ҌkV(x{1OQI< H4'n ۙ6A=ʩM9sHv>M`BKtnHr(K t^"$8KI#V:'1I-1罯ƓWΣ0մق|+ R):?W5\]}_n4NaSS?ܚ)׾E/~Q˿D\}M*:ԧ>w?xC-9%/q}FGyOַvUoۋ곟l;=yK/{~gvD+Iz׻j }c.]% ͲT:*uH^?/"lF>2+p὜է?iQzғT]p4Q7]~~z+_.ʯ77ۿ0l7D_nQZ7m2^tEW^E/^kV{~Bz{Sя07[\/Rqm"߽:*pG~{I?Q1?T52e+ekZƨ*.G(IxCvyNA\ⱌyc,qZ̍;<TMOMz̟L1ա0ݞ`8&ٴ 3)Ϫqʙsoۄ1 6sqB5B3.Kt,-TM0xoi<]y趙zjl535WbM-D~ Yz}@uA<sl:`0쟫o4]vd\`Xagt^*x*xlYJdYJIzeW;?ZoO_W]}‹dl]~eNfuU:A%\BPjfWzd^/8 [We: @6l`QzL刉G8͹CІB䤿WixxXěO<hN;es}\:>=1Ch_ʭaViTڵ+6RE#QOuRoeD7%\Iycm:SzӞV}x#e?l޼{W\7P^2t]}k_ za}{Z^뙣[e_qc?R^S^Qީ‰o2a YdE*!vλ%7pOֱ7*dq/`TʚZKu=険ڀ"<P Ku{nn$OU6N|a25]w܎[̌Wݰ=xcfge SMDu|20\#ĜFkƽw‘:- W"sKdEYm\9,Jchh9Gxh |4P>. A=P٠%,8q FO-,? ,pk|QG::BԔ${w^p ~am g'3'믭g/[2ȟwyե/Y@Q! OMpa\5Tx__sνfm@oL_ A5iU+ KW0Ǵ>M2Y+Drj˹9G[ٟYb9KV]p y'ͺ"Ưp<餓:g){ge+G>P˻[PYgvn[4|WR] |_1J ;/0or4m{ϋӞRn۴U*᳌QK0D\6#D =a@9=F/k'y2 *Eay3 R) 4C <`PN!LcUկ^d9j/yYejg~\›DKWI1 /ebضRnWx+SMl:Elyei\W`VUj#7$Ws+wy5mݻ_L/|2{߷0yummy=>x lߺFd=}`bwdsa8o29c~0``T>>A6Pm>~޸cCŧ@覑jdP=!1#}F0|`=@c웎q,m&:'v%2^#7T1==WWx&}3,c6$ܩcjMek1!5b6FLI; +)M1e94M 'rr0|"Ôw)904܊/4Iۍ0W 0- > <_4غs] ˀ͞={jFj)#e}s0jyVs wU|Ἄ3=ysт&l sK1֭|ֳZov-k=,Ï*ٶ3F3(rpLXwNIRdQ;_Na,D}!u9k04nܨs|UM7V4mpq*76wK%B`x=!xT!&kB'n<ޱ1E^q"9@ LI\);y+ ϓ4ܫj|x"9ū@gŹeOSF%5!'63@ ))q)ϰsHt3F.N ݅[OJSq^y@RƜ/eMh&FREQq383_l7|][>֏yCG?5135N-w< Zcms{ߚؘ+_L[)#Ja@0b*s<=*X$vi~ꧼ8t2 2g%1x11ZZ3'=__.h}[^TY=C%+45'Ɠx/t{ȴ* Э?Zս遃9->gms.P1 sKQ9*HSV4>-2Cy6.O8fxrشojz8_T;;)pC}cócƪBʺZdjIumjOF3h=zs6+mwst[~8,lKLhFyH{+Xևacq^KcLSGZ!?D%~J^ƌo'j:jNNa\&-+x6eQ^=q\>4VM]xa-é>eWʾ]K3 1;;bguiƽ'(m;eZ|]`TA .@nY6ua'b(I9 Lp/[UgS8h3ׅ'wsb)57xS۷V;OGgM(`᤭09/z~r=Fxl9M K &eeC.5n& '6@‹@ZE!6bsqxmM<0bJ)NJ=|B2cqqcYztzkU%?cx3m%&&gȢ $=V1?˥LKaP~IiDy!yۤ'Jf莥^~A "|t4ߒKgEDʪHVqjʐ?KYia2(4? , oH뱑Ŏ'>;vK;{rX?Em "2rIO/S4cWm,k<-e(|NO"Ru pv"kp^?=5-kouaB{XՀXZ@.`W+;nB.򵁔<2kؘۛjUuƙgyFҝq5 {ϢfBab̄  =N{{=1N3 Np^сAh[uo !% d9vZ> ' L#졕޹̩1SΐN$"%?_W >02F:Wetys 7{:*K#‰0˺taF]1J"tjV ?{7L6Gdb$~ĵ+.,N^Pq<Q*aLe|"FM9 +'PWC]u E(q5ԭyM9{?d]k'ZOtG]%~ $Pbqtј?OybE $[w3Jrp2JbS޽;~q&Fpv6vaڲiB_ YBk1+0^Km0mKz> c\"xQt)y6y(uu{~}Ҏ{ÊmyzZW {_9Sw k'YPE\\dWkGUk/u v>Ag 7A&ٿfU{ ܝxM7i=v쿤q7׻/𮻘am;7mDݫvb;٢Ub`D"3# E^rblY0H,2tg,R'Oáf"6*[#"ҧ sc.&PUF@s4ҞV< m-B3sp46h$'{y3 #i|jRZ|՟}j:$.p ]xS<H)iu2j@rd@&v(CafN4W+(Yמ[PM>z Cb@փZ& I2Pʥҁ®o}~:y|G!TkPvA!Kܘ\]kfT;G&]"ng#jm~1Ỿ D`C|T} Cf|gV7nv^pȣFL7ܰ14`D 2(ӝq03klڒdDO )nw5;/0f2S_/-8b >$cH 0Sޮ'~n=Nנ9pde܍{?#\@\П`MCCɭԕA//fabfzMc yB: 65 #} 0M^:M:5\NBh,U#ПWDq+Vlb:x$r'N.˘dC9[Xkˎ4PJCJ=EM lVb\٣. {#<#I \YȦԅ&>~k<}Ov.e DtaTZTaH]rlˀ=M=#xl.,nnL<Ɠ+淾U7li0==]m8QviP'bK1[23  ˚/_O}6E%A|B5ffo&|_B쏠pK)\N-\S.Q;A)L0»b_'._G7j$Ty/|/qqfM@gy9^A;+cq^V^`Bc>8@7@z9.xS F و,O'`p9GyLbO%+1cr &c~']w8)צݞtM{0"u !oXm>S(mq||ΛbD8D]=qc&^/4teiP9E\iVb7`9HKm(T;mkiC^{Kг~֫n-.<1f v1N A C /ރ;jx&؇`ƒeKeo5̺uo_K-vﻷ29yTV'O-3p#=jqq/B_~r8v%76ԓiVqC6&;{pLϷY12=D$-CoEbpm f;&t )zш8 E2iÒNT,GACpZ-/V_jAjPTb o]v,;m>'e.)~*O!RgJԂi Cu K ,1f¢:h#Jms˻8|}y=9_q>^ 8U!IsTD0M\B廜cC 'P9/~r,FfP7cƯ^1ZTw,·xߥ D;IE] LEJePG 8ʓvX6|Í+UW]wK.TH.u'Wk^Orw+tL}B:&x|K-E`Ok>0%o*Ґe-̩r,傍H~|rߔ+r1}.tylIA3~O} M{E`)e(2QBu_ȯg뮻N)7c`N6g%I9t貚}+؞'^DGbB$#!&Y 7qО*BM{eE=ږN8'p('%{:?(G <[`,mfeƸ?#剾Gp_sRb/TNq|3PLNԳu:-AL(UhNDȞSi;ͥ =DO!flFeN.Ob5(_ -p:C'2JTa&=&m'|<$?BTeTC8DD~! IdxMAmӌME7jmTvnmu w|5 ~_yr Q1>G% "8RF!E R+R^wܩl'-1f!XLv 9λ% ˉȍh!ir[>/[jq,<#X=4[\ 5}}AaX-B6t}ơUj)&ثD5iPLV6=ȴlLV''b\򴶺JJP2$TPs 3(-bUeB$9Ri+/^8ކijMg.mlO,ŝB廦mABv6 CKT/&Ber⌘N',mLByҰ`&+I( [1?N`Cy2b'Y!qm,RqݩtO 'z oMnn?Xx8+l(#+^p0}-v#EZj@cm` y4웓[&K{[QRj+qOn<Q&iFi|eDt,ʠ]Q.|7 WM9E|t=)9u碗r>PmaPZƻbw/8;;w 7l<9 96v'֣>6ef}7\}Lmh"Ï>T=ăzNJIL@b}fK/=T?v jsuaQLOK ժOi&W&"Tszmr]aTl _ڋ?,۾JAV|<||@D4>QMT%z Jz.aI2X9!ed(MˈpUȺ8.—Yfw qHRE ͕ P? AjUee3^WrN0 ' w@YGvFe:'馊trS(\p*ӂ ef{.} YK4_XaBYS }C~+ӿX^/ߓ֭DA k/8*yɛuaؗ}}k}+}"Se@> ʺ$L|lv徍?F.Iܿ}>JZy[_?WRzi\n4-|W_+q%%璝Ll'*@~tB!r24 UW^^=ģd .9^-WusJ@8H|x DU5oi@ 2$ 훫A>Y\ ̈́v-9dl_&ϘVTRHSxŋzj>]ύ{ǫgfzS2 39\dB#m2`Vl^((r˃#L$}At05#MFM*@"V*k3?!(^h?)vHh9XW/zB\h֗*s&e_+RnM+r\!R EM^ef;ayݲ) LB9{mdӦq}|*O8ZB!խ8iuBIٓn9O1 qω׾&Ȼn./?7#4~wйk>'%u'|Ouw[cb%~:mr°n;|Gg/xPrl;tIv,>9r$̨i0Qz(@1@=zw> mo5cFW`b6M~5֧g8>nα>Rܥ#04lRӢR-Y-6źRUrfY'm*bzW8;R@)"J3ϒs1}1* ͻ {ՕT}UϡrbCW6e=yT)11>T,+<b: 8 d%}&UPP*75*tzI;phǥ>-HN@Gvئ:f&BXhW{ QN?%?&8pfMg[Je N[S'|ZǼ1ٯ>ΨÇ_N-.!OuVI!hKeY,!r@9bNpŌL>M#?][] Z 7o.VFe'+w ivqHJ _;53e~ھbҖ3N[?T~An7ʎ$pI5 2^~wL0}.i0lפ\K|CmBeע<U/<>,=rއ'v5֤m?xudԓϸqh#AYXq2q~+T}uG>XeDrji ofN>1~$Q=fo Q ӵAeɂldJ!Tb>OElsgc{ ߂'Vy5?XNl ֛NgW{t4Hri*-kaJJeH'A ')tϩKA8c-_&ܩLj|D Hک-&_qqC,@>4'OBf(FH(')I:*̙P[|ٚц`j}}Eμr7XG}y9+u*[n:vD¼NT0 & @脹'N/V8oݦN(O8f̫44*0J[G܋M*Ёۯ\ WIyMD\jz,_sy}VUۋO63,q%i6(JGkiM&9 դ" B)9 )Tuu+g1+G"Ђ!M/moTj$Jf߽kُnY`353]Oϰ\ƥ@zLTF襓IlbzeeROn@2?54Q1  $Ki{4>MM՛ 1`I#|YV,VN Ćj@j#.N7*BX|ھ&ęyV.1PhϔV)F%nnSO}8|kcG>䡤=\uվW}V=,]Wƛ{?qX21`r[ E59<{T!Z>IT-:&'t#@g sʸr#iךEY\/Bcb'j|1A88kD<457^_>PM.N}Y&'dxW(cdo~zNre\BtR2H*w`L4V6煶Bj81?U%'Kڳáp=uL7P უnYVQ4OU%Q㡒˓emSe[8,^?B~'eI% 5=)*/ɨ%4VRQ(kX&-$?h,q[%uܳ &:0w']=QcxK/OvAVCW𞮙/T`H eKa![%8<+R>Y2JZe%uJpYmoă%x,TG%04^/t,W2pY\O >$ue[-t(D 1`!(^?:̓ȀE6ZA{Tt*NTG?4>tnSNT|ї6Xc{?ٷg!tI227p}}=mL -bcc+*Q.&Pf38#㠭d7eheLH75$8e{w꿓FXFnr\tOrDZ~N'ȳ^cScc3zJ IDATdo iZ][FqzE*7&Nӷ8,uND%lRN^F&y ?)&*QhtS6++b/]QxeM\TT<* ESKME+IJ_P|HB&>B* [՘lnPhBKf [P'/(ț#>nUo)g9I* N}+xn~]ѣVGToܶҎW:hťR2Ny.9~?:>(a@Ky9Z@*0Uʱ0:.r 4[yE;i^@a~|], q6/eAS~Aqv.z j۾:FJGi^˿5q;rj3CJE7rN<'\nm>hD#߷gekZtTrr G٭˜h a딹K3?-hNLM6G.1>z(c,ŞtZ@2ԏ! ܎;dO5۷x`>& VOi}z:<^/`Mca1Y6J: u hPI!rtBDL,mb:yjZMEAY$ wә  $i6Q,iAWz(TNҏ:9:'cDЈԊ >8wO(7']'+Af&žUu,kk(j4gesf8LNJCS &<$Yuۏc"wԟQ|]w~'oȟs_51ǎ>oz___2ÿZICXY0S_ȟ;fXd\}]wr}}[i~y|k^3Q1x{߬U["/??>3`|n7IkF$n?qt]TY>2=B Tōàyy @U uO3 ݶ mXO<{bc9E@ KG(mg vomm%66o߽Q9|ĶӧN4b2Y|Jp~?78}U:TH43kB2坘@IQnfWsaaVq?+҉333sţ3Ǣ:sLtg%+?CàFKWy3C{{j=ڠ oխĢ!yUofO8=Ұ8TRTrMFZm1N7@s39}S E(&=G. j%De (5RzQ% @GY)2A-k67{埛˿<.wл//k{i{a~~サyԛV^ DW?KyeB~~l#}5__9:xu}{_گm}Wu3T_u_7b[o{7 9xl( |_.d?> /(>T__XEmR^o}[v[?m.]ρ6>oy[p_;J:1~ᾌeЫW.P?޷-oqɗ~tq?Hs'B#)'Bמ-bs b͛A8hPg'˔"2m' ? qLV(Dq\m`Cskyr&%YtLm|Nԯԏ<VՍ/?7~1oo wQUV,t xKb'c#߯?wukz ֭}U_%_R_)kکQr7KթyӛDpgg~~( .(RCc kV7!1U--LYb]_.N[]zWkX&OOE^ѷMX~W~l?*|0owY=tn@}}*Jr?Rׅe/;'5Q.iq#1:9PVBIօ?W) pVr5_QH_ }Z4;uu0  IDrp j}OLW:Op 'Qx'ƍྷMEisbpny+i&qSI&bَ?oۿ,]'_?*CC9j{gկўvҞ{Y6x;p/ꯪ??.w__>tM6~XyXs4/w{B6*^e\P&L[.Љוryu|;39R}y 2c(K7TOݶQSBe_~n?gwp}ܩRq~ @y HU)Nw=/ptjbV}Qi]]wu۾?jo _xni.zs,4UPgbCqI&uΫΜ:\zw<Ѓ<>(7\,MOò*nܥ9,L%($8 ƲdK9a;zU[Vը5sJBdz:vL#f>R98ݡK= b]o1AW՞fmu rvr~u1h 0\>+WZTCpmV QLt*T0hCVOPQHʛIE%iFYQF@ʖ%D0EEC|%G2.WR^a'mKJ-Wً+I"K҈2>0N=|DA9r_SE@|IbЛQUXe'7 XҸNgj$i -뮫ecy_oy__MROOg&*ķY>ooeA`Y&kZ9rxWhEilCoq}gvRnua]/4y[v5_5f {RvcPnwr%:4t^,-;)P ;GY>o3 eɉd3GO}H8Vs7WZGP|ß7;3}c&@ïu^{2"o:y>|H}MnJ>YrHO6N=xwjpNMͷ~뷎m7|C!SPQ2)PhX*MS 5L@˛+Aw'>FeXpC[ 1? kg^v|#.??w w| BeJJ{܁U9kamˇ2/ _ҽڮE/Li7}JoliJ>!|&bDӧO_}UխD\{51aUI?9T3S3Xp6n6P\.fITU#f С<3}}ĔZ9ja ¹e5Er ۜQCԧۖu3HPQS#F@w2PzZLuQ[Փ?S=s0dk>j+.GJE ؔJz.ի|lOk(pAC<(ۄm7UlÐ AW,w%U6\?,*iY跡%m 1oŚ$G(`I(R|" gdE4ةSy >QvT6N&|>J2 XaXK>E'i=*7/ηҽ|J(O.h*= !$`tpWzu~÷ϏqI"h^{ {gBl\@}nMyDWzԼW׷r+~-?gm>l1OT|b 晧dh{sE59r!bbS"kQ7tY(ۙ\[+@2A5|xM%:\>^O5+L=A5L2м AZo$+LX(5tTE4|e&U')"RRdP9 abzbZ>Ojq5 P*ZmEBFYR6 4:ymXh1T)TJpdKU%~ u^zh#>*P(݄;"gAM孓Nš޼KUUu𒃁M=Sj6CJdXa+EOӌޜ%+ C6B3@jj oQoҿx[o#́ɺ>xP5V?/~M^2gq[*0^2jc) ۥVK5-59q&H')B`lE큜U.V@/^cVII?* !eNV[4# Z'U@nh՜ɋo̹J۷XODM0.m;Uܔ:”A`BD ZXA\zAUHR] `ilr˷cDH+`oe](0~Qz+$ xpn]mℜRAh[^ZZW狟IGH% Z/PcQi ~˧ðկIpZw e)0+7j|v+'Np05:z7 >?(ǤOYZ|Gqalm6k^re W_r|&lR#p& R,7K+D5[/mֶI,N{]֊7qsfd.Yylui IDATG@t?|7VP] !Y{B@iPMOl1"'.o%EFc`W 1Ra*Mؤx1~;@(}>8!hFromם*[:QMr7Z0/9eU_H>JaP(X%A]l{X-GGDCє1%rݖ)#ŵʽ3-%JLxB)rGMky40.?>)PЃIƊg-zv Ɨ%$H^y\J 9; A:\?/?v<Qk] )/pZO*HmÐuP |u˺χo%KF<]T/qieK ^CM qO8s/kZj[߳}eW'\Ϸctiٺo=iWqרi}jFrC\hQ& ZTo GL\^ *fdbJ5Q  yؤ&_,NhҖAL~ɢdYFz8mF+"yJGň>971чLWҞtw=ηW ?FG`se )-] ME1JT&_tJ,- qW(FfGA=)T |gJD=ؕR ŵ{OO}MCVr-=PF|L8R)+G ;1҅v_?xďBle y#5~%Ǫ/^uu=zKj -o-j@bFDwݩ{Unl_JJXw;?V9ҹY<{ہ^v[:sbub?7FP~UsG6T}!ݥ$cɌ=q^  }z|(.ևt}6aľ,˜&2((>evÉMq뉭zFusi{QfT*L-!gIѷbrd9tJPkdZo !z | i\-urϟcƉ/)Y(X6B#gȏ˫`KE6("Tf%*M.)|I^rT(Xc~StR[ bFm6vl56KMS(ڟO1#g%:ۈ">$OQ\JPR`ŏ~X t6F,xHPwV0Ip-ߵ!rm BN/L/v'H~1.>X(:!$+sy1X=21@IlV0bqt |}PTz.&|kJ,7F '.8mc:ZJ4#Gx+h!RƏL2oY/mվQtXpn(J9=5S,y:>{pQ:#fQO7W+eb Ϗʓ0'1 ʏo\ Rz~BN(Pj (4Ñ KKol)pгJzIyމrE㴞}/Jcľ'%dH%nX/%űPgFZOBQ.K^ 0 }sQN{KϾԩ%! Tg(4N˷C$TZO-%Q2ʱԦ>A)PZFe5c>ˁA TAXR7K5|{.d3߭+eH~eEt܉@i'.vR'<e LG[Jq߭}SoOO-aR&B2A)dERq4o2 ^FC9Q`L<>y&a 4E!ˀ' 4S U0!uk}Kr5*'o6mr,֘ÒTE',Y D Z1"AZw8-xԾ #au"oM#S67<9/NX#$ml" zKmEЌ~Pk{ #SAo*rw5ì}dFIG$Ò =*N0;Uؔ rfi?#xty|J?0{9xN݈n_z(VF+wG2S*ZlY\ZFa;#oճ3쳥5 Z˓kX"`wroPແP_Ʒb,#nwf$EA__1]:'JӼWOl◲Qڥ~t"cLeY;TlWNq\V228$D8$YQZy̩ ^3Samߏ~8AeWC3l29jvO?`(TWrA aaEHޒUشP%&% H*Oܢ~RH}*B ukSF)d  %ۦJ7v88PfJERJ V_'%(2C;p.=N#9Y."f9|Y CF^ L9~_6ʤ+"2g4.s;vM섟)?ms)g<FںNNyLsΣt&!Zb#`T]y6_P.}ڧ}n TYҠ2jxE޺ͱcsͿrh\fyy/~&Mjܺc6,6uX2_cf4~ ( ϳkX߁+ρW](M*éC8u{u2,Iq,<|99a}ӱŨ[_~MjbYoK#q.%KsXRHhZ\\"]^/,U~񓡻Vb@i B4JTdtʜ}`LP7*RQY15 GY>~Z9~m}9ƒ:/Ҧm|iOgDfe1X1YknI`"˾Y6>b",A(t]? {bBMpNeJ!ͯTOKa/1TJi 39;az閑~(q' 7/ۗ!hh"),ӏtT%DAAG)D:^#iY1 $g鎟{(j|mzxM-},x3D?z.ZC~@,رȿ ٕzm8J-oSt!@=cRrqiE > ?< Q.5>iEe}Kyeٔ$\FlyX.㸋͗v(g?Pbp6syL,h}r,~Χ Zmvw= ಡµ=Qf#[f9Pz{wCAMKzZ+PozN؆MABG@MIv=Ʋ)yy|LGZ=1A+t&h y9Z,%G뎍n1RѲQ ),=gAa$ɢ8 >P8HG|@YYꢾ0*#%߁iw?3IA=}l:=/]{:o=ʚoҰro\?GnB<,XW7rs})k#0 C(p[WonSr tҍ>Ԁ=>\}On6 1zQxY(2~J;mE:F]ǜ2HҢ#E$JZh)Sy[aDIqBbJ s0(,\VEg0E)bt| i,2Jz(Id }-L. 7V)LKaR %Db6y,#d2^ ~UKҔ 4TRYT:x49 RHerֶ`OѿYf_gvo`>a߿Yn#JUQEmQø(JT 4$C[Nq"H]H~)p{g Yf]x, T[OO|rI/ǨOPjsiWb 9 ~k^jz[ >WÂkDY*e=oj!'J ITRPKN),(┖Qqp' sf B٢j}ЃP|MT3B1"!yFX͂pmy5/2nbKt*=kAR6O,l%B鍳t41jLD.%yhk[a_'0 {1.JQ䁏kE+ t-=ƲAacĒ#r\CXko1O໥UtR7V+,eH<ڂ&-‹$o je gpzЈV )F22PPUT~Lӗh2Eˌ2F哼UJ[a|nT)Mrl=\#x$W܇h@㥼S t}7|g2/ Z3*γKhX$gy(Pܶ>HDdm/ TMg}V>}|}׸R2J@ td?kf:~57dwmpcFzgbfƂ(a_P$*iS8qߥbOMm&jrKsY.#kƖ%cϔ3abP E(L$A&UjmXŞ3atv$ -7y8uYUɴߝɏ* ̀F|ay8 Ո0 *tɂ Nm'@&VX)i>)fUp(Muo~2*2\F.yE>& ch~Ixi?Zҙ#MdK˴cm@)S/"*YZsHE"+^6_Ze EQ  Ry7?W"}חELc1͏ORɎ{~XV> yRlݞf: YQ5ocnYm4Ugtτ+-{;i!.H]C{hqTatj믿FsBd|0,ũzghw</N.)[!]s<:a\JXlHRiZ_/S^J1Lmh+Tp$81;I(=hu!# 8KPxC2I mۆ)X͕L᣿'N7#QYi9uImЦڴʞ88AhJ<8nY7vWfH~GEca/4_YBXfdt锉_py@Wv c料mYmW$JXΧ"ܮ%IeζTeꫮ}CO{Kc劥ƴ`^ZB_qfAT{ k |hΠ$Q!I[ogkGkNƯ8^*7UOΆBrӥ-ߵ}Ht;ɂtI)IJĵxϲb ucɜل1OG:e*%=,FPz4ĸO˨eD~K?!qP 9jx~:ΣE Nk*Z*qM[h1y̠z(JeFRT.a'xiIrMFlfI r28o܍l>KwZhHK*]*,Id7C_^|-֣a߲E!OfBGq\GWmXW3OZۼdw' wH~1jG IDATѱ n*nҁ v!*U8PZ/_1^eﲙJR|.E`M|S`#L//F9Wyczrs YqCZ5W_M|Y@yp?xljge9&U-/Ġd8 SEz+^$+ XYrtm'?[~p+i8!OL~aEȓuOTB ZR ,&LS1ʼn8:WᛑYLΘ|Q2qtyjfq ,Zw/.ͅ/M!R5o=~n2oE͊}E( Z_txU/,Bֱ> E@V^To/J:nXƧƀ$ׁGk)RӵW쿉 lE+L\(>RuL֨['ui,ݠ |!,/eH~@W좹d0~i 4 ~ +PmEδHDyuj)+t 69܇)R%d.P[h"]1tdd[oYW=# ~.5zU̓c1Ѷ!  d[#tuŇj~ Gr-P}dxTD?;TNh `e:;ㇷ~(ɶ8G;+~Xe eV3 ;˓;=HQ? lˆs0SЗ/c}YQ~yբ'g@ΰ5AM!I%=y.?)b/1s59ExG͋v-_S/ DB li=z}ǰV^E}s+9QH2//"khIQ\vJkN.CBMKIy+uQInnV}yXޒ,۲ @SJ)՞Bv<S`G g$adR^pAXq[ TA@i :h,3x^:O< :ҏ0t悴/v =<^fyg'ND45Y_zA,QElQ*A!劘' Efp4?#X}R#uORXɅJͻ?_X@É7`˞04Hz$>UpNbi-`VSD0BR I_e&PtH'H~^7Bfl/$)]Ar3Ɨn`Q}삟〗.f;,}E*wR sNev?hf7Pe%O%>92BaLK O'tGiOB#4 _&¢FF9d[K@(;n$?:wvh :nnYwόnYc 6tVF"ہ v]V0D](筷Kk*X:=0\ھPs+ oifE.vLUӮe#$rjS!Yu*-pC0^a)G(x˓U[k?ma70xWU8hk_:Ou0hE@>:Y'eK|tU+ghmd719 x"j$!8B|?v"58K5YhS؏L15 X|&^K%PKa(߭+0es8ݺR>\=Wh\Dϒ.4^7>I,؞ >NMl.V邵_&K]LKՕ@F{'`}1XsS o5[GjyuzsuɏBqʆƛq")j\\̧L6n,3i.3p47F1 @֭SPf' ױ03;g8@NRo]{B`9 pg'5Jl|eˀ/Ih#ٳ4:d)KtEURTauis#RwYs˗OP 1\^/2z,4YzZ%] 2Qi7Ahy2jtXk(}l|hXf0Z[!=|Vi+ K@+ wWƠ*s餷6^Sޥ U^tͼFŠgܢ<XMuxːH:[T[@F#O?.~7m{cYKY܁0A< C(|yB$OF RR!XyW_j?+igq?cǚ3,m5]zyϔd@8~-zYj\CΨ'89adY;pێ}}K^ HAgEqݶ(hhuk-=8j*( ʤ8 202ӿ߿s{{ګTjZ{U7{[X<' Lc|p!A1J8~r8yQ,lc"bՂ`Ʃ'뼰/LJG {jT@oꕣy˨v`fkD^)>NEy*>p8 9eЇ{l7BT~-Nժ[i(JqZ˟"_u7QݦS5w:4&Sxz~ 8|ZGN(r]d#~/18W|3i8zl]~+:{_6)"EXgѨ(~5z_-#85}{i<:KSYmiF?V~Nu0ȓiD4DN #^ڮLX_p ގl~a]hvtשM;x3ҷL;@-!rCBfnf^!o\ oI#=a8fIpluaL1X@~ p&-B*\CZ6:o1k@ґ*;$- c:C7lq›|h )-GȮΥD |VmrMʴ:(Alm&ɬC)oƉ %?&z>)#ND~,,@4'Vd,l ZiWukV@B/[2B+}RqS4e=;y=ip /ld]CC~T;]5qn+o}kmށZ 1↵Ex\(zL2Z}r M;o|r\Λ~.RƝ,_wW_Nm:<OPvgw>02:83~V9׾_o:NCt,Q$Xs7P,Fxk@St`{gƔ1*QɎN9 .:'j=bjv UtJ=$>:FW:p"Fџ _:W+W'SJ\2ۜ[:e4QY-o_űb|#U, ᢻI'}ʴJ;[c4t?t'N6n,y3D(v"mHZ9 H}Oէvw%:PmKW8bqz°*Zee>(FѢ0/ Qth(l^+k4Nvp#?e(I~w+'z|#'U-{GP+oe4EW*pٖ޷s\<4́jε|FkNb)@Te#_8T8y^xk^3?}Tfw͌\ǰ@z5o{? Cg m*iM'8P8[`(0'_#C$ Zr _YEAgjF̈մ xlqqdMU9/ґ54q{^zx8Uv&ICs柭4ﴑ+ʔs0nr̼䅉Q6rp"ұ!a_z۳΂,ө0yK1r=SXyIpNnJ3zAqp#WF2~͈,k|BX6 Ѣ>A8R ]ֲKh1_~S/Pɺ#mʥcZmgvM?mЦIXPɼԦvlpa(˲=7vlpv5®vχS-o/n +W n0O $1jM*=J 47Kn[ujEfDoT(qB/m>Aɷ6ıq66_WlE䢊 x4$g38ΰjxo߱}n5?Ggz?D})|ƌ43 9o P8K^̑,"[|Rayq~Y'b#'f"KM%_(PWO8W%z{~A ,MiJӎiDZYmFLtH6$ydaŶuq#xeZQ9A "Ѵ}|ziqk }hn݌߼SG]>g){w~ep>f_ux6Lmb7+%l/Vtxn',Ź!DMϖMבL{ ɂ[O넜 &Oܴtl' .wwg Ǚvr]?\OE"]o(_岉Ia&a_ 'I\,ȊL?8|p+Y#PʿjuW?KUx m2:c/Gc n!L=i(eĞ18$-4!Cg\iR.]XިZN>^#N_pSӟMOG/TLԩ>UR'siHNk'^${*]MeiEkVʁ*kږ?e@;g~nsI)U; .X IDATj~IzaJxFйss.eL4Drw*ϛ%N kBd>/z0PƜH/v%yռgMTO`r* rtZD1>l8^wu{hR7ݲ|}?|\ݞiV 0N#ů FgKE\v8'/`Hom8P\'Zr_T00zz:5P!.ʽqrTt^ζyMK?ORš)@U!(c:/[e<'Jj iQ ؔtWk)=\dXv/WI>F-%Ns@X 0TVe&nsV D}Ax 9t8(޶|ݡإߵvk|\BȭbWm8[gڶG2'gC8HVM ƼG\ʗSAr}iIp2`}"?߳w$Mt^id,}}fs>Fp\K,n V _ 8et#V 8m E(Ky6`Y{xl랔vDkG\&P:Cq<-e U`*dv^<~z&Wƫ jdȨhZk|WTRN [? oo?t6OٳZDis%SMŹZP?ڎk2g B"kj0M:Ԏyi(?bhQFztŘͥ)8݇d4wnˁjDAB. ´!O׻M YF)>zzL=lh.M#Н3Χt@a ;a7yv9wԛeAmAt $]ArCuz>8O,f6ѭ56X<}tCSt % :FyrD(I#T} >ց2#=ޓGa91}G)Ҫ֩6QO%`Ljж? X*uRRQ }G-mqZ+6=%qմ-ǐĺ/vQEl G[v* :saC9Y p~~toѾ%h[9wrK8mĩMͥz|V!-Dbiق+̨΃џΕ|녌ZPc>4L|=;rekGO>{=ևC,$g@_!ײ0<􌸖x>aiSwmY_Y`2rUwYN1 "-]zP!t~6m ϥix~=m_`J9P*TV9)RaΙC2ibm89'}ٛNNr^53\`F!ĠԛGrًà@NX/C>z| p >6 y8n ըס3u8G,ђ&N[l<5X\wUb@*me:hirG%;A XLq2Ih&|,.)EYUUc=N˟дbЦ 8x[֗t:L8o^Tug{q1hްcZae]n>%/뤧KSfwzzUF! _!XQZN]k}a6& [pvv5юz7;liqk@pr\`p;x/7\tx(oFgrV0FJk8:n8Qq x6 sE"wklG@d8QtqoSxY~e`'sv5ODFi#>Y_f6:[z:6'[:AA葾V=Oq8Z eԁ8'T) M6}IE Tj筬RSTzڰfk-kR:JN!u+3O y'RU/(x[qB­eg*֢SC IUXGOhNr'F:Lb9MO(Zi*Iq< X8)2<+V rў¾gazj-s5n|UP'+TA2(zXo8ԗo|]?+ײ\%[nGߗ)MCfW; Me]¢Hod:s#M.85MZ>-{?*Nwh8pKw&g;N>gTGxCwک|~#k "h'ϬbSMA1'Gߛ"J|Ѫ0so1ʷ 18N!f ЋQlw&E`䓙 eSK"}Aut")Ο/tx-3wzZ[L^s!VvӺz6ᨐW mt7(N?NrJdh-YWMsYЋr ~m;\wr^d]U=4#AQA[rO,89?aTJz_5ߥߵn)D뤇H4v?2߳1߷}v@5DEI ZZy;76M/4iOJNΕ|yGf[pM(vAd,@`A-TZw5HLY 6=bs2Lv@ DQOO(Q[Ղ[6\=|sMYK[#?* ,}+{} v2ǟv,gS}|^(v(/ ʹs[&Ts: ЈdV_ a~!=8 [lT|¡:. &K74~O'RNOJZ^s3HFSS;oGzCz:ۥ_m~w~DhvގκxJXDu߀k i oɡW*yV@St" gy睗]yVt>jD$2Lɛlt3>3ǚ9A xqjE-NZdt2Ŕ^0f[3<ħT^΍_^ʔE}눀< WfcTӎ=(;S'6ƍy#h V$|mZY@(%I[;Sw^4{^*> R5e~MG)kp1):1=TU_7s^<~~jh+#ϱ}.z.IIΞ}:ǵaq6?K:RCpm:UگRXЧv#ߎ / ۡyCgc1bɗ7e'hWSQ]TZN2yaQ|›sL’WF 5vlpv5®vO3]dr>}`Si>џ-}_<7v[yBK6F 򥋽oq!TC<=hq<x&znˍ;S#zQgx8:9 [w-47Z߳gOָԜo rQ V\($e1WeI}/eS!!޶zy' qPW 7E&qsdA}|<(@pl'??m#V~=)诉8 BKlSe΂?[dc@/ &t?Pr>92A*WmٯrZ%o=i'۪!Fc\{ymixBDYFyPe-htP-oSlkS/;5o,7=pC/zrnNL|L`|*Θ_Ywb,&z#OD6^eꏣl˜5J7i,?HZ׸D \p={ ʘ;4o2qGf'wbs߾s'NC:%Z*~{ZظU.rƫrO- Z t`-*OǍF6Uƚԯ4#F 5 O;5f8 ؟<[t O'uLkdGs )ck }U. =|7}Dg,6fj6,y,sZڋciD!Ky7'r8K"+RO8爅S-+ ÖcbN8;m{^-u`S7{k͢-lVqb LnF兛`(E)3hp;V㚏p|~a cZIU+` /l]L6miVq-[5VVqN+q[YۖkV<M6|EuʛZ$AozXgJʹ÷7Bm'X?X<ȷrrϧDٙѩN]>Ljѣ+O 51FtXN+.d?q6^p|Ǎx1[OAOf AC8hٚS>颙Sw%js8>mssMc4Γ@8D4JG 8v ͔pc-7cr $A2$;rJaW ,8}w*A9 =|aVM*W Msr4qE6myyUlϛU~O1e~ɔEv-hΉ*-?bM#.ɾ.컚 γ\ UmcUKcu(O OG(PEcL(RKQT^TcK,l]?v*ga?%[_ sF?-X9;-җ 3!sR/-{:p &IuˀEEmoisV? #hN _nj;r׾w/{_(6I"l&RąHx]8l Okb`k<ny; qƒrLNE*r^`mHܜdxKfґ5P7:v71aXF_@/"$YJHC`s5k4E_zgcZƦty;i7 +rcVqvO8ץ+,(iW2ښ#lJT H/Ikꜥ^!vCB$ijT.aDE{گ->Om.翴4ާv [ʯ FD1ޢ*}}Ԗy=Qԍ,u Zy6Y믳BrFSF\HCyZ uݷqx߾b㚫߉[abN~dm}fUUK,fj|L2=yC)k~~g:iʇӮzSo'g?@s@M53 jl7;}iH5G;I'ƷzYD2^ (|82tկF6HY7MweA>r£gW8/|18Zgp>Gkl,d[֡^ :߷|e٘)>-5LIws4u׏NP'%`m IDATAy|d Im1AcJ&'a}\&jۥ|,WO'vܥ?5a_?E(tjq>H =2\|Q~4^l@|! bʼyrɀkJycGiv4Gٻk}YVm^Ft;^ym΁*rk un=Mo7%zntYdԆ(ӜZJ9'¹o]\0NlfI}A GnxߟWi{V/oԖcpfP`88wvm]_uޜ&Ϲsjo8o4?6"ѪY~ksЉ zut.ёAڹoq R>*nF :6ic;I]eG~9uC3GBQ/,QnjSm$i‡z4$+^*m[֩cYz[bGK9ɯAx썮{[;#y`UG@{4LSTS']gPc0?nKDR'FɢJ`R*_EZŵd֟[KJm ϥjx_kdxs,Wn3( {yڢLSOܜ(R `[zox. Bek>ϟ} &`Lo۝ /LqSNJzuu0˼"!w[r% ZY'o5^lITim؋-ɗa~q8:ɓ= `BG>͢Y:EIʸC0_Wt~8?mԞ1X"M@`-O1WeϩҪԞRi- ukej6+ m='y x"ŹlyCF+uVqO&v_]&I(7y%(Luوz >t$ 4NM1QXG .oΗ`ڷ-']YTU`ohʫWK]_xM⹈{^ D ]]\=8>O&ǨM N_>w¶M;9PAކl}vL&A^Hύmr[tFxztvh`'c4b#z]nqe7ruwtz׻=]rF~y cbjR/.8zxK.zU>)ide7h`61 &V2e1~%DTc#eFm)Oj 滆xQv?od,uvDvK_,I%MȘz(F7ĂDă8'}"]p8JG|¯{O??>/P~Z$NGb(w{uN#yB'oΕ)n㭜"֏c8B=կ|xk!Ӄ/{ˇscx8vڸ~e\i\p ~o|k_ F_>{scmvV?w~gO5̄OOX?éޕ9ߴe&'=>b=K_7-ij'I{>_sOr;4P+OXQ)g+rO%atAѡ`)K=e:o*Ft\?4htP8p ;#_rɝ ldX+0%G܀,(r_L=oL4m (gXD)A^'j|`o61^"%13(28ЙB,k$wUsKI<9m$H;zUB!DY(o?Ҟ?oo9Wυ_1'8_< p&ŀEau2EMUш͗A{cxS9x?+ {2dkxWvҷ]`K/Wf3&!DNwP$Q%O ?לwx8zB"I/}K/D}7a''__5hOkRbw˗z[^ujξ^qLtDtؚCU2B׿u{]VSgkN|5=h7ʴKyjpE]o(֘٣~=hg~gmt9?3?3y6jE&5r8|oٯQI/RMߡf,89_W_Wl|W|37_i[Q%Ι|y}0_%kjz_Ѥ?_o=-- zZꍚȏ7ּbqR]d_>)2[HYt7X. =( {[:S7tie_NaA*Q]"Ak[yKZѤHKۆ8Աyi#KƷh[9n?;<9~7=r|_m5Ni2f (1ËS>e_.<x響x#Q:GsgVU{> o|_D@+> ?yL 14{#1╯H۾狾OO=JX./~Ko};ɟ}Oߎun>3>c|2|'},\/GG_E_4Z*nM ǏB Zrw|w}OO7=a>kOySdxb(//AfTOt&-+, +XO?W_ i)^CiO{c?c?s7>?>n^,}h//X{ ̠\d<9iGmS]Xi&OÝ7uioou3uN~KK~ڦ)=>S?uM}6(CBHiQ=qK=p/aCkܳCﲌWL}?VJR-&_X z/٧|ʧ]uU|7~󵼝7N/1ޥ__~fe7i*z I%AQCHj&CFzolN JxhX~e`鎋T,Bn783l.0iD/O{:[,{s7@1_"_zHHط2]Fi{O@krnXN! [<*۩7h:d-14! UmuA9c<{7*M8*zT E X2?dD~!Ϡj}a-Zq8z1~( QZ)xJUѽgEqke/>rfz?9㳞>1i}{x#uJ9V:Kl:0p}{/~>Ou_%{u_uooĹn1c3}_%6Ӓ-p7>){fyӛipu'}7忢8Ais2eT==#~ۮ"11EE/z?vgd`@>>!K=¯/ Y5Zߵ63{uϟ38oۿ7m0m`Egcf??3_lAgg7Zܰn+RKs|6oֲ͏x谁oRG?$7z_sq&/=yDgo~LJ=az?}__O26.9}+~0^48ށRwóg>???{kXF6ęxի^0_x^6?HNHdpxggF̨6, JxlwbQuhFt~Ui!ײze<;H&}˗܊ط٥/ofm x{,^?2E'^p6\ƢOgB3B"Y7`ƐG قْ ĎsKezI ~*~|SX6R<trtIb?ǻKItG#bUmK˼ì)pCMPEÉMw?㋾(vyRg9UdHwݎן:iZ#$4kGqގS=9߽8H{ t_Ț ?/QqW~WjOdk2//nKK/x qp{~=}q,2a#202frӇOefImԵN<|ɿ:Y\@ Ïzc|B"ƛIJ;qB W| 6b4WW3;W}WՇ<=yρ)%/yƷ%WS?lIdHNq?4=n? z_94 ?G DJ\m};XgXu{ͩ5KK}K;%WU$maGƎ?':67Re7DŽ9κS#X _5_360Ц!uٟKx{4rEjv.IWD,տ6)rYѣ<8ϋIh,l.}5d=LdYڿ -KKPLSy۩= ʅ>Ud6D#CGmxV֍l_H$SWqNS]JjJt#>}wt@dv_ /XsGyZخQ_D|m(rـөyy˃u&o& # -*>yq>O_zs41N]_z=Cy#d>T^uI9}i9N&Sv+|ы^z:y&o?aom %lZSRh -DsTn?3"Cyntʥ"%]_anK{h:yq[5@ ){qzXߥ/Vj6Ym+K1typ7|ώN|e`={~ +*]xVՏ~WGi#떘b o~t. rF1Ї>dΠ8~X7mTY/Δv04~ԩe]11 _9OOΟ'%#ZT?iz%m /G"͍A2:9-)__q&2HݦEG9iѽuN+a8Ib`tt#s6|W}N'vi(d'1쒁O+׉4"TDsn8ss_x(t)v=*OOKZ|=9nthHC1 #RAFcv;+w5P[h]^Ncm8l%Ćmxoʹ!QmGeilo5Y?ڗQF\7T3ѰP o~ ,&5X/4%Ni\jy;~;#dkڳ=#1VNymtJvLv8~n$w7ΉH!q`j ;ίzU<  J߃!b p'\ԩwe^&|3/ *h+zbL薃@142az LOtCU'*.bpw6|9O*\mb&PMV&9DN8sP󭳖|;eP&4dC_WmR9td~~?M/粮e7=T$2$!Gp`+\ǵ:JF\PTϴ!*w!2ew!eQLaN{,hRCE8kF ,H}J{\9>vgb? f EP6׈M`K՜Ҩ&n'VEqY;>Y`<[Kvu3y^qyq͖z8kksFiĖ"w]U&z ^wיW^yӜ` 4?c}6w2Րi#?#D֨k\$|Ьaٓ:u>ѿuLlʱOۢDЅ.xvSm~dod6|֝ntG=QG??G[Gޤs ׬ϹjU?F9Tm8_!ӂy~κl>s>gC"/o=)oX?,_s )2uXw~}Azv 37 0 ֗S~&?р?+]&]c{x7kN6ΘѴ6\bm;<12$v5Gi|zRl}"͠b/8z]09 -}]w7",]N1*48m:gZウБ'.faІk,7z)*~0x%#uٳgpM/ɔkp{X7]9?!֬0Kh)aԌK_NcڷBN #MYFrj=AvwM-6O.ZvF/Մn[XK5["kC鏡Q ?igNIJ)U}yB>2Ny=\ZD Y5Q6kX~UFUr(4q4bSפ]:o_'$"iS"jJ\#Un8 (ʜTftN/^𝘐iqz ,%چ$_z~S=}h5be-8lqin-(߱Cv՟%]_}se]EFVmу|V|рk'Qȗ?'zuXYfr\p+Yo-_F~FkmIoIS֛u MUk> zqϛ ųu@FNϷʆLuzN&왢tcUCӣ)_z饛yϻ3*lΏ3kJXs`>(F8%5ʼ1\5pzxXۿ2<P8_5ZN*Q7ڠA"t[,8uz5v^g[җ집I7ّ-'G*MB`qY09OhRjXd.ㆳ6YINaz3Q{G@>M&ꀋ5Rjfhx5*g#Ժ+I>7o=xeqhr1 Vd{Bh~(΃_BǙ&y`ڷ8qqGY42y=q+̞gMH yoJ=/h YZ@ONk 뮣mBG)#F }FT* ʷ1W1`̨2\vwNDނpkp[gJrӵo-z:MV;^r^s[Lv:(f:NvppJެifjt &vݪޘ$ P:٥^^(:p.u+'|Aي }\CeY×p(s{O}W q5_jaE؎囬:G-m=߬sڥS{YØC̓SxsTFm/Sjԡ:O‘oRU+kQIH/ꔿhB8̣\s=b~}SHAS +[lo?2:B{>^0t$PByDFsdקTl 2{TҕLr7e]^Łmbr^WNgȵBzW 0J]أZnmc?+amХ?L9rG΍ЛnʐQD )/N$ Ȧȷ[:\a.mϑN}_|0Է뎰m?aW^j%]mCwtOli@-\6m*rk un=M1oЮnZYwAh<}=7H|V*]Oi;9m7| knksuM7Mkw3?A~z`7 )39 jS*2sqĉS:&>l.䢿HA^NQ2] ?wڍrJs^+w M 5)tmx_4l::C۲ mM>s۬mUXdN?q<%KdWD>9%OV6/c@*-,e7)pZ3w(TނCQw蝇w-0]tgqg0o=)uF|ŗ_~i+|y{Ɯ7>L݁ ^D})\S:[9gUonQ&A~F$` p"mIi.@0U/T##u&<}Ϛ6H-3y~D!c#E,~w gpl' ؒ:Gǽ^W5DQ4/efe,3 mE;?<L*z$99Uu|p->6ٹA6ԺQQF|W;>mp2dn–=-k|˰&E^I1s:MHIkUwZ֑k)_SfF7%܎蝍nvK5n0O-%K!'*]~4ufF_mCnw;܇no7PmџLpnۿگc`2AgCy7]c 홟mt'Op80 tj̋nʍ%OKGFq^TȨtSYs*rom~b\Egɔ*"yb_eﰽq ߷]q%ϱ|6t?[<-4N6NYt29F_x-ds_"My#y70Wk.JuhfX>¿nK&+]z ѵf9`ٯn.9lGߗɁ;eM-9[>,ݍ}_H7q(ʶ,a㘱fY rXh9K mS%[&hq1x-, .Q wb!vF޽5߿{F쾯2dܦOmN6I^Qx]|qM)ԜJvi;tP%E6LTN^_G.;O " [FsD>9S7BŒ??oxmZgL\+~Xn-YG>) \G603HH`W7 & kݦB3(f ύqg=0JJ"pzvZȰ"}̏[y.Ig\11ӇI1[~GaZxb``t~yf#Sm@\P̴փ5FCfC .S:Nxqg_ 0u (Z|toy[_)a`w/,fO3|yu`4\q¿_m8 ۋ0f7xcxTG"accL/hbsxN]g_֯SL$U&}ݿm,uv!k:X?߻oyv 7`N /3VۡKt,7LG҉V[1C؏nergۥi [8ß[[m38Pk77sܿZ]s1kPQ(0/CĖ o߂ hUcu;aJIhL|tz§\kv4o>B>I0~ͧmZMɴeF( 0}lGU[zPNS]]wW] ?evے&y4[wG귯?`M&1c ks}(&aߘGem՞_V}Q熭[v Oߥ%ƻpьds( wm+ڌUS-`#OkR/7ƿ,f Wm;6'o[%:ɓʘ)ͻP5Ƚ`ꮨDNxD0aGl T ծڗjݲcR[R{ 5g:q^}b{#Ξ9roۨ*d+JVli2[p0KgsmOEXT fIǹ0ˠI1dVfY@{qV#a*4[f+DօVh-֎$<0 IDAT⪃SYns&S# t _VNo:ȕq\ `BrL,ĦXgI~a2TmK V·Z&]/q56|d QHbdK\1ԈxM=1M_dͫ$жq+=Ms [<F>H /0qu}2X?cbI ,oHz!zdX۝ &t??Hc 7sM~97]>L t^W<2}JR2G e;vxW1T;o_~m\дn?ɴzZN핡 $0A 7ҹϳx%'Xc,w5\3p*kkR`uM6Ң¹iz;QSN_찶NJ_}y),سG{Ѳ9 Kh$ҏ#_T8+2$c@x#ͥA'n#YÈ @]nSؘ{O613A8{"aSd<=89?S^ֱ,wqJБm(q:ϦjFӅZE)q##x{T?L#,27Q3ad BC-ĵwfE!Z(1rm)Ӽp1S.:|A#.<񧨻b/Ca+$:}}:}ʓa>twٶUl>:Zֵ\;qܡilj&%U)[|,:AD3 *JYuĻϹ+ph2ޛ c%SOO6u5{&3> 9#~Sa&ڦ=>: &H b#9Nm»&IƍxO2]O_ٷ0)~cݭn26dLctha6'Meq4%v|%.qqQ1ʰQx#l]?#1M+mqy>ބy*kLK= a̗K[YUT E@Xsޓ.qbϙWO1IzbOB{P͘jxI}.`'Q|/ŗs c7>ڱ甠61p++ e[>LOO.S1G+Aa|y1 ýk^+ 8*A&0ח3]ImTﶟf)ws7ufwgh3$m-uztgVLFWiv1VR#A.nɠ(eDUʤ5qE4ȉOfCW2cJ2;@nKEC?43r(<{U'-2]޻xP\xA\8+!;r,]h|s.6Af0t%B:b>Cq34 Gg ^vw{lmO [^Ag۞VYi2,m >B>mR>b羖k]ZKexY8_(SUă,Ε~O>a, Sc_'8` v{cZqoƙ^F:|iIq;40#nW{ͳQJ^ ~`dGOe<, ӌ$$ \_ HEa+_)]N W6Wukd_hKJ{Ə!j+!d~r;qM9<Gɂ=?$NMz=~j%,/ p~)x+y X:Ӣ}=`/.*T;+o5y+|EW#gn~w~wv=R -,/h73/w2F6Ә;lr>*6't(W_Yc0EFW족2Nگi#`ܒ:! !x|u3=%#'ƕӏe}:rlm÷'>hn_Eկi> ОEO@O%!$2z -`q<,CB/`]*+a p?D0kimuaT@V\9~"-[w|wpԠj0zuvC?ClZ0eӛ|/G[ꖺ'eMh8=l'7Ys;寶ic<#[*nP:ޤGxnt=oyΖb.oH#B`rg8k+d跸\!>"]2ҫN8˰29geQg S:sJ!VB@CvQq_p8ns"S^qtZ1|B`x0f,.ȼzG>t+hK+}|ﹻ sʷ.ptZy7pd&l?ucOMm:6'q??!|%~\}y$G/c{3 (cOg{2PHp~!f{2IJ{ANkщ 8S/ r0̐yh® SrAY+}I۠C~qf[I's0\v?-ŗ\4h _ϥ λ@ a>szF8n=E(^z٥n=t[㢪R3b.?~}QI =ұVqYf?&i7oy<D|6,,|QςkW[m&_|$68Mq eZC#ͼt/5>Jg:̀+M bf|5(\g > 4~\p/F,fyH#+Sm.x-Cg(t+soƑat XLcYi(~10V.} QN {%y Z_2v,;A=*.c#E2o0<)rd ~aFHƴQYe|d dSDːybP {JedzM2O.'k>> N27e|)T> Ittz`dݾh9q!dX*^eQ ?Pb0s屲*UV BIiF|ljf3gcf88Wש7c3҅_ۗz9oWc 53k m&7+l* ccx=ՄtGt.䶉P<8T̄їXlDk)NY$'~΅ħ=wޡ)J2g}k"r â'#GbBj?YUvbjR/ 'CЊpWA0EZXЫ-e>a."qyI WC}dղBݷ95HmH2Qc{I'S%FcB K0\a;D{,gy=1Iƃ@'3R<&x'x{Vz1 _puJ'7M;)[:8>N/ρJp.8<Իގ L27߮)0YaTiW(~1GbWjP,K kɏЯ` }IV`G?O+e}#ܪɓIª0R?CGз:G>`lZ)QڥΎLۥ]}3-=4l:49~Z+v}>=qIgfG=['@'<-w{\T%{8L1n8S Vé"RFq=ȫK7y6Gqd"OR2R-F,@PU8PH,Ӈ!nv2;,QlrS&u>i}IimO_ z9=JBT[]nuM5b@{NO`I ~dO $П?ϦHoӦnƢ9W$ϳ1Pm B6`qm | (~SG# αB,P͗v[L !6Ǣ (/AS2YcqepaeGKawNtB^гxg\~<ΓGZ^qSgz:OV0:O ٞh ö˂-jTG땨l@wE}k# 2 <5{N?lO<I>BH \p!%1C'B W7FRO$|dxmk)vɰ?PWrHZٗ&MK^XThgcSeeU^wH3ah@;'-fC '73!5xgSehճ #]OH-\,3_p4qi> uِ^9}۷}B+mޓa߾ Z=sS}IkxQw2k1]=ܠpE~Hڎ?\CO؏-pcImNn5E ׶xWSd_6ͻ2[ IDATN{1Pp*0-t{=/xm*L|JD_Hh^xQ ҊcGqq{u}xE_v>w[TOpG>9|cfCgˊn 0o7ְ&+`GɨdD'`ΌB_cˎ;֘,FJ,S0 ؝ =Jbӟn󨻎iUv;n/cV !qe烬X^cϫ~\_u'5uqq})kG<'Z;0[$NĎTe0ߞ}5W;OT)wRھXwZ5~k|ϖwT"݆&f($E)¼I/ ehx2kEe~,0nQİ_-T8ZXMgQhnx>|\$dj`&3={^YǿYS?}3|odВW;^HF1 02`Ҧょs;9KEPxN8OJ'|UjblOe|C-l˛|"6WZ*kq TL;|uA}&Nw.cTNp'H_H_$FqϙOzV5ɖIzlY)Ʀ3gѯswKkp5bdmIsTe2Vb+cZ4>yߦUf\| EsMAĩ`*GtMg"=/5cNT&v_i~@B1l1w![*ݲ)ly2[`!"Ypc^\SL(n6RI.0xPË,!0cxqv< zT͔F=\KIK@CAUݡ<"N\{% ru{-y}-)#(]e c #+.Gu&/nS203ꄦ$aY"?COyAч&qNG4[j#/k!qJs'I5IÜiš&^dAPWWePt-brWm:?2n%iDe Yw!7eܺtiÏ6XE29XLz( M[ʨKÅ.6#+8Yuaf_򞉯xxM@n^3&>NGØ)F,޽o_1db:}.+m[k.0Ksb9!l6:bA8dwRI'\eiܹ:̿o(d]虏H/ަNuЇ:0W[WOG1GtF_Gf7LFs*|O]ϼҧҧMDnf_9taBNrKu ͏9s;`L)_2K'Ns}8l[U m;d4Owm; HK#)ߛm9H7sNH ϵO96t29?f AX.1 54mdڣ`*hU CX`2t؝1xɤ)blӗ.FEm>2P,Lنe^8*9:YB{}f{( 7_9lm?/9/kI۝@.wYw}2$#w;}2Y+[T+QV7Ⱦ>Drŝ=_].1.eܣݒA +XNT!9;KuTU M;&#&1sPON:3%A21.JDHiedăLmHߘFFC;Hab\HdХrQwT0zp87exg_"F9Uz{SL9*l=6_~oK֭0HF([ q0G}kۅkLܑrj&,8#Xaeܯ^K,!aB\Ҥ̣4`*9Szvp^Z珐rGHd3Vs ͳRRTX&}%8Er/JqlnsGXLJӺ%QTHK26c)Yb6bCy .2 ]U`0W՞Jm,p{8|r@m:3:Yr-ntu;o]NpT84v'C0Okh:1\ EL޶u"#nLRsСC:s]U/8ЖX^1w0\ doO)m>Λ{>mH7Qֵ6M<6ZiwhI71x T:9N`x-Bde0U&EwsKPIAudkJ/loD9"[q <mQmncț/o'm>OkW]w-cг&f:.v>CsEN=Gr]D7sWĈHhd>XԁSRro{#51 יT23&YsZpja$W.֥Ϗ%h, mߍb& wr'aI&E 1-soPM$!2.[>'50AOʋέMlB>)OADVPνe;-mJgJ̑zw Neh98X_!-"I Xnm߳0$“' Wl-.0&/4-4h ߙ7~($dHo`>L9 3"t–+Sǂ2ٶYղic<9[in:t(2d3(H`td2_PE\խd+.:tmU<-aV:20ӗ\1#- +y/c{FЖjkS^[G0X%s?r;KIqdtr;D0OB(jTeB8P<IT>Ӛ:o*3בFߺ ?^svщxI~?0ir-cwҏ o*|jOeVʘ)`!4"1_՘x* W *$+(O%Nr 309=F/d"츉Q@'wqQju߽vG~tG}]^ɗp t#B*@Wbk$Dq?v2Nzc!~.2q:RV p4'b{ )y3Y/|$f`oJ1H5 bGa}q^(\Hbr/q*SOAD'J\3-i>D<,ң6)5 W;SCKi\5eY}a8wPVh[AP?Ur Q%a0^\"% 5R ]ޓD?2"2t>\S:fuz,g^Af;CRd'Jo>2R%3Huq vEՙ,p n!IJ#KTrA9sl(]Q:dy~ ծ[ kuUV /$ug,WFg%Jb K׬QRQ]:_в)-W~|7ڼk"(j鸖AF^.-غUSN=ƛ73Z$I~ 0C^ilJ̟/#D(_ ` E_$L-=&N-.\NN#Hx]8"S5gr_-?ǶqJߏآ0oVYx+:?,0+y'ԫ^սom_5{ӛa.`Wjv!8P@pNaM~ۊ/W^yŌӁ|Ie**%]J4)3r:6fԧ&>)}d#4ͅ|"VE:rdXTiF[T ?)KJ``l2O\1Qxd-LC҇sf%E-sܱ$p[_hpY203tEdz 2Ne: ݿz㱸+7ާMk:Benuܒ,p}#qzi82:nd"/[27VYMt@B:7|U6JJ=]8Uz;'MkM1af~v)V fd5ia;3M7ݤOKuTkFS)2g~Hqp +(iSѢ3׮c~J~$'Op͊[-ºZF&0:u .[ 4@zcŕ +ڴ`;f&2U{+D֏"ۘ+utj얝: ·~މ29WWЮA,I#})j5kn/}Ɵ!I Oigx6Bo^m+=Wk?Fsd}3ܵdOo^ۺWz]OS^W׬a="0ßK/Q9i[p-a [w"T!1R&i?;S2/0xDfyZF{ŕ֧>IN9}zvgb~k\\xd3ɓLNg"oE_dx%4O>&1$Q?!f+$' ̯̂N~Jx?U|YHö0YA:{d<'ᰞ y?]tcHFKR^*?W52CdǸqfxѡ,,ry6;ǺRn׵w q5x7y.#-N_7_ƨ}AkfTY-ELx|̞tjeԏ~f;ƶ Hҟ^oҽv?qk*~9u_'$~x:5'Pt*C$c[`Cmk~d$Q&|CS%b)0AQG& =IAP'qP(D("LXO^5^s3D<`6̑ױл7W@z4=y3ܓ)xqOz[W6ٟo9?Tt4_$?Z:d{m4%7t~ 1ΦOD"_4hT;ƵgO5; C>4'68uNMoEWoFfXVB!s޹Fk8)PJ,V5~cD EIә WQ kN*$H:P؆ZrgIK/ A.[7;S.Ls+pl#<:/mW_'>7npm~~ov7]6_etn cwIs8-8y>[K;a]+40~ k;$C6*#<4 (0.4N+' }'[[>Y a_e:ftYe<תQD0ԘOWkZyaJY> 8\u-!etbܦOcS\}q2N61͉Gx8U5 O71fKw+ˈOuY Dp;) v^ˤOkla{=hɱ͹*N | ka{-c^ `,+xTϷ~1YeWgS5ƦU?([)2>ֈ&cgmgPaɽ!nM[W_*xwK92+]R ~!sB=t'6‹%rGu`vضB2yPtN0csk &KELI-2(,;si9pW̽ލ[>O7oh1본xxW_ uzwI0~Ocʭ;sɟj|qqn4My~am:-N6k`T'TXHV(Ai*ivKi 6aHiwNI7bIm?H({UdM3u4iNAxrƯn|nIpٹ7`<i0)JNx OZbr"x5_/=8?GX8#T/„d?,`mϵh*|z;\na‘g{Bť|w/L@?f[+70' _y[*"r+YhtowK7m>m|M/<.wccqc%mMۋ{K0M`jc>sOx?IL^զd |մ#Q?<?w.!ĬYxFcDt2=JIy *:J+^Ȋ ;/.]65mY~2EEA^Уhy)(l:>sg___!di<8n_T:È\tX7!cϿYRK"nrdڶRޓ28=(eeSKfS&KڋWE)a1H,+*A_QVf,iZ E2ˆYexB)E>W+O[5ͧx>)NvqYȠ ;:+e"VNA M7dA?0ep15Scbѻ[(Ճ kFr=Jbs~ 7h2,V_Kuܪ{mDu0>MYn+ch.})':׼Þp1uɂwpkQbcySݨZ믿~L^G[niRtrG[ҝ2nUL[Ҡ gk {Z \{Ty:]渇)Mme8.vNbߨxvPo1oM_F%}ج6郧eIoǏ㈺obt\Ί.fñq"=9P,} 'JFlV;JshC9@s.!"9`]zuE/bw# FzuۿkܤHi`Q'OTO?͸q>c nhl񞎢of;ʇsvS\<^7Rx0$Kko>0OVۿi@=ɘ ǝ:LI.˜?Po 8|T$V*?LQHG<]tų+8mB%d#C*ӣN7Ocae`\dX )d032cR8i2P2V2?ۺ6/ W|'Zu!2D1>W8N\ eM:.Ylϡ3|vm[xV( OϸnA\\49[iNQo R} F 'ĿPJ@.`:ΐ|W'c7ˌTiv(iӣ;NSF>SkWǷϴEX sBhݦҳ,=UengdfZv:7$\n{r1Td"?uT )26ᤍG?Zˇr5D+W\t#ȇNexXnxmf<>uM]~-ץ>}xDŠ-B'3qf| hM~|Aߣ$WmS=ԮtrIBZ9=/Kۗ|ya! ekۘoڴcxYWmZipf^;a <)͐6"wU`XIn{+/rJ)/2rܳEwfLda`"1ĸsˍÁ7_I D袉̀ < n~99&9nUo{7o~˛q2_ /,qA{o?vD:Q$Q1jvfG㓅R]CL`| JZDg?.H\l/1I' J&Llc`Tʰ\9FZ~{& 0xUIs a2<.)e[2L"y|ʌyt'3B'ۄ.%:.'X}9Ż07N29'e[u*UlpcJKz9AfRXO-wZH+Ƅ_ӡ";LzkMqpӌU#陱}dYTf AvYc?Zp5ޱh$L2ȝ8բ}"CߣӔC2_o*dl? Y/} 3- C'Uy|(w5qu nk#-p>gs 0-jRWNcY;|'m#ǰtIiN˫xyir%Rb2E 2L&^'2ʷ Lr8-G]bka&fO׹:b%!K |0^܋ˤ^Kݪ̱Rw# )g8Xʴ c8ǩ*gIkX%N&ˏ m9!8{koqM;F[l?qHߵ$ob%|\ћDDoa{~],+@mEN+ک*l\xd \(!+rsEIߴ٘] qAw1},Oᔖ'׾HPn2Y6,VW8URN8¤<'q|&?Fӛ=2F3IֶP\?XQgeHK,K{8ڏHGO$n;ׅ>iMa ChSqIpkJҌȐg*1g[(]wp0.◶>8v^aL^A\|oU0-q!o_-ß #"]oQnuiф)/۾M7-262m g!m(5Ne 2Vj'e;^*8gI3~_א.ku?%K#y3%] JV-2'͞Ыb7[o-ڶTJ:ҦUs25 |ǶO4sC5z.B}IX_ &n$pf^7/YxBeo{ĩ`- DfKމsq;PW"g{Ɨ%kY қL(}Qޛdd4/r_6~;ɣl}G`4^4)@܆bxL;S1p:YHm$GĶ3Xw+ ׄa{< 1HvdZdd(.m/ڷBsv^^}擧Jו4nd+eat Hi{B\e m8YXQǭ#N[ed"3q-E֯̅Nh=ks^{u՟Wh-N雸wWg0_*ӠK2Hc+%zAi. Ot{$l x5:L zZ l$cѭ>1nUymYIa&A7j%JLyqZn{Mӛw2e\M]^ŹD/dj?}*nW3>T+]RH_Qڼۼ@4ii(i$o/nKƺm){߲ZV^S+GzP$H~I `6 g,nͷ[_ivǸXkջSrhYv0Au Ou@/ߩv,zyE/?`4[.GMU kͥU^a3}ǔ~鶸c1)u~!Ly1 V)Xge7l#5P*me W5iۧE#ǁ z"a,ites]Kks qffQ7݅`Wn7wŽSe `Sb"DhT 0eDjսMop>>:ʍlj;ZVLt|(Ý4U%Gtv\=p^^jF aB\_J\$Wi̢I\xk_Z;vLNN+'K~8Jȶw!S\FZdѤͭف0Io^ׂarw9OxI!c/R(~^m\j.){ګ_+E4WQU޳([\3} ftͰdԉ`[m4U]zo--(2NAc~I3Z:x=9IdfvSg KpL]$Cy:i9kV|Չ}`:+D#aڪ5ܼ G&g-TF9]%:4`;JlH(gƦ>g~͜z=w E>FZbLm1.=̥R`!-GG+QW|g,78Tv^SkbLt 6m<7e;u Ұ/zYiA].走m;a?軅~ 'e')nɰuƌ:lc52d'bo/ ;u혱2_gglG{v_BT Z8kH y 8j^^xVZΨrVK%"n I-l1mtO1M\PnY!)r-U$Ss5;4tm}}5W@ yvwyATМ-ŕe\uGQE׾k㷩z{BX\g/>{n5vl*)tQe(b{ɇOd>FIOU&hL8hp:6.줅ipQ*$f4q0embުw;ײĪZtl ə)_̴;_›A3M^ǐs?''';.TuVa]& R^G&øQͳprr}kfO=Lw%R'f؆aO@0Z0ϢL}f8gۃz]%S;q#:as9y4\m<oSu<fF)N'_Lfnm\2J*X8eUWL(!1Rtԟc ", \rY{)Fʗzrhg_IGg%\Mz|q>׽*YtCj?qS Ҫ ^p_Iɬ9AVUFՓy ؁v&sW^[Kk77i[QII.Wq^3F|}Θs!*4C9<Ч⟵#mKU^XGފFf۪{<.ƭ~mmyT k8)q\-w-ONyMzm+#g-p yi.' /=OR IDAT~PlM>a ϩBOMß ~c?ؠ2ߤ>~WJGp>ԛJ^-<ї %pgIxt"&Gݎ q4{, ҊvH]%l==[ ;2/';>Ļ&@ +ÃspL(/LsBZ̪r'>ǸϛS/xvh3C7K!_[|mc!BۺM[iT?]״*KյA?% eu=_g~vh8xt q$PO8d6+j&d7i|IûR 3tD,v\&`i6dXԡrN_&JͲ` 2C\|r5Vu>̭/1kAJ&]T+MGi'T6z*578"ykFH̓hn2n}8qUcJ zls-4H=9:-nfɶu%$qgr7cR-L{_uǛ6~)u tƷy~z ~ES;5~ Wѳ7ڱTpu}]OTArm֯7mԆ&}$ ?+v-< 7!Tb-nu- [\_6rJL& /!%R PIIQJ& F*dx|ev̯t'?btοNy~#1J:VL ?\M{$,i6;2p2qSuX_0a)Gi`QjV'xj6~^y;_Hxq;Ni}~ϧ~e kLۋOVz ~d߉T/ta^id^iӄMI5xv`ASh lIs$&y˔:t%[s+|<LI+jڗ|Ʃ}}Y-H0Svjv7o2FJ`$-$2:2QEo4âNF$%V&d>~-y& HJT8 e/%E2)sJlc*fOx7Pޯ-[0?oʫ ^2 ՟~>5~ fQM|Qׇu~yi)z/]ڂ'dA:Yԣ7)}TEF'LHLmBS*lUbY|1&NSc'.c6qf juk6'6Zf)&EEMZUJoVZw ~ŰI*n3iqҼVfSmJk,ᝓl(af<ٝwI;u-ݝ5\xoe6.V:$iͼe/6 *a0̃L4qsM! H{s'+S.5ʉ9 D$eY2U2Aˬ)BKLѲۈq'cubsryNɤ)RrOYxƖ3HĤjWqӓҀӀqq|+n$ѭ푆2B`'#ԋT"b0c{${? ;֤5Ɩru?sta K-uS|\?Zg{կ>mŒNocNc~q$MWĩGIKE{o%BDc)pWc󑎎'm,#[=JsOd?qػmINC`fDYVY5gh5|KX!u;7]5l#c 46`vRti ~L'O}7oﭳ?Zg>P'͏Ӆϻ؀Ō{7) C3E|Δ} NNq 3hq#d}§gIO!D34~\6|YcbkGN~)-`~ ;b4qL{o>_~H\f CcV^NU %nd9RR5Jb/`~~*/I F"BdX5'w c1"Jo"B=NLoކa#Ønk~tFA qST~tz {qNsjQ:!/oxX?XVrtc|+Gǰ_(_dN*֍H?  :x*e]X骫Gpmmo!Æ;I#O~d+k?mo'pB} eW2\&dH}n~GT6Mw hDf@,I慧3yvO< Pp2Ii`+:Ehb~@pSN>th̕<[DOb)Eh:1txq{0T&E3$D`$_n?]vosr[lt/IDgLƺbXf'LpEHd(rvJ9!ydȤv1<`B)B*M:)Pۭ1eNr8Fw?Fե7KAceL6&8U^X̓fbb(d>cI`Q׹s6?K!tcKV#Y>t?bkp1.̓,C->T62t~p$k;߂%O@#uѐ6 @e$|b0c"+`R"Q88 a?>SKu8F 8"7d+)i'QR/6x&,lwy\alnAV,.%GZc_dwGtLοLTn44u(IP'nFʅcq#<@)J6O*0YEMO_ #m<:R<#^㤤OP`Dɉ )<o WJFځWq'rn rl5B%:,2ɉGQf\U?V\P9 ԉ"S,D^A)&ĹB*%pp[\C%M\^a$m<=&[M~w J'QGfqlyR~Y_zT5E yJitWo9}L^`haγW\rbU`#k)piƏ^:X̡|~TgFI?'9 U~h+o,\җ%LD^1RMCօ&3=6 eK't@avlq3 I,p!p [7,' A&|m*\=qf5:q曄-ng硦ǔeR@O#;&#N1-[WX/e+mZ =#˱%_8NK8+qx.ep3MG<1$:"cG1_8R"RAm/ٳ, /VU!cyoiV&<G@Y>]+,ƅ2C[2ȳ]ƭ8!1nrLuip\9nyhqy &mCU!xϝYVN^S8tc奰ސwSޠ:=FdLʯ@oRXzߡ6%~cɮU ^??&:PS.؎ :$Y(͌ #xsp5'hLLYBcNcJNҺ"AyWg`3lɐ,1dX'˥!ә521Y(N qg 34&c\]c7y;Фe9FVg9<G@"#x{R::MQNINR9:x8‹$j?%K,Áz#7MZ\'M+҈)\cfw5i143ؒy4O}0rQ!zRݵjQAX;Q),.S@)D3B QTD[Ӄ8@+3/:E)8|P##7N wl.?қtLv"ҠARl~j>iG8#/m6?|KoStacُi+'}2GG cL ENp V$@@Ԇ64i\_FNs~ ѓ= H^-x'?G;<ʆ-+sב\6p!7:|r"iȇ ʋO 2nmΟi{Гb~u1΀9!GjE)_L>N?r2RWm_o;rTˏOԑ\h39GqsT~·o:DJ AH%K>c|0rrAxum wC-.=q\c[裁TGtdu%?N_9"{(qE)d+Ynu/,2G*>Wg'r14a hs48}K'))˿(TL+ʞ1E.??j5:ۏ1ߩn?l"@uyUƁ`UdW&O9U]6᫬:8]\(hM!\[#Fqg/ʰ|B'uȉ MrjRȍSeBc ]_&*#/ў(O\(B~NtŲ :6DB+LIfqcŪNOuIɿ(|v[Se'szeʋO?*ʈIȓo PP@SDx"|$%5700^j0Se?=e!y3S~^c GLcsʕ+1TXioi"Rodd4tvÿ׬YSǘ͝;opp`ʇdF:rg񜾣_/?JFX>Cye >[O9p9?П 64>v:Mvh XdT!3 Jc`ZN\N_Xr47o޼h4֭ pHD!@? #'rK\&4J? OngFo\ȑ(?[ě-m;5}}}5;Yfc-[?q +X PY,"_ja3XX^=7gΜٳ)?[^-8i7d`1; .,)U'pq뢎$ןcXf,,D-8eYXf+ +22;\~2rQ(p9όſe] d:TƑ".?ԄNp" vARfd?; 2cvF ) gCe+7.?s+dCpA脮ۏxHꉴ(AYؒ%-0Ut]rziS򣜈L n?:rmIdæ,ȦοU9PTʣy&ӆ/?ןnXj;n?:<ҕ8B~pэ'~t+8rtĐi2͔WTh\9}%#w~v8Pp}'||͟Q\ u*ց*CЁ8c}b(>rO9.?OpuG\pbe?Ytݙc[aՁ|zU#C_ *Gܢp)8R*#`T dƓd?Q:P . } ZaKr$zH9OJa' E S|)?(D.sA t,wzXp8ق0#"ɽ97퇊Cb/u]fH\@) } pS'ן|2pAÚm;S8V'Sm?~JˁRV|ig,L;4e3Z8($h䎆k+~LmO%rULNUZNtĀ9/7N\)J1.?:QVXYp1\yr3]R-JHNaZ+:ts_bpq:n?:F f?V+g9S*ψ(5Xf@20-镑glx<2I&-n?~dvc\cb:2)cfBG`wP:Ë\6~d n? S|#l~dBf+ɶv^<):~ցamʦ G^dq\@goop68f繭=ؾyqKwy.M7mqh{>::Zx@7<8%nԍyZx_F9qT'+Լ?Gd ~5H~=?Wq&'z8 =Q=ܜG[l6k^xs5Xv-fot~ 46U[OJ17oǞZ{ޢOܗvS'iho2;Cf⚋k+XB"P .ՠRz*&]9xON:$lhV>׏[ pι&q_h\黟vs Y>9f`(ڗ^zg>>a= [ou؍e<- TЃGᡇ v[/cy먣>h]6A0W_lMC)t5JxX'U-Lvihu`a6<3ϹzqLfٰ m!rX.\Yt yoilZm\oa6m4]oa646Fy͔ cU8Ιopoww,WĶlL>@?ڵk 5p1DŽYfC>i:F0bAͧ~]v%<~x;`iee_?3P۲{xc W\qQG5<{lYP2+bZ^)k,LlV̰i4AaݺumeE}34n#>ˍۀ=$~yvX.S|GlʳtB}c|MK_ __?fJ g`_Oޓ̝h~ y#s̑7 S9y3pqj3g5XJ<2uF}Eos/;[xEKV00tkG0vR8U6*L_0Exc_ wxQ74_9~hYKô Sx yFF(;/"uEzz] m~0cЄOIJs_pqj4wɪYg Ӷiaw ͼ!dڳ~jc%_~o_omذ>L68UT!(SG}$tICx_s?9|_sf'SUO\4Nx/h AeKyhnO~e\f/vؽ?乎SN?[l.:fkZ2=!/2']w5{̱^smg?RB/r?я6wLPPh\U$6qsf OIm6:4ezk3/}KGB 0\_ -ض>oEa,o~,pt="~\`0}g oa׽V?Hⲯo>rƧjY(B_:ŸŞc՟Um杦c% uXNo;}׿XiS57]*dF"iPI A$\oŋÌYa߶2vg7i ?{ V=L1(qpם֯_OjFmt^8%4{oن F/D]b1 PmsYg-;UW^%o)9shм{Gcŵy zu[ Hա@^,[y{W6Db=9Q>e?2f,ۆ ~>"Cm;Nr@J-g1m)pGs?}'Gci\GYg}}@_ nBOm;6U[ 7<-BC=73| EI[*eiq}ہv7bȋ0 }JTg, @Fy~.韽4c28PO/zeGV&kEyo܏qC8ׄC^X>Zx 3WǛ af^6)^syP2V 4~-=!a,JTʁy( f͚ךU?.oz?Bbh' }PA_L5{0l͂pݳk(oqod?,W`t;',sƈdiwTcQۄ~CukSR*':$AV^-VX)Luq9焟炳xHh7}k ' $m9(Xq2hbU M7oxblKp͍Fٟ-/S_)կ~ۘpV;ΰ+Uz‡Jt/x?嚫e0/l'n[.! gyl?裲MXVXo+@bS:?cv zvvo|#ǯep9 [ʼnE;~SkqWlw;0l 3:8<(>~X_hXrBc߯HqRXCa] Ga=#y7pC[O팰8pqo w⏿+[H샺^9W~#DʸahݪG(Amއ2,=5"7䂰/ .59-yyۆcɰxʏWXσ(א~0v Ÿ5lѫ> iQlh&[܈QC@uFVI2-bKpF|99g!?_тy?ٳcBɉ{B'mNN_O\a&y\b8R 4L$Q,rm6}W88<'x{lEK_Wí ӛ(}N'y~[*[k0qYW?@w%yJ޲2rcO>}z_TrU&ke0JgXh?!evꩧ ᢋ. ^xaf) -q蠽 owd, m+H=N<İV[8lzիzX.}/]T_ӘIzX$̉ oru,;uq;7+̚7+M }…9mq<|q\%G^v"^B_ ph>rmaɳ_.xK=( _p?~Ga_~O^hpf.ɟ#OyEܕsQ4Z0\OZ]aΕihʰs>rr1wppߙ|8c|2fyX`gΝF݄Lڱ,(V,1r8֔H6}FӰׇݷ:5]>ogw#_pV BcRncUc*ҭþI{&~GŃܪSCDĘid4-%+P #gpV(=C>9@u衇 ;/~p.fIDAT>h WAZ>%|b!W͟6je;⌺o4yե>ܹ%n-R7:QG5ުű/DiWD@ju].~O:vqG%XsF˗W <#nx_V|va3l:[DiS8Ӽn=KzyFuJ'%1dC}}pf4D2GxqH{:,-'U;koos mW}3<ķ gahg~=fΞ+]yXbтXra}Z>ޏvqd{po^7\{pgW=f/NPS'ȹԏc=\Yz/w$gۜ̚$&db:/\̎pGPuΆ6!IEhcЏOQ/ְЉm_YX>׷Y2㌷ؾn r8٪seƖ^ktGa6v |V[nlmeNov{0+*mNnSy9DN锞֯{qb`L~q2!1'.qK'|pl{Sd?2PEQ^k:OO1O\S9Kguzg?;q+ /|l[~ԩ"\`<֣sH}{] ;}pX⎰vE\ D urP q;vs,@gmR!ܰ!;Ig w 1&v9#z/@‹FxzzcC<с >04~~0fġrvMN_xYA'[8WthI1c=dk[|՜8 O< skE/²5 x&"?6]'=Ӥ%K<|JLr9)cscS~!2,=zpXkܶAh|,\~My15}~o_#1~QBb VWd-6 +LRgL3pOu˖4 =5y|˿o~55nqW%@|X J|^':OFEPQOj\1&u\8|  #]+,YzhK }_Zs!<|mXk?N`<àa8#/|f!<H+s|=@7}T,yR_ᬰ!HHc Dg߅4Q{h$Mt21HfDXGngrzMhqB:S O<ϤV~m#x(GBgN7b8Q߻[o| 1q>yAё0Ql]l6RZ?6N_-N1dDAi$5Oᚧs_5)Tj/[܂`V#<"OӫV@ :{Lq!oY >Hs<|Fz\[6~=iE^"A<ڄxE2F@hR&(WV<ٸLL{f<ry% gy|rL_ Wv}wvh,3!/ipEx>8Jo~ۍoٲLILj}> N:T\>(syiիU=V"P&d{hW3;<3sAl`\yӼ4S<rƫG5,;r_6vc.D+_G׆z-Cq^0Y i09 O~3g{Tw+EWl!oђg=:"\5)e5=JҽmoCO^pБCaktb)$ TDi.J@w?f9pqNDͥ]LF\3fmV1~5Pʳʠkrrx+W| uaɷ8N߆#J-GAAZ2_7o[?/KKt!.=?6==Cpv wyyZn'yR^ҹs:C82a-K ݗ4%?&o]|QrqJO C\5={ҥ׶i0Z8-Ǡ2[_#c2aeՂ~@jp2Dtdse+PB/=EWlZae5osUzHFԐ85ӟoچ_ؘiؾ9r)DM"~YMO>7l -o߱8;c֒t=gٳm0*iVj1c?Kxa -ܦa&>7a5a=6Z^`H3L\)=a ,AzJ*BmE6Xό5(F珄+Ѓ9Co`0̙XDzgϸ^5V ?ŏ[w=zZ/j Y?BD>WeG'6m4qabV@R9@yy뮻!Xk4i< &L pUgF2Y ߮_j¹\77GפmCɄSǯj[amhg|U4t]lڎ%u0v(_5uw: {Y/fb_ݍV&lV /&!K>Pٴ<20|hoֶk:+@\җ| BC5ش۸,li,lZil|?尛]8 نls+v Ku#]k .TCMzJCNO0Oƙy.΄롆99}ZDw"6tq 'Xb0ʕ+;vjVZc?WnAc޴p`o[g!JyeYʳ?]m-tvĉў`yRԉ͸V*@U`XI!VA|PMihzVxD_VƩWiaD \f4 @LyҐ7>1o*t'͢:u(O%{1:ݓ!\Av<ϸ p0!S|)?zUa@!"[HiS|O& W=gB*IY>-QGsZC9n?O kցJ,UVTau"O?3D(Ulŷv$mCQaq>BbOh&]_"WTeDG@ rʕ"/ Mj돕n?}035':(o* [P5,N./auG5OA/At9I.kk:P81&rg2WTp_QaDm1o Բ,|iwW[\\\b\põ J\j\3x>aҕQ"1DLJWo0#u\O\3^Y)sq)žCg8^t(.D> @1M"h! pq)]ʘƃM^<zWG^y.?.?.?OǡD(\m'@!Y@^\D='>U#7^-ziapz9}Ɓ^g6,lz|.g6,lz|.g6DuK(={aܵE"E=8d*i& =R-R{s Wzߛ+w@ʯ7_ʯכ).)Z'ۢN<RH6!G4e֣O9Uis1gFp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx$Gugn/H:eS"0` lM& ar4d 661D4d069 "%p9NWzjzgOn_T޾>-[@oz \" ԋ`qmN9$c  ڥº"ivTiG8;*K=l~;юz;#;*Os??#=|OIW|f"k8N0͜{)ʫPp> w,3{x=+`c G?~G?~6VN]Z׺MAҩ20AcU:W Tvi`vyOezB}дge~~sӏ;?* KWKtU8T#6->ف6R4?") ԏ|GE?~'] ?I cQ|DyZ*٬X FZ0EGNccoc~g?lۏg?J?&NFby`px{fnCG FD[:} KkٱǏqǏ#Vc3\O\w`G߹{"lTeD-ˊdX{~}kҡc:3QǏ~ǏQ:q927В ʭ0́M&¹Nc~}?3@?~Q?~GzF*0J|X@Ex\84W8Z=}6W18{%ҵ?CQ8zE?~g G3LqY?.>Mu V|J' 8죣qp: ӇƎf@6hy@}>?2 mcϏA?~GcwfO~ uQ$ǶA&p`Q?z ~bH~X??pe!XҁJwǽŀ vcBe~n'=yЏяfѹ4nѧ$!ۛNV0,߷OO?_~Zg?X~?g_g~>}!4h*'<[T \ۂnkb+֜Ůds=_KVX+}Jxn%^[L LJEo6"^,}-/ue?i2%?X&+lQ 7o̊v@ME[K꿈v^.B9 ZE X@+O:C{w͒JOO5\G>pJx:+D>lT~No?;Je?!},}usͭUC}pi9E} EuqKj<`m(*LP (,!=5~t=ܓ=OyY: ײ^zz[_<]?g;AO4]0/cV<1"v @K/ӎ1@n2# eĒ4i>5<&FOxymOu_OO}O?FW%K'zUj(4]? D4 f`B=.n?qW\Ie .&z~e߈~х}韟'q ? }M( ctʄ"-מ~M+΂S8Qp,{~GbxQi!ʢDT;#}IF??á@'t]]v <9(o2(j2e2Ѯ`?1FyOhE햵Q̠#>RT?cOtkʇy)Qf@(کH@tE;JnE*{hz$2xn韟]=T~JT>x ׄ ܲ&%";u~eZ *~IJ?^S3tuӟOT?#6m/rg?:}vd /O~Roذ^o|]~_#Jտ۟NTK2zu;'}ءO/MRN_fOsaTĈ%Bu{z[~{L-]:4wm$6t~BEq}(ϐdqK)`]\ʺ2NQVz- kҖť (.nDye%6)mI)`]\.iGTA(}Dyt8=}Xnq5'GO`Q.}rD\%/)/5~\bk_5}mnFϭA BKAr:j}6?.'~Uz؃ Boڡ|,VRQG=QW5K{1k_3^~o]+-e྄ϧAjR+ @4{F+c˔/:h&ck\~-o9G>7y[e o[=\zp3r U/{j-q uk U6t G'=i}{"2#|S:вw碞EW7裏6߃RD7``gCկ~uaUΓYjs/~}~ SjmQs~ ua=8-zL>_S.' o(<11p!gʩKtl/{ڀ}e_WlRY㌰lD䗿eWW&Qpth"Ѿ)?)Od0-fu|h͚56I W%M5N׾X?~ꕯ| 9`l9|>rhj }C!"F/ H_a?õD刑l3W1i#>_%mt^SNgF_fr˒evCY gF7dMn{7ցc$6|#~w?}##wӝDմP7!駟>g}PVe"ړ$GaRtsgV'@?9ui=P[9Qr]KxJGgȩ?a]/+>׬sD%1 ^IO-گwq5|J߉FugW'?+Ұ(ePz"6Bq{4rmSDjiO{Q9DQ("ۮ)S`f #䲷|+zqF_sL/}xzֳFX<`0"ɿR$ =+"o8R518r0ssսZ,7茶ض_FHƄ3J>G?jGD+ 3=UV5) Wmg\6җ[r]PI'4RpThcUrdG׽J/,Xֻ.;vrƚRR~q5<߀em栋kĵz9@}?+ 9M ײ=-X+YaLKXLKX#EikTo 'JUh77o2M|F$D9SZHLHL7pA2E veh R9*Q$HބR/tP3=GaI 'OjJM: nwsK~DCv̈}ٲ #; S?2;9L L??h9>ݙaiW+97Cd葈&8r qFW (a+VhÎGYf;?pg}-ۆ(pH-nJX=}o?/`eY?aV^|Mܡ.r|JT !a!(/NÝˢ_uD΀nٲe4 ,gnJʕ+AA_VҥKo2quZ ;{OKKb5&~hQNS\{ Z[.`s1ZG~7G˾׿ ﭵM普d`J.UXO?1ia~#-+}lOYcOOM5=1pEB=.n?Cgr_t6uxpec=i>w\N;қc>&D _`/7"DN8y {}os8RE|ַnw_/9mRԤ-VYU:Zm=-YUo-QGo@(zm" aɴF~ϯR%W"zzhTqBkLJ^Jď=p-EbURcfz"y >-Օ=}o?/ޅ=Ŵ_.]i=4́d\2o2"dz0ڶtO_t(+mMs.Xa27`YKA>ϳQ /| d/eiHoVE.ЖLn0RAȩʙb`w7ΒKі-_&5*`@& mrwy 9jB/t e*mbB_7SNySuꩧV8#-IZYQ:`5,#s;Qxj+lFG6hDp@o&FY7ׄ͵j~W&L6t{L_x \iӖ޹,{d۰GoqnSƪ?2Lt_9P.̌K}lnzz7̄r&׫TOWVaeQŮ ot"Q6:_oyCHo\;44M#qeǪ+Ѝb ޢ c8Ze2`&(y9CLb*""BWʂj6q4NHUu{߫鿪!YMMțp85PF&t/`c?Tsg( 𑎿@@cz%XuQk&v, ,2XÓ0V_O_881QJu}5)qnM$Ό9YWQj @TeJ~6 /c5Qt_DD0kǑ 6DSKt!ވX Gpts>^Z{|9GɈڏˁRUh&q7Frcd8Aogb{NzE^X-GJYs.Ϗ\Pe6q [#U^:׆3ϪX[#_em?:J(YR$}XNtKm9*]Sg;L؟r̴޲*gk ZQ#svB;vs:\']FM7eϑc>3A`✜N"fU0]hzd]~_9o;KLkr Sh՗,{@!. >`".xϞ'Lijg}7c=2B838CXnKy$H (Y0[9wy;M:p364Iʃ)@)奏&g5svauakLG'mܶH7ΛKPK.Ul*}=ZYTګE*6EDYѷ}3Q {~Q5I,vhaz6a|>^ R7 !1̥{-4=m? uQLX_z;L/; r\k8 (Nlj!DdE-!yBMˣvۭ:UZF^t./th8)DKOKm!%-NP]*0 2CVpM6Wa+:ŕee򸏫iI;s讣Fr */zB )#q+tؿ3F8>e;b*J_FY/0r%(LCQz]~'p9 A}@U[@Ukiс8` x$,IXд{0p2c|ElkH ^#5k1Nt\pG[f8L4QgKfRnӖ)sҳ?e+T>)O ;]^OnV7eBmr_cmmإ4SM]FqUڿABe%Ihy':^ǵ_xk|O)"J IDAT}(:!>&9Y7ߴT=R*eB?{P>Rj?)rȉΓSK 9&M1]z W'*UqM"P y"S>$7*h&N2\q-'bv4O8ØCh/ ܎O%S/"Ms!2[%I>PXg6 g.(̿!'ީbڣ2|A6"(JQ 9J-}fѦpVɩ蒜G)rLo2,gX$?Qt^}^r~2=IB']l~T:a,3AFa{弊8dN=}o?-gs??6گv(˄ 8cDY~؉ -1,߷MOO&mrF -q@|tɡ(qplgo CPzlHt'Z"]9@^7o"I^kUZR,]c6TQJN27SVK_-=LA,21YV3˒!4PNy8Kw6>cKqQ5`]7JXO?%v!umRڒ2Ruae\ (/qc[bR&-)#KYQ5`]7JBqm|ek2O7eڑŠ̰ a K=m?% z%}AYNƍmE:d1˗$ n0~r~,dyRfa8y):CM!J$g$NT y͊=|r ܔD+^Cr!2 Jy'NYt:tV[V.7N\:YAfJyO}{>}ٱ}G#WbŠ_ Y,OeY$eyO}!_il֞hwo},ͅS˵|Q(487Qe: ND| .$&Wlo'7)-l X+I2(”qP(m/an*?']4MWO?`WIO&KX#- DW,q8"$zUby-[cP^crWԈ=v='A B_qqá/O79Z%Ym8gs&G \tMNHI(3}'"&^V,3 FvB> t R^ߥ pH3Qa9R^_mf _Y9RQjs~(>٦϶*Ԗ+S{a';\OeG}}?u-Z>]-ș( + E%> n?&Bf>ԗȋŹ\0GpDy=@DyώX١vFq Xvvđ8ijQuXL32'G%5pH?LK-E[wZ!e->r`3!9m[±BTczp2=l;d{Nqv=9qEWKQCN\{zY_gQ $G~^(xM;~$J Jκ+anpy ׬YD%Gh5fZz3FWqlpSWW9Rthtx(B\%ZN}Q%K96@+'Rs5Jz H'=(X[7O2³a`,ZAgT`,%w O:4"L#_)oy0AYWHz )ԦsvfLO'Õ+z~eѾ2Og?:hlZLNW^3 e f8p p W1ѵ 0Mn'ph5ڵmoPV9?f%~G6XzA33i X?Nv*,)OĘ/|󁓞\o\!_›(f c&^ nF=+'e>ƍ .`f\:7o~_5x&/=>\,, ùĂmbW{`횵"v~蘯̚2Rr gJ&pHss,jm:]d ߔS;gҦ4]#qNE_3BzVGgC5K֜xÛ>i@Bީ89BIDM2]JhGhi^4>4|^Z\jeb2rɂÛBn|L9iz ]>!Y'3+C+yeW5pKX~l>sy~:m?EcCy_<~l^́@Pbö̤t(c*=g7J/їl# +ڟr+ ׾,=vۭcˤLow}92k\XuQZmӐ'BK?Go ꠃȁߨ_d҇!|;EW(YQ3]?;[D1L.mqX&QץOKO/=iRdySy=Kh僞&GOyX|qMkE{tM&yr׾vu0QLKWOju߰:G@gIo:3;K>JSKZv]~V}̱ᇯVjںy=mPB_=.au1Y|,?3@%_)Q02?яCu^j4na7߻???/1}\R6l֒?og\gAsI..>>.? Mym W}ݯmcMv_ "?NW{+?Ɵk;~N +'3I}k0hy -ͮ@:Ro] XJy3ڿTukגeZ&m:.\&Nx4DcZxrOmffI5Yk.4J*UM=`/:wiNqT`Cv-Q2 6pݚ&8P8pV(ϯyy;4DzrYΛZ V!/xAO}JzȾVkNKo۷U[dTo3:5\xj F,ipݪe+w6ons?=>Q_>RTmFZaKy26J3P>[ڶm{ܧ,ާ,6NQٟxzի^54eE U)ݐBg/n3LѤ3k=fsK7گrτ$gmPҮ @E$ѫc͏+t-ф0Y=ڶu`V::T}ȼR%8/%=GȨgskDz[TfҒ}},'Vtf vI -%#coW~g \~(wΣp",*צZnKr86mʞ9K~8&nҭ^7^񯯓zg2$r(Rp[ķR{*% D(㋏J 'j7o6|ֳ5Q(*vH/dDIMKL=mẻ]K!7EE|S?r!d3̮ݭ^,tqǤ=yï}ks&8i课OlǼ Yq A_{_#]ʶNӂU?A3\tu?Q"$~j$谁+EA#IP :2)>x֖ kfM8ˈFU{WbZ.,7poiJ&RgՆ%98)z-nYwM}s՝tZKo,67{Gy7?yLl{O>ǡL C-)cG<ɛVyi KЖWHJuhn*g+?qʏ~]~ ;0.FnOË|?E90p@$w` e\ֹZѫ^1yBֿ7pq2(-Kynڵ&( b2&h%1x\ǽ;nr *EڿA7)hsp$./N- :-5ړ3D:3q!="]+5Cp)2t1S1޹L\zfgHy-yljǾ#P6o֮PK|[n&zjG__ۊݪ~;O>fLx{~>Ҽ7hiϫ#VY7LTCRygDz$eNT7 FR#p欳ΪYz=_r.8RR7j? WX|;ߙMFԘVի95ЇjN_-o|#>67]*sFjӟѫ_jzz֧zeDߌlJhBO ur4QECJW}f>O/ .Mp梉} NkU)3;!eX(cXo˯1K U_OOF1(eo]pEtÃѥHWDDMrX`y$"򕼲oε٤'o>8n^<[os&{Lx|p8"ta0&j>%9J-SmחvYrUl{TKgu'L׀ L؊Q:', 99gڮ( GD&!WCH_`ۼ/J4\&IĒf^bL{@.YMK p.}KaM32$"?(v%2M?L&m^iZU9O ]A_m=ݘϫ_O{R}[W?1O${g`W?ɏ:f־COzt7Qyi*pKi,n77>P;w7+WVʓܡAbԍr&EڈaJ)W =[eJk'>Q>M/TOt/U7Ȓ~G5yC,)cT{Ĉ6Tu%`^a%O~H$-6(To{HKp@ˊ4 kiX#3yY' #aN[[^u#'TDY>*kGe# 'Dv_ґ嵈~BО~wi_h~tq_p 'S[P"WB6KU^[OI g7VTVvX^ pЧO*0IhHNlt0Ԥ3Γ'!-y-8% Mr{vZdK#FќAu ijT^gݚ9{uk&).zMG7fiY# d*,9"zZ|U涷kVw\'QYY-O&-nyÏ)T_7}*<|~Y6x{m^{ժ7r]cI W^]krsO^{j:`9mN꩕UTIҍ/ĕe"J#S$ғW)YcOQ&77W^OW\{uy{اƚ_/}%)9$XFT$Z3?pYJDT죢YSdZt+@׽ЍeCS8FƯ~$O]kNLF?s=[k)'`8(6=v-:D@]hʢ^ŵ:ܐ/BgB~a~$e_ħ.@9x8 C V*E/p^8C,?:M{YNmϘGqČQ& 7{J!JLkümv-a_E=YO n%3K-:G"CTHR`W?ڮ{P_KߤAf.r-%fISt^^{U[>a_ߙ߇{N-i__}uRzC@PtѾ%'?aSFӢ c=|G6*i@G EgJ1-x 'H"2 Kr3l<ַP[Ui?HK7æl*uI'y/cxJ]d= /~GנWl_=hvC-'T/"2Kv#it{sxcQVSnfG1>Zzkٲ` a0S{--wDF|_R,s+JA``cx1j7e=h#(ICFr5AK!c,_VEh/N+gSK7dLdOn Xɖ`+zk$[8`}U]!dJ ie;} In2|\K$L2eNcp(TNEYMA? ʓɳ#.wj/T_~FO~˟o$eCYg67vK'ۤY }:@n?(rtev3u_կUuAT￟[~쓎3 mX_̭#LM|rDu->9ٿEĈ:VYFFNɭ8 *ha=eSMXL9qhLφ{+@B>/眶Slu ' vg|lD=~@b_iٶMBTݱA{;gU)(FU*_l@; v3@)yfeA g:U|OL$ވЍ_Ʀm0>5]0in& voN<ߌnA뀗$e֞هp$M[PPHLfp7,!%3FH2 fҌI Ub7gyӔH!Zbm[@G;CYqq8о/$I)3;Kb1tHzpvԲ,UY~F Nꯂ+wn{?:(fM a`.>;snݴ^j)H 5گk(\lhrg;V-܊V\@,Lpqq]%uU(ӌqbsکtOlRhx79֡$Q wɓKL_B{{}8r>Yr$V E-8-8=58d$Aµ|\`b$b#pE]P(4!5"cpmryF2(Cj"9:9X}|2W[U 0!=OY"BARY]J<َ>Ï> ShR^f,Nԗ|YuBFV6t Y'ecx)1(:%/3ԗc^&*JBS+Dk(#_ +V wlT8O;]9O$Ty^m>K_Kǔ3]z&vTx9PʌLT(?d }[d_5fLcQԩŊ u"Q=y2\p`bOF#G8 u0h <Iȓk'be䬙@lE|jiV3$(ͨ=YlG, )8\*Yʉ* [AzT/p |~MO[ͱ @ESF-AJm.unl:?] !͙c۠wKtro Px(o0NlcGCAkc`>a~cogl}) Bq(=.Wy_>'ډ0.&ALК!PxXw }O\^֗!kHmi8T>#msyo˙uؤ}^KlSa3,i;oyL /k OV=V%^3'&.Z+ˁn"h.`8bY< ^e|H$Z 6[ gAtJT2,Y Ua[iV\ɶjھӄޞ4Mo(*%)2BXr@D_<Pjd}2qJ18gʁReR-Kۄ83_m)p=>jO[JpShP;e۷Gk+cKo&RS}d(AxqH/i|^_-UEoů-J^JQqO/%WcgYGHHƉ<)xFRӀnlc\*Ûqڗf/k\~ r!m9;ڈ};dC4G<,)gCLYE mbORSo`j +cb !nx1iB&+yYl 3On?m(MGb'D(],&G gQH7k۰a~nfcv>Vo]QoȾZ8YA+D7Gğ[kk&8GY)ke}KZQ^a0O<\m?Ē*n!;[`w-`:G݌OiKK{%Z*6=ئ-F XQq5 _9< +39>z}ghU^"E)R),eE;.˧lQU*mTW?z]Tgp=-m?3Ot0hDn8KsE2&5 ,˳qVxi@T\* GE$^4 4+e.7\>#K(:\Q tN9 &Io/gAC?i&-m]pfu9Mol6o7;8Y9Hkw@ t4<@a dzbF,Ul>@)Ex=}6HjS3^viyUjŕ6ˁG&z"Nx&zD=z"Rt%}LR\y񢬄e]\K^k8Se?A3=̴M䁐ҷ 0|h/跰3 l,AG'gGdNvEChfA݁& ̕'VK/971ďă=kG7Ebw<9j ǑS4S*b%zkm&,[QbmI &k֯k֯ 'jKu,y],],ݫc䐮dH3ЃAݤr$I4Jw2Lmhh<*i$bncsUGה']h?zg#lu64OhfU#}B1_\e/ Z N`.[bbNKq[3w(Pq$!K˜4&9Pf\2,}I u~Aț^:x>yX3vL#$)$?eAEJof&͋1Bf}}R\LgC)B-lS=[F|dFl p}r:_5W%{$.dx>DW 5[ n9rSg^2F,#8b&ì?EeD97+ꔴ͔UH,j)Y6KUt":Kٲu7vh̺µWiC~JQ%CJ:T8-e.cfe׳WaZj e=9uRB7RK99:$fK˺9 3k [G"/{mSl:^ISax=J` Γ>˽rpxVais59 -}aaŎiCL2TZ[>ڋow-U,s'(pR:JzQp\LGDm)Je>% NLO0op{Ka?Af8|_vH隻-O[G4K=}s L1)2'P k˅&\ʔٖ>? J;1FNcx 2 ,jv:=VspL6o\/_\qZw@NۊPxCO%>ҟ"w+`#'k`Pf aS@r'M'I?)k?ms>3iӦڗ3oj֬z݆:>@omQfX ufŪ}}WCwdYZ$ޮ:`~~6Kia4`qvLK^88J&+zׯ;+bflN_1eyOL.w&3ŵ}/R;QYv?HqQK;gOmۯx9.;}:3~ B:߭9Úmْ+;~ [KxHx~h֩uk]KXײ P!Z BHt4%ϕ#Ԝ{p-[%LL;> n/q& H:{jg_2$}{֭&m^^Ouͺ,Toܴڪ'}BT&-oݭZJ:cI言̬&4PW[8f;5POC*~XeYQӧ([MSo+q ?:fwz>Զ3ghVϷ>@ |i A](J\]<)_u. i(u [(Y(8K2FD [O^xOuQzG9O5 ,ɢeO9Q1GRTҨ$<8lټe6-Kl eGU[ݙ;ݙ !dŒeB@D@䯌χ_e  d@N~Z@ҝSSUZjմNU>mѻ7ݳL<3MnW7p=Cab`%cI\WȞ->eE%::T;(y}OIdrFIFBQzf`*IbC$K00+He)vLR~چWfb&0;_ۭ]zB jWFcpSZ-C!&}.n'Xw^pαTHZP[tk]`+Ĥ'aOUY3y~]֭+'}U'w#?.iuzC@+axzIͶ_/Ԉ. NUZ?ū]o~ ND}yG=^45(`w=ʀ WDJ#j2O(q33 Bl߾}yǎ]wl8cZ4.eL#kEs[nvV %TV^}+o(vg̼n8_o2eU[m0Яt[oDz]:( ]܉# HU!$0*D3L*oHF&QHlDP e'aUp8L.#1m lAtr؉>!.$YSV7 ?Iۀ5c  Õ̉jHeB6=gVtN;Gͷ _LyFPhҌQe)F&]K*"^`o> y&h}dj1+VU-7g6m:>t ﻋ/}2Sj_~Oy7叮IlUZ~j[iNԐ_>lY~Щ??1 oɌ Wj43߯. .M7H# ;w'&&y)u<Wп/ ccco}*v|<*qk諢u<yh"xw*Zj:ݯW}zHc~j)w>Lׅ*-'?G5k&+9&gx $@[sYsmr9Vǡ Ղɵ3yΠ r #|PfEjhh\k'D:/KuV!!&/G`g,&w&X؎|t ߙqZ5inDX++Fw.̃/$+忢eN/zMc۾ gc Vt.o(=bsoH$lgۅ'J2vɺkDVmT4t nAߠ#. >i 7xS8]ww܃ު~^sMظic@iW~'>:/kTyyؐ|w{O<9>MϷzHmܰBy8˳ϖls9hhBSߴ;t^~*?*XDb}6YÏ#VL.d_x;,N:)|{ 7|sx{Wu6&A_i*6hW 癇+r<|*9A9M>Y &Jipp@N'uiv& qH1_ _?sĄWu3z#@rҀ7_/AIJ~U*eo?Kw=e&T+gp3d͝g+Pr><V+wɈ*Y_M7vՄ]qfхJH"xV"!062-}Ţ._ڢ`Rk `wGVp|Ox+z>K.^ C2$e 9bFOn ۾Sv99F5+k_..!=SNw]Kէ.D.>=G v鰹:t$ɛ$|R]5}NC-pbyu/K|`φ?o|J$v1+N5А'oTf/Mw}soէ=3Ӟ&獖eO ?$>{FB7i Xǒ H9>zQ'TepKg/G= /0կ6Vx3>=ʓ ;/El;Çyyg5O3 <])_~ǜp)| /x~jFj%iw&#$- W)1špsvJ+P&={Wvfb^k.`PҤm}on"kcc*ֲ\͡(X/-Q2nHcN7w3%y`i CE)3znv.WgNm"5=.s o>wy)'[<3.߆>q9gR\_+o ?CPjS} xhfxԣUwqxzDO=ꮦp9?W\~͛7w?y+ݣc} Gj 'e%N]wYzS +vzt<{ᬳ G,t]@駟F+ }CÍ7hp//[nŞDۿ[K?“䀎]O|k.<$|6_WэmCE/ғ{"r<ܡo7ojNwhVeL/Tɢ:u|2Ɵ^b3^p3Ӽ>L]Nl$Y_T?kL9HMH>h 4ҋW mK̍3"-GTz&~9GWɈΉRsVB}{ L[e-Hs '4 J|W9>6VA,qrd\{ _?2GނD^N?uVX8K{wl-ocOEܪQAuF4=j5fqd NqbaxOkÃY~NxDŽkNM[af ?v4M//Q\-9 mwOo*tuӞmrpO|[\O{㋧<ᤓN_[w^ןw<wgui.7tc,ߧ^Yu\>מk##~DŽ?zӟ'*W߼]ŅX8|+_ [l ykJ=j(Lj-['=x^>_ooi{϶C7pC/կzu_ST3LV SN9Emmo LME}2;:܏c3J'X|T0*C;şn oy[ƣ zx|u{]x_Tҗ.w7c/\tEZܽ{w7aO>_m [n _|1 yw IDATs2_Wc9*Ojۭ3ܳ7էo?.yGoQk fc_wߔ\n<'=r0\(g3xkҍ>=o5s0\ЅZ+kGÉ3Ql1|JUaV4BZ&\Y[qkɅ@2y4(0sԫ{e6<րg\Hϖ0uozEa6e5n&7h<<%.]04سkkW>^\φ};ˁ ehX{Ya⸳hyɸ W\禯=^{2ghMѣ&5ՍMzzKz'x_'u-Ĵl#rdԯ!\y#!rՐ?ջ"UT}k+us1Ӟy~/Om]^ 2=[^r=ەh|Cz\m>~wח,׼է?+383\?ߵ9fݓda\Nu8 /|K<5kL'<ᗵ]1λ]utq?֯_O?O49|6cQ&??*gjʙgBm?Y*Y)J.srGC?KKvfxb1C+i2·m=a;8[q00vp7*1|0V[?y*ZMާ1UzQ;z Ow[8qF 9»[39d􍦴Zلr:l~(G_J104&uXW!w9( fBU3i/eգQ?t"ݏ6i<̚H_eBXV=Ƿ4SfPm97;5Y!VUȂ3ɗ iei_w\y5WGݻ߹.G>A''z H--oz-zX1ѿ;uIk ۫GuZu&^:Lfg` UPqŁGYc~Iz:C}QGˏx Η(]*+6l^72_\ϳʯJ܍U(ru/ֳAM /;/?G%/yIx~~!|c Yb-2 WUzBV!a,lU^zf= o~me-N![v"aTxʀbŊ8窼,4lb01w7;7ǻ7ߥǦ˄\=# ){xp"i^c-"Ww*`5oktۥ;}'?{]w;D2.+ќazxڱf |lUՀXaBVzcƓ~,vb ]+0kiBֈZOVPpO]IrXA-v9OX];s' %gDQܓ [rS~Uvbƍ/D Gj=es: .xh8 ukB9umٽ4)ZTXjY_[ʡ8mobp\~x 7v;/h!2.h%JVӁs.3AG%L~yAEꚒ5]s3|#:g<7?x]a?~-]zz}ᚫvNywڡ2ͰI_kO. ϶:9]8}ΐsqUW]i-Ix_Xݳg~<n˖uJ1w9.pMgk4WO}*Ƅ|#&^/[)Q$uSRm02 6w|0&ɪY~ &W%g&&* z1% +n.fғs6nUt 4 Xj6^|aeB*PWّq:3?k)n4A!,KK7C5IgDQDf>J\Blc8L&?|5Im ]z'5Ǟn.<ʕDOWX8꤇.4&6] k-,B_!#O+QL\[AB_7Va@a$nIB=muѨ&0]*֖ gU8xّg>FNJ=6 { |sO^QLJO<%} _pQ~C%wχG<1‡W_G{wVo =^vy/=&T>q1^5z^go~CG>8<1_[/.t=էն<><|Cm}~\-~ݯ0ʍ"N=TY*_,jR<xx^ ]nnwgs4R0m6 :&ÄiYzcG$FǓtq .0嵯}Yp ӟt[47}XUGar6URfHT8OVE]H PX3&'iCo2"=d3I:uS-s|%0vIaprw}TYQ6l+m(O>̰sێoc7Iq:VtN|NxyCzJ׫M*Uv if9,~,UWAQs^{A7dW\YC~]a5߭Ua[h0~m#\9=56+8~L qt('1HYyeZCds?eӻ]pk'bIƄ763ĄFA:a6!R'UR2zk/$K`_(0RƖOD5ldK XL9;g1,갢&nO-BMر.'290EO1wD}ʟ$X7M^Vp'EM(OnMkG%lj<ty:=WAp\1n0p/ĄBU:mKO}4yJWtqqNcTYIԮd`c}-G5zbg0X5z^0&D\083z47nQsyB+=qi[zn+X+vo'[~uF*Ccb}ecp G_SQ9inj2尚&kq@]x0Ue3m v$ ;uN)ukIQ`H%,44AP*`2J᡾bRnqUb$?p fScuIȕJ06!ٝ |0zbBat.Ԉ\ngCqk(bphscN7wvs#ižaqúvR~/߉R0h,i JRUduZwbGQaGr>jPU0hUh1С7==T6GUVԩT ^k&Jt]?+N?j.eKIn$5*KPX%bWIZY>e:; C_vqGaw`f`U9 gƓ*$"plVȞ?P24'W[ᶂI79OطNӷZʯ!Fhw0\[?2 \W q!U(ס 7v6~ZVCFsZbK Ch&bDˣCariiAo=эi2iZY& a,EQDnBXcr}ԟX<ҧ̈ yYZ2[2+qЭdK-۶^wl+sD1>? Şubq'knNwkB ?ab}@N%_Il+ +ei^w -!^a s{!|NEA};?ԌjJ%sꀕa`Y{j?cuiZPRZEᤊ4,#TѤʲBُ`,S! hV70WEZ74J7uX=ޠ^k}xM]w8 R!o+[k\ & )uXi!W;5V)z#\NW~+ĜqOT93+hyB9<Y$G>3X4DkׄK\ahăPJC+a)oܮۧJ&`]I6GF:a+K0_CW,KU˰,w7FƜdhubg8nF W}g9;}sqQszH 3S bN`Uťm;(~^= ]QS[dIeNyV* .Ń&-Nԕ- ߈7OPF*5'.Q:A_#E|ɗe7kW&=@r1x-%ah R+8Gġn⎙@q jtX9.Ǿ*0=F۾uiʇ=91.Im8csrIp镱ɓdAJZ .N-Pڂ1 >* aw)=+Pl 0cg*J/SjRH̤,ŔD=ʴIuw5Q#1~+*Jf:S֖{ZU'Hwmq=!/rad`Zm*6otk t~3;Oh8΁ҜՁp֡8]?VrlRFrbp8s'o!CN@ +#484wm;hPMޅ.[k1KY% B g;5p3Dž)Gc>Ό1%Yq1(n' cœlC(OtgƋ HZrIF0KqIBX)1z|3sɇ>UP 8n=<sE·^hK塘 }+CkPw#aΩpm33S: !5z~jiQƃg1L^Np}:c50ORrܶ/D{%x>ztџ\/npY{|aWس(܀*yFu8LRtw 7ܰ|ח<DiM6@Ӏ j3GFLfX:ƴM٥Տ5ZDF2}K|oT |DŽ%KDP[Ž=A 7/E5˭AXI rzjGرk垛.+\suشvX%,./ zE\993IǞj7hMhlW1(*$M [B/8FYfFȕ'}p/t NqY|!!Vp 1u X;O 2Wq&<}.z3HZA@mѰz>8#sc)s)kMp+z7_4jq@㰏ixg9,. p00:<,ͅH#CF ƶōžnqn(^6qca~wzx qOXebCUq>L%ds s[1)C)Z`яRq̚o舒r퐀0`8$FN_QMkթ1@u U "B`ٿ~p n^";7\*ߊn'eOL'FBlH`2kgy*nό(7+-.+$%'U_T CRR0cNZq94 #"E;-uN*o%4 pDڊItGW1oX-o%0=\0TgxCۖڔ C.xL6na@(p!:I'Q ti?2fpƢZ> ԼהAqi&RJO9=ghz.WDD+i[ƛWx#”A4lv~U$E3)ʁ8>>܊ٹI F$OG'LsB]##=<;y ؒoL uYV>0BQzmYO/c 7c7mfuի?˞pۊ0:VEسo›{4YJKq6Ql%nwF*[IOUBN -a숩 /*z*HAE{,Q+#Gp$KW1ޢi?T/xUjGGYRO4{V2rS}Q全 ^6' C_uXD/:.}ԫuRוxzi9C%zu4긤ai:縞6^S*]hܢ8x zZJgJؙ0 zgP <#^Ru 7ܵk+$̅T>& ;/#mLA#&at傞[IN:Gu%Y۶HfуPU44@4 1S%I+zXBJ,Yau?x9N=aCq駅axi|br aٍKؐeAaN]hgfH2h8=Z8jOy9P!a^YX SSavfVPq~AP嚓azN `|ቃj׀(4 eUbkJW&F_3ߐ ^Sԃ)!cN2{]7^KhC.eXp$: 5;nJw-]zuڏMǔT.PM(L4)jo ^LlXb%'-z o{gf\7·qfd5>bsTtm[JɲA̬/9^(pM.6LGayEDcSt$T4g >E ˙DV0(b-ɐHӅEwHxIzkv{#和횵z@ܿF([l! [v˔MB:4]1W~Lk+if!5?7sVa6gblъk,|Uvak4Mŧܵ G`49{2=N@Q2.4Y- .EL3Ỷ\U8Sj,:Q!~pG־:gƟlAw >7@DG.~bDomg2dD/ggg];wz=-C'߬ ^- [1km^mSM.su!+dJJ[q2Qn42M ek" wQ#t(~', D`3ĐVVtפәriqAr)q-{a쒑K 0$eBƐ\ ;jF*`2;6W9bx-鐺`x^KS 5oT1X0ZlrQ('5jmCB[iEuA}nf?gڍז^׏(=kƘ/ xė\z顣?k_O!W'tq~;} /^Z*>H:L 9CFoH1 e[Ֆ8 G멼),"U'Q+1^\(ZŒ!_a%ӆa911&ExL5W" /5a(aie+L.` di6+0aD2EV˳g&bXu Ԕۣt-1F7ƛ)wŅ,-W<]! )¶gCzo^$6ramۧz앁W R]kD_LS6R)gfE13':V},< \c =:!"4"Y3=x!nd}N-?s(eȎπ@R1`e$UMU0)ؖcPQTKK݃JbvǶrĺBkINȊ^2zu~eiؿo kx˺^ mb:PɿƑ ;B3ᢧΖk)030A2^pSȣ *zOHЀBl3JQo3 efRm'1 etl0L"?p i`5 _CK#LΑQh`86dXDaudG*]F䢗X}kz- #k1ž={=:gЯ|Q $Cbf00bk]'ZU+1CJO<>R8b5 FBɊK%>n8`ǠxU-Ws *4GC%2}7c 81e3)nT Dw"8G8Osx;y;鴟Pb)x\+ĜY Rq}]iL} 'vxlcDӍ_ 2)**V2ozQfWR4f|8$+㚾|`xG_VF (ٲeDX# D2򉎒d09N[Y ^|ԖrtD9ߣuwܷoλ]Oq@wW0=%c]ػ4!w€bE#ڦ`(.dVXbނ+uSn7$\i27m;SDl88 NߺU-#k5Eί.6L{t|vZ6JaWh0#S:3}‰'t- 9L 'MDo( (r!P,ژsz |,O"ffeY>eFD+fH'v7R<+S2~ey%bp)zʴ]j{¾FX]ĕãAk 3zl`>2m;y2I a}9˺|4й(~}xؐ ϊQ#Da0ipE r鬊<0T aw<&;yA`{si2d1n}ʼn\hYOE&cc|1Sœ  J+`g/j7e*COYOmߚhx;q;/UhU fOP =Kv`lxe=d!gdE--gNkzGZa29mֽqnn^mH 6+2Ҕ@ AF>fl c#CzmL_1=7mPYsro҉B‚T-.,g KVdXz@.G`;˟$}JDkH_hZqCM=EȰ^6|6zvsŞ}tX,"U)4iO^*E~zv&T1 E[2įл MX>]5BLº\A\XJjbVIc5|sCg5j)症q*bUdѳZӊɏ*" 7AA[vpp,q%ib$}:Fglܨ<=aqWGp8~.{\ZAu(HIV0^eb$ӖLXfDhw. L_֓}aLguSј**Vd*yqsG^#tG6๋!}#wܭ9TaLA@>7c(<^Y+m7u[]QKs{N[PY kվbÞ{H^( DLl/.,*]q\mO:[J1='f2iKm,Xr4ҲzDjjIaǧ8[Q¾FR"ˏKc譕(NS:׋R.= ~g>AuLsfMi89^N?>~hZӀap 4^4@%>C_e6eDZ09WhZ$ܫ{4\ "3 &hf_X "CfEfFDz>({jL"Nv^<]84m)rH5XLa\&7¦?lӗ.?ɠ6_&Oň0"Sefǝ> )|3PEw=rϮu@|X/qQSJX{Ŋn(R Hbb(b ,KAjO$Y d:DEGH6ĞޙӁ6gUQC霣ѱg2NSbwлZcS++_[IW*FO1Ԁ7EwBܷ%*Rum8ӏ#ybps$^墶ěhfDGg'SH'~;vps^;ӹotkw:ᵃ;vxN~;vps^;ӹotkw:ᵃ;vxN>x8Θ f,=d|0|aΰiAa,dXِGu 3zf"]br0I>kPOyEG@F5-keLӛ m5b zp)z4V $%bi![B~O0FdhTHSٌ'hLӗ IDAT6՝rNv=[}j]J=ށpX#Cٓ Q;:|{U 3V49zXH]*0]}TrqH]촚̹*tsTOLXVy:-*.OQ?5zkjPQ5n(XW+C!TSXƷ^ՆzlɷQ4Uq8 E'VN 8ui?޿ܿW7 XԔV7?&@=6eTe +JO, dk!x^a[sVq\RsU%%Q+6W+Mi/N S6F kG^MܳsL6-EHӌ3eZ򏸩<m {l$2YH7t C`SLV L՟ yf(/RX&jeoHb|nyׂEoOJp1.퀰 BEjJWR # I8$al+ teizRIxӕʧ)gbF!w}T)ʡI,9x_0SÑGd60S3P!(1U?4܊˗_ou/ҡq lG;$~8k'l c р8R%`v prXG-N"s\OwXq<=֡o:uIau\04|qs\OaHzL k\A^RJI sSy,#`)a2#,LN>r9]Nyi_CCC+7tS)'z)ĕMIۖ/2;I~Qʟ6{h{HFp10fg5rF.W,?MUqeQC,G]5*Hf 0#1+Uf !fJ7@~<pV!zTLN rli%LnQv,fz4闋^m[Ybd Fʁуz8Qv $48˨]zU- RW/ ]i >k!ayX,K*Q̚BV^ZzBZjz P^p#*9, 1hoyE[m W3QcJ'sF #=٧zPssK_~ʮ]{^/z0K qk֪IFmlMB1Dx›RR^)G-yFYr`gEUP 5Ht) !s$M'.D si)Bu2D^a3_k*#7yDOq[y908d㉬Ȑ ^,a=%⓯a+1峿{0VJ~gH@lPUVT1 /a4zoGY%i?YKr靠Er&lpbt:cͣluqƢ,tUW]ի;LwjwO}z!n&B_FG_F !$8:=fmzl^"}n@jC8kFIk]W|,+w5f7uD~9ND30X&IQKVzM 73Jv`qZ+Rl\~ŕ+KggglE`$7y㗮=Hje(`˒c^.fbpiU)gb5ҟ&{Y?i4+&ImQqZ@<0e[[xJt2PqYqatЯ NONRbdx(I2zMբ]7FS9dt{آ^O稢Q -Hlә%Gңe31c4;f(u;Jk  uxf+F.['(5jHiԃNZ[~Ԩ=haqnY$j,f.UZ'T+wi?>\6,4paSCq)B} cV#g@:$Xδn+]J/YLd -c'M]zm=SO9EeHywJs-h: kLSS9::"á1!CAX2` /y xq^¢'V@Q&'L>E NjRjԡx"=Yc6VE ԧY-6rmVfOV`@o8!GޅW uVdpCkxŁ4"a)AKE~NT EjE-X zr^BL*ݻD3woe547`!AFh*> eENWjxB\[v;$[ls;#)պRZ%幞E1Ihw045V2 s<.hL4nyW.0}J8W۷oy뭷lܸIk4Znlv`fԿ䧬*bdhX*'eHpY3c8&DzBF+AB[w"46x(IƐ 1oE1R~lvр`C)# Go)U+v[ffSQ:@?[(~hf͚0K/ÀVt*KXsSGQx"Nl\ցqU(+cxVP;[Dc騔&gs4^R7 Q18;}tA0zs'_`iPPБؘ+fhGb@pl_j\31:,x=Y\GZᶂuu$m^<^ia|RB@?[9 J;e;F/`◮TuɁrS_ ytNhie21[A`# IU@N嶉דxlX/K{Ў@4 t4U0.P`|x_؆(\ W*O~ `mYk edp7tBo Q$G 神rj4 \oCadbL/-{{.ԫ:vVH'n`d,]YXbhAvh[ssjIO-,']q>Dr[|J՜773{¬ηXS ɑ;SE0 {i[P~p("MNp:̝ 6%Vp4XdH1{@œ5(ׁupqg W>a> mԜ`.yCџtOR 'Xտ[(/'Y jBhXƅMz7+ y6~$ߖtx933vUWѹ#*%3kh01o ~pryq`瞠Ҳx5|/ WPa$ya ?KU# P9P-I -u5ss[_o_}pݵlr3kLMqsN&t:A0۞$OKsM2Ops+PicPS^wa~1 hWRuPT{EĘK /< JD/:)-61G4ѓniIU?U(~؎eFr]w)x.tbPSjBqґW=X (EH)9ay=Jh(OGs?Y;4P68/bS5\ Uxz0>c,v9̪%V*bҳ1G8$r'^kFjr`hܕ` 'EQ3K8m6I\%GjʿAOZ}….R=] k>fI(Ҵfbm pb_}e73Z>[@h͞Jѭ9Sz2nлl+pY\u}?{%myFOb$J3/;آ$>Dl ]MіU/\ 7/[魜5iprا8%ei78)E]gGH uVKܶ^Iؼ2J鴼 DE?^=rV+Orį7v~3Amk9fM<[F 7ZJΫWKYDg}zkoktÆ7l68P8J:փiYsrd<Vn aᡳZ iEPF 1A+7@'uB"zEpA>(aqRf䨑8Lsfƣ2{{Dz6٢by."7< 3֚=wx:Js062㹃n:d@ jgt cK1x?_- xDG0D+8'~T[tojHoPHOI/6kiO_^OДcʌT`Qu//ȼG|n6Ǩ|UR+tzZ3 /@pG\r"l"=.< >OCÛkWeeyKWү&HVfw #opS,ωGu(_4U\o z|wVAs,2L*Y) .%FQµ2/E`g3B@tE8?Ҏ:7>_[2J yo5~CoQ׭awow+rNs"M>ӧGb{$' " ɽGsmNsZzy;v&.=xچ֙5r˃S 8D(i|nYCA`ѷ [>ma2-u8i2+3%IK55)6Y :!y|˒jt߅0hO &) o#J6y~ [ZOFMi^]^[^T Z[k2vP|eteWN?vנT~m>oϮ,CށRV M -]x l /^0>wW3:pDZQㆤJ BO&L#yF>H,$q"ST!Kq1 V]8ab0B q[|Uxѣ Az9X|ZWF/^({HEfv&fLǍ]gnݹ51T00Ҵz5J,QIDxrȊ*Le Q&?9unn89uwv~S*^OvYaZ*Ƴ yS>ZJEopl}=}M/oZPӺJ^*5XM|p-y[,no:!.+2V /~?Z_?wS{Y$7|;=Jwo|Mm^JR~yJGaP%PbV«򋞕-erh?UgAx|ׅ":z@k ᫇~5#72G4ETQ-'p["MώcYmZgSjŮmNquu"[e-/ʣ .xb뤷[DO]/lTJ-IMk;U\m9^pKL~Ӯv|-z_;|P2iH=/ClØ9ҢxY˰{8gow |I71(%:f/#ez)v9Q,$7BvYH ̅> s{ onW~༱Z1vl3 ɩ?m@?Wإy,nf譲&Ӳb D񇱣׀hmUTis(tϮcY. R,Si5HU&EEa}~Eh}b~b_Fp!x6$nj aB;E_ =7eo‰Ɲ;gώxU({QnBRAuBRqg+Aʺ -y 9OTKD '^΋Ik:URP94NLVM:@)W L|[.6KAԊpٰ;8`'\ ͎6=.OuN:DvP7Dרaѕ!sRѣ:1x@[֎>s?#/̛yKC,FG#7{*GGFo8+5GN&Ǽ )e76!+9Oѫ›* hQѯzY@Snq:QCG%q{O3[?<~"᫯­#CqjjhV13EmvfGΆӳSYDd2;isiR\X#XOuɗ/!V5_Ӗ4"F:C7W9(E+ (9G)"5%Jʅb;YέhN46:2k}'G.NMEEx~eV^8Ю. &ʟZF7%ϷND;&w&`RύZ2{>|} ;S/e 87zQJl486E֭C^nȠ ';20XFtFeb47;:\_- BT"R8[K*?~D~[e%\j} XDLjDawg ;Kf_??{7ٳi6qN}tZ%ҍuz@}Sy} 0\l._S1Ƒ:Sxr:%Mi<j7գ4| 7{xV'u6#^T;&B+-VHݕ㦗Rj޶ښ§0Φ2A o#^CvV'\ԣ0S;qA pHE١٨WO1ڕSӪ&|9P(U@`BE㆘k#S}Ǐ6XsNݫ/GDWp*|λĬ2q>7{3޾108P8Ct+5pL=8T**,>rsR(w*֚2e*C8s8Z(NEeX,wMnzOg;#;HG!):ckSm\7yg!tjgΓ>yJsť8b| #e[:=W+~ӎ+qV5~گw|D>q}Ep<΁  I!r:BQ"_?` [e=9)7\°Xg!+_‹{q*np0;cCM%pArg ׊Ĕ.Apa!W9X4Idhg~^SUO"gY++*yI;tƓwwe3v??^Xn[DNخP>%zaL>~:KkMFuxe!Ajg4]TG'A%Bh+_\ (W ETj^-_JְӋa8{VlM 8CsaccoMs=JeSMgt~H8i<s:ӥA,q>oXxjCI{ a+c}Ԫ>gK09/l%܆}w8u&95!"_9zM9`d.-nV^dumCwG .0.%:AEaSWrXh r^?ąt%Bzj5ڢYovv5]1޺3q|ɰ;:e]1ex]/f#k^t|r]̦<=9I5LR Ɗ>R6O٦8an}6 m&Κ;bu.d&?YWU`xnjY vޥԥ/}r-Dψ)[ЎS@K SR4ܧ8SWS5{êD&)9zAE./kayԗ请Io#1e W+~oȜ$_W۱gmRi_zSoÍ7>䓫{GSo cAFM,\N򩒖կ*"ǢiP3b€o5%>DvĈ+!} iLFlGs 'Nu2NU/cW]@DnƲR7|KB_J+y*(wbdY =6:R˕P82,ºPyL+=`EߚV[?^筏T//o|r|ʸgn(Whl3'/ޛ2Wi.gb?gZtzzZ2xV+|_'1xouF_Vp )@g)؉rF8Wjda?] qRD,-H|֐$\D9wS`T"qpȻy4 |+џ ֺ8`fFG(F%TWh`SY}}ڞ6 ]Ge-,cmbDN,/L7xq-?Mz{3U_88PRR'jP/ب ]jO]K#NVxDM}|B%teE՘'qV+>юU)Goku{[68iKKET/$Q~Ah__=:X3 n̷@e{xx/ˋ?ELՍZ Aw^-hAi >ݼuG|vq~)R-X9hi$cp"1H4@up"0BݕU*q(߈}!,8(3nt*j}vΛ[𚖳''Oyձt)22o{.)^%9BjzUxrϲ0H' 'NcKQ,Z!йp1Bɗ~c}ᥴ|H uon,NM+O>?J0xAI{V» qxɴ-zr[^F*M'pkEߪx_'RO^}gVˀrw:dIKð=ʛ/^ WvwwK0vӁ37͇Q۷o8Z/м<t\qu2[Rhػ _zPu@{<3v@NG;j>˲/l@.E/HY>ɬqS^(ʙe~=ݺa=+[rFQ0wnE@;ֈLp\feaJ;}7Gr198hc*U4*}NtmOc b* ^ G+QÛ7t@UCd^#_dTOpmQyjG8'\gee:u@G;6zbHtx aC.wA$g5d^~ 5bZЪ̯<׼{诀ߕ뤿g =yCh |%Xy5I8$ޱ# z#56"PWFkqo~gGL=;nԍPֿU,+ Brd4O`T=l\+1AAGi3=-aN?:@ )tyЮCV NHί6ǧݛÃ]hzV#;lNjPq#QFT)q*GjQHagu\[Br;ƚ0/.pBboi(lBItGH=,(/ZށZFrr5A)HÑ{'*"Qy ' '9RFٳo}D隴 9ǚ@t"7:`{8=q:]dc峰[ >UFA"$T y'i7u(#_E }`E I?Ϝ|N/g[{ߺ{[Z&" \TRs4/5SLN Yli uq(?R Gao$L >~MX~jM(ʼa[#hO;W'˧z֤ ZjF|kK 9ֱZ8ksHsy_S]בđcitb+jzQZҪOm#+ϵ_/h)` /] ~@UvyB ,7V5Sk2g4t eT-Z_m tPfD}Wǀq8' H89sѹEDg㌗Aclÿ{A%eY`f5%#r7.:dz7wgD.½8JD(btɤmDLBV2p>z':,+X>D_Qل*(./Y(TԤF{Ve'W_wFU/o'H` ޞċ!HJm#T96.86kv+?^!#;auں(USU@RҚR^= t|E_NS_WӮcC::xW[neK ./Z߹dnH)By}/ ЉaF#f#6rpאFSRGw⍷nߜ1ZƱ)Wǩ8U<4U@#DMKiuv*+'΍xZ| kG|Q^>ҧJ'VXO&(F.Ɲqsc8}\㒽,6Z,S:[MME,mM%BUdm PeuUaTO:4p3:qdCδ[[{1aɆe?ըmYS/)65_>җ>V:ʥ,MYH^jm$= i5r^!k OafWzJ6 .쯁/n,v\cWxRO_KߏE l;V荫Wb/+Yϧ3:yy2e7qU-Q5XqHi:lX@81 ޼Bx4)1H:D壓㤀/Rf9m t DBseܐɏojd$D8gԂ<ՓO#[q|_EQH ^y{{mZ1h\?89ȁRy\;r#vqnoi*ѥ+#h6΂ZlbZ1yCH V ˜v:z4wr<ѺOLDy_{zN~zz* ɋ#d׏s9'l՟'Ҧ4nUhLdKߴI#a/֗,W[UQkqpls/ZпO孎/oFm7&H>߄{7c?:VF-T[n _}﹟SynI!c gri`83"JSx>NzvT[}SrO,/r`:뭈iI)2n@cd_2\9V)*3fA^̏=9=n7[:ڀi JAW9톘͊ntL!|WniQo\^cZD.ϏɛȊ|*/#0hI* hI9/K9N_sz\VH?/?:FG]bWtD*xtL|w25 cy: nsMXq P|-苅Vk=Uoӏ_TI@k--Z ]||Th:/ν`c#;[:O]#X0 >L_e68w7g'nj4_E{,ѡR~!u҅(UQjjNeC%bE\ y|t*pr=ds0{lq5b!FJ{X (4|f3}1 7[7!֜2itv5֧656DF"[.N3 )˹IbNB'UdBJK [ ߐ8j#}JW9B|n\i*tvS U"AZȈ$r-iE;am; t6ReF*A)S\?@)/_O3~.˾~jG?}@[U+.n;R'H:OϞ=[zcލgI'ŗJ47jMְT,L9n7hWPζ M76P͗PJX$ }zI*f2_S${^U~GIszl+]v9#3SqYœAryJ)ccPz1+VZ=]%xqN{BGDʽ&Mc3C&$:ĚOYr]T%;' xnlৱ]E1H4]$7J={XԂ`uՃd)o$,7 &[}'k˚7X:_#}{+kB_IMX3n!)<_,4R(Ey]Yq"{uf/ж*롤aE{3$_M%cb r-z-CfA;"mm\  vv |X:˧l} ggqS87. >W n[pZ\ IDAT-rE R=ޖOʽ^!L5Y9K` [\5a5IN8 lNY-}D4j[`}H4]o`E9N]kVg~mK赿~,\[h$=|aߞQnHXej6=ǥ{G7򫍟;JH{(u͍V@玏p;'I|{Nؗ BP81G3D0Օ2M`f9ы -x13jϣF]zAQHCRI upIif) u,,~9/pF&M.R׶I"$7z(VD]F_Z\'8r6!P^xZw]s=0c!6}Q(ԯk\C=nW>y`])X"7؜KA9$v+vCOdzغ \럘~Ts~:Nخzx z}}hVYx-]]4 6u z"tBz^^YU9lkw!h6;;?76нƝu ݀zPʘ^oX9..(ɰctI3j-dD sg,x \q=\ku̖  PFv~蚁޽{y!+.Rdެ%ѭ_؜T 0c7g>~T^{P9ޝLō(Z1qGit'<qW"uЃOFGn @B9jLЕ2  }x*|^H0.F6[q`|3)K]g/8rJǠXyNpάQ^A9u+ 0|KNm>kDP=&K/]P)mC<$kpu ͇'@NG9-ujEirR|J.:󴉶JUmlF GJf2FS~ONOݧ-?(܆Qy;.shx_+Z?Y?Tڕ ْ}ou=R=י:գGؙ0$Swz)N9J}+7Fa+ĵIny=]83ͳ=;yfE2X Q+Իa`ƀ|Lg%6ma~55` } K> >?N 1 H[2`FP248(27_?d 529?>2 mO#D}+eQ5lRfqb6T ~RCoH\ablRKKYBLᤥJEaD^1HdY'2."(ZL!L?rXLx΀HMȐ`QWi%kal,S~ |e>->}g^G ؔ`WT8\]f*6|g,SRmm G 7KڧoҮu!yUuLi6bD_+џ:_zx?5?)޷oA+^ۉ9P ܼWѼ-(Wz}tnQx7~ώO. 0Z C3,ԑ {.2"mQA-?7i9zq.;)#D*kՈ3T-#6lLb<%(A8(TbcUktIDtF8N%^^̉.q>0宁b: İxt:39b#c[ClAib3Q"ߣHT;5hOՍFp8].Miܥb3.h׵#TD.s%:l&8gir@oֵ[[8Mėe4_d YIi})Jyp$jzE9DY2 CȯT&Ы3i(iFI<=K#3`''DNAʦdWMe..CazQ_ٯ^?:Υ_cԷ3h}G:j"*:țOǼ՛uсbS͛O??S:ch2g@~!hLdpB.ܡiКQak{.W,.SyYtFrxn~q p7s30 j8w6M'Ź `>y"+ T5"g:BU"R})p~2N6Ӹ'׆- i&x4o|.>} ϛeE1[qax!ڤ=kn<Ͻ.Y'A#< ڏsslvT j(lEJZoqj(lBIKr}i:i|_[F^XMV&|I#ވQ90yE{pxxxG]}k7o\{ oܽC}\Θ#zg}?bSZ cgAGbƸEt\"`8N028V[]N$AƅG'skp `n]A,O]澜V##e\v$4&#3ΌKΘd])ObC$-LzfdDa]]m>nO[( X+"rsN/-{ӈ= {[n<`йm^C(ht ] .Q67co/4+A_E=)n~Lq//4_d3j;ct)LճhTzfO2jyB9c5-~~>lۻDH }YzqM!>{ߤЂ zDQ)R^ =Bc$uaC"N4 TX ߿??{オgQ @p r9{Ԍ}矏Oy5;<<<~:{vlsφكøsqA1QMq$~dSguIL= IZ$LoI:eee &ifdg/" 8Nʔ"U,q@@mh{}ƫP0+=_nA ;l鼧o -&o4FG<dru~=׌8f waɏNy  -ꆇ?}ߎOxlg;؟ʒwǷ~{sjn]KLlg|F| SN12?P@HO=N 05` rDlAmfL22Ś-6tu:"s3 W3-ǻt`PFvmp*dj|6 u<ު W`W2k7Irz_)E|GkvpcQm\g W9V;谶S7H-P =oyI˰|E_lll+Ka yle܆{VVs[jӲMz[Zfje\˖a yle܆{V^Iznb&Gi2OVmft@y0-&% }赆qp$EA~P17ݹl~4>>Ch|[o C"Oo0Fɩ;n;b O OJ8U?' G_M~ (FUp0,aR\bdd sTp\NGg.0"/*N9 8_Oo [mѩ4Wvhb8R:$<+^Q;,&pNOqh</Od8D;mAW6dqv-V=aȷPpPhDzNρ\W8S`{=-j.||aS&O֢y]QYuQپžc3PPZd5!#KjbRsԗ7v\.o/*ovl 7[q۱w\b_4g3Z IJ>\yGUo)[/0U5d|5/40ӿ:=rʌM|D d>a|={O^5ܡgGζR: 9 42q4g(ujP4Uxi2R"GM㰈gcsp8+17$:vɓyx"_pq,qLe93:pesőBިښOԨyYuTnᆍFdX'I'N+0gy͈O uZ1ӆ)h4Eq qԩJ2RBv = LK/aH* 4E8 QԸi/ESTWr&]r/OלGx)y"7NQˉ߅7s-H L%bE*fJu 4˰z!<)xWTЪxePfGkcBAd~Y 51~U}rs4# v)t\|<{91{G=;~6l?V'|gO_p曯#޻>;;|-Yc 3W28`:a3p:AzB Y'Hx-Nh~?b29BٛOfdtK6dx|-G gj c(}+0zLźucÖl9=%6mqO1uǦ 8=Btc}t2Ўyyf:Ob'yFYǨ'C?I3aDm[Pr?v) ZKS?R%zNW' {^ӥ ae!?x8UUO,Ӕ[w8'$'jEyS+b?cN$ϸvثԗ9'Y8 tȶyH9i'+N _o^]]=z7WOԼ&;Nk|^zB=n$:J:)B <1e7~gkwܝu昌{?zo~4qxӝf,NH=z>? }8.xefexqg5! gZ޹5{al}{ D2+|Lm `SNfH&X亪mM` <>A 拰_lxvĢl N&Q0VOO^Q Wv;&Sl]ؘ:kI5_6dpuX\LtDx~&ɮV/]TӤ-S֐fjHL@щ3ڡ"#V̑fDuXFHh͕!iA|Pur(.N<9<ޛ8* (|dd$LͪaI_Y1gIK:Co%Np(x7zU^Â]X:5Yvɢ{$Yzмz%Fo}|JHw[\4yaWVD++6YYuzd[W{X.zđrzNu^*=[E~|ki$FΫ >ӟlvڠ3y®,:?]^U^ 4S~{wO68:Dz_q@R +={|2?=qAB3sO·!SͿ9>S㄁<7xG S_q|Loe572łm g[/I>gqkV2IЎ$$!%u/gY8v'}i8h10om$*"Puo's1L]@]W{&Ob袢`Q8WG4,ouk[]fL81&OK_LILXe!apS* }*豀dELf*m#dibGՄGƷHm -a4VౘN.ę4}aP&z/ĕgC⸢/6myV+ m6Yy߇k^@l9rk un=MoW] s `57sq2m"4~Ç~DqHgƍܛݾ{wdN"Tk}c1Zة|#V˨xR!YDm@ s !`>J8ӇG:έ]ew9Iڊu\Le֌z1#hdQ0 kqk$q/!:4 ievR/P'oqSR\222km0clq㴋l'jL#(1ŀ8QQSLIDߊDEtPoibO'Ç'ʼn:;ybe]3pʼn*N%P< !)3NT-,E^T#/飬=t 8UbViRg/-8댖>Q9Og/ x仕yҗ52?WF˰|^H؞S΁gO=yQsj퇬w:<81! Þ4쿤ㇿpaӣa3[ox'[{f.4q`=;apAq#M\< qi8ybc4ӬSpNOy d@l}gyȸ]`!bψ)e4^ ]ڪ Y C˓ոk8JƷX苿}m0Ŭ888Qc@LDFpx׃:;Sw:Lb3q4O&S.wMSNe2549Xp'A򩿼鰽䋅(*d[+2f7T2"0 Vt:(@GB/_ȞӷH4uCЩnMUh,ut $T%Ϸ`Ok9ygEߪtGwmxݴn^GU%Yj뿻_,t ETa@IN^B = q6yzbb3;5B~;ͯ?x3TS^Su| ljwћ˶;ã''Q4tQq׶N4kxև;{]cv77a>}!Gij=cL<ғ1#6l_Ymr2ZÔa^3OƃtpxBM6qb["cb1RE Av#a:W>&}N|hh ˓G:ⶶ0FݛO'SDqTKVr^mynѫb{(U0B̉5^TZLKM'bL| !\]~eU_맻ET иAKnVfch^nF ?~_4ݾ};/f]/pm D\/M6<}o08{XmcfpWx)NO`,QPfLw&wMg|fqYΉ {gH)t8?r:;" #+b'H\)s-ГC S}]iܒxNסypsո֧Wa?͐BJ('ςBjZS^ϘdLvS<|)6 ypt:jSv]Yd:$Hd$vS P$4A+6eYZ^"joXku.MHIrcU @VL/cbg}t5AOӟN.͹E^{«O*#YO1 "]W9WfM=e+b.~ekgbRMzӏ&\пkijȁja1oa+T/++G_^O`W[lOf:O޻??=϶M4mbzz3o~c<:z2>34VYǹO10z3Zb-c\r{H92ZBĉ), PM$gzD|t@"CeЫ.A!u qFL;<9OyH xѹOң6('5k,1115GVe8OFcI&dV' ~6ţ ?.xkhQ8_范C OIRBBGwvkjXdގWo,<4Zh7zꈦq5RԊ|;mAANo9ڳK^P:>XPgh2Phh 5@3piVu~=]j;P [N kWRΗh^z|ΛbDqk#= m .x]šDà1-sMDyТG8+s}9g 5e^{wrn xq̨\uh@. I6gf:8UBA廝c0@6:qEV[Wo4]΅|1*ȩwz3zGP+le4E*py):ONȫ[${8޼d|ho~t+o7{= r#F9=oxgvm"=G-:2pA gzq}-H6\(ѩ&bI0t9h}pWKw;ޭ݃a{c#xki\<kgDXM9\l!5_Dx5H) pbY81 |NXOfL@q٧jaqwDbktHO~qc#^-gN7Lٛڱ -/ڱE[kV^ ڙ 2iǗr>z|hzFJxחa9+[Q5A75f`/ 2q: ~ӟwTOQ€ͩ hLmdJ0X܆uD:bX>G?@}q054Zkd;7vX'iX q |llv+3 ~ j);C9kxA :ѼUG)VI#xZ dACۺ^ 1r _6yR4ER}rmG#^gNBz~ ncjS9Vo49aѠ~QBW=d²EN9͗{'T@O*iy_ٯ~M;~hR]}o_k7_TWW㉞vʅ]k7l [ bPe弧oyoSw ?%ѧ=+L]}Ho~"PO{h/j8[ k:a]w׶Y*^3Q?~ĺaGp}J[1X۬1Ef7G:Le`!1<ũIqo& Y!n-ȈāZSo?F%iB$'a)t+_Zc "/)4 ]viW m18;=gf*.{-< [:]_qs%]?Stѡ29pfO'VdtF}0C@"kIB)EZ#WP' |8'}Z8]syRoE8ʮ]"֯kqfM?Y$8 }Y s PV7">6Ki tGzI2p^Fbhy hYW5HbH=~ί[B+~ӎ _?]];xryFopJ X3ܧa'L X/~:]yZt/f*:6'|z~AdWW~#gj1{+z?$-Dޮݝ7~lEAL3^{64 ڵD@Pe Eבcj}] O>ȗ3ӓSu&*bQ9zx\;{8<~Ű7FΞ]pMOw@A#6' kDm(rЫ#Lds랍+syahF͛`:Q RBm } `ն ԑѲ h1K4[@5X3ޥq:w|5Mfd 9\/Z=JtM9L[R/î IU'v<2'iWT J(<+Sy&ځ'z rbyXZO[;6{iw_TW+<|=|n ݻ,[/\ixMI/脙U]tJI(rߧ?SChehyZp_ݼu+xb5:?sOSWq3Օ5R2#0nx)/+uɋy(8}IDi0?y"E۬'¨ps-Kۿ AQID;ɚ%.nKXQ؋eKuDɻs&㞌7/w6k3d|zš)bhó-ADXBY1lI6ɱK5YSzL(Mȶe{;4O,F|xm]=h8}rLIY[߼16v7:dGD<9 Ǩb1Q ig⦰&o޸Eݡ<*)4T>GċiJ_3\?fv{φ' 'W__<<==q(nEkKn_0kc1hVXeS呕JjTS#åX98sDn.@CDMP ̜r蘁@T;JOrQzr?{o%IqmG)?M IDATQ&@byg?󡵢@ZEQU#2F蜰7v7nv㚹YijE/u%cAw6äwp8qXMt)6,PZTh"::<$} 4娮|tUB4_= +e|{BdƢ6* Ϧz0rRHzԏysVIʦH9i0ϒt[ĝW6~J[6Qg^cs&5Ԍs#,ٰ*l|L`WNoDmyr~B|Mޞ11dGpy2lM::O˄k wO?Lx1Iv?s?{t8D;gOgg?Ljnj}5gkWmz;)':H_hnHK;# 0O'G UNxXG~X'MV(}R-u`/_D> 4;{Lz$ ׮n9IS!tQT" 08UuC'ɝ{f b :,vƛDtSuXy]* 5sxBDAl-Ӝ`ľ{'Td% %ְG\Na2tTlNؽ6/3}gۻp oa{/ArϽ؜|C>-0bY҉a$;2/ ռV+?t&Ѳ<+)ns̖"LL{Kw_;W'e8o!:u>|ԿˊC!IrIޢs7V>+zvz?j]YrX-{Ofl^lG}Ĭ 2}kgN=6lDvwtnv>"Sֻ`X°:Jť(n6,[ߌBj8*Yp֞{"';O[~:UUuԇ VU556θ‹UJ':SY,}qKxgI'ju) 4Cu>QXFmlScAҨ[x>_^\#Xl^3S]1MZzȜ򛎹v\raF|6WG'`a ZRe ˿ᙟ52lz_ٯU?h5Lw>'$jꄉ:\ U5y^v4 :yGx ֋zկ~:㞨~ nfJCtF<$\z>88>{lqFooϝNwKil.|篲41p'jwxq.6pvO3 ޫvG,pHd !Rs(R ;ϡaR3.59A$amv3}sѡ?aEt=u36hmۜm8w=QƤߥ›le,[Xv˶.DSؖ >sŶ/Νygv_(<) =B^4义kZZO8nq(\XOQEi+EN"!'HD& 5tnUcRС0*O2Qek{~f-4nMD)NBe͗Tں4dUz=ӹ큌&K+U\*-cI(ows¥#"s?8#JOja j 7e5x;gnE cVc|UDN ~3oCxET.tC<4p48ǩBxy5 Kg·Cwlusq'?<\}67lj?N~_JTˡ? n{+5Cz&|sx#+<<8e^zuvvt00;wנ['q^|osyS+іbY% )%R,X2]?߶SѧK LjgE%ܴSyRwPpxx;+趯imw'A8Q.*鸡*⫠6/*g_v8WI n v~Qbkl!5mK9:I:Z}D4Rmi`2iK}TP1?T=eY8O9k6h 15(LYC+g̏Z>AbeP8kIR1L@Lܪ2%˰ѾqiHZ$DaQOu+EWjx~J?l6)˜F UzkGy+l)w˷p_ :B!G#N g"迍^o֚K8=N]i*&})ǛgE}bW`6{Olu76+GNV}{|7z~hwzܿ|' +} sem\ɍz]H'56=rP (唬0i< w?΋CvLv|wY]2ܺ;7ySo&ɇlقQu0,aqXCK,o:$Rd2JXj%KqXGDm!79f\>~RPe^7Kk / _xO:A"LF8L'b<|MO l^XqJ)8\(b ].#ٰ yUH|M Ǵfܫcp*2 FYd_ ja~iW3?=rT=x|>kǔ~q[fsj#|A|I@*׸!z< }ͥCv4SEgF蔵Z=>yyTv1o|(et?~6/7C?~?C}=̳K<ӎa'vGwX!eq6X`Xs 3l\(xx E 836dOvgJ/ 3 t^Do144'J1Ss8W>Ãa 2yuį|'7Cmd]1*}ꎝ&W(G$t|^e8a Z>m/S~Æ2} B'{Ć8%>z!vOHdBt 5>%t27M/hăO4#z(w})&ϛΕ]l'9 3ΎN7w.r9|^-y9Y-?-_&H~4ϜBGd3ա8G7mÓ 0#·BXS(DRy;&%kEj섧Qتi{ 8rZ: 3b "g@M+x k)HÑwnK ?\)'3{x7=<p I, yP}7gD._a8RW'? o~b⧞1)|p)6+f^]"A| 27w6t胅,t^X]0U[%@KD%FJZ[=1 K`V2u=HđZc.8[{[D p5_k_Sx2X;[] 헍V5c {}tuƜI"_UFv+q'L½H)XG%L촅1p d{^8UDp,q*GQB˾Y5ePhDqBg5r=eI a؎d]zHZWeypI,,_tnλOn]Ngq7u8D~S-?w/+oإg}+ P} YIJ̃r":đbIp#Q琥2[G+2 ̥:=/LqM/]eo8X_z~x$@<,'F˰z>W_:I#Kv$;D32r1Kt:Yc:F3fvvf͘C|wy~_D -Ony;S1kN$ױo$:x=|:OoܽƾxvMb:2P*5wk[t$턢~Ԫa :;} 1_ ַ`N_I;A1*ئ3x97n~o>;`g>>0yFgϏvs3.Y'3촭 omNsQ!N4ycXs쐔u>dR-DvG:pcICu$uNA0T:r+XL|[ OuzYnkH 9g Δ66I] pZЁ+ L_sM(#:+kyEW\Y3H0CZ`gv:6:$å[eiIP(ʃ/Γ+*h lZ>d~W˰ܾ+BjV,[W~xv yQ@UQ IDATZZ4?<ȁI17aSXS_6[z"E.y5{')Nes`akzgNjkw?q(גry{?^o}-[kwo|^ao}<0,H4# (,vzlX>|m:}Dq,KW6XcimglRvYUtYO W=Ū/’i>DkmɮmjKcdx{=D]߽~H{=' pi%lItDU EMy Utf1s\08Fka溓L/Ҵ&0FCT:shtl)nq:qnYXUT DAu-4ttDse 꾎nnD qfNFWkE2D"ęѢԼ(謷^\ ? rm\ۻKgp:>B n^ѯM;.v~Qyco_TWXsө-Cg K~z zyɕ/_68N>MIy!_xP 3]Hoe\4a-zG.*Nf!nIyswx?LO?{0]A˯套l4t:6`xg6o1Ȇݯ)ソҹ0'tۺ 14lt81E>b*B.'kjsB{lUp:Òh 2v%c(L|Yo(%Ft-D1;˹U̹+" ?FlŁI++Ww8kb~z_}ū*Q. (4 Q/JOdNwޒ]DUv C|nʕϰ[o[1ztlv\gpܾ=\|Ù-k=XlN+3Y5y_m_'px{NB]s{{L4A{>3/'Rl]%~pooع;ӭ D:w(4r \LP*ZHNVׁtS5&`^T],zDSh.0Dͩjx >}^z8:~4nL^[eaӟ_vYM¹PQkt*VљqG:M.Bwk hNqEʋk;OHeRln: *QU?Bon\#7lf/=yB0Gt š U!9Vԉ*n;vg#eUԦ2ڨUN%>WR Fgx:Ʀ-j?ss$(4-]:Mq5m:P2[Ng02ezyDO:D&\Zu*MMZ NYꫯX=>}g/ճ<ݻ{TS$POo,̧pڵ^׿?2Vpgo]C_yL| 2aș٦</,Nvcnmkk8{o\^9|;WYllG& _!ԥ )^:w8Q:sgt<Nꁌ-F,ol31J8һA:6cG"d`~KC:O~j\cG>r&fWs@Ge 5 Pgn%Gme;8o l5^6r9ׅ3}jR?İ2eHK:J+^! 'kE#}brm\#CEF >W)̛6S~6IsMW~|M-x |n:/%e3֔("Oi>spT.NO<1.|D֒s>dU=ǔgz8NǿoX`Q:=o;g}spq~8ޙ=K/9{~Bmomلw/~3w!/_Y{7guƜs~E#xl7N3 f<^%@51P3tDTfkY0[Ɣ=8Oуiܦi)ߺ[ܓ8V,>Q+cl\I+t?FYK2?;}A`Y.u0Iۅ:qf F݌b_$F f}pMuB@a5xyS'=eBs) ~Fdތy4k.g_?~n޿6:Ct=y* ׮\^y%BS?tҰɊ'G={~*ODsyNJ_c9rV&^6Tt:prR LnHQhF| n?wNRw ++ :% ӱScqN45Oc MQr2$T1^w 9D\ t&-Q *Ne:N*%rE}pu8l FЬC-Ø?x Vly꭬"3Q'n^>`;mC~w{9o5rm nl"d[@B`֯@%'M0=/ȍ0dNq+\c%]sܔ{F$?*_tC0rIm;h#N2Wke~}Oqdς\i]rO m/rxcX>(~{B&x }[NɈgV݉Ct0\&${> ?}"zdMlArC}N* .!E/Ht(o᜝ww>3֡ɪ.t'ȓy1˂EcnVOnwfj$ @(OЩԱV&:t>~>RXIgd~ $3t;xKo6yeO8Ol5Ⱂ)`qH'lĶ#b$37y;vEתTM'8բj#mق׵iɪu.tWvI::yjΒVa3ӣCWt t ST, O4`>:T jeP ߡG&#L'b1p3Lp+z5V4¼Mj?_3N]?Σ/lv3(><]T g7.}-Cl#*/ (3wNHoTYa>+>t  ezݽ{^APT~t|@o'3âWvw\1t$VhQΗӲo>kZV/(D'~sMH~ގܒǩ 4'!՘1!̫qz[rM&ԷzڤkOt=^:XurjF|b]a]/ycM1~1"s^g2"N]KT qO}#DC }Jep ibyoLll#o!#u.cWM q⹎;>Y"jH@ùe{cDp1W^]M<ÏN31DQ>ѱ-&Ig^z/`OpJ5#4ųlE,ee0ͪV5?aK =^;Niȁji¼1M&'ɰ[|9}Zsb9IGňQێ_}MO?މQ'G.%9`wqݻ'|cuݭoweYʨ&4vA&_b1M:(tT|rKDmx9OBA9nOٶ=qVXs!?:tp;^>M2Znr3q]%b70-}l}Cǀ+lVKMuN3I)* 0GW?t2pxm_'jyiWVo#uJ̙m(r?N0"Ⰲ|t3E:GBSTVh.Wp dWʷئg74О oƑ:ݝPv,e&JYOq0 @eLg$ԇ cqvqh瑹{K |A?ݲ9NL +ڏc)6OUhy>Mk;cJ3ͷvͱ4K8+.fx.@F2/Rȯݰ4?!/8d>Ww 5\$sɇ}.}'s`p]F\y7z_cSoˀH|:XIr oeӏn(H:!wΡo|>@ҙaaFpkszۣZ:GCg eN'Fc}^>鸭X)gط@)qj\ ۿH뗑92xSk{)GAG@J:3y]YN^xq(G"ګSQڔ_@:)tOt΂tZ,8I#Bq@9SYvGԝXw⮛88eHHb#\M^ԏ2O2-AG?uġel#img^ gt>"{8TKjy;oGE|AXѯ7mӼ-U %}%=>gASIP/\e*'V򦨊g[8H|'9|&1)|sr(3wɟg[V?"LOΚo"9oʹ7*v}K/0apOYS*(TMt^l\ ,10#>' K eir( #og@L (s.j'#Sk|h0VA;T#VqbQxe[''(fY < 2NaL&qNT eȑ2,P]\|P#cKtS諣 ?Dfx&Hᝆ*O']Z8ʵh{yV:X1aWJ»_Gۢ~/5L+WSѴ5J='ySJ3s0FDNQŁm]4 .MIi•αJR;6~Op{Yzy@\9Uû=[pÏpI!l,v(Z͕9I'9Fuxx5fqF(U>|SJޱe+gBpuq8ч(Rã ۷a{e{|[O Ec|L:8R/[O]a%ծQH,S^w{n E>äsO:n^s4S?|Ck+֙-nnt eX7pێT|8C$S'&X)%TC?[5%)ˉk@x_~X7ڌJA$ #uG?^#`:7j]|w{ل;D#ꓜJ>GJC'We2e]m'm:9ˤO0L<2MZŞwJ?XU5աS%asNkRD~zzS F"Qo!͎~R5k*g P>,xNq v"+2:NΜYƔy:i(Q!1#Hqa/èU f2/~I''Zװr-^ogD$Nk::΁jJ5&ysdfp\7 G8k)ҹiO)vMFbfŶ, pp}ʏu޸[cz!H:]:,Ů4_0ײ^ Ge9SBfh [)jWp_歫Ijǂ!>iW+BVOFǼl)_ geUG?m8@?4g?Xt!)撠V@ӀF}\_$v. k27QnL\:ʹ5{g27]&2Cڈ7zp _z ZF>-nÔtF^X Sp|Rr Cszxl7*Wb损dsʥnphoW9?Lq-k!F':Djg]쓢8`q4+Ov.Y/N;żLo%Ś/n峎Dvt;;EtOuh.kc&{Ncrtڄcފt%t`-C8 F_JyT:NKQeh ^hnm':1KPك~v3{Oʅ:nDַKkl\Z]mWgSW_NM< p˵ U\SGȼ%UIFYi es૸ | `C~Ozx#s3|=_~LFej,hYDQ|.zddrA_Sv!J*Co`tWR:G|r";'^~ezYtV2|駻lƘ1 TmӊD6ו9T/A3Dt*ks,pGe%ڰ\mn<upStc5$NV&ȏzȳ PJ] DlmZ=D˸w۽_ͥ:Cc1Nb<ÕK9D~5V*`|IeoIm9D_%UY9o<{`rz^8i+zߪ3Qdomxl7@8M(*4ɃŲ0¦6mN w7x f4 O C|)I!'+>[{["y&o(t^EjQ:ApE:=IȌIDeF¤/`\X_ y洗̾wWDTeM(-fS-`Sw:iK\Shq*&`3g$(5@(z$195ڽmΐN u}N-(8!E:e}|-7m[ZBNU;(FMq6@^]X9aVO"a8ЕYNFZs+ a;tfLy'HV6ͱcb,ts>MJDzcqWID|>ܨA M% (8J 0IΣiي~e?BX:NʂMl[v <3)nCǩ:PaDtFUHpσwX% GYf`9ëiΓu| Y{7/lЗlzžyWXb)+UW5U&cdJvINÐ( :W^ow)c::aʄ5ҩ ވgΨ+;dw呇:"O S"K!ϡ%jf!80 ǘw.g`7OvUZΕѢA8zm.I򰀦@F/~uj^v0Q7MW $B 1/g?++*uqֺ} 1;ۖm:J:U^̟]Er͢mL9 2,Pl@Aۋa2l'lŢ|mAYPsٲ< ;aX.fz ,Bܨ Q@]$4֑󴒠yQ@ҬKK)̲9NV+UԪ|ug<".~/]e&q+Z~ QOiyyKoNf/,O 9 &fbw{H~ N{W!wQ>'v.]?d?epO}J0ua("OSA\DzyWB\N\T+9S'W^wc&Z25¡{2a !0!'iс9tDxs4,dt\` ^Y2^?*R| ŕBS?+:T:VNeX QwLh)j\ZʢʹөՎ4#5׬JUsͦ8R-}8P:5yȓ}5p>+a70PSSD{+, qeg8/f>uv٬&_pqpueǵ* S$Aaw #bժ&PQXo[h\>p^3WiZO2lz.ۆg~Z˰~eNVkt,uC@tz tex^4qL2t|87e N.wȷH2N;WW ?_{~a(X_Tľ7:̀>*? }] %qӞ@׺{l{v~Lp6\a|Xg%q3ECBF3@ztN>kf1\tm(&h`)86-`tYfV<'VJ|+l<qiv >svb74PIg酫^W+z_/IySb5+ͯ53HY{/7XˊKD{lu|a>|iTWK^dXx2fJZ=KCgأs63Jsb{ʽ:<Ӈ֯BF$#hDZ{`pk%kS{MkcH|ۊ^/q>&9H{D2v^+}u ~pӻ ߝ ׯ]}1>3*Ioq[oj\C(z{s6}&? N ۴ܟulꂘ؃h}:&uq6m4/B$*Q-f'뼰/nn˫NRS+GQO2ꉢRh}T|vq&+rīe"n=&sS d&V%R5|E%{jDDu64cگ&Cxz X6֑)uS#?u888WlE™4=.`RJW{):bNƖѨ+[=/S+NziY<:KcYm֍b~8|uc*' өU9rg ,ov {i'e¦ vVs۬j?#_3OmJYwIn'q d6 i%3XVZ<8VDQyI/{-9c8h8d,eHv&z$mb0ju s16PCpZQ:zN/vB͚F^`'u~rv1 g~:6g(7?҇|a"Ze6Y_r,q.ЛCK*x~W^ExjE{E_<~Uɽ?ܢ,fwxk~ .rb)|¼цTd3qD<(.HOd(:5F_|-@TA+݅?ӛ=4q ø~O{`U|$DX榏p*Rr߿kݫcv68cy`-Yا|fe 8w ocfcCЂJe[@$trqܻ}%yQCR ]"kY`ԼkV'ʞ!3%gv b=1FohsjuX`IGH m>"2 onv:(@CZxGȦ^ KS$e2$[29EaIquP[ЏMC)DQOֆ=}sp Gʈ)+)gf|UrU8'7kVC:w5+ F\Ui-ycvRb>)8R('y=ip ͯ\~3i?U@S})o׈2Sj%TƈS|ILCgԭ)gZN ɗ(z8 $,'λtL9[Pvow>09VٙMݯr֭;w!ېwdz " bkfkA?cVl1eym@tNJk"}w۹y_*Q1[x}9T98$ ;W!02A w+ഠHߒ<1\dPɓK朳ey 8a3mTl-8@V fۗ]qXDjIɗ`E_$"\t:WcRigk,0[8LCwppح|Z&f^QQD\bɃZ9 H}l;'G/Jt>q7ĴP{Tj,RE4n&C6˖O Q}͌? aRujz-a(ppXv m:CcGaGoi *Fd#HqZr _EAgjF̈kZ̺ 'e#%kzy݃=ɫԣéΣ6Ix3Ҡ#F˯(Sl2󢦓&Gm˱zEc9#C~,ùac_zts`(t*L>tϔ;V0;:d8yS s2ikFd_c `YēJF&CS:/2#zuZEE&zq*J|+aC֭ۧ?ϟ|rxb0^!3Qgg?;rN;ᒛ ~Y;:5&zk3`T|&pU}ṄĎXJgd"oKC(a}o&IyIRdGmE|=l IDAT*S ֕J@o_K4%_i\DZYmFLtH6$ydaŶuq#xeXQ9 w@d57.u[lð6on_c.PnFg51w꨹pDw6-[Wp>س:<'DNXFRr̛HdҘ30D(pQubC2R /EARv}/CԱsv'ZXZѾsm/.ɹLc>tp;V&Bt9 =n|+?@ešT!bKn#Z9B Vg6%"Do\.ݼ* sT=r 4(eE jzh4"|/7^YZ/ v`Sr$ɧ*Yo8g OpN6QpkP܌ ׈(U2N}`9|.&Qb`qX1UթMaLu,dqs=$e6DW`:N.';T[TKs+5fT[@2ኰ/fj6YUQ+|_oeioi?} &l K~*҃X4Q2))A~j%BkP(Pp:ɪe+S፹SEeFc j*7?>7q6 1&rٺf TY}6jӓ0nYXƜǞ}ݛ3$q5 "+v._2i`ѹ@0I'ʹޯFgW24Ӽ5oyEH/Oي"`σR36d@w15B P[4/yP<t<K8# <a@/Ú?ml ;@$l;3'*'u09H u9:-5Q"" +>b狢Se\(Sw˺BQdЯo󴧳d؃IıHkߎ890r28p8BjRz? #R[[;v3|8iʗ#)4Ki[Ȩc^M6ąTB#=. q*ܼ &K?w8:!Ty8+ɷIHXB_MvYWO_o驢mدmrcTЄU[[kKiKd}nr y Qʡ$E34)z5,Ji o0˿xc9)|EeJZ;Z[vyn{_8{+EMj=e22y:09<3'/S~!O^48S)1D@J`FRw/xSՏ|8ޯ37?9ll p'ИrϊU*<#3<"#=G-GEqZ=(!3`CXU {hjk]̺= ^s켭pS-;jc.PLx:W#n[ohwumxm\58_^EߑgͥWz<|X1ԝ$bMVW"uOΡ3k)fDzY#pkh[5=ڦ ޖ گ 3F{Y(ʜxd>u+E:ldLD5X[9N} r|f9x5 fꭷsItϯ$nh8 /e6/Kg "PElp9{FPf?{:Ss-i Q>SSu:\} |)vN] P-^!QNh!.) 9 ͌e:$WZ8/w!G~鏖?KmiMWp:ntq_ߘ^TuV5bѼaǜyNeuq#|H[>8_S뤧 iGxH3{4?gjkf㐄/!XQN]{}af^We gK,߶5QǺ^>U|ѯ!H=/71X  >^=Eu\홝fSiŌM]LpaӐ:W,2wv{]# t :O8^7)<| 6`9;Fǚ']Xm;vƗٙΝ)=-Dng`H_Sy790a{8u଎ (*Cf7w=zM-jR j9Zg:E3Er#+[[m]%k()C$4vhk% g)Jw'<\UV }%=!-S Mqrtf`07)?};$KU$OƝ$`dx\Ư[1=[}KϪaim9x^^%_#MF_#lN--~gtl\^GVrl>~7\*7BfSBsݐ/XX cpCgn;SdH:Np\iז8uO#\ǝcij= xF5n߾0tg7Fj'S{z/< 6dsrCŢ.gFK /F#kC"aʮA̝ Zu6 8Y<}nL&|!\!| ]+r68VIq~T|`kun>:D?i]l :CzK蟄$ϛMիZQ!Y N<ߢD:8ɩkjdTRM}|Лr+~5 m;\wr^~dU|htG~;Mo1?Q]x˧SZݿ+̂ov=^'ڥ'~V*Sze>_?1?*DEIq7WZhBә&.|tjl,IɗxLn;_ë[{๨}G6l{06t\,δja=;N^ E45kQ©K;,a$Gdx^ \%F f-G!9ZeNǕa7ŷBC4( |ӗy|E$ v] "H; )s.1kTV'35DQJٞR۟˫I^}~b؇rROu2B^CM_\:"EFnZM8 セvvߺu;bM0, v;3>'Gmbc˼"0,;`N.(WCՓ jY뮆dʔ% ?|mɝ G̰*aRWa+lO(рԆۿ eGɗKZ<הU:Dq|i 2q m`ϓ9Js{ >QKxVA+92̹mi߲N0Bm?*>P_OWwoqet"4Dle#!櫧*Qp5/yCߋ3-n[Uh}qV~xh*Q?^4{G9R޸G1_kSx]NR#.Rt!3 }… HN"oqJ]i: >i6dc͜}l A{ͱ Y;%.{A19 f$v{'g*A/wH/De𢾈uD@R`s߱?a*Áiv䝃 y"i 6%|?Pkf&GMwQ42[ni(~N5ihu 4:M`2ǜ*|Eԙ#^+SSF[mx^蝶'-U-U޾bڰ{8U%T>i! Ϋ|_W;O7➏|;&:xs/(_(\O ޞYRc"oOzOЮأu! <:yX|Bo~HM:S .,yeT^`OWtu,h[z߶k_;A&M#]?&pc'x;5țZS.?q!Սkn!C~=hq|x&zI÷w &5 @Fh<foLᝈx["dѹ-f1#3)nY'u)-_Yt"SKމ.WG)Xr9ff>:H>h^=46KY#PYCC&mkڱgU qP7,w59Gk~%~4K}iGiSVl@x[tعkfw`~:'`&2W2T;Kl^ќmĿSlgFx|A{X4\j@_{}~l3;)ǩolacN7w_h}%[Y&]FQΔ4ԋ"4;M8Ʒ긥?[Ύ!-lվ+~{O縆Uu ЛZFk\ʜedZX7/}OT!כ͛Nf/(aZ(~.2pc&*<&}a5Oܝ:yؕux&T@z;A!<}h'5OG4;Qb593^٢ucZ6n2ˑi MV#<JP! ys>ч|X^h S"$c±ϩ2GgxeǤJʳ#ud~&\R zse`O^&ũKs'ΉtJȵT|:vnh l0]WZN&h$Ё1` IDATѶE0ZN5x:n,dYmIz@9bT)ڥ݇_܆Pia;)ݪKhUj:j:&M|y|(4kPE4i=18gW<=4uJvW2ښ#lF5r*$KeYjGn78+DaG7sXRxԖyŊ(PubF:U?^,T/иyf~-M:]N}=lq]o_GtuR/_FQ,۶ރFx˧XIv$?w<G=`@d+p< _q>0`*3#1ȀAjLB%NAY]'w`J n J9#Rp7cVXaYNu!RjrB Ϩ&}Ì-/49p^ȻY6Hˇ9\yঀ(ֿl?<=r;>DIz^ 6V"5tFzuoEKIEKgL ."5# MY!~1^h5)۔^$8Jx#@£1/x+2hdMضb!1%II СV3祡^E* o`AZ0 :n1~3\^?Ԉ"koVpxk|፰CSx"Bn,օqe QZ$Y>s5ݾ}{@ɗ\ ޝ2MO=Tʽ&u3{sqϖ~>7@mCj/,nl?ʚk| E5:Uzܺ+W ' ?΢H5w6iL++Y_UUir(zgY24,YDyg]ttSvg-_84+O?uϥŹ3:2:)`;zCCL#?)u2R߿(U`\qگHgvl\_uIQyƱ'%yu>-ܘ~׎ӇD9Rp>w ?@t1p +Wigf'OԽhI߉;uَ8Xx6 op;SҒ6G+;GHM{b@xy %Sy})WS_gJ[`(CcK )LQux|@3ʯ;=7 unuאU#_H*z 6k'CF=]"B'ϾxuDKMyT/#9Ε~ ?%F5^MPg+m?([uow|_׸~7`gp'rdIpHJAE?ҌAs'6DDU)Qo:0G㴞OBmq8QO:U8rO?4-0s&^ިSw1>,͠ppp_+Ou3KΛӄT:=w4KF$Z#Kïb!~:T6c@R/9} `-f?wWױ9}i_sl'i+ȯyq93q!OKFkSm$iƇvTtqDP_鿩oBOlzw괱GlPZժK9ɧAyE]爭<0jU#k=vHߘ}U`a 5C A{^S YT3,BZ㻂@JlƲ[zh&l,KUxǺo~k'k?cHU_y\gNG9PVr:L)g|nNTp$7<qsd ID]Cz!oDڵJNIWҥKKOdvZoOW^MqSNJzuu0mގp:lybz嗖o: óMmk؜8+_[8JGkqt'9{ ?NE{t q#2<8姃'ChӉ-p%^jgS+=T۶JC w7*x+=gy+jLHgjdJ <2fFbUGȯj#qi[!˽%6(#Muy@k|H 5I$TUꎎu+}P)Yu~ǶW>NT8xE k2οץ"rTdpxX侶oگ!wc~< ùH֯R^ߞf&}G?|XD<\]FF#sMEM_RgnxF8fNy%Α3nGgN>Rv%nNxcV@SO]]˓//_<=wZk&VrY1 qj"D?:Z%O˻|cͩ6xBp |}HbB'|M5B=Um Ymbwe*Fαqhx64&zE6hږ,_|9Y?4|E_R #5ftF$*>V4sk±#PtIG2&QYzF<-(Fv:%>umA5#,]đϴ`/Z8ӟ.ąŕ˗Xx!e"Ca9@lQ;M%WjǞ36n`k\qpc(e?ڡ+eЈ<.>'cYHf:+Gؖ~k?lg:WZ|Q8EF!܄fz+NG 𤟕҃ldtIz+ӌWpA濶'妞Dv\Gq>scԁ}:}L< N^{ZDl Mj_oX͎7o~A낛`F ;y@6=c|?6aTD> R` CD1"6qSʰѦSg'~-5f#\vaZHQ[ ƁF#QWp%w{W 4M 8G&r?m?_ǹT+x<Έ=y\B #oCo27N&:'s3q@y37/]z&ˏ?xҩiv>]v͵OqrP7~˻l^PL_twpX+.מ{n^ 43Era1.|u [⦿˺>4E"c\9Uq^vO1\B3]><) 1- CX{Οx1H*Uڈא]΂I=LG(}CSc+&,"gڞ,:CxO_4X޲/9P]WfM'82tω3J;WĴ9KYحڛ1f<[IK K^ 3UcKNkpZy%ɧ 4)[m<.[@<)QK!< Wxk+4DP~öe#lSnpr:.[y\P_vypJc(bpw.#sA)o(:|z~fO%<}'O?Ǚr`-*ըo,F:#c>z:RKR‘rʑм{K/v#p p#'_D`/bm (a]%QYHt ^ kl+V:>x;WFĂ9ڐ <~.w%g.]}RJjDXe4aqD&6G@ oEz)Fi]c)][Xw]+Rh(AtiyI:ÝF{FyGfsvwNܳN)aFj- 2ޛv&HIl i-#*XȔIK(lگo𲿎0,IsBvh2WVI)FD4_|27 R;֭ B嗬{BQvGԓ'htƫ׉=""# _ b90Ly~%F1 m~Yln1r%Yjxƀ;4K3>22$wbB `M皀iS-n= SwJW0 hu@ ̮ȅRcH6u|£8mˬumsy&6;pBXhqp hV1h@,#D=d<>u'l9 6M0*JI,`2"{|RZw潦oiWn7^Yh[8gd5ńXS4:z#&CD<iɏyO;tsN{-/..*SWq@i+S{LDZ8:K|ln9.5kiF$N'#Ms5P;a>#ag0Ggak"{6V3xEC>dI|BWd7HMU':\XPAF;υ n@hr җڵ1bn&ʩhϷU5r)t$MYnEo]ѓ%Ǣq:tq Lmw~w>=ٵC}ҧK/e:&69"+U:<G|=Q)cd$ufzoWõu^Y^] > 8TҜ N{ѻ뚲@(Ee[ڣ:2_ixYٴwM ؒr#u}'}{ܙ]c3z;jn޹i =?O~BwFpqr$DB@[,*wtf@v>n5vi0mQ +q(41Z-OO.o@-<<֧.: id3P;TWdĩ{$]LjOAxڨ>HGVgmSGޡ^Fӷ6 c Ir n5&%_gSpGgN-/?S[,]!dmNYs'ۅͦؖf4ڜBL3;nC_.B=c'NXAgk IDATo[' g>GQgjgvYΩ)eDd 8<"IO8:ԛ'5T%˕1oV*l?5]8y{k_/&Q7$͘/a#,Q߇蒋yԝOĹ7Cy@YDހu|q00ax">pϹa;(E1'7}X7nܘxufvھ:Ǿ r&t(k1%JrԾ@*QHFx3V ~S Ȇ/|v;*9K8Jx{ Do>Dx!ҽ]3'qd0}pFKMYdVm KWu! KgI-xvC_7nd`~.5V\rh"/՟t1uEouGDv09 T=菕z:k }bV])l*؜WqG>YgkmxAZi 69ķo/̃ ?5d7;؈ 7vx/0P֨V|<|x77_7K(_%cĀE o/OL=6M/b7;Kf,=|4=`ރ ] MΞ^r~^TؠgS<9W6xPVx"*_NhV=YƤ+0"R%D v %,[b.=֛ѿsc#Lh#.N蚾BWkGZ/h-Ny{;Wz1MJWuPOPHنj-:v: rgTv@Ko{1u\xomSɒr}kY̾i>9S%#HF& IX븥o6*;lGG?+v~\l/9i!SD BGAɣYG@]#P.$w*yhOX,}J'xbn2rSi(ؗB[ ODervk7w,A:Bx-iE qlyoq7^Fj-vx0,3*u, YKC4? ˌ'wPx)1H1p΃ Jќ[_cgN.O?yύy#aiVk (e*2*SEfoA3,l#U e`HM)y߫]8~t|1dT觺qt M!*EqWߝ U!X/⩛)z =:)6Fe4-w6 ߊgmTE)TkӉkV<Vx&ҧt]GD\Ǘ:DfaҊ- 'nB ވomAφh066vvrd a22= (c}7JCS|\ts9.!>!GQ=VhLy:Y6k;ׯ_߿qƁ;__e>ݻOĈA9wb;q扻+2č3-=?89}]K.`_?|/wmX(Z rnp;OƽIbA&|i0P a|O[~ $&Uՙ(լB7Mtluk0q;yW QsvС)>V%~&iK9RH/I3rF4|V̸r7u҆~~q @`ءhFYDAak SRPέtַ@Ir"E`7i7-PFN:Tzk󮍌#͏IuP21m~$ Oca?7x[a?_zqo-x_y:2@l"~iKMXs5M;<GN:Mr4hZx9.ZJaW`dI~8D8J@6;M}?L.6ẀQ/e\ꍃs믽>ݹ}gw9>>NbZc&*9Ea Z>` ʷȻ>Uiwy=Vv rjPhܔ"N)zj gy4![3C؛#~x-YFpn%:"K8: k[`98uqbq%IO?`ZE[$!+*1Uzd`ȯze+ZcS:J:2~t#zEZ; w5W5Ƚfc?'Mۯ΍:әMT0POT7,^nq:K^}"Ω ,yO!y m ,|VIIߋkXo\oO]Z>7~%)@ߠG|@ ALf1^Nqofrۂ%S'PK yC剼^0Mo#oɴ>7]#cN<bU/??v=bkW:V Q<0X3+7 ,Fqxk߇[OΌ`NȀA j)=緱˥련Oi@؝'Ia.(u(wv <15ǁ eLp{&oe}dDHqrR|uVS!N΃XDmmzMW)7E[ ^>zR)cz6+ =BG%aگuC_6XGFX믙}x[9PkW13ҏh3ޚ2kӻ'EҺ{//,ΔOefB>lo"ƎFnuOv=o}=`^{5egO&xIOPn͹tc.#wS^4\x3X֊Y9lxvYR#}أ$5w.ѧO MpUꎁ>)0h{vwOqn3#nɤ* ̩ZG#O*{3%e&iw1kc~Ƈcepy+%e`WeC!eTm]>m@.ӣ\ڭ\SvR3T-g]x%s,]:)jĉ?fLhk%h]5I★%3Nby<2Q4slty~JnxN,. o{}"_vSuFE<6S/htH#c&%zsؘq 8$L'9$ܕ9Z),za/XW(0/3^<>[g}y6?B3&td-ΓvS YtP֌smImJvx.grvj  Ss:[N7yR^SdG'˿fFc^A_1y)t#m9ODԓȆpvPxGCU]S(@S&f#@)Zi~85uMw%9XSvrv]ID˿Ġ_]mDqQ !.metv' (gtgMOGdCL28 !>Ӆ,(ss/x%:=ݸ_08 DtBnaMkt4`Dt\Z&ϦAӉvx]>JG):TftQ't542^YM}'%&2#t#|#Stu܌vo?亩t™˗]GKk)FWUpMb4 GA'BCuv~q掎Uwwp:pt_Ǩ?kunlIюGyOțHsd(y7_v-'B>nK,Oמ34pBsFg#Cb ;=,gZ7Ko޼__':Yg1"{Н'Ӏvb;ShJtA8P@=.Dh/Ƚda7#cԓbF SY/MN'-/]v!.[؍[˳/y-c}C۷ޜ|!Nr}i(? }ilY ޿H'A"Pr#Sby>l``!kîL`uaL<ˁK/#IυhEtIBZq\/N&tWzog]l|>> jm:l'ÓiWi7N^p6Ͷ@*]z;'itM[만>ACWf QOt c VҚ c`Ts IDAT ke;3<􃼔KE _)oy촵}~?~{]c<ǔ:]Q􆂜c 7a̧ uGDs54> s5te~shPs z['w *B', mrk:,IlT5Y[k^llNe!6s,R#.I̲ΗS|?3}*eh1VAǡ*]{]m"D6d6ac٨li+k7a[u [8U?Vүl]L6mi`m <lp~ĭgI}n`%ĸmoO/4; ;"e[lkIэc?k0 mZ.hVۚڪl_qnQ\1e`UH,rSj*>14?8/P0Ů<éM s!kt& ])z1(;} Ai,'H!%o Cܲs5fJ?YU>u,oK_Oqן6 㹰[as/|%&iӁ+ ̏ ͂¾}RҚ1oF^.k% TǠ]Q)_Z!2~Ө[LXHGx:0;(Qv̝}j{dO?M7ַ^nx=|קpNV={~2SWWqڮ\2iqlh9}nyhHeGcO~)[0|:eGu@f.L;:y7w(1-tjo/Q"#rIgA][7'">8(NeD|&':U?*Dh\+ݛ uQANe)ִhH򶏙*/с엢C'SZFt$p/Su*h>CR|9#P.FTSl%C2gۙyo^|A@\qFEpEeաxxԫTtYn :&XX_?~K,߶fp<m9WH7c?8 _.[-ir'GTHD]4snzTG"O Glz(h]$וL|';@/xwcaWgKzf}szybtg6ߺ|238?ٖR(X}Чg:uvp-Np_Z[3mr}RO?̽~͠2+"JQbj+ׯON9| ʈwtξr]t3SaiէPvu,F z:?ST8Jy8>gyY "fg]y7Q&w[ᙜI~K8RZQŇ}=r>=ʏf<VHzP?|?=`N)_2@ON}[wp2!Njq% ܧ+0wW8|dgׁxqwŋ/8PܸL4Su+M=ܐ#<}X}eq{>t;s6QG A#L2Ew)<ǣ`'X<&F5: qZ޻`"ŀԟb7:sS8f:Pgǿ[{Kvz[trwo{ʻ|j *>C`DF=#58GϝܜI~QZ163dʅ$(HQ:u5CeM"gJ{VP[ V]ʠ/dt1:Eϕ]S?!ΓJ8.Oj“xU<=(gNvfOgVOOhz>mB^kNl~7SIoᅾ_udkmrlCwhuu Gч5q%tHY0p}#zׯQ(91@OleG9U㔛SyDvD-3w'>mW Ě+#YNc< ,ogRAn3k&q };4OO}!B>5ӇO?S{kמkY(9z,8UȦnlv)xi{p8Dd4}gL?~[o$Q#=uW^s's|TՁϾA8:N~L:3:{9;brI:hF:X3bɼtڽ"U FđS_хsi*|KO^'.+SS>i٤̖=i01#oN:PR7H.y p( &?kԝUll*H]7·Cmr4ZT;':%1)~ iW$/WG^fҥGCWOc] ˒گɶ]?u? _ᜎr r:J^?Y/6;`r=>MW"DL})1 1ZC%@6nezS<<:=77Gxz~>i#>~N$򙧟 㩻>tD|EwywYGu)(_:k'Qkh=Z5NjnClE Ƞ!-|`2뵰'ޜ O]:DNi ^Kʁ!=J^*_Ks}}6^al%h&)<|Gܢ 3Cl=m5z =v>=J:~mzfK{km9צ{#%*z ~x#&=u3 x{FhnܸqF9Xoaofp. p2"ʍW i>с2՝)ېZ]q|O-}=f(O{u8P|,FGldx̵*QO?T歛/u0:Y~+STΞ+w۵INԙND͛{?':kg nݼe&sO-8`|{Znki!ΑY!!UܦNѧP $8qBq/+ љ[$},6dT5Zl]>O_f7ADMtrLDnubk3Cirh ?涠i!`Q%^rWy"+=w1XÐϿ@{qI Ǿs¨ 9ֻS[:)mNF&hS"-Љ_7eΫSFď<"?5=&A۾%egQM[<3_<,r]^=- 3IcB#.xΑ'Y&'`g ?S|1|pӈ7S;ސ.3|v/}^9i2 <ٹ:yסϠױ[ߖcOxrx6_=?Bȼh=*q.LGfT.}i:}vR/Smp|rrJ䦟p:Ffae=9s|:Vxe퓏?]槟޾yRe6tMN>>2M/}륅vE_|\܌ÅJTE{aq.jx0lpy"d>[,8wŁ,.w]!bviq5RȦq -|0r:h{ooQ9wN:cwF20aPPѧ}(<@Tpep" a@ҙN:Is]VC顪{ߪZV VUvmV`GrO}Y|P>X88lkAC3Di8MQS0UY ՑH[+URN3JV `BvVKHWAf{\(G)8t16fK2E{^Gxj/q#Jy0:O~({V~Hrzb[GY>Cao_n(_{^B>gTEc28s辷^_ P 5mǤX$s>s9.W<#&x汦Gi"Իk5yCO xgˏ<!D%ׅ+,(dSe2+[wReu5lIIczDf^wc']й_w OzEaQ˵ K]믔>W آ?SXfuМ[9f2>S ,`Rf:*%%UTRd" НMHW+&RVtbm{γL?OEHbEkrL86z8'|qAe`8 #\IQ& }\9r\Kɋ=Qg>I)by}`w^NSApș_xae>(*떗CwOt@Jo3-nvy$w|a4q{n"dt,fHt6s9\;O7fׇǴeiLO_ _ncI([XY0Y׭[7&+Kts.ݟ% 9K4Qdavt>*LʚĢ,r5kW tL!٩y3Ngx@15Q޴,2;5DGTӵz񆙦~Yq;_d7`K#?tu?`[qʕս#wʠLQ['ElIp>\m'm<:sŖ$AqD&^c". PPPbPRPVMUk,N+O e*(*4&E݂UdҧM==nGIJlMYT*\78Y<<܈c>s#NobD ˣ l=T~Ls8Q zoIy]N3#4y^K#"|,| _/7)l#Aby vǶfdi6nwAjy6D!3qMA IDATkyFr>Y8&A/E9A(2*j]ӢJݭlaIUoiQmҁZ:#c,Z<قL'' k9.at]p;tS(u޺.?m89<1V%MLҸnuuK[w@|(J.E۟aΙ]7*zJTѣ v/_qiSN8D7uwܩ-K>gB \ \fAɂD=:ZAqb X.<0_+('#֗ [PPT}"H=7RQL(wa]BaBYDqqjil*fpn  k<<'q&N\[P}!A JWS!(π^!} Mx+=r5 ^<- }GyR-x"] T2>qephEь87ƛg[K` Jf{bgŲR$ϧl [S}e ^ΟN1񖝶8,EV%eg ɩwne=靅j;ޢ~@piO<? nSNYkJmU5t):])5 |JA`jRd[YS%jڋbA@D%L8(<S _ֿ\S1XjoQGk?19ry%+A)04ׄ鉞%&>5q }_S&T2cyxzi9y _pM$ &.i6'2cF_d,P)9+J aV" pz8%. JucM%Xeþqw)ZKauY (.dI莨ɧm. ]߮+^'\,gdvکaM@fۄ6o _}e,)c1ᣏ^֜|>PxhPJY@I1n֍ Ýމ!(?XV?{VJT7Ӷ`h>u,<|vI9{x1'%SV߯*+M.LII8*)EQ2U_eQn\y2 r(XP8r[@'r !*h [@Z`&^N~ʋ|b ]R+?>y,A@i"SfX? ފJPUHHUf$a"*Zۯlˡ,}µMgy(@RzRƸSJ}}y9gpe3@$Z`eCׯ_m9K5Y.ʀ.s̱?X=SڂZh1 A+Vs[ Rf#ʮڎ6<ϰk vv@{ނyv{7YYgmJnM,?j:!<ІpmqpY=gqF t:&=yMG7SMluVW")1@8JgEl9;DkAr#nEٺ3 |p<,? :sAzH:3Y 4^I^~Dꗕ,RIME|<Ӄ'%SR=lB;E*=~ʇ@*$(I\*V wDg _ +iI2#a>~b_3G}"r ;CsRkf#&MV (z0c]9Ph1+-QRٝP³YX9$h|p!,$G8 >Jept3)v, ;m1}cp Ҵ9s1)bom9u]p=wsӍ7.8op.!ٝwޡl~7eUlϤp(l믿ʹo=6뮽NoN\ytFzHwW<{ѕFGA{m򆝔1Y:$UͅKD4٭X-RPI}fCy>& >iX"ϕaU!-/I ~ ~3=C` I;|̡W(Gv‹3}&0'HW၃1:Ǘ<]hcY@H򙼛7U~rxx?YU'ʊLa!?ޖL ĜvN/9ij"̛fXB@= PLiK‚MX΀m#mU uDpc:ޗU Zs 3b"nuYOp.J۹'88ֺa'kݖ[3Kg5ᜳR-[7/8Tnׇ}mKwf:k׬U-C?9qSzl}6fI)вq=Y优oRa)Z|.}bf>i'xǔLˆ! g?6-&iR|L8˕'p:)>48?vwb~↌/ˤ\UXa?;hϡܝq*hG4%F+\L7:oݤ Hp< \rXlSޑ7NB?{PʘG<:!@op/?Ã:9N~i 9&㜰q&,;0H>Ã>)Pyf U*eL@kaet-9.R0m2[{XIK6Ydq4\(o_8v~SP VO:nI)sG‹. 'pqᮻ`q;:ҹnvGQggqYg;l)\9RL;7ŝMC]hh>]A,EK_GiRO GW2Ώ)<Ěf[sX(K7+yn0`4OX䝇 GqA5<O!iMZhȋ4 )gVS(f"\Y=y S}HtGN~LKpL(4mV4ǧm΃S}Q~8*a7HhuG' n0p9,ReOcR~^sWFe7 Ζ¿tD+rиԦ׈6j8 l0gچ;(8g}:ܕnhr5k:dimE P/Q y׹ z<`8љ% Mƒj[t`,PJItJwSm7uGVrm-gw3V/)=vhzffy㖱yS Wq-a,ab|lS(='[V iJW;"Օ%sFєctM>'<)O\u:W]uUѠR*tޮq8PDپ3Ke)?(( E޸Bg `S检BOSG;`)O W3X[E)܏i{Tjmn)dQ/)­LWyU>9ZT.V~'A5,R`XtgYvIۆ/ƁJ.?L"sxҀaEZ]EfM9W;}N]zPȘҀD !չ%XPSQd3LW5{БեWQP\j?,=mAm{PݖBorAmgI(F@5dwQۋX Ww>OuHf5]]J}K(Ֆ%V9'J?N~',O(Cv1њb{,h`}"hy?wɓH671X~($qVp6}7ʈX7bmI4r2x8WN^e$:aiy{mQcN8'^x(cO)=y|RQg#hh4,7a+O4.K>GSp }_ WjlG5~D$6XRM<@RK:6\T&`RD̲DŽehOEw5qS>R>ΥXHȇuߓxzj;@ g,<DJMup;ܢ t2޶,[HunnFj 9m7 YިUݯruV}s.*vvk[la9b1hQ=nέA:HoM ,eζ'L` !¹(l(6bN)Ek٘1)^}YXy(R L9Ú'bʺ[z ֬9Yw;PD8y')u|卫x7FׇV}Wcv|Æ;RP|P7}//W`olI795InbQO,z(Xa-xBr]4̪ovV'E(iѷ&C^gMx `l+wUcIs< y6PJ">E㑾+=|({}%?R+_[Ќ/M7/1켅.,o>KN,JkOāLUBrgs<*)OO@9/(ʻW3+Fi=c OJqy>"eʶecaG@v_[rlq:жM>SP4n](XE4ҰZKyzKmh'֠z&k[`-یsE9̍LlڼEJ:{ucvPjԗfuR}: )Q_# CQ|P?8(@J g mǰhasMTlqr8>BeՉ!S!屏b>,84$%094UH(^Gc6P=\jCIíYQC^ @5}FB1AqY1޸c KRt^LK{{c(X_P B`sUwu쎝;V>mӦT|)C't2\Fl!rFr(%*϶taݼufn\([bk$a0fe13|D ʍ}w)K(AqN\xV$koA9y}`MBX9Dӭ`d]̈4K+{ңH%Ť'kyŒ( }p];YWlWeMZ`T5Z|+Ia e kQXj J)'LSu-_ܔ.]/ O.S07뱳Nԋ6=MH[N(smD;)>X+W/o.'7t(KRLqByB!|ʄGk8d5\Hs<+K0Z_ X`PDǍ2~#q~x7w'ViX<#y89~@5J,J])Ma$ڏ3PR.Pp؛8))U Vo{V,,1Oɷnݢjtm F !+J:c§n07餜"8%Sn,q# :(OY9Qɱ5݆HFGR(NR԰ٹ* EqfgH8Ǻ'=YsFQxN(Qps(ӹ? o7 tw:Gፂ;FQxN(Qps(ӹ? o7 tw:Gፂ;FQxN(Qps(ӹ? o7 tw:Gፂ;o3x\Gl]a--,q{8{N`yTrõ (%k׮=mś,XGtņՇ0װvQH`6஻6 LUePtPל(4Q7,K(^ѢcW5'ű+8.ϔ$8D}c%L(S],L(VAYEw=@9ϗM =ʏ8'Zy*w_W䧌2~jA<̿Y=j2YMZ33yY-/(e3) yz-(GX@u뺜 7 IDAT]dZҹћ6'qCrJJYH1a:cXs\t`1k  %+.):*nEP9)ENeV}΅ .@Yբ.(Mԋ>_v-yPꂋyBFYX-:k+"S /S|vXư>!j|t y` W>r$%܊NaKWLqeU#d0'1EyH߄xJwiICoW Tj$^Xp^hVQhrCE7xMtCĶ-"(EHfH(*<:xJ䋲c$',>r(G̶ Q3PT8ʰzR# E8S&[=07֟Fɷבt=G="Q QJ@.[d1~[ӝHzV)# |SU3Y0tыdP xk夼 Ie a |Hy~3{pЗ+_.Gcf8Xx79(Hkkx^I0qDp5,.aڵ\&'MCaN %GHq Ń4-ZfAq_q3)OB=J`LGSNHgq@~*׬G,atp|&U/,f(0)u+MA{&hI[k88//ܩMI[B5e.(#:%'^L˪Pr^|} Uˉu8hMz\b5a-?#W_qa.Q5ׯUOiJ 9f#A ;I[r3L (L|pZ] e EmB-@t3pa)Uv&d:B23^SyYVDQ =EF ڹ*P̰\IQ{/p)~n1b`峰bbQ|oQ"qکz ݔ$#A Sg{ K9[َ4ʶmLō 5_Sp;ǃqsRe)TBΔ$0oeQ!|iER[)|CqSo n2BK^r|,$YY&W>NW/7!,з|ߪ(Nu">k*PÔ*2o+䌰.#Úi, lqpIn%™b/|S`ɲUD|d2%\SQbNq R<)~@)2F&y$QQAʥm:hng8lw$/QS֨Õd (z1NuÆU1nlM ߔ*ʗK"< cCUwou!+p";=@9|o8oW -_Ҩ;z?@ȑ'!dp ֟Gv<$v@9!d" a9Oquzn "6T8-fyBA)pQ& 6?XX``oj"oF?W}~Dw9s|wlϱ-țx:eO|YPez8(QN`"劆%S4\m4CmQF_|kmB.ȴZ9[cIrS)#=2F+rI:vzQcu2ӹOu`F}hzYt  I muwoEO¿"i\:$mxy!|q۪@Y)<66aG/!]֮6:mXjXHi3kwCū )YZ#w}JD`LaHDZ~Fy{iArtWPO"+*,YqӫmfF;i|ivNnog$4f5yx5^'`9|W19~|1^r\ssn_cXh;\յYȬI0rJf9Mv?lHL 9;rMnXq(?X9%ag!5f&z~_OlEEc 1LV&J~z3QBiR=mˎ9piv&q[9>y|a AR1J+Q9b Vp'/'a N-_Cr|^mYmz?4WLJGOypNiLB+fHNo(\V~I9&n,!Åq4ay*#9 0C:eeēkSH3NHgl _@YÞ^ }N%  1,U,1Awewf d (ްse ka ~7|l#%eibR&u™ygWYoV.2:amCLXC:_~N^4  oE&jKnt; m_hm"p}{J'#EɕopP:4bd۫bySfj?IX~9ŠLSi73|x\z#Aj"ꕉ0s,?FwV+?O/jmx|R4f7q_F_A[R %cf&IW;hS3ʉ) eFʉ]]}P(P,(4N I`) @cP~8\.gG],GraeR0Y< +}|X2vtRӹi챢'_ȿm0/Ap7}e \ 3c?xg4~RޤI-dٸI; {'/YRnd\jfF/ˍ }c}¿}<2_B'{~Y8^@QX~Me ⍊Ȱ壕Rtr(4r9s>%6#fcYJSʣ,lz0gp.gZPX;c^~ C,ZʫoNZޭ| E~YO6?fFΗ2aǨ'[Ӝ#xcɏF59rXzA(UY\{EqBBdQ/Eyg!9`"%)PO*d%&rf¿?I.E~q~ΧCf ^Om|:Yn^QrD /K'ac#kgUËB_W Ƨ2~1_\n/sxȏ?$'MHwWR y%/c ćLn\.N7Z99|)+S`4M'eZ[[kc,C1N[[2N'+OwXq<=V臼/&Or^sX&q= aM\rXֽ^fu?vi^78U_ŏ')\O+8I@1ҋCGʩmUXi*P)!QSa*.y>e_&7N $?>Yt *pqȏRƏ-.ecH?3A͟{2b^5۝DF 5X1Y9,Ǎ /0lP21R~ik ~&?B_RΏ2~*+ˈtkS!ĿB@Pri@4fd9 bys)\ -X^nW?N&R_JgcWm¿dCvp6ȟ#m¿?&sE~*ft1V{ Y` #1(YQ2s_C\&\rrjxo_s +,2aI/3"*?d5֫͟Uǿm Iְq-+a з˻Ò<о9 %4? N"zˋ[=^ȏH%=E~9 ҲʓlA8R,1f0>@WfDٟB?\ϑ?єE h%fB_ה"?eLtѶ? #K@J/ք6SLUO,ӆ|9b~d(cMw>¿"?e$D?֏$!Lh,|2(BU"˯Pe+XEYH;\Gʏ\n\,0RKNv9"?u#~cF#jB}_b8y`̔@QQ\sfy^9\W5-Y(ozDȏs-gȣ2~1G&W1*g \ ª'z84^L8'HL@[R\6\wx/+ *ㇹ!ܠxE~+P#. b}ktEI. ԞBqOB LgQËB_W /Ƨ2~/e8B%} c N [wVQqeO nV`s/wX"Ln\.N7[ }E~a ]?*$y∜?gff|loR/M}o(b]r\k*U&樂3(CΝ;g`1<&.j =\\_ڄ9;8zZ+C^\'9/I9KZ渞&xzi9y _pM$ &.iMzÚ9DɬN9nn>KzݵY<-/t0 -rB_q2aÿ^2%e&oCf = ¿=?E~jsn?ek2g /.YfjZ3{ }0hÚM6M˜jjq(L fSm|)'8bYfƍZ{\*I @WJ[_ӹN-\-[le˖|ҥKǧ&$k2cHC p||)C2*g杜O`8rRzOVΧrx\?@;v}f֭]֞a_D,+@# BBid0' B_̉Uib:wQGmۂ})Q!s?HĢsdɿB_I#7ej󲒶kw-Zru˜[o?8(./ {NYNr" hrXWV9Or^[d`}W؜G:  pKx+3)3rcuN*?Xl? mɬ D<66X/+S 2~D"mhe(8 g6ʸ`: UH.E~ CWϐI6Qm3GJQ֏4Gi`?3Bm V8w =L~!eAƛ"?s+PCc9֊@R̚Z -T9ɰoίMNDC(pdcȦ*TO?M)cbiYgRW䧌 \c#)G?1dWS >`JY?$(W(Gp&/Ʊ?qp "1bшS(o%epqh̗DP>/{5oS! b< WC_4>IA?Xm$e4H{Ӽ])P>?19¹v5n)mj\h٧}*Gi,Ze(G?yc3 )Pdu92S¿"?+gȋ$eY;R֏~9"N9jS@ ǁD\ab / 2IΩ2~2~eQQs2."R+jeHQ0kk3ltPz&¿96;E~/2 m7R!P?e4ed_ߦRjYVhZhiq,3e-Ţ"?1Sϐe(G@?ӺZ֏aHXW ^G{noߙ76Xy=Λ>U}-[~d1ɯ~?pwvvkSG~Sw36GuTfvllL`&9~HO{TzC.X5&4y䑱`400Xտ1g5g|\:&>﷍p7lWm2#Ob?ғg^7]z?g0 YyG1=zYgw7(=ڤgPhQ eSWmO}^uqXu¢052Lo .7眸U-{T~[#coD1qobя~tg}Ӟ'>:ws&Qf~Fz(<vϰnm?`/oK_RZӚW-k?͉w+9Kg?p̱Cgl 23s^L? 6k'\C5LdkK+mc=}Sf=[l3=+PDϹR-kV zNj}K捇jٛRZ`x>föϾێ=qP}d6^Ǽ3ߌ;w o=?S?NząY$Gx-[6׿~So6shf<v++1k5&/)o͸ߎ;:[UOg. ?tjep k*=ۅսߌUgtBo iÇ_OY97=syh6-eI+P%r!jPֈ`Y:DG?cGuG([0!Ӹ~Eum7=fw–M;}ח/ŋȐ Yb?~?ozzz iƍ'~~KQhV _V.8BLx^a3??oJTߑۘ.4G՜9x;QƗ~}j0YYGG6_m #OS7\6uU8q"/E@DaoZGjX.8mj-o~NM_,PnĖHxB[y>~闾O;$.89 fN?Ԏ 'SNW'#f|ff ɦwDUnrapצdʏy/Ɓ0Smo|cWW1yVH( zvb-|`ě&i/kǞ?o'5y?Cer_߹{},c~23?eЏ?Pd1Y(y SgOX9I'jV ړ`y,shsX>lŻ}FL:*ag?vDi꿬^ [gf6a<U% jI4 3o9yw/[ڪn1魯vcؼeSx^ꗿ.2՝ K, gz&oi|G~z8TOn6 _°h"SZd~19z~vXziFp`g<#oڴ+zp<,,/zы??Ӌ/FN U|\.$p9lPo?D\l۶mB6_ _(r.>nT?\y0󙵼F7;ٔ'>Kukw]zWke)y~R<_tI`.0y饗,YE>4;̇&zEa0Aؼs6LL}&{P!-[wzC/NXt N9pki {z|_зe9Gx0X0/oL쇟@167zqM6IgsFwܼF̿;&=aU8fʰ`ГNןꆍotqx~E砺/@͆W/IEic7tǤLYY2w6y^]>֒~SW6 ر=̛7\ B_TK ^Wo9؏X8 g[oU3?,^bJ̮=Q匂;M<ⶐm&9q ۶Bsw?M}}FaO*ߙyD˟xsXE3̔]dx>h|Ƙ251"ëSN /zX_jC}?CsG8nq5̳e5$E(97Foc8 s 7Տ%3 %95|>M..:ذ]xop6):q+JCTu%;wS|Gx8xy:PSpM׽ i tض%yFJ9mE wcAY՟ Y'+77}ax}(8p+K]vh o5 pE :u6l:# N;6\~՝3BžcR[e:u&y@('2BYrXmٲ%u-[*eh~qgz1pSc u3ƂhTXrE]:GuZ=dh;l2 K I|/ZuMַe붭MRm?nV*a]xᅖ .7o6,ey:[o~_n8k֬ _rxП韆+VXuuUCs`L,=Y[Aַۮ~[7-Z<xJ1kFOݞG>V//r~|_g=[ZfC ֶۂ%C6;;XlNy+_~W~:q PSF n15W4<=餓u]80d&{Y4ĺ󼲚lVng6?>wǟ08i{9Sw{u}ؾiCX~W!:vk9?55DxoOMa~s1|h^K<ׇm߾a L&>Dzb^p~oۮTxK_mewS[P3ї]/9mʒ7-ҥ-wK@(VU=?"n-ϬcrHV@sҲ djRA4|5lIgɲRd1iS:62%i\w}[7\M$)Zh lB.d$Ψ7/Em…v|)R8&&SPF<9r-60;_jUxӛ򕯘9 ǻm+{ak_-6$//$ myf3cQw낧rd/{ '6^zB> <6Yk9,N ˣ  ??Á36[AAi~ ww|v. :`iwuWѰ|rΛ,CD_5#ޞQ+AbXb>G~wflaXx3T~ʇ5ukbBs#ggyźPX3aq:x@L@<wy>Xp~ g[~tV,t\|Ŧy~ K.$n`QBXP/W/xMXny6eJ~Sb<4\A*8N[mteż;#x0\[.#./y\ӱ,aE#(ق!nlkLŇ:?G9Cҙ>;D9(!_3wq67-ۿO7EjڵFQRP/, j+ x+`q81ZgxG}wbXgJiZ@|Y(*_8)ZcZdY5O|N8(%?zJgQs\Gcƴ_KO[9̛ԑ;xXK,hX`Gg]V9+KÃim!]aBzAcÝkNyafpO us`'{lw! mi9)S3$~-vb/QNȗE$|Om|_VOݛ%MUougIeaН>[r=&mݫn.v虜qpQ,qI,v8~ɲt=[nʶ6F^i$t({ ?ɶHw|4XspMƜV~!3f2: \%*ś3PrKoԖJ.Ȕ} 42V8l1~CX22Sp ?aڵi6'ޤox|zy8L 9<%ڙbq3Ώ%I(!8xYDuV /]uR&KΔܑ+Ih,N>K:,X"|e!UIh V:镃`8/<g(88yLg;d]#U'3. CGrV[mt$VW;u|\ %6x[9K=?9(C® yzVz1|oMr4e$7~WÙg.MS" jVLօ)]sZ&OM||pG[B_xф:נ@1'i23<Ӷ>حr|;fAs\2Lq CO|ڵlAeQױYpyಘy9m7ONO&n&k/m> 3ȯ!9O܇_W_Ɨ2rIGY݁J?fe?l0?[yzُ5 O|;ٶƱE>8q3֥N~c o%0G~x\yvdƝ `­:M>ݩ,&HpM11l}LJ)ijn'¥~Coc#"kRvᆻo g^v\mD1cac74(>;=i^qT3\o*ӧ=lo_qɖdz \ 'HWTr:}53ft&pŢhgфggg>\msI.<޴6Qf8y+wfQ̄1iRbuV\LG H?[քl}OpQd4ٙ0| R0ե|p4XjLh ^ޙR,YAKș4y]8$9pjίgknk26l`7mڔPZ]L,S,Bk >08gg|?poϮORN?}\X+? e q68[^vv8ۄm6pCJc«.ǟG3f֝<:2-rPϓfco-p`_a֍۶17JAZHk5Xq ˧V&e启V')_߫ϵ- O y}7Ng,dz?Or:mF ٦׆Y+yy: Ge 1ŻŧrNOl!kBVu.wytVTL,PyqVo.!wFV[Mj-IDATCwnw?z/AfoW'Lx(ǤSAIcbo̼b!M34N*3œ!voꅝe1"B~v׾6[}|?oٚcRȬI'a(ߦ#!|nJsAkGFlkJ7bၭ[p|3/ہ=._G]Ћ3;¯΁,C:m17 _5)D۲w峷z3  j2C}SuLO[3*/\Ɖ!̓; h|5f4:R2l|d/d Ԯܮɮam;i5ۘTɗ]ʏ4~}cs~Y(-g)si/8:8脚pDXlq-ߜ>ߤ_pesY̛} {ʸuG8~[xj݊q0YZ3 "s+@ FoJX\wg}9 :[oy] k6hSgV6!{[~]H^qBK_:&+XF/)O:әYY[v-[w5PL}27p3q }6Gc+Ǘ4kcex88l jfjh>t>kl}s.U'\/"ۦyʹf6ءNof7}cGftO_yKgo߈-<}/\ iSW&V #®>1]faa6]_AMr<<[\5#_4wtcڊiWte?Rò8 8mUW]LO['=mmjD2U?:Wh̚/kKZv/W_Ӝ"}wciӿ|)CkCog'vOc{1 Vݕ8`enޛ_ ʛQEDc|1#q5R~Z۸7p|r-8Ξ>D%`$I\w;0 hoĈ߼H,I7.3wNnoOlM{ ;?P6K|%yk m``:5T@-s(z*',&*Um;qaLr O<+CrU[_ 5߃g|%8?ۼ{Ԫ/A/"e{p1}_õ:gc?x7^LlYÜ b劽WB7VA6t/{{h71^w#>+C?go҉窏H:{LI'񴕈IvKL{o;P%r N2 mR8?(yaZvZǿ:-oA~} ?%7FaO,mr/J_]?3N{pNN>?c ~Jߋ^kxͱ]]-H?HIOZxxI|4} 79f"vKJNAO>PHMk`fnVȟu1]ʽJh?? %'#?æP#';Psi0yV`?o\uР3Yy0(P0HŏIϰ/4?rYAm0A7fxJגfC3[d? f2~d?-cd+h'Tk(Cw![OO؋gǢۆǶ99Z?zha)=Yk@A?ps;/0Yq~0h[~x@#'>!⮑2-+Vc-Cs"AeЧ a J(BHFp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxmGYsKBBH M+ EQ@T#6/TĊcC,`JQAE!L>3ssMe9{w6Yf ,0X``Gdv:,0X`` *#גwHŒ5``kERP8Klt~ѡ #Ps˷> 4g8S8L S7mv !΂ |c~C6L-0C40~62)bnL> q<*aWN>À:ah?eZ1m ohI5.C!K ԳOs(*!ډN)g.ލZSG3 a~TQg#:Bڟ-a` wH_G:3>Γ 8DT 1N4T!MZ*@?/*P 19u?fVϡ?+rȭ?֦vz]ӄt qzY`_Я/PRO VKdF/=߸)OlZ>% XHP %?觿 gz?XX1u([6 gKa ]\!Pq~gO{6 XבBԓT+zߪ3HC*/ Py}lt~ȡ3,0LCdeeeMn۶mnw eyk7rSfw~Vz P_A [ (g?^qۻ;oa˖-^] zR;u<>su~dP3uP#̃ |K,8sU\E^\ɣ?~+ גя V ~Ԛ38/ŭ[b>u=Ja_٭+ˤ`[ +3u=BQWjxJ`~yI`nGg~V?<u46,//$+xJ!*LP ,ո!ոe?*駟Ξ y: ׺^z[_Ub?6 jc g?^*qiƊ2=bo4;L&_}wa=V(#L΃ c~^k{Un_~ugl?e%K 'j!ı~L}sǟxQuD< fѰs2BH$K n^V ~_]7^auz?Cz2'xU? uyp1AeBu?zTw.Ezu$UVȋڑP 'Yn?_u?*;B"OkDfY]yPS36:2F5 R{@*l?jf`~Q)KQLmC~mn?{LokWT$TBjBB[l*@د1+@]XסWxůGaQ3틇7^zHuxc9PX*%*~͌CT)7'+u_ƹaQFԛW=KN`xԓϬ]#{ Ǔ'U;RoRr9*{F&e~hez0 T~THװG\gjG,/Dr;"lZJnKȌ<B^A^F8{/Q~PhDg"Dk3RY@uKׯ CQ!D fL@qR/E9UԗkU?os5א>b+pooFÙrmGpc~={ݪ ms3+^ 7>ST =M>}OOX\?߸?ohcD9*$b2/0ρrǥ 0bP( }}2`?١7Q/ΌmZz8᪫jyw/wX8sll;*ѱ~z Ԭ{p)=;2>,K~f2ПS=D0/|O~oo{w{~g~wͥ13Y/| ׶ltq?nn~O}ɫ_xIZ֯}k^.y}XF׀q'kȫaԖ؅зImKׇnq X7p"ƍ6Om]}Զ$>.y}XF׀q'kȫaso3«%P2B9^+=ն:W~=j+2yc!1+oo/ht]t\zg~ڕw~w\? u?h1_Q-8T>*kWw}D}l&T4 /.oJROO˷|K.}EBn\UGz57x\O#챑}7O_ZΏzWPHٳ/Y@;^3<ƵN7# 7r5L A2-:2c}5y DSc;9;pI/})T,E}k,h_6t<o˿|?־%/isoۏgX=M&=X_U_5 w=3꫑g_WY͊9c'~'F,?jgl)jjY1`/{G>OC~r)83:%Fa{K/5*ݻw7g/2xN(Z;N'-_ɷ---z;B:CٶmW{ᥠKjҩHw[h_[tjmV# h0:tkVSohv{=l|‡sdjS`Ue?70'ߨ= /K0 ]ݑ0eC]:>MN~9c~p?ڌ̌a9=}Gf#hlȡhٳX_K9]^jk^WrlqhYb`-o}~HIìbu/G__=_ug>:852daoM*l/`cw y?OHE~- `kuǸi dw՟"δ\_x$\vT Vu,di X'&}OeF6`kb fJϳ Ep"Ȝ4za $mXLEM6E-)Ne$!( 1R`Z:0c6PÎKw'"À2eL苾ьM#ڏ|# ol2KZ:btX.U(Z#: ؘ]S!6Ycif'^K#9Kcycooѱ3 !?C?4鲒'=)~)ϲg\\Kp3ug C&XtG˿˝F|W~i*=]h~$)Zp VMMVVOP6{mq޴8ڜ?a +9fUH k4i?AyW|2ot4/Rj،чiPbʙ!R X7ԟ'ԅnӇ]r?~EW˻!z)aEf͸f^2"Vpb}eEm :!G}ȃ4[w y//M ףq*__]wZ jQ%NZR~Xӆcɉ1W|WMcr4?ӈ=Frx駟}e4r S>r,+X֋\*X{F/zы Z~۲"a r_)eO%FD0D!e!/;!MioSOCy!A|!}35}M6Ždi/iK\iƩꩼ6=⩾<3XpŗxJ~ȯEyCI8$qZ~=H;Ot F33yCɛ@3c|ST3yl?b/U*Lj4{p*\,"l4Hi5f:LIͣ 3Kz7{shu  f8:=5~N3&Ʌ^tڀic'/g,yoUTAr^[&dK\0s&t6f[V͗; \%/=L-->YϚxOKn/QU%[Uɡjk8Oy %P^"߼u[10}PcS! SAӂY7O]wryȨȬa`> n?Wu'3t 3y 4G?M`.ZN.g阂1n4KtA/)6fc΍l؟ ߿_n#4JavWÒX'簇:5)dVV \;4ϳQ%)pv>?|2iG;vu2GAC]e/I)Wl#%[͡{Sf9RF?xJ& aɯ>Mh{ta @_βY$nFb.Ь$*# *'r(9/%Ef@Qo|~3rKcU(|Z˼xanSiZrbs|Z\h:B/hv 48"KvB TqC) Az`sUW):'R Fh}LS'C|GA,#pos󚉜fpN9Hz4_/4O7IOmn3rxf8xx" 8s3zD@?`d325c@8vۿx?Շ;[Wqk <`DgZKi䶟ꄪLݨ U&qVWj.NO//nfD21ef<)ǫM4c0󆓅^I3fYJ{kNy܄+N!q;,?X2)%+)̆5W1D*<ؤ)}`b}lЩ&}4-Ne?ؿu=鸺TC=oGT{Zg@NoD T!Nނs~("W@o= B+u#W\k<2Vr.ţ9y8HCJ)kElN.)4$; &%/'#0+eIVaޣ'!_kȳY A?NyXZ H+@oé̐'h ,U2I8R9.>k8$ܸ B D=z׀'c&ES_^ՑR軔_Ҋzp & s+HseFy5Id' IDATGG6S"?UN ~ QߨSNȏ|oI1&9ٴixR*h!۟'Ot$jNVC bΓJ vn 8L:a[n)|\&ؖk cf+*HXܨ)>) vk '>T3$׋";}uh?ԏ}Sex_W>s!*2 ^wΫ#xNVUzAf9xa%YЍ󁌢Y>C2uq>rFK6{7}nI71lS8Q-ҒSE%97"M F.3SC )橦D)RpYO3OG>`7:Wz;K2Ue1}e5Ţ sH0zWΡkW4rK On?U}QϚg_pt<*PwFPZ)cXN`?zP UWR%3 lYy63S4BO:)0q\aiʳ>ɡ(ԑ7Cd L*xD&zмI8BYL0ቝT47$CԟWiϥ.γLY(H> .HV!y68fgq78_F^ 觶.Mj[GX>,p#k5nհ~jKBۤ%yq78_F^ Yկ͕ yE~N׸|>)ס(:da[_ On~.nP+;?r0nԟ Ko [t$c\l}IB'DQ?}? u3P9ɣ$(]q~fйXV(uF -CFaB3)ߛ8|fo*_5hpqpě,e;pm|c)\%^1~Zq<g ^php;xNYIp,V7 $8 4!PG=J},NO/Z8&V;@"I2S`GPPׂ;S}O&v2CVn6@EGL/p5CB5ް~ғ_.K`:#3I,Á۫ZzD\Y#^{:z|IB}!D˗6k.K_>hez3aL,NN0ʼn"9^_mf _Y9RV*9>[)n \ d}z7RAƍQ3@)DlXPt, a/VǤP_g^ FERwyF F,i]oe`Y,GyVvpˤ8K_C^rВ8Q%-|pL ta8gz;f`<ﻪpfxZ/j]>tP :ˆ7:|e9 UqD'BEN\zYkP:#m(HFCq[3dk|>,n^V{"xe)g,ڀA>-!jc?F;-;.s2 ?o Mx$A5%1ߎ弄ooL02??JG,? =IeRd k[~҄g%ͳ0pz%WӾ#׸I/sx38];%]|mέAp0w@ۏ}_}zW檑_m¥aLI qM<:PSb6f-`%f:wl7tlknOr?`oU&(37`䜬vgq#2EVJf~ ܘdžY(Y~]#gF,V2! d?O<)Vż7Y $ے)?Ӄ2I5-ejrN'as/ ,3όk_EJP!d3ࢿD2tǙLӢ Mqfa'= n}Jc^ j =C`nR  ټ=侀6lSK0=]]M͊ 7H@;,REJ}MjjؿmUOTW8aI젖ݮܱ9&GhwżkzP nO$ ?,yDCqh`- '9QpӸ oeeU|$ej"=.$T9IlF[%ᡋ /D"(y$ff=$NXSB{ʌG(NTT:ETR&)'HsY#䓇#!IM`P:/}Xo{=>>.y}~zZ`m~zJc^+ /q%D@x}2\)q  5}yT!ȌK:,Q7fLdxtVRs5״m?1Pp5'mI!'Ǘ鎣[U?ZcPlN?c&\ob(>A> $>/KiiL~Brx`ApwU"K'hILKQK'՜T^T8 4%Dp=G:FT:BZ>r:¶\Iq6@up} Gi*9@C*Q(Aq }6yPfa~KG^hD|B?y^?G+?| 8V-@gJe޹ oF ,N1:axobrP\wu swSw61^A_{ꩧ$X{ ֖;mn8;ə0;՗YL{"<6kJ%ĒaY&AvR1THpNڕ >((Jr`kW:tl#g7~&$Vr!\KW!zdNV'͚^'wف^MH.ۚ[6y >|-}@"E!4ʴުKtR/ JDU^??py.(=Dzr}=a_غחGF;@;="Z+$|~ؗ=#ǬN6puyE]{w&4*5rJwڝ._s5kv8nj!ǎK/T{5Ŭ\z zu)F#9PkubiV=:A43ryѯuϚDKpAV!-<}j&ט•3hkxd%#V_ᄁ?MOoy3|pi=L ?j|AiԎ zP󐯺#nx Svȷ}癹1Sgd%-q,%GXp~zp!(lj=5ܿ{2ғqY=n>J<%![jM`Z؄RR4*#t }/fFciӒܺf&W6bc*AZy=ņ.ră͞`0ʱb4DYjZ$ |nsYkj+=􇮁[qX+_D|GH~yy>|ZObޙ],[*P gUKofߘUq=B_Xxag%_]HBNf5vn/2õL{pisey?O((+HSiM啎5~ IP"7ҾM+ǼMЧdɒ>xģ<xaEN/ |]xk^Ө8|`s{ݫ4rW7{n??v#% W]\Or~'Z=k:3O_ja!(:3}(S$pB "@.W퓔2Q(cp $[0~v=v[{|;Z=)vy1JDNO$fniO#%OAi$heuiqKwFFmd óGTMƻv5 /jfȃ$ӞڥRMV4t?h,\rʶv1ͬ d $H.SV~mxv'E,eMŋ g9!D!x /V @͜‘<@ (#:#z,$G)%UXF˞s1%xOXb*87Q n=Jdu2e;w4??0z#ѝvi 39K^o)#(=q<]L}I eHQ<)Q!u s+_~7H]tQcyػ;!3yr}uM^ U(? z:Su><k6NS8MBehΡO0^=pf@Ե6vO(z _ݜ0 389M:dɣlye-1p-:3yHcǎO@2Pqc,G /@w9%-,I˭8iQ3V+\O׍u{:I؂3Km|$>{P;Ѡ?5/v'd4cX4:!_( Jq>$ |hvR 6HЇEUt!OX(Si =Ćs4]ٟ}JQ7y7/$>arI_E^S<9WI[ay]BF5׳A{O}S<12/$98zdzOv&иazK_ӳ3ѥ^/k>>]7tqᡷ[?h~y bne D=_TNVV׍6I]wmjJҿ^xຟM00\3DsCc^z'WF.N37rJ{OܹI6а ANl-e ט%GE{^cP!><-s+5,3: 9 w![>sfa nS (#vOfCM=p ? ،-LpUJ }\X-ĉd9~ܫzYگRxVn*3:VpGPs)*"93B2J~q r/1է <a`GZY58ƃ:MڬmG*'ٻ:f&T1%khb ERۦ9dLiXWJNtw[LԦ= nwa9' V(bFEҒY\]YL];*T lpO CV➀ ЛQ 'q̖^|1gc@YDzqem59J4\{ݮkW=)Gi7Rs𤕜fqf˶mY,iQ :ڎR"S~4u5J8p ?2693Փ/4/7鍝E/+>6Ǻ?O>iL<g^1'>&J1я~f&[e0D:^lowu}kurxuO==u㻿[GaZhTm=?ahYm򗿜|GQzT'lMANhOy+MF트3(w?agg$FeiYes7}75мE/5Lּ opƇ?۾ۚگ]Gd}Sj~~K'ydǑr]R \xTq)}5`}7j\zk. >k\D>ޔPr2Ê0˯҉b )KUg=֯a{Lsv2MZ5=7gsϖ5 +z,ss%t_|jbd@mݶUG&I0p'd)c'}meP$ 8KV1!8Nrspu;񎣋/SNXK=a"0KTZg:֟Y@Ҙ&9L.]K8v ҂$a+GגMx&4: EGY={7;,]+j(]}Kf2:ZXj6K[Nm(Y:EG2lMJg`ҒmW,eF¤GgvQh,;+`%#(5^◴ 8>#4N_i^W{Ţm`8y#9ayw+Ц33W|w hdv8@ox\^)Kҳ ??e'I3J9WBúODz IDATAǬf_:"tltB1JY$#vۿ[;2x;JiO{Z;;'>=)sr7_5_rƆqx~ѳK1;M؅Y'6lO>3Nuۿ۝f<;p??p ' gxVA"ǃ\zwu|(F}La? M s5rqt+h8 t_㺲y i#w:2Y&(3mi(Q}MbLdQ譨 O'S-DOcvBm2w ɝ(P%xFhf'^3>5OzֳF/~__hv'?i//V,1EUp')lČloCgk3if'"t;StͤӋ @q+3Lx+ l~X?R\l~꧚??6πjZ~=) A~ q,oۉ+ͣ`ǼJT%;鳢]p sJFD/pC*+v'F[4>sNk9N>J@6d_΄+ޘ}a>PI@>6:l~D˘C'q_,䴰5)wrVZ*G5_4>QZA98:>w:p(rؕLR&3J=҆u`O`b`81-סMseBC ' )Pzvd($1O m#? i8p6uLi[ZHG,V٤Y)R!+VSsWys,rE wfI1 EÞg 3#wjFyr F:)-ڝ8ִ} A3#m~d*D"YW`9|,iPY0tyW|2^˲A޿]2/à%KU Yg7_e_n)lQYe8,}cPOOwY>ԏM=i^*Wq\^(i X.iέ{kӇ2?ArrzI4ݏܡ'[ Cְ5zFE=t޹7ke,ٴ_|K\fkjPpi5яyLzyӳlWs%p^~' )rHF Ⱥ\1خ}KV(tm);_6/v-hyBG 䣷Xh?C` :JL i9ƙ` jAXO]lG`NL󀣋0cƸD('0TeϠiZvڻ@c->Ν{*2u-Э,鳴y}J:2LR Zj$H#`ac(pG:tbBW !Z乮QŪj/5ӲyX{xyQ>I?mwLhLGP67}\8V\Nu @*T$w5|;$*Y3 2CT)7q{xr:m\ogR">}&th 㺡mѣE{j6xM֏/;VrX0KvbU48:3lf8*io/{=%y0fgvrǏ}k*IjG':}܉;(m4T"RܐU( 0R,3a5.V*f"_3sG`}L:e;6XF 3K,Yu:goB-SD˔~9q'c-YvrƗ\zU4d 1P7>1Vss@O铳jAD%ĄLӒ-i6KBq,"K.X +)9S,Nf"[(O_,pB3<3 tOҹJ{&kW g:mfS=䉓,KRy Gv[{@iYJʖJvQYO-c+tGCz ZuB<) JVya͗h|>ytu.xlX~3=ꉺVilG>2>&?!G?z,G`M. {jQXG#|Aa>U[tɵ 3+k3DCA:=C˛KO98Ax6N@77#gVZ0i 덮*j?}K)*̽@!3.LIQn~z, }|Hr&2>[(M9k7Z{Lh֩SJ+{)zjKƜ_kkGgyO8-7C*XfL469R1 @\20=Sg*6+Y!CHP,}&13KC_b,M)YSc/%2#r ((OZ4() m@k ,nˤy0qGI ,QM)8\I$*T \O|°,4O)s.~`s`˰9a8O45EW=biiTgL3@yKC) yv>זaN/!븽xjY7qkH*mfo?o8j"teO 븻J>}ȁ2v*:ej^orzn>0ʴl\]ֆ_U4 Szq 鸞Oދpr]cZm%SN٩78 Ó_n8Ю}pjrKySù7Bw},hPwLSޏ}c[o77>Z`#;mקsѣF > L.u>Cf{I~&W_gC*HBk?; % ^N&I1A^pyuxYw۷O晴LԱnګqڞ:3(?W- 38&_ M >lC͐C!8SnpPr3.*Kr˜ M ԟ.Fҷd"V )#2ch 6P;nJ "mrlAy͇۫{ӓ:"@رٵ{o[O utw.gbf@*R*/\Ɉx*~ͅ9mgIE^H*o  ^.JLF m@.?6K 2βH13S1,G LKdE<V!~yrzotiF}xMSxk:~^>F隦o߇4uQ5MmiF}xMSg.HG 2(貾,xQ_Wzj)rUV H)Zo (,r? -ڗlr>r[XZHhSu%rzIi>E9lhzTdGB4Rzs L7Jr_2|3ɋIc:6_ 3K($$B" Y'u*K7R(fZ$g a0,8{J!f)ܖxe={۝voD(:< zʤݼyfMzϛgDRZ[3q9r%N)(遼^Ҫ:~҇e'C,bb Ͱ<n|A0n>jIϿrnS#6Em1`}ӥL'XC+Hh?Q`]W?W9'9cj:33P},ǗZX7L <*zO1i}Νmˤ=Үn8Bo6o#ӧ!Ev/ Dozgr|`-3&?* <9 A er+rP ^lEwAgIK,tz{8D1n8!4@pLʇNJ%)MtԪNV{wyJݎr?&gO=8K-ͦ-4gq^Ui}6mfw hZ2|F(pH"oI|\SqZ^_ aNt𭩑7~6ӮBt n\Q3IT%ŝ!xWK"Ao} Do?(Zu}FO̡!~J)B\14a FrYX@GE/F3|uH${H4N=Ȫ:ywߓfZkFGkur8̼xb L)KJ^偿ă=kG n⣫n!qs*\GmB2U.,ꩵQC+{Ԍou:{]]{D.kɒ}pc`&hBoym\ޒ5@HPl eA?NS{py۳o߮Qڱ[z*nU{ĘU⩷9F՜69N[$mzAr:Htxa2# ,GżVX<ȕHD^`0ho[m쯪ŏejTv)98Bưh\w Q7cU8b %">D\Q>蓍&}[ۇnq X7p"ƍ6Om]}Զ$>.y}XF׀q'kȫa'$=eJ6V|_rjAfXPB+EK~qTN]Nĵayi%*5CBO֑H#RI7qv%a wi,y( XŲd\L4=|Ld*-R%gQ_}-m`șQ҉ѰIݱ{Spz.-{VJ؏II{ɉcWf<ӊ glx;E-P᪾< %'|fo&%8]< IDATN3Qx\A#Q~*Gz5}ޥ .tC,pY6kt^mHtƨ{o}4}FW~P `ws#g::3JǢy[4Kȍan( )n(賌D ;0@Yr>+2VMIZf2|HP0F5C%lv+A+g6uRzcgvq4uѬR)%bA5-ޝvi69L[%-'N:ieEt< JRh9'.:ߎT/Ϩ) l'|$ z )xKq6wZUJ# E˚*$sR7i.E {Os/uFֱXn<8ˉ| @"vM1Ql֬vUڡ}JYڥK{A,6 #(m3Om&:El.tLt]V\J>G\ jG)G)Y0Q|fi:. ׇúx/ Ga?~!tnKn.;Rf0}>$-8"fFL,tt5,~5ziqr6`\79T@ڏ'Է}~j ${O~^۴ÿ+׼U ܾTT5T7/!*F)s嚡1b^[dgJF}BEh >79=wSu1ٿoeiR.;l:m+C_u J|?YE\qׄVZ(H zOyIRǽ<6T~g_^^Iվ${_c,z oGq3KKۺnv!<% GI]0).EuTڲ6K(i_wRRAgS%0kzF;]W~=nzP+P /H7& m&,uKr&UnqtlvGq^f^iI .@шQ,q s\}@ci pڏYNtsPX%BӞRܮoSv.Y ՆF,/p#PaF~rX/e$xJ!*LP "ςjXjX{(z{S1QqyX>x@[ĞJ㳊Lmd)Kf5YAprqs?O K&hP3LU+|No_i?'8|~ IOϕfYbZS9(XrN{ʙr"gI3Kt BR=CNj,+ys2 S~LN$ *v )nӫk076%k_6W}(xc$3`6}`K^X;\Y=x:U>-LKw`#5Ru%S#fE,#p\U`A5^W֦=`ͮF-'MBMyߵ<6<g*fe~<.C 7.k qRw-R[\9,23 ;n/RH^C}qN)[b\-vSX/6t>xݧ ;wI۵S3K{=C:|҇*tn&=9SiVIg,0^XʊC3;I]b6?ù I5 $m)_&QJ:;@z&M NR8BI{F)`*IfC O_8~W}l;feY?uX?lt{w]#]=]-O2䒄edV{wiu'q9gkU281֟jb"jsue-ʳ5g-oeE_ӓ̐s#05b@T0uWo5q͊a]Ӫ "H0 39Uzf`~UuSNխ:lK CUjBUT@_[ô͘9DMFʗ^u1;\/~^x3Ox{_u޽ڻ,wVQ}0#z_?ԝ+]e1S__$D2-%gsx;çP8c3x. 9C[;o[Nk6\}5K3R1rB|bP|IAm`W+}Uׅ-#Sa堖zz Xz{olӬ' m>˿~Ȕ<ʿzcN>8!6ZՍXb'5ɻ.Ђ\*Εb;(\8u[`Ao|%WpcPSDiZ5`V^s5_~f,}Oòayqhkwv4=|QuXr}wGw'40M^}~|p)5Mc \=.  y7{]wp9,M b<ޮ`ҲÌYKt(ijX(½܃;rMS_&äȟڔ=i$_NzSdr،^ya`^o9808b,=tDSFfi neC{l-O!F2SaKgzc qJDKPN3c78e_w=Z|X5̮M+Tc" .(,]^,TiБ^[O#$QJRu539ގwe390q#<:|Q.C8⍯eGkE=Ⰳ)~2-,rCW}tXa8ф@~>!oמeqV o|+bя~T{sc3<)^zኼ9p->ҥ͜}/~&f:~}fNzBWUC}h2]j2qM^C{-j8<>3Dp\*M0ȀARԟ]p#R-DNw-g:9iƼ/( z`O:"{qn݅A___ubl2^ 0<*l&F qXfMU< `DHX3*0`+fEX) 3)gKsG3;7cu-SGeTgbnDF8h\ K#N ^s7bRk#-7?O጗pƒ“|ɏ 7ߴ2g}Å|*Z իn {ӊ< XO7y7ox+Y~/;'?{~> Y~熵k,rbDYKeדN:1g1. Ox)c+ʥKO}SpON7n4+H\Ъso|c׾vYgյg4 <3jcjꕯ|eo}+=3"}{kO)jJ]_ҖӟtЇ>xۿ[8iӦpw/| S2$)_җ6:蠼-;EY\򐇄pî ',`@wgp贼Tplܖ$}1[D>HRL&;e@@'g? Mv.rsS!|q3>^뒺cOPNW>~XCxr,zϏ#e9hOU̟JT6ga/GN޷D 8#*ZMЊ!A3P\ )h),:OzZk\wZc&&/>f(uTI)JO2})d j&k]HZz;$ (q;olV+mP\d/o>3d-Atq9Ёeˏ.\8{7U+GoQF/'4Q_gZo9 (k nVĚb_بN(DfEUEUȔ@kƛ9M94~ݺao Rt6Î5oq஝id.Y|zѢź۫;6淖}ˁjL~g[~j=qO`/|U ywg?7~;*7|o>w|2X'JL04{E8g?ZI9FO3=~pSV{m5X0<!]W`# 2F"DFl`?xI Vtx=O.75 ||/}ɞr8 *+d\/CI8c y@o,?_7tSxԣGdީQ2 ctʀAMAƛ_W+h3>3d(c~ O~p׆G>&Sq s\V-=q^:9< i8Sg~v7juw/K9(# ~ ,\GJ#v[y|T0׻J#a=B&c%W<,>gwyFiF -љc8PSƆflN+KV-u@,hCy XS2FQR,˨!jF4Ҙmx;><j[eR6YA),)T΢C!z5t$]dž%{%¯a neށ0~tG** mrFkBԑYMɰwPICsE~)m`Ǚ-P1T3.2Sgyy,͵zjrwj/)G[dcrsqȡlo`0ȣ-oZycZjKY4c$GӌXql!BZ6* K.a_R`YL#2?a8S4%ëGukAr5GYުzmϠ]tQGU8뎚2ba4CU!# oٲe|lKʻqR{X(x}5-o'^=F/dYޱҌ{71B_40d"^`)G$_8-MK,l26n`&$ඌ;} jٛl72=(h~5J'3S NO:OiBOywC<a(a0"'(|\xÚV d+e=e=`B}>I' - Kv =)jc5k2JY.^^vuO?ӟ)YCwʵ3ɜ/a&EejEc[&UN8Vq`X?WqyҚ?t q=JQT.b"'=+LV/:]{yWE\Lq|gLO?*KyU3Pb@in(ċӂ/KTj~>-QUh<,' OrG$9/G:tjc`][:t}ֳ9nD< YEY"d6H IDAT# qW^0g3bW_}~v= uj wYSUm^}K84J%~ޮ tghˡ哈t/Ub,=ʙd@9+ UG8h{|+_yÈ҃o~H e0rll4`{ Eadx<3F5\ZtcOA%XaK3f3Ę$?4!?( /!h>ajopQ~py*.ƵeOw1C } <&vHMuK.87eGNu ^{ϦdL)c\hրm${~ZRںy*YYC"%k0g 7_Qr#!/rXG4[qAmw G=G?'dCmF{x-Qo|ur6,Kt{|] .0h/{˦‹vk480ukKôNU|ͯw\tƓ=E/ūe ={|yGZjMi/}d׾)O}FyA3>qȧʿ'{hG?xc^~kbbgk)EcJx`FrӭO{>K3^z4x≶}Dl.Tdm%Ĕ|XΕsCnj(1+4+w5'\ޣ|3O~+VS,kC{u?xG#a6CK,?xEX~X)N)`&? mڸq#Kֆ0~, 6.&|1LWLXvt 8-ZxbF2v_|. `Ff/BgF54a.i^K-} ,M@_cƞ i8=}Lk,h?s\ȬO>UִfzЯ?vMN+̅hI@L,COŒ0: d*oqt@\l$;:uF< EI.7kH{0o_KlΝ\W`(1Ϡ1X>4'ؿ$cA ^7 mHS:ig%r%F_z,2K\!|t}O NOBݯZ[Nò 7kӹ3N\JP%TOm1"ܚlUj%/m5X~sp7'd1 [?f ;+|qqf7Ls/ԩ8 u{-'YO앑-aO3hBz߄kjO,25+FثJ+%r]lv:.h7<ܧܜ㊀@qHgvΩ;}t;04Kt4nݺlGDlO| U<4HK-Jj uS~æ8tf ;<}&Xg p гf&.}u&B܀NEMaK=,*#jXUA/t ?ol(gIj:9ױܘ=9dj<$:{,(1N7`B` {ae.-?4_b|lD7s/k$2M2*  VJj2PN2z1 F6* . 0+ RDMCkfzE\߽)z k5 X3Gt|Muڲcޞ2(kDXv@-lݴ Maa}f8>ۣM:U,o?QoI]e0CfTo`թ:<Y>!CJFZbO,r~* }iɓ*zO>-HӖǔW]yEqOyL8WwdS~ijrDc%KOɢ &,@T x2$ׅ$$I`%O\ЬxU9T=E t1w,md0;wx3\3C/<>;G~v\ՀftmH|e&ʁ+u$JϏrWT^>6Ox) fJ U3NO3Phހd<:AR߱lBc5JMzX[ҏő5FhpUGkKȢ}&pj1˄#Pr)W `ı8X56tC3R wfzI'eDiQQv.N}o0/`oMQG9ٹht⃊5bbpQrTXjFbЕumеZReR'tA}^6k6JfEK3g e} \}Q9 =⠈|Іݭ~iENN(9_u"f{\|ꗮ&ѺP?EG#*ň G,Y=; opt }Js:BdRi`'h6lv@;op⺅\}š~|3ېl9MPU~㹞 ('2Ӳ \O.369;f[3ĒG_k7mn}3WzӞN[?&i"~[HrXk͟N;z;Ly dLg C0͚E:ꋵrV|o f $ I!uJV , )zy}]fu|ϑ+gUJ3#WF4b+[54ΡƔ6ɀ 3bRj*L -(^`v 8$]C8]%:*Lu= Wx3'YC#3l(YYBOi0ᓹYqEۛGJ.g&go/ ۋ;}H\j|,>,V9uMcϏd&ﻒ?}ҫB3d@`Zps!3A;}N,k#<]ՆHEQ"+ћ3X"YOQH:D ط*4K6oޤS~ċ6QČXzH8` DBXcUΨVhQi,2h\EϒK]3A=dKM[V^YU.}I1uE6Ot,*7{=4kNaήmO[xl~R{aoM z}R 6wdS [Ds߸GX&+|JL};kzk6Uo7tL&,֗Yqԭz$MUaqN~;,Cx4G]Ff]7->1=3+ȝgҲndmD1NhA?6 aCh~RlApW wEbrOT'AaIyE~a|ŌEOXwdEڄMqDUE/e:#kMbO]FKuavSUcb]2\e:Hl`Y<\<"6wEurb*TGX5 5uԚ(.MѢKzLyEV8 JS6 ~E$a8iNj,ӑ0;ѹ4!N޽u ]|pg)LZdh2w;}SGsk?'GT-MdYf*3N yPzfXਭlOMLc0AnjH.$VqIV32!\X XګS(aX K'j:C {ZBo'$n0 3gYf8zAX@Kj yɲk:Qs-bFV}0}|Rn (o44ˤK5;1P.Li.hbQ}y<C x}΢1M_ja60.ۚnPd?kK=EzO㢰땻lyKXiKȅ7A'W99͵:2xQ~+]@T}~R;ԟ&'XM73‰mV4;^|q o^}kC>,[ yѐÀ >Piq$?#z(Ɓya\Fu{si+mPE< *5M ٟ/T4!!<6qӋ*CC5ׅͷ^ϭ v)CBc)2x4kz94π4J$O@1aa Kʬe4(ElR64ѥA"p,mAԌA\v4#f~˿=~SɨK3aNgJ'{97 WGTꗪpϕgf4#}-4KwA;ޖ:h3.\Zvuzk}wkjQ5ԓ*T'$ `NchLMZ{y-ZLhssG77O9p ']qWiQTLd*=, $:6=iUl 7+p뺭=+Z~`ZR+&&X)k=Du09Iq0[<^c3F"uT ;"Q *PsIY)m NFd|s<|w,\*p%Q7z9iUn;B6AEc\1EݥU\҆hˮY/^^3mu .y#J}W89ӹ _z-u\yڬ\4Up5^~+_LY/cśt"ro~N~>V85ҫ8"fzqF$sR3_%PKF $TzEkܸznJĝ9o Gxdě~6&Qe_\c8ɟ[腮m4 s^%3p7>)hΓ|Re>+ IDAT˙ӿoX?I1QY~?04jCOS{Τ/j}ldԫȯYjf/N'ܖv3Gx~TO~Kځ|agO0g9~/i̍GN` tmN:cbK@P\ QD=h7pԅʅסMZZbmHN_]I@ī,tYVGo2a |Qb g+9pDeq_*hb#Qrd$+2Y<ѳGL>cfFC~E/sboYӿ[PK M[W _{ujaӦMatr|-JTu *I)wiR rz'~ݨb4`Q.&KJbPd7TWU|RQ"ht ~i.7`K\XX)^G$ fðNLV226o9O/\4+H ŵzQ¨vѳGF= Ja(ߪ/x|Xwßuxa)Լ]zWӟ<}TI79vJO͛7# ,py_|{T~6~"uR$d./k/Z>eypqϔ ,gzw+?Uh*gHJcXKxk\n3$̅H T+[D9%X~w:jօ>F`W=mw_EI*pe6F@F4%#IJ.%dQFp{::2&{m#aldR,lap%djlaҭQnl49|Wg(j*ƟTG.k%V]xQzT}{|G7 vZm}qu.Me>W^jAq/s1l&.{5;'> +/ >|f|S/f=\:0fɨb,΢/oQtL꬙ )junmƚ>j(ML5eDaPeN-S-O.dJQ+1%%E5gLQ0w$t;HG>k"QSH'fKƂO)0eJn4iMI[,"n"#f4_Pkfص(kҹޅB)QfKp±|$0tM'O鄲 S9O+@A<~)Z"`?Wt0g"\s5'>~|K)\bŊs9[~/X~)&-_eoo_e> w2_+W'GV &}їMG?B_f<>x֐7ŋg?٪|oAZiŔ A%oLd`,XW2>Ƹ8Imտs2OKF_Ч%53UmXUh@;Ig ᕝsi2dN#IPd^QoA`4$j=%2U,2RNi\RK\ 7B5 JBWdcL |`d? ?ky1xbZb(@N'92g)F̘ #)W VLrC,U5yZ*lQy;tb]ǵq%AF7Z.׮]6Q\&􍡄!Ej`-;: c ~(uV]NhZz յfIt39Z'%yU>mj9~kz =a*6::Eo\/ןZ(jQ۪i<[e|,b K(dkc a@"у1uW^nW?RƊt~(/| Yb+̊yK_j =zI(,YBѿ랬?flOUv/.]J}/ /׿^#boZVD_U)fo~pƖAVFЇ>ԌR%hƩ&^f+"ZW]ë|ӛT.~UHכo? /w0AZڋgjC^F8^ 3]cyD#S9c~B)7*nv"d8LAӽNf ?"SP r (GÂΌ> Bݜb+#n\KD N#"4z-U0Le[7n(Vݲ&[3o;K2uߓ(~n-S+aj\5z !Z-1;ŧX蘈#u&f0 a? #i-S!1+7>٧Ƅ`?d77_ŌNU[\ho'vG _?ʴTT'iqZPKbA7 O^(/^QVR4z˗%'峟֦lr ׾5חfAe8lm\o)Y#ڕ_җ0^,>;Y5=s; rvSĻj-y $:|K.W0r}L'9,#iqECL7fYԂ2e3 w&]W<Œ^̊=";u[ynuJn ONOR!BF5C~Ij<htʋ lM$ KbE.(-U03QiC*E(š5rhBkJNӖ }E'19Ulڸ۪x>ۄaN1 !%RLiP6cheFۣFtTD3ޘ1Az0/!BUϰpA-bK'4P𵖄G+>lUF3:,^:/@%,~EJ fƔYq5Zazu߆yCK±ˁi9;L)%#x:~hN`~pޤi.ⷂaNОQ@كnW'+qU:gT.YC@G!gI) \jf$@ V aҟ fs.atxL0`U.Ҵzkh#2p#+rgf|0DÕ(#~=b *YY 1ʪkm0tJ}]E| ~rڃ4Ʒc[;{f;Ƶx{c㠿ibjg $1tQu)(flP\OYA@2kMs8ZVC!Hc Khc^ݙh _A&DfNdKHd ]IթOɘohhaxN};B^> n>-\fk=I|wW^]RYI Xfe#Ek):<-=MB61Kěj~ӟQU9}^o$Կ6O!30>B-`GqWYCѬNG>OWW9}/[ĸ=Yblxo|Ju DNxGGsFmbc<nf4Tg#4ƕWx[?4~R#c;0mCVw&fژ<BN:N^2*I_1bY"s(!4[Z{uB7Me~oPGjsg353dN^q9Mީ\AЩ6?o_Ǔt@Zeʳ@ ka%`hɨ8~ueaALJED2[;־dҶ[@?D@Q@QEG J:큒c%=I$+tA@37L*\k5]*1Ft{uڇUt̋ CjjMt;Jk,|G0^<ߌ|7f;D uKR5B{΄2ҋaƵ#NOpOoRI ,z^>-~COwm_s嚋|iO Aڻ`!?}G_EsfAˁO a}Ez℘2Qn- >Θ??MgGmK_g?ru.3 i&xΣ_c{Ѷ)'L~HmvrTu酼S+ߨ? [{iUGCO q  $ 1g^Ɠ[)tCoaWnCځOSmκ4-ԯӻ"4b+%ss>颽pLOاxe3R_+Lܜ$`qО?)pUQ_قDAb$Ըк¢}*]i}mf9yEvw[7oeMiIK, O(&Svql51/ƀ.JPg#UJ6giEQh];̍, A/gr)`t3oeBTɩԹm J yDl_,hƙ'RcB~F&#*K[/&/j\q.I7S8ff9OKCV'K{Mǧ>O'?b2YXO0>8dx M~E\OVn1/x&z'4sGc?昡ۥw 3nW~p;-w9x۬s!8Eq W<=a67c0F5}=:aڸ S+$/IMMxl55E]Ũ. :fO>q , @N(ѳ'T~ĝ1pRE+/;isj2[. +jE0UUja.;( yAk޸p(V\)d` |f/cd$ĭYhm6t&M鹸ɳX" IDAT_6Eh6i 'i#tVEM@ hy~!ry63) %w5 q,Yey<4ɠyF ?Sgf=*"2vE GrWd*8fCm9t  >J+ʟ˯=Uw;@ EoETQ5Z_jyǚ?s3>532sM~[S$O;e$h>{zGfH n'n~ Az8f٘bVHNj}̇8,"#b*  Hm5x$9+d (y4`g(a--#TWS_\vcko)lT֖#atXOZV+Yb3#I~~Y)ӎT )#IIM(5QxkS¨\LO@zujYBr 7 Hja'+Jٛ<<&Gy"};]^EI&=.ڵu*T$ '1Wev]"jP#u-p܇P(\0xe#Q .S.4q-|o.?eA~݁DYp,D66Wp5,=Lmyɷ|s?ʨ=.h[AzRuE00j8D, KDbOd_fɋmF^~aZScXb#x[ RP JBodQGL`W'$g*)=Y\%DuA15Z'l9&G7 .֔-sa :Oh&=KDY@sv诙>>,+I'^¶$(fq4^,WDܬpg 2Cwv#Vgw?ü)TiB0&f=Bl ^6ñ-x\60p͇xri9d;pvz<ʵK&W%wwI_=/}W8ɋ\8N2l9<ǩ"_4¦?Ŕ`׻D/HfPrg2THo,ɄFwz@֋zYpM~B3Fe8Nhmznh3G:e{ՌY 2dTKG-th N 2d, \2eKxdĪp7LgVQ;dlEJ$1 UGd9Imz&fhsBܷ%7+XGdmfq14>Jm̱g,#rc&?lps6Nlxf;w:gÛ tφ7ܟ o6ӹ?lps6Nlxf;w:gÛ tφ7ܟ o6ӹ3ĎJ@'\㓥}{\>0g ]HOlcr&+̆l 2 fD cD1H/JIGFE C:ݢA|lX1qH^\o^+Z(8)ٍ'Tx6ZK%Wv̯F/,C6I4\r}| K;? ׯԷ6 Zv٢MI>m){{C2$Muo|T #fd81{SwXIVd.XWqvnBQ1ŵbyD`U!G#BNrwS o:8ǸLK{i[< g|׏xD~#9G-NuEj;q= a99. ]'.I9vzqs\Oa$=} B&W!/`)^$Sy3-UYFd38SU7[1sUcQHh;4 ѩYb󖍜+'a5lbt# >.(CecmfA '7)3Fe@"HӊzUjaXFtD} SCX&T5@m hxfU(usX.b TCKm W3QcJ'sF #ǃe'T|3'i+ O,b[TXpJH|tϖp~Nsg~xXqޏXK_A=mۡ73Pֳ g Lߖ'dyz}*0FG')ƺuva׊1}PX~ 9&Q8Ja$*Ni o.:Ac獻jE"Qiqp $CM8t$qxҍ& .#~z[_Hh'lkHsx\a%aEa{r[y%s<1ru.˔A.'8`2M .&<1+Gi6C{\k.ABa ,^ۏ.M@ xA=\gtя㺟v%?3yT7PNKq*fLLu&)T1N]FúZ|'XA)3W $z5SS}~\Usk?<Jf]XK8@Ho ӡ%mFюN:axeEuԤ<^ԝMC tAǶݺ5['T? kHe CCca+-- C6AW޲vNq#5.Qo'7 XOEzI] 50 _aj;(؆G6`%k;=6.-/ګ޲?46Hg-/[6um)G?s}~bW 8fןxq* + ӪN+9arcn~ ӄ J@0h~U[NHJ`zoZ!tu 7p=xM ]j|n6<`$ȹ?>&G990~"q>x_Vn+9 p{vr`@YF9,5bwGkpfNڣCb٠KԘ'Gg[Tzr+[ѵI`FYd0V쭘FYmHc~*sHtk3z d")ƙi2'כ%$*6Nx)۴fya>NY3 s޾qg,cQjCwYFbo8y5fԨ|PFgexu*UвBje:ӼВ&&|A7CU}(T0f<`0m(g{^1vY:Eߜēhר!Y0O`WR:I,RE}'Q֞M VSf1pBGpԊ>L?9OȟWXR݅ 9,uz Kx6"kxyILg C%,`H6hhz,M]yU2SE>W!tJ;sE-h: klC.e8t#2&d(X' ;3r%+,j}be(erSDJnq(nJm' /#TVRߢ16!0M6r-f7mfY4 sE+?P\o8 GHGCtA2?[.V:N+ K j=YF;~TT K"Bٯm7a2Q.6q x "{9⭬A!A#Na4۳*>MeENħ00w~N}oC} pSFiu3P0k'l\LNav=F{y$[.0\q ㉏87nZyM{o2hnlt`dcUOYmd1E<},CqþJ aY!j2t%Q}W md ?/{onQ{g>!s! A" ɋ2L>2] 0  @$a!$;N|^k>Iw`s^UoSUkջߪUMdzE,q =霁SFO0ueajjQ WΘy18iZ*DtJi6_Ɖ0꫻,YNOHIݘӎœsˠ8aSlz8!A0 #Y7pmI(>\腕y3RK6ۏ^odQ2sY!<0zttRݬkԜ^BZacD>b8#$@ѓxt/y%q#İ.t,Uh06P`}<9O ۈ\D4JqH?Έ@۲p$AINQbP gevw$ T\7mCaUzAP=42t!ab#8}CXrP9ӫ]pffŒZ_sLVla^ntT]|3SW-Lk}O5"ds#9mm3~"ҔJ7ejp-ؕBqt` jJu= ILO u`-.?trՙ4 }G>#G*>}~]1m,OKc9tE/Cq|^* ,X΅,0) ow%}nxnngc# [p}b/n=ZwdR3{#TE2Rq\Uz6og*y^늤Jn&g?Yl7}l\A%bNc#ip}P}I(O>tx~R z]̌  W۶ W\~EuQG\b}Ԧ{TEaeib9YYRmb O8K(!XdQE V/:> JE/:kUV(D ),>B{yo$W!%.G/rǵ <]CFUL鑧]aj@tP~ +Ӡ1BF}\wl:9Pd4ݼoL - x %3*!eg 8Xp̢fRc FdG*b=G'pl)*"kX֬ZWSLף㫳|s8r_d-#Α<5&M7\@5RGxWPu"2ytPw)A%XKCvK[4ǎ*7\U=HӚy k7lGF4'J^s3j~+qƶ>xJ'p.2gzCo) >mԟZTdR9:1E D(ޙس~Hc -N4fdt~J P(%0IGau(pKNo~W5m#_tlP'H3`9*# 晖3|R< IY8SZ"3$}z}!ՕagI7l<0H__֮6^rtfT+a5Ly,(iYG 0 EZ PHS P7 jP(6 rMsVC׃cW{ +U a8xhr5f~ϝZ 嚈zǝvM$J6j(lT#d2 ߺ7v*ir:k`}>޼9o#+)߅LiOAL\LW~B99^x8 D| #WɜrnDocηMr)!96YG9}{#ON0۠K[W%r<?&[RO0rP/y e_#kO RC|~6.f?tAI:r'EK A}QKqΖacM#Y͛7nڴi`u՜fݫ5:&.F*كHz0.4zZEZP=gGDIC܊b=q%p4XL)z:.6:+IDcl dQtGL^2{HYwV"ښ8Wyv׮_֬[Si[ib=5JZ'mғr^>1IOL1x{9:yCyG81u7/ٚR.*(pOo!|_"g8Xց}/~oϵ)K=uP4Y䓰mhfp3~5׉:^oP 2b9! O@~=pGӌw'=A~%Qn ׹ )*#dC€)Mp M^fCxF9O?ap ާ_\=?iu=#)z(웾}>'izO7|=6;-|9V7>;|~SƇdߊ<1JGd%&LWg=}dQKgqN!G+.CczU/hﶛn;v Q+WyZ?F]*U ؖ@jZS~Z""48N1vp˃ (ū[Z~Q{=븷ܑ(p_YKYb"ch И&a?l?pMٸøF$z99D5AlaC5gڦg%9ѷ_+Oqw]_wտL21/!6c4 ʔFnAAOm>8bEл<;*~Jq ߐj39YM +0=u[F!%q䁎fsBG0"V2>jŃdE-&s"3£P Uge mS(_9Ҭɡ0m#vs׮zb(4߰NEEӤeڻw2I^HN'켐X0~$߃zk9oIZǔ Yt0-焗v,t#/k/ =UdX66mX@ò#hmUTiv.tϬcY\0KQ_RXRPGTdV}a'c맹wun$]9yT),tVœ.zݔ ;=׭[[MMMƒrvTu _+bWJ(bE] RRi oShZNH&ñ&1p*c<S;=@h$V?'G ڼ61> yq?0.0HԝPv[&;B s0߮ǁʌ\2C7FF/I:r5wV}yCX oApHu?"z82HN+MZ8-`)qxOkXx8},.^ U:RlJh#T,Ga$l/C(B/-VGWgmޫE aǎ7.vŢpjHHqqj`/FAz&Gf srj.'E&Tz'l B KKpˊYtzP*bJZo=8d'7MtfmДzOODO]#:$牏+& #cי6h'&˝'P8Ӕ޳GI,QƱ};$>8PCyWZ7od. !򻖞-KIG5R+G41q50X8@psOrx ;j4Q mE=NoY*Dq,Ep~ǿ#yH2GA %3Ie0 D !imĚpfܙ;]O\v޲KӤ[j D8Ddm~w]= 2(% Tv[kb|x\0 2hQ|`ZәS]m"/ޥcoBE[Jttv[F[Ă}ӛ ;~oI}KQld%ΫЩH5upQ1y*q[ZiRρl(b88u3 }?I|v0P~.\tHY4=O?5|;W ,j^F7jK|y}vN W6.F/l#G\Npt3ڹ_1קҬCűtdMN8%P>5mQfXOO߷_\?= ]?H[>78z%|r+P+..~_۷m<5h_ּjePi ]BuHT=4 *Qד~녯Szk}B=77UkIqf@gY D *DzQr?"f+:H\bV.\&lKOޭ?2]]gxv4iF$ P!i î15sqR$BQ'PAwI9Gkj3ZΕS}8ULc=}T8+©R.˷7^\X\ܫ>^u^}đG%H̓WdlAa%n,7u]T"1E>N4ĶjU.mWKH5hծj\s`qR>0FI4@Y}|OvjY܍9ԩ=G .6YXʁY/>*K2.'ڤGܸ(uđGjhmL!qSgK#1YA&@ѩbw)ڥ OjNJ 8vWS"SDvicTcŒ&6D^C29GqAeƳ*ҫӿD-|=&ÆrͺjazvK 2e&S6ѩ da^B'('TEg)<K\Q'@FpԄuf"z}3 D6Ki:8~[sO߼emhV_d2Ti-YӐNrq=ۙƐZ[BRDf/ 5}{q ulr8)N(pݻMjP™԰v 3Ŭl|7+?t1O&C-sz<OO2|{5$m u2)SiOYFK/ Wǎk]q(Q|4t%mEOBƶMƍQ>#P^xaoTz+i"L:2ehG'?ɲG?|#?RɇѿO߷_ܾ?-.}4_e39P.LKKʺ8+s Ӥs`Y,xW/|o۶m:fggBf<)) (٬ѸB6vK @UE[u &_ ~i gJ /솽#%Gr%ӢstRDp .Ɣw/;85ԇ-sN؝s>F@\ʵa ۷Ц%Bq -6f_ς" !JX !ĢC<}lL6*)LVFrښCfShx =8=_)ELʩLυ9aO GF| oy/^|k |?M_A)>Kz`G/+^K腭%r[n~ڇ4N"=.o.)x N?oޒԪG>_rr4}c$(WY:o}[L[^0{qrw=&ݝ2^毥sY>/@B8!I6.CQ'ɮ"]L٢yA+ψW_JE8IbLTWoԫm׬]״U;oSٻ(hqF+I&O92%~1#Ӹꫮ7MAb[7⺛!mY˧NZs䬓w71tX?Y+wZaX/~+^z߭bsrr9q-8:zq'sp( gu_3SwO8^-O-з_k'~i9Oe/_%,@e!fЂyɣ!*;ܴ@)UyO^֣*@WiZ/޼c^<'(ȡ଩#mA bEW0W1;G$rd 9,s| P ځ)4F}vp'Y`}.%wiՙg_=T7߼z;xgR-oH} Lkn>TO|Sï??~c~y3w͵ׄ_}[ni'Uy{W3\G>EYe׮s^XӪ>ھB? - ~#<_us(_{/w7MSO~Z}뗺O򕯄?};~ ^':qK/~7pQG ?sKpZ;p0Fu'=ɝ~}s~Ӟ|w\GHG-=Zҽ7:GQn{'rr|Jg8N|Jdx^ۯ"):ɠK#K+ |#!F{Afw30N/ pH٦TV Vn_k&j"8"9G'&RR+oLUBr=?AkJE|d6y$(wEv⑅0vnssn2}ëψX?ѫ$8Y{veh MW+Wi[~4mNGYmyk`Ĺ%QDPI 0yঊf..TLO1Lf*T09wBQg:nP`l8 a|CU=yf6q5 O!oxkG>1e߹^rC?TOUW^>8F~o|]n 32LSQP >C^?χvܸ%}՟Ԛ2cK޿{mnַھ}{O|>C&/| ԧ>OGh޹ ZwXir7lP_|ŋZ(ȋ_ro~ ~{n;Kۿ-[õ^ _^8՛_wŇ>-[P ҽ% {fn:8r>Y:Tnci>-ml\?=8cN}g_Ջ9²\LQ$4T~ȑ(nrr#g:[o }]S8*8 QhΥZ10 0(5|O%EqHϹ_RI4BജQ BΆE}DI>HIqiva8Q84HuvS4VD(K}&:cAM 1 .K Z4"`ZSrl(Y:5XP ^ Tox'pBqشiQ 8a>>!򖷴!KZS+9)v:/M.K>=FWڥo~Mu4|[g1 5}I1߀eF2 EC!_IrTrzD0_bݭhF4qWí #^ u56:\+ Um߹"'NJ ӂ^rfG {߼HqPX'8_T4|MO=JjMQPT7];o֫l谣ߙZ#!vv5#sEߘDO4\YoBizL(V 6D-(l͹ Ӆa=veAJǪ)\8PaXӌ+@qͿ ÆCu|i z_t&GuVD[կ|Iȇݯz?^UɽG?P(J>2,?t+׽F־\z"uC9d>vHҿwF~pІ,F?8N:S$ې'Jr:US"JiP嵢@c=tA/Igb*?.J].3L}OoTO7Lt/ڿoG.{En< j6M]]Ӕd>E90psd:gr2B&0bɰz%}Ngd}3+i~RK-p]Wh~4`B %@RHī֬Z{vbRDS°J((-L$fGg GNMpN_I:J>Lzp;rċBz2 QzbjhpT/*1kâE Lѱ0Q8%w`ݒ|OLo|l lMɁc`W>#·u55߹氱qpQG8}%Z~A`cϸWx_Ub6QvCg{WkSg '>ꨬy=[w)]Oy<9hK~GTgE*O l b#6#1dRQTp%88J۶m r ;3@ƢpᇧNӰ7?d]E\~T? d"rCiUJ}×tߛ xo~Ieq]p +.}'.zВStSF|;7;`PưoQJp7{) 0 X^mТdbdfM.A8Lh!y]-2pL'D*53&-AG!'q6v-֓|N 2 TgV7f]XP䑄9CkUkָ$m rqV˔]RZhЇ,|ˀ۷O^~J#%_Op1TgmezV>R8V•-0)LO}?WOxS<ᙿ_q- #8Bc7/WU7(eÊǦM?>VE _U)U# Sځ2bJ+SL} w|Ya7>ro>OwZGUW]!٦)\wڵkT>~oDǶ}ǖ؅&-)Ȱ^\za7qΰ^܌K\V–u$-7)_R&M@q˂̰ )/ 7bjź-Vmvg$5߲kq[}48{~g3H#9djEHӓcr9ʣ$x[1i)"n?Ր~[ʪh8('DמȪc1&PDZDqPt#\ұna-!ėjLxR4|,E7v 0#C}ڦI'ϘϿ?𐓻`n6?sO~to/ǟhz_vg>; _T?YY=AxӪwHԚ۳;mxƺzvڋa||"Ϋ UzxB&EpY kUTtŗ3aĻ}=s^W\KrYmmк^җza&ڞCk(?^״.z.JG.s.XXg3o~/Du:on<;Ϩ>+Y[n:s Tw)؋WҔit֠@Uz*ڹs' (C#r(.o|q]Iin0>΍Ws(OTc' Hޖ{efHб_z!JbGGjHSO~g;mMtrtvf(TxZ޴/آDOS©rєa(=iG*,/Ӡs,/ӑO[6)t~eLڏTqY2~{E6F:xMZ?~OwWuU Gyȍ݊fAEY6ΓV pqZ:BgD=[`hofa4m8g&jn\vM(r޼Z:Db8:r`-ܸK`U [1%V1ѻdCRmBKMѲCGٚ+]ƒ(l&2"NODLH SI&J2£Aa2x%HYc541.@pڧJ~mȢ$?~|Ov74%p{e?Sg2͚u>BDkZ;2s1qGFHSDoDߕ&&+mE>j wHJFOy9 c!J-]џm7 \{Ѐr$L(NǬ^#R9OfppSS$k٧/߷j,q}B)풯ɟ:6(?nK~Ox)9:Pj*+Pt|*z\S]aN8^?=Hk<( xJ]3;;Mj|9.Z|aFbZ e2S +`(7z*Gt0h *LK$臮Unz\Eʔu`ئz÷pp z8j[5-8~Ǡ #`!y>Q_m¶C3v,j 0SC+j2DZ?3+YT!VriE+`]N:~S8;)n EM#T&)q=2ғi~.ͬImΧ d_Tu) "FTSr|W DM2SH.~)n%b `#3]>ާۯ$|U+nv$uN6_2ܰt|i%}g#)YB!YV(%黄w%tό;O=T;O zlp`PN S?:otZQO9; hqbexx$I[A!\uMz5{:P,؀L$#>bdhup(oD8:Xf/}x:~֑jjhbҔ;FL3Q8BuTW`h}6\:ܱgOc.z@OO[Ys[V sE\)(#fK44z .ږvὑ 웮T+_Nem7eu&Ho-mTalVS3+Iv[8<3>,{aeO߷_'st>v}EɘVOh( KM>Qә ࣗi"cSwC`c?p41OJ0 WB {) PV( ܘƨU5&G=:$ʃ0+aZm3 hfP`"5)Hcg҆ha~X#Ll?*jGJխEv;r}kPGhdC N rʤTW=oh:ADQJӝxe"b"RXP\8?W↙L}3̀d{jA8NQhn!~bfv:%h 9'2a ߨe`X*R I,ځ)Ui>ʬy‰6@$2Q#NYƱlCdHKJITHvtGڈv-4;Γ}H*kȒsYːfe9>}~{=]v=iߝR_/y9ʈK0&NsRʘ0}x|kk.D ^1-(3_S"Fhc} 8GrL-ġA6I2a^vU]ZY s6O#,h*μ% )« q $gFJY'n8 z Txh.OIs&AfQ9 5;E^}(kT#*ggcQboq^@ 23ATGꗝH9x "BU'^ǔ_ɋ4pxsK9Oq~p‭29X }8 8dLɹv<(B537bWYs{4f\ܘ]烕T>s96BZD=uxv\;1HvOV'jgXí4Eʎ%LߧO ~wSIq^Ruh`p^΁BK|c"Qҗ 1g.e ]J/46ZnZ摒=05=t:Z DhƑ%08"i$)(PZ|Zո5ά|]5?7"(#RA\.N#yQr4FpK)Ax+_W@5Gqi/blL\KТѡסH]E^wi>l^AU(DShFΔMDw&*9yLiSjIHbXs T IWMɁ^D|`=AA)K*[,>\e(5, lpS?~Rg\;8ts af^Β8l ; 5N^a^זxN  O;$u'l@z8\n2=e֤CPD|s>>4Gxro6WnfzP9NP*Kx{Yp WQ^>6\inwZKGυ'}@u s2q)gZ]QIzG[i[+9VV{U[UzQ9Q8,0ʙH[D`FDŽA/N࣍9;]_OԚU=Ffn/9DhCk Ds \{=W:/ AɈ*̤NLL>RG %{Mat'V LA4M1jt[k|ZNJ:p*Eun2Z58\hAfP8>g!J:LlD423k/BtÅ!FSmq?"#7_rT %l=uӒyM1MgSg_I_qaݏOr`& 't)ĻIУ>㡶AdSEg(i`YOxіDqD6hQ|bFi](e}dǾܯ'^Kw']M͹tc7nXM:XEM/=7|9Raڵ ϞֱTsQ #To}fpҿG"9ff뛶TpԔ&(2HS=E8G^z/,>8ͬ_RISqDb iː IDAT{rp@0JD@H!/ECS\<9^F fԂF9@\97ux-nDk4?=iTXB.Cs6d5&TgxdB\v7/:6OƢS 6t i+82K˜_t`¼`'j8mD."s8gLPAv2g]ɾ)gwEg:Rk,+<%2D?h!ԏECT*|>_ \&R)`D/^2d /A\&ы Y|nI|>/Cր{r>ex9ː5^qD/^sIxy^Ut;Dv:]tq@p:oNee=91/E5׋xT ˂|Ui.3}VGQuP[Q"ݣ[A7u]|5[GuDذ~Hc47' D2z뮻nu_J4 :z AR{`]1X +:ºcxKcOiЕswz^?E$yI 9Xda% gJpXOyi5yd |qd`.4qTg938h/dNS_Z5?'eHw[SaY"kCXM>NԋSHT@>: Dpe6k<Ƽ tiʉ- ű9Nb2m˵ehHSw b^(MMNpd"\:eK(grbSdI{|)%!\ 1)|4v6z7]Jg>Zo -zQK:X}ױO]z$]*j+1-~Be4K'̋T/B`%(3*Kcgț ei#a~ A{BzkBa^mtL槪QE5nGר^,xB{T[njϮ[ +W[OMN[O:1L wjt堈/j"?vIүJ͙:Ӡº$M=%AZ$%D,omRk R؅H'YyJQ, Q>]:H_rG T#*ijg~O\9QE,f[9><0℀H ]T9],y֎aXbuҠe'WSlj??-ݩ{K]539֜I?XDS쀊'z/'ni)_ Y&t8e݃^M ^Lkr]ӫr-5imnEB\r3  B 4:O2E/Wd-^ B4J2=|>/K zr>@r>OL)X&ы Y|nSHju&ja#$4ST'G4Q^_sRTFkͭsrYQIع9[*ԃ_6ޝB/y htQp͊kzfp7o^wP0;=Sq9,qX`skNNI0b>az=~ݺ5PsڼmwmVճ+Gc'~MQu$-X'[jE; >l<jTrT((,j_)ٿI-N@)zznHOyVFR]^d*@Z'VtODcPD^kVrd8PϴbBH2>H.E:1s0N *A+ X˪4X1- (] V\P'MryCr+~.w%YG/4j?% NBijYd; J\ ol8˗OJ=&ڱd_;le%Ʀ8PoyLM>'맒_\]x羬ls_] ͞t3%Q^V)Ol:z"PD=Di"R˛ؕKaojꁵrxBmhT U零n*挡ccڔsZ֬^SwՆ p \U+&tt$kkOM-gi>,h<[9"jFQ,YK L@O-#"oEʩK\}xid#;=,'Z$DS/bL3rsUhS4AdJk&;S?4WJҸju,{hFH)hBN6PLhѭEhtd*Z} WfZ<(1Q4A;?٧ E]Y79̵>q'zF SAq,P%} Ib$+$|Xk}OUXa6ֽufA8λ TOt<=p>>Sa٨NztN+JXSO#f 0(\#%LߩuauhF^X7Q<>sڟM7 20K=֠DtX@|Б4Wٞ}pݵUoVS{UG}"O+-@Er4T֬VtҔߤ zn~VI!^rяB%"_F4*#kBTE/I,&G&3GNL"g0E^P^H0(nb1;-kmض@*@qUx8Xe1)%=+'XMk(`5|[@!bE=F# G2R; fC]޵\}OA[! bTZ:Sp^X z6G;:)S`{FmC'jPwWǙ(9Bd=c?yv0U(DɬdYh_xC3Dx_%kN,)|URCa(3]>f]gLQ3<3~yRCʸPOy^7]@5"M wq#+a)aYIUedOg3MӞ޽{ܡpWӓޅ9(EŠNM5!հ_ 1MGic6VxNQR41%Cky캥! iSyԳ3(ij4n8RJ5Sqz*pLU,w`.FHS̓' x\ 9SqBg4*m#%yNOԠ8"UE7`F"O ,P#LIWrQȦ2˥).u,G֐HEKVT +30!'"셣aSڀeF8:Ó5gȼUh}J;|#o9czcmA\Ȕ#HEO\KMC KyNDy `O-pϬ5SoSҔ;J/^K^SbT`GyA'UAێg`8.#O{9y19ǟz\8#( {qn'i޽;]n 7xS0}޻7P;|-ZV.񮵆HpT# &ST4N6UE;cqr4Ut6j 'ekddEmQ4B9RrA97r´>+кrvCfF[:hͺR]m#u4uM_SK љ:B?*gO8sw 'S /C; [l y}(<4Um`uSq@|ԀQ+4',߽.0&ثG/ᑏ|[yj6_Їg>5&]u/ό>Ao:XׁT5 J}ag~ ,j,Q@K!ȀgppR Dڊ<4eWmٲnZQ'oq:æcW\vWHݺ{Wrj-aJ yOpEF✦ctTQ& >90z7E'1Y2 S۷|fGQo㰨`}Z)=5;䱖*ASTo=imvZ^|,K4ŦmF:)Ƌ+q4pG%*BM1-O3-q[Xܨj' /OI+d#вrp$ T__tXFkQ Ozh<RszQടC^k2 |gbQI/؉'JX,!TA$ol0l  ?/՗T_WU'~z݆Cv`MSPґ`MzXLhNv??luY>wv6Qg=5 Q!*J qMgn*$zt} ḓ]z%#w]T xqKY_ XsܖLP (̂JX, :|O7ܺꪫZzK` -߳gwppI'7sڼ>Ch rj9MknVkB4i`~ݚpGŭalH=02,d0VHȡc~r;Ӊx?jd制MT}dըd7㗶H{d57ESX8eCi;Tt EџG8AGyn4 i*Q[)6MլxRMi쯤65K?mqe/J6.hKV`^_ [N^C7㨮T D.iI""b\H&'/2&G0(M; ٽaPAVzИBLD3Dh"lUt&ey s( FNdz Y24ŝ!'tx3ԕ}3C۝ʺԲ\9&x}C6yJ;GVhcت0=@\UFoC@d X!E5h!ZmJNéLhq +  =͈N b]Naռ^Ճɋ )F2pnb?}|5au,׻ϩa>b:``)~QnJ 9 | o ,K]2g4Z%ұ ~8=SO;T߮:>O/~Q*G{w/~˙G/*}7HQ⌊~w>vcxғԺKcя~zӞ>W=8餓;J?h;׼5- ۿoe)0G=Qgb\}`-$;g<+_ ycxCBشiɅ_җl֬Y'ʴ |ᢋ. {D~=VZNcR2WCi9:`ZϵeW5)kvZOhqZߥM-׎q|G;RJȎS-ehhQqtsH6"uuFuZe? yV+ruRV34> qLn~Jjsɔ<407[dSh3D$_#y%3@A3ٰN|y! p`)o7ex.r z@9>/~jc?S |߫9ꗿ&դ^w/t/'&\8ĪfpB\t[օ<77ԠGW,>m/ms9ۿ۶^a,NB~|fAEW?я`eݟ$p5,H&\s%wl[µ^_q)M,Qwv?s h:^W25| ox0#`7.㋍>qW;mokʰٗw3L/ Wx^ׅ|MozuH63/|z-~oJ_/3pO5)2VZzU{[Of'ݙw&jfQp਱48C1+GF+\zCVX"  'vTċU5w&і]-jtx׃O|rO")-gwFU\yil_`@ypGgbB:q T#YjHO\Q g58Ɋ@<9N1Ն/?AlLd d ݴ>Dd)17W[?/7b&IΑ#ŶHmJEN4_L$ ~>DV2)k=ޯ E0Ua5?zWoqK.wEF{N8AQ7;ЮVEzwbد8__8 z)E`.Ж]eZ{9LT%*P!O@H@"AZ4Ջ1Vu{- mDE:%L I*IN:W?\g]眼*$3{5ks6d]zWϕ_1vZS%/ARx}C Wywbe|Z"֭cG F&2> 1 :sf/zы#;; Ҕ}~oqWb]w]J ~x.ժKfL7_،݌e_O kݶsovEٸhC, IDAT(9j[$o3V/߾kʟ4,W/,~Y"5{.+407ץ3Fw+( n1)tsa}1"c`!Z MLaxy{$' 5сTm a;uvN_-6%ƉLdb>\kJ 2dΙ]˞Ccjk Itj>u(ϥb~d9cYwaE=`1oBX V=KQ>R5%qQhѧnt qOPJ:W;͸@ ^-^5F4\@zUF,Du>P_f"".ndt!LPaaq8=iGuU;bqe+/uoi|=? cHë_[pcoYCu3`[~-і<s[vma xmgoSJM*]VZφOO?s?WA7(tV}+tKXk'Ȣ]G!{fJ>-؅.KdсM0ᑑQg~ek/0(񒅷GCEJD X{e={4< Õ4q|{n#e^̬2_|k)`[~ ŧ]߶oGwzT L$*AX'L+I?M-g!6ܽo,᫐m?9s"><|00DXs8󪋟~quj}!ݸGxCk7}ȳSrQ;ƒwertQj ^!'eDO։bnz7+/324XZC>_5 ]=gxI4:>ZM"1T 鮵0t%V̱SŶa1e>Gdsb(2h>B>01N q`ČDcǛ (՛H䑆$-R5,QRFޯ:M?U(B *c4 'mgru/Df6!%A'~YV˘dC9U7 =瞷/'Mmbcaa΋p~k?~?(L?柯^PU^DCg  Pi,OThT}#>2hh|%!]|%ҵXTxb? ; _>5eqN9'&D}sc+_ʈ)rK=txTYO._{,;;0ڰZ~c(Mcֽn/uIR?P6ܓ 9'R[V}-듿qnhԳc7ʓjqsf3l~Xt:馛-t 븮{ovȯ;Z|/_~z%J>W<Rk.v'#('%,3g~U1X gAYtRN!|bFebXu"H޵%HkD?=3ÑYdFJqFFzԣCqڙF5ʌ4h{$Sb#l4w/Wҧlؔ,eMQ}nq Ǟ.2ʻ3`qi{R{ܻ#U Q$ *W7!T1:l#^ZCt_GԟGK;pq|*X7> 9B׳2#6(k^Bո#&Lk 3 pQ֢W.W쨳]35pI_ O=|x<ף>gYMkdB% }z>:Pl .w9ɩ ٠h7#җ;?+% :JC uUxBBvlKc( CrqF%:j*ѢqQ0[+d#I6́OhM9<_Z`p%KLk#]^\3MYa,0ե#Si do:Nbtk hLIW=1aU1<1JZ"'x7/eYT̜6}$R'_ ^ X_?Wuϻ|Wʿڊ7=[{n?cBAnT\qŕ糟\eS^4i$m[u8 <_{W^{m5]s5] <׹Zq+;C}/Ѡ"X츮30d̴JFZs:%֮*ng~gjtwaƓ 6r͙pB!v+!=ogfL7|7:uWjCjmij@Ycաٷ-,|Rj |TVO(.54+^5s&Jn|8$a\FPUe x8l,δs&]J0kY;v,&00nruCvz[,/swSm)HdD'1Rx|O`;}8ک/]L8?G`wxSh=6O[woax,fA|SE ,X:txZM1Py]bF#C,U}$ږSuYYaGF TÂ:,DP4E4av6HĬĺmh5;Cs.$bOF2TiU҈SQֈ5% prBŬ7+h"ל!)J(OLޜ'C|ZIfʟÎ֗qaV25XL)f<»U rzVoô^sf+:q4\zo\@S1TqO0[?tI}4hs)_kÀr1MX@*L(w NqlMl!+v󜗏?T^ O2Ym|>xl1^)Ct9;qdH\k%=Fye&c@gu{ o|^Q2 cܾ\G<\Y+J z@!TK,d Z?.dB]ҫKVRf cǎr[ &IOC}۶\z +Kn«W!^YiCE* {j˧b+nrԱrh|; 0F XQ"ư[̺4)8>ћV;1>%Hq_cPJaI kta</ w-e⸌EF#ಖ0\!B_!.)@%0 4kOaI#.Hx@,TV:\֞f ١ G]X,mi~ 0h2ED+r/+!" - G'0 ִ[)>x(gO`*yU\gF{I2售Uܜ~$LzT^HuN=נMU5n^7O9iXg< r4r#9Z7eImH1~͌sy>^~x(1\{ U[!E/9W_ˀ3BiT B_O|g\,&^q-j;z<^L;EDlrK.jv0|b;naۖ={clԹNUuݻω8c' :uX1D }`{óV'O/@P*4qяh +ID xqa@hB^wb DH$X zlLH\JO1mgvЫj}1wcXH]FWjW\IQ|c01knè Q Kfafn$* 4pF('eBp.zc昩7ъ;I ~%Y3%NSH f 'ꙑiL-mлDh;sӔe0ÞQL^([)J~\3#>ŰpO ^BT+$r":jp :mM <4`[=z?u~O#OﻥkPTl1o+) <uycÜ,k9y%\/IWtr )$슑1-ZY*X ;RtYy3' ζ+Sb2D%S(fP>xmv -D'٭FYZHӟЉ+-3K XnOxXڻ˷ݩG\afPpNCo΢;0Xb8ob1: sm igNiQsX{F0:"ЊYV-gp farϮƐaYNP;B&Ѝa%rwE& 00*ɷ{ak%~5O⽑o6[ Y_Zr58$> FҐc]D0cI"{ N7J!J#7/NCRͯS4䴌dVqw:xhűQų& |6WLMEM?Z&D-bNpbI}]#?]uu3 i,Zyib-]iV^}ZymZkqkio߾&oSj>:Sy;5Ϡs) (2Li}1pbS`=N}W)XHFRQ<9sDš8wk]g>ۻ7Snѿjغ}ǎҵTNN\董-_%Hh*ʽ{/osv . 11+/vDpi)Nitjزkk9-C ;K.6EٖSOѫOtc\(dN:{+[/틄^*x(V!njαT;:;F-F;'#ǖG^qԂ^rۤ^x1Й"id " F6#V&v2h-&|RŦ~/OGADM2H9yQ+"x$Æzt'\ 5.6*g*KM-ɔϛZ@ǸS&S&#+}j\* Rnx,cm0R!C>zRz )+(<^ nȰ*K2nA:j(Or*t?n*KcI2 8R>I2H#2Rkk8p ]At A8cES.16<&4 ZDjA#+xPzf'61@)]ar@L?)W]jj}DS]Sy)'E\xjT_U201xc uFlgˬdhCȶ˿Mi'K(L>zzRY&H3>M|ދ5z|S'?7||Y^h0$ɡEY IDATK}9;1ÕciUDv&PS: zc[)%'ւ]+oCS~L<3MeA5RW UqIt4}ш ~Gg\';҄'Muk'c1ugwd,iDd[ eUԒ0Ƨ^0Ԁ% e3oTwx@zI[9έwDY }LᾸ_a$Sj.)&Vk gNYƸwrD96^׆oDJٮ\]pr~-p3QgYvqؔl@`~ ^mQ loLQ՛`Ϳme94o6_ )"}i:ڮ`nZmue0j1A~z_{"^ɸʅ3 wZ1y@rHP+8Օ&VbAG4wb&֋͟vWs9w/;tiXg>i^c+QW:svy6GX^lNSjeaZ&h}i P&_</tD={045j7 & )o.q6W43ﰠrĔbސԅ@^IgS(K@}hy/F,₢ ئ!Fh:%fC+&&Kr c֞5H OƘ*PkTNV Yd^3:%OpIl٩(*y>¹0&Z >\qm!) )==3,9!Ai֕uа +`э콨{P* W_dʝ49K[[iĦ{򙟐_lq97tˑmYC:<Ͼ_l&,i^5{O,/N m))&~ܱM6l>8cr:gPq޶؊G,?4S3[kS* ֲ~թ됿hô3i \pd!Q̆ߵ}"UG-*USy;5ﮣ|=Mz<&|bJ:`W^[]w]ul32V/})LC LML2dx741p'3Wq16^%mE]b E]\V8'XpnNUCiru0 w[q0pƊŕ;CE%7T>S*NBёDPǃ57V5 NWw"7wbNGx_6>IS5@1-Jxu ÇHLiJ5o:$ǎ>Go]GYaE4βN@jp $Ġ @XJ!WJy!M R$-UNؗdX2aka-[ :jC/bFNu+HI NV5P-g${ R!bR1y\RӼ}8'z˅n3JZ4O`O_&Vs#o?K3.:\q0u}ݞW~7__s~S_m><{"ц|locsbgk9{ Eߺ9p@,iSψY~: sL%Ljgzv缽z: G1X˯px#q/8qbd~ vtxXX[OA ?zir^"HA&ئGzT.J2df~/m|<Dv&+ձn`4? u4dXˊ [@abNcvkE1 E pX=5:qOǕV}]3KIr@#<t@!Ãȃw5[/boW6rVqg(ĚZcOF Tߖtvz\82<4FPjv )T~ـ]zб5uEFH6 |\s嶣Ϙ3`z_?65S<5֗Zl}.Nm@ d8`/͚eQVc7% xqlS\Ԋ":t落G,O@Py4 86>_vۗxW QW S3fc3LqהY{W^5'Hǒ͋ h9 )>XrALF3S.0r$ ^c"R]b&(_+?5W^≚&h_-k_!aND̮1`o @CnV8QdY45ƌ$`*O;ew2h3_X@QGejxo< W9ba,߉|CSzf&2[+WQ<|*{pڼNKx3Y5|ۀȲ6 !P.;.1:.?0[х_P: !(A<`uwaU#+{OM]V9IA7OΊðq5\nE,S с&t&6OHBWQwm8jBykhg+<~XbŞxAaϾrb${ k蟜ԑDXZDo ga8q/Mʦ-@k!8Mγ=-C&Co)(̗!Cg }A[u5lg/@T=_#`q R9lnM< l ΝJ}R;,4Ɠ imC0-g(;m$D46>#J=Mɲ$~. R\`X"'Kq/ g\I`#S]wȣD.<ܣ 5&,jOm0_nAWLuM <)53sԤx7ՆiC^Z^y|^F~6\ *|ef䴖2B *em|WKNz'c8PL.p^:tG:.笝 $`Re^xU L݃{N5-]m|E$W?GUT<1]ڽ|Un$|Au_ʝh8+ܱ8pHyϑ%:bzY\( !!6& =?uQt&L훰BV-d!$XK'`'ޏ5J~fct+.mVf>YC/Sc zK/<5>[rP<Ѳ,! /}<1xbٌ> K S05[鷰,4V'Ri!b\@](Kz,cT əu c!Ɣ6:& 0Z;D.e9tt ~JsY{.gh {1laA32H&Ummjɪ4L.e7k`^es lm\[g0 Z/RVʫ F/Hyf΋63رO`0:{Ww*66ϸ}/!{]{+ZRkww>\\v\VزKTrkG,\T\Bq^q| c}/`s UwuWỉu:\4hì%U2+nZ&p<ϰ$2~TR40[Njs'Oޱ{: q pib`idP5]0^]d9aEM4_S 4̼eb\00zkȐ&+4 ]CD#ѰLղXX'R^i> Yɲ*yީ0|v9Dh+q\o <)`+O S!dsK1v2h+dHC!zormT0Cx{"2xfR}.8/*3.qL-hfF*k7g93& /X%LV. IDATp:V'OTO'(.=xil"LWP\~ z%O//e7)Uﯾ#X{lt Kl"< 7S~}t.t$ѭkp0aѳ*FgR`T儽.T g q X\Nα^ޙs@^,G9 N{ւA\ {Y:d>%/CE.>􏟨&F;=&2ɠN>Gȷ ~l' ,KO!3d9"kAM9udsujp'r٦k7?I_^ }^QSS@v u^D}8-ҧ H mc }^ $޽; 1$tʍ}`cF]'~t*HS[wk˷UǏ//l<ˡ^Z=r|r"eB-HTc+_+ sYjK:^Q$2ߡK(cƝP{_9dD j@Up,β>[ZwU/vR)˳v.&Yݡ,/_tp᭡tXg3yc0 6]at 7MdږzVR5f!^ZjI>L0eJ /+,G$-R +>)hN١[PzWgyȎ: ]3* -ge\kt1f9I7MB net Yu>fAʙǝP%a#jt©Uue Vمf $rF ?vd1tG KOFoj`I#}R+rc*r!x*86v+bPTr&>eRd3k)иmr}i0lLF|7+FO}1ѽyȭl-}Q04\/|=faw/ b%osEtqi}fjU%:NXU|$d1ѡ)x;P}o+Xny\2D^߿ox1!:G?V߽! geG_kܻgoC?Cqw{bL0oo x|faoo~ :0λꫯz׻-*+ ^aLR::uaNjclojɮ-Y$g(/Z unky-"S?q8y͏NiF̚AkYma3v^}17z_e/{Yu]wVW["L_СCկʯC{gbJ+geY}#={ |7}SWKJ7>Vp ;Ε9 U[o]X8V׿=~eR^;g@sy-xPީgZL E%/ym>\ne ֧m<)¯~_9!Xu/|䖊#5Uha/~w}w4 0(_^^L(kož}-?ea<#R'HCĠw_җV߉E?+ۿ=?]qF, FMozS;0XF4y_5ʉEMV\i@os Boy[L=xf_Bzz#>b@ԗK};OFy_G|umYC΁<`XvJF;' FHAZ$m_[PaF %ֲ ߗn|c_Xư/e׍r/e  5_(Cnsжs'ԧ?]Ne 7W_Uh< R}__ldxT\ʯϱ1l߾.ԉ eE? \߆_" »o_0 loLwˎbqjiblro\p2a6/zH` r`^Z r̶5}=(MGX+ oD,ʲ -Bg ahX@SMQձOX;$ ( c#zn8=XmyZ=8#K:I;p뗆~6 Z"{Jm*qE^2C&'>0ekMU /(.C # H|eF_drAG}B/Kd>蚓40iHP2g訴;BOt;tP(^*UCf.g^o~`c`o I)t|6{C^qU1G ~m {}qCCp7{oGG;(Ƿ U??^?ĬUEW?XF4*uQc#%o*8 5b5μb9ymb505x Mjs3_׆Ku@_|{kp>k?2t(\ꋮ;(|}2*^ziמ(bWϠ_|ׅ?9͞f/;bn5y wC;>1ʚ}8P 2" ..F 'dXⰞZPW3cЗ\®r=Fn'N{ȁKIX c4ƈR^:<Ѓ2 5]V@I^/aw̻I( oLEyOSGadnYDƚAky( y/D7v“| :'㤒.]Rk,yre"WvIAI3_kx#.իpN/˝uY_1NHߗN񽁁FIKSRHmփv 3*50r9l/:+e\g}{ۜTWܨL__ş6xuXT^g!Q9iHx c]6Oxץo:tqm߫mHsi, D;sf&A|ir~ۘ2xZ90$I > 5 o2 O^0(ot Tfdo5:#ѺĦ3پ*UOTPo 1;r6I,;]=ơt/@ QO_Կ>aS#OcO/2X{%[\̔c S##/|@5 kzhc9K_:DrܐD5Jϓ(gS"v"{W3& JTY|v1;?[|7YFAmi`1=!jiy8q"ڌu>?^t}%$'!Nomt׭sraN(OdmŽhMR?vfGmM&¡ ;o)Qc?08qKv1 珺ŴVg8* Aȶ b* +aD-$1Y >h$OX&9TUm0n0Te!ܒ٬qT;FXN5\@?s$P$dr㻔EUo:bq O&Mx.xK%ſ`C_X;+*Yi{d696841#.s͋W~zrxΌr¾OQ bOa@ n|c);Bdq816v).Q[_(GW+GǙҋj6~!v {Ts ^,PWoEd x!]E+xCfM] #ފagP+Ĩ#}xyn|b`;w`[a[w+erLɋ8t@k)`|6$6?B*ŵ,uK\qŵPQFE0R {iYر44ˆQ6>C, ,cb5XY?dPH!}8KʑXYƹ%&$Qj@iaruhT9grB0kAaIa uلr!TEB0e)/)qx3=H!mk;59 8u:pWz{P/q֭) YH;1Gg6O75Tр)?+m)=?gW@ԯ9r`8 ߷ @'mfQ2cu1%6s(* ɇ2ca94 ?bXioXs& q\C_9T 9ht7̴ubaq OA[Xլ<~L~X_/tf6C}᧬μ38*9aNCiԅexki8! z{_ x1Z8j I&~Ej}ɉ$M5s`G2yxAa=ƻ"ڹo!NҤsUL; m/ }9xi =+g/ IDAT_h}8 &K!wY?+FZo{Rvbz@}2 ȱym"?|xM6t7,F{5[ u}>z~>^~G<Qy*oA"'Z #}SZT&\y_ ߥ@\('2b8- }Gv敏}8ȫ֛d8󤩗u0`sau*Mc\~i}]$>8r?DJ`y]al:ytdHĶ!`?pM\9!Zl-zpW|`()G_z5~ O5#E^0,SbH7(:H9р ƾ8G2 G45q=<1T, Y.1T!aKA@uw {s7 +ctb/0!Da:Ak!YNź^) Cz,%jG 2g/T gffvϗ7(1y3gגfyY3*nt(zxV:C!Wv > V%ؤ2p"kj_iFVsMFL1ldn686? zS-ư$$x3Rv N:oqpq=6\;&ì[W7zՆW\6u~OTFg:;ͨ!bVrS^S{T64eeA٤̫`<IadY3kte b\ۿ3/=Ot@A#8Ċ,8` `=)&1dl+=z~;Ko_&8%c_tyz㨓0OXzb%Ǟ̺h?U4vd4HsXpY`VƐt)/M30/QSt5R,1s̴qMZ"LCjkp!U j,m,KL0{0pPexT49i~wg/JVt<-Adflr=׀PFsE\w hƭ[B(to,HQw]/ {5i$a49aK彊ycKR OoQ+S\ Môݑa' %~yc $ϒt45^ʱ'|㹳zxwZsvrN>tr^mS6T^ӹ8z'ika_v$EyQ 96l]ܧM|ojL:զVZR#*Յ; o}\$٧B1J`0/29o66l.k等ϳE*/ۂ ~}eRk#(3,HSf)io,۠.Shi܂EKG}C̻0v8% |P]sTj8panbhxS7 7Y4:d?:FݶNMsw%єɰ爞AQ;9-U2\,:egl_Bh3|;\HCȝwZJZc*PCnK"2{a]H{2f5j)CU1KIÂ&B>1}0Ұ8I2AnޱWֈr:2(IЅqz\u̡HJ!N 9ij0X0j櫫\Cx~q덳>:֘[b#a"/ς?@(3IQjjܸ_0{Qp\ܲsD;醾% OcRDUAzMCh)`Ǣ-eQDI6j̘{q_ "3eƁ̈\ x /ђdEjF~UN/[0}zxէԱ?q?۲v.@m#`+Vڟv<}nٱn[ҾvSo*? 2ΰY?>L(w؏hIh+i7 w' x&wϢ\]s&ʸ,߭?©xvE ys\7}vQBo׎/{ղSx_fK~ymOVosVhO(+ F/MbnsC !z85GșbƋv Nک̝q} #_OwcLq䣳!B, ]}U ͜Qg05RD3JËZwlS8! (zUT8z4h3_g~E]mF,i*RWC=OG,Vl{sAGt茙=&"OBg'suNb}t~ʮq!MXGgBg^X@Bc -I<|*0'?< AFKȮ_pow[ qE7Z 8!xH:wC;S-vJ ^7!uC~k7F?u\B~mte oɘ Aw)O8ビ)|w>ޔ5XŸ:WO9ycx֟}Ȼ>c:wN!gyƆ71,6(0|rآ$r=DrVW.Heq2X85N֒ f;;dʇ/X7 =+#B߼8OJuX/ 0v!Ku\3L*eVA YN|Rr0u`.݃d&_)Td}}Qon?cȃ7kvjzqX<O ٖӍS=tɽ7T3#у}L|hغ  xۢ=3T:֟2Wf,khpԝA˓nG˃_hl 9 $bS%znj,NfmO 3pHMAR|m3v51 6־pIl/Px:3ޒOdD=zt7i0,>h6~l?_#~3,(qO~Rcv"t-dKd׳ޞ v>]QtR wYoKgoL0r:k|r#;3O=g s|[Z=l9Y6Ҵe4s|b8hc#3P[P]_xϔc(u2>^d*8Oy`ȃ`(gKaJł)js^~4B,~Q]lŒXt2g$ģtK[l\1J >Ұ xA\e";G]fZ2JftN>PڰO)3S8A֍k)|2m9H<ջ?G7W|cvۮE2O}UN#2Bq*')r[zM)3L:I4hdρOxKϰJlBjj6]_=̕~M_o8Ǒ7=w@5Q& 6㆘66]$tƗ oD:%D!,h~w~g?Y"c}ޡW/ 2IR &"/i灂w7giڎ}3LF0iMW=G)9q@"jYp]C>㙴3j(b dۑB\Ö6zh[-nRi-$d^ @(=u؜Ι[)ֻ(!ӻ)OmK>*ۉmG@}eV Oi&?.i?UG @sI,̞qe,Ǧ9'pD);]x ș;eO|cB[YNE9Yi4\E3H(B؎~=^F[Ʌ6;gk7~Ϙa2MLf+!ӇfVI:A !y x3:H8Q8X*Ŷdh[Qҩ.*NY:1(,%#4>9[LK/.A)s)ˈoAv=QC#pm(x)JۯG>u V J臈,rܴifyJ,Kigh7u#B6uh?g{0׽o?'o IB*pi4Ms<䒚n·G-2&؈nf ΫE\?ŧ<~xo|rN=^]A\^ Wv>D@eIhͼ^s<M~#pa@C^,bцנ}HabkIx.SGL'0AYdR*kk LY:CEDGH^F:ZHݫɖEJCl`jhS[]SsdG<9',uki<\>$uUSCD[U0MU!KGӒd1fSwu߭S^jF2A_0HK~h8#z&V0X<6QFK*Bp^7iڋyӲm"21$9xz Ox?t}걼s`- OߜprXʙ"%!g92!H/2h>,k\B5.Fh7{)8N7JPП'%pIX0 x盷$4Esuىa Oi W酫^w勫{h6rRb%W&Ξ5SV3|QmlngX:,~u6m{R/a3l2F“7gu]}^}P:gGΒ8=uc'+S>lv2f.=0hO)gd9r:allϴ6O=hy2uH PZǕ&tmac -D&]#fj IL/(gpz~7rs,^}_@ƸZߝ" 9 Xڸ U/6| wʗj?oGLR;/E1?uA glO9*,~g*8Y"*GxMӣ 9@[؃&(u̬٧:N ba ɟqU &3^8\O>uGݤ:PgLSft/X+ǥH_GgD17Ѷ?gaa1uTL`[Ua^Nk! S[d %gT=w9{瘍&Kxh= XEHATAĥ)M摟2Oc/\s~ ._:p w쉺u٨[1{_f_SD^95s}U_V:9F 4]B,mۥNǔ\ Pcᰍ,ox_^)O؜8kx_;@~3}>U!oӳ!#}ɁACBf: #MuVȎv7@ Q~\z0|:*oR><'x\poG%|߿@N^?a3\^K“Pvnf Շ$Vq]5l2ɏ Wח'<C4>1bɋT qj^|z ճcwR G*Pw<&-+AqdrN8`/ 1{8@ԓ%8([n/;ÆpRW˗!+&!=^ R-Qb|*;78P so@o-*klkh߁`?@jK;܋gCnT?|x̸rT4btRqpVh| 6NÍ.oNC}>ǞnreP?'O~Ia➗ͮjէϞ=Xq`2,|60l |#(Ǚ[w!#$ yEl _ч'HO=Up5$e%*My叁|B7|l9H}HLtIv^gB5m2+Khy.P\JP} c:C/8-}“ Q)l=\Xk] ަs_Pj'o2pq>S_-KĴ eK&Y!?ʼnr:''d8~ߺ#%/VK6qO^t*DѶ+Wu,rVqU;n:e~cvRbJkl)1ݐx/{֝Lq[[`CSj IDATK@S}@ٌ谮M#,tυM tN9s>/$_zg}Vn`I?7N6n~ᇗ?O8<:d&5;{xG]g2 3Bf//M>Wh'ϰ/0=,w>F[f=@Dl-cLiϊ)GCguUf;,^rbw ?Z$ fXR@ S<1Q`snq !y?-\K4N3^j_R*D-}y;|o0t%1O_Reyp}l^HJfeǭ I\\8Qu 术Zqi92eYK{lu|qmɼ`jG)<8-GfE>m[v>3fy@rNK;μXSN>!y~e&19=ûh?=GX?[$,>b'7~~R0#gGPw^^AGk]ɒ>a7^CT{xk':rXsvgLb1̗{/lspJn^A3jv0@)z50q@e?gEn$0CP |;3$A@CkEV/ϔ՜1cVd~ls8Q$ZR6%݂vNݍVCZh&zi, aI'UBl$JJٸd:品kk'LBD&<>GU,‘ȋ>.oE3Mx}V]3DAQyih=]~A/:&C'Rpa(˼MkE;km;br߿.=9/?5|GP3jDsgWңBY_ש1{sO z^_<}==RTWx~'*NK"IgDqa?;s:6|>GFb+c[ՇQCdS_pa? b) E_`Η5û٤! YD| (pRDGE6"c2L3&4/~1x\ ̚msD4OCxp-R2giiasB5=Ҷv?_{Ig_t 0rd`B ;צ?g ڏLB_g>W)~kOT?凞r5װf U陾sǕnW9KE>] e5h#{O/`}t83:Q&gw}.+߽(o?㣷 Em`P}keOrl} glqR3Ee#mJR+nxr3_JG? V>eJ븺1xWe#9,3fT@ s.[W:PW*D 3qɬ:b{`zak¢ޞyJN]wGI=Tb4r GH?I?`\}ըu(,3LYr!$bZoiL/*@Vt:f6l8d-Ui;\RjY0^w Jد?e.a>}V[pN,- z(VeW=[es!T]3bgGaHJnEΓAP[G%.pW8F{vd~eq}]&OpKOw=#_ouĎD&$<^k먰D^\qzI#5cx#$et|/pϤrUo/w?toYKK::򜜯YG?v1r;8.nj98qv/W8R~7ރ5)B$.!I p.ۅ:(j!/`6y$ [T^MHܴh RQm0rR&Pc$]+ۆ9~V;͋,sK^؁aO궉IL 'o(:7nj{8ԃYSE.,>8J=שvan? Q9t1Қi[ws̉鞪N!l K/٥!\>s Ωl[;cpz`eok.?hѓ7 {VK$@Kb@|kڰ}f؁~kKbطlK 5oָa3nͰ֖Űoٖk>q;kqC3Žq_IofW9P [6}%LtIgNI~H9G7"_F *KguN|r*yn\Ωr{6Ok 9T00h 5i?>?Y;uO{WƁb3z6|V^a_qz\& *eJby^*8 i&a&dc!"O)鿇.<ǒ_J2A}(; \"XQ|\V찥fY7ZCFJpcPf.1πjh0l+Ǵ+KOqqS1NI [y>s ©-O_:D|3Ba0n#CzlKU=2{ˏ$\f {uҠWgg704ö#n~|௤'@_>>j$J W1hُ(3:I?Ń<Uӡӓtiߡl|9Xq~Kw8_dUƃ2u,;/}\(l?۬O3X&؊e5890r38p8BiʱBkts)t򩭻g 3M/7,p4,@2Aچe&w&3U:@(G^FzK[9g^Keyӝ8i8/9TdsS<8ik'ř({ :&Y8.]}?TM b&W# /!a[3\RѐUtWdl2!~8I̡#넿aK*O'wo[)TwROQoݤlv9+]b0o2^@gU+l KpM{ĵu,jC'mE ߡ6B)7L&_#o'2Û?؏ư_V-2=6r7_~LߴĮ,D'ZtF{l^AY&B6&|OG%>qI-C ÙB5vO%Bf\NT񤔧G7Hd\Z(aWHw l q-`t:\ȇ_:`O2*?&ϡL[YDά}Pz njFҫn|9W[X{%0,2`5nC  z5',9k1:켁r?~Q#}?Ӎ#;fйK?ܐ^xw>ˁj M7ya:f5î/HwyFB~fz< ۧwə.u@w9y>7BC ٧G_Wrzz,)AfqzW<Đ!t_ٸ1,|8?ptPBDP cGgVryf\Q%ma>g;fb` ]L ے`zI0r 6wH[G>htt*FFGgoD~izJ˺>cHo7c_CM=WM+G[y+-PfsV@vzƕ`MO|?{za~XKθ4 slJ"@_#\{l^'ŀrW6:txS52Vױ X7 >EG魣'<=rɵtr6}q^ ɭ f{d~Syoe")xj 3dw<׸!l^ꃂ^1 ')oynBPb2dWRNu8*^6e ~lG-ۣ'G{\ lQtB!5H98&j򛲮gX: 4yZҏp^“N? iۿP6ZϿۗUX7ϛ?= -q;Wf1Z7j;rUPc䤈MOgʓi/`i8uPp_+)wjUZ'! kM]]b4߿'wNpA19t49Ձű8du +8^T3^Zj+4|ruc yC3X@3`,9ĬY<ᅺ! \% _|5^ǯz7[I )RGCeXBOKva2-fp<|65fѕF~,.) Z.a^_.>8%55|6%j{@YN^1 XyxQL}CWpآ%M$]y*5X|IgXd`ܻ TCf׸3Eb,X>sPۼ !z8 i{m5NA9  ӫoUC?n\;혚rXNY?_'=e$ N]!"B;|yU{Jr8$:d|80JtfS@_:l0:m~O}SX7\ߊnaog%}}zI 53`OYl(r} 407qÉ.;\q4!}_98f3kk4گ~5`p9'FǞ'fN٣t6Kw,/sϧtlβ#g쑾V 1=+#q@B͎ UflWGo)8E+g:4MЦiL3fA4$%N『E|g~kTE%HpK7N*7[!mÓ Mrttf`ؔoi.%KU37'Ao~ے!n2KÆw9R4ʖs4o[>كG045_3l9@ߡ?{r_ ~u.^swkM̐ " Ğhɛ ~#=dLG~;E םBϼ疏8uOE/q| g̜|_8<ݷ/En*Hwڥ~#{̠Ԟ< C5ŚmoY*, =2E+{gPήA%IN^ -Т!)q^/0 meRc;wr~d=T[htG~)6XלV gu-ѧ4+5k̆; ?[7^7s/ylufQF*sBC<:ng}}-z;^F `ѩ7%_~?:tG'G_G.Q`|<ȆGݬ #@',1`!, ._fȾ>>ݜ0[D,}Gy 'ḠD?J'K) _dӨ~b$šKeiYpS6qpS|-y]D4NA[M0/DJH9jK,57ɿB QR~8Du^bs{Am[Gb؇ta'6ac?ChKL-n(lod'WDgԋVo9_~p B^v#Ѐs?~vC' "8q lrunJ\f悒St,z:z*?|a%<6_t*;ers3)rWpF;v;=>޾ qL?؋78 fd!eoճT0ښ-n<fe%>[ph(vCdl@`ZjH,PYdc/%. j[4&Dx'2FdЋDޢn_'_.)1S }2P -dVj)oDw2QlK_ *ܸzēN1T,oŧe9U1B-?*>ӡ,). _jt۠ULu8<͌Vflf#!kNUp/qC? nu먶xh?[?bOR*sQ GX8AI3o%}!'Y@+WY>ÜLx"oJ]a`7> >vdg22=zf96 A>?_Tuw"JS%O/<("2[{yI/OHWfejdqxQ_:" ' 6=S.,;F '2勋Y+#U@zG:>BYHJKwQ)] MWǷWX~Qy ~l;x1RUiܗI3GJKSζ2[\v;eQ?NT2m2ýaq6'FF IDATtPꛜW^kJ;OoG v ̳|pa>'DGy9F]f!x=xb] G}! <% \;q*[Tz%gzɵ9B߃=3/Y"E]2(-8~+rO#Zgy2Jf^,չ)&SIDehr:LWSQfu/Xy䷃DzL6 0Kh`~T+*v=ꇈɎ0t*3^= sևQҸŅ6q\( g*,+ I s/T^C79;vvf;[_??[OY#^?㉞v6 ߙ f 6Lҟ~tr+wC,kٱkSg#/O3PѩBry+gA;Bw,,R1|u8+ 4sq<@UY;̛ö mɍmwL*؏6*ؖqZUtk0$ŮI4eweZ B|[0>: ~Ľ8KA,dcIiH/L:Oى~}%Kwo= )6p66UNyv1k9ovȫ;:Rm1-LP6h.yFF8ic״+̡S7vLޱKߤf'T#̂L`#MOǗMN뤰H 3Oeoy9!|x#G {>X{upVoֆ36/Wwfce>ea'wOypy"]r/Br>@K`OQ"Go*RNz`$WҎB%;UcM7&4#K`1^})OcL7=FQ'=?t&]x~0&\[jr^6q4 ZC_!kˣ=E0)C{zͶ.6pR@| Bp nty3ZzYFX/%M̰9>P^@٩ x3aJ.o;B6mg)wCy1ox5g>e6e=ŤƟvrtJ{IJiO*enW1<_"FؖoS(4Rywj8VZ Emc}h 68Nd _ #g(w5moɏ"E5D_Y)*p 8з%v{_V)ї\)0k5,5c7ώef@?ۡ{& ȀEM}regNHwO 'ZƇ^~/.?W9Qc xM.Mै !z{nL?י&5s̓Oqm 2G+ZxP)(VEN«:Iqɜ"w(;;'Q[]2a&cO/ е. ! 竜]jM6:˹).iv7 )i7187<.4uJ6+mǙ#۳B^;Ec<d_JieAg aW: W?r?~[F{vbK[ ۉ ء_Qx~ҖqŚYČ,u :unz៥Β.:Fr̯山<N'Yqā/&vM~9Cz2Ų϶<^8#S^>*'8=uƈW^ z I'l.p`A(q xmRTflbOG,ip&}ZOTnĨ-ƬUNua@J!>}aa-ʸ8}ޢi>S|Tp~U}ѿ(v`>1szBuO^a3lڬ`qfUy*lS|&<~fxh y;[?qI^-|%cD'ڐ<^;Kgt,sDh.tb|JnF+5y;Ny!K:':RfAWzYs qy̦9eOx,Φ eZxP'2Ghwv6{^h :;!_bYb%AsyDG KR|_/_P&A?|*H7,#%mmD ,I7hWJ/ZOhʑړo mdBdIh`Vz);?0DM7,_f=8~{{J(sjvû 7׾Ǎ7 '(!4c1/Lg، g>.{t(O\9:WO?t/=A|8/+d[;q>(ϪZ+:yS]7gy?R["PkH6s2-RGYywPTva]:bZ*~Ez lӴ<^W~UnrմoffW ,pQZ_,1' Gњw4OOV^=xxe쇫m6CUh{|y_[K^G?I#ub\q+df^ۡw6^>C ѣGR0DĸPB̧[";_~Z׿-t~]בˇ,eHL0W߭K_6Η'cx~ha'k/S[osՎ8XK<I7=A_d$hs'.{{I"\7Λr, (v)mLY5(:Sv<WLV~@LexOe6S+OX!NL~ma^]E+Oz2|?P|aԇE=cfN϶xuDRoon CDHyt]x2fqc ly͙데}W^@knnks{zf?(xkpm΁>rk&E7L3ǻڡ'gme0$Cցq?Dx-ƙ;rI}A Gn_*-0iIysw8<cSo_u\&$׹vio9Ok~iDfX!A'&4 Aʲ#/q! y|T^ݜulܿu+m$eˆˎn3GBT* o9 -N^hza3IVS} d=E=tOS1gW vbG+K2OAoY(G(ս[L׺Ep Q2ّ[Fxq8'JǫSlq+_VOp6Ɍ-pGA}–'muTt& (n }wz^#󺜦WWѫKlLpY4b\Z@+>4$5JS:Ǐl*Uy+}P!6Y]s;']YDb\FVp"_o_xOo1-"!WEHgN7?,!L`Ǭn:wy;v\ؗ'>v1sy[믾n+ 9LY qz$DrOg|XcͥZs:9 6Ogb/^۷Oqg?>Ϗ'o=foäٓG;9~5fÔ:@l™R|ەƱ,G/,4|MmKYG ,w_)"6ZYهM| 8,8yfΰ~s{83g>wNr׏u87@BzpMx/MqSNHArvŽ i=-,ႌnM z^2v>?8<9ԥ}:}L< .owbrnZTg[#'Gr=LH(ce39=Ƈkf8̐ 7hy]y'r<A a :Y¹8Hc9:&f3Z ;l.m:Svz։z¯B1+psمi#MWm2[bW}B0G)_=íď $m8 EM7ͥPsjGxɟXΪ k/EPMb]mqEنGkљW,Rg)U.6O8?>^,qvٲ]uzj]$]gg;CU%m)8G8@Vy<nK_v Kyti 4dpDDOş3ܪ[}rܿ^8"m0Lw:I4)94|(;C;|Qһi g"/~֩iK}҉{w'u/ooos &gA|q1JV~o7Y"yqfy، _]%6t8;A8G"c{TUSKq/A%NR1u/z<6(f3nƫG",]FW\P_!#vzB^h}}ƵҖɰ'ą2'[ 3W#2(E"Mk*]_SZ\. |>}M:X~Ɖ=cZR6v븎b,uQ˳ft|0C?ԹK©Vnɧ O4N )OzV6cʿ874td!BS pW1}~}e?o@۩30~groo;.<Ưy:fdg]h^_9SY}'ݗ%=Δ\kCUB}a0qrL>x./#qVʽP8R.9Rz O~GO}+g/t8ȉe@pp:POtWt1 3d8.ZfYl$gm) k+Q:>xՕ3NqNbA:w5xd ໰{+gԻCv& ?H Egfn n9Q[Sw濟:7H MRWlarm K1PnAPT\Wgxp+(O>Vxd_{t26s/Β{jK.sIU% e*M,2,Aݤ bǬa;[$i#<>y)ط__𶿎}]~Z(‚"i Sprɒ龚q-uZb$}vV?G\^Fv3o@w+uV*quvЊq:ZB`&OYizg⣏>RfD&qh=YL(7Hԓ'(|sl2r   ◿?'x |}CCY_fvN%p6?~(-̒ c,UF2ަ0>S%YN l93wm m36Eu앩aK3֭T C,FfWqPgFs+rt/[xt'mIݾC'y_Ψ:Q@{qpo?듷r}';ˉR L6X:q5nilk-q1d4yEzXd@S?5XlUSGqnygúN":+ai#muZhJ6n9r%kH-RTyvvpl;e [_g{/cc#>v E¸a"oQhGy3"з"#-3L8 Ki;_:1Dd1 "8]el}g<:Ad;6v!Z!zn_-|η7}.ު ky&6BXhqp hfԀ1(@ p|Qv>G#elާxљ-GA٦\fz\Ut1K̯(lĒ #ܛD =j'>H_aWnyf=Jt9P IDAT;yF7^K\XL8. 0q"CH^p6H`z Tc6sȋ{6;o(сVoj 31 U墪uXv\,kk)C ɲS qȌ1՜;v..pxL8,3a}YiC+p'E'"k,.7: RlM_?wUg`CkM^)c iSO{aA+3}4Ms緸\rKw(zcS3p7yO[BctH3Fp.y&Klu1ڼ{\B>{q?#~Ye`pH /Wk (9qV_ x@c:a#Gp3 g.l x<8J"dљX `$`%.ZDg~*tQ:h P<9}tg}zi[0x sj"hm1#y\t2b0'M$eݒ1ElCd ,|EvFz/Uad6pb7fYxx@Ubg?73{D3.ζxJak *mX[E0Qa33.+rI jPKLHkz"Y4 `o2|㙝/pGS;'mK_/{aѸ_AtT,l M@vȸ.Ip?دM_{?=6m?cA6|чvv*aO6K =}M٠,GEeޣtcTⴭy Y9?qfm8 ~_߽7{tGإuĜ=5=7w_QՋgO_nߢ?lG|y M H:>9nK'gDV ib4[>YF۶q8fzO^$ 2Sz)gv`륮ȈS!a5Y%Hm6z˵xZ1HG3ԑw裗U-@as@_Vjwh?≠.qoA: JNI3[ K|V7wvC/Y2d}7g6KAE~ 8)Sx4P 0R/x B{* o(pSd>U>^:JM[WI/uܾk8K[hopeҝ<PNSGY*UF4 1V`%3Ѱd]~7m{ e^5yi[53BhU[Yd/MXf:l7 :V(DHԡx7r+z63è0QJ&!ݜE%>gHKkǡ>m/d?+k58PX97ͣعQ(ӻd|J}}_J9^ވLcx]:7dbw=YO9t}y=:!b pYvq6}ӧ(ل:PٗK[y[G evA6 ]q?Sn\q%sΡ:=Zaӷ t61P-γ`'$H9>j d ;q[rhYVƐk$E3IFco/q3LyI.~#gV=zA^e^%f0ˤ^lF,:natԙu3UKa+j|gP5EǦi?zvk 0B2G|\:4]<۩q?FfKZpl2!@߶ܚekv{F?ώ~MVm/Ul+o({<6'ų<|鰜r)L,u9ވQwߓ :Qk_'O?ต (<k{1:xo v9V_}CYܾuΓx tY;L^2(p ,ݺyMn:N _3+pPq\? ~`@?s,-R}qKm p )̬VLe[_T:rD>2#~ 1h\#Ǹ aR>9/<Π,͇%l5tcx-ٻ,J۝cjͶ)0 Kcmxrv?C_fpEw2X/'v8v8Njx–>_2MdE_/ }mz?"r9Q)Wy)Y XTaK\iO4{fkg+}b{e7lGFؤ*ŷHRw7/(FkEТ|}e<_ TБK[.1;zy7!_!#lp$SrvfM/e'6Oxk_{/qz,xxBױBj²ӽ;O96Ί̵aCA̔dݴe pB(7&oapHz&zH%2iPB%N貘A~3P>VAeG@:; 6^a\UNygG9zX&by,TړRcau5eYyUw2x筷-^`ʘA.l6,..}"wvsp~ctzX&(tZR ql|՟oy+w?A9#x0,sVKl~J ˌPx)1H/Y{9zƩR4u;xL=qX'<Kz |ӂ́0C RaJDy!_g"{L09짺 qSt !*Iq?;ΐ(= x9S/Q'%C:aW-myn9S#&,yWEA<+JrbJҖgaN=>k{:jt&8f,##J/XA8aIp m${x3`=j;q.=Y`恵6S9P2W0 ^{NLlj7Dssu̐Kk+#:Y^)6U֑r˰`Hp 7=#.y3nu#Cy7µ 9P2'"@n䤈টix7WӉ5.DQ<& ]?ftjC-&vַ.yߝj}'ܱN'|?X?[W:Q,qZd & 1V*g`02]oc~y a{(QFC;m~)d2tݪȲ 9]O^p-yp\򅣀`J]jFU)ŋ=2R'^/hI.aZyb@'?Z7pk;J)%0L%)uB~3}؜6ývߵ~ shTg|k>lN~"姟 ZaW_{,:̙Tmt4 (oepVV; S9UMiINӓ|x%,8Mȣx/9Qk0OU}¹)%Kp YQ`\ =1 /%?M2>h~2xx5j=LH2Ъ"ʝC=aGM&W2{%Vl(jT:(q=ST$>:HW6{8fc?g&9˯ES5Otfzo" Lus9͔AFyix!yܫ:3K"Po3$)N@ꏞQS/Wh`#ٺvZp-{8Es/w/q '^}kgJ|/ݙ,b&}.z ~FQ[qJNq,=Hv<׿ }zmXV?vf|މ&Kfvrbϣ'3V0#F++(c @dgY^(/`c6¾3# 0H8ASg ݼ&FP)cF478/641~>;(&^{>w~WG<h^2ZY2iUgb7f%yA/8s^X&~O>.K ⛓zUR5=z >ſ%- pT*U`$oJ yT;m3~/8yjLX6$Y ݴ<IN|x%K{ W裏>:p>0}P)˧ M%;@6O 6ǏK-w~gUWgXiB j5t3uS/yM3;y-?DHyTVL&4Yz! 4y|ڥ'1,sL.iڕyqTGSlFCgx7p& }Y.Z`Bt-nwC,L.>srSƁNdǦi~ D4OPugܢ aPtB7dsӓg?҄k`}:kNmU;v v .>Fz3-Eu,EO_#Kwi2&DϛwWN Yg P^bpKѵOwe(Bz/2ܫŔr~K.T K.?>K{ize,g7&)F:AW(Ӡ3UgCBNR_J]0zsÒq,oIhhlgT.B(3HRʬyPa0(Pqmy_ֻE>|눡uyPd;C % +n?C.'V؈\XTg"7%yO|`q6SMD1 PM 4'๩% y6Oj&)`7~:hR[?9pTw?Y(L>rQ!.f}h S +Yq 旴SK&(#LW\x%ѯ ILksW/ Kg~7k8~7_۳[{!X[&F?n]?>]db-:@ ZU,\ҡ L''C |Q7[P'Օtr(zRVGG IDATUSC/u3O ]uRmU>y5Mk" @yq%3PlB<'cȤ?ŲKLY+G(- K ҏ? oWZ䂖 3:t6[-X<Ϡ6#ӑ򢅞G<,!C.7;[!qsdt&/cw_?v\r\xAtRL<* Iq:9wϨd!!72X]pN bLd/ W{ ɧ{1ԏ #9&m]gG5K}Hc< g#K,UPsϮ/uJS. cWt @gGKf6o\#m|=U kAg&CU"Y?M0XߖGp p3ѣ̣8M43$^Ȫ4OC*,rÇ,z\]ۯ?Hߺ@_[mM~uO=5zy( 3g2EryBU4gϼpE}8f2nj:~z#gr}ק,շl IKv{nݛʞ7=Z>ٷ8v{ZV<ٳ>dqh#jb%Myt l6s}nEmA SfPRd:H.T=D(Ƚ4n |[O$HJ+"A{`;!< &47O >;P~oƠɏo t;w`uv+`2Mf>WQ &iԒX<&[y0d {'δdǵi҅}6?2auNsM~m`7:ppڢ-01ײo &xީb:s!aKR^&']lvo(>_嗏&w ~}8ys9/ 7Ïp>8+ oy10E*lvE8 6li߁~S 䓧IVGUsG{ulrƃTZy@\GL{hx-~>LpP#vy!T7#g^Nh JVN_.'VhOpr"\Ke `MV,y#769=Rt7f\X;%>\TTQךgyf`&/J:i9Mƶ"wL #ژ7x"?F^u- allKA7om98" }-fx?6?W'_xa8rKbO Ο'mzp.7l~eFPuhnM/\3%jKL>1fjV4v yi'A\"NҡnQ yJ>q<*]1"|2b&eUpgD,˙xBj[M^)i,Z8n@ѹ0r&;.Gp+FYE ^PAۓ)6P/j>hR>߅.Xz˳A̒/RT'=BpICEq~]ۯu#s &q,h\gKaƦ1jƯV՗?$'%w_ K6ׯA%2y-)>^_0M/ r9`_MxMԮB'398szM;'?xh8'xr8~)}믟N \[Ee;29"vO sg#=C}Mo흼n& _Ӓv-IoСIJۻ{w΁WG)OcòчM>cpA'3m`٘?Te3Ήb8[,QQ0E>eOR@7miXHgO䛙?DВe k ީxHB]_KDt= Ul4)r*E;B?2g* 6~a( *.Ґ8 U,9$MU`_}[ߜ;>-}]W?Tlr}G^xр7=ޘ<: ]:tQ]:᠗(wjcaBwH|=:`N]>~^=ݶ{b9%Ջ}'[ϝnMf%(iiǎ ,xuwIΞ{Y!&Q6 sB|0HL'~%Ө1?EiO <(b^=²7xUmՒ%JqPTHGtB-t/ ޏ7YQ]G2}[H_: ! 7&EU{9 */.`XiqooLb;yEh@BUD}*~WL]O@, (|F'~,ɧtZ~ȋPLCN A._/{d;5~X~dijH0v4ijД Lj%ZRAa^a2'޸`Kl0Gg%>S>MNǁz܇?ǂ-L@߼٘UG M:|}ëI|rݓsyxIK/zb'i9y}4INN>3bى5<3/)SB6S퇚:|h CwO 8=?I0Y3D<9o=3yGAc|{n؄~&KKu{gs3([_<ܒn>Ю|Cg PYRB(sE3-Ui3(;v|7}Noȩ '68-D_|4I|ꈂ\W+4K}Fu1?Lf7gڷCh1gg7m&RG1ji"Sľ.ιFÓ]|Ǔ:ygD@τo6DWKhV^Ge66O>QI'- /^<ӥ ]{in#G|ˁ‡~0y9fym[9trcO ˌd[7"#wbLG aɍe9 |91Wc8go۹W[P@xtzUOW =69T*qf)<)E+QOP[騫b{_zٗ&z.NvOv0xA>pgCv]+tS\( ݧVId}bm ;xLM^*uQ2@وʤ~ ZD_`FntsQ[~}cMV[ɨOP(- iwǎ9Ps=(O<XcGj*O_:<|wRS'“21ayۋ*tr͠IB_{k$ɓyP䭸xaz y}0;sN&⋓ZfӞ4 \y&b@A6N˫onaXxF8(S~79|D^0בL>wffZ  {jѣxқl2p+{88'X/8Ci|  % w ``K, X*dy 0rl-*RJ@/$cPBh,.[l-t-eIy  Ua9R=%.<z? ®fd V<?h '@b%BZO+_EFЖ{ {Ht4eM媞oy8 M,I;vl~wC`kCGljuniM~G?چxŤP3LwlS#.[v)sgk$o<%SgԎ Z?#lA@{Y,?{f+(]Ҟ%{bJ^ u&lbbܽ{|{`&A<f[Bc $c 80yx`y6Eybdիz{M5|`.7G?*?ũ,"6=yӧj7K>Q|E&K>h]P_D#6\^$ݽ *78Qc&N6pk"tT kRx;>hdOjl(}ߑ#ã<,.m|a'3ձbbg`pBb%[opxbn@@zV+U@ ^Tc9 ,yԋ_d~SW}t6 ۠LJ PP \( Rԙk^|IH= *=4:,| M:c$:U5`qLZ4 ~Bqi]Eh Q5bk{TF]aQy 9+׽Gޒ<5,ɋl+<ݕᩴ?*LϺS&@=Jն_$-:e=H'z8$A+$ Csg~O 1!q&A@[G!%2TgMPx*4jsP| sRo|g8eW BTKUds#J}COϜC5Ϟ;;\&3&o٧[ٛo"j3P.5}W^+@p94~{s::iȣr@g.N1sJRiJOHF"w>MYz^? ~y΀6j}P#cڥ ^*D(GW1W.ɱxd 6b]rY+;0V/Il01tP5VTBRɽ7SG!YGnmE7(S%QPZ˨=X=4d)DxP0oIG6n2Hͬujs|&"%12R|bY?[۳,~:JۏHn[O +P_֗ix &(K\8W'*y0i?"@ɓ'`xNe{'m* Pbil49 %}!M {-Ml&6?~+3k/ y뭷󇵯iZGT0{iOGg'9ԄMUbIsrk!s#3'V.ˬ&ږ>rXʏ荼}ifDLK8m%&,mC `7sS9s~K[U@#x&tO#}^֒a6^Y:ě˓GsE蔝C)PH,K<ҡ뜏Vh|GbZ0އ!O9I@/6 ~lėчL 43,󭪿NfrǓĹQX0O8!/yP:|oj\'z϶˓o>C4u0L폚7IY5#+:oi&h|{l?ʻ,g OZ4AR3uxLCA6s4ԤJ]$4)z9{a|C-Ð\&yMxVpH~ɯW]vZU~_\n:zEo="^Ƿr[G񭣇\C.u|!:ux:zEo="^Ƿr[G񭣇\qE.:>yܬi'Id!/V`3f馜7^?w' JK%yތ8&)Km,!O=GQK.xτwAG"l;eT>'Κ7yVZ֛4A^9 M7joޞۧ#^ԹMtC0yS?|}cN>2A, Liߍa/Io邦A&]mzR}IC"NW&U xd~V"N?ް:9t|=?cȮJ9tez oFZ|Kj5Ƞ`Q.WN^gSqxЧeXo<@Oxy:HJ"6vth B |nXYt@yV~"FAjoA)Nm+,缚&Fd{)Qn+:lw~whOtn7\qiOl ӏP%X'D7<(~@k@xldT#ϗ05VeG}V9 9 ky#/J:i9SǼ(VW1o~JA6*x"?F^u- allKA19@$_CU%']j٩ hQ((,ӜVۂorf瞝{5<ӓ3Fo9?>rQ LN=>r|()vn8wɷpD'N{&<<={)7Ӳi>>|UޘȔ:@exN-PvOb.ox2a@#(@{"}@1 uxRhS˱ 4](f2:.I2M^|M>)S!.5458-[W_O^!qӅGB^jO neqRȔ16Ӝs:.f1+ҊKK傂IlwTZ /Te9603/ 2_M@QQ)%ٙu7e?>0D%鐀2HPSNMy[xڋ5t)Ι}1@{>8}P'_}o"03Q>b@Gh9e7]KA{מ]}u {xy2>?rzlG%N@'7,`\L& ؠP'Zb4dou+H f{›Y]B&'p1IA )Q䱁;'D>/*4Z'rB^]j )V9乿LUO(Pf]4:TheB[x eϵۿ&(.?Y3FgM r C-Kx-CKqk%T *y60]>QrJ|3T>JKx>LDێks8C7H7y^tQ8IXcr ^;?Oi:;yVL;-fty ?o4Av^쭷ga>|kO{c8\bs}&@Yf~ӟ|+L{7&O'z#pѣ5b/G:Jo޻f4<%7>u ; yf$@wGs/&ڎw"JlO:@mx1& ?yljsDZUhL 4JydQZwm"zQG=}&?4vA⃇vmt8l ؚ cD ;{_y[4Wz]؄~VT'%j5+oK{ MTHn綐7:i 3%5&) B4qFZbBwDp>W쉵9YX4.iEIňן`ώ6Z넁i6Y>-r%0p Cϝ?ϾbS!4Ӈ}u.ߕ|~AOG{bÏFs}vƟw_W6 Z9?/&G eL&o>14lc3DMxblqo rL&6C q+CN@d쨠U}^C^f&V@,d䙮?RUL5@+-sȅoyE9X)y5"/zT : bd)"|4l2(MlGGyrǶr㹉|V?ޢG}V65A ZĦGr\]Yo?wX)D?'} -uO|ȷp=-*2W*R[ayo&fyf%aރ-PLJ9l`%0C6Ax #/`.o.xM>isד8SJ&>yǵoN~#.jB&٠=Q?y8|*"g&!q/">gLʔ}Sti6vT}Al}Pt |ϰ!ycYdE`T{V0xWM۳EY=:=cӔa42#3#yε. >_M7+] ~-lPu> BG\`%zMPt 3@7M_ruvsvl_ך˜0MoۘkGd}s-cqMj˚A&y>2ڑ6{yPŧD/s6$ϒP&2䳨bEB|zfxKQo1I=Y#=4û 6 t\KxO=(+@m{({NxC>d L]ɻoPFك@JF'yUmXe@>:.4x[HF5Y =5?]ڣ=ۓk"P։>uogi,_W^a\tG6dxk~G|!t3+1*Z!cm.cZF*H缠iߥS7/I\Юi-PdfJEEEj>m-ģe;@ g fO胿jXߏe>*d5Oyk=qg9~G ٦t;OSΙҹQ^yMs@xfЯg| m& یtSx2&v3C8 ;.17t,9%9&z?cǎMǤuҥ'/@Oz:HY_S@|7K}cG,Oago-`Qe1 BZښG(ݤYEM\ʴ|^+O~j\A~#/%z|MB!j_,X>-(3P̨AjRv>DYcZ5Ag hYMg0_9 z8\=鈀~ g2'{0KLG~:zsm嫯jypGZT|6`8[n yܨS{_y1PA`f9W7p0&#&s@y6{헯Mq|(}oA\`)/ۡH|'IjH'~!2.lBTAW~'W-[Gª,G\yn2<ʨ4'"oI}qMJ_',W.{4QEZa+l'v5^zr>d"\pC__qNCnn~gGO-ϯ>WG/~qA@-1Pr"=G^sc D v܉IE%G&@/m)6Ekl̆L"yvi)oW ;oOQ }cIr·vA}b7KGv؊la[ʍa e-6G&|xT1jF!hw^gy~U@- ylW%'/(=Q&tT2׼巂ڏM׺_lʳ\t VX>_Y{!Š￀qϿYKk*uiK'G[Ek錌u*cB2`(;J?,鱄'7د](; 3-ɱxa{ʦmM> @.L< +ܧO<{YveطwDgCm֛M,)r9^(ɫ♱6q99;mx#j,uR}: 90{~o³ <9Fg׉Ѧ(Cq0v"/]#CVkB&ԧ9V#"ח_B}![n_a`ޤ81@ϒ79DQ;?SAXGr#Zxs<輸n*2 p^'n>~"+lʷr[G񭣇\C.u|!:ux:zEo="^Ƿr[G񭣇\C.u|!:ux:zEo="^Ƿr[G񭣇\C.u|!:ux:zEo="t=:uR:[O葮՛Ca9+׸^;APrq>%=ɄwD{߇%6>,%{/h,<M) /_o/ LUC@T<@uST&,GG5_l`3HbMԷ]`db*7']֨'RwtzI[7_+.?gnaS<[~xbJT6al:kIK*T00傚Tx6R˯ xyM#QP}ĉ)}1iyf:|N枛*q8olP H*-+#ca:cxs.؛`L@x>xxpV| tTOEP9@ KS,DZϹP6(ZD A[?%c A 4 QD|#Ple,_|N9zvW{i?[k!bY2h̫^Bie][D+-x(an>k{$l=j{hL-? F eӹTQd2%ϤiO!b/-[pM>,>X~u:|5ǏIR)@Z=i E<߫m[%/yii0*^-B ˳ieiB+-|H_\G~#G?=%_:!#\cT9]#-@F8TX.h$+Fq?~$ Kyʿ Ş#ۚZI9,Hy Jz_y3׊B ogbcroQ6{iIkSAdk#x,G9ҡkR9ˑg[l/cv]ܐy"luiH;!2c M% xޤbE9a2,D3'˓, 'ڝEnVhv",~Pi2#oeW2MoA/ w#폮!vQRINY~WzjSRM@ nQ0ćZ,3mL ,qtnSSTS5Ӧp`+&gOgّ ϔx \/=  ^< iLȾG){Fsc9 Dبu h`/xIА?p\nڢ_Ҥ (_Ջt؀4s6CUT<-u^T4ᐇz+\e=ĽzɣH#ĵ&юs{~(h:ʁz-*NQhԑ#פɦn M5:/տB-Cq)bө2zVauk'z1F>P!d\@y.(2'2.p)RS4A@)RR,@L0[6K$h,?ek~?|~,ϱ,țxڷ'?K%#+4PDyuCOzh탍2X2Ѐ?d~(C'uh<+3^}XC{bB^UD_!yMuL,(yڇ,7 ^%;~QvCH\]'xqS!:gE^g :zܣ3t*mixBNiB:xiO`,Kg+/ٛ*w,ePr_]EW Jv%B8l)THVwh?~Gp<5Lx4Phuguo<[f?MVâ>8G>H?Rcc7ӵMLK;ר-h)&lQ'0IJX4버gDt9!&DY<1,<:nc!8(+?wKI* XU{<^Xh'7$nz*hqVb~Y>-ӯ%_nw' 눖UU:vՇf~VU(d29#Fr>wrLnxq4)LlFhɻoY1Kcޗ27cW\&1M^&/P?X(FTO/ٱ4.-5X +g~x clBP J1cỲ[f5o3]C'i~E^Β`в^S}\~~WRR֟i/7 ֗ uuʬ+32 O0-˟.'S> 0#p JbRn=G [?{PR@MYl.W.QyQ.r3LjyaGe\]Z8&/KH8-aVt74vfϙ?f>SSO*wKUqܷJ×fl[#2ayŭP\Zla."?xsP~_|YG–xjVPK*T 򀅒 xϝ)JI{^I 01  FMڤiF?^ KT ˄',I~Ҟ^'6SOʩY*:,T4Uܮn<7A=bnjqo!W呃5^]>~9B}#Ooe[bm/q%Mݖ:V@gK( 1tbOv'9a7N|kfd! (\,!P$R&Db鍆TS`mP晣|)_!$/zwbc"o~7~hոKS:~ܞ睿|J"!0}=h[>VO@ߗ(dqK2,UԖ( :Ks<u=8]8.,m1+?l2ZҽR~/O1.}ƏuO"@hZj?!Xc1#ޥ2 TkŖ*<_]sO}ȗ_@+lϱ݀P2vʬuiyJ,տ˷~lWS[iIhG9vEo? {D8?1} m-S9o051v-%/3*mOv3@zD~ĩ}-Uz[jn"KvmCXK{;Ot-vz"hO! VkOߥ{LtoeY4{w2HT05T *cZnUA(1 בgk-wbIr:c"8hcy.M-#mKޘG1oD~捼L [b&ٖ6%oL #ژ7x"?F^ GX偊^QqcttZe._,mroK}ۏQQ Ss-[b`䍽Kssvbetꞵ_mt>~Ծr!,wU]Kmz*,[ 5-=42o-8:y` @uWگG9OhKS؃@~Ǘ?Ԣu*WB|v&@dW]XF[垱_ %d@=Mw~zY }g?Z aL篂_/~~e @M]XիWiľn]`%pÄ"z"x'HyʕeWK[4fDZ !6hB2!/P=eK.] sq#b1cM cZFqƼ72/l]cd[Gژ1-x#8hcy.M-#mKޘG1oD~捼Lku1O:e읲grYה'3*T傠QQX9+rKf5ܜ$m& =Qn?,sW9{ble^+\mm]k]FfjDubetꮶߎ;gΜ,wףuǭ-`h6m?]ۯQ}{5~e=*riozBEWʪ4wvJStwwsz~XW(* 3TT HA~-ZGYng8}hcD6ns1) @ ׎}ݛ0i /5h[doz[&>~c<2ϥ(3Ն`Wk);zx|XHaߖmuz KԸ?O }X>~,-RXzgFnvuji2Ku}演.~4pǏ}ǢoܒcQ`7y ДoC'p動d~zG}\X` 9'y͟..pPAr\}=(|X†~a#;4QH?QaSvOT/ ?7xPy>A8 IDATO_@~u% m}3(D'ƸE㧊3a⁔W hKJ٭%WǍTZvۏ:EA@?FG?&ICTXW`K&_wy[Og11,}0/o P1.G5PQ?֡Sc6^/Oɠ e١>~}G-U:dEGŪ&~44hӀF?}cE?9q-'GKB ڠ*˶:Upve?+zm}GbskG9@NL<5 -b 8V6%-L_o?%7zC}X K͍2kngc2j @ڃJÐ#dlWmlO@?}]ig#&{#F;kc2F !?LK<+ʹkaɴh#MB!2z d+lGB Lm~qHP( Ȉ.=azYآ>~e>~.OG?Qi\dJP0µc_fb L~4 ͫ} T {dԈM+uǏ6 sa>$@϶y[\QMx[$bn_ V4.:J5"d6{G+Mn=٭,%|.u68TiuG7R5j?w|{Ygl_~k *>Fq]#ͧi5>5d+Csȝ-*J#',5iyo8'˳a箍'Ξ7tgo=Uj}{>իWɃрqnTn;w:4}菮nll>FBɵG7yRwhL_տ6>䓍+W_[o_VG_dc,oOl7>Pt7;k~_'%R_Fg%q'w[{U0jPA^ǀ7ShRo_x}oዓ?gMv1|Ի&h;K/.o۶z T._;~#{T[4Plǟxgw&_'gwn\G[ǷUFӧOO^~__ONx}hzwh;_ѣTcYu;Y~U?//ɟ ҭ篥勥Տ=xx{ zdr4r)hf^eExKWf|]VHG΍&>}dmjT&`vWKRo`?g=~Ш}m/?==kfB-" a+*y~>Dч@TDMAPPQdBX4 1o@2=]ޞ$@ovNUS: x.Q񻻻k_fM3ΐ}}6Yw0%$*Jl_\a ѯ㩡5~WFefRا({fU/DG9(x* jJO*~ƈL/tfk=|Cbe;mz*+s9 0=R7oQoY-F5Cbʼn/%Չl4;G.7 _^bE}ң"FԖҟVtk gp+SQI)#1ccTcۮxkmCv!Sd!fk''C򽘕R$E<и&Y|Czѫ+SS9e?xMn7Џܶ׿UwpɳD#1W[lGG3qa~Rքߓ1m7gGo=ec[3I>3v+oLgW=Xޯ>j~eO۹ U{ 'ȠAt]}ҰE?cXHq4^**cǎ'ʌ3d`+9')'( /TeqAY>̙3k;f?XLJȫ<*OX6G(R/ /+GxKuЃ s./rGTi_9?Modڴi]|;_ÿ/o9s&qet|WғqҔ~.{Gj=\KKB - )_ߵv KQ6JTqێ+F0Sg*S\xy2GedNCd.ed ]EJuRX~XêMuEL P4c0M*)65S@jO/ʆ!sPfRblm0faa*OGfG:RF!x`Vu mbFƔ._`:?d8˄ '|@25yr\<3ǀVÏ'hgW,U㤫M֬Z"NȲSAɍ!&_|M$=<,d.5h?,}sk{zk?>as0#00BWF"cD |̤5ƍAuȯSRY~Gj3Zr\elR iihp*~tNP~'? E %.0xPMfʔ)fG:1ۢQH`[:|Auus1r5Gc;S?.ig\| _~w:s@OWm;6UƷӈO9 QiqP_cq_y(ӖDAEǟ}fȤq҅~]G^z]-5#6#[WjZh9]W}L'r SJzGu`<~"*33n\|s!~G}_g'ᗐ6ϸڃ} 8f>+]{P/4i<>gii2O{ JXH%i^UZp]_TX81JvifjmmmmRS2d0iȂj@?> M$[>qN#RW[/'0iPs 1LV-kNanVru J'nβ#*#R!Q>p}El>K{Gjo{5Thxk7y8*lܸѬZaeϭK/T{13n8y O>)]t,[Lp_\uU2l06۔~9䱪/mӘ7TzEQ O|QTrX);0[m7+Iṛ>jd#4qX'_s ɳ[D-u֙m/ܬR{NsN;Mo?ATP/_1!.ݜDŽTE./0E9vTz8ۋ $+ynk]y<=Ia奕<uħ{o ke{!\$#'g/ȴ~I')SEyKk:CM]EqN-Y7+#&LC߳!cS/Bھ'|X&qw9_]d˳apa;Oyo,1<7F7`] g_G #Eͷ_DʌRoDoQd2TLq&yssKeH "NԤ%MPJxۏyOU&N=V`hqv܀{h9㒦&s0記@C!atnFiqȑ#K.z8<'p+V0[w[oޗí ?쳅e]f:$k_{_񨴴3nƥ1"x4%mY\LQiy'u2Vqi[=䁆P|cw8X}_jy|+')/}l̠n3gg͚%8`/_.eС<8o O>9岌_Wr}ɷ-##>I|קdAar#}yvrb: c0ͥi&o50na 󒜳ҤI7;/LN(嫿~v_}.yɡPN0]~taygw#2|.#N>Uc|C>-Sq6Y{VNƭ8xpa,a;sҾfE?_A;}i'|A l_4bԂuY,^NJƖFɥ̀'m[e?yuq+PTh1qe(*r Gm54fl&UekRBLחg_*'q Rػ3kXH}SM31҅m "Vnթ`Sѧa* ̘ (:NͳpV(zruיȺ;0~``p(TJdy'b̬?x,ց[Ń%r!FɟwyD_\5[f;4s)iG -K3bB㖰!7fG!/Tko<}sU$:PWn^tRsW7l.e]O7u.j|q/^,'&yF:47V';S1Ewg4z ~7q7RӦMU982e?O(0&lCM>#'j1q. @ϼ 2]auȕA-Cey,y(| {?u_O: +40{ҳty c432lpmHGoɇɱ_,ҷ:VJG.̯A<ŋ'~KdKOȇ7)u֋оVw҂ĽI I.#^M$Aa!. MO(?-_?Kb?̧"W_̳xp!8e[]cGu٪# (S_ 9Wx *3@#\u>&Ǐeӭq?VPea(效h-RT#cȠ uŵM?xҶvJzTaR4-1n[n2ff +)qœɢу]q4QT!ħc[R%~w_i Ҷf4rs;j>N+PP5 BҖ1 \r%gv8Z£^c%W (68(+7-8 5߃,9(<~{r/k  ^p]lY+{pدv}n7~²3v ?J?2Np/j@Qޮg'2мl-}Vs sk裏6[<^G.Ɖ0L̙)\  LkA CMesf/)M';;QnF(G*c E^ Ѣ0t6Ҹ"mlnc=t}]a:g*[v S>Ϛ#O/~!8W׸EGxCÉV\}vWq,~xꩧvlO=,94rh Wc XFSC Әa@4^Α>H^}>9 I-EpCFIX* p!4i4-A Y8qjM38F467kűd,o+m=\[fˍcƚ:x&G޴,E`Θ'4Y^OD]"#47-H}R5ΡYe8MHvVxSs?~Dw>/ {ExIDATH,^XAǭkך :FWat+S4x}ܹFLg?3^³|m]nRG߇o+%&}Gfty4˗aUG9T*Pblŷ Cw$^}VYwބ|k4V&wӵұn)Cz;atʫZ-iW3Y[/TwڙvCx\hd@)FBX|PO_Ɯ}G`4;;|KHܣ) mgCU iSG%3*rˋG}[iiX}N5L_2g3'<qA>#rЇ>!L|(6q25G8p9YfdiMm0RZ7NK*'"Wv᎑^~}YPzn"Gs{i|z\ c&KÃ*<*=:*uBF[?gaSCcbN.[[kTԈڒ÷ܚ-ۦ[59t s"cscQӨyʠ? w]j9D|Ī8_RlGIo^NJUeV{긝8al_犢K`o{k5⣠j-KN/p)gcsUF>a/ /WncP[^WWN/X%=1{ua|(VћZ[/8% ?&m4[iveZyidki!~S{wL]vJj]CZs_[q}]/x8o݇qhQw=>5gQ8,bei/os5*+w̨W>uTINπ$oJNTT4hޙauҲ:ęƽE|ϸl#Z',,]777cƌq8v ~ڧ尝tUۏz F,VmX1Cw1a+ e2w)@xy~:!=XN8@E~\^L#˗JUzM9on◧n#Hم>,_hnk'fK]Sp̅Sc" Ѧ3>iB"Mv씶Hc3rw$f}βCjr<.~x4PĀ=,r2i6M}zK} |2P aPLDBVh5(lx#wD? +7  COuKO1zCM[B8iPa E V5v'tWaR$H&&b(B4 {yC]á+,Qjw@~9Dq   m8ظ4_2(=*8^KVjq矒 >tI*P$PA`,2=H?~]?ȒdD3@ e27 B{[d^(;8?Pem (~m1I a~P/<<' b-m;?aD~g ƫf@`+mi&l[֋ 㗨jӏLb) ?[WxΏ7`s¦쁎 Ø*}TҒJ!=<@Gˏ ^xk]V\yg]) U#a xÖU?*1^Dx#(!^z9I[tۀRÉ>6p@j=~~QxO -M(*,/?^~0ԋbU# ʴYb]5UªT% TQFp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxmGYsKBBH M+ EQ@T#6/TĊcC,`JQAE!L>3ssMe9{w6Yf ,0X``Gdv:,0X`` *#גwHŒ5``kERP8Klt~ѡ #Ps˷> 4g8S8L S7mv !΂ |c~C6L-0C40~62)bnL> q<*aWN>À:ah?eZ1m ohI5.C!K ԳOs(*!ډN)g.ލZSG3 a~TQg#:Bڟ-a` wH_G:3>Γ 8DT 1N4T!MZ*@?/*P 19u?fVϡ?+rȭ?֦vz]ӄt qzY`_Я/PRO VKdF/=߸)OlZ>% XHP %?觿 gz?XX1u([6 gKa ]\!Pq~gO{6 XבBԓT+zߪ3HC*/ Py}lt~ȡ3,0LCdeeeMn۶mnw eyk7rSfw~Vz P_A [ (g?^qۻ;oa˖-^] zR;u<>su~dP3uP#̃ |K,8sU\E^\ɣ?~+ גя V ~Ԛ38/ŭ[b>u=Ja_٭+ˤ`[ +3u=BQWjxJ`~yI`nGg~V?<u46,//$+xJ!*LP ,ո!ոe?*駟Ξ y: ׺^z[_Ub?6 jc g?^*qiƊ2=bo4;L&_}wa=V(#L΃ c~^k{Un_~ugl?e%K 'j!ı~L}sǟxQuD< fѰs2BH$K n^V ~_]7^auz?Cz2'xU? uyp1AeBu?zTw.Ezu$UVȋڑP 'Yn?_u?*;B"OkDfY]yPS36:2F5 R{@*l?jf`~Q)KQLmC~mn?{LokWT$TBjBB[l*@د1+@]XסWxůGaQ3틇7^zHuxc9PX*%*~͌CT)7'+u_ƹaQFԛW=KN`xԓϬ]#{ Ǔ'U;RoRr9*{F&e~hez0 T~THװG\gjG,/Dr;"lZJnKȌ<B^A^F8{/Q~PhDg"Dk3RY@uKׯ CQ!D fL@qR/E9UԗkU?os5א>b+pooFÙrmGpc~={ݪ ms3+^ 7>ST =M>}OOX\?߸?ohcD9*$b2/0ρrǥ 0bP( }}2`?١7Q/ΌmZz8᪫jyw/wX8sll;*ѱ~z Ԭ{p)=;2>,K~f2ПS=D0/|O~oo{w{~g~wͥ13Y/| ׶ltq?nn~O}ɫ_xIZ֯}k^.y}XF׀q'kȫaԖ؅зImKׇnq X7p"ƍ6Om]}Զ$>.y}XF׀q'kȫaso3«%P2B9^+=ն:W~=j+2yc!1+oo/ht]t\zg~ڕw~w\? u?h1_Q-8T>*kWw}D}l&T4 /.oJROO˷|K.}EBn\UGz57x\O#챑}7O_ZΏzWPHٳ/Y@;^3<ƵN7# 7r5L A2-:2c}5y DSc;9;pI/})T,E}k,h_6t<o˿|?־%/isoۏgX=M&=X_U_5 w=3꫑g_WY͊9c'~'F,?jgl)jjY1`/{G>OC~r)83:%Fa{K/5*ݻw7g/2xN(Z;N'-_ɷ---z;B:CٶmW{ᥠKjҩHw[h_[tjmV# h0:tkVSohv{=l|‡sdjS`Ue?70'ߨ= /K0 ]ݑ0eC]:>MN~9c~p?ڌ̌a9=}Gf#hlȡhٳX_K9]^jk^WrlqhYb`-o}~HIìbu/G__=_ug>:852daoM*l/`cw y?OHE~- `kuǸi dw՟"δ\_x$\vT Vu,di X'&}OeF6`kb fJϳ Ep"Ȝ4za $mXLEM6E-)Ne$!( 1R`Z:0c6PÎKw'"À2eL苾ьM#ڏ|# ol2KZ:btX.U(Z#: ؘ]S!6Ycif'^K#9Kcycooѱ3 !?C?4鲒'=)~)ϲg\\Kp3ug C&XtG˿˝F|W~i*=]h~$)Zp VMMVVOP6{mq޴8ڜ?a +9fUH k4i?AyW|2ot4/Rj،чiPbʙ!R X7ԟ'ԅnӇ]r?~EW˻!z)aEf͸f^2"Vpb}eEm :!G}ȃ4[w y//M ףq*__]wZ jQ%NZR~Xӆcɉ1W|WMcr4?ӈ=Frx駟}e4r S>r,+X֋\*X{F/zы Z~۲"a r_)eO%FD0D!e!/;!MioSOCy!A|!}35}M6Ždi/iK\iƩꩼ6=⩾<3XpŗxJ~ȯEyCI8$qZ~=H;Ot F33yCɛ@3c|ST3yl?b/U*Lj4{p*\,"l4Hi5f:LIͣ 3Kz7{shu  f8:=5~N3&Ʌ^tڀic'/g,yoUTAr^[&dK\0s&t6f[V͗; \%/=L-->YϚxOKn/QU%[Uɡjk8Oy %P^"߼u[10}PcS! SAӂY7O]wryȨȬa`> n?Wu'3t 3y 4G?M`.ZN.g阂1n4KtA/)6fc΍l؟ ߿_n#4JavWÒX'簇:5)dVV \;4ϳQ%)pv>?|2iG;vu2GAC]e/I)Wl#%[͡{Sf9RF?xJ& aɯ>Mh{ta @_βY$nFb.Ь$*# *'r(9/%Ef@Qo|~3rKcU(|Z˼xanSiZrbs|Z\h:B/hv 48"KvB TqC) Az`sUW):'R Fh}LS'C|GA,#pos󚉜fpN9Hz4_/4O7IOmn3rxf8xx" 8s3zD@?`d325c@8vۿx?Շ;[Wqk <`DgZKi䶟ꄪLݨ U&qVWj.NO//nfD21ef<)ǫM4c0󆓅^I3fYJ{kNy܄+N!q;,?X2)%+)̆5W1D*<ؤ)}`b}lЩ&}4-Ne?ؿu=鸺TC=oGT{Zg@NoD T!Nނs~("W@o= B+u#W\k<2Vr.ţ9y8HCJ)kElN.)4$; &%/'#0+eIVaޣ'!_kȳY A?NyXZ H+@oé̐'h ,U2I8R9.>k8$ܸ B D=z׀'c&ES_^ՑR軔_Ҋzp & s+HseFy5Id' IDATGG6S"?UN ~ QߨSNȏ|oI1&9ٴixR*h!۟'Ot$jNVC bΓJ vn 8L:a[n)|\&ؖk cf+*HXܨ)>) vk '>T3$׋";}uh?ԏ}Sex_W>s!*2 ^wΫ#xNVUzAf9xa%YЍ󁌢Y>C2uq>rFK6{7}nI71lS8Q-ҒSE%97"M F.3SC )橦D)RpYO3OG>`7:Wz;K2Ue1}e5Ţ sH0zWΡkW4rK On?U}QϚg_pt<*PwFPZ)cXN`?zP UWR%3 lYy63S4BO:)0q\aiʳ>ɡ(ԑ7Cd L*xD&zмI8BYL0ቝT47$CԟWiϥ.γLY(H> .HV!y68fgq78_F^ 觶.Mj[GX>,p#k5nհ~jKBۤ%yq78_F^ Yկ͕ yE~N׸|>)ס(:da[_ On~.nP+;?r0nԟ Ko [t$c\l}IB'DQ?}? u3P9ɣ$(]q~fйXV(uF -CFaB3)ߛ8|fo*_5hpqpě,e;pm|c)\%^1~Zq<g ^php;xNYIp,V7 $8 4!PG=J},NO/Z8&V;@"I2S`GPPׂ;S}O&v2CVn6@EGL/p5CB5ް~ғ_.K`:#3I,Á۫ZzD\Y#^{:z|IB}!D˗6k.K_>hez3aL,NN0ʼn"9^_mf _Y9RV*9>[)n \ d}z7RAƍQ3@)DlXPt, a/VǤP_g^ FERwyF F,i]oe`Y,GyVvpˤ8K_C^rВ8Q%-|pL ta8gz;f`<ﻪpfxZ/j]>tP :ˆ7:|e9 UqD'BEN\zYkP:#m(HFCq[3dk|>,n^V{"xe)g,ڀA>-!jc?F;-;.s2 ?o Mx$A5%1ߎ弄ooL02??JG,? =IeRd k[~҄g%ͳ0pz%WӾ#׸I/sx38];%]|mέAp0w@ۏ}_}zW檑_m¥aLI qM<:PSb6f-`%f:wl7tlknOr?`oU&(37`䜬vgq#2EVJf~ ܘdžY(Y~]#gF,V2! d?O<)Vż7Y $ے)?Ӄ2I5-ejrN'as/ ,3όk_EJP!d3ࢿD2tǙLӢ Mqfa'= n}Jc^ j =C`nR  ټ=侀6lSK0=]]M͊ 7H@;,REJ}MjjؿmUOTW8aI젖ݮܱ9&GhwżkzP nO$ ?,yDCqh`- '9QpӸ oeeU|$ej"=.$T9IlF[%ᡋ /D"(y$ff=$NXSB{ʌG(NTT:ETR&)'HsY#䓇#!IM`P:/}Xo{=>>.y}~zZ`m~zJc^+ /q%D@x}2\)q  5}yT!ȌK:,Q7fLdxtVRs5״m?1Pp5'mI!'Ǘ鎣[U?ZcPlN?c&\ob(>A> $>/KiiL~Brx`ApwU"K'hILKQK'՜T^T8 4%Dp=G:FT:BZ>r:¶\Iq6@up} Gi*9@C*Q(Aq }6yPfa~KG^hD|B?y^?G+?| 8V-@gJe޹ oF ,N1:axobrP\wu swSw61^A_{ꩧ$X{ ֖;mn8;ə0;՗YL{"<6kJ%ĒaY&AvR1THpNڕ >((Jr`kW:tl#g7~&$Vr!\KW!zdNV'͚^'wف^MH.ۚ[6y >|-}@"E!4ʴުKtR/ JDU^??py.(=Dzr}=a_غחGF;@;="Z+$|~ؗ=#ǬN6puyE]{w&4*5rJwڝ._s5kv8nj!ǎK/T{5Ŭ\z zu)F#9PkubiV=:A43ryѯuϚDKpAV!-<}j&ט•3hkxd%#V_ᄁ?MOoy3|pi=L ?j|AiԎ zP󐯺#nx Svȷ}癹1Sgd%-q,%GXp~zp!(lj=5ܿ{2ғqY=n>J<%![jM`Z؄RR4*#t }/fFciӒܺf&W6bc*AZy=ņ.ră͞`0ʱb4DYjZ$ |nsYkj+=􇮁[qX+_D|GH~yy>|ZObޙ],[*P gUKofߘUq=B_Xxag%_]HBNf5vn/2õL{pisey?O((+HSiM啎5~ IP"7ҾM+ǼMЧdɒ>xģ<xaEN/ |]xk^Ө8|`s{ݫ4rW7{n??v#% W]\Or~'Z=k:3O_ja!(:3}(S$pB "@.W퓔2Q(cp $[0~v=v[{|;Z=)vy1JDNO$fniO#%OAi$heuiqKwFFmd óGTMƻv5 /jfȃ$ӞڥRMV4t?h,\rʶv1ͬ d $H.SV~mxv'E,eMŋ g9!D!x /V @͜‘<@ (#:#z,$G)%UXF˞s1%xOXb*87Q n=Jdu2e;w4??0z#ѝvi 39K^o)#(=q<]L}I eHQ<)Q!u s+_~7H]tQcyػ;!3yr}uM^ U(? z:Su><k6NS8MBehΡO0^=pf@Ե6vO(z _ݜ0 389M:dɣlye-1p-:3yHcǎO@2Pqc,G /@w9%-,I˭8iQ3V+\O׍u{:I؂3Km|$>{P;Ѡ?5/v'd4cX4:!_( Jq>$ |hvR 6HЇEUt!OX(Si =Ćs4]ٟ}JQ7y7/$>arI_E^S<9WI[ay]BF5׳A{O}S<12/$98zdzOv&иazK_ӳ3ѥ^/k>>]7tqᡷ[?h~y bne D=_TNVV׍6I]wmjJҿ^xຟM00\3DsCc^z'WF.N37rJ{OܹI6а ANl-e ט%GE{^cP!><-s+5,3: 9 w![>sfa nS (#vOfCM=p ? ،-LpUJ }\X-ĉd9~ܫzYگRxVn*3:VpGPs)*"93B2J~q r/1է <a`GZY58ƃ:MڬmG*'ٻ:f&T1%khb ERۦ9dLiXWJNtw[LԦ= nwa9' V(bFEҒY\]YL];*T lpO CV➀ ЛQ 'q̖^|1gc@YDzqem59J4\{ݮkW=)Gi7Rs𤕜fqf˶mY,iQ :ڎR"S~4u5J8p ?2693Փ/4/7鍝E/+>6Ǻ?O>iL<g^1'>&J1я~f&[e0D:^lowu}kurxuO==u㻿[GaZhTm=?ahYm򗿜|GQzT'lMANhOy+MF트3(w?agg$FeiYes7}75мE/5Lּ opƇ?۾ۚگ]Gd}Sj~~K'ydǑr]R \xTq)}5`}7j\zk. >k\D>ޔPr2Ê0˯҉b )KUg=֯a{Lsv2MZ5=7gsϖ5 +z,ss%t_|jbd@mݶUG&I0p'd)c'}meP$ 8KV1!8Nrspu;񎣋/SNXK=a"0KTZg:֟Y@Ҙ&9L.]K8v ҂$a+GגMx&4: EGY={7;,]+j(]}Kf2:ZXj6K[Nm(Y:EG2lMJg`ҒmW,eF¤GgvQh,;+`%#(5^◴ 8>#4N_i^W{Ţm`8y#9ayw+Ц33W|w hdv8@ox\^)Kҳ ??e'I3J9WBúODz IDATAǬf_:"tltB1JY$#vۿ[;2x;JiO{Z;;'>=)sr7_5_rƆqx~ѳK1;M؅Y'6lO>3Nuۿ۝f<;p??p ' gxVA"ǃ\zwu|(F}La? M s5rqt+h8 t_㺲y i#w:2Y&(3mi(Q}MbLdQ譨 O'S-DOcvBm2w ɝ(P%xFhf'^3>5OzֳF/~__hv'?i//V,1EUp')lČloCgk3if'"t;StͤӋ @q+3Lx+ l~X?R\l~꧚??6πjZ~=) A~ q,oۉ+ͣ`ǼJT%;鳢]p sJFD/pC*+v'F[4>sNk9N>J@6d_΄+ޘ}a>PI@>6:l~D˘C'q_,䴰5)wrVZ*G5_4>QZA98:>w:p(rؕLR&3J=҆u`O`b`81-סMseBC ' )Pzvd($1O m#? i8p6uLi[ZHG,V٤Y)R!+VSsWys,rE wfI1 EÞg 3#wjFyr F:)-ڝ8ִ} A3#m~d*D"YW`9|,iPY0tyW|2^˲A޿]2/à%KU Yg7_e_n)lQYe8,}cPOOwY>ԏM=i^*Wq\^(i X.iέ{kӇ2?ArrzI4ݏܡ'[ Cְ5zFE=t޹7ke,ٴ_|K\fkjPpi5яyLzyӳlWs%p^~' )rHF Ⱥ\1خ}KV(tm);_6/v-hyBG 䣷Xh?C` :JL i9ƙ` jAXO]lG`NL󀣋0cƸD('0TeϠiZvڻ@c->Ν{*2u-Э,鳴y}J:2LR Zj$H#`ac(pG:tbBW !Z乮QŪj/5ӲyX{xyQ>I?mwLhLGP67}\8V\Nu @*T$w5|;$*Y3 2CT)7q{xr:m\ogR">}&th 㺡mѣE{j6xM֏/;VrX0KvbU48:3lf8*io/{=%y0fgvrǏ}k*IjG':}܉;(m4T"RܐU( 0R,3a5.V*f"_3sG`}L:e;6XF 3K,Yu:goB-SD˔~9q'c-YvrƗ\zU4d 1P7>1Vss@O铳jAD%ĄLӒ-i6KBq,"K.X +)9S,Nf"[(O_,pB3<3 tOҹJ{&kW g:mfS=䉓,KRy Gv[{@iYJʖJvQYO-c+tGCz ZuB<) JVya͗h|>ytu.xlX~3=ꉺVilG>2>&?!G?z,G`M. {jQXG#|Aa>U[tɵ 3+k3DCA:=C˛KO98Ax6N@77#gVZ0i 덮*j?}K)*̽@!3.LIQn~z, }|Hr&2>[(M9k7Z{Lh֩SJ+{)zjKƜ_kkGgyO8-7C*XfL469R1 @\20=Sg*6+Y!CHP,}&13KC_b,M)YSc/%2#r ((OZ4() m@k ,nˤy0qGI ,QM)8\I$*T \O|°,4O)s.~`s`˰9a8O45EW=biiTgL3@yKC) yv>זaN/!븽xjY7qkH*mfo?o8j"teO 븻J>}ȁ2v*:ej^orzn>0ʴl\]ֆ_U4 Szq 鸞Oދpr]cZm%SN٩78 Ó_n8Ю}pjrKySù7Bw},hPwLSޏ}c[o77>Z`#;mקsѣF > L.u>Cf{I~&W_gC*HBk?; % ^N&I1A^pyuxYw۷O晴LԱnګqڞ:3(?W- 38&_ M >lC͐C!8SnpPr3.*Kr˜ M ԟ.Fҷd"V )#2ch 6P;nJ "mrlAy͇۫{ӓ:"@رٵ{o[O utw.gbf@*R*/\Ɉx*~ͅ9mgIE^H*o  ^.JLF m@.?6K 2βH13S1,G LKdE<V!~yrzotiF}xMSxk:~^>F隦o߇4uQ5MmiF}xMSg.HG 2(貾,xQ_Wzj)rUV H)Zo (,r? -ڗlr>r[XZHhSu%rzIi>E9lhzTdGB4Rzs L7Jr_2|3ɋIc:6_ 3K($$B" Y'u*K7R(fZ$g a0,8{J!f)ܖxe={۝voD(:< zʤݼyfMzϛgDRZ[3q9r%N)(遼^Ҫ:~҇e'C,bb Ͱ<n|A0n>jIϿrnS#6Em1`}ӥL'XC+Hh?Q`]W?W9'9cj:33P},ǗZX7L <*zO1i}Νmˤ=Үn8Bo6o#ӧ!Ev/ Dozgr|`-3&?* <9 A er+rP ^lEwAgIK,tz{8D1n8!4@pLʇNJ%)MtԪNV{wyJݎr?&gO=8K-ͦ-4gq^Ui}6mfw hZ2|F(pH"oI|\SqZ^_ aNt𭩑7~6ӮBt n\Q3IT%ŝ!xWK"Ao} Do?(Zu}FO̡!~J)B\14a FrYX@GE/F3|uH${H4N=Ȫ:ywߓfZkFGkur8̼xb L)KJ^偿ă=kG n⣫n!qs*\GmB2U.,ꩵQC+{Ԍou:{]]{D.kɒ}pc`&hBoym\ޒ5@HPl eA?NS{py۳o߮Qڱ[z*nU{ĘU⩷9F՜69N[$mzAr:Htxa2# ,GżVX<ȕHD^`0ho[m쯪ŏejTv)98Bưh\w Q7cU8b %">D\Q>蓍&}[ۇnq X7p"ƍ6Om]}Զ$>.y}XF׀q'kȫa'$=eJ6V|_rjAfXPB+EK~qTN]Nĵayi%*5CBO֑H#RI7qv%a wi,y( XŲd\L4=|Ld*-R%gQ_}-m`șQ҉ѰIݱ{Spz.-{VJ؏II{ɉcWf<ӊ glx;E-P᪾< %'|fo&%8]< IDATN3Qx\A#Q~*Gz5}ޥ .tC,pY6kt^mHtƨ{o}4}FW~P `ws#g::3JǢy[4Kȍan( )n(賌D ;0@Yr>+2VMIZf2|HP0F5C%lv+A+g6uRzcgvq4uѬR)%bA5-ޝvi69L[%-'N:ieEt< JRh9'.:ߎT/Ϩ) l'|$ z )xKq6wZUJ# E˚*$sR7i.E {Os/uFֱXn<8ˉ| @"vM1Ql֬vUڡ}JYڥK{A,6 #(m3Om&:El.tLt]V\J>G\ jG)G)Y0Q|fi:. ׇúx/ Ga?~!tnKn.;Rf0}>$-8"fFL,tt5,~5ziqr6`\79T@ڏ'Է}~j ${O~^۴ÿ+׼U ܾTT5T7/!*F)s嚡1b^[dgJF}BEh >79=wSu1ٿoeiR.;l:m+C_u J|?YE\qׄVZ(H zOyIRǽ<6T~g_^^Iվ${_c,z oGq3KKۺnv!<% GI]0).EuTڲ6K(i_wRRAgS%0kzF;]W~=nzP+P /H7& m&,uKr&UnqtlvGq^f^iI .@шQ,q s\}@ci pڏYNtsPX%BӞRܮoSv.Y ՆF,/p#PaF~rX/e$xJ!*LP "ςjXjX{(z{S1QqyX>x@[ĞJ㳊Lmd)Kf5YAprqs?O K&hP3LU+|No_i?'8|~ IOϕfYbZS9(XrN{ʙr"gI3Kt BR=CNj,+ys2 S~LN$ *v )nӫk076%k_6W}(xc$3`6}`K^X;\Y=x:U>-LKw`#5Ru%S#fE,#p\U`A5^W֦=`ͮF-'MBMyߵ<6<g*fe~<.C 7.k qRw-R[\9,23 ;n/RH^C}qN)[b\-vSX/6t>xݧ ;wI۵S3K{=C:|҇*tn&=9SiVIg,0^XʊC3;I]b6?ù I5 $m)_&QJ:;@z&M NR8BI{F)`*IfC O_8~W}l;feY?uX?lt{w]#]=]-O2䒄edV{wiu'q9gkU281֟jb"jsue-ʳ5g-oeE_ӓ̐s#05b@T0uWo5q͊a]Ӫ "H0 39Uzf`~UuSNխ:lK CUjBUT@_[ô͘9DMFʗ^u1;\/~^x3Ox{_u޽ڻ,wVQ}0#z_?ԝ+]e1S__$D2-%gsx;çP8c3x. 9C[;o[Nk6\}5K3R1rB|bP|IAm`W+}Uׅ-#Sa堖zz Xz{olӬ' m>˿~Ȕ<ʿzcN>8!6ZՍXb'5ɻ.Ђ\*Εb;(\8u[`Ao|%WpcPSDiZ5`V^s5_~f,}Oòayqhkwv4=|QuXr}wGw'40M^}~|p)5Mc \=.  y7{]wp9,M b<ޮ`ҲÌYKt(ijX(½܃;rMS_&äȟڔ=i$_NzSdr،^ya`^o9808b,=tDSFfi neC{l-O!F2SaKgzc qJDKPN3c78e_w=Z|X5̮M+Tc" .(,]^,TiБ^[O#$QJRu539ގwe390q#<:|Q.C8⍯eGkE=Ⰳ)~2-,rCW}tXa8ф@~>!oמeqV o|+bя~T{sc3<)^zኼ9p->ҥ͜}/~&f:~}fNzBWUC}h2]j2qM^C{-j8<>3Dp\*M0ȀARԟ]p#R-DNw-g:9iƼ/( z`O:"{qn݅A___ubl2^ 0<*l&F qXfMU< `DHX3*0`+fEX) 3)gKsG3;7cu-SGeTgbnDF8h\ K#N ^s7bRk#-7?O጗pƒ“|ɏ 7ߴ2g}Å|*Z իn {ӊ< XO7y7ox+Y~/;'?{~> Y~熵k,rbDYKeדN:1g1. Ox)c+ʥKO}SpON7n4+H\Ъso|c׾vYgյg4 <3jcjꕯ|eo}+=3"}{kO)jJ]_ҖӟtЇ>xۿ[8iӦpw/| S2$)_җ6:蠼-;EY\򐇄pî ',`@wgp贼Tplܖ$}1[D>HRL&;e@@'g? Mv.rsS!|q3>^뒺cOPNW>~XCxr,zϏ#e9hOU̟JT6ga/GN޷D 8#*ZMЊ!A3P\ )h),:OzZk\wZc&&/>f(uTI)JO2})d j&k]HZz;$ (q;olV+mP\d/o>3d-Atq9Ёeˏ.\8{7U+GoQF/'4Q_gZo9 (k nVĚb_بN(DfEUEUȔ@kƛ9M94~ݺao Rt6Î5oq஝id.Y|zѢź۫;6淖}ˁjL~g[~j=qO`/|U ywg?7~;*7|o>w|2X'JL04{E8g?ZI9FO3=~pSV{m5X0<!]W`# 2F"DFl`?xI Vtx=O.75 ||/}ɞr8 *+d\/CI8c y@o,?_7tSxԣGdީQ2 ctʀAMAƛ_W+h3>3d(c~ O~p׆G>&Sq s\V-=q^:9< i8Sg~v7juw/K9(# ~ ,\GJ#v[y|T0׻J#a=B&c%W<,>gwyFiF -љc8PSƆflN+KV-u@,hCy XS2FQR,˨!jF4Ҙmx;><j[eR6YA),)T΢C!z5t$]dž%{%¯a neށ0~tG** mrFkBԑYMɰwPICsE~)m`Ǚ-P1T3.2Sgyy,͵zjrwj/)G[dcrsqȡlo`0ȣ-oZycZjKY4c$GӌXql!BZ6* K.a_R`YL#2?a8S4%ëGukAr5GYުzmϠ]tQGU8뎚2ba4CU!# oٲe|lKʻqR{X(x}5-o'^=F/dYޱҌ{71B_40d"^`)G$_8-MK,l26n`&$ඌ;} jٛl72=(h~5J'3S NO:OiBOywC<a(a0"'(|\xÚV d+e=e=`B}>I' - Kv =)jc5k2JY.^^vuO?ӟ)YCwʵ3ɜ/a&EejEc[&UN8Vq`X?WqyҚ?t q=JQT.b"'=+LV/:]{yWE\Lq|gLO?*KyU3Pb@in(ċӂ/KTj~>-QUh<,' OrG$9/G:tjc`][:t}ֳ9nD< YEY"d6H IDAT# qW^0g3bW_}~v= uj wYSUm^}K84J%~ޮ tghˡ哈t/Ub,=ʙd@9+ UG8h{|+_yÈ҃o~H e0rll4`{ Eadx<3F5\ZtcOA%XaK3f3Ę$?4!?( /!h>ajopQ~py*.ƵeOw1C } <&vHMuK.87eGNu ^{ϦdL)c\hրm${~ZRںy*YYC"%k0g 7_Qr#!/rXG4[qAmw G=G?'dCmF{x-Qo|ur6,Kt{|] .0h/{˦‹vk480ukKôNU|ͯw\tƓ=E/ūe ={|yGZjMi/}d׾)O}FyA3>qȧʿ'{hG?xc^~kbbgk)EcJx`FrӭO{>K3^z4x≶}Dl.Tdm%Ĕ|XΕsCnj(1+4+w5'\ޣ|3O~+VS,kC{u?xG#a6CK,?xEX~X)N)`&? mڸq#Kֆ0~, 6.&|1LWLXvt 8-ZxbF2v_|. `Ff/BgF54a.i^K-} ,M@_cƞ i8=}Lk,h?s\ȬO>UִfzЯ?vMN+̅hI@L,COŒ0: d*oqt@\l$;:uF< EI.7kH{0o_KlΝ\W`(1Ϡ1X>4'ؿ$cA ^7 mHS:ig%r%F_z,2K\!|t}O NOBݯZ[Nò 7kӹ3N\JP%TOm1"ܚlUj%/m5X~sp7'd1 [?f ;+|qqf7Ls/ԩ8 u{-'YO앑-aO3hBz߄kjO,25+FثJ+%r]lv:.h7<ܧܜ㊀@qHgvΩ;}t;04Kt4nݺlGDlO| U<4HK-Jj uS~æ8tf ;<}&Xg p гf&.}u&B܀NEMaK=,*#jXUA/t ?ol(gIj:9ױܘ=9dj<$:{,(1N7`B` {ae.-?4_b|lD7s/k$2M2*  VJj2PN2z1 F6* . 0+ RDMCkfzE\߽)z k5 X3Gt|Muڲcޞ2(kDXv@-lݴ Maa}f8>ۣM:U,o?QoI]e0CfTo`թ:<Y>!CJFZbO,r~* }iɓ*zO>-HӖǔW]yEqOyL8WwdS~ijrDc%KOɢ &,@T x2$ׅ$$I`%O\ЬxU9T=E t1w,md0;wx3\3C/<>;G~v\ՀftmH|e&ʁ+u$JϏrWT^>6Ox) fJ U3NO3Phހd<:AR߱lBc5JMzX[ҏő5FhpUGkKȢ}&pj1˄#Pr)W `ı8X56tC3R wfzI'eDiQQv.N}o0/`oMQG9ٹht⃊5bbpQrTXjFbЕumеZReR'tA}^6k6JfEK3g e} \}Q9 =⠈|Іݭ~iENN(9_u"f{\|ꗮ&ѺP?EG#*ň G,Y=; opt }Js:BdRi`'h6lv@;op⺅\}š~|3ېl9MPU~㹞 ('2Ӳ \O.369;f[3ĒG_k7mn}3WzӞN[?&i"~[HrXk͟N;z;Ly dLg C0͚E:ꋵrV|o f $ I!uJV , )zy}]fu|ϑ+gUJ3#WF4b+[54ΡƔ6ɀ 3bRj*L -(^`v 8$]C8]%:*Lu= Wx3'YC#3l(YYBOi0ᓹYqEۛGJ.g&go/ ۋ;}H\j|,>,V9uMcϏd&ﻒ?}ҫB3d@`Zps!3A;}N,k#<]ՆHEQ"+ћ3X"YOQH:D ط*4K6oޤS~ċ6QČXzH8` DBXcUΨVhQi,2h\EϒK]3A=dKM[V^YU.}I1uE6Ot,*7{=4kNaήmO[xl~R{aoM z}R 6wdS [Ds߸GX&+|JL};kzk6Uo7tL&,֗Yqԭz$MUaqN~;,Cx4G]Ff]7->1=3+ȝgҲndmD1NhA?6 aCh~RlApW wEbrOT'AaIyE~a|ŌEOXwdEڄMqDUE/e:#kMbO]FKuavSUcb]2\e:Hl`Y<\<"6wEurb*TGX5 5uԚ(.MѢKzLyEV8 JS6 ~E$a8iNj,ӑ0;ѹ4!N޽u ]|pg)LZdh2w;}SGsk?'GT-MdYf*3N yPzfXਭlOMLc0AnjH.$VqIV32!\X XګS(aX K'j:C {ZBo'$n0 3gYf8zAX@Kj yɲk:Qs-bFV}0}|Rn (o44ˤK5;1P.Li.hbQ}y<C x}΢1M_ja60.ۚnPd?kK=EzO㢰땻lyKXiKȅ7A'W99͵:2xQ~+]@T}~R;ԟ&'XM73‰mV4;^|q o^}kC>,[ yѐÀ >Piq$?#z(Ɓya\Fu{si+mPE< *5M ٟ/T4!!<6qӋ*CC5ׅͷ^ϭ v)CBc)2x4kz94π4J$O@1aa Kʬe4(ElR64ѥA"p,mAԌA\v4#f~˿=~SɨK3aNgJ'{97 WGTꗪpϕgf4#}-4KwA;ޖ:h3.\Zvuzk}wkjQ5ԓ*T'$ `NchLMZ{y-ZLhssG77O9p ']qWiQTLd*=, $:6=iUl 7+p뺭=+Z~`ZR+&&X)k=Du09Iq0[<^c3F"uT ;"Q *PsIY)m NFd|s<|w,\*p%Q7z9iUn;B6AEc\1EݥU\҆hˮY/^^3mu .y#J}W89ӹ _z-u\yڬ\4Up5^~+_LY/cśt"ro~N~>V85ҫ8"fzqF$sR3_%PKF $TzEkܸznJĝ9o Gxdě~6&Qe_\c8ɟ[腮m4 s^%3p7>)hΓ|Re>+ IDAT˙ӿoX?I1QY~?04jCOS{Τ/j}ldԫȯYjf/N'ܖv3Gx~TO~Kځ|agO0g9~/i̍GN` tmN:cbK@P\ QD=h7pԅʅסMZZbmHN_]I@ī,tYVGo2a |Qb g+9pDeq_*hb#Qrd$+2Y<ѳGL>cfFC~E/sboYӿ[PK M[W _{ujaӦMatr|-JTu *I)wiR rz'~ݨb4`Q.&KJbPd7TWU|RQ"ht ~i.7`K\XX)^G$ fðNLV226o9O/\4+H ŵzQ¨vѳGF= Ja(ߪ/x|Xwßuxa)Լ]zWӟ<}TI79vJO͛7# ,py_|{T~6~"uR$d./k/Z>eypqϔ ,gzw+?Uh*gHJcXKxk\n3$̅H T+[D9%X~w:jօ>F`W=mw_EI*pe6F@F4%#IJ.%dQFp{::2&{m#aldR,lap%djlaҭQnl49|Wg(j*ƟTG.k%V]xQzT}{|G7 vZm}qu.Me>W^jAq/s1l&.{5;'> +/ >|f|S/f=\:0fɨb,΢/oQtL꬙ )junmƚ>j(ML5eDaPeN-S-O.dJQ+1%%E5gLQ0w$t;HG>k"QSH'fKƂO)0eJn4iMI[,"n"#f4_Pkfص(kҹޅB)QfKp±|$0tM'O鄲 S9O+@A<~)Z"`?Wt0g"\s5'>~|K)\bŊs9[~/X~)&-_eoo_e> w2_+W'GV &}їMG?B_f<>x֐7ŋg?٪|oAZiŔ A%oLd`,XW2>Ƹ8Imտs2OKF_Ч%53UmXUh@;Ig ᕝsi2dN#IPd^QoA`4$j=%2U,2RNi\RK\ 7B5 JBWdcL |`d? ?ky1xbZb(@N'92g)F̘ #)W VLrC,U5yZ*lQy;tb]ǵq%AF7Z.׮]6Q\&􍡄!Ej`-;: c ~(uV]NhZz յfIt39Z'%yU>mj9~kz =a*6::Eo\/ןZ(jQ۪i<[e|,b K(dkc a@"у1uW^nW?RƊt~(/| Yb+̊yK_j =zI(,YBѿ랬?flOUv/.]J}/ /׿^#boZVD_U)fo~pƖAVFЇ>ԌR%hƩ&^f+"ZW]ë|ӛT.~UHכo? /w0AZڋgjC^F8^ 3]cyD#S9c~B)7*nv"d8LAӽNf ?"SP r (GÂΌ> Bݜb+#n\KD N#"4z-U0Le[7n(Vݲ&[3o;K2uߓ(~n-S+aj\5z !Z-1;ŧX蘈#u&f0 a? #i-S!1+7>٧Ƅ`?d77_ŌNU[\ho'vG _?ʴTT'iqZPKbA7 O^(/^QVR4z˗%'峟֦lr ׾5חfAe8lm\o)Y#ڕ_җ0^,>;Y5=s; rvSĻj-y $:|K.W0r}L'9,#iqECL7fYԂ2e3 w&]W<Œ^̊=";u[ynuJn ONOR!BF5C~Ij<htʋ lM$ KbE.(-U03QiC*E(š5rhBkJNӖ }E'19Ulڸ۪x>ۄaN1 !%RLiP6cheFۣFtTD3ޘ1Az0/!BUϰpA-bK'4P𵖄G+>lUF3:,^:/@%,~EJ fƔYq5Zazu߆yCK±ˁi9;L)%#x:~hN`~pޤi.ⷂaNОQ@كnW'+qU:gT.YC@G!gI) \jf$@ V aҟ fs.atxL0`U.Ҵzkh#2p#+rgf|0DÕ(#~=b *YY 1ʪkm0tJ}]E| ~rڃ4Ʒc[;{f;Ƶx{c㠿ibjg $1tQu)(flP\OYA@2kMs8ZVC!Hc Khc^ݙh _A&DfNdKHd ]IթOɘohhaxN};B^> n>-\fk=I|wW^]RYI Xfe#Ek):<-=MB61Kěj~ӟQU9}^o$Կ6O!30>B-`GqWYCѬNG>OWW9}/[ĸ=Yblxo|Ju DNxGGsFmbc<nf4Tg#4ƕWx[?4~R#c;0mCVw&fژ<BN:N^2*I_1bY"s(!4[Z{uB7Me~oPGjsg353dN^q9Mީ\AЩ6?o_Ǔt@Zeʳ@ ka%`hɨ8~ueaALJED2[;־dҶ[@?D@Q@QEG J:큒c%=I$+tA@37L*\k5]*1Ft{uڇUt̋ CjjMt;Jk,|G0^<ߌ|7f;D uKR5B{΄2ҋaƵ#NOpOoRI ,z^>-~COwm_s嚋|iO Aڻ`!?}G_EsfAˁO a}Ez℘2Qn- >Θ??MgGmK_g?ru.3 i&xΣ_c{Ѷ)'L~HmvrTu酼S+ߨ? [{iUGCO q  $ 1g^Ɠ[)tCoaWnCځOSmκ4-ԯӻ"4b+%ss>颽pLOاxe3R_+Lܜ$`qО?)pUQ_قDAb$Ըк¢}*]i}mf9yEvw[7oeMiIK, O(&Svql51/ƀ.JPg#UJ6giEQh];̍, A/gr)`t3oeBTɩԹm J yDl_,hƙ'RcB~F&#*K[/&/j\q.I7S8ff9OKCV'K{Mǧ>O'?b2YXO0>8dx M~E\OVn1/x&z'4sGc?昡ۥw 3nW~p;-w9x۬s!8Eq W<=a67c0F5}=:aڸ S+$/IMMxl55E]Ũ. :fO>q , @N(ѳ'T~ĝ1pRE+/;isj2[. +jE0UUja.;( yAk޸p(V\)d` |f/cd$ĭYhm6t&M鹸ɳX" IDAT_6Eh6i 'i#tVEM@ hy~!ry63) %w5 q,Yey<4ɠyF ?Sgf=*"2vE GrWd*8fCm9t  >J+ʟ˯=Uw;@ EoETQ5Z_jyǚ?s3>532sM~[S$O;e$h>{zGfH n'n~ Az8f٘bVHNj}̇8,"#b*  Hm5x$9+d (y4`g(a--#TWS_\vcko)lT֖#atXOZV+Yb3#I~~Y)ӎT )#IIM(5QxkS¨\LO@zujYBr 7 Hja'+Jٛ<<&Gy"};]^EI&=.ڵu*T$ '1Wev]"jP#u-p܇P(\0xe#Q .S.4q-|o.?eA~݁DYp,D66Wp5,=Lmyɷ|s?ʨ=.h[AzRuE00j8D, KDbOd_fɋmF^~aZScXb#x[ RP JBodQGL`W'$g*)=Y\%DuA15Z'l9&G7 .֔-sa :Oh&=KDY@sv诙>>,+I'^¶$(fq4^,WDܬpg 2Cwv#Vgw?ü)TiB0&f=Bl ^6ñ-x\60p͇xri9d;pvz<ʵK&W%wwI_=/}W8ɋ\8N2l9<ǩ"_4¦?Ŕ`׻D/HfPrg2THo,ɄFwz@֋zYpM~B3Fe8Nhmznh3G:e{ՌY 2dTKG-th N 2d, \2eKxdĪp7LgVQ;dlEJ$1 UGd9Imz&fhsBܷ%7+XGdmfq14>Jm̱g,#rc&?lps6Nlxf;w:gÛ tφ7ܟ o6ӹ?lps6Nlxf;w:gÛ tφ7ܟ o6ӹ3ĎJ@'\㓥}{\>0g ]HOlcr&+̆l 2 fD cD1H/JIGFE C:ݢA|lX1qH^\o^+Z(8)ٍ'Tx6ZK%Wv̯F/,C6I4\r}| K;? ׯԷ6 Zv٢MI>m){{C2$Muo|T #fd81{SwXIVd.XWqvnBQ1ŵbyD`U!G#BNrwS o:8ǸLK{i[< g|׏xD~#9G-NuEj;q= a99. ]'.I9vzqs\Oa$=} B&W!/`)^$Sy3-UYFd38SU7[1sUcQHh;4 ѩYb󖍜+'a5lbt# >.(CecmfA '7)3Fe@"HӊzUjaXFtD} SCX&T5@m hxfU(usX.b TCKm W3QcJ'sF #ǃe'T|3'i+ O,b[TXpJH|tϖp~Nsg~xXqޏXK_A=mۡ73Pֳ g Lߖ'dyz}*0FG')ƺuva׊1}PX~ 9&Q8Ja$*Ni o.:Ac獻jE"Qiqp $CM8t$qxҍ& .#~z[_Hh'lkHsx\a%aEa{r[y%s<1ru.˔A.'8`2M .&<1+Gi6C{\k.ABa ,^ۏ.M@ xA=\gtя㺟v%?3yT7PNKq*fLLu&)T1N]FúZ|'XA)3W $z5SS}~\Usk?<Jf]XK8@Ho ӡ%mFюN:axeEuԤ<^ԝMC tAǶݺ5['T? kHe CCca+-- C6AW޲vNq#5.Qo'7 XOEzI] 50 _aj;(؆G6`%k;=6.-/ګ޲?46Hg-/[6um)G?s}~bW 8fןxq* + ӪN+9arcn~ ӄ J@0h~U[NHJ`zoZ!tu 7p=xM ]j|n6<`$ȹ?>&G990~"q>x_Vn+9 p{vr`@YF9,5bwGkpfNڣCb٠KԘ'Gg[Tzr+[ѵI`FYd0V쭘FYmHc~*sHtk3z d")ƙi2'כ%$*6Nx)۴fya>NY3 s޾qg,cQjCwYFbo8y5fԨ|PFgexu*UвBje:ӼВ&&|A7CU}(T0f<`0m(g{^1vY:Eߜēhר!Y0O`WR:I,RE}'Q֞M VSf1pBGpԊ>L?9OȟWXR݅ 9,uz Kx6"kxyILg C%,`H6hhz,M]yU2SE>W!tJ;sE-h: klC.e8t#2&d(X' ;3r%+,j}be(erSDJnq(nJm' /#TVRߢ16!0M6r-f7mfY4 sE+?P\o8 GHGCtA2?[.V:N+ K j=YF;~TT K"Bٯm7a2Q.6q x "{9⭬A!A#Na4۳*>MeENħ00w~N}oC} pSFiu3P0k'l\LNav=F{y$[.0\q ㉏87nZyM{o2hnlt`dcUOYmd1E<},CqþJ aY!j2t%Q}W md ?/{onQ{g>!s! A" ɋ2L>2] 0  @$a!$;N|^k>Iw`s^UoSUkջߪUMdzE,q =霁SFO0ueajjQ WΘy18iZ*DtJi6_Ɖ0꫻,YNOHIݘӎœsˠ8aSlz8!A0 #Y7pmI(>\腕y3RK6ۏ^odQ2sY!<0zttRݬkԜ^BZacD>b8#$@ѓxt/y%q#İ.t,Uh06P`}<9O ۈ\D4JqH?Έ@۲p$AINQbP gevw$ T\7mCaUzAP=42t!ab#8}CXrP9ӫ]pffŒZ_sLVla^ntT]|3SW-Lk}O5"ds#9mm3~"ҔJ7ejp-ؕBqt` jJu= ILO u`-.?trՙ4 }G>#G*>}~]1m,OKc9tE/Cq|^* ,X΅,0) ow%}nxnngc# [p}b/n=ZwdR3{#TE2Rq\Uz6og*y^늤Jn&g?Yl7}l\A%bNc#ip}P}I(O>tx~R z]̌  W۶ W\~EuQG\b}Ԧ{TEaeib9YYRmb O8K(!XdQE V/:> JE/:kUV(D ),>B{yo$W!%.G/rǵ <]CFUL鑧]aj@tP~ +Ӡ1BF}\wl:9Pd4ݼoL - x %3*!eg 8Xp̢fRc FdG*b=G'pl)*"kX֬ZWSLף㫳|s8r_d-#Α<5&M7\@5RGxWPu"2ytPw)A%XKCvK[4ǎ*7\U=HӚy k7lGF4'J^s3j~+qƶ>xJ'p.2gzCo) >mԟZTdR9:1E D(ޙس~Hc -N4fdt~J P(%0IGau(pKNo~W5m#_tlP'H3`9*# 晖3|R< IY8SZ"3$}z}!ՕagI7l<0H__֮6^rtfT+a5Ly,(iYG 0 EZ PHS P7 jP(6 rMsVC׃cW{ +U a8xhr5f~ϝZ 嚈zǝvM$J6j(lT#d2 ߺ7v*ir:k`}>޼9o#+)߅LiOAL\LW~B99^x8 D| #WɜrnDocηMr)!96YG9}{#ON0۠K[W%r<?&[RO0rP/y e_#kO RC|~6.f?tAI:r'EK A}QKqΖacM#Y͛7nڴi`u՜fݫ5:&.F*كHz0.4zZEZP=gGDIC܊b=q%p4XL)z:.6:+IDcl dQtGL^2{HYwV"ښ8Wyv׮_֬[Si[ib=5JZ'mғr^>1IOL1x{9:yCyG81u7/ٚR.*(pOo!|_"g8Xց}/~oϵ)K=uP4Y䓰mhfp3~5׉:^oP 2b9! O@~=pGӌw'=A~%Qn ׹ )*#dC€)Mp M^fCxF9O?ap ާ_\=?iu=#)z(웾}>'izO7|=6;-|9V7>;|~SƇdߊ<1JGd%&LWg=}dQKgqN!G+.CczU/hﶛn;v Q+WyZ?F]*U ؖ@jZS~Z""48N1vp˃ (ū[Z~Q{=븷ܑ(p_YKYb"ch И&a?l?pMٸøF$z99D5AlaC5gڦg%9ѷ_+Oqw]_wտL21/!6c4 ʔFnAAOm>8bEл<;*~Jq ߐj39YM +0=u[F!%q䁎fsBG0"V2>jŃdE-&s"3£P Uge mS(_9Ҭɡ0m#vs׮zb(4߰NEEӤeڻw2I^HN'켐X0~$߃zk9oIZǔ Yt0-焗v,t#/k/ =UdX66mX@ò#hmUTiv.tϬcY\0KQ_RXRPGTdV}a'c맹wun$]9yT),tVœ.zݔ ;=׭[[MMMƒrvTu _+bWJ(bE] RRi oShZNH&ñ&1p*c<S;=@h$V?'G ڼ61> yq?0.0HԝPv[&;B s0߮ǁʌ\2C7FF/I:r5wV}yCX oApHu?"z82HN+MZ8-`)qxOkXx8},.^ U:RlJh#T,Ga$l/C(B/-VGWgmޫE aǎ7.vŢpjHHqqj`/FAz&Gf srj.'E&Tz'l B KKpˊYtzP*bJZo=8d'7MtfmДzOODO]#:$牏+& #cי6h'&˝'P8Ӕ޳GI,QƱ};$>8PCyWZ7od. !򻖞-KIG5R+G41q50X8@psOrx ;j4Q mE=NoY*Dq,Ep~ǿ#yH2GA %3Ie0 D !imĚpfܙ;]O\v޲KӤ[j D8Ddm~w]= 2(% Tv[kb|x\0 2hQ|`ZәS]m"/ޥcoBE[Jttv[F[Ă}ӛ ;~oI}KQld%ΫЩH5upQ1y*q[ZiRρl(b88u3 }?I|v0P~.\tHY4=O?5|;W ,j^F7jK|y}vN W6.F/l#G\Npt3ڹ_1קҬCűtdMN8%P>5mQfXOO߷_\?= ]?H[>78z%|r+P+..~_۷m<5h_ּjePi ]BuHT=4 *Qד~녯Szk}B=77UkIqf@gY D *DzQr?"f+:H\bV.\&lKOޭ?2]]gxv4iF$ P!i î15sqR$BQ'PAwI9Gkj3ZΕS}8ULc=}T8+©R.˷7^\X\ܫ>^u^}đG%H̓WdlAa%n,7u]T"1E>N4ĶjU.mWKH5hծj\s`qR>0FI4@Y}|OvjY܍9ԩ=G .6YXʁY/>*K2.'ڤGܸ(uđGjhmL!qSgK#1YA&@ѩbw)ڥ OjNJ 8vWS"SDvicTcŒ&6D^C29GqAeƳ*ҫӿD-|=&ÆrͺjazvK 2e&S6ѩ da^B'('TEg)<K\Q'@FpԄuf"z}3 D6Ki:8~[sO߼emhV_d2Ti-YӐNrq=ۙƐZ[BRDf/ 5}{q ulr8)N(pݻMjP™԰v 3Ŭl|7+?t1O&C-sz<OO2|{5$m u2)SiOYFK/ Wǎk]q(Q|4t%mEOBƶMƍQ>#P^xaoTz+i"L:2ehG'?ɲG?|#?RɇѿO߷_ܾ?-.}4_e39P.LKKʺ8+s Ӥs`Y,xW/|o۶m:fggBf<)) (٬ѸB6vK @UE[u &_ ~i gJ /솽#%Gr%ӢstRDp .Ɣw/;85ԇ-sN؝s>F@\ʵa ۷Ц%Bq -6f_ς" !JX !ĢC<}lL6*)LVFrښCfShx =8=_)ELʩLυ9aO GF| oy/^|k |?M_A)>Kz`G/+^K腭%r[n~ڇ4N"=.o.)x N?oޒԪG>_rr4}c$(WY:o}[L[^0{qrw=&ݝ2^毥sY>/@B8!I6.CQ'ɮ"]L٢yA+ψW_JE8IbLTWoԫm׬]״U;oSٻ(hqF+I&O92%~1#Ӹꫮ7MAb[7⺛!mY˧NZs䬓w71tX?Y+wZaX/~+^z߭bsrr9q-8:zq'sp( gu_3SwO8^-O-з_k'~i9Oe/_%,@e!fЂyɣ!*;ܴ@)UyO^֣*@WiZ/޼c^<'(ȡ଩#mA bEW0W1;G$rd 9,s| P ځ)4F}vp'Y`}.%wiՙg_=T7߼z;xgR-oH} Lkn>TO|Sï??~c~y3w͵ׄ_}[ni'Uy{W3\G>EYe׮s^XӪ>ھB? - ~#<_us(_{/w7MSO~Z}뗺O򕯄?};~ ^':qK/~7pQG ?sKpZ;p0Fu'=ɝ~}s~Ӟ|w\GHG-=Zҽ7:GQn{'rr|Jg8N|Jdx^ۯ"):ɠK#K+ |#!F{Afw30N/ pH٦TV Vn_k&j"8"9G'&RR+oLUBr=?AkJE|d6y$(wEv⑅0vnssn2}ëψX?ѫ$8Y{veh MW+Wi[~4mNGYmyk`Ĺ%QDPI 0yঊf..TLO1Lf*T09wBQg:nP`l8 a|CU=yf6q5 O!oxkG>1e߹^rC?TOUW^>8F~o|]n 32LSQP >C^?χvܸ%}՟Ԛ2cK޿{mnַھ}{O|>C&/| ԧ>OGh޹ ZwXir7lP_|ŋZ(ȋ_ro~ ~{n;Kۿ-[õ^ _^8՛_wŇ>-[P ҽ% {fn:8r>Y:Tnci>-ml\?=8cN}g_Ջ9²\LQ$4T~ȑ(nrr#g:[o }]S8*8 QhΥZ10 0(5|O%EqHϹ_RI4BജQ BΆE}DI>HIqiva8Q84HuvS4VD(K}&:cAM 1 .K Z4"`ZSrl(Y:5XP ^ Tox'pBqشiQ 8a>>!򖷴!KZS+9)v:/M.K>=FWڥo~Mu4|[g1 5}I1߀eF2 EC!_IrTrzD0_bݭhF4qWí #^ u56:\+ Um߹"'NJ ӂ^rfG {߼HqPX'8_T4|MO=JjMQPT7];o֫l谣ߙZ#!vv5#sEߘDO4\YoBizL(V 6D-(l͹ Ӆa=veAJǪ)\8PaXӌ+@qͿ ÆCu|i z_t&GuVD[կ|Iȇݯz?^UɽG?P(J>2,?t+׽F־\z"uC9d>vHҿwF~pІ,F?8N:S$ې'Jr:US"JiP嵢@c=tA/Igb*?.J].3L}OoTO7Lt/ڿoG.{En< j6M]]Ӕd>E90psd:gr2B&0bɰz%}Ngd}3+i~RK-p]Wh~4`B %@RHī֬Z{vbRDS°J((-L$fGg GNMpN_I:J>Lzp;rċBz2 QzbjhpT/*1kâE Lѱ0Q8%w`ݒ|OLo|l lMɁc`W>#·u55߹氱qpQG8}%Z~A`cϸWx_Ub6QvCg{WkSg '>ꨬy=[w)]Oy<9hK~GTgE*O l b#6#1dRQTp%88J۶m r ;3@ƢpᇧNӰ7?d]E\~T? d"rCiUJ}×tߛ xo~Ieq]p +.}'.zВStSF|;7;`PưoQJp7{) 0 X^mТdbdfM.A8Lh!y]-2pL'D*53&-AG!'q6v-֓|N 2 TgV7f]XP䑄9CkUkָ$m rqV˔]RZhЇ,|ˀ۷O^~J#%_Op1TgmezV>R8V•-0)LO}?WOxS<ᙿ_q- #8Bc7/WU7(eÊǦM?>VE _U)U# Sځ2bJ+SL} w|Ya7>ro>OwZGUW]!٦)\wڵkT>~oDǶ}ǖ؅&-)Ȱ^\za7qΰ^܌K\V–u$-7)_R&M@q˂̰ )/ 7bjź-Vmvg$5߲kq[}48{~g3H#9djEHӓcr9ʣ$x[1i)"n?Ր~[ʪh8('DמȪc1&PDZDqPt#\ұna-!ėjLxR4|,E7v 0#C}ڦI'ϘϿ?𐓻`n6?sO~to/ǟhz_vg>; _T?YY=AxӪwHԚ۳;mxƺzvڋa||"Ϋ UzxB&EpY kUTtŗ3aĻ}=s^W\KrYmmк^җza&ڞCk(?^״.z.JG.s.XXg3o~/Du:on<;Ϩ>+Y[n:s Tw)؋WҔit֠@Uz*ڹs' (C#r(.o|q]Iin0>΍Ws(OTc' Hޖ{efHб_z!JbGGjHSO~g;mMtrtvf(TxZ޴/آDOS©rєa(=iG*,/Ӡs,/ӑO[6)t~eLڏTqY2~{E6F:xMZ?~OwWuU Gyȍ݊fAEY6ΓV pqZ:BgD=[`hofa4m8g&jn\vM(r޼Z:Db8:r`-ܸK`U [1%V1ѻdCRmBKMѲCGٚ+]ƒ(l&2"NODLH SI&J2£Aa2x%HYc541.@pڧJ~mȢ$?~|Ov74%p{e?Sg2͚u>BDkZ;2s1qGFHSDoDߕ&&+mE>j wHJFOy9 c!J-]џm7 \{Ѐr$L(NǬ^#R9OfppSS$k٧/߷j,q}B)풯ɟ:6(?nK~Ox)9:Pj*+Pt|*z\S]aN8^?=Hk<( xJ]3;;Mj|9.Z|aFbZ e2S +`(7z*Gt0h *LK$臮Unz\Eʔu`ئz÷pp z8j[5-8~Ǡ #`!y>Q_m¶C3v,j 0SC+j2DZ?3+YT!VriE+`]N:~S8;)n EM#T&)q=2ғi~.ͬImΧ d_Tu) "FTSr|W DM2SH.~)n%b `#3]>ާۯ$|U+nv$uN6_2ܰt|i%}g#)YB!YV(%黄w%tό;O=T;O zlp`PN S?:otZQO9; hqbexx$I[A!\uMz5{:P,؀L$#>bdhup(oD8:Xf/}x:~֑jjhbҔ;FL3Q8BuTW`h}6\:ܱgOc.z@OO[Ys[V sE\)(#fK44z .ږvὑ 웮T+_Nem7eu&Ho-mTalVS3+Iv[8<3>,{aeO߷_'st>v}EɘVOh( KM>Qә ࣗi"cSwC`c?p41OJ0 WB {) PV( ܘƨU5&G=:$ʃ0+aZm3 hfP`"5)Hcg҆ha~X#Ll?*jGJխEv;r}kPGhdC N rʤTW=oh:ADQJӝxe"b"RXP\8?W↙L}3̀d{jA8NQhn!~bfv:%h 9'2a ߨe`X*R I,ځ)Ui>ʬy‰6@$2Q#NYƱlCdHKJITHvtGڈv-4;Γ}H*kȒsYːfe9>}~{=]v=iߝR_/y9ʈK0&NsRʘ0}x|kk.D ^1-(3_S"Fhc} 8GrL-ġA6I2a^vU]ZY s6O#,h*μ% )« q $gFJY'n8 z Txh.OIs&AfQ9 5;E^}(kT#*ggcQboq^@ 23ATGꗝH9x "BU'^ǔ_ɋ4pxsK9Oq~p‭29X }8 8dLɹv<(B537bWYs{4f\ܘ]烕T>s96BZD=uxv\;1HvOV'jgXí4Eʎ%LߧO ~wSIq^Ruh`p^΁BK|c"Qҗ 1g.e ]J/46ZnZ摒=05=t:Z DhƑ%08"i$)(PZ|Zո5ά|]5?7"(#RA\.N#yQr4FpK)Ax+_W@5Gqi/blL\KТѡסH]E^wi>l^AU(DShFΔMDw&*9yLiSjIHbXs T IWMɁ^D|`=AA)K*[,>\e(5, lpS?~Rg\;8ts af^Β8l ; 5N^a^זxN  O;$u'l@z8\n2=e֤CPD|s>>4Gxro6WnfzP9NP*Kx{Yp WQ^>6\inwZKGυ'}@u s2q)gZ]QIzG[i[+9VV{U[UzQ9Q8,0ʙH[D`FDŽA/N࣍9;]_OԚU=Ffn/9DhCk Ds \{=W:/ AɈ*̤NLL>RG %{Mat'V LA4M1jt[k|ZNJ:p*Eun2Z58\hAfP8>g!J:LlD423k/BtÅ!FSmq?"#7_rT %l=uӒyM1MgSg_I_qaݏOr`& 't)ĻIУ>㡶AdSEg(i`YOxіDqD6hQ|bFi](e}dǾܯ'^Kw']M͹tc7nXM:XEM/=7|9Raڵ ϞֱTsQ #To}fpҿG"9ff뛶TpԔ&(2HS=E8G^z/,>8ͬ_RISqDb iː IDAT{rp@0JD@H!/ECS\<9^F fԂF9@\97ux-nDk4?=iTXB.Cs6d5&TgxdB\v7/:6OƢS 6t i+82K˜_t`¼`'j8mD."s8gLPAv2g]ɾ)gwEg:Rk,+<%2D?h!ԏECT*|>_ \&R)`D/^2d /A\&ы Y|nI|>/Cր{r>ex9ː5^qD/^sIxy^Ut;Dv:]tq@p:oNee=91/E5׋xT ˂|Ui.3}VGQuP[Q"ݣ[A7u]|5[GuDذ~Hc47' D2z뮻nu_J4 :z AR{`]1X +:ºcxKcOiЕswz^?E$yI 9Xda% gJpXOyi5yd |qd`.4qTg938h/dNS_Z5?'eHw[SaY"kCXM>NԋSHT@>: Dpe6k<Ƽ tiʉ- ű9Nb2m˵ehHSw b^(MMNpd"\:eK(grbSdI{|)%!\ 1)|4v6z7]Jg>Zo -zQK:X}ױO]z$]*j+1-~Be4K'̋T/B`%(3*Kcgț ei#a~ A{BzkBa^mtL槪QE5nGר^,xB{T[njϮ[ +W[OMN[O:1L wjt堈/j"?vIүJ͙:Ӡº$M=%AZ$%D,omRk R؅H'YyJQ, Q>]:H_rG T#*ijg~O\9QE,f[9><0℀H ]T9],y֎aXbuҠe'WSlj??-ݩ{K]539֜I?XDS쀊'z/'ni)_ Y&t8e݃^M ^Lkr]ӫr-5imnEB\r3  B 4:O2E/Wd-^ B4J2=|>/K zr>@r>OL)X&ы Y|nSHju&ja#$4ST'G4Q^_sRTFkͭsrYQIع9[*ԃ_6ޝB/y htQp͊kzfp7o^wP0;=Sq9,qX`skNNI0b>az=~ݺ5PsڼmwmVճ+Gc'~MQu$-X'[jE; >l<jTrT((,j_)ٿI-N@)zznHOyVFR]^d*@Z'VtODcPD^kVrd8PϴbBH2>H.E:1s0N *A+ X˪4X1- (] V\P'MryCr+~.w%YG/4j?% NBijYd; J\ ol8˗OJ=&ڱd_;le%Ʀ8PoyLM>'맒_\]x羬ls_] ͞t3%Q^V)Ol:z"PD=Di"R˛ؕKaojꁵrxBmhT U零n*挡ccڔsZ֬^SwՆ p \U+&tt$kkOM-gi>,h<[9"jFQ,YK L@O-#"oEʩK\}xid#;=,'Z$DS/bL3rsUhS4AdJk&;S?4WJҸju,{hFH)hBN6PLhѭEhtd*Z} WfZ<(1Q4A;?٧ E]Y79̵>q'zF SAq,P%} Ib$+$|Xk}OUXa6ֽufA8λ TOt<=p>>Sa٨NztN+JXSO#f 0(\#%LߩuauhF^X7Q<>sڟM7 20K=֠DtX@|Б4Wٞ}pݵUoVS{UG}"O+-@Er4T֬VtҔߤ zn~VI!^rяB%"_F4*#kBTE/I,&G&3GNL"g0E^P^H0(nb1;-kmض@*@qUx8Xe1)%=+'XMk(`5|[@!bE=F# G2R; fC]޵\}OA[! bTZ:Sp^X z6G;:)S`{FmC'jPwWǙ(9Bd=c?yv0U(DɬdYh_xC3Dx_%kN,)|URCa(3]>f]gLQ3<3~yRCʸPOy^7]@5"M wq#+a)aYIUedOg3MӞ޽{ܡpWӓޅ9(EŠNM5!հ_ 1MGic6VxNQR41%Cky캥! iSyԳ3(ij4n8RJ5Sqz*pLU,w`.FHS̓' x\ 9SqBg4*m#%yNOԠ8"UE7`F"O ,P#LIWrQȦ2˥).u,G֐HEKVT +30!'"셣aSڀeF8:Ó5gȼUh}J;|#o9czcmA\Ȕ#HEO\KMC KyNDy `O-pϬ5SoSҔ;J/^K^SbT`GyA'UAێg`8.#O{9y19ǟz\8#( {qn'i޽;]n 7xS0}޻7P;|-ZV.񮵆HpT# &ST4N6UE;cqr4Ut6j 'ekddEmQ4B9RrA97r´>+кrvCfF[:hͺR]m#u4uM_SK љ:B?*gO8sw 'S /C; [l y}(<4Um`uSq@|ԀQ+4',߽.0&ثG/ᑏ|[yj6_Їg>5&]u/ό>Ao:XׁT5 J}ag~ ,j,Q@K!ȀgppR Dڊ<4eWmٲnZQ'oq:æcW\vWHݺ{Wrj-aJ yOpEF✦ctTQ& >90z7E'1Y2 S۷|fGQo㰨`}Z)=5;䱖*ASTo=imvZ^|,K4ŦmF:)Ƌ+q4pG%*BM1-O3-q[Xܨj' /OI+d#вrp$ T__tXFkQ Ozh<RszQടC^k2 |gbQI/؉'JX,!TA$ol0l  ?/՗T_WU'~z݆Cv`MSPґ`MzXLhNv??luY>wv6Qg=5 Q!*J qMgn*$zt} ḓ]z%#w]T xqKY_ XsܖLP (̂JX, :|O7ܺꪫZzK` -߳gwppI'7sڼ>Ch rj9MknVkB4i`~ݚpGŭalH=02,d0VHȡc~r;Ӊx?jd制MT}dըd7㗶H{d57ESX8eCi;Tt EџG8AGyn4 i*Q[)6MլxRMi쯤65K?mqe/J6.hKV`^_ [N^C7㨮T D.iI""b\H&'/2&G0(M; ٽaPAVzИBLD3Dh"lUt&ey s( FNdz Y24ŝ!'tx3ԕ}3C۝ʺԲ\9&x}C6yJ;GVhcت0=@\UFoC@d X!E5h!ZmJNéLhq +  =͈N b]Naռ^Ճɋ )F2pnb?}|5au,׻ϩa>b:``)~QnJ 9 | o ,K]2g4Z%ұ ~8=SO;T߮:>O/~Q*G{w/~˙G/*}7HQ⌊~w>vcxғԺKcя~zӞ>W=8餓;J?h;׼5- ۿoe)0G=Qgb\}`-$;g<+_ ycxCBشiɅ_җl֬Y'ʴ |ᢋ. {D~=VZNcR2WCi9:`ZϵeW5)kvZOhqZߥM-׎q|G;RJȎS-ehhQqtsH6"uuFuZe? yV+ruRV34> qLn~Jjsɔ<407[dSh3D$_#y%3@A3ٰN|y! p`)o7ex.r z@9>/~jc?S |߫9ꗿ&դ^w/t/'&\8ĪfpB\t[օ<77ԠGW,>m/ms9ۿ۶^a,NB~|fAEW?я`eݟ$p5,H&\s%wl[µ^_q)M,Qwv?s h:^W25| ox0#`7.㋍>qW;mokʰٗw3L/ Wx^ׅ|MozuH63/|z-~oJ_/3pO5)2VZzU{[Of'ݙw&jfQp਱48C1+GF+\zCVX"  'vTċU5w&і]-jtx׃O|rO")-gwFU\yil_`@ypGgbB:q T#YjHO\Q g58Ɋ@<9N1Ն/?AlLd d ݴ>Dd)17W[?/7b&IΑ#ŶHmJEN4_L$ ~>DV2)k=ޯ E0Ua5?zWoqK.wEF{N8AQ7;ЮVEzwbد8__8 z)E`&]UZ{&4$$(**@J4ӇOԧϮ+K,W`|eDE &=^:s{%{gZk1s1ǜ+$; To ٰ 5 k Lps9A+Kzc=nw^W4{AމLSiY=`"n GK~s}o_gqFMozSozҾ{+ckf%?+w%\Rjoy[*ej%ӧ3L{3ë/x b3v# _m~=1jlm 8yʂ@rIꙟ\ב[ IDATsT:PėLyw a/7TBѿb%q&tXF;|۪qq[~Pfn>5OdYaf [/#jl0<a;uvΰ_-6W5U_) }#P\[j 4tΙ]䂋)kb5rCvR.[T?\e~XQL7؂E<-D˒-D!@M_>Z[!>6_Nf "/$zKF_.iFK%賊"pEй'x) e&"V(&&d+,@wSv*"xC-#-;vhnǚ_kʟt0WoG_ӟuև撧^ 7-yg=[ xmgS M*]~~noPYwƂsO/iկ @RDѮ#=gK>؅NkABtpa)*9yd|Ti"*¨nEayk_+YX{**B>`?ﱗ:.|pe>g^#wư2:3*ℯZ|wp ]ֵh[~q]m/ӣ]+rt?_x@ )Bd2YP":!eJ7tSa\pkھsB˶,SK Q޽{aa̅3l.xֹXvҶwa lDڙvHޕ]|q$G-XO1֙j1dτȒ?hl X rE Lzjv!VHw%?ʭYiX?ZmgY?#]PQQQoayi@9rJ.y'pާÛiqO}h0viqͨAx|&i52_cY(3S!c+NaNJ+ed Me(1Iۙ`Ef٭MIgIą_:&]Pj;ZSF㾊gyvs뭟O۲%GkE`WOu{P~ ?߼/Z+q1Q{e:KĴ_FS?S ŗߧwcRCW8ں ZΣ󕄆vHc`2}8~iLu890a%ʕw^OCg_jY2FBC{o V>k=ψR{ݵ_4/uIR?RGOP_״! xw'3Ǧ%_3a <%wgl/sIﯣoYB ],O`''w#H}=6*v_2sW+&pWi1$HnTϰohHlESj,<"GQ AΙI: HvahSo?s[8ګ̸[b>(b8We SfP5{L`L+Do/yk #8 Gg1MַRt>d$0"f=:'.hg>7m%pTg2{$.'v(/#=Up_>Mdk.-GkרB1<-8%I*Hgn:X}#=벩?<~;p^:+ڛ޵ ITN_Yxv71:l#^Z|~5>R^C K, ƽ舍źd(MCp(t=+iCt/V=y{+_Y \;hp(ϰ^>pC7,\%zrV3_l3<1j`^GEܮet uSulA^ruqM}YO#xomx`h^݃ï骫< _kյ^;\I1 993@58w&@fa,i-qGCZX몟iӁ+OΎi۠!7g ߭>a_u_3묳'6ܖګʲ;o<ēr{Gm=οӖqѱӟEwF.dPr\ÝBy3G3mQT~^4 ?簝8ε4(Li2cjjf Rr{ڂl}yUb3FOaS9#ɒ8 HaY?kG뛿pW5{%9Qytv7XcD][Pnт3; x.Gdc:,V1PyY:'LF(Y.I-;볲8Îԥ NsCj&g>CaUK4av6DĬĶmFꪋzcg~$|O&?@xM C 8V%A `OJDb K,IprBӴŬ7k|2D0;%S.3<-i%zFt)+;Z_[ɸNh`1U|e2֭V)[ヲR|IS3z&gȮÏspRdO>C=U#G- 󏺤Zhs)Xr1MX@LwI( fjCs\>_0{-,D4|ƞCr9;qK\-F:ye&cXvwWci} OyG`01r6rC2_>>j~}y "}t>G\]JyBT\V2BE+ d,@()_z yJ,`azCn$ibqۖ/Uɧe7ժ/W^,Pm/ s>f Gc+~zzl; 1 ,(XVXP@'z0t6w4.G"RL@oI}ChqDGd/.օ(C1MR.-`K`x/-jkOE K9 Sb.x[KP푀Т`)%t[_m,-F\qdxE,~0%!w%CDQAC'I9B!0sVv= 屃8J;k^[p&aGɺ`Wu*ύOʄ(g+!>ʅT$sml梋.NHgriܖ+'[gggtlS3p.pYjFKUէ쿸uB]dlr1% ֧R|ey#t]b#$F)kyu(hٰ?MړhH526F/7(>txWpCķ(W{nzLo.zȱҤz* !'.P`aX(|ÚzյPe+5xy3[>3U\PkVweW/غm[:L*ʪF4M޵0ѣ@1.썇eeV'_ZH'#O G)㬿JтO0.l(5vMxSaBDtPbY[.ɰ`q&tePTSۦiViW *j'p~έz$ tvŅ51%] V5oh,#k"Gʚ0UT$KPfad2KDL'ȹ5mFE{@/;Y^3SobeЊ?IlJfK>:IQqK򅐖O33S Hƺ Pzw3']>,MY7SqYduR^>̈%%O1,'IPĸ6W`|qݣLa5`[}?~T#/18u~O OL{j(uJ[;t0EgffXz8OOvX\I`SuחW;Ʀݰ}˚syu[qc ۿtkWCӞ%BmXiVb {xMށG#ߞh=V}dfb~Uuy0x<%JQy8v@D'鼱QP ҵ:Py/H0%@CT2U -(u33HYa4<3i Xe`RB:j[d+j Nq<=RTmmcl̟14ZMt" YZN[u{Н,l x'1q҆Ѹ2=q˴9cRuB$lFmc\='Hm9 i"t 9nִѸL@T3ۤ/qYgWlt\W> VREŮ-;N#0aj9az zj[5o*g1xȐO4XsAt)E[\X(+Fƴkukvc%`_5Ugս[ԋc,pEA{N4u/5CW_wmuOY?"ij࿷e(o[Cgdx~/?8_^7DC!˒ 񺌋__ǭUPfeF!)}gW)װ3<&ayLv]gϞO))o&O=PP!;}7X`YNvMkC?.27D*퐉7{ak|Xo76[(C YȔ_YsT|XWARCG wY*{ʟm`L%or#UFn\߆44֏rPucyg'$>g6կy(+gd.Z2N7)M&EV )q^Y#?] ; ҳi:󎖓zqkSzu^\SG^\SG^\SG^\SG^\SG{.noojV=q]I s;3Kz K #xrVXNߍ~J8764HX<'g\zЉ'O~S?oX >t`[QCW%p߃M)Dh*>پ5t,8Ϭ<}NO~JsՖӶl26=ٸbmsm<xr^TO3F{& L'Y$smܩ[ټW"/ChZ fXӌS_lvnvLSM//W{\j, G*fc6AV6;K}c1h[p x}W.* FذX`Ra|6HPW> y{1z"aMn v5(ʟT/zUƔ :R? fJ2/3Giם|Ɨt]H&5BfEl?O'ݽ( =s!)lS6˴ה_}S)YW_q~f1{W-v .9| >Ogq{Ͻ]X=yI@L{/~:;\:R~G B睷w?Xt eX\ NMCR-S`'XADXPk0$K;#8OShONF0ʠ !sB~1Ì3 !fG >eX@sqq9tl>ӻ7l:ƀHorOZXDF#f@ O}n\@w]tw+RPB ʸB.2}Y'((WR]x5b[BP<_ܜ7Xjzjg}q=/ubF?f~a>:Ta*NpБjb'e{$É1.2tau[Gb oHY * N 9pj`G$`˓ڒ{z2XDjpfwc!N;4m\tt>㏣-5S@Iˠ]$BW?I[5F6 x%̀%KW0bp_. :,VA$%(|ȉVZ}"|X1^X˸^" IDATBÝ@=p%esGX^ew,a,trA'=1ŭ}[QR'֣]/䷡L<LumIkjhϡ2xytGޒf|6;d6iр˸ų^ƕw{8,nO"Rz=.B>Osqfi!8 @}TvmaybqɆE+6tO,kJfz .X(׻be/?O0ӫ?q(=!~:/75`s=c7 Oi&YOirn2:Hj~)zTK+D,ō~)d=N=Й 3Pb9N,I~&ȚEj l+Yoj^ijF/f遪O@(Y ,RMzjAg ^$*To*f.Fy1")Me UxF P˘XVRfAةs&#ȉ@äB",|-r}qz兴c ^i}3dSz5kvb9sX>L'Oȫ6h\$c/l1֑mޛe6VQD[ZW2wT !]g6D4ޔ2lH QIɟ긬qR;)e:l_qd$QAhv8Ia e KVP_繁=f!,E}_P4Dym]rMchRfa ]0W֫*"vBd Zo),+#[l>ށ8,0阮,4b$|T:CۅU5νJ3n25)mXL=" = 'R$& >P,*iXS:'NoP[}T}q”OzV qRBl3c;nqZ[ 0PF+˴?W^+?y^Ѹzr;l?'" N97ȸ=.L,w-qȼ%k} %iۊ I^kZuuq-VqW&V bAG4N;tg^?mw%;k~}%1VXꓟ/ƕ]dGsYV~֓u8s‚2W+ N,@D~'e*onq96:#70ڲ@:<Ͼ_IllAҽ0Mwߚ!l_6c-χE9)oqцп|>(3qǍT#8[c 'ϕew-&}̓>XcUjtv:kB]OKZPayi|bJ9|*ǫaλj?V1Wff23 D &> t`C@U Pf[㐦.cc$nUͯiZ꒤Cj^Ȣw*[MGl-+K˽pӞF"[WZq+@6f.9~ҏ5 Cb4磉_Wg|qy_~6~g.K.ڟD9ǟq#/LDȊL=KYGC&,S~Lo^xqÓ/={N<:{?>Vj9-VXH| jCj˛7r*ȠKK̸۾uUrFpI ^71~JdmI5 ^Н(fWXJTT l=]?7>]^V8ǩXpnN l^n+} ,9Vo?ե;,pGJ:nK`TN%j XتfBtwbN'x_?ISkꂊoaUJɬ,K")X0jiB#伍(4i}* *?jiD %8uSC8O̔ ?[2Iz{W{G9mb+2$\堎C!ULD4i[FiM[78Y$-C6:=mש&5]mT>|i{O# ^e4|3e{sW>j=4;c_xaC,_oN C* +3hntmb8m,<) '{zNp%Jkf)I@2-`5'T :#-e=k_veVON۪@SKS amn0Ku%$ t>OƦ yaE5S~> xN\c kzr 1 w W[Fy.QA/1 k{*+એe "ukdgfG-C"miZqŻ"Hh#wM~̱!9@vWq.z._cG(] غQ|'t:7`Gu>v|܀np2Jq.z._cGI7rGQ/.۝e-ysye F Lϡ8'xiBӂ?g>HQޣ׷% xq<mE~<N 4=? !C+pl4?/4Gc^q/-FYh?qf!,W_U #)q)6+/ K:6/2RÀ}L0OrEA )/iN CQAs1P3OUkMO: ʲZ,au/YFٮ$(,g[VׁTl)Xmmo Gp1+#易4/[[K {J%jŦ?yםl<,Y`aeﹹ;g;0| 8`gl\Ip.""+X Ll.ؑb8 Y !IJ|~_RÞx!UMLMgx=uZRM$k^ _' ~bj-,)p^ؙ7U%M!B218؀&gYf!O[)J"u ෈ З4_(k|`Bk}Tё%o9,3@)/xBX*]Z~7q)<igFq-gTww<mb@YGд!_N91Dq.XҾ)p*1x@? OB;Q#!+!NNmeBEd0o8nDQ|ǒOaNml3q".H~6..X/҃k92AfR`QY6r]З/9eT L4p~Iy7pN}2{/,Yj_E]Ky=tXj,"O`? CiN~{|Y[/}}4҈wY͑ʼn}t,-P5bcXa2AQaC HM~ %:YqI.s0`o{ُ-NpN kPC=1v:Um]Ҍd@TU[禚ŅU8Ȗ 嶡<ޭ ý +}<<s6#@gaYX ƴD  .Se >|D>OVxD,,>R*tIvXz|3D5aXZ(}# dP*Ri1LMXAAzmEiJu!`Y]9BX6Y@r(7S\dS6](K "x |-hɢZHF_nOybrl-Ru)H1p|R?|> BU(K!oIGrk:9|&ś8:]/LLK9a4U)) ]2#h'#,mH{gpUtHm&NJ ܠ@bYybO,?G>3Uؠ͞:۬R <|92 ]˃󣦝xyAd$gx:d4XfM Y_lT38 XV!!A&(ɲcE<\cgqR9 ?m2P \:r!2)~º"@ <ԋ,cVəe tPn[uPN,w 8]pSe:r?B:/S/f,[85%!f=`ftz Vɐ*ZЏ d}cə BYrE\j4oitF܈+"dѼމf{Nh-g]Gt<ׄrŻ-P24؏o'PrFr92.LkX\s8 ?֩8v޽ھK]CʻW]#ʵuח˿|'{.l-[DsM7W߷zUfNF( CuHCz/sS)%0Cz;""XfR=Y__/ZOrZoqКG̴({Jy&y$)>e{k-66=\8_w׼&obz( 5}&-J7J7JĆ=e)+tʸ8/!'rPfeFcO)%}EeD60.#̌Y\gmp`p&3O_rO`uc]T^rkajrSKz vJM~3=59 5Çl"< W!}{\VIW[׈q܈gÉlJۃQ" x2~C~(n!NӨ XZnϳV#>ќ1TO6^k֊AEL A&Y N=dq'n&yĂ@Y\!gs^PТ \e&V;g2@é~A'C]:"4-J+DtK'0,uQetXjs-Cq#J)!(ݳJ][b&1!GC!d"?@f3v IDAT^e."KxW(݄*8+˔ʾ9d_|O^o:X} W63*̠ >G7""XYϟ4R:3dsTn,G%5tI_8p-OAwYOmݳDs7W#708% ( ^D_5~}Zߧ `OrJkApn׮]-Ut ucߘ}`? 06?:z-s컵T[ԗ\T6>͡_\}L {=-HTmƕ],0T6cE'+@Q8Pznܩ/[6N5BNtycE՝V;Pm9QקU/B{rn(aO;̰ƳPnA+)ZdbK-+ lXpYW6%$v fIXxRbR_rZ'qv&\*CoElrၖXę1ׂ.L'ؤn2kxY=FO41:4b˞ NHjʹ#Oz_v]6Hm:1ȴe|[OVIWO(Y'k _VkDĹKiץ?*B@іĩ;6cPrZWiE\ik+h?%8jZ|-WX*{9<)3.>>9guo^WX<K,-.4SS:W}X&SN;Uen\r>Ra9ڽ{7#_+:VtN~ֹ7ŝ(~DU:3|4 'ǖsJrMNV37Q5_V]-2KplJŠ uPЕh]SWX L}`kJ a ' bhX2'uRGv8N2`j\KpVX4L;pLWPY$OUB5M)2up5ݬ]G>٩1ҩ{[Bn| 82\/K|-f;R0:Q 1Y>ȸ!}41\ =8 F5uhb &Tl߾[y_^? {k_Obk~C^^bej[ƪ_>ַz_fzzsϐ |7~cM#ߩo>`(Οٟ{;Q_yco۹u{yғ!X+=yO'Mk6k S _,]=s[?Q(z卢g".G2te\63sE|A B˸6 -Jگ:tKMP:N ~h{mw޿s!1^ZjW62upg >0;m\>?d6]uMŇU08g>;O]}ٛ?U`A՚۶ח_qYu[fp鬎~$2pbGhCZx{Om'mC4_}Cc};QyhX>.8*$gðhLj% fBq7D! @. S$CDrGSD*\`T>H (Y2Bw'5 %t49 AVg 18te\]dTJG$6X.f?F,xڣfRg-z!=,U 6 ;yDL]]uo|mV7 _/~qsǝw44["L?xǟ5~{˿ˡ`z;LLe4WL~=7>묳*oo~~VyK_RYmo{w~wl `5Wk ǵB׼f\%eUMgk6_VwI$XV/| -o f٥eJ{r$Wк5`;c/񬔥9+hhO6]e\o.^§\~rZNR۷OU %1CM||_Pm|Iןq6eظÄ{b;EfM3o;t@X'O-h}D؟ON6KGչz6,4 \ a60viG  t$㑓oBzG(Y a IƑ8Od W kB.БiV,RUE,M:YQo,'eDCeFDZ'҇oW"Grh;7E yTfJ7u,׬MH<%xR x;@zO?Kk|-WߋEjP?)h@! 0_^L: ^j؟ҟTa Hk6@HAы^|w|WϮoOODO~wwԂ._xwXF2y+^񜕕42 7D27q}4`?hKK9OOW}s[n0l~=j`nԦu\P2d]wN#qDWgzz2fY!)D< TZ ՌZY>bz`V\7!;d־>Vd={T Ė_c ]Z D}-[iJ/Hw}9zSu1;LL Ҳ}P&/*pH. D 6B!|MC_b;|f[vTK5ӗUSgW+ '%bE}ZIM~\U\#O 0l"gX=^#jҊ% r]uo%JW== {xc-'!ǃ:zi 20Iܬ[DBKjY4$wX$m&a,8!i |pn& ìɖQDկRȲn?Oo| ˓jC/K^>rc\ykLwPQU{c3 ?bEg~dT'Ҽ-o10˶꛾雚G>|}@NaQNa?:#hYBÂ$}[$Msח]vusZM]^īON]bDiZw2x_[yRl"wH͋'D G)Lq<1!pqh^waP >Hˊ3~ݢZl}A$ 0d1pa:I~ :Fy2{8.ܷZ8>'ӮrL1*wٶe[s9;A;VcL3PZbqLR)ezWXXj8 [ __9SMp\:>X?:ڿvz~Fttv/ +a 0M9V48 K0DmYT\˓>0BK%4 M/$.Av8?t!AYNw` bx _"ƄlYd|4s$XQi6bQevGjd$cBRi2s=G I^i o(~2ސ]~eXUL/z_oqΐsy]w?o{[}U 5?c?ּU?ȬUUUzWLTKSo(h+G2K6߬j< OY֞En<~HnN"'_vWUa6tS}۷}[Gs>( N|+-]<| Se{ksy 9q0?+qg}sR\oi .r(Jh-@iQ#we(C5~Wu QN~C:_|ׁ(|WO_|=ׅHhH >/zm[nf(-rU,Yf;v+2VKE+3C2 27[Oޒ9/ɻ-LH šyN᳞ӱǚ#7ݻ2nG!+kwc@""\\!@ '@B) Z?!G9>ʏqk#d'(c I+ч(GHF^HLOX4ZC ZפU6/,M('IyHoIU(9ڱ9(@f𶖵V18kR7v’r%xZ  =Z@ui!{`:[1d}VXa'Lʈ:siݩ^`_n)zUCwZd~K^Zԯq k'ńh2+w&]|~5{7=ir<ڨ|˿M:z6'/O&ѻ+c'~,J@Z/Oi\}6qrrs'T ~mߣmǕ}Nyrwf(mn?JdGcۗA6,crZA'Q\?j>!}9ok}䗲fz.H;';wS*/}ykyYT#Xsotx4Gs9v֡s96& 5;v/r6:E~ڷvz14fna{T]UbϕlZS9cNtn!^|橧%`eq"N93&Q~er| rGEJ=9oVg8w@™t&r0l 4cV :OV8HoAK? @v؞0" M e6m&?K[a@VvJ(YesIX^]t8wH \ q(3 `L05o<1~Q/MG 43-QɄNߛŵ, :n< *ž y {BO2!=w{!UOjFxo]^;t}6+R?yT/+o`5cri) #!s='ڱફr܊ry ^_E~NJ,=Z1d8xS* 1ݻ{^WlpڎR6_C_sZN2bNQZF8zu6%w==6N(j~Ѵ{.:O.BIwRckQ^1AqQ|pʏfi>s|򹜙)/`*C~ 5^֏9K_^"G 0+V_+-OZ6$xk^UL?IRx1_p^=:pS7TXF`1=!fye 8q2>Rx $'}WyJ=񷝽f׋G1zjL@`af,Cn3vD +,%ΑtϹ7v:V7;jlƾE+uam:b= {>(G"oɎ<&Qha5xV,+[^WZ S |HdMr5ªۜa0FZAn 6 zFZ) gu[V3-GZ!"g]1X€eHu)GHlqF"FzID1mDлP|pou{Xlz}v@g`k}{N=5b(Z y?boT|u$kZe82ǰrPFooIW.3Uu e/G6.yGK|.[h̋u<y=ϺF?ߓ/,ό(GC~yr[NzDю"k~ZrxΌtPE080f 5MÉ!zDuޞyE>ze8`ϧZQt} ^5XͶ Wl>XShc`]ӿ8 x!]EXC?v1tX+̲U"9}3K9|bHs~561=Vٖ]*femz23dQ:|w*QNk IOЊxyMK3 W>0\qm2HFE0IR I{ bvlo@.@ccD0! XY?~蠒J`]Vik^BoM"v$K/Ci~ة$] Kh c7&X @5%JMH G)J}KshLsFiARe[ڹ9hQmY-,H-wMu?|n]֠ 9yMɖMGؙ =zxHɿ6kVg%+Ǖt| pG>*!cP|;oJ=2NZ>O!;YHA?/T\_/Bg!Ѿ`33<νJzsN0͏2Jy D2DȳCjdOX Z8C&qgInk%&B4̙ Y~2 M>m6(fwhd 61}DChI[1e|I* J:웇89khciqoui$K@)&֖06(VftW4k8%CkE SA%s:J m b`lZ@neF|xdǍ6j+,g,{j6.-s9e(҃P;PY`fR`Q)6r]З7OyK h24ud1&fnQZ\g PY U;F:fw׻;OkIl}8r?BJ`TGy\aP6~p!dH$z4"@\pd^8-@'jҌ0\gJ}D+CRaiAyWED`aXϧH7(:H9@ c_j  AsC2C fGyq~tQBIr6):dqN.&?+X*rP)ӣNzEgff~%2=?qy}Y+ʪ,:Sk$iQ]zXV:C!W@|SD02.X<rYk<Kd8o82e+,&)**<~1KscHM"s**񦞐/o֘Dy|J_f#^77/Fn||q/g7[ #9~ʨXd^VR xDֹ4eeNلW]>6dY$nՏ c{2hѯX_i2ch>I:R(dDZH}-Y̖-S=a٣Ahr6Ö[f 3" I@x xwO?:ZsX6 'ɟvHB 8/>K ^%H16~.#vbY>_/5)=6.htN)ϳ7--!7+@ ݛѡxBg)ʶun!fHi \}ȊTS8muq% %#4%Cl&fFZ]^Y7s%[;AA@XV)-KnK]jw9LȬ%|jU/ rU?VW' b Q|V%~aªU_?'VJlU iDGҡձ:.O 0]S3Qsǚ萘Vbe^k7ag&R 'ACm9P& BJ$8j?i:)<@iҚu~r'?} @XCf2~G[0iq Z<U;]̜ҟ;:s|X%*@ZU~UZjj;Tt|O8v( ;\$V]2R8LZp ^%Ӛ[䇓7GfXŤ-Hynby{fG*`(RơC ٥ n h{,:M*CXP|ڵ,Q򼍊Z#& GBg?-I@""e3@g=ܲ!rD<+*y+'ݹbIO5վNl_x??mձ>@?o;CK v KʑrOTC@rxaX)w,oJҔltP*7>ԧ^;o֡#y 9s9q}.G?rw14v}o 0d%WUDE!gAA1.kX b,eEbkT]QI&SU}f}]]uR:}jL>:'Y2ӝinez#uCdцbȔ=z[ /;Nq, AL%"Nh5a|1'HHT 5`TqRSSYsfZjmͫf̚>F ڱ Nuj. }) ۫ o*7,{TYn2]p"=f2h a(}IMPh$N/a%vqpa@h D]qx2/Y$M0;qy,7Gjttl<(fɴF,{~Gܺ}RNMx{a}G4^i 2ҟe-;H#CRN4RRFZaACijP >m-Lŵ E!+I ɩtͩfY1ƐF\ u 85k CM{0iǕ6 "~?1 bMxsME0mp܄Zq'd:vKYcx3QN"Ut]iIfܵHKS O'l$G oct-\:O`LK܌4սwf7WWWQtȟjk_~^#?UV3p TT2ID ש`Jo'v ϫ<3 ,{V]-TJ/=yc~6m1kr e1"a`,G]>.(^]o.)dž0ibI`} ܘƜ^#Sv֙_yjܘ^p@g;0h/ Ȥ=F#QAze-A NJ11G*?@'ZQ%C1a'R $wCe9OojyUFe7:v3</:@ˆےem]CIʺSaD[IΒ*%X#8~>[ʂ/ ` 0M3(ӈ3f`tkn8;T !9)K9 X@?4m̡olq% xJ,m)i {rV_i$wVȟԦV\uwc&aôdi Q lL(uȽ/,qEs `Ka>.â } GhPiXId5Dٝ2YCr%C4ݼυۊʔOh/I+GEMJ&gi[mQԁ\cnn*gU-8`m/ݧUObw0^-U#iFK,^5kXe(8 0ZYNM+|ݨTAH9( e/zĢ^VshScvұ.YчFW OGЀ8_q.##6+)Ksmݮ1$NZQ|6>M[!{ӢHx> y Afj[:yka*j?i<* in;Fv+QˤWҖoG)h@j\TC{.g a~]9  '{l olƛ5V_Zw烾B2Z8 1?i&:@ȃf׷ݾ0>BsF0L-☖j({y3MCxb4rkmKwj81r68AEQ3F˖,mG`_WVSMç.R< Fj<ʩ^4xȴ˖0B2Z3)+.CKX6^oupԽic_ϝCƛNcGy6`08\CV~xp=B̃ 0^d1X53iiz[L킯}p6=/cMԴzo(lOHҺ,ɤ/y F01 j ҦXxp#\LKIijO^%\#YNi J(6V~??CrQc TT%\ӫ^_)0- DkKZ/cX'm;_]@|^-eka!KoO.?HQN0&sǢDz^p~}M4ncaC@K-x]/&x`,sim;o[ۯ!^-/֘H3wkDLSAm|ɥZgPӝZ:ndMS1YD4RR*yރΟ'C^tV:2=)±D!/md$3};_ʏSKr| @/#0Z|:g=jY1WHTZ1=QTgr[x\}eSysڥ"$R@zEa,a8.z-Ⱥlmx5z4F,-ضa 4UcLC6l[T-r^'A#)0*gkBŴ?FMI0n)i\H?s'8 c/x>ےu>5__Wq9+ ||e(@$~+_Jv+W'Ӛ?Dç\G꟮ٶO[ g[c("9h@iY\kBc MXߴl3%wr;L9Z(*lPxVy21J*vdw™Rm\!LL"ġ@BH+FOR)H5/Cg'!=^6o?/$dFj&]i_N?{;zWolU=0Gb sˆ!3c&>O );ɀ+eOp۪+hwcA:~b\(>V=?.u=v޵zm?;\nsLz#7|p7IÈb֌YoW Mƈ S6%&1j)dT[1e;}\r&IdTk\]'Y}_`;0<K<+ÙU_/#wg&2b,˿2K./~俯?6|C_񄮜_xa#W)cI(>4j.u[?as?߈ 7p_?xwʵ[x/Ro??>v3y6wID #d`h;ַ4a |ti"]rꌼEi:}'E:+󥟋TcN6zW_þMsst yx=svaH|N{yL݅]X__G>Ysͷշ߱ ,`Tx0J(_d@1 c(Y uG:IӁz  fѩsk'Yk͋˲(ܓO?t*PHYFZ#/,{ӥ֢%)7g9R1Hmet!'.0ů7{XӾh. m9fQx[&_RV럠/qճ㎫8∀_yTVJ^JZr_AیVKl;N}@//uq<743>(4pdxk]~\"V·\34O9MI./?["M*~Wv|go}kzHVURt>V\mu]z2-w>9xa4pM$CjJ|*cgI8_\>M1ʺ{ɷ0i`ėN;0&0O(LfzbE&G ᅎW]qŕGcہ}M"o#`J0 O_E^2gKvZe(t OShA3ʍhLE21xz5x J)C$cŘJRFJ0O!rh 7 J#y22>Y^kql3WH5;g$_?r,Y|Ac7M95étW?_mcG}ŕW;f}jTr!7w;g; I!7@:ӵnAW9l:Ś'ZQn1Š'8TGȐ'G}iL/[zGF%Gu$cݲD9?au{m}쇎4dc[?\IkꯝjO'z`2ɻ;v)^HoWjzwyc?\mxLzW~nZ1U,2)q~Q2/~۞Yuᇏ<yc;/c=~M}k^" e7|Cm.c=zGrˑ:5Rov ꪫ귽ma@m֣z'Ok,X< Omk4/5tд?G>r4y\ӣ.h!+C| ҕV4yw#zғr\ V[m%#x!{=򒗼w׆{QƑ"#})ΈHWVpDyi|O=T[{T3Uo?#wIj赫G;>J꣐păG, gVCe௎^{:rVj's *@c裊^ˡ>_q!h@$!m,w@@[(F$|JyEc T~ IK >] z z ~!U72񋟟7~ ijâ[5P@YgU]_a4=T8 ĝ-|6SX'oƖl5NITjtAXq% `z) |>nf͛'JQ ĀbQ*t(Pd&EY|ND̨/>Taj'mlT IYP.zL4HkHɱv)tK:I85WW^rq}o{ SN:1GwշSj^6xEK8G=FAXZm okַԯ}ݑ>~_Fy/jN;͋E]rwf}m^/oF[~ӟ_;栃W]tU9^=aWU_?a9ꨣ¨^L}f j^䑨жdݮ[?/5Fv< L|ǚqqgmK}^3sN;buO9"@;OPi.~3[aɳ0 5*%1<;q޷zի^5G?Cʥ}[A_D"~ӊ\ǙKnz9퇐kxhG#e\|+Cc5D@qK_ Y19馛6gB>2|c?OtIr=PO260aГi'O7NGcZlFީ)&l>]7Qc#ۘK5&^ԋ55&,]>wuWabN_~H_?sPOTNTSz:2hNQ`mu;{[*,`团||·? 04}dx?F၂wIEX\ќj]Ƴtfs7TO{kod73֚kUOk|?n'6d'6ZsEC/M#lPs{M7թD?|e}׾j^(o|NZ}޹?΍iޯI_ԯ~K8s;^ Bz3YYx'>񉍋5v@իa|[wOzBw὞_glеrMǛt0tc5^H?AS6@;p [tO}S5 kژ{o6jbo˖it {S: S%:p7xF-ӎ0Jn3w`An|,5b -:^oy|S<@9(O$MwJѷ)B,(iD]~N\ D.BԐzF<NjXǁh*.̜ 1>QJ]sIhƚ!8^jl$!-S CBC.ּ_+M7kmf( R> dޓo)$U_)?Aŀ3B4}J/F_/VZ 1{돫ܔ>}B JO?TFoː2l+ee UB]]wݵlT^ͮ|_ cNt]3lyugڬV_ڗq#b8ЖzVOwOO:\ =q0y/@!,\ٿjmw;Ὶj&'r/cXWy+;*{)x 1SMQ}!Fȧ>)&ʹ+7Pϐ.}Fp23g=kxh |SY`Yg b/J l5:m31`^5Y?qoZ' 4CkG=Qx&]]wd֙Ƙ@:#- $7zN.+020[yq>_=[ OESZ9*)ioBX6?u? .# SY7-]A߆C8>6ЄNuHk0L<܃ʇwŽևX|1\ }rZjS(W$j@yT_]?zM:;OL:tj,FEG*R?ـ2=ᕲ͏~D,lxG3$骢3#<')35w6 /ZXM)e~Jo$ŭY1dz3tXX~=! u8;Շ}:T%ƥzV^gmp_ DcƾAxB\5 9^%r OrW/^ܦzӞָUS,DcN FHw@yː$=;1]/3FՏiP.1$7N1}W?|_)c78N"\tEv5kb: ()iu^;5ci7|wJn!;t ' ]~M7~ekJ$H'w'~7 PϓuUI]$T!,̓O_Prg+ Q׺% 1q_fNÎxO4nǥ:6$yȂY C)''pOnUp7\rz,a7|=Q~̳|)~X?lӮQc] `%"% 7 ї%H0] 8'|91GMg <#1'f);ҁT0uRCOiȑgέfq3g4;QEZ'@33ʚ5GFh"{16% /g;RpsO~LX[oŪLpYɏN3ۣ˴^+t 5;\mZ24`J9ޯ~ھԯyտ/}k;\pvOzt^pэ녺K=~91ɺiz5e}ַg?럆 fVMQPE_z0]|%ĴmJq O(Go~N@5.*GiQ<⒟2 lk\B1aF9{zHPc[nN O?ՅiQ\Hpe+԰~2?h(k0jF\]m5 ;SZN7} ~W.f]o!k&\Wfۋ>niם'W~; su/ud|eF׵];l>2g\͓?c0|a7` Q==MV_qM+ee ֺ 7VN~!t[9hg {lL1b|Ѿb& Kl+sj7 3q*@ ҟi ĕD@c11Ai(@Q!|J:BTE5^Rv2BY-`A*Svc 4CoݯE.R8\@fOmݚXo֘Oi4КU_c._NfI; ĤF4L26rQ8ʯP|.$bvn_R튐MU AkqZchMw-+&OYґq%Uc~G`K'/hC+ 6FT:,nZD(Rwat3rkj^Bje N*>E. -nbW~׿'Gxu]7>향SnԿ{?ω`HPhJ0;:VȬ> #m|!g)>aKOH+]lMpse";M Yo6=L7S{s 5~-topSx4\0f4(/:>F38Ι_eG)QA?*2RGI zDWxI1L)^p'1ǴߴLH"@3  'up0JHWҔ Ŵ)䃽tTXL~BD97CL yFJP2~z$21jsj[eLV}i27fK } v}X"../O3Bvo~k=O뮳~| .ƁML O Ɠ< ? +ſO]aH/|R:DW5HY[on y6Z+/QB ?RS'o Ҁr{16w;plP]b :I,uluӆa0qZ KݟiNɯߩ;T .L<D/*޹} ¸)<;lQK<4\K,(Dz _bLfbtZ6ֿIEv.2h,y(S~j5TuF1Z(tD 5˜ F[O~ѣMZ6i%\āRD(Wo)7Uyf?`͘QilF\r_Ň=ve{~nl W/$k/  M*oօ-[o;8 I 0 v|Z 2[Ӝ6 [IMe`;T\K/ט}=sG]Lvθs@ NX^= {ޒe}\L^ͪ9o^]9_ri@EQcN2f0\À屽5(bP!yx$JWnOHwˡ$x {a9i 2ՏMS?:3~1M)q"mRBi6ƑRZEde1щ)]KHҿO`u` lெoRZ˯w -M'Xv_ ٩m"3E "[b*(8 IDAT7ߗ :eRrRDKL 돯+/_]zXm˕ֿg) G , Xp}pw Sy$60ԊAL.]n4} 㺜q=A8K^IoL 嗞$=\zm'ogU="5R0W0D-atTRP3il (n\ ؍zZ={fᒥa14ߺ iJï"`=|;Z Sx*+^XXbI)<TZBrtHЌޅ7 0ά6}RL):[/B;D3r蒺5!^Vb@u΅+ +nc.{$wq>T?YmlW._guso]Yti3){?ԕhQ*%|2 q6g[ \ S+pTҖֽ_7.G]LZ7CFMSwO]qZ|k̗]n.h:џB4U ޶0)6n(L"Hh:R;8|;?@Qy> I)4}6}cOxb/UF4 6hB2̕lF9`yD//Zx {lᐼWNFa6sO|nԔS̀82h3#CHd1Pf Rm֎N Ul=[$<xXɍUxtSf񧭓i5VM{ a0^L/~0x"bP{cɽk0{hK!A)hWR__}{ߎvԦYQwܧ>'_?Sx ])nW >ӣG!/#Z:h`yKqpX,?C8+7M"w[}n:pՑ ]y;"T$gC(WICtb$2p4^`F}G(y^",A/b.V݃~?ύOpK/<24>OvK\RUBMgZEǙCIn+bx]~IҐM&V.1[u# h/ǩ{F['= 6qEpy솻z]q'#|mBafR7d̃_Ƙ6ib}>FR=g,6*L%eaϓ0c=f~HK}u7$|Zت\lyؒirj{88ἂ5]$o8FkIh+̴sY9}I$e\9(-FB=Yϭz;PFN=C v˜kBe?W/fG\SU'n/)2䫚,b Ν1N s\T4[dde muҗ1AgX^vŠg+e/\s1 qZ]wu|>vOMXvlXYL~>EƜXXU7t WjA'lgt,lqZ=Ņf à(ᛉkݤ11諙D"mݼ6Ev Q_Ov\Kx&w4/t w 3s~j=oz@Xo:z^e/d.o?C|7ޘ1ꪮ-^XǑ^owO~RG۩ѡwuFD'}'ʉ:{'~ك[=뫮*e?~s4>>hF-^o{SOJxLe'?m @_>J|WPmGo~'=E/lMRm݂귿$>C.{=>U<(iDgבvB|h+6BWH=q\ȡIn<#sz=*M٘rԃs= /rX#8BrNL z^z( GO;Y=GUZ@4\xd {h΂ F9/=7Z< lo94ldpo) z |R@O" ^n^F?v%wؒ;Q.kuBE)MK@6T`ǀlkd8]i#h#9w  NxmGFc$x ?+i%$R]'Rp?@h(,+I fQ${+?QRz/g5g}al*ܷ<ƛ/ ?wp@ 9έe:q)կ~y^կ|{>g|.v v&nnfNK{.%8V_]Ra3~м7W^qy^3N?wF"qH`bMS~ ~;`/d~GTLۍT7~d-/lA<֣Ig0.*XuO #7@(ϵ{I$F8mقFQlt3ϣ[k*q)A~d ̛FC؟}!qXR sm@aԫbiAcC݆׿mY0DO|"D=l6 qqǓWݥ>2V~ =d74߽sRZ5[Q]zWfB׾e:|_=75ջ1F`6(0g +ή4pmoC)g{?`m")сwtqLwTP -V{BKz,]9H;$9k5kG'> *;&; nGOT4:ºs "֎SK1N=΅1 CIL?դ#bX[hVd2г ?'hT?s6앀 O^aEq;"]gjQ06ˮr;^i ʱ%oQ[J %Ă_N_* (kJDLHq?{,ׄ"ZÎUso|kr,m6yW?n_?ꑏi1O#oz$KkGxPsעT?ug49n<~"<5sSiµ[lQ} 3= zǛʣ].]2g;ZL=\ǀ/ݷu&GQG?C{ި_OPuT0Y>,~SUylԉ;t+x /~C(f2<DLQ%CW?PǸ']ZElxowrFÀ_b^Tz<#db*E~HydK LN|cge,z;d@M>8:d{ tJ- PƆIKVj7DUOnFzx`@ ҉/ R`7 s-O yJM̞*BgmNM0l}+Ш½88uG=6Yb?c;F >c6ٹvaa !W紊 *zz40Änj\ki=JzJ户a(qEeY']UM,Ǘr,WCT Ҝ4}\DCFn^2BZdPBUwp24O# |Њ;m,65 P /fGj,.ųc;+_IRcniD۾Yc#JOGq]]9f/}u-71<45oz85H\'"K/p{!6BF9B|46؀wߋWW*2#,?wkWZhIL?5k_g}>חC-hmDytuRJrB\˜BѤR C%볲 0h_^ӿ*ҵ# ܒ5+Y*>"-oӀc}SN/ý{5AAhhѢ;Gꅼ?ewnտcWxBk 3D:;ۉ/f dr '=ytL98PƄF~qzx%AN3* 3蔋V4 eN>%Y|ݑ{i0'9nNNUcҠB.!S||3GN&Knݞ攕}(z0J*&ҿ)))Teznfmc?|?ZK寧X<n7H|~"K{uѳ{he 0ŏ~AVeT?7|y{ӊl >wh,1yr_ݹO [6s\otգgO|/^uM!m5|yP9p.ktC=tY'/zz6LO>E%&Wtr偀t[ĴcailO/~[ޠh F1er- _ѡ2=,&aEa̘6uv|-AЃhѦQ:1cA[>c (V%M'6՞ϔw)eF՟spdjTF\`B_[8D0MiF?X4d .L@Qj߻nH\>/KE.B sS/InGGk;m]t2pAz经mqɱP?vJ58`){P@Ը+^S=Ꮸ^Ku[W,Z.3uHĭiOj]w k|1x9g{ f]vp}+^ ]!d&eko0FprmX >"{p<5Nu*| ruVէ>1¸NQm) va/yK)rSpj7tJpsXNZ 6AӁxIbOck^,Z -|)Öc:uSm.g TԃeYEx{\SO`u$/eWmpDȩ9hBGzF=Sυ]Ef^K.Õ0FlCxEV^0S)@;1yC+ Z;IDM:L2&Mƃ_}='6tSi1sԸ<Dž#tyv+_`3Ysᡟ Q7'buoMF_of[ `б*Vh!oz|C/n̙M%Ƴ(Zȫ?xS/oi3pML00,MM`-F i (-8 #1c߯?qH |4[Z}v5wHǬ#'0[n~0a]剥2Y\CltWˆcBAAPO+?(m4b]_5HSq| `Qh2 暞 זhPћo0>#m()ޫWk:R搯ON9QJ)ŋk'lzx}[o5ZaB٫y|Fӧ9(+^k>knqL7tǧ  C i9~}2J}e&szD0Ϯoh+0oˢ5JZwǩ/=]׫tuSww)RщoE׀*/:E4XS-eٝe8ȥ- 5G]iq/ЕKu)7$6K+ iއN?hqV~a>ӥU@id>Ba>{0WaEEݴ.CC/OGB|1} 4t\h fGaއ%[G6&,:1cYa ) 榀sZcA$ XyvZ8^,BWsY2k!fb3:JpQk<& $-m C? '15'$|N!}EUoƴzjslTsN1`{|#lv7M=GXO"{'j͠yߥO[ IDAT>π64D<<5yv%h`g&_ˇfOVg|S8[ommjM@9 B\4bpZse(kFuК~4=[G[7S[(;Lh<{XY l৤A)6n8p~w!v$lw~?2~Wf >] ]g*`Y|r 1 |)_|Bħ* }tQ˿Z>}v~Kx5 #UnI/Iw|̋@(6^?-/?5tڱ]]gn|i,"M021W4~GA<>3c% 0.XP!Cm7'Y6@vt>8F!o8-孜;oy7pk5c{%^+cEKskblͪ],&s z, SC/xQ߱pSK5:˯nIJrE t͔.%i0t`ATV3 7~nڹۥT͚7IkpmfAM,|W 4!YxLOReNٍ /V,µx 7\͑.\g7.hwX:]#K<]vݓаGŃEk \t"HG}R9Di c;[8"Хz.lJSc/j)szIK *9^."[9fe9M_Ro5g˫Mk<ƻ y ..(J~7 :;IqqY5bF+1 *ܨ.> H]ӧ;k1+8p} zO;:ͭfm8x%:bCDXc?:cQ6 ]A/IF8+/{zOOTG*2urQ_xӝR! fѢBiODZ[3JEvtL]n+Pe2M/K|! [r~($Z~s 秀w?fEaiE'+. [W<ѐ3dԪFȺGm9&3yS-C#AC[A?smS)I3z(iK)KZU>?>>'e %-pr~ak4̰#P˴2 t!kT9FЈ+95RdW˃8hҀ6!;Z%-Mw1yO򊫢fAW)M=:9{,;7 C)8rxa-҆zF!ɣ[=8d8O,@_ ߯wmWT1v.m|߉OTu ˖P&O#6X'? "YԜ` s2#m 31oi3wT'T/$'mO3 W'>~bQ_5iG|9 cg4/Yk|4% $"5`Jz <"Y:*U|VΗR)WlGޗ4 ]g7rn)_+Ÿ/u⬯*:7SRUd,H[o-DC޲*z-}i%{_iqr1f"CłlLGi75hrb,T& ;/aNz[|Eє jbo*ALaР:S83g\euPEO%qL#"io(l9mN!z* }J,C1TsIYi(pT16}YpIuu4K/#eHvm6H/Y$3ˏlRR+Z (_)ðùʥI0)cp쩔"3B6'{Ƿۇ#yoN5iY3M?ЇnY_K8;hWϭquo.><1On6XǹXJKXn8]8ʣ? i9ޅQ-C9fMDK$^NJ[KnS i LN,?[܎dknI_nڊ_:JXѺ.pCgj40U 2Gj,֥Y]^ wo A/jeK(BTiw@f=w۶>gTCGaP׎ӟk}ϏU_ݖ~WI6[?'?q?wyrçvQ62_̔ 8 ,կxI/VQt/u]ۂzm zPmcO~}L-.伿h߾3/u3x'lYt UOھN;n_} ;j匯2kv9=Xsuģڶ*b1kVI73& Ǒqᵟoݶ=)"_ UDZ{H>#jCc[Ƀ]n~C0̦#Mֽ_g=6tSH$*^͊,t4Ƒ"W e5R"-\Ud7K C7/8sGQWܼEzٹt1oa)aYhilцͼyx\& ҲLlΩnt3ygY;MX!T 5H,5Q~jX;-)bĒ -G1byP s{1X5h+ٵKrHӓFI`nNin_Y~AI"^YvT~λ+/Rsa@w/SjvyFr /%>{nu!ԯzQͧ>c~`AOjsgҼs!o`}E5W_?9GEį?fm(…#o3:93zV}SN;| ð,EgOӟ>97phuy{<齰7wN@◼AO<1elBk^ƙv~>ۼmow*CƶBBh Tm"nmcjK/FzXӣ 8_Ʊ"p g 8slCc!^.ev3d!QSIqX1DžL9SqƑ7^0jePg>~!RiʽG>xb۵ba9\4834: M7T_ϵx6Cp;]uCpUaCA ]`2Ir WsC׃y{6hq'7V5P/?cpNc C rJ{s>acas ( c.=rs8$˟P+9ӖBG^WuէVL/GX]~9&AH,7pnWW+n=LV0N!*y_WHZ 1AGq3Z88Ӈs4 4ڑjPy0We4Vǃ}nCz'[T>N^>6nL{O0,?66Oe߱XoQ^z]mmݦwyw- 3>7B!bv}T0jFFu$FAюAC}(N7tDC@,N ⭀u*'Zs[O@_֜s5{=\suưzs .t7ej:<vt(@(Z OxB+j U~cjpzg_| EhZxCl}ps?S|j"epX:,&u QTXHܵD&g@W kZTZu̍s;chcʈLQ?|yvzްƇہ&WQVv#s\"jOc ol7GW3}u"бMpQ6FPw<$yWgi,U,bTn|m~tq/VQ& ~Wyrg"̲7b7*9|_ ڽ1oLᏅ$܈3n+ 7 #ґ5p⏌7K1 JH EjUX飄ou[85#T茇$Tr 3il?f[οP`܄v#((Jgjnl=QNNUyχ"{1ٻg )3:b'P`1P1aƑFU 48K9YJ8o2 ?K l:R r>SZ[JҕiJж(?.ޮS@#9$ďfRGKENCHo )DQ?yԽȏ:QQOÿ}ߤunŪ-LndrVW/4HI޻4o,d0tvIJjtw{ wo_ַOk,};ܖ-a%LFB I'ZFk۰3 UTf)lw4Qf>k;Uj.⡈UСN$ t/婡[bغk.Mca~H^iA~ϔ#WN)+TUz\^ruOE |xf{ 02Q^5}cU0@Zr:(X&kNNW!BrسNpowXܠSIv37ۦ}~>'tc8Jxs#@QAtMѲu@uEÏ+B)/,_ $HiL hȓ+_XNhHqir*絯}mԡ؏GE?R^s;Ų_Yx9ԏ%vovoG2E6c+YR*ca0~`VÖ=;3q+ |!T@˲~l}HG8 nQ[ⷛj}d;2Dnsg?.ޟli97s>SuZN߱ZZ9O|">õ&Q7޿py&~難tg=PvE^`FDp+q!+q~D=:z7/sap:7U|)y@%/;w_9s y&/pmKFm=Ok?vBܽauAX|;V;=i2TTV"`"Z,uP4-17ڥ8mޝ'"|y$^y.Tɟ iK_Ȯ5kڼďjiJTpZ~EUQ #|{,Ӛ72~&a^5|{m8ݫ?A )]#휡սM4~M=˿  }GR*JuWy+j{+_3VmBt 88 .|]>6ylswWʭl [/GGoƗ3 XqBAk?xc)ySxP?CcӏWr϶#1xV~v3M^UzWsZɮ4[[' Sh~+lM`NԿ%ѢMp&Qsd3E IDATGnbûGpIl}[7՝l׽.xMp7ֻAv&L>[^aF~>:/&/ۛYyMІߚSNJ=L5yMZ[1d/ MQc hs3kj<JzXgAƣ6x~Z9[C\/ç|UةB^ۼK\ܘh/Z9$܊*SmY)YqsT)/83Qr+̫ѭMIB/&xXEk)c@"o|u'^A:m M%BǠ8i2^?_}/Z"wu;v]L4[wn fT8ۈ01럲l\{j{GJa`nEEL.-Tv%}RVZ?+jȠgR1Ť$up;QrY(S1EjGԧpk5Qsݱ' |'x#2^e z(L Z&%6rS9ȫ:]%Qpu/|s{m0ɴϲ,J,g] >]|E^!Fﱖ,~a>_~ ai. "XH Ź5/Ԭ/"|;6,U'ZWZQMm~ yhK|OH# wXяĺnhpZ|{}o:YoGJtW!zݦpG 2uwʱVRdK3JO/ۺ?s},&Zltyy ?JZ+u1PE7mAS1sbOI\LN0$q/Ҩ_S;/J_Rԡ[S=x!_G]Ã45ErC_*wt0g s_.f&OuԪ5ts71%:;'6np1 NaYR\9tZz@ 0hh.(1WOP d'ֽhI9+Qo3R@gfO"py XJѦ|/ σ:x Yr(4s2UZy LB~|bPnRV+nTЬ98Ͻ@8 G=`C!~Lنzc^8+ʾ/S%bkTu|>4j8!)+"ЀU9r5&-q:B*+J^:[Gu(m+4ϡtdCVp R Z8ͧc*Zl;W? Ɇ|%jB֢ ga*(?:q?\J]T U-X~Jdy^ׯ/J|G!'5Q\ʹ> d& 0+ݸ2S?IJW߿k66>mY{6f~;|jLdf"^QỢKE"ʋ1oV4~PJ=.W21v2vE0y1Ht&];t:6\#*AP5&, οzTv|Gדr?崆x)TVp*wtfRp.^2u 7a:L(&&cj+1@tvڻ dnF C1nˣ,j(FY6_!#Q)U$^% 1ּԞ[ MA:JBK@TP24?^BrS(8u3bDJXbvK C՝LmO,:)Ÿk\H*mmcEyDh$9VbRQO^{Rɳko EfA?X)ɼ^i?!/bHvYG59uUi~ )U8y֕垓d< EJ)G$?ĠRyzT&~H_)-͋9^'3*P"q͋GTsjeRKOdsE/p򦞑Z ,M\9v"O;n==\E38&_/}=XKjh2:uN۷]lu!:Qf Ԋ+s Ns TaQCvX$}[PJs|DC*#)R4 : Y){ȱYȫկvpOV'~M~U.h /8Q٫vnV&3Mre ۙ^.9/uwcu޻TX0+,A >U"k*4N9O%Y (3eVPˣ.f;wtcHҭ\%uy93\W3K*+hS)2 q]%`LF6$k{|aCJ/]pd0rOMa![hя~2V|o{H߈]wA?2{-_ \&ڮ> $l=- 嘨sdQ;e0ceenrpM."Wj(Ip8 ckq}Í7vAnvŴZ],U"?<*P:2HcM%uAW'l%7ֹ>ӝ:ZFCv*o:%3,lġ:w܃Xl \N!w?NA82jv(ee>)2r bCdӞ{p,.=ڶLޜTGF5U3CĞ YD5'׾Uja}i̬ D(0 =+3![ջ򱐆fC*ϡ%11o)ݞP\-˅L~6Pd"c?|_wu]$m|lfֵlhtėVf%\̂|LW&\l(*+}OVC6}̝/V9D_e"t()IOSy&W5fk=Q~Oγ9]eycn̎tw/T\Of _bx;e{g~3:#6t/SL ۶lw0(I;LJ;u\J m[mZ7̕=V)t&|oE1ރT1~ {I -" WԲbXXZN(ne@8U*ce\%<ΝU?VtKcGvJQec)֏4;E,Sp]=?,JY8-9,r;@QԪL<{robϔrdF 7%2.̋@~ \a3?(VkKQUMHfs }Wʌ8>+px\|a ZާHCeː c()_L/(Vx ӤQq垷p'lyc[tӠMD3?|c-5 7PvkAk?<>(y7lwo "Olӆ/wƢ]hzU^"z8n3>cH|†hM^RyT.#u:U(J4F׮ ǫd㠢6R _,V˅CmiKZ/ `(fġ0di`s'N}s;t*Jԉ%?~8 ͬ?ɣaBĂd~=gyn{]gvo}޾~ǁcGיgy`Z(tڲ\(1jPxXH=/A\xUUtSo)6v:yl'~vlGQکۏo);H JwD`zn }T˜F덏xLb_m=cdo{ _qԀX,]s5)ڎ c; ?'Aک㋒7UW^[mkh}sz^|F[FdmC/cP7u`!A "v_ŴشW NbȜg/tYqWBQp! eEi;2؎U$0(mm;PF[_bQl";9 567xc6 O? |w*|;#5ѹ77:o0-} Yf3ODgji;6E#Gv*G[VtG0ݭlc'Ti}] -S*F_OF돱|n,:q(d~C|SYLǿ]{=>3t|}` }x7m=9ypeu_ˁo~v!: 5ggKgRX&7m7}_2aw|3aPjT;7"9N|G>55~l|g cWc o )޿_5 IDU_m(>k~4"ؘџ&ٗe@ə7wx}wl#ke[W0脼Yy1+yR^>4H5%J;S=Ѝ :^3 oo ~&𑓱>j4|S©W- UFrAFk$$?9~f5regb\sBikM^[6W?0h|eE6ε>/Vo~aHymJAv3aSy:jrFn^#C4_L&mTFygm^(ӊ3֧;>#ZbuB,8+7&c+Bڥ/ǵp-1^6O~׾N?%+fli#8KS(CN3( K ՞sP.{wE'\\Y27ʔTnw*i$@#jӏ,pqPL"cFQBQbǪʒbzF>≯ ~yz/$o;/qc+Gc[L"}~&^2fصsWwС9y._ m v(n1rW|=m~bOd5t?Lm2c?(!؉]h*:񼝌{}&~OV5[opp.7I(ruXT&\ƛbe<R{u#6R Lʁ/UXVT&rj^>nQ-xpҖJYFZ#=F@Nݲ)7/h ^(eiﻁ{,JvURZ|+KNk&ʔgg7Ǎ<(HC?s?iG5?\UN]2bf_;xM o(SEOyךmhywlY<~GØXeoͩtc76Ϊ8\X4IJӅZ%eyWS\[X[؀J_uCyg,mF)rZRpI8 Y9~H|^Fu̯chف  *8NuK4׿z.<̽_2;5_l8ĸ{ұ-݂p|^8`m"=m'H^aˌ|KLvw>Y[g =GlG67Dזǽ  y+:KtҎ tkz}Q>AxQTg^opJ8Fe FhbYFݨ9HdX#27Ǒx|T,hgkEq@VCSe'yu}w<^gIW&72YQ%*E *9ּ{L2*7ZyϾ?ѱ_\)mS:NZgi9=;uGD~s3 lFg( sV`x:iFNJw/~M׽'koKm:|L1ETy{$Z7̶adFnBboohe^) ֫62**x*6Zm]&ϫ Ch)Yo:Mi#Pr}2^U < (8O$# IDATFM =I%ByeV pհcd乊nW(ĜG0y9^ɫcpy3>%\#gυY>ʤu#{UI\u}W¤YOżZV[y_[|b|9-絭gi3fH+)f^5'4/XG5ecÇ҇ԯ`J`4xrppU-T_MYpૅZ&-.{QR+M$GcrT(ENP@\wRb I%hz6qsZ%\br$LN .ǷLc}I(0#u P"V)ɩPbU۝#VfeIR߯1Fz0w᫵wNJ{"x~9`5%:x]{Sg߶iƿiJSi]dFˍxX)N}Y<7g0bx\e-ξ4ה6,ϖ,KyנRoH-l|nNymNLcP꯬&FY\ ]ɞykucc}?U H֪*Ϥ=:+h=a3? ۨoI?oȲ{Ղkڦ8=5X_ |2Kq ]ck)̠ib@ +bũCLE|_ԘT|(}[ΩXfp* ϯex]{[nQ[?8As@ABbh/+rdY,>PirҚ rϘ" X&,EeS'ֺMɔsh(jep f637R8uGS G**J%DA|b ei?!pۘEwiBc}Q)p @OJ3w8dK{jSυ:d=vַJywCtZcHWk~-{~l0@ l3~PahkJ>CC?Cn;tQ>KyBa ERn@LB8d\s w. 1yn;X_L6҈OOX_(Sn~p`U rDGK&quҧqP6 /vꫯ܌EnV$K^2E9ckvC&{[vt;h"]0QjBC\'^{m{}EYs-L׼Pyѯe }kJ',Ģ~yRF+(Szh ՠ ˩V ͫ)6TV\3렼m_?=PNzU:lo]O ?W}Fy9e%3w+/ ?dK;䭖%xMnlL?nl$F $'xn&nOGKuMdY7vnwP36uH<@uG_eS2ȿv<(va*Uq&Mܝ;vLa(P~Ӣ^Tǻ8^bd2}ݻ{uE; #Z#TMy4`c•PAGAs9yDw+O}+0vbA/*TbFBk=Z"vReLg-rZ)yqUB@d92]f*ÕhIxa޿ R(,NrAGXU=+҇OTQx뵏hQQ5dJ/Gkץ5i/Z-އ[Ve;U/DsgoZ[lc(Z{H|+Imep׋@6 GqJAy\P_DV^6+eK[R7.(^o=m sp*ucM#A?>U~%e/p.\|X'+>r~?7pَ`kpQ~n& S6V q3RyøN3>$N{.} /q& ӹb:xۖl:)Tph-jVWW#襫/|M^(wcoSASXbf T E~5,10tG]:?H$zY&|:>ULE)9rOw'-(WQ!S`B<)79`}+~`Gqz݅8 $a!qWqJ{)W'U<΢DH;J6ɶ+/ri#h )xd TĻKJ>xm ̓ByIZKqi>Qm47|m@yq .ޗ `w~Ŵtٿ.&qPo(2y]Sd~^uɃS?b"{tJbX-o j>4):W/ʫ忶UrWWil[_/^-fCpc+GS['_GT|kcṅNoSmZZ3:n~{=--PoZF_\,L]Ǿ]NgTBv+wc:mkޣS_jbLQu.[sZs/xN<g:C*Nb\ b)sKw]t~/Kw]P@  G ]rYrM#% ȳg*ڃ.j:G rŶ騭?$g]<ƔG-N6(:37JP42Ump̷nSKZN1`ĊmץIvEgTʄA ]oJ$ɟӅ}No5RhVGr,7RE[(UڳTNmJycɓ9ygA8е`XAu|4^`'LUA^]"3Vot}@TX+̈#~=zm:-j>yGgCJWxWݼ],)(\Z?Y~>|,wL/ٗYorhSI֛ǦKS?cp!Ïvs|aݬ]vh+ˊ۔~ yL$z.iuf H /[5q_1xBzX /b/yn}C__믿~RWTuLG|p~/ԃQ0'*Wn6K|ᶻY(><>-U5*a&%NbQr8dd |uSÎ}ěں_]{\ nb(;+}Ac0{* * Ub$OR.0ﹸd,וosM#r9c‡]H#"2<_uz|oZ#QN_NysC=o Ć ~Sૐ@eB۸+G]3cՊ=_vSu @?E;0h]9ZҌG^3(7z'Xgp_GY[>'??Q(PF&'HLڷ|'&J`l(VQx/{,94 _ >E8\stC4n8Nz2lup`~iq Fݘ᯸IUiD*>~p )EAq9F<-C*RJ/%et bOי -(y*1g/)2CQl~)]9R]Fs4 WxVu_ q ^3ֽeߞ J&|dD*r oU*/ʃ{k )hi5H# (+&GH`8C:Rs%ksky[|$TIi#?@T ?_qIZLeO6W<<x DH~8> %-:$o_9pSLVV{ˁv;V6-6\ RK)ѰTx?l`@Ly4i 1YɄrWfu\d|+}>_{PMlďlu~nCM}]qSWnuZj\Xe(PTWi:w`<3Q9]WH(pJ.:jbD謁A`ǰ>e \MR{VRI/Tcg^G=d iWnK&!M[An__2{S~64a<)&?1gt:$㸑s;l*o_cy%π/X6̝F/uV1NP8 p1T#PM&L ,5 {MܖáD9 QD0{|~I /|,OZ&,g/cݥp.n‹. A yc|qǘ.vᢍ24pq)zXɩ7IqI}К vmL1sVt߅5ivlC(Z]w}[2؃Qf1 `X|`v47Z?/,UT"SYv?OhaڽwV8(AP܅H'` XXQȆJkFCKXbu Imǀ>xyjY|Tj.)J+M)Sw2h%N##.QЩl_Q˜ ͲzLf1_s5jypt/ BRү?ZGT󝞞r}\|~KfokϡLt,Nk3ż<2ovS~}"J 0YfY.KbZI+KLk su״~)i6sMn=m*2'+Lm^t)hE؄yD`m Kh}-Hm]կ_>J\C\[]]*kug2J+M" _h{Ϯɧ>#Xw=w@zpSiB7:rHOew'>iF|ֺ.PjAa{v ;f`"_fώ GO ]~cWՋye݋᛿˾E˾o^|m^ѯ^rawY$`ºt]w}:`+8X(i K?RXHʓQioSrrW闃""u2ulk=hM) So7 zv>45J2eI<!8#6ԘJ/ڝ |yݮGAb͍]H~h=+,!Y>ۮ@lجx3>m6\EPI7*ߋ=VxJƬOY}upG5%ԩHy-ʺ7fm\1ں8Zye^oY>tS~_;z~iSxIzEPA4y'N{.EYyCnVFI+74W_  g|"h?wvVaaJO-Lme6V$6K}=pS\J쿶wI?>Js>H)[:hwyWw=w8 Ya8%c3.ZņO뷢i%2/}4}9+Ĕ`SPR ^B"4Z}y. jOxi8m9e%4C͹u*P´tkwcv@`?~Y6 vc}OtlN[&( +^nWS`l3E8Ck|)_A67oܲʓ@_ =k@Ǧ5 RB-=KXL`ƮG|QI@ 뮛LW~&dbu؏M[ogi @GB> Mտ95,+<乆b~DgGר_LL(nZ+<˓<:]Ǵy&#Հ`=m75}ĸgsf=(D 7n J/}i|L@SyGsӘW.KޒvIyxC]_ i XbK9~:2]6h-Ri2U IDAT_CƗ{9밈0U6o)Lm,E& qUyl-_?,WN8/,IKH<Ϙ!@ܞ]{}恝:6|ӟ&_ԝ}9W^ 7|˭:QQۏ"uvSp>tsbS=;r۷pAW 寴iN.?_wh G8fE ^CzS7Ycnň*gO~ tO8UaOS|ERY'%̽(7PPWMe}k*p+QD>7lip=STȱʨNZ{̔牏ub?Ɵ;G/,*2FGl 1䦺n n BFF]XfMy`gx&tVF*ASQ0lc>GX=vw5 F%UzՄgcb* ΄~С`huq>o@JSo*Pj=8<UXBἎar똀vp#֩pPkUMܾ!D!ΐmqlTam݄Vۿ-U"E~EGO[A?߉|F'͌0.D=sg q,77OLIsh(ϔg| x;-Jb C#M^VEƋ{J/;|\q/X)1ƐI{J;O EtL4^//_90Ow9ggh:@d|3Z O (y*IӞE w݅>nqZtv9_vU3tU~F0w*V<'ɒD|P\&~|NSGdL=O&tX>7r-a 7c='\;5č8ņ.Lɯ8Ƽ<{B)GyaM_<[b`^8 p*LYy?T%ˋσ_Z' rL.V0-_*f!(fki<,-4';(OOwlL}q)vQZ k[(#>cN)1뀲l ߰#|, ~2RɋМ8W&~(K3-+l2EaZ똾c:֖N(!6ZS~*\$/ne6@ͫr^y kwF:1ʴm¦SJp5SZZߦ(k.L)G7*Kˍ.mkH%^/jS~',F?GbY>WهkD7R)J}۲ka6;tSye|W::`tpv* o xrƵ:R3@Ƃa &S34fL?\-lcE^k:Յv,|P +#E;@E[N8Ԣ;evV?,*+M JI@N[,Dyb=.V)8Ĉf[(0"xnL:fj}ʜ^ۊVNN'^~@d_ kV(*O* '=DŴ"bjVUJy|;kEP*+{ QQ0 qVm!nm5YT py4 e*z[|;N8ۣm R(OX>Oa.:}p/< yb<ۮ"d|# [Joe2ַ5|kξ< d`uHi۫eD[^6pXPR'އ_"ߠBk3u6|fX&+p1Vn9 Hl"6ÇЭRoPף yu¢ X&L\&h(`k9U匏ifNչZ?Q1j 3ʩWySKNr|Xݔ(4KZt7`0%o{VmWk1G mM(M? ?wȢxVڼ$iSxHl1VM%-э`7{L*ZsV(A,S5N9jL(e&MWyE%K3S5qRc\ϻAjxoľ۾`AZq|?)>˩/G!ceSz(w}GPN2ri6|h|B;(uFXSkF'=1z { 0RA7?$Π/ - ܇]6V$yDʈ ~kq ?p2- 9h:;TS|J-UaLX˄wNeRT3\2i_)N+]-s'B* kUrpħHJ>ÑSI ~{~Ti=_ҫc"!Q5,>i<}c43Bq#yZÇuө~U."VݼX= 7~N7&gAߡmg-7S5XMLo?*Pl_x fsME!>*Zz-O*EN;P^׭`=Zs?plXٯ꯲b@9J6Ph8͐ iEچɟ7%)?j]ilKa)F477ZYv.%+ V S"s҆ /`솑; & 8VhDGx0)> yq0nŭ)dZ\8]]]a_I<meEKS':w B+]vtH+S-NXhͻ k%9| Dfp8'd8GNg,Ǣ"EIJ( ' 要 qGXK}m?Dߣ8|`e"'+(_y'noekb@;Ni lb˴%]Pfk4Z Y\|q)#G֝I+c ?&,ZNymjY=#(Z=Tڔà^+ۨ`da NGYL;qsykp]LqE 87֏zS\*`7ۦGyie39iS1h GV1>3 i_[n@d./^7c,kzS~H6yͳd./^7p|m&"s~mx4ps0|en&iQrӰ/Ryަ+cqXV3/:ݮ<^f NG)gT T-"LZ%/ƀbN~e4B-liIbLxK(!S⻢ >QǪnOqU4x:ӯl]jְNk[{bb}MҬe>NV@8p܅ܕ@s'p ޴ Vy 3g1] |1(W}Z]uՕ= S1.iVe):vsn!4]G81HI)(*ԭq o=b; Z&,7jM?J ?ڄBS>yė7={j4U<.T⾗APX+8fVd=\8+OݨiTT\2P^XFˏPS:w:~PM m*ϥlS"S& asb`&NzWl)ctX&4w}RK.)- x:_tE[*ej{#Ԁ(\(i (]*@Ǐ XyFjbP U3Gʕ{#T~QkS.E0^,@rmoStd֍ U:# Ky*_(e=Ѻ|BKpZqZKVʓqJiՁlBIP8~<htDIRS͕JS eK%d@s`#ʓWxK<`Bi ISncU#lo!SZ\Ic$B2\& bpu=_ YE!_Ba9Q' s)g`2#^, J$A>Ld*+ôvu8"O+:st,P( ɖ*BpҎz:НJ@\؈]ߧ{ORXq((,/&䤒"4twmQyI%=:\HG` Zger-V/ӻя$SL/>Z8SZKהeL˒[<\j-񏣵-IƍUÇXYzAD:bT޳-XrODS ä?j+$eUԨ7B <+t: 8\#?3Vn51{@ .уşIŒ`[WZFDs WR zPut7;n :Hp[CQjoEloӞl\?S+/$RFQF 0\S^G2'ܢä'Q*OS!(_Wid.4J!8j_QSp`#8 z )&[.$rϥU酼_^]/gF|#:Ҷ tNï0m?ׁ_a<$Z#̗?mZB~ bf;N2R/|^'^3R_Y,6(]ddWd}m,yNgO)S]KSh1{Ԟ׎AQGma|M7ASKP cVA~fU0(%'V) G6BuIIeQ\2٨f7$=acJ{G‡I%k~i=B0v##~Qgs [PB_mE#!+/~ݚ'ZayXT&֬9|ԶUrQl16 pBu)D8a؋Enʪ=5l{qցNam9g_'EۉEg} _B6ջ JcN"flrıAɠnegcB~:Xa8%&\uۖPi"{ _ڱ f)Oi$= IDAT:SnE4C8ȟoᓟ$DWC->(:./&EQ;~*E1c4D<((#lХ9c&#[n67φÇOߣҳKԍh:497녬:ts(!PSx2/z`qQpB"_%~W8mܤUPi/V&D1j5P剔JE(Qz) qR2ȖʑGRa8 ~DK*e.g|5IsA3=N˩,9wnSk'5ԧRFźw^T1S|jFKpc.KSp[&S)BvX. q,+)"IzB%=6(nN:p;uʓz_Q\3wwzHg! yR WQ.*rE8 < *8ePp$AƐ9!sB'y8]kkC:=T=gZV ֪Zv&K[[ckU~&@7[v_tMIo.g8uҗy2u`LW=+?22}v2n&6!qWњ1e4U?"k T|[b5 I}fx7OVYiGaX2ϕ'mtj[:9bNW၃1:O<^h5 73y3n]!h2WxHB_0A|*O ^ToKe bA;}ё6F)Uμ]`P]hy>=+!nVEQ x# GYi:Uꈶ&t |U%~gOb$vAbE);7#\Ҍ4 㶪=@~ݖ} 2ntyjnٺYCCVImiݭ玭_^뇅SO;#r)jP_m߱q:92 0V|tSbZ}'Lp1ketͷN7f8#=v_&jbdͶhCR3i JѪLki2|'p:f>48?vwr~YЎfv%&2i?eU e*LvX1 ''v'=8zz鍲gG "ӌf^r:y&<#4p˱b[,~! z ^s_g8D0 pqy~k]w9n+QI81ҍW_1G>e6~CΖwuqQduvj5sSt]wsh MgcP0[ox|p:Z.:vܱ;Ώ)<ؚcRXbJl//Mز'@C5w< O!i!/k mqaG9P-rBh'rud9a쮻}e霐X)sX4ፍiIOh혤=(nK p9ƠgI(F@5dwQۋ iu*R~#dLri#ܥ4`u Ó;VZ-KV0zQ=F P:m-;V4J+ X-9 74X}"hy?:IZE[1X~$[qVp6}7ˈX ~kEmE x'q ׼6,ƗLJYj1aHnWZ( a9 Z@5|qhrntvxį!;#E =\\ qpLsx0Nj b<Ԯˀ"1f\3 Q++jz&mB3V,Nb@f+P8_QC>~4wZ(~[WձN=OkKlNMFҽQ5 4 u\;ilҬ&+Iqn`|qc;NF.v!?qC;VZ͖!+W݁e[rL=u%m1c^uR&/>>AU# 3XQoVDo톏zj< +mKMQAѸr8yE˨B Ho<&G ^vlrOp.-=b62͸cCњhul̄ VXɟ0dQsuԊNVtҭjw]uN? v FF^jRrWZ [iq^%Oa c~Q} 3ԴƖd+in7vce Fcxu yp Q.ovNPӲo+L<.w^g˴x58V@U"ѓxA>LQG">kz.⑾h^|({}%?R+ߘЌ/m7/9켅?/A!^ߦ>Xa1֖57W X*(?8ZW4<=πrDPw58g+ C?l鱅'#Ⱦ?"ǶX cbǠ@@[rlqVt`{Cʗ/@>u5kց1]R?Ͳ&9!JmvlO[[76 B86#i\P8s#6o< va0jԗgXfD|G. `)4Tʟ`E=wd&'#TQ7_unex`f/'_CCR-OON3_upEp /?#9 yxI{Zi]Ù~Mq,;tm/#=LKMCϿgjOw,_i~QW"?Y~2?jC$\,ҝQgD 3́YUC^P3}F0pY cۋ쬽2i l ۛ`@yy)8Wu-عsO;4D۰)ck)Wc2lN eҹ%ʡl(n6=MH[NskD;)>XW/_. ')0dAF =?9'i(Z38eˎ|4-L}< 0;dzszȏJOџCbcvμZ0wgL^N 6_a "Q<鐡Z Nd>ҊҸM" \~Vy0n8%C-.+<[Qe_ Z\}͵c뽵Ǯ;F2&ߺu1ne02(X2b>&|NƉ(dƍ%cH#VncHFG2N2XsU-sG&#:pc@tf-;}x}pst>>ӹ߇w:N~^;}x}pst>>ӹ߇w:N~^;}x}pst>>ӹ߇w:N~^pm~SܝD:! "HFzҳ7Y$;>l~ؗ_^cdqcJm_MoV3X!*wU! (5F8MMa;2A% cW5'⬎a+8.ό$8D}cK2a0rLuU׳Dnx>ԝy-o8^]~q8Bg_|~_?EA8񀌿  p0Eqv5 V -Tg Ls<&u#V@ 70yVgu-Mkaq8 ) [-bUFF=j1=jJ@XQVtp hakr0T6ql5b١yqµ Pg F.8/]K@ԁrfbQ˓Egm%Z\d]fg‹uaa5}Okk[Sx lpOʈd<Ͱ#9ƭHD }I_,/m8!ØĘ6,t43F"@EcDCI/M?۶F -8.<>m̨`O]`ēgyatKkl?~c93fۄY1PDfi*2QVO"|EaJ)IW›}|Ƴۃ^/?nFm:G#W ۙ0ꐍڢe,NuIBvӝ}PbS^~hV)\>A)gLu\.z +!WQ~:/,Êuy|B3,/ȿ_1@,qNx_wC,.#Dc[|0 3~9E\U'0^YտJIzs$?iV[u269C3GXiҲp~W+B/bV'D=F VܘfT1Y d >#0#zKc|b!QBWی/h-u?u,*p OSoڟjS.52)3I,wzOArf aүVy*Y}LJ>x!<7^ІTthVVUDˇ|yr_Cc[WN!]As5b1NC : ,A/?44 _>.-0ꄈD]` Q iKv >qIVk˶XY€ CmBM@t#<+CeTEl 8xMyL֫U'3GHmv4 3Vd(ٽV ?_1bđ>~^ IDATgbeŊF~#2tݶN[fD2B:y oё=uI0\'6qҌ*۶17>x^4HzrP,:Ǎp{K$3I7ax'ʢCq32⋤)|CqSo n2j>CYI8#; p3ȐcBYAqX",<.Cm< q4AH/;!6_* ,WMWDX!uxm?BE9OǓ9%gK䇱B=1N3]_Sׇ|0!c @#j"P|ԁW,x.a9jPG2mV&v[TgʴE|̪ъ{>\8q@:C;`^* mqXn?m4܇V/' appNa\ BÆM{5oq^T~/+WsKD]킵ƅD4ȬB($fڅ;e4p[8+5LجHi&WUSZze_։8E=LV@@S/ ~۹) B}74m﬿/킹S>&l\F$Q–'e Xy#pw< 4K CMDY^\ψ[m4H0N1wM#'vo,86[F;i|i+p=ߘg&4vyx Ez_>g^' { Gcn_:,4.VȬMrJvH.-=+RS:Hϝ؏rMnhR4~0AsCKKL.ѓx֘Kb ^1}? V9`Ze꧇@;(&Ӷؚ lgY}r@%xF5nD@oA/x2[ N^8O#O< F^mha`L0J` Zw$ɮQ}aUq cE|:0t %72 A8ˆm*nOf(h&;`G +.Hᱢ 鍸g#uPLu.?҇},?w }_"6%IZa_7q_ (CȘ1p+i+DƔ1#Į.P>( (&u x'GR&l=*.XMؔr9?eF>p +rXʘgd?>,|Q+ݪt{Zc2ɗR&\U~]ovfG ZIZ^tvd5^_W.}b2{9ngͿw>m#qb̨¿/?]ߨ;$*]k>Bq"hP18)G<=spEm* t*Z3:Nбߗà#;d֌R6<Z sv9=xQo=0r*G%5o[G,+uOøRƏ#lœr9!?N}Dnc0|*85 O2"Z[?r u>.uZjUAVjQ3 IN\ȧCF|λ?d/pƧ6 L7B(iQa $#yxpC~< _ / pqO=>7T>ˍE~~-?.@XjWZB_1O|rrw23B/E~#abC \;l',#ѱ՝ۘۀrEU .$T`9^ ο(3 qgiZ酾)p畧;8q=- I%i8qIkuOa~Kk$4ڸaik:G\ON~`w]+PW`Tҝ7,,+ -"n8yr}KBЙ?z))OџJL7~cLp/LZ{u NuR }(h#Y>P(ΞO7*+SG_Ə̿GEe_ Y^#_P`P"#^7hFY]4 C*yRɺ"uN/sh)nܷWyD9L6SP-tzgd _o˄pX-?^-e"?K ]&uH? 4=QWCvg@9B :44"n.ؕðAuX/D(=!S!?B_Dy)Gџje}M}kS!Ŀ@P䢌t@5,fd9b )v\ -\^nW?N&킵BuW]¿z5ٸ"v T8~^V` #v1^E a#-yppYrՆx#_"ʠ¿.SsVJ'1^7gE*?ndݍU]Iְqlp-+a5NܗwO%<оj4?'zˋJ{OJz1lj |I6~;}%}0 5Ҍ(+ I( mX[zU3Q/kH?.3\tMe8ǏRPH:چ@ڸ*5Ŵ_67ڏ DM ?E~D?Y0`so에W g@9UBC%B~M*TW\:ben+?JpqCøꥥ/JNv9"?M?آ5~}_b^9\{рdcy Fߪh.đ]^wWUMW(ok)F]D;?Zgģ?G#kWKHY4F2WRZXDO3WǁЋ 3$u?+)..P;A06qqW``.oрBqQ*ۯU %!:nV=>3矄Lhex/kȅ˗E~?Ɨ2~!쒁 aΞ/ʣWuP>9Lx{onn!q; +co)\?I89~κnoR时Ҏ77m@9Bڀ T =s95A2m!m¯6ÕU|ph mzڸ"Џx _pmD^sX6q= am\iVG/6O"/I9KZ渞6xzc8a))?3EIt׵i `TҝatW<9l7??2۷oL!Q^)s9=>6e^]d/^]TU+_FA nڴiSm?Z-e!y ٭zӯ¿"?Ee{57nܥǥ"G 2[JW7|Ka*t#k׮nٲe\}s͚5333S('Q>"!34WGRdTxƝ'0W:VS"Tȟp gǎzaݺu8sO俇C= <ߜe Fb&2Ah*T+My>rʜXUL>4111ܶm[!5@F"5GX~]Cdv@!1fڅ+E~**y]cEe(G??+V7wPTӱT7!AFψln+g"id uP Xb1> =L `leO )e@#FndZƏ2~B(π2, x[ ۊ+T9oۦsȏs"Elb(H.1ڶ+  )Ӗ}2g@5&P(GBBN)3ҍhHMj㺌#J2~#8 Ǩn>;20 B_qO|(SqXa?ʼn2DgKp4#};o >s, ?D4 2~d)Gm\QODS|OnFQX<ӌǁЋ O_"?(Gޢ(0\F2~ e(' QOqOebk=5:Jɵ$gdX/s*#Q'e00ex@DAk]#8QL֎zX?qh "lE2Vr`Qxy@W.V :=gPGo E~j(SOe``j(qe:Q3yP؎-0oLY8Zq }ȓ?$ E~jCO?XQ2~DŽ2cM䮘tN_:.NtӜW޹%ەckEџ( e(g?‹h`^f{oSRGz*ZGLkmpu zg#V+SbbQOqYƏѠE?m[\nPuBD+tHQzgd2*< <)SqO@c+u$$CF~}1a ('d!YqX",?d$DpqT&B%YB(+",*ÄeEX䕒 F7ˀD$4 /..XNUBzWGӚQƏ2~Tƒ3 uPdu  )0rEFeնB?SQz4~F2 (YwC΅&Vo8A0\2xSޟwNAPepi?~ig@R̆v-ymEB`XmӹS961c$emlTiȾοm3Y(teGZ=9¿pR,*3ҙ?#^5YϫexZ (m h BK UT'>)SƏz,eA?ȃ~xs.ootï3ZP胢d&ÚA`0m{ylPOk06lbxk\t?x3r~_/]_5X yK_;>77xۤ#/(Rjݘ}у<1??0711! 98rFz^_?\0K_wl~l_+W[z8'=u=ܟX8???}s?>qĕWlF9rd1<{~>ȟ#j$;R-ֽ6be.=|3>si،49cO=wm\E/zl[:YO:餗zٮgyh@Tj=v \2x&lq=o' f&k?̲I tI+0!u MmsֶN?P{[~1a#~ΝMozӲ~S/}KӓG\I~~wZv+^ZE~Gh[;q;R=z]zX1.;v{>K;—=1=V+K7ܶcEVJ_uX@H &?vwsٲe4~l@}Soҳd;. EX [#Ze+VLO=_8wʴlŔV&5np ]in0mٴ#qýL:komL2䯂zUUl'ڵk(iƍ^WO:ޤO]QjG^=xȟo-qZb//Uw IDATӅ_7Ez(eLsZN[F__>==; ')֫>5s /cNZP+NXcc"u7-bHM#OCOh%MgvuOmQk\l)YK$<<^O_wD'*h5 5Ѧs3;6,q3ֶvƵ$~9ώA"ٮ2UnM7\sy=e^v oU sc8l}_ <+$=;1-,ϫo?LfwYݭ}Klәg5y?CQ2iE/Ug1|H?X׉'V/'fwס?}u\L6¬ؒh˦> 3OIVXZĜ&9mE+>.(}NciE;5:LŻY}?g6>=&O96}_^x~r/ˠ`w٩Y=M0kiYw5|"(W9~7wN_s1kWܔӕW^^Wko*m޲)=ǧ'>bLZze:³^9}w:a%HUۭ'wB?}uVg+WW<g 0h<#H׾*<=(]|iU.p`s{'tǼ@&>a& UW<9铟3]VBN U"UO"l9yCŶmۆ~_s>BNzd_2~.o_q6xD otoOo{e]:9M;_8q~׬Neԧg̮^ھ3ȺG~S`uڶ]WЋFBkeiSϿ9}(nP38Bohq_P'm)hQz,|;S'vB:ӊytލZ6]^_uo?Huj.UFXZ( X:?i}B]-?EqB?wYVK>Ϝ|^x B;vlO˖-HjB56 ߆S?ti=ҋ_t5פO>tק}iftw:xm"[]&y|w61m0jNşz|MWMn߾j6̘ i_8()fγm];w`bb2e@Z}q"}/ #׼F_ݐ>}ɧK>yuFJ9٘p+gzUd7عc}m$?55m-o8w/闦?oz&ӹߕt|k^}yQM=dvKvW!G!:C1"t=a1𕗲DI脕T]Ac|f.탴SݼsG:nT:jjLGQ&t^Fd#JUZ_h3^]ϦOC4i/Vb\9J벆K>]Oۯ8r?MASw[gy|K֝KIpڳOJ`xU(:tg>unDzO_U', " J[lIck׮1c8֭KG _Bz_nҟ韦c=Ҩ3砨S_  浪 :79!ގ6W䷞hKT:5Oܞqk[mkkϡ'|ӟ6]}Sbq\Zfڶ}[A~۶&?[~wwY1E/zQ_}a n15Va4 Tg3Hַ1p)MIsDJ;4sniqݵ#tONӟC[zܷ>t'&mߴ!=*GXu/s,}p.xOtifxB:''%y[9wօbhs꒿OG=)='_%M&>'?z? ~ x3z_niTS{BX(ؘbIEcUu_+N ˣ  ;ߧKt? ^2~ cXݏ^;x%$[n%؏X:c88o ^%wpMoO_=Y#e0_n*aV_<@wQi嚣Ӕ>MinZ:6(3Q>^ʯ`.9ۮM'<U<_L_['?e=9(xoVFϝW_WG>җ @k[:Ec&-<ٮ?$_uxjzk8OHw{Y |HWv=wfvǵ餇<*^c;.jB8^N; ?OO_x Ofš歽ot۷>ߑ7ߝN?Q4غ!8dF4V2g*t\Z~ +GV[y\uU^VL"}UHk=9cRb1l=iӛ,ߢUq1 rJU[~ԯʯ|sȜ&< Vi8 }oןvr$UJׯu]>6}F'5a-#JC<},ۇc3:4##vZEeu3sD<ҝ~ݷV?ܴecqbcӚ9/X0r6QNp33ێāL!3qyn|r ȓȴ蘆ǝli~oW5Ng*Їz)Շ"V_/zg@"iQصM"~3&aZq~V eh"?IHs:J( 9Pb9+va33R>v[>8tFտ7'^i@k4w{vz0s9Ƕ>ح"u]gol-NZ^] _%OcoOގw*hQ裶41jҴFiLGXsQJ:Gk4lE'cNLo&-˫E|]xϭצ>j΍iRаڄ 9=ipyè 1OP 7<}̠"~)}Ozz#FMlF~4S-&Ȍ&tKNCq\:vvpMskC,m܇k]Ҵ {ˮQhL aǷ~wꋣtyz/#@z?] u6J?'(>Ϲ]is:Q5zv/}o~5X<< i466ַH[86l`oӛ6mP\#cq/rnsv?s{1߾@x^nۧ>.E~aO)!cȀ<2, OwTwɟgY?}P+yR>|]N`KMB}ن.Z3Ty^rH).3ov+[L #fDa`Py;ȗw:3iaG-]=?`FAU|D:-ܑvm_z}^7[RX#Ioi\}L~蝒H㮪 Ӷ{n34[f}ųe!aVޱ+~yXĝ4~z>Gf`V0FSDȯ9 㪓8]ooYsG2dH?\جCpb@hQYkt'peCwW~x0! ubN]CPRay;0݇ggL?s™G?a{Xzm`}}JeAУHq% \_]|9 ҹd7 -F|=EO{gg[E%q:֭[gwDL'; 5}ep'/1%[вz.?tC8'(D GsIok20xRkyG!/ׇUO>ɴMG77 "=qJoy'^tCη20B蓺,勛*sdV=;M:V/<[/bFԲ)mc/K3v Q*IL}u6Gӓlq-L 2&8clℱG.| T5e/[!WrrV+sIu>+_ڡ;F ;ݖ? s "hbק2f0<0}cáB#3sy+8v{eD]9Pv|}VCP6m hNW/ =|eFO~?÷l͡y*lD1|0/2a<7#1r~pS O/LWL{9YFhF/raP4( ԣƖ*JdžoLǟ~va;/;D +Qގߦrwe裠z)J5RyH;ΚNm,\J)upK 8st˵?:OEM/sČ bqA7v82LXh:fU0YCiF*b8(> hw3ϝSLLM7vʩE)x";ЅYޚ[+'}v(s  YoC v: bn (>C]qnj;S@ H_}r@00u̼gU7\Ɖ RC_׬kLF闯OB&YZ-'uq] ;poOTdʏ1hxtWvvb͚UZ9akPSr!?fj?5pTZ{NR Ձ41E:j]3kEʳ|^&sMewoN _hԬxoB]ZB\!Ts3|7W*P"B{ϯ[걧;~C=q_Í#V6C,w1i+`e908o/y^Cvi%o;hx?x{i `UTg29&_A`GkP9y68%2BTZIDAT}}z>N̬\-ŐD܍v)E?i.|c ]*͟9y#́֟ sd(^~d\Ykι'NIczYretp`:3ͼO yO|pfuO߀qKgog.3FHuJBֆ`5ZuI~*wLg\&U]o-ݖB/|+i1טVԸq&or1#5!g-3KښɼM]ӟ̻(1W'F/f +~EX wkjl~3q\/E{/e]61kEjyV iWcϺpAhs4v qH(HΊC4k [nxe_w74n5n: ە Y= Ewu ̩C }?bD6X?2?qF~vV\rژ+plAky{o:;V~-D'oGdC#HBѯ^9>uqOڗQ9^gHqKlD_c,_`W?b/~O꿀XÙ%_Fe0 I^b%w@qם/X*=[x 騈V ;a$fļ .3K==Kp Lm e =?^"OƂ}eFx)_x ߡ_cx #B:d@}cFgZ<ńfjx;t=nA0{lP c|(qFTg_ -SM^` übO<  z6i@PH#.P鱢czP5= xq_.iȧ Dtj-3^K|oGaV|*oLj˭n)r_fxLRo~Ͻ}v(^x[r}kCM;)vV4yD3Ms>7m9Soõ F".0Thy>>w?A9yo +zGwDSƟ_t"Wџnc jďLcPiIY ׫A'nt5Nd@&= 44"CX ahFœ8V@Ij~џ?Y6QeJ< 3^nWe_6 uJO MԺd VOj-'y]c+ (&X`- R }_4axQF?U2~6~geLjʐ`6m3l+Pz¿oΝ"?Ή#(h4dcĦ*TO[FumX՘B|ژ…>p:OџnD@jReW—e?F5 vPI6a4-T`\KC?e2~80Q/N ?6^\ՅqNƷxk,capp9'*ȏPah#H?jG2~:'*5~uݕ 6Bďf譆84^L *lA9Eџ!2ĔCL(G?Q9׍2~Œ4~(w4 wHK_QJ%97$ }U)EЏ?y(qM)e(: \c2 * evjE~F[ed/S_Ə2~8blwP~`Ba6X9B?zk(+SGџz2(kPG?e(Gԉ:@Y?[̀rvhyc": %[+F!$a(SENJ2~=& n"wŤsqqz/Ε&/߮ȏOE\+DY(G?^Gk>2+P (n>#6 }gG7x[0Y6q)OC[eR2~ @Ok<Pn8< V M R'kKIџUOV +e(q D~rۨ\&T┞ezVY<=Ygः~tdyERÅRe!^џ?ER!E?Jzv٦gz6Bf=Io~Rp<)|1ό| (_”VBPxRWK. +Sg҅WO\,v0Ϯ`(mуul"yh#Or0GLva%Pu1K[ N_h`9_Gh¿?8,VONq0}0Ym'n@)m@TJ(:q<~xw6sx;^}toy}xwm:q<~xw6sx86gw s~ Aa}NOFK10{t"M WibxFB4DҨKGp8yK.yÅK@Y /_Y _ 7q_ΑCƓL쉁o)g1o%ߎ9W;8u_xh___xh___?/OI76x/d=2Sx9=3Nouec)~"?E~)8E ^1>p ǰ͋ì9?{[IENDB`davmail-6.3.0/src/site/resources/images/osxMailImap7.png0100644 0000000 0000000 00000513276 12564151555 021745 0ustar000000000 0000000 PNG  IHDRP_8iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATxd7uyoF `zIc B> 5::!^L'b0n`'; ݫIGHW:OTUz -[@o.E1hez[@oz J[)tmQ)"#3֠ 0.}͋Ux],QѮz% F* 쪏쪬?}|'>7Ǥ8DBq8N0͜,ʫPp> w,3{x=+`c G?~G?~6VNy]‹Eҩ20AcU:W Pvi`vyO@4V`~>?hڳ2 ????Ǐ]C @|y%%P6:]UH n@Ov໵MoGQǏd#ۢ?;?I cQ|@THY`08='~EOF?~,81?SJ?i`1 tUw*@^ igF6tPa!٨߂ՖN9?;11v*}cl꟟K9.|"w{@)o@8PxZ,[9B9E>i˲"=1𞾷_temT.G?~(~O_hIV@em@T &_Z\E'1bo[? ??#=#y%?PlMuRdY`W6UYo~X`W}dWe}Ffnnnsyʕ+:jGE@"T.lT婴._a(_A [z );38^jUs衇,_|޶+`axi0짏\Y^{di6Fr|(Ӕ]l m6~9G..B5 mA75X1ckNbo_q/%+V|~>%<`mya-WX&ۢ_"^,}-/ue?i%?X&nݺ=فh9v tWm ,j-`d?#p5[vD8tE:+D:lTqo?Y>Rqd*><}46,}F+xpqTP8YP +qCZ +q{=~tߟ3OyY: qy /=~.3ҝ Jc?^.qy~;;;s إ?Dlrh5( uZX2; ӧDŽ{ԉqjކO4X iSm4}_DGO\ٟve';^|AOh@,\ R(7}P<4+F.~>~h׃ w } ( ctʄ"-מ~M+΂S8Qp,=}o#1e_bU;}O$ pPljA.R5'e&3O(CO%  Sh3J{B+:l] z~>nEu3 PO٣=}qbu5+V P] _L!-l xOدhX/, <⯅ Gh{3ol~8u0:^U=/@bU(Q&B>Yi_ mex8?*~pW~%}KEjB/R6*9jAȱ;ƀ$e=~j %`jwm89',G@gl Ət%zҁj\*JhFh"MO/#v%}#:T{hJd<'D韟]z|}ׯ CQ!ecLBOW/Enw*D\?я/1e;nr8QK[ݑ/ص_կ֪C\}K_j'{l8g}vzZN;_}GOX^?^ur7vD(p'FL~oN}~{,c.Hy/!㒹k偣 0n0JB9@=}2Lܹ~E_` ې_}{߁~Koxxc]r_}7쫋ҋW1N-J..X}c}^ǒ0w]mw׿u~M->pCww ~ ^>O]zÓN:i:׹́87+.?o|<#zbq"ZrM-_ }ITOM<R/R)%7SvS. (d&]XηYBO/k+lӅD+]?VC&̓:!sTq=yCV^W/_<",} ]]=QoxRVN +ӗV~7_لnZ\Nsݭ4ZfMiW>0x_z*ES~K^Rܹ~+^sAaGTc)ˣ^â,b8>ysr(sdz$`ۭ0bj4JiQcnS%g>g汏},c9p`5EEy[!-qO-˿K:?@nsی߈(@;/z_M(ڑlPœ.ǯ-<,.IPNz04{%\2[/ƫߋՖ-[Ti o$-?Ahf7 R}>x#rhf89]9O[g>Vop 9>rg붷#^Z>\ >UF/4zֳl?jEdo~lZkjU!`oy[;OC~Z["}ewg3HWwqӳiGcƍnu[wpBKJ}O?t'-_׬uz~~n rJַUo۶ix)(JϿtj58;59:Z۵rO}S>-mQmWW+_ 6lhЛ}߯Oysj7Q3'~Ou?>AЦslT4ֿ)=GoO=??\'2/f1GL&])WvpQz&'ν~ݧ WtN9`NCO-na8Z!b~͍ntzVL/'>\a(1Bf;Q(}.Ƒ%EXӖO;xDK+v,{zG?>ͅw׽nf7H)8s , 3ʿT=)Oww{99#)?>LM6zs;Ol8㌚#$M0#MsrnjinZi)C 9a]q/Z]#Ǥ>ZNμ2y{VW`! BB1%Up8n|_p1ʧ=i0@NIJ֪HΓmoæ +HV _ym?ϷBP[et?!9X@qY6k\u]j~ykURŧ8GYFY~N2 /l/YnQDH6kmOq5x qؘt[x ! B +23-a%n0,a%nOOm^pb .ːoqRt2/A U'O>J-Sfҥ3}ymN+r* 0Xvl߾2;flI.^+À:e-zaՔ-'o:ɫef+mB38 ]#KZ]P91Oth-H5)@}uyc'qtծ0668`+Gjum`"k3*PWʲik3{(Le[9R6-z?}WuW0*:Pf6wjYI'Ni@kG_Ùg>30ONaSg>> RdFY>c8#g(:sV1x~1g',BU\Զ$h=qjӝ$.O|)RuaUznDJҹABB !s&~;M8cvj͚5__7lR879U~B\> ĻGi^ ϻ.oj1V`\:pѾ"}?:;0E N- _R>]qzslM:e8]UX>'EhlLSy8Hd'I67`e~ j͵ΛGSGl!h XU̫g:>ѶږO..toSb, ]jr։P= l9jp'*1WY[Vax˲wae?x~ڭGcI";RCNҟmM/VP^/ mA͞f?U_D9m`ahTxs[Y߼ӖozӛZڢM=-&fٿwƓ1[c.?tiPی^Xm,;si#Yߟ\h:g(sCկnm-_Fx0V2On=q{>eBV81.o,ڡlSG,h)G'>I࿫OlvEV+`<1穧:827,v$4ٶO~ݶ-FBk, [ɛZ%pD׺kk( ~ ڏBF{ooۯ}rq}IƸ\鐑?~[}gq̸d'&8+ӻa&l%L5QS=_:Zm(ZFN%5+Mz[lRu;yʒ~vćc9ԺV`Ą׽nL&FWtъI%jtGAm:hd7tx(yoNT=Rowd[GG>Ar|/ Yh(`e|ٺY^ZH4)Ixi wjwܵg>tr~UUUXԑVLUUW!~^7t'oKZT?3k"|`^砆\* cC̹(!rmmyQm?-v+:6P&^ :P΋w1:fgX|>R!V~=}oNٌ3*?YP2k8Q)Zn.G^#~b{ubrVM\Ndv EGO첣:Jg~xFi87jtP + z=|+aVP.,_WԺ`ȅ_آ z tMoձJEgpnte,V֭_vwy@wM5_a݆U%G#,SѪgXy]>~Mujwbbu \t* ~>oݺޜnWѮ8z)[cB$A'heEWmXNKA *SwMȁy:Z]RpN$=}o?~/2N]Jbϕ2dcݵy@6U!]j?^W+`.nVu.wxBJOrpXտ%0BY~"JӖ`b~nm$5(بE|1/yB=#9aVlk5^_%M R4eڅ^>!k[s~'yn(QҔ 5JIS{ݳ@i2{1?YJo?e9P(B4hTzߦԷQ *L@Vr=}ga+:QkLt^ 귡ڵkmtUkJp/P }] 81%LJ7p&= D0 C4zt*.TwVp{vzd񓹸@7o`;NO%5Q5:3.Řҗ^ZJ*H0~7IK &HR"~DOklr '+B{/c ?1nF9|gjU^.-`BWPW#u)qzz5Fa6_E9Jzb IDAToe'_2#tr*D<I q8rx^HsD󬨘m3DE;)z[RoD}i{rsoxhZ5b ЛNM"-{I vXēv^DS@1.M/奝(;MՇ-C$8'K.OǀB z jUB?OHL Vpnb9تCTZ纈Gz4qtR? )^Sy4mҍctK%m2| %򩰠SI[tr R: jr?jbq/?Sa~]d=q@hԏ>!p|^x iT DGGf ~_/ܝܩ_Bkx?Zq<UƐ9o|)r>rz-ʓx3Al)$@/_VX g%%;9UY]beɣe6Cg!?oG>`? uvySEh, D? >2t$i~S˒I:Щ7D>Lxh/6*YeDk%e6#Z2|[9{>nf|[g@ѪV} %ia㸰֔W}CaQP҃cKqQF.nDye%6)mI!`]\ʺ2uq'K(+a=ؖ؅еIiKRօn8Q^FY B5M y/q)tzSi+Pmy!X%JӥОm~gJ0r?0|x{.d{x+C0W'xoe4g7e9[y`9Y*pE|:.݂{B[pr<O7g78!Svxmbt!+ߨQywrfg 6r S$Y I\nt<͔>e1۵}kG#Wl7^0Fbi/r`l.4x=l?wxO;+)8MdZX)fk.ߖ;FaB3A,YJ0ĊOΙx4\Mԃy},u5NBH>M NN4TR:˺ YJ,>N *(ֻ(R0 u_Q򞾷_'~eb s>]BiE:jO?6ڄ- vUdbE:b8ZtW؆c ! z5B{2G^F 4(aR79/O79~lVΙpz4h/daW ;r<'t5l{tD[ҕ !2n;Q>!x hq)oSx/63JPT,``9]JˤOvS,}-!ԌS(e0@X|̻ NWEO-qUerw]"L[Gq4ⶽ3+J8"r Vy0~5؇΂HW(˺nǍM1dRU),9hI (ӖrX>L |a8gz;!x>wULȿ8z^gEl]?tP :ם=!|Ϧe9 F,dĖ(֪PЅfqO/kO,?db g(Hc!x%le"òPÊ23-a%n0,a%nO[ajO>7wP/3ҝGZ'\AmKkd;,Om7q>ˤrO$=$DjJ:xm+-lGevsO‘IC&ze+{Bm>rXe" L N3Ӄ2^oekp:eLSl 2c+j(TC5 fk%,yO߱Wi+[_>G??p}0f6F[V,#G@Yx4XO&~$ 9&?'\ep P?5~w>[ 2(x WK/pft)1xU4;-Cv\yKrmb?S( c&=>U *M?|I0,+<j 'K,ˢ(PBaBNYXaj僛W <1U:%Lod!9;Y_ 5"`R%|QXO/+TiƦE4te<́b0 Ɓ;mkB{߃1ѵg8 Z'&ڵmoVhr~~_rȁK9ș5k]VA33DMm6=p^pl,)逸WdڽAV6:䘮ezxKNFê#V4ȉ(u ANʌeX0hsA+Fv = dw`Wlל&J+YAÙT!sSYȍCyˏ03ĝ1+7Q+/؞$d$|gr\<:@OB0VVehpkPo޺/1V^mFz}.yskAFG_~ZΏ՗Y3qWC*cB.a#Lt^-[h/s(A8e/y//R+՗Zs:v&ն>rlz&%8*ǭ$2_ R2'퇕kc菛 !h3D zGDK8i-qg:Zz2">˼{ _ۏ!/էL<x1[QfDG. E/2DHa8T sp/SRwy=vf43G-:4tAVfS+L L?sI7W `%J{!]h~7:f]]ro~x%iӦ]zW->E?>LUzUWW}aw~мIګ׽ն1Ӌ&nu_g;Evj9^P; !芒ǮG? O +'3 !@̥|(CPK7Ы[!һUq9vF痖3az~YE5ps^:ύUK}~ iH1~N4'y8 8l33K'ͪXwIVUd29aj~3'LxqeT. )sz,ZJON[m&i2 lpgbP? >8CJO.Kib2>&IT=d_OBysjimN[7oVmظY碋6Vo6oڪ6bkNp}e+nnq#:>RRYl$(!ʥ4 QPL%(Vvv lַw9ƋտMYcD5[?+w#k:/|:KE s$g}sVr&.]&3ؐ>MD?~v9w__Y0F"M2[P9x"1+p bſ3ҶƵ6u*ѣ T!Ar%( 2(=>SU "v3lU& .`jU3]dy^_vzFb>^bF`1&$K;VK,ot^C9 I+@mӯ6\:$6!&I1WgN>&K4hؾc>+: 7wdj$;uFIO?e8]495m6mǁaiKϾ|K .)-p̐ߍ=.7\~$4 rT7l#8(7meOڜ-?Sx7T7W׽+$N Yb{)8.lNm0lEJ`xc[V1ܟdѿ(4eZ`,ʠKB&?Oh'?s_B!r7Xˡ,t(,_Pts֮->Y~_㏹SKh /sks"_E۾4Y}EP`$ ~G&EMZMz|{=N`{6&A O:2)>xZo-zf-LˈFUsWbZ.,774kM`3y@5[yⱄ+` (\vݡ*ۡ#kPC(#$&I͝wqĮN8%7IV&~d *ԫO co|+u\[eOHd'<}S25(4L't׾5. W oxá׼5_җr7lw]@P7=yo~ _lV݇Їi8w~jCu #%+_{2v^7эrp/ph r-36V>m9|<ݻLۄ,#r*աћՇ?a׫ Dܕ=d t~ ;0.FnOË|?E90p@w8%BuW)z+9OHF.N+7ZAv۶~znN̊ {7iK/^7pqm#܉܂JO_8!h{X $./N-] :ot&gwtfB~_bxaWYlV|sOc (BVh5[o]4% "N]r}weBI HWbkRd^)2S1޹Lxv@l=3Tٌ4t:-[U7n.h}h -mwfl=WiN__ۊ}N~tv|Y}Aڢ7Uzwͻox7x\?Uu{߷ZvY׿z_zة'4ַ굯{m=_e׾6WX?V1i9k^vL}C OzғF/}Ka~Z~e|3G]6ehBO΍ ur0Qa7| |B_DMp梉N>NZ 2,1,+;}L{B=S'Q rY[l^x@Elrï濺uxt-;RUho8"áS.5vc(&lkhJUVU*iwRߦ{.-Hr Ft4.V4m: ̵Zd%jۗr3Gud5zȅشd/Jx.n\'gT9N!}uTry,m &}W4stHN9_9XeV^O|"9=p{鶴 O_m*<9nN9唆3<>7n*|$ IDAT⅃:th5h9%/S3mnO}بv>vDuQx ~ƨã(3^:T&GJR#m̙>=ǎq H+XܩVY?4QNiQdž9#QT밶6jtZN}(@/]j= 8wđIk**<*NyHMZvm2(玲wQ>ABV铍&][SQ`6ǖc ",J_Tt!|tZ(C9A1 %^:c!2i 7 ~e8%(Аȴh9r4UB5JPvgSkgA+6ʁZrL,-m!S84T0/*ݙ_M8ar#l~mV tQ-=f+oN1/}ū'?xt7Oy's=5NU.8v~niOzl7yB 347BD8䓳- +$t:"&ȱ 'I>G>2ZBGZ wuʱiuki,ke:Sr&8"U\^nqU/zыFg!%`O ycM/ta;N N !6 ΖV/uCݙ%'/ 5_.Cjݍ3M="ٷix 2Bko\:Yt {,fG2Ue E?%[/aNg8}1\@EY7=!r4Ni"trBbQeqYN i-Z@f RWXX~Df Šd&%G5[)C ~s,&ž!|>FD4ű{Xy }0_5SCV f~EtpUƔV41S/HCe|x|ێr(ף&][0"gm_) hOq2s<64|QEBnѷQi; 6#F#ަKGvX|I8$-V:A3f4it_\PrW H:o| S::U׾M;V,̪ܨzij^vKqQvw4+WV^IG( pF']_)|lV"mDi`XRUg@VX=[eJࡸyck][hr XOuA^痪~$ b?bM磚<CcZ-lڔCI0bwy9<? Kzt،Vo|s8D_0Uo~@ۊ4 kXY9FfNFΝFNl/.+ٽV}UֶFjA.OƖ+EakuQ`=D6Do?,}iw__͈-(H+D %JK/ŭ$rDxӛg+tK>Z9+`nz0's/4dzJNlt:0Ԥ3Γ'!my-8 Mr{vZdKc9 j ųT^g5s1G9?M8:R\z3)o ҲG@T,;&I rxp: =0q*x0AI `-;#QUUH1{Dj :Vzˌ$,gaa8yV5:^T:]~+WpU#pdzZtU▷j/U7]'QY]UO\WtUG`r>[}鋟7ooagW99O?lO8q/ΪUy+ lǖ:]a浯ymo|:S~~GpisNt^yU$ݨ8Ol߈Wp1Eb!=yE-?5b&Y9(k:wawƚ_/x-)9$FJJ=g~ಕGL>֟-0n9GE`=H()+@WxƶVyq#:x?s]NLF?s=[k)'`8(mzں m=vM(zq 3o9Pu8!?_Ѕ 3΄=D?DRGeI(t濈O)']Dn4 2,[+ty~ZMD{(r`m9M5?cRYfF( @:iM~oy&W5ea^NVv-a_E=YO n%3KmG"êy-JM]hA}5e~~Fuf\NC{'MёO{!DA6Nz^kYRbOؼ’`#j 0\ 72L=E\'0oQ&XeqHలcAVO$,E|0䗇uUN,GjwzFZCT~O~ɺf v8DJTOՉWz~_7ߟ׫WU۪Aӟ\Ӗ~;ަm2c~TK_eUMooGկy+*k;_hu]Ї<ź cߤ\mN[[~j !"`v`ut~gwV@UozӛovAV2'C@NsK5{8OájEG'x@.̔?cvN+QZiؒCGqd{׿u-U#u[}3ʦR}C}qZ<@.6Oַu=HG\נW:l__Es׻j9>?z<|l)d7rFw݆؁7l5avt#OW-hLFW $5;η8QV ds]Ddikr+]BLjQ^AqOq~/! #t,a6_xз!yX^3~\WJq -,'ZE`4^ @ZhZYr-m:wZ. Xl*&rcဩ'0ߪ}kۖi EMЀ4S6 7 ~ǟx`eN#*jGXq}2,XH>V!a2${rvkJO[ѳo\#!X%vQ]+)zs]V/+$q]\ ,9H39]X+88J~Pmw*Au":MۦN9 yo};ܦZ昅 b3j>OTw[jIRts9Qx.iF3gtM~u/Cu AlVUO~&g gZL+_+grڠA*+,h?O|[>m78ϋ u.5 _&h?5/,m`'aA)q?B8ч;6s/~J(JҁZ @ Hp~' P dtxе}7E,*'k& Po YPF/Xme|A9X3׽uj<`>L@]xm߾̓a:/I |=o:I-b'lס"0q#הm<1d )02Eap0fL9;!axs.9B[?2M2.ֶ tcH=d{%~'{hB>N=$fCgG-RO|Z9괨*XrꖷMuܱw'EpT43omRs1]XiuWKk`Y8Z3R18φ&w lբͭȷ72NûRFL3Nljr՟C~*(ʈ{C+B4. 6; /;P1#s-hk9PwY@M{ 2D+ w L_a(ȕR15l/Nͯ:[[rH6$NKq7Л3훙qbJVRLR ~<Oρhio?~'"_SV5+G jn N Nm *f'Ip-W=YC(R:a`6p&5$S SDvb.`3R@.HvHM$G'Fy"AV*ɆrE'M,qJ+BAQv"1d;Zs̱:'utjMRJ_3QnƢD}I Q'mBߊ&.6T+Cw^4l obe{ZK1\V%"M\&HeU^+}宿'x.Wy^e>W_Kǔ3]z&vUx9Pʌ|3O/|%BV>o$'r4SX{,hթ>W7uZy 3lD1 $!O2|-'g"4e[.($-+ ΧvLf5c@"l\֛+ǏSBEDc}&چ8K| BʷEE(0,P(%CV@ZEʎWҖ2d㨏Vf,IW,)8\*Yʁ* -Šz=*i2?ӏuYŖasli}mrl]6i/Fib۠T8 Kɛ{z<#|}5'+)4Gw㉃Jr =("jULapLVնc$O}-R_Lu f  yy"V2[Zylٶ]?Wڼeo4l(GuZђ2BXr@D_4Pjd}2qH^WM@rX~mBhc[J6\$%zg#/\|Voi4#`pv dқT(z2&E''&qG71VgEfU0 (rg˝> -Yy3j/ݺ^`cf֭:Hn o:4yYdRFb-M38&_M 镉#}ڙL (7Cfb-F8*O98!H@])f1p*ekr4dO-DY*1S j%HPMk.fYyEH?_n݆jM[kxd5|H gJM\ŝ UDU(Qmr>d(Axv4e:/W zUQ[kQu w/W%QqO/%WcgYWHH2}RtǸ2i𜦰𞾷_'󯱊'Ƈv,iL+ǜ1bK15 !̃d+}T 97u.If/k[~r!;;ڈw.;dC4G<,)gC Գ';:Ť!*@vW`>Bb\MWY#ʒdoxד7<;_Ib|Y M^e2AG!ުoӦ-  uzI~fھ&j'`fVw*~?N7r/yeIfsduI+}1EVql6ecssf [Իnff|O[Zӄ.Q?V!oW=!6%m1JE 0:G궃`Gy#6 _9< G *xE-tO@u@P A1FCю"D/)F5{mpvs+?z]Twp=mm?3Ot0hDn8[sE2&5@Wuلg|-֫+rx 'ӄ2Ј4p,sG%9MlFBLg1Iz{;XQCgVhm~pE66oiڴqsuUAZ~pu}+g2y׳hkHiTČX|BK!zlf06HˁG&zbU:7&zbV=Y Hpv>i񢬄eJ]%^O/Ϟ>TgcbOLg!@O83y $-~B& A@._fz1`(-,if6נߣ3#2AhVC$]/?@v,83W>`rTSX:o971[{&8 26G!i7r Ǒ[4S*b%zkm&,۵&m/O۸ٸamڲEt_tYdvu>+e!])Αu[wf݃I/H>hrqD644}ьJxJ[xx4zJ|VJa</\5>@OCr*-= s [gq43*ᑆ>cd%Abx{~}-,2>?脾ԪgaCB#). cҘ@Bqɰ0:>'6tU}fznGIʓ(R~443h^;(,֬ov+n(P[|8 bև٢39ib-\pOwܳJ IDATdPy O8~*UCkf+тA#GNI+peÆ VY%Vtnٸy+ !rKKHzvedيfepV x#k^b/sGz }=V,wE&7Yt|!(}rn`9P_Voi6Q,jGS7ZJ/[P"޶xn)rQmUY&gr4m>26X˂q;`czFS=){b(KʶJ7:Mۇ4*$gBP˰^>myfpK,?DVCUMMOKx~D!]H2,|m]7LUCet@i7jʈOM^Ze=_2BGkG3(h[(zqeޮ7m qm$Gizފ1VxmFѲV6Rr9I˚̌9 T5ҵ^_ X};ݪhUip-P>Aަ] zhL]\*Brd&}cbjVz6]"d|}~и /7ynWR[8bYMwNvHB鄱VJa~}??n.w%lƻrcLGc0K/ozu`yv-*BBo֑I3sŪMяۿu* {z hI$`үro0f|v*xJ7M&;U^"rX{wtzMTo`mmݲC+.%?yZMZu!pù/G);!0d+RE99|e:ۚJ9W&/S .5GJ_<=t ('Dzfz,ϙ$ 䤱 +G^ijٽ Ml?_AQn~ȳJJoq.=59yL1Hey+xās/V+J(asy9\ =<@FY7]* 9:W+/3=E!<Ƨ\nf4癗tQH4^ya֟\ ̌uJZfJ\$Q dl*`J:Kٶ}vj̆tViSqJJac/)bPi+s~7[._)iE33-8I -ZʫK(]OC`kr8|afMa`e44e&WI[, ^MO-y?bHWpx[J[ Wi)qfi.m֡mu LҊCGVVKum~Kf5a-ϖ&=ϱ;]K>G JG)T굎RaT1)W%ӱ6Z `D' LN=Hz vL;np.cVCrXqVC;SL r᫉,xm%Az㇑Xނ-]0/|{z/ls[T6dy G6w3qpVj6oU"I$(6E>⠋zgo~_L SqvlߦՋbψ뻊LұYoe 1|gg(W<'g'Br)ämj  (ū-[wV۶nӛn\>ɊfӤ7tjVŴqzQ1z(GΒV.of.ѡtQEtҤ3DF O+Nh$}9"*'+9T`7k076%묖T>յygp08Ȋ' 1,A;y[X_2bj^ʧ-tdh?hqˎT'J?d(ϬhXe$4D7WT2?'>qqK;gOWi?qy !Ӝ|͓]?-J%<$M noSH^S}$Rĸ"l/a8нqzpߨ'}Mfz,mRo޲ڮ'}BT&-o}ڧZVtǒUÙYMNin e.xBfv ۟ܔQ$Q6 Bԏ/.kKs;'vWoxQ[˟7Te* Mn$U+q6;dvW1~R~EK,fil? vǩ)r c{xˎ۷ә;ݙ !LAQD@䯌O_̃$! d"I'}qwU}{Nw {ϩUkZjZvjI VK7?gx?n85L$M&|;7lP< .J=*1L2 Fz>ߡtJOqgc2J ֧K+ YE_uS^g{K+>δxFWi9Az!WfxE 2 sX93F;ڔkVanvm6mK̔W~to34]]GaV%msv^^u"{¶4R-?@&%:bFInE8$ ,}1tE~︡8ijc¬f\t#>K:ڣ3]Kndk_edmv A F?c?']MiU\ p:MR:`yJµ;RmJ#}jAn5#vV?UeF ·?u{*VFZ :~=ޡohnzAZפ}CfJ8jD_uKyXT  7b'nGY̼#ayNK/]Oa {oe@UNxt5Ee'8iΙQVVvرsή?.{qŀ\u-Ed2L&DHÑ9-7;+䆆*+gnޱko{ S3aff^7د7J2.֭ѶPo:ԭ7M"܊.}tDKZUVi*` LWJ 7ܐJCVۭd.gܗV0.m?g=alf^v]J6&?LBm̥YIʲ5j[v GUjBRM* ůa2yGC0Y+S̟ģ֊nlt׏[uB"s>EjS~bK#-/9y w=4"jC>\;ۥAס~vN.y~e7֕w۷Gwl˰wfE2w)}?^TWl+c"2 P*ϮJ@C蕯ɓdAJZ .N-Pڂ <̕Ye9gLU/bxx;pUWwmڴQ+R'yrZ=4AF*[TgBw +nu? SabbC9-(xߛ.TS.;ѧU5e#+`a4#itpz $d9WIL3=&W׊iqXƟ-Ϲ膍v/5Pvrhd}!C~gGbkUy{#"J*~gg;,=fe2I< (@ #wPIy}QX,,~+l+d eMøI_:Ou+_+Y;nmE&dDO#W+~GK÷9 ^\E6vMᖩ2X٥>teNS4O_qZY,~3S+cPMTL2rQ\ UxMdDπ̀`  -~Hmn,:唓uJ`I?0hK[fPY3"ec/r蠶02<FˮbiN`kwA P5U:_EP<~ }UqWu<_C_yU5@ЫY=1SY?Fy^& }kK]uNw񓟣AeKD3\sq !6sBPjAPhPD("544TNOM\qᔓO&᥺Vf#s`[`3v^;d,slGtZ>U:8Pjf4H",[Ithzr!tʕ_2SOPqg]^uSzÙC{؂.K kR_!Iԓ[^ lp5`zdPiU.YyȪ*PTSX-1#74^E_Bߧ=9M<SSgh{(z[U/6o ##( O?BOF癇 Wz'ȓsz|M7يԦ,#Hqܧ<P6S&?MJWBK$g\88Xyz0o2@;p 7w1yLU˟1hipU&Bl?~!yyB8D Ç s<\!"CU9Mi!Ȫ&W4yxRfmKo|b_pC:oFo7S__ZU ؝> TɯJŰrMg鮇̄W܀jPpN\r,^- a*]G'jE.Q0K+?ӳzQ'TepKg/G= . U2VO}SG?ʓ ;/#El#Gyy5O3 <])_~ Ǟx)|S~jFi%iw&#$! W)1špsvJ+P&ʾVfb^k.`PҤm}on"kcc*ֲ\͡(X/-Q2nHcN7w3%y`i CE)3znvnWgNm"5=.ܰܰ樍abdX?^0ثtmkbt N4< UVtx\ہb_ haɶ% jR:kbǎFoFEN?77>}'%Fԇ?~ghy=/}]זܻضp7uŎ[ v^?zk_Jx/(~gi0󶷄_=_)ś l"w{aq'/Q3F<_)S}<<§|SO< .=9Cx[뿾>6w?_w(Mԣj Kŗ^[ڲeKs.^N"G<= Y-.?ܷz>P^|^V|N^WBnG/{½}pg~FN|3lۿ>3yyW~W7hO"~ OxB@.'? ]tQx>߯}kƶ!_I}UY{yx9M7zq}75uv^+2tdQO?.֛>~/.2|wX҈mi^.?/5&#FdtsYMskƫ|6%F#* =H+dDyPيU)]J 9+!cje}np YI2bQ$C9`H_I+ YyEjŌZ92.ƽttJoAot"XM/U'~͟^_Q~+A%};{q'Sn:zp_ ]$ǎ)7vb_)vF׮/:f0 ,\ ńna([ʾu璞s jb+%VtՊ'߷HХOjnP.G 61GkZFYܢ6sX?}Sabp=$<*771޽K6=\m/O$oEגn~sx[xk }.gl}іۇ}sBxSޣ7^UlK96Q~_;g<_s5o?++WU~׊O]O{X)2VN=TUI)l25 $ǧr?O(yckSÌ*V0jַ~f;o9Mo *I_u)׾u{cKPy_rxox׿>wy /0p^ { ɧֹa۶m9y zֳ2_Wc=*Ojۭ3ܹ7է?.ykoQk fc_wߔ\n=o5s0\ЅZ+kGÉ3Ql1|JUaV4BZ&\Y[qkɅ@2y4(0sԫ{e6<րg\Jϖ0uozEa6e5n&7h<<%.]04ػ{[W?Q\υʁ ehX{ashy˸ |+a_/{}d^КGeMjV/N>m>^-)OONZiFZ2ɨ_C$ 7@CGJCf!,#n+wE[t?C+|#ycFuO|Ӟn)g}VK :?d(|kɩReSjЯڹ'Vt$qU$ K.m D8ꨣlř: aܐ'Xho[E7a_L?%FφKy/F>9˟' ~:n,49_Ãd h5 xƤV+G'<߹oOݧKX䄶 h17jq/gp/VA|+Иa)^'@>V4 UুЖVFehӉt?ڤX2k" QcYyfL]:A j4KgXU1# n %?=}M9=uD)` 76$_F/b|gܧw.?=rurO+Jzw;bm7ިWЌ;9ozi\VzQ]k^`ivf/FP W|K:ב-=s:uDa@<|09b5CßX+}Ņ| ;_w3v]X z]{%EmۮŬS: ~GeCMz9S,=~?^7xCxƅ6p_χ͛mއ'$U_%eUy6 s=SO;5փu2b(+Qm'X=y\>;VoN8[!|_ wg[_Aj=xox–-:VXbێ'SAJKc]ڮcw p\ف򢛳,ZJ  +(+(==9յM&jZ5XB:=O'?u}[qُ~Tu8wl]o摒9{Gay_)%8/m ?wS̈V }x>"|X[o{_1E8bg.hKԧ>P(.# AW3g^i?htF+->A݀I߲eK}kË_^m=A TXa /yx+_i砐sHKz׻[70{7[BXE¨ʙ2X"ι*/ r1 [|9 8xmw;h w}23W}O 9fKxƟ1hoXl}KU&띊+X<vwopVуA4sv+*ۅAU>q5 'VPG^_캝شqc8k`5k!eƓ'7\5Sz}P]{qqN+VNDFəqQѸZEvN>ι庵a~B9uEٽ4)ZTXjY_[ˡxmob,\} ׳v;/h!2.h%JVӁs.3AG%L~yAEꚒ5]s3}:g|³[yܸisO ae8Q^u^koG?x b;'K}Nز;yf$arY/Oo}4jr%K_+."ERg`>*l.`Aqac'ڌ sGyv85r:=rkV08_=r]t`@\p/.dE:1sh+_B̄=qQq}|Ʈe>f]x.#\/p`JOAC?gD ׅE5G>5aT?oŀǾDw펇if@j`IN^ #~铬.Zϟ'Z rZ~irUMzm2j8S1i`b.=9׻qFJ]eO@`ֈk.V&4R xem 9󳦘R+M‚t3]cD~IHMd裡$^ !6dGYԖ^iХW^\{bXsYa|bg'Qv/,}\FAdt5[O~`>\[ Cr WȈJ d׍Uإ'3ЧcX([RxO[|t]4 f*%%AYN>nvp?OѱyMžӞS}&G>1ᤓN yb_X;Cp+g;ȷ /z|Ɠ~{>]a*sxK7Iȇ?<1_;/ -A;Ǟj[x#_y6腿m gߣ0ʍ"N;4Y*_(jRxxK_ ]nnugs4R0m6 :&ÄiYzԣ$FǓtq75yYp S[47}XUЇar67ˆŰ'URfHT8OVE]H PX3&'iCo2"=d3I:uS-s7~50vaprw}TYQ"l{l,O9k΢o6Kq:VtN|NxyCzJ׫M*Uv if9,~,UWAQs^{A7dW\YC~Ϟa5ߣUa[h0r t.pSyڜ B?܄8:sJns}{9w-vlXytmE鎰QBL1t<-"#NbVv+hġ聆Ua?5\˹&BN¯<oktx'پÏ+s{ uuƱrnbnv)dk4pt[]3Y\{5aIҝ߳VzuXQ`gW`b&XVzɢ'zu;ؾc VUɛ&jl+WYtmy'bxµtʒD < 8Wjv 8o7O8bBeȪaF϶xp\N=;SJZt2zjh-4D@#x$K.4 MƤ5̦bx࿢[\I,3*CX]re#;M~vxdca]3= 54WP\3bdZ,f^&w]FrwX8?3,qX7A\<]ׯ;Q S1%A@J*@N(jr:Q.tGT fmV -:V\ʓf]ڊ:kDUgŗz`G[mŶl)ލFe *Dpt5I '}L~kq[u;k.n-춴qL*xrXCX:0ަS|Jj+V0& yFzvWK5 }K\T\`Ups!3A!;, E:4޳qӦ9OˊbhN+B rIQdH@p #ԄRhytt(IH 9osQMd.[2; ,k/Bzln1^ghpi^kӿ0l-C14xpJivSxb;,tu;t\AkU:iڦ3H',teif|ei r0X~xeT\0Ԙ,T,ݲB~o$]*go(6=茄)0>35 d8V]\ڶÈ zQ7 9EIƙ^ ilb^ zxnUYZ; ;26y,QW Yy#w;P[0fcPtߕYe9vg-&]}LEeJM%"H' "S6ɒT&j$UOaEebbXzt1:^gu*=Pz,8B5B3? %Fz={tN0seL_?3>,l8U=!웞)zDb1ùAʡbvz7F>XbF`%Ԋیu:QIr&7ڨ;wT_p ;!9QgQ?lǦ/mM7cmI5/_u:t+`_lb"F զb˖-ApIg?Y3*T,Y `i`ic%w֭%o))ת/:1Fz$kXiLrwx^NqV &De*YL1r ZR%L]!!Izq$j;DCsy4[pUH~mWP>QԶ3~|dٍ;$l=?I@?0 2RUD/Lfr73 u¢Lr0r(cѳr݆9TLw^ʊ aBd{?Tn*S&8)+/Vu_u/#YXdrԽ*ᖘa9OVW9[9hkwV3>$G8b7p&7UNWXع'g/,}LWe˭[r[j',Oኞ Nrh lɃm3`ò^}LIt|q oyErz;mٱ}ʶVn=:Č!I||y j#ZU&YWAK3&O=)%G&7f֐+÷gMKWpn- D0Ұ IDAT:/`sr:8nxS) zkJ ra޳08z^i7dj#ΌG֗s |PR޾bMWi~`4-˂27!0'ٺ6.aT1̞%u.VR7b6)7h.~'6BX |GԤ2]?&D %|,I^'ʄ"v$ J?}y(:ɏ^n,JR,S;}\p_(^byO彗ѮkbWΕ3s{n|FHOV9vU#H(cep`fD\9x!ч^ 7B <N`_ G'^7To b!s^ o/70 bY7Iu?4/ G=271r1b&W[<=}C/uOS4j|0xkzҍ[P \h428l`l[@P([떿rpyDgzTpuբVӳΥOuF7mMyyj<4"'zmTGCz2KGs?Y{o*cg,jJśOSx@[xM Wf,ūcHqF~ 20E|M4V뮻a'zX=*LOc;fW8 NR4#ϭ a`DO$X@~t4*5,=3.A-P5h#* ׶2Pis8nV'Qc ] kE_)7Od`nv†JGV{lOnY1T%˭P,_bʎZybWrD^u2rį G.*~=-'E+>G]vD~˯(D7, `%#7* js0>-lUMB¡Gn]'u]9縞: ]\]'.I9KZ渞:xzi9nIo5҅-ʋ3XW1ЪZD/yYp鑠W~ ͓:2%Kh Y<\sݻY!Xf.1QyoE$oNVf J1 #/$2Lr9#ߍ.׀ڶGRt6#hY?.$Q*-HR]Rt`dɢ0 ;pˉ >7'qz֋'Ɗ'֌ݸT ZTdLMхKazf֌$Vܣ|C RJ059fgfY]9P 8v X B [Q%tebG5L&T,̚!."G?۔!iC)tDWtL4>IGBE#^yJde+ؒ T=]XtM'S|νaM7k׭oh1<2Z.ɨٷgѮY;zfa`eVegL$L!9Ma~N/.53zǴmRss:g5}ma~V/"7[jFTX|j]0}4pE3ӳ %KU2)La`^\t8_1˜q\S:8ƢC wg~~AO+l rqz'@CzSω tM4*o/z.F>vV*CJFrvvܽk2t͊b°(6؆6ĸ^2?W,. P\JA(K'cF*C)*XF&p5Bnjw"@&1 =#I ieeA)jqM:*.x⻻8/V.+:X3M\&d )|ؾCA;fکm? &cSzu#גz祸4uNPL&UrR&V?$V]ԗ9ymV\'zQ}ymuqjir)pgI|Xޡ:i?}nP@7hg1K-XUub3Κs:l6dA#IPe/^mq.Pz~ʛRQ"/`[u%2U,2V zVI%'eџ;G E'9qa4 LrX{{Ћ7AUh|ɍ*iiD-cx`%ʄ=e*rk8H^3sz/i%ʓeN>ѣ"A) 5ӃVL*'æD{ | +ߴ]9!kM yetF8k{G/2bdtzSL>q–:Vi"' +Vsy|j^ho@e+!mu\ ̒$@ TMx>}%^dB-EG]Y@X&uZ> "f՘)2SޠhrXzr\ѡO ۍNZ__xap@kEvU.,!gQ d`9V` 6(K,8<&`)8߱{4 G놙WInb17AMsZ<+XV?T) hʋ ` $KVFR5(ڄ \3_m7E=Xt/f lGXX\.L+tۻ4 -WWFi=M񰱬+{&+zK:τC,q 0Y 2Ry^P,#KlP_+K2feQW*: 5`qEP{p[)PzA`QNIϊ"꿂n /{h]yCEFSRRbJ[\%z飣Nka9dװ#4;.zjl:A=#q!$q57<͡rɪt (6 5`6Pf+Ev `\F̴,2( W rV Q5?e*Mc#IE&QGQ~2UZNoH.zշVgY+P_1fC*ݻ;3H aazY:;8u{QPZA1$fv cQ+օz Xҙ(S1ģS,(V`*T"@S9 _xz Wr5|̠BsM4T ӧ3ƀc Y1Fe@tgi):,x4ayCџN/V,?ʵ2H ;Aj>ەt߾}'xRލ6_1F4Q1m,QHPqBi jq%EclM20J2K07y*w`|denp-[FU 10KI(#(iLSh\%@eGo-GL=:PZW.z[tkW [0օNr (V4m Bf%+&Q>-艻R=u&ApCbͅ&xƓ*V'vvU%@ƀVx5pZMSꎯuIG֪LݕnLگ 'ǡ^MǨ7@?tQV2 獢sXEyǰQ% !r ,!d5AƠћM9, 1eOʆSO@taM۔r9{֭]S j䁰Wguo\SwE;J yҧ iRK:hU轆M3&gDGw>!0JHݩn=( x$qxL4>R_̘?qdpEGE^$2DI7D RĶ`T܇a%éu;D܅Oy}f1&w (Q $ E?"={z3,ufI'F~FoFV)0h(6V]" h_B.NvkUGiYpa1-!2glbpu:k&Rmkr₞cYJdkcʜJ]89Z'7|G&]klU~vc=r?39'tbׂ 0|"DĨo@ـ9!@*Ţ y_Oo17Wp2p$.1naV_aS&lMTb1pb# >:;,WXb*םL;7a+o$u@\90<:t[0W0 3aN ٶ#Ι'3$9q087Zj\}7)NꗺMڇ 5B&W"Ϊ HJphf 2dVdfDH7Lt/~Lƚ+TQo4E_hr#lS8}I| j%`KЈKi1TH#2Uf{铐;]tݳ{}W{wߢzbW P.NY^hQĪ@lY՞mI;7rTuƉ"l =3mϪ^9c9Gce§wưW4V3* ԯUbo6ˏιoK Up XuGã:3ZJI@Emc7n͈*NxN<* =vxN~;vp,d IDATs^;ӹotkw:ᵃ;vxN~;vps^;ӹotkw:ᵃ;}'q1ÝYzҁa|s Üaӈ3t!+(|M#NϯY~ʱ!C~&s3"gcD`Ɠ}&~4$wkFZj 7jzS*h@HJr dz]k)B `"~55zѨd?OtF/5m K;? {u>mL{/e`1:Fd'wbuHafR!Jirf.>.Oݱb%YT<>$`AX␺i5 sU|N)ީV5pi;>0zU t*%[fU\ "=R^k 1h3ԣ4kEP0LVLBeomΫ ʓo%٣Di~pN"3p(:Iq~?Yo)o*M{;mʨ4&WrXzBZöxr0JzKˣVlM3FW&X6^lFU֌g&mZ拐Tg( $Y3qSy4)HebGo5 <,]39H?&`Q_ 8?LM<5#)ޞ> 4b\a8re%(xFFpXIFW(m1`)!$3+OmS&oϤ#B*RC@Yrֿ`?#m"[)g(CQbDh/mߨ_ CjvIp6OqJ\<<ܡZruEj渞:xzi9C%zu4긤ai:縞)\ָ8xZӧtZmUYF"˥^utD}SCX&T5@ xFU(usX.b6T7f0ƔNV]1lAF*Q{O)Yy˜"EEY9 tۥ;}'/{]w}Gs'?tV#14V0зoWldI ؖ'dyz>Z}*0.ݻm^D_+Baք=^U$$g ""3Kc>ʃ7$(R ZV,46ΊN#;&!j‘SACZ1I`K7,,N*\_] *+ S ^M zG7D]+E&VQvۆWOOܥ93VR ]yA]6,4paSCq)B} cV#g@:$Xδn+J/YLd -c'M]zm=+N=UeHywJs-h: kLSS9::"á1!CAX2` /y xq^¢'V@Q&'L>E NjRjԡx"=Yc6VE ԧY-6rmVfLV`@o8!GޅW uVdpCkxŁ4"a)AKE~NT EjE-X0zr]^BL*ݻD3woe547`!AFh*> eENWjxB\[v;$[ls;#)պRZ%幞B1Ihw(45V2 s)su0zU c%ɝ Ҳl`0K^R@9O)l/tqZ_H'4̴2Q V0*e rD[Iba~6,=Khk:* T(0Wa dbzӗ+l̰Qp͑}N(n,i Kٹ9˭رsO+c7n@r [jBĵMY&&89'VT mOj'%|UAT uȹ&'c (1(U[)/0?Fy+):T(=Vrnb̿%KUCCAO󇏉 \ JnIє DID˪]* l2y#.<~X:rZ(XE_`li5j`K8 l"i< Z%4t맣N[q~l (hMdRZ.*Dl ]MіU/\ 7/xw!7"W2p.&4Ƿ\ȨJ~U {.*NoYg?p\WklzDɟ`qE;97ޘmo3/չyFdNiqoc!)p)m[a>T=:%}A 9}mIDY2M^/m[}˩ѷj-[9kOqVKnpSy7Kώ n'6N4!Jm?ὒnyeiy[0%-5zW[v_?Tojkfn>ڄ#s̒x9P 11o8W%B_͍Ãz5PW %nmq$/pӞ77 )L |K__y ɏ8|mQ#\WEj3.gJg^D͏xDDz\x^ ||-o7L~5mV_?M6=^'}K!4F|%Xy5MPhNނλ0;Xd551=UR. ]K8c-oke{%_""p_'f# -,Rp, ~!un}dJ TGgs|kܽޢ[WRD?}ïWO]:H8O.e4D%jœ{Y((#'<眵P ^wH1M]\{ 3XkWpJ;P>iܲڇ,G._=M7 o|JeZ./ pd/Wfx7x--/S8:73Q'=ETDMFh V'(|y;N)׊~eoy;H;oGaS3FSyAԷk{j5u^P+o)HyN /\?]f67x^b5*[Ex~WXX;5GD8-kܥ3g%R _F` M_U5HM*_/_UD e P EA;xnL%eGwklp5~7dUe$EJg)ȍiARFvڀO.uضQuyƔ k-rdܖ|8@KDkjϝS&Fm!u;>CӋ"%!զ( }a47ўMN;S F>hmn40ӼD"ⷼHMwAJQPe~6ˮ{(A:zi|.]Yw. S/@r_ZBn }_Fa)z}?ܽ310sft&c IATL FVύ}XH~E,>+#BzKc A(˭,扻:(qxaz; GA9r / VЁ@^QdM)"7xmv~n߽=ܺskcla`i,p/k.Yēv6"NU.˺OLr;Mqr8bT>´TgAڧ|'ൔ~BK{V^2yOߴC}Ou4MUXkK[n9Y܆juB+ [AC\8V$ڼ> &$bP :J!W=+}a[PѼ|ϔDz KEt؁|swf,ŗW_?jFo) !2ڴboX =](8cD|uZ^G9]Io/y"QszrXb, -k0kL&aϿ#i7}7<^٨&,r[*v6s\hE?.V]_Z^?pwee|eȑʼn{^؆1))y* oݻp0. J%ߠҪ`(7dc/@c_j 3N?woOV(^R/(#t$ 07Ήq`+Z%Y̴\?=*Dׁ,NM΋|srEáal#p0φ|3;7o!bP$Jt^NGSr$ YHn'첐 } /v/t yc'2U'#b.g@PSZSxUKyXxE݀[eMeKscGbbffQ\ҟ]dž\XY^8kD KqM%5-_~e?-Īm'sLžd/L}CmT/H&|Ò!Ӧ0 IDATvznބaϧ;wnϞb QRܰ네VuOZ22?sƩ4 =N40tsmzk]Ձt`7ds+n &/8Qb+y>eoS?FtάA:P, -S)(2Z%X_:\zd?+@?5|ó|_לm(:RZ6捉c y^=b=la.21Uy>WkUs8-=N@+Eyi}BKGub\w񐁜׷=}`}d/F^ L7r?XFn/ 9T܏p W1,k<+My- JS)olB Vs&N㣋ˣW7U@RG_8Bpub? OS,K~)Kxf ?8Eހ% aKI2L_o^?3V/sTXߐڍL@caMHki;g@V819 ѿ $ܽ''SV# sB]0`_0:ʗX`~FbKBT!V?/#%_F1r(k v$BQN`J0ko }<%lpx7L~:D68Ddmyw]3 :(%JdI' xuŚ#_.$Vu:=/xhygu?<޽c|^B/Xѭfk7`=-iO-JEItӇJ;o~sQWAVQsSDjK v[тhludRN7)s \r%~/Op]+]L?յ)7zoKxo뉖v MF`MEeV|vg _@pn:>v5HWJ2Wyi|ql`٭[DܑANvepa$(Hinvj/u I[[Dp*T~>"J +>\N>wӃ/̾~p[og6 ld]+6$.K 5DX`N\.P5bp#uR3t^K*(x *oGi4`)n 8NmGt5v.LWZ8푺+M/(o ~m5eOaMe\ %F^jNf Gav j+}CQ;GoY:b+_UMd-qIsQ:,R= 1_=פGFNǏ_mmlvȏW_8S剮U&ϝwYqe×|ngN ޽}caqDp蒥W:lnD|ǟvGv>CɝStMgey +k^5Nwi9au'>>CB0k܍LU4"ZXR;rAQSٟ ֕lz۱n5W |mצ"?"n68B΂='U{} $Kq,'F nGBەtn{WkW{K+kt,]ϵ_mL}:J8Wv Q(q/PZtaqٚ@5AqRjBߚzH;2:4Rp>y258B6Y?-.tK?1Xc|>-.5V+u} eUy}R[`s^K o\@q LrjB:ErFx~~w_eF/.^"|c-;ur|r]~y[bݬ*W9ȇ<#K]`.]Ku3 *Î7FԱ :,3,/ }K'jEjk8zc8ug|/awu.@cr;^5G׼`d@M%:xzrkإe-}lMqm2L$5w&7ŰU:m@] M+9د䗳@ KK=_,>Z4ۉʟ'SS(*RiιO+qjU/H+MRs6܃D\4t_,ӣ/[_oFb4;|֟Wk_p v9Iط ӱcۘ)҈92ޘ7n\}'W_>)3Y_g XS%-_UNEaEDf'ϴ,dV8eO c5~I@҅/&?>:S$(RBMFptd)48w/e!YZđ!IH(r'\ѧ+ߩD\w^ك_icͅtA4hV?uqtQ*$J q8Vrou=m.ڻZX&6h}4^X^>A$So3ZhE[gpPqq0m [O0^QqIUK՞&FJʊ 1OWk}!S.&mpBYͿ܋^7Iо˿4ztf:zݘo5kЩ_+ϙz ZтҌ3}4yD=\S2[s" IVgEb̑h` D`*+CUpWÉQ;-B\YpP"f[:TƝ7gn5-gGOfO>c@See]"SJ4rwAJ6+ni[e#my嶼dTOxt׊~eU)NVAϽH&e2t~(N̗a9zҕ7%_zyzzaGgZo}ɣo7q6 _y5(x.͹܉dзL yѰwLx g쀜5w|:-|0ۗe%_DO߁]^ʉ}YP03#6{u0>{W匍a܊wr'^%vnbrqЖU**eO'S1ëd_W-_QsX_>iA~lgGr751z+4G5}B[c[|%QCz+ kqjӹli_ٯ}Qتh^g1VzYP_DOP kZy+ }StI#JOTE$NNTs8ܳg< 5i7 s5DPou.pqzt 3ga|.E:IsgPzOnhQGQ*\kGV/>@/~92)^;^l϶ ޹7u& 鷴LE0AN㩠h^jڧF^@"P'4Q~2؇4DI6ʓ}|ۛe̩B#QDy*:GfvNOI~Yז-rcqn/E/e#&pq˧ ;2廮#E#%)Ơ4}7CUiM WՖ+4;~5UyFWk^S^Cށ'#&Y#oVk(\e$hc)X_˂ 7[ѿ M4x!$F{#m͈B up! |O&D =qss/-<2؆WKγ̸kKOGNn$MmK]t$%{o76 ]{q.Q=I:M΅eeXS}`N;uL{YWDR})󉾶2 'UQ]^?Q4oI!H N|͛~=ΫN_jkNz:=[CF6Frl\:7pZmV~oCF,w&LuQ0"~W5'z(~eҝVڡ^]܇unuO;ʖ\^"4s5ݐR T&`_)4G*y0F*mද!K+_Bwܑ/o8Ŀ9c*+ cS>دSqyq,.%{7Y[mXt|F8Y=J(dbPi[ ¨th:fL u6h1Ɇiy4Ϸb¼ Sykiixu/:B,I&ȏ#TGȮrN V٪??N"Mi"И9ɖizKG4h_.2// 0Y]ѯ'Vǫ>ҷٔ^=[_Dߌ(oM} aB_zo~zuZ0nꫵ[s?#\34BXx/q~UgD(Qb |쨶 U'+X^䔱iu [Ӓ9r Sd^݀OȲe 2sS\Uf̂6\@!zr~{ܾG?~oNu&Iy0Oݵ2"O=h r 15%eK阶CF8z޸LjLMB]7+/.SU^.F`--T"%ђr^ؗ|sj:֭˯^~-}I_[[učX8D1$6#&n2FUfJ-dkup X*Z^A/,_ zJKS?^N׿߁91|/[F?[0023$Hy hSutSM_2,p{oƌGGw&u,*G`B}A*lq7nOhb|YC+L6DU#C@ PZ7|/p˸KĊHb)!Uj{X;l{f aq1kBvH<Phf8,%bnoCѭ9eHk Omf klJD=]I+5g|9RsĜ"&O.䅔R۷|A!q&F6br4jkGg<8%Ty Χ^KD.IZҊvJ s*v, I'lփ?URDq~S~E_dfV]5}Ԏ/4j|! V>]^C5v|յO>u={ƼN/i$oԎa1!kX4swox.tm@nm ,/X3d9%0I!2.˓Td^m~kI~hF)TlmW r0FfI9/4J0(-򏈔{?9MH/gg,FMHt58=JvOd gOc)chHnzLRR /HXoLNז5=ou=FV~- xfjoIqJ'7/s 6eWW+O:2=~Te<o?^!sQD$PZdx6o /{zto^7'O6 IDATy/ 2bSqNSIz!sЁ=\ꐵ@xzhs]C-J4~㔉;3-p( ʔv)nQ 9}py?:fBSxXi6fQD`UE,u/2@^mY/UCIkd f:I$JEZT[[><̂vEڸ6ZOKavuΞ:q6lo\|f:ݶni[&+̩z,uMW-+>"U{10( {yz3u+ʫG3%`'H6R+7~s6WoWbkp@{́X"U, O<*ӁLnlm,ʇlE*>_xNt+L \fdHkKJcIE;/1<=;;e:Osl ]pWBQSIM+VO:^^ xK:s}BETay+nfWzI?t1PoF|νD}\cZ'A*p㩷dx ehp/Qd^ 7۷o~kdXs~|6;?e@>#ڄ7GX0'WʊQj$l:85ؤ#?|~@-#\)IK&È8c<>u-"̳Nd ]xEQ*C ޙ~Dˁ尘^o!ѯ:(6Q' K.:Yvo/2|1*[|μΏN[):p2yOq׹dT;m`,X#j>v(n~aOH+]a)Camև@i jM5bZxGxqҚI;>>k't3jG,ҍ,"c5F}V?u|4k:=m;S%oV;N/ry+7&3=}y[Pȵ7xfo'?8]@`@fY‡#A\LeD(2Zn9Ҹs]wSF2!)fU1#Legj4[FlؘxJ^i3QӃp".Q@5! hғ$ЍpJ:0[]]|Xa]zuatftgss#2`Gj!؂HfDG-wjn%ўp\ҞŹKo :G';g$]ЮkG ] '8KuRM q49)$߬kCqvq<*/Zi01&j &RH)&sdo_MdWg Q2^ x]{o6GgaOOrM#|=RMɖޛP1=\\X.xlE_/V5~uKtogЦDt2ETu 7yc!7)_9zŦ|͛7g~Ս7 <]uƚ 6d\Ϡ3 Cx۶Cq Y<ÇW_=!k[̛p0 DehN`Dv PW YJXubzj$m%}٧D)Y#5>v3ŃhL1^P 烗-$J QS]V_N9mZ "p>EgNLEvΉ{⩔!:羌JYE~Dð"ml]]J7瀎7șӒkL9M*S*%{)~}AyT+S/lt< <7c9P^H/fTZSzMdmz$} ҂Aζ/Z z>MTi5=e[ijS9V^mJ}~WS~.v W=#MwChaMʤg.(KN4/P>k ܾ}Ǐ;hBٍ\unSK'3:hֆ1~'gp\{CdH39L{6sWl~]:4=-ܳ2XIR Ng F+qG`c/rBvs'"l`75 r|0Ⱥr\Cg36t5u>\X]8<4ç2bng\apQ}awo'ӁmNs|FE:WNA.WkD"t#/:|ERdlquO 1[M&h :i\}&±ҟ79MqbطFBI{T{dey{]*:NFyh }UQ؊^+ -Qتh= 8F7۷t.}0 RK.,M" G~'Vr`zgs(꣏>n޺޸{(m 1k) GL>7GRN Į糝q >EtVq`heqiIgv R.gm7ѾFRMM&1R=Oe r:/jF[[cVO} ٴw?5B1}*B;IA`SzHHEi</ݿ4{kہ<s ??|akvxx0>ytx G'qp<⇃b44.fU%IWbs0뒘zƵH8ޒu6 M.PP))*_E"Mq\g)E8Xȁ.! 'pۈWqyJggٹ{ѠJ谹I uB.t*h*N`Fج{u/N3l.VO9u8L~.ps>gkO4T;!_x- P&? 'e"{Ab$&T]^ˤY% Dɦ&mhN&ya MaTEGS"8x+Ύ/Ӌ+O>/'/1<^^`x}`GWzj:!40vFIyO ZMhڍ7= !Z6L ?87ΰw?%7op-6?xէ3p/1eUǀ[Da2pPZ0l>usL"ZҖJhӚ3>^9hK!:ir4 # .T)hߊ!Ս7o ??WÓ'Ovwvٔx8:oݼ5~6:[F@kYuW.8K缠NjΑ᥵+x}d W)K΀'7A8cqe~DLぐ6џ{-£1ak s:e*6̘ed5[lNVuD U g8.fZwsTl` x83u͔[UT5}yŚ'ZH*ZnHwt,>ӓ}evS_` L=xskxMjp!_h(auz)gȦ}\={,S{O>kC??Ύǝmߥ6ugrt 7id*ixB36j  y] S891ʎٳ50Z^4gg_˨g*}PԠi4"eD*a5.*'pVcnIt 'D.ٿwYL;☾sBg6uʀ*m#Q'5өQ1ϫ9 <9^@=NN~iSdzp=/jOk-^^D6 3Uhpq%^:\L,0_9 RzQ%En:9 o8w[J8T̔h9`vyiaCx^S>ZѯwMUy\?=d)jb*ѫcFzvl:{Le#Nr>I>7_Gwo}ww#,Z&ztg!edqt fRMt@"QOΑZmRY4D!.3erP7\OlL([V Ըs>PWatudž-ds6{F]IKl` 4*F =PcMpz/zN0.Neѡ tJi"O-fQ/w3O*fˆڶ=(R2yɁΥJ葯NսK 'B~Jq ʫX~g3p"W;]!͖x`fV|and &ޝ7`*!XbD- IDATe6IsZg<=y*|q>Hwvkj;O۱~Py11F P(KQ(y?_;ct4a2ZZHgi;IQIe$T%u0\TU[ )40YC zl 3^q'lv[x(JwYh1J飯R+X7jp_I;<'!,<'@Y'zz#zĶ5MMF;JiG}1 W=K"#q owEl`RAUQQԙ'xd;bXǤV[nT] 8zaM9Ps)zBEPqE0^5E$uG/\կ~k^9ɓo9şoD3~g ׀5iY|t)kB1޽sk{d8VHAV>?:>̀MAuUۇlxԃ/}a"飣E,M`pw*NS!TϧvMٺ O1u6sMjLm2KƟZ<:M,]9_\I[`!8ՐX*r;gCDF2#͈밌 +CӔ yQR]>6xr\x7qT,PH&"HUm%&b$50 tJ& P嫼di; 7f_=lpƣu~Ͽ#㸁2Vzd<~z$t=DgxC1{7wC~"s|p6 %xn>8p ]kne le۞?6 )^|x׬d8+9l I%5IbCJ7*^p8Npc`I<#TDNDb>Ɂ\;,f QM i1 EEUitqEghFY8t3B׻ֶ0D=«i͙pb4LXZ󗾘𙜱B @TTXcɊuhH?U ڤGwҠŎ "Vo*"+Z 3hTc1 I]-3Ui  L*^+φqE_lDWIod{sm(x66]2s{>:K@ik o>ٟ >eȩd"ZEiχ?0{?΍7w߹7}&DֆbSFQ%v8BD?+2B}p,Ƨt(Ɲ[r:6 ?s9 ˬbFȀ3aDHL/` G_>5bCti`줮#&_zNl}o+,Ч4*de5e8` "6+(i:NF<(#Qlcp6Xf =UE) ։%Tk2d8%N^Ouv'˺g1-UKyBRfZRmY*-AG ^e=GYo{@q|ŚfC_[p-}c#sl^>:-w+/keX.M[ѯ/a?=teax:Tx^ z, Zw7}{)0_YtxpcB=iI7/3ZGlgޞNԟ\h~9)8d,WrC#"23 k hr eO+LOSya{ gQm0ui6wx_-+Ӎ)9qnno)}C&{DNy^ s'cFmq&v#dz2 e ) E%n+fyuX"r$B#v:wavujD(XtIO;띴|.lXDƐkc Ӄ\9>Ft|2P/:]'LKXѮ@8ԗ'umma܍37N\y0&Y|yJˣWG(6F:P&;aԙk09~UK=3,OĘ F5C4:~3_VOw? qBܬ4^!&܌b%?~<\i}v^.̺_֝vk;'3G_|ћ8"ly2{?`qpqбJN@]?xaSXl͘LP<%R#I8K;7ϐ4Sp~6tvD:t-j@GWNSZ'3oqgADxn%%ƑC&qq7-O$5~!PNG-A(}g^D1ɘyB;8.Rf< ׳?xtd|fi9bssZcafU)ZǸ:%#Fsd8SpYLIz5ŵψ@n(D׉ˠW]B̍9;w8;yr:^A3sXR3A1Gwm0JQ N kXcb)ckpH8:MȬNHmG~\,4Q= ТNqJY*}:.8 k%#԰|s)+9qA- YHsy_%ɣ+h*絼|oMkwڂ . Sr>g4IϽt}MϨdpwkf_D+v z~ӱw ֔H7/):Ѽ N7a/F{DxŽxAJT_Zʛt%O~c9(+mīa_c (QSav t0 )/]orN@r UΒ#9-me49KwC!5!gw1bd; M221n̆㧼~圂u*7pHp$4 fL(83^%8UE3*#" 蔁\,ufODΎM*C<'*p Ͽ2S#9]^Jۼ_UR9iwi-vvx|nq[϶n7c$,yI[^`M ѵc+O3]duӎ/}/:Nvߕw/9rVxj(nkͦ^*dY|̟'  SΙ@`b tİ| ΁0`ji<6yg wnN(z36T8@!N0WgX)A6ųSvxƦGtK:%W"HS4䋜]LnC|*rPuy!RLjG8F uApc \2l h*ڨgGpς-V:_VW7K J$1' *Q 9r.vkoirA"8WI{Ʉer*/NNہT ^3Ncӎxɡ|oE_# vUޮo"m E=ܕ NnĞ|yOIO#7KOe{+Wb!7D^^>qx'WuĻxu maL#Tf"SG g4uUÞ|b·Yc̨%}ɳotCb,y:=9SL8(C.Z1ޮJT)ӄFIORW D^ƫSi88;7wgҮ.bqv{T#\'8[x+ uJD (J~Cer̞N'舍7'`8/&QE@גҵR&ZትG6QQmO)$p:O)BpqΑ9p]7VD_Eviy+~҅IpKʳ,cƭoE}lG%쑗:>9FegQ'YϹ>1G.j[w;oGz_VkW~pw?張=5PfO-8JNx_z__"uۻ"\h 7jfG>;lcD*"1W!NIZ0B];;o5<пyt8yhIAmGY~duNFw!+􂁍6g;n_FKm]eΠNjAb<ʡL])/JL!kgw"ZqwOƫ7n\}=o o&ڒZ+H^ϩ<"I&+D|.Yer+_rA+ӈhhT4N̙Od=] BYBC1ulhZ&q4_'8 r/3ۮ T~ 6atcDWc PIk=U#yXEYUVԽs.dZoc8F,ThBo$Uezߺ(uOZ*^h@ǼBDeX_zlW˰<62ni=n+a+-i&--352e˰<62ni=n+a+-i&--352e˰<62np?eyYKZeR} Î kLNѩEr'tpJh攝5tX6;g''l/MV8K7Ve$<m=O؁]W lI'8}jyp8ܽT<AfO|gli48kqIF#20}%^/Kg r':)$LT3ŢsfW_ ;qvpxao</=bX8FzmT'Nֈ:QW#6:G>=WFOküь27"\u@<4mű#eb+Zi86k>TY%J1%gKotHj=r("_zb-!\)6qs^ֵ]ANp+ ydNlKӾ᯴P)1Z PyxWHm'L %gOz5\Xw hfvlڷ۱W;xE;=,{^wY_ &y!_ 3лȓQޙO~"U4шT/ZyVg§x;kt.FwwD/_2g+keF0`ܘz##*S^V|QpNGoޝa8~E>#YOQZ <{mXSK)v(*mp5K\ݖ`\0˖.됉]wL=o_l׬g:G5SІg3vb[/ꩣֱX9D0;bmp cݑk&]8Q85dmaowhN Y7ʍۖCyJ//DoұѡɲFGSKkyRp>xtԻ+x(!hZ iyc^g5i,y1MzF: vֶžK߄F4 U9îb$]Phh &}~.kLxl6+wESAd^sno0Q=N^ li\ēv'x#e`~F~qqXz{wm'/Ǐe|u9 oݾ=28v4pu}٭ee#G#;|<{|\ IDATp䘒Ni׷ycܽ7$ڱN4I:Yyw?;ad)CJ#Hf. L<X$׺_e"bwϴhu M/obҭ]0cCWfwnu}|8?n>sqvK.]01X$Nb),rPxxiZUbi`pi-|R9]8\2_3cR\[xQ@G;$1'6;#P<2x̊Szj\jE/m%#ۻi;S&Qs_SPWx,55Jy$~u4 娬|d’iZ >|/4%]ȹr!YCy3p}|́ZMZ'N0 夕y|3?W"|_tJ*U'jw||q_kdxƊxnt&eWGmyro}[Mo0i>ʴ~7?.3τATɝmmm o&K#0 D92 ?ܳk3Gx P"di+{ihڕatA?ۤab2&:(l51.)@(kh9\Ax UWP*N 'יJ qAЦDzplI&Y%5-ax-'lK;xb Ft'ӕ͕O:n**X9mӼl^7ǟ7SaKGS~+FRXW-G˼ab0y^~31nGyJ{ ނ6v|Z^ѧJq,ݫeh]Ӳ)ls\ĖLL{^ٗv2NJ8o!:u>|w_xn`#{36vjwMr z޲SNu:fC~Nk=2_xOLϬx ;oew駺w~+Ϩ~s.0]9j:e$ɠm8Nq_Yc r" Ɣ) 3i AlZ f*O`M(c0ԵmkW:Mm+l ~1XFwBq4 1Ht̟Kzg}` y?SqH{)PjlKj j+0ExƌR*CPqP''"ȉ>oA0)oR(?ՠ)˯!S||+bJ)ӘQ77l/4}sJyZ'NYMʹ\*|Nc6ԑLyeهzN2qz0dKhDY_u_@#<<2Ք2`(t!,@S~T'qOzP'>\2ozMMy$pԚ@A,nSiu/ _COњ\(:ňu+,څ1P:Mz0NZS|=7n  h:A7ч|uH{gxɧ|O~{c1;}~x`K<\[Ƌ/JN1bLK*2ٸ9xeכEYKeɌ͋OC\ [=1]lL ]߹m޿)|BOX 8i=uR+څ+/dIWAJc#Swl mm3 ūa|Tr= Dd-?x٪H*:C|`\ˋUjē&:RX,}1, *ƒF:d)(8҆B5>P,kx6i? 4ˇi[-M5KՈSIv~b@Zx2)J_)| -0\?TFdѰXV5&y RxME]ơNY07gےwmQh|MbʥR36hr7#\<ۦF8׿^x;v׸P3w\>?͇;GN_~ixg1{7̽~rwn` ;O[#1^|os4h{pAG+RZ(TWѡ?oةa9AĂs OꎘJopzvS ?x=墒*) "(:ED~ }Ae@8kIRQLJUeXkFFǡ>4!i`6F9ץ1 \a+0r.1 \W#u#W?Sg/NYZ'׹=旟P ==*qJ=p&[oPqwZNSuz5[OfO oBv&68oeɁm{Ojlbu76+Gw>B>$Onm_|# +} sem\ɍz]H#T-6=2r 唬b4;5);·000}'í{C7fl|xʖ-ȫZ ӂm^l  uZ?:h|!:K7%K1XCxm!5d8n\ʣ},^ nOmW_-Аx 0ɇm/JH׀y.M *̤[>N{/0 ecm}MiG+9p\;ye)?-Vs횡. wͶЦ̎]Nț>m@:SpLo{uc L%X⡠Z0 p+Al+|t_ժvd1OGlbo1K>dGEe 8FSzjl6->?c߸PT~m^n/~ 7?fk~Cև{gK;x;1ݎi'vGwX)e16X`Xs 3mC,iZQ"12rF~^_qvNJQ/Է%o{X+;L^bPfw2}5u,;9bߧ8X:ParrXBKb(' (kFPL3:)tj c6p҃6e,c!#vD\ȣuPk𙎤@]Dc\KcRbӴ˛6A84>O3zחhx\E'Z!^'t/tO?;:ygs[EЋUݒrx-ZjhXxNx $#*sfmm'K/<`OYcH" _~C; b kڣ(qT P;܄!yl<+9bǰ w%,mBQcw1&O MOD2k)KjX%KczLxjEL*cqs*QJRshN{=37ysщysZ]WBNby(5 YaKfހ׎SWT/+OiV>iWdgY|Q?F&r7s5cTj'#FY7$a Kz>3>z-6~OX`߽ޗ/k|r 񦐋ĵp07)@"fc4vm6244z+1EŨ2_v c+o-NKz661L(q J=l(nčΩ1&V-Gl e O+Mv '+Fߔy'ioC-9jyG}]hY0/~X=055*C Kd)to5 n'IiGŸȣDqC+rP((4" ʭEp7v׎]T"^;^wQykNj.*oxxE /Ep7v׎]T"^;^wQykNj.*oxxE 3_>GMq)e)O I}ky{L:πj%4)IRt>o-Ork8?S?<>?Cs`sϝN XO!ixk:kwM$&_xp{ELTG|Sw;#>eᏯӛ6F)\~ݷp`#nzY\(n !)6՘&ĸ hQ9]H'7BJ !վ1Hbؼزt v8X7 \gчGW{0w z'bX4φ^<^^1k2<mF # S4-@({x5CK}ekU<S!0N$/ZVt R3dBcH d 'QnÌJ] h4JNsmIB$,9d8z&Npefb 4Z= 61uWgM=fvvf͈ӡi>λ?+z@L-Ony7SN1ګ7xO<:'w^e_;&G A`~Fs*Q20;,NBY*8jP6~QQ_2ַ Xx;A1*ئ3x9?ރn~oa>;g>{wx2 7]σ_{.c%$pA6{a$+u1B5Msw IDAT5X<ƚsx/h!Snų>23e=N*J&lm y2K]z<,0>Ϸ8@](KzV*,$gc,aԘF'ikBbF 2pxQ 5Ԉ:] "|/Iyٕ2[FhL*ǘ߳z%zP)V~IZSCRʃ/Ɠ+*hIٴ~2Vsg=r_nló#/iԿϋRT\|uUçP>#1lZ闍֭O`bD͞|7j S2㚞y晓+O\#ʵ_ޞO?Nز{NK Zq̷^zePpPӂxc>BaB>hͧfoV{o,^E`-^ :Mn{,֗hZ|Mhi$]hAvmU7XƔ3V&{N;[u{ pib`0hdP5C0^]d9c@ђ k*|Sy3X"2 $ 3|sI 75+L=(?9868.ɲ4xA4E: 6 ќ)o#=^B#єD[LFПj\£ĘԼ Ȭ^ \۩ > Crm\{Kf)/ t|n͙6)K}!9g_v\Vގ v~Q}+o 2MNu:Ӳfq\pKfSF ӄze mf:\E3UX`mtG:?w?K04޽7?r_& /z}{/Dpнokoom~am6b P{ep9f &tۺ b 8#NTQ.:v蟆Iƚp 8)wh8ZXzw=Fa5aH̺Gڱ8pCA524j7H dԋT0Nb#[{ Qr6mK̔LGf~ "qA'C/KH:=J JJ2i)b HKYi` M7vOʅQᴖc7S,6U1)y2㬥yeL MH"x]52I#h))Fn @6_l1?M#~uD&}QYy69zN|&*K YtKuc;Qڡ=cPc e(rq' |0>u&^ 5=HꜺ{G3cJ2f޶\T *H\f߭K/Ï85ؽ ݓF{)2}뻝Ɠ[0[Yl|\ sYJvugعFpzXg{蒯O9NB}-/OiB=#12~a =Ӊ.ophZǏﮮ9>B{ n)`iq&6^,)sn_/5z4ȴ-D0*bEJ0E1`!JCg >ˆWܐ) 'Эps e@|sym};=Uh"Ax(gE:YǯD"yT1qT,ZZ=o4ZkDz n4M-,W9zJ`L#>2K+|5SJ?uHQ&Wz:?|^E eFaY򷺁-إOTy[0\V/ҥ D#Cqg'u5˻pp#'p[̓W_ {ر&:+3xMVM|`ۗɧ9??đAV\X؀ =™ `FC&e$]ؿ?m;waUc"ˇv]2Ye,SkE!cԘا ~QBĤNUQx91d$hdh@Zj*' bw ų%)*~ڨA5F "bM^wVjl PlP˜|kEXW<|0 V׀tS5Y/c.Gצ. SPӲ)iOw%z<și< eӨ2_z g.ciˀQEK /Hkxwnwo<1?3W7J/~K=k9ϻdo!ԠNPͽw}'q:е />ϦW>6 VgM=Il-M`57y¶iwlqc﷯HfOp. ßfjrcCEy2zF28*DJJ/ƌ1X4n ЋaO{B: C-m /%*" ).g Y bpO*]A,]ޕ-A=}+/"zFJdlŏ5.ϯSqj ֲxe+2s`u`Lw1~bP=̷zrr7*~=1UJbJW}zd%kz e4a3f;l|y،2!ș&</Y7?2:;Œaqrz娻yt¢cr7iTb I.mAѷ2C\@$YF()<Nͬ;"G)[C?PmS .Nyk<)˫Q`ˁʗHI%_W颗) _ )|bäo+9M ,)Ԇ ҶҳU֌:xH`sG. kg@SԤ0 & auu'mWJj3- F+`E7ڸG L|.$;S& poL/,[g 0gԪ|e? `쳝[QƏ1_|A޳Lgn{k{Mi<}@/~)|g)c3+>cn0.gJGMXQ^ԵrN2);@ψ/߁]/@w!bn;n[l&\  >q8!}'AJc5~]QA+z锄Հ@82Q]fY nSЋb<@qXME(m'1T>6Xp}W FWz蒸 Cx$l!pE)/^, >Th]lv0hM!ec90%4k+S]R;&QJK-(Bc=5S dHU]@5D-MERʗ˦B68ӺV\6=_ɪ|;.>?Z d٧ݿ^1g@Y9% "siFm?y^4eV~xs؄hGhd2ke ߷4(x&o՝8E%%i(Aޣk*g+  $c3|R3 +W+wpO|")qv߳'lX&_54z=O., f7 >aX~'}; 3wy) P阤acN5*[}}RXIcd~ '3t;xKo6yeOOl5ⴒ)ʜAXo}KCz=I'6ʸs"k*&y*ȪQv5"zcju5Zj8y$ '`{\hR!1OXRlz4z44LRD1I'fPnѼ=R_CH*#٨) q[^v|t*.)%5KXM/7y' 'Rߌ"_mj~;dxI cũE i }Mt֦|?0cS׬L} y)7J'Oo0jd|+ Ig7.};-Sl#/ t3wN T,X`4~~y~_ }q[/\44n<{ʏD#]5vX4 +H@b&||Z )1I=`M{>7oN{/_~kdqڂ; d3 ^'iKmsi4O%֦u&^{ch2FI[#a,.S^+5v7dG=RAu@+Sx*7i4u1JcPX7=T?.?&K 2&(Ʀ<&<8z'kxپS%4}OQ:~\/=6J* ת辜g1-hF6?&a4'2Vy,oދy&~25r4n,ePͪ^5?aK =\;NqSvLJӄx#q ]e Lɴ[ rpf`9ICEQێ*o Lu{$n~QR vz71Pݻw{'o~4v.tOy|̕ge>K"PW@K[YaHChtLb@ ZFe6/>>id`ھFl*iWO+^H7tz4LG^e#2"°|d3F:CBQ\x.G izip|f׫P$'v\ V(b-޼czSOS{.CvwAuze'B@ r{)f=3@12SԋS.h`AXoK'ksTߔsQ[;8|k/Oy:j7B$ߍ 6sY~v}膤ި?яx$ K&8mr"L>4R85i5 Y`Gzbr=BRֳ >q;4Fl]7w1z12˔Clc;yX^>l :)#+O=fڔ<ӭz)ޣ'&hŠ*g^Wy;Z\JӾ1Cy;Z?jYG,h:Y? P V<|@YRU iw0>3IFNo"go~k70=k c,*9o*䌣}‹/0~pU? <+}֔v&M*9õzkt֝%fxR!)!va, ?Oy:ac:L<I2}ect@5VIz3'FaHq@c#:J WU1X=FGUà.1(cHJ509'sR,SadiDjE[j.4&+&G^ &e&i*gYnxHŃA|<^OT3uo9A Vhso[oeUI{j*WiG1ķ?wV";r&& e'nxNhDP U (͏E3҄(i\9ZIjVn U'=,ZIg<| . J*ݞݭcN CpIAlP ojfF1F5x<邚z3|`޸q#1JUwlJ H\YNa (kB-AdZ^`{|8`!֓ .ZQ_3-jp@KVoƓ EWI+($N/P{C_t"a'7Ǹjt})}?3[+-nntLeZ7p(ہTdS FJ4,FsZC++mlof^# eT IDATUc^x _%?DO'IVI $h'|I'¤n 㻥(oƱo])cjoFTK~ɧ=8b| 6׻r媫~mYEzx[<,q0$H EeslicEDԛ͢@ G&Ҳ!#Md z9ypd`5uҰY6.-mw=-_rO!d`bx^G3TD2u6vbƴ3VQ5E. , n 8 QT>צH#cj)brgl>{C!\VJ‡V♮*γx)4O }뙾vT6v3V_y{H&۽̔C@L-f.O}igJF ,e. y#aڽ vǷ)Z9Xx#@4?1n 9  ~e2ۘiA/mrN3X}i_g]$O=KC w攁`\ <&>*/E6زd Z ~}4 z6tyWCćMPbD+aq[΄i| |7q8ryo^OfgTc,/qTE^H`f69ae8 լh=\| Y>$խLS¾f݌0p*iTtr/d,k%uFʙ=M+Ӵk/*J%_2+2X\#Ko/E#wXQX+e[\`[V `ZMVs]ӲNʖa[.kc+[m0~ e+.ՋiY'S]Zgje˰-5V籕-{~ςzhk_j&eLF7ef%/R\es-V-k׮0;hS{S]=bq2͛t8wm :$@ o-c@Efmv. bU͊=SZT-ō@K1upO,d!eL`8c ,K^&t[4. _6A0^ 2xƴA *2!Z1T+4I;8`*L1_|+v$׃Dp(FDOq^3EnQV)3OU?j_FA ΤL3 .#+ ;qw]mYmW$J4XΧ"܅1'/ %dY{o~WW]7]{{G3rEcX0C+-y;Y #p}zk`B:+\THy2[>ó[jהϔBE:ɂpI-dMzzʾs|Nl+^xᗽfIjšĦ=A)WW9xcf/.YwpKzt _FB>fӔ z^X SpxRz+9=.g|ٱ|Y0Q fFeFFFs#>}Mم(5RLwu)җ_I]@v•>,ع{5~xPyrL&yyyB ˀȴhE$%)e[~` F"=]W.c? ֬_^paqs6X|czrJcoӏ=}Ka׹bykaLMԋY Lfݣwͥ\NJh?rqy1{k8KqQJE%c7>Z]6J-Sx+:rr(פ2Y0#Us}rTdږ] ܜBUR&lC筬]nWϋ0 vrV[&,ܿZ[n(=nMx4eu!:-6Ӳ)l70)<|⁘'p2 ևjR+BdO<FW} fy۷n1E?MLQhElQAщtE=IC\sIK X2}R#M/ƨ?/%]疝U}<3eSTS5Bl +d'Wvi(pSx%|z9epWF뼲3Q`xk_'lЗlzɾyWXb)+UW1"a`dJI`m"W^덷ɎT@10%F4*@C5(1WǝC)%ՠ3053R hWib;3/b,/ lZ赜ˣy0Z,IXRUmSK-$p ŐKTG2tA#Ⲏ{ۼ^t?l}hgx#}6ѾQHT*/2ki QhiQ*>^t;a^ހ&z FIR]ʚYS#;Fd4_`e ˚,2m<$}^(Ṁ4+%`R(@{Zf]9N/,[:T=^WS%]{tsŗ*|4­jDAZ?ř}.'<䔚M`w{H~ N{W!wQ>ru;.߲~vZSOB69ȅZ%x_eJh>~k_b?;7+Ӓ 6q_˄C ĿAs `GN1|śl3VC_BWoՀ׏pRNebIr!JȁOEi * +CDVC)4Ti 5qq-ufZWiԪG[@4PӚ ^)sͦ)Ɩ>G (IѾju{ L;d㬪^{yĬz7| NlG|=[TfL~|Ø*)FS|UI<2yzr]Vk*vd{[޶FZ35SxJhF,M%OZr|_'5x![\ ><)b cdLE/87es˝8R` mPpΕ!}xf-%6 V,qLX' 3xg+"|{fNjia8XKcƇuVg S8%)Ɯ#G4f5 4w3! @֭S0.m;[1HXIlyNl VoxB ༤9J8\D1Po[x^ ~&qMItֱ_{Lߝ ׯ]}1>Td@9~-vYn5gT NN؂9߹ / x)Bv6-f jv5bEO8*Όd\6vy5 )0Nr4oT/cLhXt[uØ[+ lStG0XRBv yq'uMc[uߪLv|e>)|*φT 2x yhijp L/ǀr_Ќ,/jK|x`|;ê-Qgq_ƖTZgu!/IpO1[C@ c5 *J<0Xa{۾TR+ ,M, 1B-| hp0ȗQa&xf,ӭ%\H4J{J](Gg`Ar|5h_*kN:ldd 'ɒ0%WxLrp)B7\@m<"SKʗ5"XV\ ,VDxKa/{-:ࣷhd,IOl;{VUx6K1:ڿD\Nh ep~A8f( ዞQ)0퇒>)3Ҿz1X7?⇀t!"Z K:Y_r,~.CrECX7-~U7lVmWESG[܋_-:o8{ \G"'nNB}f|(x2=Qw-aeW^$"mW\.|ٍeƵt+x33ӝ 'F T7c$-`4(/1Ѿ17GmtCV$*}!Mdl̏wVd:K6[u: Ä,Wu,|KIJ5NUHGĘp3|!Fڞ ^÷o|T9Rm5ޢ0cҐ*'@f[?ʄ5ȟ ,q›ݰ7J唖{)(BT3ĠkU^{{H+6#)HH-k33,x!WQ#P.V[oݹ% UcM1h(-P hAe[ϐd,|pܱV`ʽCcphLM^vMKϬ{pwo8/ki(yC wx5LI^AP^O;Jy(բM4̯-i#FKS΁l:fL(c--,!c ƦkGYQaad;珋yC+W0e|>FP8}شOGhBA|_u^$&@Ry#g[+s4xU3(2VӆV=[O?;rz3Z!3Qg~_loXpMgZ?x}lWƌ84 >\U߬@E-P8\̑,,V_T|>v0&HJbE GNB?(`%$>Jo@W O8W|"VX4)BO=48LۦD4oCHr a}+ցX2V`(``;3M׺-ao7N7ȯhĵјhi}f|N-7| G)~wnӲu=sg()E`U)^ |1095^Suc.};dkHY'cY@`:Y`  rȼ%7->#~ ]aW+?HG8ԎS|eO\(\OBt 5 !S )S>+ dևSE]# i5p#H{IV>ۀ)%ȣB@uMz0 ldZƍ{Ϙ(W k]RHE@XB@zYh^{7z%&>6L8!A":X#/Id4B>!'_9v3;PuR;?:)SlC 9$aF 9TRZN^ep!&8j(#zJ+t_l9Ъ+(ޒyKNYc.j*2u\>zcIįeTK֠ύFcKcDOYfrSA-O֌]5ֈ_R DKm*oQ甚GۂµUA&O |.4`XzQ6rRW. \LCW{L((V'Ek25[XӧOaV+3/sO~AǓr%r]|rio,k$iiO3k0E(pP5bC2R+*/Aw}/S԰)Ecxk-4xX_ыŘu:+Q!:2~ff΂.[n7 珢rɻ&MZuzS]!Jt@#2E| bhkhϦk=IYvCMѕoWPC ѓ ͫ:)5fe V~QSɲZJ+MK2scgBc}4>ǯ9|ӧ1xo̦eO~V|z4V3W&6K/-x)L)J^[2>ޘ:UyM`xPPCFPB>V?75[P'bl@'/a.(G,9׏#q317gIªLgAER1\XJ-x)K)ʩh,zmGba8^VD;9WWU `h3DX˧c =^1L4 pp'+za g[WJtZ7j˶֓W5 L5 CcL?!%׃*=6GJ$h\Eg{tҤedUi EÏiz?_5K~QEY?r_c}&}|t9 L}L˂3a*~=ΓSwfSy>,1r%XGMw'w~a#3<1Q>)ɩDRihD56,߾s;/fʸPmgWׅHЯogdڃ i5y N9Auq6XR=[0zɷvf x(J#𒠁)i Rlãy4MJVqr4LS>2^ڹ)͜(s1hJ!cb V56#- z$_zN!_&ӊ#_02`}"?llnAbDЏJF3<3،{tp̚5EPT@߇̷_rgP4erν:xM߱ցzz।MVȰTʰ  aɇj8'U#+g?ó0ŧMFR*# U•:1McOR8?W]$d9[t{h,+n\(05m56R=^7`nw)[X*28z5JiZ,O^5?LWjê|zf>kp#(1-dFuycݞCϖƖ@qak|{6~9@VG7^Oo[ eVp=V m E)*G,~x,qOr[;"r\fiIn'mj9چbyZd++-W 񩅭NZSXϤhU^)+03*Xip@:|S=B?_8|U_YAUy/\s%SMŸhPE?ҮdZ>`i͙g+} otցv,5ledߪԛGigr#.?{o$qyfTuw}j VcZَ9V$^Aq}T~>_UCp.7Rpd^r(]h`Åa]7|#pY<#˨u;'&l466r9<|:oNv_x>w75ʂۺ.NC6Hd<-&%:|pXm[ltCkSt % :FyzD(I#T} =2#=ޓGa=1}G)R KT0uS &AShkPN` jE)(*{ }W#6ΞGG ]KuIVUݿ z IߡM۪}q4s.tfݞY9RvVWکP5ױo(&s<+Vol7-~t7uop ڻ6G6Uǚ /uO|N3+=Pa]H~tHGuRL8-py0Siɷ][y^@*`5s̋_>ur3Wx\[tr?ͼ*): gm>'O^-&?K$MKvee@R2@p5gsHxddAB/Y&JC~X b4eS]:6Ua6^=I&J@nS=6+: eMe@?5XO_%T3t8ӌCij7՟,vE|2.Y_[)p5֔΋?=hrX7ր o׺}l_ck?^ٰW›O|er]0䠈oL͔'&/p2<1:N}R]vBV:g|p{ymK1H6Hah1lv:P8.{0Xc!9 './|mj.g_⹆\ܺu؂D^` h ߝ!F:YJy^ _Wyw-){uG#r6̩: !Po&jτ3i3hM8ɩ}p,3˯mU ThQiQzQ짐BJ#_=#5g 25u':B~t)s̚v^~V\Z%m5C~6~)lƲ4_=s:ʁ2'3uCJq.=*)M>,VS_"ǟ$!/Y4rzw$Ġu7?=g/.m{Kc yRrx/$ezi'T>^DK8H;m``qݭW_S.A)WzqT0hp *g|NB3cIVu#N]űg6t[i1hμkfӫn~<ߪ~\L973.N}iKc*|S68ifx'PmmTlE~:d|8[t]ҩkO7ll}l&X׋ק*/?u9$)ݸU16kG0΀=Gg+Gң=Rq*q|*up⸩.8lR犔E /c kru0pw<f />ZeWGo)8E[jDmP0Z,W]h^ndekd-%~Dud^L?7[^i2뾮ފAg0ex ]a=)R# f=&ob=di tɸ[,u w+\gkCc/|Y=,x#MmA?/]䫂:Yy Hb XokH RߖmGя揋@FSlATh ~,nv̍|w Iǩk7n5WqBC{ā^39{̜x~>vϨۗ"7 s#xFHMDxjOYĦbN|H419 hIE(bdw!cHsB$V55Wk&'"M/䓙+usK"}Eu5t*)Ώ xѭ3_=\wHoӐߛyӺizUSK8*$6“q[H'9u-24CBMRj򺩏o0zSnذ_2o]&am]P޾܏jo砩mc;f'[é8FW҃@'<.^3nlPZN:&(8~aT#|T: %a7{q淥_mk/nʏT: kTžfz(GPH3 m oaT*yU}Pn4pf#O]p!|O4nXSK7tc>]'qvt:͆L7#0^x >p9sw""k%w/w?("4tz9^0啨LY^Aln; Le803Ns0 O5#浄刺71*{Lv@:4fBFz-m ůWu4|XآCSe}r:<kqjh+# ϱkcjWls>\aj1'-33y몴~'=@oDoc .AbZG2w4 O))[gc% mK~-kg6}}b,S_/vyBk^?:.q-d`ȯG-nO]$xсC_P=)bvΔD_(0@쭞)qO`K,:,}c#=N<+k\Ndj;Ѕ{(ekQ. `GGڀ+\Ʀ:+o!kHtC-r޼|@^;V`jQ!f&} ԏďfɴ/m2(8`J|kN;wMڏ^VL4]JF Twg q6ӱr`Wc,[oO9Ht+fK_ k`wY>=7?`f'08^͢^=l,P s+ 䱋h8JݙzQfx)W}Gq]k1DšSv𚍵>ԏxbr .z\(c~_6VbZ6u6TzRw.Nrܼydv(7fRcRV`][aA>+ 4G0XZrӇx⿿stb"Kzϯz+X>Otm@Yˌ8u Q<㵑-Y7UZ[i&@dP/iE?7)8oб:}GۈU*@?%B8++*}tXȌ8KA^~L><;2Aj_GN9m: IDAT寤/kaun,kE1Z}m)6oeG~vpkus 6|uՓkw5\322\9|mzn|YdmށuF< $CxT?1:,K(XMqqÉZ\|yPO?tq4!@| :]& n2P;;}.H\Kŧsow>ᆖ ExUNdAm[ TI6ƚ4#F ]*}m8 ٟXЭv]S3>YaM\1BXJ~64~F8(̈́-uqCnI^')Βǧ5 _]kuql0د4>ovZimm;ׁ)N!G*(kl-]'ج΅Eu<h*/ܴ?GJ٢Yp~5~K1mڤlUu [8U?Vүl]L6mi`m <lp~ĭv$׬H=y/幾U61|GyMI0K~T{3r퍐EۉQ g=+g<6ܹsh;#;z::ݩˋI_ry/묉1Qvxt%Ǎxcv"4& [Z.Ο=v?.tS =|VYү˕(»sSNNF:9N3Utiʋ'`\Uʶ\ tя!bu~ɴ*;V4O~OXH;ƵK/M}WyҴV;]E7sXRxԖyŊ(PubF:U?^,T/иyf~-M:]Nއ{=lq]o_GtuR/_FQ,۶ރFx˧XIv$?w<G=`@d+p< _q>0`*3#1ȀAjLB%NAY]ΧwdJ n J9#Rp7cVXaYNu!RjrB Ϩ&}Ì-/49p^ȻY6Hˇ9\yঀ(ֿl?<=r;>DIz^ 6V"5tFzuoEKIEKgL ."5# MY!~1o^h5)۔^$8Jx#@£1/x+2hdMضb!1%II СV3祡^E* o`AZ0 :n1~3\^?Ԉ"koVpxk|፰CSx"Bn,օqe QZ$Y>s5ݾ}{@Kn.¦gy&S_^U =8s˷_|ɠ̽;O*Cy*b* ՍN>zg4༜=sns4eإqp3e M9NT +J,ۨzv:zƴUeݔ&flIAܹx?R D!5ڌ HaeM5PSNh*J{n]^+SgQ;4mϕ+_^rz{nrԴofE W Y,Qt,IQ3.:S;g/eꕋgәkMCLRAȡ!W:pM_v*s`8oW}vm3~6Uۯ$(g3Ig{[:lA,mCNT8xE k2οץ"rTdpxX侶oگ!wc~< ùH֯R^ߞf&}G?|XD<\]FF#sMEM߄RgnxF8fNy%Α3nGgN?Vv%nNxcV@3\]˓//_V4sk±#PtIG2&QYzF<-(Fv:%>umA5#,]đϴ`/Z8ӟ.ąŕ˗Xx!e"Ca9@lQ;M%WjǞ36n`k\qpc(e?ڡ+eЈ<.>'cYHf:+Gؖ~k?lg:WZ|Q8EF!܄fz+NG 𤟕҃ldtIz+ӌWpA濱'妞Dv\Gq>scԁ}:}L< N^{ZDl Mj_oXÎ7o~I낛`F ;y@6=c|?6aTD> R` CD1"6qSʰѦSg'~-5f#\vaZHQ[ ƁF#QWp%w{W 4M 8G&r?m?_ǹT+x<Έ=y\B #oCo27N&:'s3}q@y3ғʗE.Xw='|2T4x;Ft]ڧ89uQov_}]6d/(/|:;t ajk/xۯLO"J-Oqe]ǃGh`qǢQyw8/.!ǙTSF–na͡Yf,=M{dnp$b\m|m Jk.gAÁݤУW}miO3TSmOY |! ۧFTBQP,ހUoYSFMaI:x+bڜ,q͘l3[E_-Ҥ%\넙Mto8Ӆ攭Sju m ?Ɣ(Pm% +5ʕ Oעo a[fo@٩O7fr\|g:tdE@~-3uIC3²@ۊ|0j!Ε8' 7wcy6e agFԻRV&MXk|'i\-(:>9A?$qGeQ^Jѿ1EZW8hJv}lJ9mFP45]Z^Ҧp(Q4|<%%ݝ}1,FSrJi8Ѣ{BL]"yx6Ҥn'D>۟.cZE$mH3F>֧.2e +#=r.? K*4EҜP݄''UGwOP(lKZˣU¶ -h5|ٱ;H3 ?wV8*<(E7R8Knm (LLsxzgŗ_~D"qѺuQuO(~zD͝Nx:GdYdA :7 s=t<>:x:<?Fn$8K"Uop`ts}IVtƧ8[F&|䴝N[Qha^W\U12mE܍:va*NVr!VM#}P*S|,w7:O[xt'mNݾM'y􁛧8un١ΆgpϳQѫ/^88/D)nQYl:q4okcyd6uEYaNQ8ccӭsuǮ{$b|HW1G nD$R}-zeI?FJ#Aԉ1+d) 6b F:A dj׮3mYWf7NL|׮6>tZ`.W@crnX  B1.vqҊ6 a4f} h%|=_}wDppC;裓4ޣ,ާ.򤣑-GA٦ fUrc_IQ4 %,AF7r/OJ7Vkμ״-mƋ:Mtwo:C`ʖFgX/pbqP4-"ibnNީ]ser_QYz*(6meyW(TkZg-ŶW{m>mPD٩b$iN~ҚJpg8<̇~$ Hl{#l\`\8\'Y'2k&@Y]JotڥK:ͯ)o9$dN[_mFC]?u׷}|}ugJuօđ<=bra"bq/~ M?og.lD"Ur}9}ĢiO'K;l@cT=zd#[y };mA0/vt&!`"- `ɋљ :]ZBF.Nim 5E4* Ә:TS_y |IjfOHb؇L1ɜ@X;8xfuc ZG+9;h8䟁-m񘽕VNAtURb8FlmqD9~"꒺F.nڣmf. := Ja%E&@smTe9c`EB'2טl~jꊌ8rVUU?O(m;K(v҆[x`9w"INM:d"LYb hq̩gx|~둥+D6M=;kToP4מ9y~sZ}ҌfSUibm}(EwL @ (,|m $aA^H4Lu.95 zݐLGX )ugXz󤦀*d6JeS~9}o幾?~=ցY%l%?*]rvW2O408\f"o(/w;lcQ/BGM_~7l#ehV7f6QO=k;ƍ-،Nwu_ؗO.Q1LzR'xN3UGgAP<zXmE@C O_>D$Qʺm[nU;n\mSv+Y K/xu:L{*L/)܅|Z0zI—(6mbp_})8.ҕ鯗={b(>BoS/QjB= ERhlѫKoT#˺ֱlU3 T-6zoI4a3hбf^h8Ҧ"/uhsk6uo4#ݨДL>]5sNoоx ~\ׇ;eAȁ*9.o E ҿ7Sv8Wdo߾׵RNV"xb}R~︋CW^yobM֝ܜp%Ľ=:!b pm8L?X޸~cs.mEluYՀϛ[nFȸ14j~L"Bʓ:UNyTvsW/=}@n3 :f}ʑH-vyZ BFj0DZ^`U(a'~c1"HyD&\(aKrCO18GҥyQs Y"KW2@) 9Eʷ1?zE9gᴤNOOD SoDnNoֱh@;Aw'h桞9B2]5AoLy_1G|:xSYo߰ 9gr_&תOE~otuJru[(_|E~҉Y~G7xKpJ}  {o_2T=b'fޓ7_tK/R [<5I<%&7dN_ YǮQ)|&ހObYӿ'DIN HY% ioƐ֖RٞWگu*pt Y_?OҮ^c޿xG0_y)G/|tA(͇o6]w v<}$yΨ0v¹=v:l VcZA}.D}Xa Q3cZc(FU헌"O{r9AŠ>+UMdEߜ8..`8GTO[gMO*9ŢMJ#|034+l?Z;H]+#`s`J|;cwqG>z\ى"hC`RD-͊GߘG BFuVA9T<鄮+th[vB֒owpzsE۝Q_Xt^ nԜm(XpѲ cS wNe LSɅ6e,:..ܟV0웶z3UR>?¼$ i4^xoɐU[f~tm_?b7_O:N˺eɆ Ӹ 2E tTȺUd};6a]@YtjQ>]ޅGGיh8LF5~?mJRwZ91p;_uxB/ߜЩЃhcPNsZr^q`Mx6L51_T+( B o~;X&iųaNk"}JjuԸM$ZMp|MhnFM/ؒp\&8n[`kylȊ#lzϹa#nWk(Jf!#ӣp=ש88q=t>E7\rjmr%(cƔ'Q]o8l믿s7n\S;O1b~9XNܮy. q#?e{O{'NN/ ؗ?n=88]"lC=s5Ӯqo)ts` _(x9Cl>2<"*ߓ<< GIUufƩ;*J5MDF%AGy9pZ&LN=8HnԨ*_3Me_&,vh渪4:($QVF:QGTGTs+m*P=Bhmm;/mMgqK7Q"żk#zcRe)#T} mL DSXG<ťn ޖ~kd?W^@ WzLG9P2$8$@n䠈i|usk\k߄~L>zonvK3S|:[.Vy7AiW_}w\ݺu{M~g/S^~7n@L1dA5YUEc86 L̵3KWy[7KSHw}y z>]hcd 9u.'8sz'X&b^$!W䖣r"cDEuhoF,9]馝Mãl|jZJ'z&_94- ^< K-us+`We$?"o}rzGYR}p4]H %Iڟ /DKf͹jʧlržaGFΉ?6rӿ(INa6] $_?:O}Y(]J4: qoƲQ-Ͷ4&l,KUxǺooO'ȶ|گ=tex.w2wC4Q(eN{D^丈۵PDp覾Dn]f2z.^{뿺ߘܾO9>>NbZc&*9Ea Z>` ʷȻ>Uiwy=Vv rjPhܔ"N)zj gy4![3C؛#~x-YFpn%:"K8: k[`98uqbq%IO?`ZE[$!+*1Uzd`ȯze+ZcS:J:2~t#zEZ; w5W5Ƚfc?'Mۯ΍:әMT0POT7,^nq:K^}"Ω ,yO!y m ,|VIIߋkXo\oO]Z>7~%)@ߠG|@ ALf1^NqoVrۂ%S'PK yC剼^07鑷dZm1y'|dAj?v=bkW:V Q<0X3+7 ,Fqxk߇[OΌ`NȀA jttR uPݧ {Γ`$0YNrNͻt;GҘ@[&D72M>2"8PgaOsd)C:+ҩ'Ag?qox"6^SF6զ"ȭ^;=ohu&Ӣcܪsez˚&<4@pS/ =픱zE_=:>H|Mg:Q;\In7d4|q ]#QйɤMAuQTJrBgz =`] ^{zA!V#꿖0o:P!݂m[]^}b#|ھ5D+ʘGoM]"Pi]]g'F_DvxJnd6Γȷ#mӮ];|?p(_].n? ^i"(T[s.l樤< =/} yCV~,T+ '{$ƹyS~n%TI8nJ1'bmO)>n mfĭ6Te9Vh^ss}X7ylФ=-Bҗ#f~̏}sp `Scr7/弤 qv(à 3t˧ ezT3KUK~.Yj攪eK⠼D3K5E8 "L mt͹˳1IdIlUq8O?Q];Ju./OXs'w:Y6tj_ַ) jyoO,_s);8xClBō7%yhx ;TQaM" 26HǘIɳG56fx6 0E-Ib.weV o V= Z"rd$/Xhl+bR?umg8g/3q]%ә:e:7M5zŐI8}8&܏?0Q8M_a㔜ǚ?ARJar&$ W$/O,++J 0HSDu"O|F#\Ga[z$F(lk?ҿ yV9z'R~_95 @8 +A6ׅP ,n3ZFJ'ʛ-ˆz8fH_KFl[y7gn_ή :}/K7\t~Q(>"9>%Ml.?3taeLV5 p^CpQG3=gb}acn62%>Z~S7~Ϟa{HNm#||u,ӑ"KWUˤ##>4484({:NG|c7]ʌ.ꄮ曆|[O9k)OdUDf:NHaxꤥ޺ m[M' vw>S$afGuڹ)v߈NSM_ҹ¦r$ʴ1K,qVt~84<:ӱzӾ ?.cqy^΃l]0WE;6MRX —T墫cg{ud#^[.[m_\7uzWNR8sziM2E@5 A)Z(;(TuHpNp/U6ѱ*>Q.8W6џ]g>V - >H11Oysi, 7p!ˮDM@pܾs{Icz__ڋpFFB<]h]s=%S8lgcn,$IB%m \÷-bs=*}^ip-}N`vέ8=tb笎 19q_ܿwu:'Jtڠuר!)Co ih)]1|yƅLFaq'O'F0R)WX7եfӷ: sC"+hꗨI^}6G_uL{!mˍAz*8OVȳȈdm:96;e#?  Rߝ/,Wǔ?M{ݒDeq;i*CNzaX%,"K"gU!U!*:'ϑz][mϓ]?r\ߔ+y- 7P_8+߳G/"/ELRnP7BZ Y5/m|:(ݫƍuwp}7wOesSv?x!{Sx6R:t-/_^xͼt[E}~V#2 )}"@8:: 8l'vO9[/ zZ8;& YDt8шbKKv32n=H=)fD0udx 8l"Qݽ>gX IDAT?ٿ<{w=~}w )'QS0ٗ&;ОF̀ktq* %'82%("AF:z[@ @dʳo2\VD(:h(_rD\nQAw%8w&p֕ƧӠi&Mv8<٘v}sUgcl%Xl{Fۄ~t:DyqeNǬp=`E/Iz:FU@V >oC?K ^R5?򖾝N[gg56syL5_j9Jo(ș;ps}g$RKhKfrcKp3fwrh)=t*MW/_]\Ʌ\`_Nn"r8' ^XM'p:_A D(s3 #tDZt!oDY&IKe?٧-?n0o:ݸ{aoL%{dg.]ze2ؒшsxO?^7/e)L#ztN,ϝݛ|5J>_ˆ)'.>3`lˎ<6]j vt8QbZly^DFj͓΄nNLE}qPv"/<2\#M:Ot~Ui3rѸNW7N`%LRfӧiyѐm3U^%N/EN&7H^#jETH%}SZsGF] "эө'gg4K.Ye35޼ F j2ŋ|$9C KHWo: xu4M+LY`km9t5k/t1c_:x,Hso <Ɛpz2]4ZODׯ'٩ /~Se;Xiԟҩ>DD[kwPdpqI+>W?ݹz܅;ᄋd S_o>_^=eYeӅslqpz4NGvښvn}[ovnUYQbS/,_~}rz8m[oVFls|?ΐh6 y}Ftv~StVi <+\Na[(:ug;z@Cecʏ:KN]ۓE:QX꒏!qO)Omi2'uG'&<jL#kځ^>g?.:T&*@q8"cV,GO@|XR8~G>U_4Eƚ wLcl ~ZmŠG@_zد ff^Ci3038(4 `B }$)<s>]n w9w]N>z#c1Z!:Q;đfY<ܳPbh1>3Lo21X-TNN\‘w|V0H.>ieDhNNGW5SL籰GJ|F QCpHzr: nߺ#/ tǔPW./Y>]|˾B&=ċK/,.ҷ&֠9*?ỞI;fN}ɾG-NI4Oy>*挀{-Wta|xbB?0W_Zʓƨ.@hG3UHjk.'u򗗋=N*t\Ϛ.}2lW:+ΚkpSQXMZ9b:CZ1lyiMioJ[i)a)tC%yH]/$)CkMW:]o?z \?zZk50GOs*jd&`PHfQt F؈M)_~ݩ6}|v~rȈfu#Bw&jh#hd]1vx?,6^}tȠfVg!SC{LDq^ Y#vFgp`^}GL>wNqkN.,_yyOa[y3g3┛r:[:)=J+8F܆}Vݶui<#Jǹ|fIѱQ)s*j+^1fENI\~vqv`gPudg? #..7*Cin"E1rK}'ezm^_ѠFJ}A"RN>1 K.N+dZ6knrq"JYHGKgB6tcö7Oe&3g.O݃k8A fH%/>g"x#Yr0^x1| ?!qcҙ3tLE3ՙ`oOm0&.LS+^|:Y tYO&eT]oyʧ!>ԙ'E/Icpج?Hs'x8L:rX7ӗ.8zzJMX̏u߄-~O{xywzteeNxg<;աPMzwx'ONcQiR!bZL1OP5**ܦ])p+Ћ, iq 1/Ȯ2MXDԂoqRcNp3F*`/M)Gun ȗY=Dfo(v~[/H4 _ouNqңb54wg33`d4P=Ly ΃U&|,X, $+yHhOU&xEЏU ^F*aV6*\aҚ“Gaq-01[=0igoѣXo^7GIi㮟~mzz/7z_R灾9PA(虏sn aK[(ZCswqrd|Uj=a=c N`PK"J*iu@t/l0OzϳN50/'4RAǥdcRbi5!193ISQ݄|]N}ѩ}U\X<=GIz:Pȡb=yXiXgyvIP$WQ&-|'5v]^!I=o9@q,۲g(+N|jY^#bH_I?&![jw`ǡg++{-(gLsr ; +{Sxk 0drmNo#t>N,*w8 Qrj-x NBo752@\k51ͷkcpiW4~1XȺsjqH{KyB?q Ur$$Bl@|sYM&Q|X̐p>|-ppX~W\aAU;Jh#d 0o'b+GuR2,4C/y~<\8ǁ0yCԖNe( ڔHevC(C. O"3K/Kxm-hpV#'9Sχ( )j : ikXiqYYي4y,[(Q8j*Ҭ|(N84LpIH| O%?rW_)FVϝep/IN]L|~x`y_+'W=ʗV $Z91+¿CT~8H_ u1ON,9a9$+P<#&x恦Gi"Ծ+4yCO ygˏ<!D%ׄ+,(dSe2+[wReu5lII`Of^yU{cW,GAh\t;¯䝗TrW|`1g1?t^吿ݷ2])?ƌ~K |,q}aﻉ|P{A0x{ᵊ8=`l7Im:3Y$XN;4uO--nYjIH2A׭,X7VLUVdeip.7uΥ;|I-]R' CQaL$e\ba vΛq:ã7ߖ,>Gy;d٢pO񤭹-E$ҟՋ74l"#^i ۊS )XFwݵq%g,}$X IDAT <)bs\r}Nx(0u ŋ-I>)rM8 E\<ĠثX(%?W Q…UPUUhL۫ IcQ֌,a-Pu2G̼ (C' ij/ht85EC\M 4ZT՟=,I7=-vM:0RKgdl՟E^' [d=bŊp:"L;kVY7u?Rw㍫*c]P6.YTW̕%hLgFts#[ںu+GPt.7(Dže 8grtPY+!SFFxՍ/H Su4aeoȣϲOs6YnPxnx(QlOP4    OYٽIT̖51ݡQ&e|?rK9v:!Uݼ"R.09W\RNm|(=?/!9ӹ?~<%ǧA|saxN0aps0ӹ? o7 tw: ;axN0aps0ӹ? opQ '7c9'K' 8w-2Hr'0<ìQVkP )ނ`V_űCMئ%%KY<)[lRq 낮D:8eW>'YVk6Z]4-vP-=vxS]l]pC[67i ,;*[-^X쨰`a]]tɖ)Q#b[k[u $hա'8$OuxH`NP%y"EվVY~V5kvaa 3gll"Lb8g1dJez coQf[j5J)=XPv"K(L(("N-mM Mc)r-A5(э 泅zi,:|aNDkՍXtϟx j)(gٲTqٶc[IΟN1񖝶8,EV%eg i]]]F}f kޢSN=[MɧhR:rW_uqǭ06Sت hߠova5F)-XܬO5BEaPPGI@y"& phgoF/\_]B쨣ܘD<ݒǕ C DO®A6>q }_]&T2cyRxzi9x _pu$ :.i6'2Ǹ-n}dJYAP^XJ$mpӳ-y()Fv&g`PJVg.Y8B,;EO\ ӄ3jDq!' =N @WwD5 M>muu9gS-v}Eas/ vq3n8>+r-̍;UnGaŲ̔%ݵI۠\s_fǰK!Û9)ʵ~-PYٮu'ILxW)8O).;rʓ!CiY,w|KLD<%'cV/xdQAS*30yyNF腗=29;n3H(b@Wh;}oD{FSN=Ք2ݚ=l݋,[wO/-Nn8?S[|GjDWcBX'oű\h 'g˨#IYs,wءq,.,vs8v0Ɖ֮ G "/%4pugby"WYX$#JuqɃr^uf&'h(V/+ Y&g4 NNėNK m/{S>rT!1G&ORYU IOC= %̿𿒖$.<'5sT.9,¹14i /%/\/pDG8XtΩ-3(.dr>1JV*J[xv9 +gp5ĚE'z^G a΃r&nBcaۖ5wt*Y6%G,OHy.}Noq]zo5\ze뮽.el5Jߊ7V^ W\7Zg*zOWWuHQݼ9hSWްrӒ季C(h^\LKڎu",QXPg;'ʡP>ci,\8>VjDr0#@z,^C|/IEXNxväF*w== Aa“O\/O[UE~Dm@Y1mwzMru T!e^/0W$Vg7碑BeJ[j,8M(muli#چk@xGV%'j́̈G}e>-ù(obk̎Z놁f6Yv[/oeW[`(/+N=Ev7mިϾLPCJRG-KoXBvqԲc‘KTzl}6&൤ahY|{UW'p^L7)xRȰ-8lnV}bfi'xǔLˆ!;MAϢ)~`m2ZM!Ҥp+OtR L1P},hp(lz _2IO3(J):`Ua~v:7zy9d1Ң?^pwF?ĩe(Ӕ p1xav&<#4paMyG:K߄G:e}2Bނ+c t;+KrV?ts>ƙn(c s v@U̬R9,`*,^ ,3'n }wRLJlڋJʀ]b/%?\ E~x۬±̥B^X`}pON); g>pqír%6-(#4t&*ӹ뮽!娍^ʊ`͓rYg;l)\9RL;7ŝMwC]hh>MA,EK_CiROu}͚: qERƖ15śXlk`v%o6ڍlӛ&|X @3.<$N y2#LY۪`Cb,["'`JwOuݏi N\)&U^yv" G%& !N(b4;! ;x^W,ߘi[YwR*lzYZRW"?՘~7~j}eUa3)٬8Wp8v?%ٌI'IۀQW}k (91mO1\_[c”fK^|\V &\ëNӜT.V~'A5,R`XtgZ覤;_MC\~D&'v t(2L*ܼBLds꯴ Q@r'=7'ǡrȹE9~*hw,!Åqay*#9 埆5$ T<$7H"18# Q++kzmP{Ys>kbFq2[Z䛼U|iws-Gַ?m,;(;<ޒikKlN93{yFݚU̐n(Z:L#5'dgTJ,;3C]AvD]YR]>qC;̙aޚX%ǂY|ym=FxM}Rk|9h"(z5*zk7|c-gP/)pFYSqʕ+wDy:<SJOr^F*_g?ƭD)Z@)1$GM MDRD/B_Wq@U0~|/򰍿8o>O S i@:6\&U&}RD̲DŽejOEw5qS>R>ΥXHȇuߓXXt GQ3zcU"j6uƵ:8n`o56HunnFj 9m7 YިwG^LP\bH9;;5LװK4EE֨6i7Ơ$G7u,eζ'L` !/?YwbuWX]~J'<`\?;D_ϣ1a #y =üB>`v@s-=w.Rl{ +P>vdw%ǶNJMm+_3%%@y{yJCh֧Y慥_ꤓ̄}nm6 XlHZ8m90*zKA갸H(&(RX8;$Egʤ-Bb<Jd['mZt )ڦM)[]]OH[6Rl eҹXBP6JUm 7ªCݸ-?(P8ĖKIabf(8 !*)<8zS8%?4QS 򓳃X5IS% V<>BcP|qfmQXUYv犒?qHb-E|ܸ dƱl{8nR:gȞn [bFY^H^E,)&mYtv.Dapɺa;-o¼/kZ1dv^IJg([XE7P8UJ9eROSҥ4k|es=v։zy& ` e.h<˟tMBڅvqfeIJ)N(O(dOq6TQp˖i[x`tge A+K_ |q᠕S19κ$ ; 돇#}$':_ʰ rDI =5>ż%RSʀsSXɥcA )&eJJ4Ⱥչނ I7oR5]#ːDo1S7̛tRNLA˒)7R8FJ'Ny䬜|Xnb$\#O)x]')jX\p\QI NcR}LDO]A~լxN0aps0ӹ? o7 tw: ;axN0aps0ӹ? o7 tw: ;axN0aps0ӹ? o7 tw: ;}G7<#0wDO8={N`yTrxN(%+Vmmٖײd IDATś,XGtņՇ0װvQH`6Vn3 LUePtPל(4Q7,K(^ѢcW5'ű+8.ϔ$8D}c%L(S],L(VAYE zr/a˛@ty{/qN˯T>|sO?ee'5L4ޮ>z8/y,P2 ϙc<u#QvzժUM`b.4u-MPTp8ol59B%E ¬EXepp19R.z5 e  ʊmK]J ["َc>BkA,jQ&E]pB/Z<u!j|tx` W>r$%܊>h<)3K'Ϋ"?aNbN3>&>H"P{a9yYEq(z}HM7}҅۶J ijk"ŢOSjP>"eXCY^(/[ǏQpXș0&DɊx"2KCQ,*IY,Pa{(fX8hNlMr  n[ʧ'L^GX^^||Dv&:D*iTlŤXtG=ӶJQ=Y $Ҭj0q'^$JSGXN :˰T`&ߪɇt@8==>,;aw }"eyh>}awBOɍz C8+IR&.rn%X$ [y-tQr*gPP+:3?-УdI |4t'rzb)FkҌqQEYj`b"R"P)_:hd-)u?yc0U\;՟?i+^QWXXy%eD wH>VWP5vY%`~;>|Lzg1EeU(e/X>ľ*:7&=.Kb!+8P (^ׯ}q_@p!񐠏 ‚-9W&RFP>8X.ۆòBǂ6 :e*hm2AG!S)WN"hg( "#O\i(fX(ٽV?HBiqYXX(>7(CmkE8TnJdɃxی詳=Oᥜ-lGSZe6ϋɁ/n[X8ڝA9a)2i*!gJMɷ(w>y"-Arz”E)77iQO%/9>Pa,,TvA` +ccX~@oUM'^:|x1 T/ jr 9#lᠦm==|v% [\(:sz[T٭RT8SѡpÁW,"x",Y,`Xk =J )"|xBj'(EX:X$]?*HM Q8N%4cusLE:6>CۉnvX*= IREr^`l.4n1d.Y$b(got\;=mGJKuGZz9c\=d,tG̷WXѓ]!OQ`"qʿ$S7Y]uyY:op/¿"?a_g8M|p>Gv<$v@9!d" a9Oqtzn "6T8-fyBA)pGP& 6?XX``oxE x_YI؞c[7tn>,9.0 DqR;MQ$sw.Tx+RL4r}[Mʐo:0ʐ[;,GmjoABN&LY5ZqK?Q'V'pG?Sɼx}r0\Se8,6}C\F0S(^w\Hb'oS_=_GX.hB_W/q Kcu6^m^ac>@YM*+aQO8W(HV%ac7Oq;7B7:z^ypp\)G .|NaF)a˓2Xy#pw< 4KDDY,1gĵ?' 6z$((JJw;%$+b򿞯e,9fVX`'l'_yFB#^=ߘgǿ,OE3T^O'Up[/~Bcnik v t,PdV'Ty%v&XPtϝGy&m78Z,FGђu߰3zsIlk=F''_⢢ѕޘ&+mP?=lڙ(F4ega;8-q9>y|a AR1J+Q9b Vp'/'a N_% gyw~~/^e[[+E>au8uV 3ѓw tS# Lwe#9SPLh`r [' x븃`9.T.P9?/'VX|x#z~LoS= HXķB2FqwT~Ntc酾/"X>^"M6etW)P: cf&IW;hS{3ʉ) eFʉ]]}P(P,(4N H`) @cP~8\.gG],GraeR0Y< +}|X2ZU)쁢'_W`B95^,Tovf{ ΂iIZqO`﬍JQ_lL >rbaSqL;hۙ}8yȨ¿/?m^$@g?"B@!Pe@>aIP18 &/%KۇQH6a L%e-*MR~YcemBeK 8G0;KeIO:awI968ˊ,pP*a ` e)顋4\SzA=h o~_|C97gLg.C:>z2~ƍXYZ~8%L0-#&,<>' !K;jg8߸[oY#)@vsHR(R̲A-8*9bߨC "L'T 0t(Lt@>'/YRnh\jf^p"c_? L~"e" e9@8SgyEauJ5!'t*Z#('EǾ/B#8s\i3b64<Z s_r{ #m=0rOyUiԗ@Z¿"?,'y#K?ciΑ\NYFɏFk rnbTgqFUq nO2F E-BPrRg?TfO^@_ }WGp&+7(3 INr(㇏s>0׼`CVpg|n<ςp#􊒖#*lxY:Ʌ};y '?~&_}x^ "?i~S?B_\n/spȏ?$'uHw?9J:Y-^+ܸ\>ThZxS'O?41iCvO޾6fp;}O 4XrEI+ *cO1B/Z؅eY酾_>N'+OwXq<=V{/:Or^sX:q= au\rX>Rz[~H9u㞭#˔?u*%@"+LYe0ϧ;#k 2^2#?'n_%.#_eqg&} WLr",,Ƃ}zSJE*?JĎ5?pT'?B_R䧟eTV%6I&OAedOêh&+HS,g:I e;Vcw&ՔB ^ %kyE$Y++Ch2Wb~7~jcuY ppA JV~?W \\<^/9_r~STU|p0ӊT\$xAWjϪA Iְq-+a ܗwO%2y}'XOKŠŰ@q]J0*WWD|Oh3@\b1ǗCYڏ er.79gSW䧌ā|(G?$ 3?啯]@9UBJd+TY }ťCQRW4 =~S]No9DX?[@!\*ׯU%!:n.S{ }dA? 12 2a+>?>/}r~4K?CzIGs 0H֝_G߸\g nV`}/wYMLL Ln\.No+co)QsepCrIIz=K|@(Gȵ6`BYeNJ1Bz)m߾}B Fsu!¯:ÕU|p uz긎9B%|y4긤ai:縞 }WIKpV9;8zZKq1)?3yYSғnQIw^Xp^Lт.-'s4k!S\fRdÐJ)/ۅSo-㧌z`s_&m%kL]u0ttOTxb|-tPollaÆ2~Zd!ye٩z_E~&,N߃udY~=.ä녌x +eP_ӹN_:[`AwӦMMyL6mTI.9Of 'w9^/HFټ UwXJ/i@/3+'>m۶~o޼ړY= <ߘeHdP/0P4IYĪ41t?~hZ-[)Rm;RC6&~ɉE% T!)cG6n#Q+Gs͟zӻJڶӮ];22кә={yk [k딥('2AUq**rB_q IΫsΙ3oy:Z6gi7%x5Vg(SgZ9j>4:d?Oet`y PHD3;V T84W e('g(*ؓ*H+T"a$\?=^$(GVC))GY?id R@ ǁD\ab / 2;k e0>Ii? =g_Q(C'~-yBdX7צsȏs"eP揞\m WdǦ*TO?u.c,+}BeBq:K_2~zc#W4Lr]e(GolW\na wMd(M?3W\*S揤ǁ>8QhE8W!xGv-^( }X698 _G|(O(G#eHʅetNT~?Ňj$~vWO@r\X<ӌz!Mğ¿.E~q>Ee)P22|lfSEsyTk:JI#{C"\ѠG?q(q̟H"r}  n& q,1O(ۂ~le[Ɂ-G?\j>?T^ )PkҀ΄`1cOeŠLնC2Q֏|L=iT l50oLpf %W\yRdFhS|(g?sBY?1&rtΰu\Nk^ s@뿮ȏ/e('24g^f哷 RG?ÆTNjY7Pxce"?%2~C\7i{6%.>ae:*y>Yӌ3^Ee<)Sq2~eW̟qd<ޢ_gG u9Ks2LޙD! uiiqXrX[ \&rY! r\% =%WWgB%Ye(rY! r\%zP_rYAvp9,畒F7oeɑ@#C,ȟ>n)x5VWgrqWgsU?Om*G?Q4^hEfXǜT > 3E p/+H2~zHQj[̟}SQ֏4Gic?{3B(q`1>f9zX)e+7E~sG?|TTŴeT+jeHQ0v%ϰ>BUC &tqND?[1b IDATѓ2JlT).#{elշe6j~>Bq:K_vR,*3exQ2$3ex֏$ )PDҔ q_L* ć"?e#-eqBPϴ_Q\~Թx@ ooe膟#)Zg%2~ t:`_O ©=3%e0pqſB&{>UaI"vK~V8`ƿk*,WDyVJjmfdJ+Pye`E4q>^OwkZ~zG5;:i[EtrDZYO ѯ,_җ~{͉_t:ή%1mڴ;|#ǟMZ-mL#crQ#=~B`1jw}k40w1@տ6'4}\n]tkkm{e<\i0:?{ :{ܲtMWϫ|*Z3K<=+Ώ7W(}BK3(Oi}禱<=*,^6;L1vlko.}p擏7>e]*rB? '|r8}37l7 o]waժ:Ovrj9] Or``C<[5?ߝLk='uaTMX;ݰ]ԭaK|Ɩ#^->lqZ~1/#̫*>w}+^=ngnC.̢%~'>,X0׽nSo6sᨏz<t++2j5&/.o߶moy_~զї1O=YI;T07T`dr;3d ߹&|~y;n>}zSp_x$q9*P A.+P+׬YQ ;e2aCUV&zkoO 1;L9*ӈ~E5mIwݰiöp{{?{ T~Vw~/oǎ])O3֯_?aK1}D/Еxh;;nfΜ9{{Dzc(aK?9e|y!̄,{,wyG+}k5ITw|;[c}9s4JkAB~<)z@<~aG;qȏ8eeyO}߼xӴ_1GC3}rrWYX˟ږ=qI̡FOwg#L#co|VsbKwi~y}-+0 ZPٮq=tA~(}Q\.y% ?]Ӽc+yJ8lЙV]3\}mz]kM¯q >ݼy3PcsN={)9D0e`y:׿,*=pLJ'=IapeVI{Ӟ6>w\{C/`>ėn;DŽack߮G}Cf?;ᶛs, GsBxge+N9^NS[~yuy3^w.[+Gyұ|d[ Y©83|?sO{{㧹@p]`YWa}8=OοyeÒY3B[:]gZ3w̦s«^: w /@Md59iK>"7ͼ͔u:#[{<|[ߚtCPmOc&dApOg=e/{YooSN>%x__9sMV0ӹ_#n ĔDo'zσ|nj\uUoӞ(Lh5XԿoNUlosq@\&:p^dxo<wq<3FZ.Їe^fS}{mȥG7[^QEOo"ߞRat1FYq򃆹ꫯnsqY>|>k-\\pQatO;uX70V _0Dx~COxKq<,lݯk+75WU=ׯ0Unܺ*,?)I煳BT*=[w/)KT;tE', W5?kv~mOzgo]T &ЫN|K*iq˗m]fpډ/0/o=| vseN 3fN5JZn^}֭[QvX)SVBd`AI)4SO=նvl Vk$D@ard %[ [V*\x&ӽ#w6,qws++S[{:&! dw{\b` /wl޲Nj aV*ay晖37n4,ey:[x;=Y|y7a_|qx[n喠pBKΜNoCpɛŠ-` #/oMbOoo;T/K)/ƔqY?u{?m[mGr<1N1sX}hqͿZfC ֖[7ٶ׭[gۄ~JE?Oßc9~W4|`^=yO7 vSs s'*c9&\y啌pWwnh6?0:2b癶IΖ2褱6T4/S>g>%{JN5./$\Տ-{Jx+<v W~sQwMs _W;Y_wOxͳO |r8 W^p^/Z_y+҇JؾeCssQ*s)OxaX[.õ?J9ߤz}ワ 0kpkĝ߈p~ HEՏnc/;<&}mOak_Ww6$$ mykTwD Kx o)GnИ*ρ6~{d`ƌi|! Ys|Y:òe˸B կ~P3| g;ykf#ࠠ򕯴w R.uYγ\pA1K[Ë^paqpH/y}׾OƈgX=3XM-,d[CuX,6KM;ޚfϛ%KSKVB[ZƔh}(/u[ GHSC2_|Sᇟ}wSׄJ#Eion? Z[‘'7 } O?YTƻo }wŗD KZ0.۴c[W0sa>um8wG(vemPH[ꅳ1KV:4g͝ƛmH&+'Ww,PlfX\c>E9h3fvG<]q#}k ZS5E|7|^wg=Agt&J[} csUc{+L5/1VήC۬>^Bk7LXle>y &y _i9 H~__W?[xc li|g$=^# '{Z׶#$*NCg4>p F"E87+-Z@|L yqsz%HȜ;p)bnfR\㞷RQG{(gtM/|a0qȗ8_nV|b ;/'^O<V'p}ja8ӏYRi]2)|x3#)Ko0{B˯??uN8 ^p \s^:YΎM /}ìy 1'?<|o6}YR>.^ʇ&Ǐ{Bxn1*;Ê_Žw9-1|?7"4c=XvH0KHΜ=m"95}`ZN̓Y akpr0cv.&MI Ԉ&Q?~&iXzqI,lӶv[ٶjI.nտ"/`vXl/u&} |Cqm,Zul*<);R8 tL8nK:@(m?]" ׻N^zqXp8> pMFV~3f2B9JT l<^? 1Eu9%Kxg Uw'?ٶaˏ1&2ĕ':CN`u_bŊ46dx8t~e0-cP/BEz1 ٵ:ƿm6G$O}|!KY㱕EmlQw [ꄡ'cV/aq,FO/|ƱE>8a\.fm~,aėV~x\yvdƝ re;oƚn{[iS2cRJN^kUgG/b8ޥunGnFkڱk'>`yz> V6m+;"'i#G]Ut;mӺDhr Su?S?UkQ e{(w0o&pͯgQg=kg~U6K7G'xMy4NaVu{ؾqNnL42X>G~;Wim ?'C*}qLJzj8S^my&,>)31awߵ3M|3x#駟>OX(@~P*by=e]w-RFҤkz$a̔Gæuw?uIeSoyho`8{3\~=LjSXˤ!^g=ZrI+~C<ЇQĜ~V,gׄ~ٿm3›{=!R~oN"劖2)c^~owQWt{EWaL=1zc:sz0,e q%&4p+WXznӥNG=7m[6O~縃|t-m[[K}mZS̛(wM9W 1am阅V,[0/,` SM2^ w{ic6Cw峻z3 'Jʡikkz\ev%8"9?tyr׸WCJ/LbM5Nrwya{C68ٔ#͙G߸.nl_<}i^9rħDaC3f Q *Od>xaoǝ3gn>(<{cV3y4$i^5MꁮTSRoQ#:)tȫkY돒w[G^8k+9BFU.)[et Σ?.࿶wSa աW2{vuIָ>qÎa|s+Ƶ^|9W` Y sw(te1i8w1i+!-nj#'[\r%m!K^;h_i("b¡2~:4!dC2 e|M=v;!kơ9._9NN"g OJhs߅vU3,\֨1}&竪`wZwe:=Qp۶Î-]W]^D͎ʹlNy)[xkOr0YZ= u%]-իW7%[ViSOH _ǯEzn0h.ȹے D/)O:֙ Y^b[w}2>#tK[-.+2'4n[=N54v_-jmh6s:#c:7_D07t#Fz&Ύ>2=o]ӽ_mw\u7t6,W=^Cxm_)P+54U(aCb}-źOe6tƥ",Lڦh"ھis[nͲ癇wZ~Iڂ3U &6t^6u軥 .\;=YҶLK/hkM]wbj } omZvd9(sdb/I,BY`X39Qy#*k3sRʎȈQ[H!^/&I{ݻw׈Y7xYwuuĬ̼܎#S4>o^_'|Mqt؝c6xMln>d}/_?5~N#J]%Pa_~<=y|}f}7xm<gV4`>gBNׯ[t61)ƃ'$OI߼.ŵ;{}y' ؽVYMl0|oG$ՎM%}`of?%g8>)k[+^$|x@|_q>pr7#OHN9nr:ܾ[a ơ(|uʧp-'fml|O94&9H8m|Lm/YVZko:03N%o?0/A2a{ N:AȘ$a ' ߛdi1g~ ͧ8y'!.\E>[|(C;_>ViUw/ :ܦ$xJdK o{/Q+P!r w21)_T}&MwQ6ot " n3 bҞTzr/J &S^>Sv{tA1/t.1/bnwRy* '^iARA+nrCɥ&P :=8/Կhi;o=ƙ_mF6lEUlhKUF'ɿ?Ɉhǯٔ݇qM3-'l29TFޫW3.e9ƒyYC'CGAɾpF^Ӝs^?MXA˲v>FVKcNKBj`Jl? Xz1Đ  ;̀lيL2n%PtƪrPnA&l?=\?g,m8~,W?BF+Lj6>ydhm%P/փQ L[>A\ΐ_2 Vc6b8~4Ⱦڎ4re ,0Bf ThZT0o|H4~z, `#YPMl?GrySKk@ ΘMĺs[?!p1~7rBuC4,񳯫^?`8! ,RCfҔ8m/~R:xc鋀aAL' F^?~e3gr,i`-Ǐ#)8~:~Ǐv4e TYeXDJ:-6l?th@(8~O:|`DaV(}$ TDg1~G dH@WPy^k([ J`o숌 pho {?Gldoc<0a(R^m+NJNV^bDg>1U#3ea7YA`1g~l??g:L0ʷ8@Q5g`Jx_n l#`0FX*OKtuJ,bL׶Uj#P}m_ū?EI'9&<զvQDK~DYr*D.8Bm?Oٖ<Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx$Gugv/J:I(x%9gpcl`mr6`2&c&'c09gA Pwz=5 kw^TTUWWUz -[@o.1hez[@oz R[)tmQ)"#3֠ 0.}͋]x,Qz% F+ 쮍쮬o?}ϯp'>#Ǥ8DBq8N0͜}(ʫPp> w,3{+`c GGWN]bҨt 4@XΕ=B#w4Dg;M4Xo]vLOOocPC@@^( p';ڦ_OC?=A#فȶϾ) Ə5oD_e3P<X{ FX֙ECNccoa{?mp}{?4~0OT:Q֪;w ۄ43#}u/tPa!٨߲ٖN~9?;}1n}1^v*mcl鶑K9|"&hwn{@)o@8PxZL[9BE>h˲"=1𞾷_~ƚtuemTNG(O_h6U@emqGTt&_Z\E#1boo[? ?~ ?P,MuRdj* Gs!{ Hئ -w}fOFPM`q;p wiT:Ong"0P1p"=8q !h {~ш?'zd*}}_rˏ)xy~w!.xO/ k7tK7߷tOCGKdN?Sqyش}J2tZ go3~_~Zg?Xض?{M|:bjjP( Nx 4pE B;3۷W333P@!Ijof:pvW\v>Y`w6]Yo~X`wmdwe}FfqqqY~}uQGHĹݔmׁjZf׭[+}Jxn%^[D L EovFl'X(J X[ۯ_vҶ%Jx~L Gg877NJcOv&Eq[K꿈,tgm ,j-`d?#x5KvD8tE:+D:lTqo?Y6Rq~dڏ*P?Xs6 m헂F+xpQTP8YP +qCZ +q{=~4ߟ=O+],u4^zz[_Mo?{;@O~ԽMs0.o?V<;c إ?Dlrh1( uZX2; ӧ (;wz>`S ,O}6~h(4]?ˮ4Ʃi e(!"{~zl/& e .Cx=}omD|~'IV=8b aE\v.RPSvEY~ ;.Em$5Q%f#߷DO} ~O,/y:]sPf2(j΋D22`?16vY̠m#j>RTo?cp Ot=mG'&Y_3.b%%Vڲ_fS{~5Y²,~-L8_OۏFзq_c[Oǡ{L]/r1x%*)B_5J{r[h/s͹bQAhW==KNwot(Ϥ]GOzUGYWNQ@M5p`Q DMQ4:h%IW^O/KUkg(iS޶ۏC~){D 6mK^U>+Vظ͵tZFav*82žn\p_~ Fۈq{~}&>I7g~Un*gōF(ox5a(*aXgcv;uve".Fi5?*$m'}oOLѿFɿ;L41{~(qP}F'dٙ7F]a҃`K#?j }ks̞r)3to|cgt~qNQG?;A/;E18MsF~Q;keX(SvrmyOo +L'1 HW~hdw]\ۅMЃЅs8Rօnk'cn9y}piӦ|nzӛV +},r9_N +==W{a~qO"m +6ڊ.,p8`]\\Q #]x~\t(N9A1 %nO/]e׼l6іiva og>SzիjW/T*W+~e}%[p"}F󯩨?|l Ќ$P3hf 8:]JK{nr ?CY3>%o׿81y_ߌׯGLew^Lw=}22W6)lGۯh7Qh=6ַn8 B/'v 0%O1SBZfF/zы%կ~uٟzƍft'6{Fw]I V3R|#͔xY;/tSaS>_ 3\,;po\4O~hT6ka;v0!_vCOt}cW} _lT';_ת#̀-w6? \pA}>h#G>+9P. zڵ6'l}g'2(,}_])}n2ٵаQ8p"6Q˱e g4S&Ҕz~}A1QELv:uuKX/).KMu0r7ܒ4i>5~x5TYPr&fo)fXXV#Yh@[lEY9R}xy/xmN[X'Q(Z!_,ʱ5#ְ 9lB wL9Γ%//pO 'AMפ87m2iӅu*`ےc菜z3cxݬu4A\RWe`',{-oS}?k57D/LÍd!3;¬KLd~/AB2S3 8?-;-<(Fi٩: h{ZY'?DyWDzڼyguVO&%7eybkdž8~whIbOeAg3u`8G4y =Do<lS )DMbH*f}rH'^R^!N?y0yxIE'4R^OZo?{Cps`=~<Om?]ah>E=e<7l0c娚e.5.Qb X쓟~u 1/fZx`}hԈ*t-nax3MT0x|vFhtgyҸGK^j=6Ƴ!>Y=Yϲ<=VڶAe2}8w̸dN_*4Qt06[z jmmX:ꨣ[VmGxS]z!Č!qId񈽞:CfLpp42de/, g7TSb +z+׮ p{7Ҟadmzfܘ9鴳t6.~"zmđ 8H4™QpDB-W v!qZتUlaX;XUJoN?yG'Ts6Rp:d9Al&C2+Ҏ|Kv`^z~e{ /%ԕ)/s#M/Is:UՇ !smd*Jŀ_Qr9%i?=yFPTw0|%z)tT]쉢ݙ^)q"nN[~Ѷ*9~]={6 Kn8Tވٹ)h,h*?#~~Ͻv ǣxU!|VF5:xg+qf+5.b]1)|'{mxУ?䄴ʿ K+D͈`.6xP\ܰ({@[H'Gh7-= ]õ|9O>i#'J@o~^ೇ G%mmq+88O9$ 4CKypɂQr yrN:qx*>R0Ii1o)hԤJԁ5Ag/w{ٸO>vȰ>"%atᲡ^ ֱKot]OS\FAEy#=3PG7 !ѱLwE▦߻G[贍d"14jw!^_v䠸 fb "$D,^rDg|84,d!E֌LR1ߖRBҡ^09|UIBbV_lq}pB*MbXΙe,յUR\*XUh'X+p.bgP#ct'N`D>b`B MYs@ίD T!q(wZr'o<EH7Pm#W%rRԬ<D[cTxYC>>E4&+=vLp~ f]R1hG[N@O1H%//c2 秌`,t6y!C>4ٯvP1e:,IFZr$DžV.4dYɃ{Q02m '#Jzd"Y(97"S23>$DdYaEPӡ3 ֚8`.iCCL)KI?pLm:XCO[$_E{Eحo?+n|wPh/6*YeDk-L:%L 4 -1,̠vP 561#ݶ @5[LqC䳜F1 >,My'95*86y>+ CPmHJ IjK2'x3sUr:'8ޔkwf2Â0-+/{^>ܖ6he97O5ToO2e:p0ъ7Wbt!+ߨQywr aN*0Ej K'3(L)QVooۧo?~O.?r.˖1rVJSFY#HftY^` !䘋>=ÓH <,ͅSնߵ>QYhM;ښuWr2T:1hps&||QvG6.ȱCR[gKc_fR,LפT" B'i(o&uuk7cX>AzkuDD 墅cb` k%I|ZT<~TS}??U]6%lޝΏtW j&`WIOKwX# DW,aqb73I,Ái= Kt^#YA^z[F4ajج-yWŭֆs-0o8?NّiK$.I~HW=Ħ5ryf@2D|: K`@E2%'2o3SZ~L0ΑVKӓ˥OvS,m-B*2^WI HB1'z{y>$L B a_R%]aVgȷ'f&p,N虫ͲNR(:.ڙͺQ{ ʺk[IJ])Ya}{OZO7]ܶx7݁1v 5жC,A@OkL m*^ofs/g9*s̱=ظq&ffiMA8[} <: ծ 2A'4-p¤9x4eJkj0`iIJl\dCg AFfTjrN (o,L;0 PE@S`u3?@LVа+;9n' 9g&:Uky뫭?C)>f'\5ה\ |G, ]Xv׷ثuE̮M| ߆Z@NweH1SݩvUyƙ֭[=$0h-.alӇGq@{=ڿK|Glr! /PhY!/ ˣt:xy8YK<5%S3Fbuן7!DpQHp(Rl% TKi2N3FmgZG:2xR.9g=܈?4SS~̀q >M\ VW_B퉞B@Fwv,ž- z'!Q+ZS8=}o?,з>!/hIwO.j3|wq.2S3Rpx0]~dm߾ f>'_oUs/8xM\?s}w8,, 6liVl޴^-bGˬi+!1 _S'|4gRဃ'o )AG#)M1tbԑScNj.g.!xg!_i qŔ4P::cٴԬռ$ ٩Iu$#=qի^'4[,O \CpِEpY;7q5>,Tu7F7Ì }]ALG+}i̎L3&qGMm%%m`T^DKl<(g]Վ;vT6oο`su\]xjB-\t^.+lKKYa:ʷve!t2a ( ](';aBi~}l{n]꣸O"vZτ/ְfFafWQ'\pZŦj\9 xboۙkC}gvq3 qif1;iusA՚5ђނf=Nfׯb349 ^H fW:`CUv+{h<ξ~J4[Օ㴜p%Ix]zrL%GLOΓHRW3)ibDKz@r V;+$K<{fıԗj%8-?˝؆eGd5KEknhM/ɶx}I ȍzJ:%@hZ龘tvVP(жGz%@OA:I@>q_ٛwd;N^B@MCFtm:srG;4{=u,O&쳻fmpp1ԫ?|њ֬Y ̶?NKh۶mKVkɭYVͬrfiiTsPKo-[y.rCWU1Ѓ@9Vf50'r,q,hWܥsY@+`QpФꨟ&qH2= V b}7_;)y h!?|V2 !$ v &PǢހM,k9c8 ^r,9gq>ut@SZ3J8.vKz.w >vܐtDkާ)~D(orB:_'x@LSe̗e7x (iA'P6:[Uʞ\s#%xNXb83!rO?fMGꜝшHGrU)Sll,&m[Tк:j㐪:EYe~}{a|{Co"+|;J?ֲق1~M!lgV'mҁ"DȅBQlB y[+==/pA0C\$"q*ӑazx7cGH8P{65￿̐ Ɩ;Ɏ<`sIK'`,-K|Jڬfx-38O]Sy$l(BHH8brs;46SY" D/ uwuxwsp>Be9c$E rC ˱ deZ1 BO ^fHve37ugG)ʓTgT"0Β:dqJ'*/.к0Vׄꅃ˵`[g0VB_؁pugțѐ$v/LL ]=}oOF Tn 9D~(~(p@.Sg@@adX(N4u'}]Qk'C>:F`ԟ<;!)^A!6Ȗ,?(ҰNI2WK)0 Z-pB _pLfk Gi襷44ydm@  >i/Ы{x7`eۄdse-}ƁWQl\ƬNۜT;H8BIȹmxG UOs}"'MK~}DV_&<́Bə*T/oҶ<3g:NU<إ}IVQGA .J:lX& j 6pZ(a`lj9O:q1i`.*#8r΄d@<B;R׬tΥn}&I)+:%_׬#3QCHW;!H4)R!-!..[!ɌsݦanX!iP0hj#΍DpRRp~2yi}}!Hi&&p1r/xIm$9CY<0Πx+*Qi2k0 m]/=̘-=MkU'x yѰwI2s/ 0,KOl;<_JÉck.@2uq'K(+a=ؖ؅еIiKRօn8Q^FY /BQ.]Xη .t}.GsQ':ʁt)P-~m , a3HH9YP!i)-3W?~`4cZb&ڨZz[d鍙 Go׭_#$i'-Ypه>rx_-ɱw|xCŠ؊Qf XS}kv :(maׂkfDD_pr&Ha;+eSd!<(8X`Ii^b \:; Q90H4t\GV6=A"$@xk3dHi-2inD ܼY~C `,#tz4 `kKX8`ey˦CoM0;Ӈ̬@OA19(leI%I.~AoV\(mP(C|ˁᔚ'^on75WP3FrܑWui rЁ l`D ǃZbob ޣs~Λ~vi/쫈셁8 a.t@IX4Qdg1&ΎR⎄䤿ZTxv.CDzzCA%;n1'gvpӖ.;oL%mr1YZfj}7TkZN;"fq`m;o~}ua N9XaEsz ^&G:|3fL-):&X/xA}'nFᵯ}wN AxRqlӗ}{_>p??wH_/*xN<PYަ/̻+_W_jM,}K0!' d_n7cua ~H#0_|i*3uK)=pOS9?>`2ِ}~3m>S _O1Ęi#ѣGC4yM&71%(&-X, ՜4diG+(8{=_#}A0˔Ue9 dA8 Y*TB{5k&OZ@`81-lF E)0(3YT$HAFN0SD_4)OB:~g6|KwMBf7b^oXՂl3fe/f#2T>eҩoyfM}yB;%&0)+K\A5aO{"!'e׻~ӡgm,X#}{P%/? k׿>(TV-G/pfk;ٖC<= nYJ|;|#G~U}=-CYzV"EJ,Ő|/ eӏ/'m#>n_gGi);tFY{ XK&R'HtNE+mnf(ҡ2,¼P+c=vFO 5Ǭ+ a4j8U`-g/ݸq#%y}^S877͎^?x}^O8';O A -GsXJΓDk+>7'2H!ƙz@I7ۤeJvPd;0rpxL IIEN#B%H9EkiD r8v)ݜ}c{qunwW?׿f~)v_ʗ7 o<-oT4[}[ߪn}'KDZ>k^z׿^wz#QncvߚwZ{Q{L8%mqmuS::f IDAT)Oyooٸ^?o Rحnuf5?=l'>񉃛͒o}[GNY:jxG+ j}6x_]kYjի5ߖqiU׻uk>zы^dS= O7/nR#6|sMb]?շGqN>m=1D~5:oԲcؖ^i˶3OdRߦIquo=|[Ouz׻_I2C:R\ugp~8Û&C|_d(M F '?Z3FC9փg<ԝа$)!Q˫O}SqpDDd Txƫm̈f| @Aa$1I;w\9T̢H2U"j:Hi*GitM ' 99S>@A-upQ"ʀ+yp>K3x&s;v&9JDl[mZۥ]4Sv v(?+gI/HP4V('c27эonw6_Wﻦaw]=z _ַ3z >q8 s摏~BsInU9qQի^Fmzp_FrзW?rα,w&؏D ::G֏{x o>_R\i|+̀4ręBB%kRw-9_+9 #ft4xx5GԍC78"wӝj~~K&lj-קzjBcAk\?Y>C1$GaӞ~#N֯|;Δ nqHÑw*9o/}^W pON}zhұ!Kq,{Wh헲Uc89BY2fˤgU73 8lg鵯}-3,$ٴ?ӃTn7>,}_ bя~rq__ viW˷K=b )Azέ;5]#9x\BVе(CDKșqLu- {+;m9q/ L_A F[%<`fFna%i`z釪֓ӯ܁f9!8)D~ Tpͳi'VuGн7܏|=xFukg5ڵkgLI'0ICqkocoIB?%GLuHoElWQ0PvZA/tGRMgG, ٦7 1Ԣ 3.je턗xyfGyJ:xRS8 Nf-9CrXw6ULI\qP:%4͛7U)JOv5W뷾"޼uCv5z8hɂ_W7׺뵯~9؍W=oݬ~ͫ^^?aCe,ZbX ^'?Iя|ʗB&V~+Usâ-,,{k\z0~)f}D[˩XSHxҟ WNV%<{|0xkd'=i詥F~5HAMĚ)4l2eH:L{}J8#͊d7K_Vf4Y, sQL@_H}4#%U%j ejiAHH7pzlkp,V\I0K6zQ%Mj0fLsqc:bLܭQ*%n">W(&%(k7$Y%'/INJڨ(9wpԑԤ^ 21Ld4~۪];wzǿUx{3Itf;O?Ͱ"_pz) fy(9[oo?;O08餓qf4rn=7d=*4#ӏSR=4mC{'e6ˆz64r\꜖}If-jD 0 4`g'¹#hʪ9b(=ӴhR[:9mTp4:ieS ȱH}kYaFIz@'ؖkM6Ẽ2f484͓!ڊ0-oN8ᄶ\ǬHͲfj(E mn+3nޠZzi>xP6)VGhZz˲wae턶жhj{J.٪Ł@O 3&r|P2sY!pq\,U=P!re5Qh%^?xN ̒Ӑ !SH8U-7ɉZО(Y\bmbxLvԏIY<討p]x x_bVΚQ IїqD̀G NEqzl9vh_ 7Wke8lrx,=oWZe8VNO3jg݉&Hc1Pԡs΋-KuHs-N^_rT'pRuk_Mownw?+_Tm 6}Zk>L?5RpLe tV|%&ټ̾+h%7&KJ57„ --:Oɽnv3TV2z V @Vحg^6jksK٧=qdx&>3I(X~JoRxlyסcL KZevMK^5L[JM>2x؂W/6BL4.P |[ҡX/zU,&͹MT M!4~]>}:P{/"| {q4,cdeƯS9QO|!COn붖t3/Uc]_H3JŐ|`Gd2ƒg#vb[:D6sdrlmg'rӆ*߰jfV/%jMk&9_SڕTڼE$fyJ<Ʀ;u|oMg'1f-g*|%=Ǭ,K'UvU8JBrUAP>)\9DhSƗ-} nܜp\?Kyʵ4u]mvM=w[߶zK^qmT=7<ɏ5?ͽs ?6,fow< O8AX̧7Wͳ8:9uZEEKpakaxۿ{l{ ' JƁyG.2JM~ yiM7hys;QKAYO1ss _dIC tc GLB MtRLf$ElI*_cڛIU;9 OvԤgLփ.~"r .n{m\URAeh :"@lҌҖ}5N8rCj cy 4l[6їt(&1/(%M97msΪ>P9M5/U}_PXe&٧];۴o}߾ GbKz7?]s>G9$_D R?tp*Ry`'>4zuZT=ErTIӦqԴfGG~z$yհdOt1:Hd9d}W)4ez LOE,icn`=N'H[F|.Fh3yss ,+3 -eb)+t J2A[1[Ҕ :%M-iLwV̖4ezENAIS;h)K?a6mF(}ϊT^V9V}y}b Di7P2V+}t8Oac6\_1T^9|ȥl/n;.PoMaQ^Si(ѷ)u8r7GelQ&G 1(`*@u^̂ JBȭ$[pv.܅ Я SRz0圤 EgOp,Y%I[m7o%KbfI3IrY}I~5kkf8{jYean|;ۺqufPtY%q!8Ji g#rQWqO~^U ?  t,ʡ궨Z<4qin8}zɴP~pcą4[ I,&ԓfKRIvh:槒A \;xM!"?HwK _/wzlr#nk xF>JzCf|dO聬q>_vGֿhQV`wXK2t@P AFCю"DOؿJݼͲQ,XmukVh.U=#F&ik;MAZL3WƤ3B WuRZJ /kȼa10 pq$.@#*R.7\ k1iiB>OB'TO ^b^J8S*lEE3Wmy4lf-&9M۶nov-YEtY^[m֬_>h9nUzZSZohC3|6lEO0НZH&zlOv<Ӎ>_ afi͠,f<Մ/pSL;My6gw7pv>i񢬄eJ]%=Z,spHtqy/tmy=B>2O jf39gr=ͨ[Uo?{ҶU?Y[e]Vf =m=mJ1B\04a FriХ t8У͞3R'h,a-rHH,F=Z`Z}ft[ޓ 0 OkswDw=bNBK @"6n/Ĉ6'kF83 2".A^HXKpcnuөXYzfVO ҀZ٣Λu|۲@toںٺeͮy6KjY߬^rI/H>hrAhذݰV$H򓸬v3ȣrȇ&o2=0lS Rgs?\,H@}auSa{8.3*ᑆ>cdy%A+Q 7 rgqA >]z{C6sq隱qjhۿoD }bg2ۤ*Et>́a %â.KHOT_~A7e _ȳyǧ^ãb5 \"YP3% ڋ5 4.zֈfk7+ezB2=jdBl @X鹔4.8'ɫst5W%{$]ȀHr/TCk<{zFвN_\o:Dz[+M]Ҿf90Y7]Snk?>`zd]f՚zjf 8 k^b/rG:}+ o2Q1+iGTGf[^5HuuO?Wb,,2fA%v AW^`X(%;ZχL}^L;6X, LS۲PczFSҷ=)DQ飔mn~iOsPr& ˛- .7zɃ玸C͆>YUMHOKDa]H2L|m]7LUCet@i7jʈ'dצe2XHPlqC4jbt2T&m;yM[8Q:W驸EcViI3r֬JuVVNҚf')@U#0uѷӭhvQLׂmE%,X-,_ld5-~L˩Tzu: DAV&03/_|L zt %,}Ht.Z+{dIoD[dl{ IDATu7m9PtQAPb0K/oz:ixw͚-Qɗ:LYs̬MяL~ p%kdMrNOXed4Ox u5ة҆n/ʅbJ̏:P/,޴ueSp8mG=-x'؏JI`WuPDc $y&CII6&.ljb;+CWOۯo?{]Bh"ͫ@EFa7=љu:*3 }ДipE>q#\lzuʼ[e7i=|yI9?p^d |'؍W#S"anF5Ȏl&0h%MZ}5[-uज[vUUaRᕚRoXD\/i]3ZKp,ɩ +%K{v)אzN+,-I6>_؟QS:i+9j%Jip$3cy҇ Sse Kn 2[7Oi{ܧB|%Cma%l;MCx TZP,z~W~O{Cmd)tW l_Q}KK ~Yp4 IH=hh-*rdM)B ; $A."}8 Jyg|[z՜Ɍ `6g([t&Sb]ڮM;w-֋b33Ќ9J9pa:6@OCl쳥A:=Y.6 jcnRĩkd=èb8RJcFm4V3N)Rv $ui2-}P'=Hx9PKڿqn;2Zp-uUÖ70dT疭KČG0lQئFZ)f1mGWJٖKTw_P=}o?h7o?W @O ] ˮSoY@uZ]B|.wz &%jn\vAK&ү괭H;|9TT#|޹> =)B-$MEm=L&yIRǽ<6Tg׫L|fҎ۵/Ig*m%YlHs]U:{ GI]1).EuTҼ6Kia4`r;J&%-%PMa5zs[7U[A}5JMc˕4/t|qOoذaxKׁr۹uK땮Q櫄 _`|Džz%%J8k:/8X#6u1<י +[x%8h/(N'}.a'P.?Algؕ\\ck?ΧdkknYm^eq`p`m(*LP-̂ %)3+qwG/<˶e؟ï[a**1KY6륬V͂3Fxb \J0iGˇaD/ NB5i@1P۩'8|~ IOO̬Y1-ܩr|^{pρr#gI3K63f;"I:i[ț5Q$]0Ct 8}cix \jWы\yJ&ˡ+',/x !<U2>2_,;z2/eg+~/| X=eY{\+kŲ_&LP^e^e*a{Z7_&Ӹ8R.LN]"\9zPB7{sy/]wֻvV ƿKy@P0uJyjt1d_l޺kWC7{d-͖͚Yںu'tUWܤUzmCATҬX:*2#6š\ZWhQ=Fkg']1jS:DT" |''}͇?3NQj͆#ÎFuoTxͪ}ol<:_pul3/rVw 暅EmK/GE}I*" ] TezE)i7/K}k(l۽;ҝLr&>dlr!؀1dL "J @C uqvw7=t"h{wuWWUWW{]Sݯ{U~KqCK5C%t>S2vt-Dεj/5)AD|.3CP&)/_MNRN._RHϛҎ)tcz:/(uzO!&dϓPSеXʿ-oYs1|EyTo&^&x\pQ|e)>я6wUEވ>A47䱪w,rJ<h5{69t-oyKoݺMzԣʻiӦ] ~ )s|ZRߔ蕎w\_r͇>w8|:IFW!aHn4G@ ~뤓NrTvZx#-]ͷm9V>Q6u!M3Ɔ AfuܥMk꼽%kPgȨ:( <ס֍qƦĦlk@j׆ ~vw_O~r/Pe"J#˿Zy.|$&:>gCC})p~>gr)ux2 -S_2=K (2Kbfy.H燣f̈-yWrj׾W-n4fpQLJMs6wS8rC\^wXXZ e43ci^]d mBaJ^M[]zώZ4c3:57?zxۭnLn>=A=S{ciψ2*t:v7wJF^u6_w>ϷYQޮ]y _QJcug.MpN>y#F J][ѦZՒ;2"S+-O9n%ǮP=@Od%s{ z=yܢ7=|Fc=N?GOeԯ%-@.Z/dPZFchڿ#ʰ"!Vvˮ aer6nQxԭ6n:6|jZm#0.^yd2F:zN^%! $ozfجa]_! Mc pB:P'ӯ;:}_Vpެh+&WK~A8[v^qIrؔ޺*jb'M eF\BZjtO}VE 8-JI:N5Pyw֟Z/nN<> [6+ƅ~hi@R03RF *G+t;LjMG [, 5_u`>JpghGQ8`g?%X%E5YѨi5+[C<9 ԝG?ѦhCQ;XKy שjƜ1nWg %J^! FMr ;'_ ˆ' k(+rΝ x-ؗ| PʿmoY[$'># 7i}ԳXnAe>Ak@@LL< @/ AZŔ,FuWpPӭv,X;??qO~(kye.L |#h8Q =>pM>A^] J=I͵]%.~/i@9wyɔt,G3|*N\7NԯjfV&L: %cw Z$ "=U_Y#qbr,zV6A[ <ScJd([]Tȳ>?~S0|M{H ڌs<tȭίVp(3%/q7hA6k%#7$]{nOh0 CA 5wRQLb?w~z>4)=iGvxISƝ<}Ӣoi?2K9W0}aKcvi8^_(Do5S4T\M]:r?5G09e$^Wm,?2X=9;FOgD qvi}P}G:m, V M[Z8Gx 'TL[vB?il[_ίeVٙ}})Яj"PIaÆ -SWLkuY[us,/[L-Os}Uc{g/t>>Xz)P+=Py)[ӻ݊FYF7Էt}hROK/Lua0/Q<]>A_Py NTc0slۺsݵי'I=6w'"tW%RGJ9RʕV[,=Rذ2]y{@pxG~g. HChώkתC@6tH54FuVMUZ9~z+ƆfXmv S"M*=(:Z<@Mcz[2lm ,%z;5lz+ЭB'tn.7R7"=GA5^uեEy /n'NWxjաL(X!xte- dX ELՆpzUt9]kțb]M%uױ|PEuWYʢ?{a>SVt aorCyv)d IDATYXD[)< XH~07u4&&V4Sb*k7L<*eX%V@]ZjF~% r`_PeڤV3\~%?~-t4̨ݡM4Q1u}/^; ׆ͷ9Z]\\U Ĺ]۪u?:yКa8udvF&dH͇=; Ú֓Pۡ vEﳻhWiZ_ԭzuL(#7bx/d_nmjkV#Y=%}׮Im׸u)x@c`SnN)]wkqK:ϗN9j~ײ0R];/F|^b/}>/YHUkK^:R߯f=zei7UFx;ʗqbril܋+@\O5"+.~zxx|G2WLkRzZ ^_ o)o#= aaYAK]{$y-.}xeiEx0CnDK ӗ.=MVƃTzID)ό#a ÖЙ`m0 YY;4ݐq ʉ{w{f.t~ @yum j}:Rai+?NLj#$F3]SViLk_&np/.۴ݣ^yf%o>v3#,tN6P9;_7;:º:f^: Bm#k; i'3wpJ pIj@ּnJ-inóZڗU5%i=~mFwca߂<~-?2𤓁w]9[h*~ByOXbV`90 xگ N뫇_ztIBM!⍒ǥpK}xZL[~L,mF&ZhjWujivtJ,+ { sUGk-{ԥ#M%jOR=3:?~%%Gb}ԙWq*=Ciޘ^U q4M}ƥ)U{T6Z/ӗGBxB=2>iuү+ray\֏8_z^ [uR+<}F}L#\o3S` @Ћ'E\,gSxlN7=PB-^Tk)L=|RXl̫jHMMO<{L1 G9#! Q&%@y)h*x?JЍ[*O"-,60}c q!DŽCu՜:\ݪ3sfvc溰P7 24ʈ']ضc'd\%7谖$\k>yED\ i F, 8>oɃNOV̢/E4Y`VK۬13h.OuS?g^xrST+b}NX\/@q:~YfR0]?^\[`}x5~ȑ?$Q!P 9)i KnC [z6jalUMFW.6ǀ LɑFkvU|$fVmC"Hf$yuelz:r ~E.4y\@M̬ߞ_9p<9$aלTkm' TouWؽmNTi\2"va:HivcތsbG[>skD*CcҳetxiXM8ZdL,9>WW܈Эv&xV-/'&t=+U?? e'(>υX;vгUrNíZ4G IA9R=fВ$ #6=n"Ð1`oԛxqẁR=ЍQ]rdY?OS(&!Iv!GnCjfu,1LrboJ@k>DŽ񃴐|.0<%ǫ,UGՆpFXju5-u#ymY #HE,̳\X"hHyHj:7`ʏ苃UB| )!]ta},#?2hJ;+Hj!7-?E4(YQqt.(1-@KCP^RG`yZz=L~=Jy~IaEfx_,H*Lwɪ4\'dK+3DS_Ƃ:6ӛxb-ՙաbg.FZ;02h}=;3(B`Vϼ&6yӮ1 Y6BS}ۡ1WLCtDZT3[/ ӍǃW\Z׆ݻvWxld^y$uK]|"qJ`D䱢V=lUF6 DKߒ]լɘ)]nX铪HaK?pӍؼic__r$Ct;ext0 2hw9yґ-Q67o,T)pxp OWG^6fVza'?C5|-wW֟Κ :򗿼ַ#>׻_ۯ7EF#Y?uy^ ՓK `w/ЯP.gspL;ELXwnDt1%R :x5$rF);b^5z<*VPfWg. 'm&[0ʁC[V^>L;&A?="/x/}c ,ĺRaؚq|zaEsn=34'F#L0$a%6U=p0k#o8ZD.DmdҼiŦ<|e:Հ]8Y?8js׽bUӓv܇UQ>֗tux;LҮW C}S8ʧh(TFì' /{Ŏ,) %F_MS W2}Wǥ~<=ַqFӿFA=~@ʧ`׿(r(a?_jgW~ P{PG:;X^Ał"1 ty/k~ SԉTW OMLơfSG9G1J?5T˃LOH6GKh]>z018t I[S5㔐EeGƲDMCoQƪxݮpB _fsQ^F56ڐɌz:M1Q!OұIT^$idZU^Ȑt9fT◹rj8)O"wEO;dy[Tr=wڭns۰GouqO-Ql񤷞n{nw\y+ɦq+:V$5}ᮍ7r(m]z= }FM5n7=F>1wQmr0'شI {St]//]vY-~Cf7on긖٪u]\ַ(΢L;P%A}CKu#a7I;eKGMyjj~߬T6un=!!)Ί?e8餓@E׽ȢH6lh#(*e4/Ļ[" _B׍zիd&җ( 6U 'a>I_cn0tdD 4, ' v >7dtTgzֳ:su`;2?:۾}{-+s=16eT?ϵZtdyC#/xA~vG<@׼qUWŏmQWNJ>6gQ,Ɉ1w3}h/n4UNGj}CFOnr)m X %W:ŧ<)Ag>Цo0(#1mg>%#B}cL]%M>%/yIO}j%ć?":(Hӯ~T~eT~U%k?zKMb_Gpq:z:lٲg>v7~|9ô.Ob))㎘>3fdkpNJ*_HobY<n Ɍ6XYZIX( H"MmR%T~FàKoW~?~W54&Pe<ô \suxOvo"5XFӯA`Yi R`z+_YhQd#(S80̀*/-8i ־T7O~M<-oR9D2*-ZKH5~v^WI``gP;2+6բ#zjOGxG_!}{^rǓơUrY~| @.#4`i*M"g ' lU=A`):裣P-c#otCFChos ?=<癮y~N ƍOK 嫿,O)' K/E~\]`WA>x廠q:n0zUAٍ}?QG_m{ڹ| f#,/U:+ц :E@+l^Ș:nRqǤpj܍{:LK$KA/N+WA)_p4^vWUTk92aS>_1XmWщ87?ʰ{G566"F\6':eAkX 3_)=t \U5g dijJ}&`1'I5%NfP:c_^xI[ee"M*|/Tst"kJi@WȲlYwB"烼fL05 eu$pJ|Wy2^v饗xi<&/Š`Y$u <_$D9,S4[!BW>- /056M412hzN6‰œ3/}Kx1Jp +.<+@+"oO[gF􄱫ҾLxA>dڑiJ4'yt"^pk`,q|"2#HR JʧޘΚ^)^a#ځY.Eq+HQgH1$X*$Q4DdoT'}fR&?z39R9+Iaԙfv]veo | ƥ;D$9Ʃyi7[YwB䖦n}B7Ii(*"HN&lgx!p`fD\x ϐ )rruM]%?N`5_''_J~SuEh[ZS^xW@8+IF_Q!y\Ϊoc t O냘bZ U]?e8PjÆ ULA).ђq^WGKn?Z5kD6|nS0@Cii14Ehk_?"Xn[cfg2+ϸ^J2M͏qHM)5U]p4-ʴ7r:J„:l%WqG.\R.=7/o4z+#p}E36H~, a%BKpzⰛZ38D+b@p%O;<͖9qʔqDe>DY=5)^UWu*7l!A@NpE@6KRS~dȥkWhg"+1-CRgeQ 6!T5vD;Gwp W"0'?;yF{Ҵ^ZsX뗆LU& ?z ~Oy^?,/yکe$'UWJA7W+ V1'7}L)y[:_[)3 !$UBxd(g zJ1h+oEams>N>3ڧ铩9jzĬx/nG W5+22G_ajB i;ڷO30&XK^G7Z+e~3({ /(wżsۯ=xZUil`8)E9`Ka7WMӍL9!WՏ*8?*m(2* SyO~-9Lኚ5~4HGA:"1,YWopay^fQg:uV;f(u4VޏSy[aYozo\|o?)/OηW_jL貨gBV0ަ@aNۓO=yEצ }lm^; t>nfƱ;Ds7 ߌeїjd%R:Y>>?_ {[?;c&uhx'3hzz1O[NN CjP Ev]L;HiT s;g_ػpNanڹ}+5P񕫴S#\s~1Jwk֮w.V+VZȢZkzT@lQj-AĠ̮yZAʟZ%CeNjO,.2_!=2$=FLlXz*XoRK~ˆ#E4x_xα_#Cހzo: /+M>Fk"3Py # qU>2t"zd^F< cw>KM|ҡmZ?uGdlR-$祀~zlULY}SeTm _#?2zCwm{JzKmBV]dh|yrTkޔŔ6kX[D{~Mp6sMnzXDzLϒ'(~>lϜΊ n@DpoוA4eEG҇ mmsAUdlX ,_ⴲܞ!nA`2As_ ^:Vwp94vHJr]SX4jzG<ԍR{ezU:0U}AӴNGnova˯W3Zk6铎^6saz*;#ծ4Ͼu0[d)%Rڮ`lϴO!bN6xxx(95C3G&͈JjTUM%ZU<{g_W{tRw)piG]*-R鍽,T ؒxWe@0XWhJ/ >Ѣ&%qYxKŝ+ A+i \ɀbێ(c3J2nz543ˀ{埫Pgo+Wq eX^$=4' |CWPڦ^ (k.=h0jD(τ*TMkW%+MC!MSZ\|FWWpCX tZ.x =럔%ƨ1?sWR;9c[=KGhwwau"Ԛ̝~;RQ;`(צ e12 YGI;k>%u$㐼O|erc6MWKFM37Q9r+'zB_GgzaԃG p hYSv`v`ALM=ITi5q}/1!}ut :_W+R—L ߴXG*^oao7R&?6MvQB[iO)s3ggȩ/(P5 N[᫇2e{HOlvaWUYFY%ʢ^Ƅ tp%]p٪(@1r^j`jn^mZ#B tCQD }82s QXj:|J$z t{/}jzѺ$mavN:qq{׎{jl.rzRv]٭S-F,jfbi$łUȠ7+/WюG Z>mnձ1ʬA9a!_לo,ӣ/ xJmmJz%zRSC,pOBE;`dr*. {櫸7__ .9j9PaE(^\o~Пry,7&@ްrcoQEHѺH[ϋ0=C1KX:(R2V3,Ș׹oEYɟE]y \2f/̲2($Jp~mz "2ۦ`)҄ɕcHqjr鱫y.U)ғ_wK!ן9Lx*mUʣ,G֙AS{k$3xSKJ! JjU93HU|nUs,vkEWiv^X 8$uPvܱ}W\95xEx0)B!$ sM"g4qz=v7'\'ZB~~a ӅDN!U<Ù4s֒5LLN4FGh-)e0[AH^V{hX7 FxdŹճF)9-n/MUx\-v3\ GG%2}F%LLӲ.**vr2 /+~~=o]|*w`e']A%}1<!j]a+tf#oxv=1&]BQT _Q*G%A% uvJ#?] 3R5q_KH 5eԮ]Q U(0 x#Ll0&{Q,Âo&WU#l%0Fiơa#\+k.EZۮ $`j `d$QAQ>_ډj\8-bNQM5W3ὂrs m*o.dEOG"MLxj:FUvu#gIeT]Yf9o~H+?h|)P  X|q>ߧ'۸=S%]2,73.)čM^ymxb3٦ZmŒ@ [LX94`iuWԛem!EN 0+L1L ;RWRHDzd(&cV]$K\R&|@0Ҡd+p5E܌)mz3js<{O7eI[{̬֬Z6޹#lj.5`S$a #{?!]hss{G3xK[mEhiZ .sGU+\BƑ ɐKq ۓoOyu2G~=zS=&sZxMjԓӴ{%"Z"Ik SztJ>4lB.D&p__euHW6]??On˞6ֳ6 NA=J,e@@4ZV^Qm PMTl-DVē7Of)@ i4-."3VU:҅7gf0k 8ZyN@DtˮE UV%ø.8Ĩ{ eTj^Ӳ;uwY1+13i" mʷR;{brE\}5m:wcD 9-[Jdjcʂj]ZH9|SYSm?U먨|4$4h\e-^~BgyPfaih}VU_gy/Iݜ$XYϲU{7~5xYK֦,`,9?RڤC1eP)CY³"ۀx92/,n_?<7<=_@ג@KPh(`^Ԁ*qP<s{yeÂ$0† mVS )ӯ ^,$ $(Ł}[o騋 MOanrlC~x[lb|<7F  )oSԝ04[ 'N@agT168%ӞuyZfktvcVo_+mJ53])m :EŁJ?1i.HÌ.Sk0lHƙ շ6j'9yDԽ.;5<4J;yעOM-*]v|j㨈۠Zi&h˫ێ}ux XyCд:6tYCgtPU&3l IɅꊢlv Ґl8 d=` g-ՔAu877+W^Bnf0+ dVP S\% > 79!_3d߰R~OPPo_`xhVgU\tjş/vlڕdTcrbrsOori;M\GybZcLx#MiT2B'1_m{t\̬bȰb R1 D9⮖кx@)BMU4_W~Tue!y>% ! dp/_dh 5{1?nȥ:4vnpd`sE_jH?uy|3o~sw Kk4zgVᅒe(|at(>%'\s58䖍^5Ed,E(RuY??>J' ~M*_r%qeT69D~mlUeT6o]2:_ݲeK| ^А;ozӛh%5Њ'k_Z+tA6Ԣw/2ȕHu4'7UN|gGqO IǍ}C  15J{)ݣߏL^\o~}џCՏ p=>/~Vu$%BKm: <fjgɃdpJxrHf {+Ov; jONLuWoi{/MYT>mLZ­:- "Vo@}>C;J&\erYu,ei.yuuXXa<]zAJ7bҗЀ~WwDmç?( ZN=Զα 60oo.[Ɨeʗڼys83pw'vַv<z}{_G9#?^`/| _@Q^1;l|#:(sWq:D6ӑ ʿVկ3w:3] OWGk FyxAjs4qۦ ͪwq '.ù#hk~*.饜zAeIcדח?qqx#ow`BI!r n\6rYYu(78*V4"/K)  CPduX<%Ujٞٝq (!Tx1`JYL' `&K@yx%FJV#1; ,U8®6 ?d&P>ҕ2]V î۪J;OU芰k9洈\ۻLj՞N&xT42dW6zxfH*=zԬ{`X*Sޮ,i*3=^C, PiI0S`&K L'KJ=COHjicwuٕG(fv^bU ǸȈ`h3}  p1t;WGR$p@g T={*`m\3&y{^/ /Oi M~#1LeCYQ1ow1Y9A~h+E{xzPr CJf8Up7;>aX ~_=,w(=~lÝ/@t@{;9w; Ciƥ8(/0yZ[hbuʥA# 3^=Uˇcl7')Ͷ ^q%M8˦`TY[߆՛?06V2i&Mauk;}ΓWg ^DJ#W>;$9'zRX0"ě,Ó "㲉_:>mGuF"$ ^9?a3M:95 Lj:۽-?tr(zI nJF+IErB~0u<1o {,xu7EH+>=Ϙ.߯fTr{ZtP>W< 㣫]xCHy(jb `TJ>|.!{QP@v{+WR{מlP@C%h#d?K[nmx;CAU>~lRި^oc6SB(=M'e+&b=? /pX 4L*==۞nTF{fav_ö%;a{ۤ7IㆣKqZOKXNMUqT.¨IJLP"%ˊdToŨ-QRJ4r:2Vej_*}Y{G'^GWrLyeĿ2ꢏ(.: e-?ki P!C1-ML7;O"'u;WfG'=>SS Q-4k R7yg=ަ75VIuxe5lG9L (M- Dݮ쳊,!3bK=A!i2GL>5ⲞOl~Cn/V\wM, X(DdTٻwO'+Sh]rsKpc2N`5؀#.tWhxVfQ&A #huy%ə/pro'd*H.<q?'7'~4Ih56ڌTt%5eP dc!q R*ea\M{ {Ʒe*_ FlWBН/C'I=vCG]3kјU茕(YE)q*s:$eS|f''3M9}ǏS_Qܩ`.LPF@2EJ ~SMﳆфw1Zcox]<&rcތ3dܔn_*gc`5(:߶*=,.G1$ l⪆@PuK)T%ޫRZ6ICWJ[`ssl'զ$PfDU*|!&],]vFo`mi3ڥ#K,Z}ٱwok ;Ņfإ6% 'qy1/v{7F}T=`1Ƃz|RSk 9@Nq$KK5!CIT|M)); sw`d]x /6-uQm3TB&ڟ TuF?:]G-fRK74Cxw RÒJtY}>ß鯌]?^=l ]kQcO՟3 aԩ&uw#9L͙ug@k7?('LhhH4LcV H;&nEݮK:νBs6 9XiNÜeA3!NpAdE0hq/`V0(aoL6`I̵,ɭU3`|暫!a>^zDx =.ZY:ON-I: IDAT@so7擁޸36Zea(:Dеo  ns}z({0,_g?,7H\ 6qIm|?0hCi0'c#ȀJw YrU-`=\ ¦*ᙄik,Y<}ROԎrWu0Rq2{ɰ-@=Z5ؽص(!.'Kfih17=K EQ4SBA[¦ ~@[ 3QHx?2`!tt7[eg0mC:A^\dLg.u&"i\喅RyU_1FdiX '&᪬+h0!qfwiX>~y0 +:5H*hy(ouYgOWQ#Y c߂\iԷI~NYeKJ99䁲HEy!)%f8.q`rq{%0}FV'fA5&?ܾM4\'u3_c^f6x0k~OgD \94K T G9&Vyy|ٵwy^?t Q԰ŞFb*7'c=S:;견C6<0D,Na0yvȤ~>㨰pw ְ"km`JEUYqyBnS:S}q|QʹbR"gW] !op}>#Ly=-ʐh.o ]̜ syoԴDg,JEw؇1G׈-#' @^"ЀTfUÁOOTW eM8Iiڣvynly.7W䬺#G+/G>;f<ҒhG$ < ɽG36J#J OY'JaPw-`*a'II5- , A:Tœu[ZSdo ~"4ԡ71/F y$Ls'vRd\3| T <PؔjJH5U΋ʱ03zuCkw/Y(/r1ڀ,R͸hez[_b9^p:DJ@Z_"ddDvęM0-0-"nI|@OptXX b'i?ꃢmlYr,xM,ǵ}Z^2>8t[dCM ixMBx.MS|wWAIKq*qؤq-G&5 [KN4b[Y* 1sn?_\"9^bO1S{G?DU} ׷|&bi;,XyC~Nʏ41wg>E '&P|BqL'nqۄ;9)g$7f}ux +<ojL Q~ydPD J^1'Z^șJ.1L>p^!zf~.?t^}էky]a[{Y#@a"0h-v%u\z]kAފblHċ?ZC<[ Қ>mx*-M n3L&Ւs _5$eVv>*ǺL>X2_(7Tn:S b d u8NER"l/ǀ٦\~\:7?)S]xU^~WM_.zlg@[{*aj%xy={K1SŠ ݠR(n{ 5E>p\H2{PxB" ]JOD"Øf8pb%m&_I&+FP(ĀbXB $?#9ʼmrL9$ 9b.6;݃mnٻC{kBC,1)ķ^NٗرcwI@r=T>aĔSxa n}q<^&0Rѓg)29 `ݏ :8K]uY/pO?n|9-? =ʔ )5 ѓtR75|?Kx8_"Scݩa?_e,}~#t [ BX>'[80_'xBjȠLd&r^28~lIo}^Pծ7t?_wvER xsbw9 <+My- L R)ol$Ιp}Ώ\F2Z"/ p!T+!|eP~%Af?nApVs5G#|#;֠p[iW81W+ m@Dl0/5kig:Թ82I&,/+&<ڡ@:V9,SS12K}ZEOy7r#.2'oY|ok?umUxŜ|w\&?M$ܽ'kv@Om^ &^S J!}RB!PN. M@АdOË$$.L,!G"$10D|F$[@s]kWq,[v\w ,^A&mډuĻD"/y4trxܠ11z ,nt4:=OxqP~m ~hڵf. ?AEr63~)4o&0{1b ?)8I\*;W A7hë(P.^`栢AV'lDgӯ-˼:v}=W(&$dy)$3X|CVj2AnOikSnKI_z:']«VJ ^[ ?n &.vg _Dx܉WF5i/LLuLT؁ aa+8a7ف+uL{/Ri %V v6!Jr-ѶD,i>tUt_suwdϦňgp.}4R "ҍ5=vIO`.l.]ԍW`'a8%u=[C\XlAz=~N<m5oZKa(l2 :vƨ]xj4vÉBa)r a0!1zBQ#v?>]ӳn+RޗUuE[ `zZIGEbK"ѸҤS_u8;3lve>J >ݼk}VYX3冋ZAapi0ycDvihTgOӭ&4Imr)8V##(Tx$ qpR铚YXK+2zjǓwB;^Xn[@ XxVخ`X(0fz|?^0BKKMz5xe!AZ.iTGG9lBc\ͅߛ#5*WIq]Y*S x=?{RX%QMY*DŽsoKz~d)84R0,cYu<-.48уc|1-*',W'+mSs?S}xxxqk&z~T%Hu$Rp^HҴEAQd9uO0&\:@9GOdy$9,tukfCΗ ƨKv!ܲ`r'^l\1|͋OY)VS&v)MƔZy =>gb(k74ܙ_6Oԉ֫ pOcPp\eṩOgQPUɺ[_^ƢOP8jbo }l2aƹO݅UL[MY*_-uIʎs"M*pRu]a0]VMu {:|]WʧLe|V[7'Yv@k;ʺɈE]=UN17}_>OKoC'xDC8I |C]NP.Bu+<DŽ G۪K~"32aln28"}SS?ܕȁX0zMv ZfO Pp {ԭ:x{w}nkq%*GxR< {:ͳt*KP2y0v40\Spdl/ Nh4%SC"ar"H)>a%yRw)Sjp{f/佂5\˦GTޠ!.N\#3 !W4V1)<}B?I\uOQ 뤘G,%ω 5%R`p\ hw&*oa*&'tLIIī>9zMk9ê= !HUDPqf?_tq:1_ߦ|/{KNKEǵ)w"fg,?>22 ݘo5޽{]:>q'/ur%z@it@Μ޳-9C|a(w+J!Fpf~"QL% RN\  2]Ӫ.VY LA|[ReH3mn^t)n}4:;piYkhw0^5,h} 2MpղGI1ZO)MCrӄA#ϼKxaKUYBCDY$hR>M` 6~P V++ 9G .hLЧ}eyylA~R-/ְ%y]DߒoɋVPũ,/pu9å5ßo6~rRS豾+r;]:$Fħrs/Bj_ʵsN>,t]o<ּ $ "ݜӝ8LSCQ =Nfn!o)?IrAEe]'2!7A;'Jg ;QeӭvX%@( [8Q)%bxK ]d098pS{An >$*mV#( #8G/Hl)U`4 J>#1/}O_zI>6MC -Ŀ/WVN_l/3~8ײmc ϶ԱEr,׸ۢW6xyrGiq_ᡂfCW+%j|0Wٓi4ΊV~^b"|b IDATm܏=~a~KҠ(i;Bɠgi87Bǹ%䗆7CmxFzٷ_t|٥&풪&%Ye^|h $yyO'@&9hòX_R0ie$x.˥Ac䭏#{{vbG/Rap$||$c }cxͱ,OA-;"}ͥՄ#Xu6GQ rLIT֒ %ƢkQ(N"O΋ >i_]v,5/aH G e.bh8*`=Ϻ7>/)行~,>򾲥{AOQVo*>x_P~O{_/#j@ͪTj*ʥ5܃Oc)&X_˂i7[!bҠL )1w썴b&_qP xO%VzǾ3έr':3g7Md r%~ ,̸kD9m4.ڢ!M: wwǃԓwɍ!zLe $NR1 6$(ԗ O=u>W6}gl‰A(67 /TtoI VD޳;rk<Ǝِ9SkۑN$0 /OⅮAqܔcЪe|c!lr;dYEA,ǭ "z[sy^9ld=m)1rU} 'lMri TUJ5C:/ &`ni)Bz?44QcHEp9/FŠ^f n*2"5*4Wsx}{oXʊ@A0$3@QQ}(N&eq#>*@t,=tďvBBaHRS8zUL]hwt{s;x 2cw.FWh1-n575 )R>mFJ$c'4-Su oSDtnR yx4xǦ /p ~iK I7.ըAfJ<̹YDY/}d&\7 ̷]m+f?u<1F2yr_s[3޸j!|%L=LVgbeMwS:IOub'Mϳ ӐԘG(RtM ynG N$ 1)%F "ih# ͖C\rlIoe$DpΆ G>W<'8I'*zv`]WxA!~M:v"LO»fLFQ2ЭO}`#<&1Q"\4R_'m?祽'CDuYP $OC?16LVq\r_2(^=blxXx??:o2ݓTdr٧>~w>u[q{%/yI_,7~}Cjd:Mnec,XֶߊŕW4>jp?1$rS=bUD=ې%%^◸q퀇5WF _/z ;lwc/@-KE^\rIgяSZ=|Ewkzmu*LOӇW_}u7i?1}IO(oϟ7'hvx\?[~`p߽fOV1N LӾrGq}!㪾2/1Xܩ l]^ߚy۹$G T{ȑviiix{ϜK.ц'S9\C$E O-6{vDrmPUG$R?3IC 'iyR8b 轱 OTy-ީ-_C2d!'!T ݼeg2z0<\Ѹ1%K (2&7v+g&E 1Mk"%On/be?6ok'{iOD˛mo͓ >KrG~{Xʂ6|S/]ln OǏ/izf?YG ~W\qy^!y1x-ݧ} ~o6|~/>}ofدzT{ѷ^h]Rke2.w~(O=G>=묳Gr?BR+oo ?L`jo߃>K$A}S:8쳇׽~'RoV4~//s3*FW|w|y{^ h"߁݃WU}{߹˿l~h }6V`f̄G=QCWcب?^5^x>:qJe}[^!2S꯶xя~|3\0 ׿s?s-4׾7NXOT, ?nS۝l(at}VjliNQUnrO3VeiO׺x ͑G;| 4քE:JR$[)NΉ Y[@yJ2*7>bI[k ̢dHq) + E`R|G ,?Q/˃[B :IaT%cxƚB_|]fNjɸ ߉-mO44d%@q)NO/bhPF{C-1oF`WUH"(I2<GyXĎoƮYl,nus$W4F^?E$zDlwӾ#i<'4{{=ۚ˻}#y{S]/yYuOwo{S=3 CK|߻|UxEMO*Ng5_]]y8W{[{]pLoZw_u{O=%[G>RL7_Q4O|;~?׾Ekޢ?gug-.h~8FדOr~E!vzDku=]Inww//a˿˃27|}Ə9[|#nf'׽uxU:H7_Ow;ݩꪫ˥!9yeگW|Wt}{7_nj\+`]{?<|pG7ۼ袋B>8g<{;߹c?c?GΦym_ncqaD^WCEȱ)WOc=لߦm;;5fooX޵_xZ'sR- ک IP2n^⽤d8 +lA * uY [e5-o;SΝy'Op>9.ݼ& QS? lU_@@/rLᴃIR!9=ΈvcmY[hVwK7KGWfzGج-Y!^hewOl Oy|ͱ҄ EX8 $2}hw݉8]+,Q{;Ix.5@1eVBM!+y,.Xq!tv5OnW1Ohs#Yͼv'x1|J3op:ʇ8)ޡf޽fv)N?#XONITzl?_~FGk^k}>[h>g/uޫW>io~Gם={;۷?׬_O{c:ʟt: ~s\to^OzJ+翴{csQ_DAo/BDùsoyyO$?>~^=)Oiq{4_}O +1r;<վO5yͦo`  FӸ)=> OX{5Wn#*A!ܿW#sook)[6E1uM ίizgD h9ctx|Zy߼y+_G<N:%/~q fg֑"u1&'0(KK7 ?ޞK/4 ~oZxVS̛_71~AMIOSᵭ(㳌)G۱VHl?O4.WdbTY7oex^q=JcF`p-FuOzғz4{*iW./j^QTװ3|9?.[TmSNVIlaA`!"qZ#k܀IXWqܠɜhov2!- X#=y?mwO-5K̿V# :FO,9:n=zrw%+򍫍ޥHx;@y]F .q=8qPaAiov \ȵK%xs NXc|l|QC>^;}dc`&#b7'[qFz;8O;ug:L:h?qO guً>ZGG +f(X)t͓Q3?3-KzC׼%#&uC (>I ث`ް6g4'y?/N.G%iA9I?+fB Y<}C^ϥ+Բ$h}k|K98;M#%)!6kJ&KTch]A4^4~|@<%kqs= 0:O лoo[M_8}L&ͬhn4Ue5+3e"nfsGh4_H:0A/ѵuݍWka8-ݰDm2_]ɚ_dgnnׁClpxG̝3w5{f0=sA@pc"IR>NoowM׽E}kU_U8!冧!u!.cyixo{{!H|b&ޤ^2c\f2jus 'ËXh41dˆKGk9ƍqcPev:jkyRpDPO iǐ=:Z._E<퇱2_E/θ4 6қַ?1~u!z팧rMd`Nֈ|;5i? !F'ݴ+d|Ӟ6˕oWh+|}.4]ge]6ߪP~In];bA{ܟ'W^ыVE%%# ΁^hߪL.DǺ<;ܻM xnݹc9#cTt2RۓiBvJd4'Ce _|{1cp8UBLrOtO+c|̏?Ƣ׈0z4?ҟ\xS^=\}GIRbXNbuvuw 4xY: BGSP+'?* {]C }!o,8c{: \L5V/ٹbu&M ~ӿ- 7B`:J>s:_OuqJ}SK5N?^q|?ձƩ+5N/:8uTxƩTΟ 8uԟXSΗSk:*R_RcS~ {mmK+~6CwLP.F$toX0Hq>%ia>%{#7{9xteg*nc@̎[]uUe.FO/L;(6.*zK%* Ȇ|dPqU4!bhA!dS!ғ\xږؗ7͎h@( s  Ո5 JcX kMf, faq7T0\ZZR !PL9muaa/G=&Q1Lȳ.v"H#.bDxI#^pv[ 7ex"_X+XR*'5ކ-fa +D>/8¯{|7>yMO:vf•>Y`HcIץgo6~Nk|R=Qѥ\:`.wssCKm NmzSuCwΠd<X\rq{ɥǰJatX`#xk3.a"צY3S{1'q0ż`h5t\`Ėsμ2N,ɪ^c [F, 2@xne7š6-%/37 @1f4vdحn}щz$:Y2h1\܆1 `y +qrKnh4\@ͮ#XNC~ec&t$r>&bsd4.\.E1- u.ҭq&},T2&mw@u:|F5C}cE]6 )=7S8SIu K)2UUΓ'fe_?y{?!mW2q(8৻M75 P"Q!T7R zߠ[ $ee HA\PqpY8眳 l/;j :LL#L+ĥn@X舫j9-_j^p{6W5G@ƪ^ jQ$dI"hmϝK"]kHl0Z$}XYl9ri}\'SV8' ' i>4(C@/utq $0quvb֖Zgh!4\}h5BNx LX]YO>eSk[X^0F.K~<{]gs|Pn)a'g<` >W'yqy S1 |:qUctԣ-$_(f L%M29nGi?LLt*L8Eqqd~Ǚf~xM;ֹ-i\}U_6Uݜ,vT!X&X]lQ7u^D&Y/8ѐ$B>]|%x{LV 7Qw饟JjsϹO]Lw$R]sݕu\xVvMxZܜq؏Сl^zd^`[~5P‹;UI^'& a1'[$NF.lTX%ږ (*Z tw"8D jDl".q Al9?lw̱qslZF) &ӸHhʹK:&FzO Ez9F"b׋e+p0PWWqF ieEcظBpUɓw!N\6^y a`2W `Lx"Q>Ou[dmSq)˯NP 冗 %> *(_ndr 1v%vIGLeT$OgA"' \XOm4_M\?8ƫrE |4PpH fY_ v._`^rnJ߻/Gby'_bi?6X ~SIlʹnʔt2^Aonn>`݈=5cW/F÷D},a*E\CY tX]Z|HxDiOxrǀpEX4&>EH+\APMۦ]p*G4LŶn`PmXUkx6 HG[1'XrP o2DYhٵ@̓zV;H -8;]2DkfM8R};-eMbԠlsncAQڒsJKeւt/2=D TwH5EIPmvx8ƫz5wX]a'~mlETEG奞cIe~RɴJu~1qZnbzCeO]i\5>̀[.1|aVEt/7]'GR}؏ *ܱscX3< Fǜy%5%Xg]#7w]<$|3/)aBr)Ёx7ZNG;DsĻ$._sL2TbYmOH<~K R h1NEZ+-Oa)yQxDpj .c|&tTᝊ"_ N̫i`;5+ ) riig%S|/$Ō'%۳3Ͱќ8ID>Y!䉺| = ̌"TPkGp5_ZxM/ ^9D9e'oѢ TZWS~R^|ͿYI ^9Nח՗r,/<$lt}9?Q})/???WƜctIlu[ki ?Tܙ8/ sQj֩RVyn1|Pg+ܔ?KAyψtci7oPn&e2 idz󲻞ڏkok0Sq԰דsS{xy0rОIZ˜>@ҠℲ5G/X Y(ؘD`%/,;OO2EàCD"*' Kvr2Ƒ!BE0,ľO,kqT?7Oe33&k K>fr`HaLs7aao()x,- t7-V=fH$)>Tݯ%; ݥ#qa1ƾSq.A;T$rBқbm'yzYzNMgЭtI[e`>)K.|4Ω&ʚ'DuQREM?ʴ}V4e߭;\w ^+j̛J}Q'|>~vbXD:l.y"^ S`RvB|7t;.oS|%? UY^Ÿ4~ 8 /J|/ x^ g[?|<^gfK8Z,a{@u{ +JGzStGmPHTjGV~a^`ng߭9쳻}{a8] ) \qW^.ǡ\hV7x_Ҽl wfs`D}+Z2b-s#K'ٸ']0x(WxиUL6& qR ou1YcabE|T!!1m|aOxڎ-B5c|%6oGךqo(B'`I$W`合c4 M0iF_5GnF[ 8X_h`Tkd(|liDI,t9-$J!,-Ǔx˵yp%Jtwơ (>j$Vs Q*2!UBrJA7?~. Z||sEli*0(Cg Y:6y<.Y= ĽGRCɮ}m 1OַU$C8>_x/sӣΗ^Cڇmg) )6:cZTc9͝}/ﱞ|+$>g+7?وmҠr&u"lWœ^N ę3$=V1G8,=$0FXP?XVJt5yQbmkx<7aXkAB囼'Ez¤]j&/X& #{Y HJ _jz\!y^v, n >KcZ?MC/t/HRVc9T^IjƺWz3VXk<1Tya^XIOм袋#i/ 燎/zыy5I|U4isM;%_9g=+Yz~yU}rLQp238߉g{Lzc.?Ѝ (M- DݮVGvro}ENay՚{sw<8'RJwUokZ|%cMa IDAT-zߵ>9զOJR4&Q "( rJs>H#]E(=[PAf]-Fh&9,N٣'E) k L#ddzӖ34Jl|ӳ!cܤ$0:/ٱȊ.z"r[EmҲǼ{ vLd$_R&M(Nu4CR&-0UdI@yjaMZe6D00,t<1e&֑+6W;w,,ElM?U~SR-oYڼys=o|c/c9))cx3_MW?JyYr"AtD֭c23+lDH۾aɟb1̂tSUB}b 0$p2|`VA|k_-S v(:Q>8 566Ql0/Nʓkv( XIœɃ)PX@ }bbjt8P ?0?ac4KnC\NP : ˑag$Ծ)f"C,zŢ[F,%$3b,@NG@a[L;&MG R:XG,Jv{>D^dh)dؒ?9gΜ vzltkt̅s~Q%7څzX0GW!ui7נvHiB o-Jw?2|5e>k@lKqiUQć4ݣ)ܸ ߴ\%ZBz^kfg:e9?}׮x߽袋:3Hh}0ړ/}K.+s5הn[UK^ѳ|c޽{V=KX{+^3__<ⓟҋ_?*2mrIZLy,絯O{$ڟwk_MUZj ;aQ i wɂoULODyy;>88(Q/Lz٥߬.bjrIuKY?j8쳋 ο:S@qUڸq}ژ=8KM%q̡b vRoblx1i-WOM3 "A0 `V+]Cj[5Q$@J+W3𚝜-}9HD={(Rd ߲M clXXͅ:^K;qlz-5Ȍ;J3/Y)4X]p2PN9&I0uSP=6YCNT!hz~=mR HoYhB9$V YV$}4r~roCoXF_Iu0!_ڶlS ^EjVci>kHa6@Ҽ05_rR|# /k̓>_ޞbӟWGZD4N3ыk׮}^ ٳgO yjZt%{k,]ܯߏgxȞـ:̏5-oکgmЊ~Ig~+A%{UPtq霱tVC$>u7\_]z%44qPC QL@Nl.jv!f w',X1}:trg+),egqGc[ll8Jx=Z%P_۴5Lx uIR̍EVX\ {e sJ>ՑuRiXS s~Jz?M?M$&ǝOWG{PDJ1)l{LDJ@9ԦQU}ݢ/V?]veys=z:2m߾g>?Ɗw~V-~O&V`+v&3('(LdW0."Vm͐cy8&N~:'/CrUwi<}!:ݝE/k#37z}4UG~S>ӳCcIxɣ _@uv޽ϒQ٫uA.mՐR)xx/?eC~&}݊OKV7q-20ar3Z[~+ytyxMY0Nosc|\_YXf;v(N8x?b-(]#T^믯\NM.ҖiEOF"^âMK%mt ^163X6ëBNи9ܞAI0IOg'C~TN=zMbӧ 5Yxm}CKw3(WAS2sP;v<\N"/=?з_ehdcqP+5e0}>]əvmD9>1,:fرv;UYy_/#$^Xvyji_Wvt@GޚBkN U eIDz:};4fKS~c(<;'>FB6H}".JzADhcP2-lLM,:x&*R..- /l >-$boѩުEm'mf;[0r`$; ^d5YP@xM 6Gq pqM -{ )NEn [Vl*M̴ Rk?x'@-mXbHfKo[)بj kFJ;k^kpt+ԟ4sW'c\&lٚlER\_ZVRd}ly^bY(<+Q%n҅gYvxhcR O񅜵rGgo5~M=[g=-{?Wj[]_̓=2oUVyr-3#T& AتT] [;7F?L;s4eLÁg*&/O)J4kC[&vkS q#:%j*t܀Ue֟<9I\; = ؟W_7嵀8tW^yeqllC@fOd'/fqؔ{~oouZ;ryO:%XaFth+ʸ*T#%B&ku1wz"bqvA@Pa5<1RNElwV9p543K%?M͗B+<Eer:ݛ]d Ft$Zgc%b$|H~#Gˡ#wh%hYS7U{aOq>$c"gȥQ`e?P\IJYHE<]z٨fPMǘ# ЄGyY" ~JQ5( F˸Ux( BDP O{-ťxFCO:5NMXki:`* NyOzSxb0jg^YH @5y@0e|x9 n=>cݮD_&XAЗK0k@5Nffl+FC31^c\lG k'HFud 3AșEvGz7#u$EZBVmOL4u1$ElzFuRe$ f/e 4t+^tcwI=ˊl9/ѧb<[lcFmN0.m h O!T=Msd*DRm9٘׼ )ro#c~^||Z9?3:C~6}/^~e:}E.3W(k+jIt,+{ ]tI@{fcǎO"N.aP:Ew*}M7h nhaɘ':n54jL ~t{Ε5Z%!ٟjbbc^srn͊7/1/@@; E1saX8nbEch0(C9R98:LF%XYG(Xug-0wTY8PbybYX=Irn5!A,,B4;a&_GM!ߊ荒$ \C&"OT/e8{P}l g!S~e਒ zWAJF#T?%}b1;s{>ϞcXa4H͋Ӱs: ;-sdywhQ$>g6:&>\_d犛&jCvʄC(3NZݿ䗐˔FyCFyA{F_j4!7_!1{Ղ6*l}rQ#M8qJ'|r}vHXb&jMY"tNa6ya.V7@ 0Η[Gnt* R wϖ/5_MX&VMuӃ`K.@ J\g7^ :Kcc1h8#oG&'P&p?GTtj³e/ӑ)Y-(vѕÇC s`aCc:.]> SYңlM-c\Ib5|y[SʓQ'ee` Jm "0%ۑ(H{!aFu^*AzFISqv+WKx2'X7k a2jFY )m5}YfS^]_oorߕv<mn}tY>Qx4D0kj)!ף Uyb b+]믿a \ஂw5YJI=Wo\'`[n-wY}{"Hr|[ W׳gնm m;0 2Ȟ>^vW&BMW4끚98 @b3ai9]ʠasI?A ,Im 01'ړ`)PD *6e,dCKTAULU4c͹B9Eл ڴq 1.ёhOZxDN#fɺ@ @<(Q#66;2kbgbߝ4wAìPMC/8ݛMhNvAv6t6N҃Gb o(ْtp:T+~Ir9Ɏ[H:>c' /Gdzi88M\ t#~3)2m FV-*hK)$e.Eo`\ ,;bA/@jP4?/`IV VԡD+GkȉDVتZcܢXĊ"'DZvgD-&I] p'Pp%us㱰RxX"; %6 F:1)\Kz^_3֫iӃ3 6nR?Jk%s<+G0yLf_Vji ]]̗aZ+? 8B&_~nqWHzX|aS;v^6W>(#HRjy*Çc莗n3NQaRKSyuׅ%ݹ`a`ޥN)s"+6@v]Eݾ?G7CSGU)2zW %OOI]X7t a\B:A$` ʑ-6cPihp0k #=) eM"]jS45j7 q@[% B}DrJ1So`sֶ"EҙyGmrjDGv?əbh#R).(;ȡ TI344Rjc֞O5HEw'0fY(Z?MNV [d^~ݒ!Cd[hv2ʹd5z.I:$e1a[=t"eOCu[Y'{ҕy`i' {QR¦t)O5kwNl_|}O[ b=JȬOTo-fJznȵkƳ,%F%|&Y‚$ aeOmS.ku~;[[ZSL9k|| Gsc6 ~b2Tu]nP4^>ׄb*44^VʑSx~qU[n-[a+AqQw4 q7/&M:8# w;8j8 4h]]` y $yKT"S@lNCXOM& ĝqj&(]Ĕ 1CpfWԖ8!t˭쵉{rlUBR~"%, (Š$=I0q̲A?6|gRP'T[08i >aEgKSJBj;{2[ S2m:f9/-a`n|0Zi1OKO+pG|3垯Fgb^XȊFϱmd ]2]+A'ۡ;%~dx_p@);^c[M}+ C \1ėJt|[o/꘣1"{Nuڎrw7N( saԤNpI ^74JqJmI- ^Н(y"MwhϿ!@hF./+ΊJ,i7$6V^(A(7PNpF;#E%7$S`LM#?h/PŃ53V5sN27wbNm|^ִ ߨiT.qX$ F-8>T)4m\@"xS}4PPS(#+u,Yn*yb XҘ)},zְx!>j)|l]!*'m\RDV*֒}C!K@:DBsJi2#՟Z(lSq,b92xVވnuY#G}瓲}ﳷo;yNJ>@ǚ*Fl 5/zu ZNmkBѷ.uN?#짞Es1i~:ss3L%FGGgzTq z:ͬ gzswz~[  XX[OA m\ɍz]HӃDMgM2q;]rɩ f!?Cvo-_,NFߠDalTퟬʣ,{lق:Q6vt3s 7{}Ghc 8,ˬ^xOApRWrF|, )6PGh}8)@w2)wB2', Z!<M ?8PM{$q֐F?Gs2P-`ӻf]lMuuzyg5i&jl`^u9r:vYo?'W?Tߟ <&W?6=P˒ri덹>C m\yts)b|6 e\*<=mi6ĦD rSeXFK /_;O9ċD1*-,Mٜ)iqJzI;9tvH~K,shCI lGφY,<ѶVS=Ca"T(떦(ۏǪωOHG֟?[!w<+ش}2/ [V- TimeYQ4e 3$(wgs8=<צ믷 *Q 0CuoE?-a<]+@+3o:.ⱏ$6+>i[ :+מbb&X2yA2.Ft胅,/f5SM@hсDo}TrXK{kqDl `+uH, 482p5GHqLE{9'Ќ/Vcc X ; s 1M x|cga_[Y Yؓ0 ƌ$(Wo'39I3_Zm`eyRdzPkw4& iX*Tp.iQ'LC>L@MڛS@<1N,P3)˶ꢗLYR<ڎX]z'OZ]s^qsPR]yW+oKsGOAiϿ ր="'DJ&^?鄇jVY, d|l:q]oCco8m G6N̳ `m-|yA+Y&<͆e*mV:.?0۷o_҅_'TWz6F ݥ3wƝqT(ANyu 3W몼ꫪ:gao^Vǻuͷ(lLg1@:}1Q.CSqǝ՞{x6br|'&.+om6f`$8frxtP#'v$!A2CB oVxRgWBP{ c VT#,z,&E@<M,ܤmbCcvdc phMγ=-C&@áS@E0lPq,|2)⤹>L;kp`BkQC&Khs/=pA|dB M}>o@ j6,$4@m JPMrğ CKd)˽™$0?#S]gأEK憬 56f+(B|,'q-3_>EV~ǵ|Z/ע[+?Ztkg|\n̗kѭq-3_>EV~ǵ|Z/ע[+?Ztkg|\n̗y^}7)΋VyNڐ*:?{ԤV͟WTS^/Б  Q<+NsRgti$_ O*!k׮X밦6ӥ$1Qs(b ⛊U{LPe-o&c4҈˷nZ~Py:bzY\(MQHwa5E}\4kC GH'@!Jt]fj6e?X:;~,T+rm{HqaC54IzQlfhC<5$`= ˽y[AFx^xIx1dlF߅g)d) $H@2Mf!UC`OH 4%sey-a@&[l@ !7 K=Tq0*bؙ 1jɥ;2JҔB8N<,o``9'S^J/+b' \o0%by{E?FS ej|Rϑjr6N82,f3Iy_t*~z^We}}VP,^-E)<$,ّT8zu22cb (Yct61tWS9SxhOzB8(vbO˿I x M2 ;]άX)^1]}UrzՉ'P"p+}Sq M C/R:6e͡4zUjJBnL=H< u8 VƠp/UznP LŒm;'Lb`ǫ%ڙὃW,àx<Ξ3sg]NG0<bri[fۍ X)6* Ms,^+Ku <A&(ɳc{D<\icq$uLց:炤ԑRH,(hms1<%Y IDATkR*:Xra(l&QׄrbLT ȿ낛(ˑ Eج^S/sեʢҋ/)V&g*h<ΒC~mۚVs pk]Âxc`BlqI'aqx\{w޶X}8Ze0m5JfMg= &N1[3d'$TV4$,ZOznAGԿQu^f| Ц{J <̔eZVLI|uM>?z򜟏>?_z򜟏~^|m,S=e-K=+e S emEc响}5+^T2.t# U f!ng93~ /;X%p:Ç'}kvsayfylT~{o]#Cl0<[2|X& pq%v+"1Ibx 15Hqlt8馃|ES"qhAܔ䷀JvLD>j kaU(o<rHtcl,Xա AMA,zO OLtZ^ ,.˳x^0Ъ \g&V;gd:m h9{HZG ;"FI簔V*uP;KF837"@ZCGX)zbBkcINzL[DYu_Xtn ^YT!kh<űuOV (O0cF_d8 Y-,t=wS-6voQ[̕B{ n*a䍱 /L`Yggݬ^(J6 ĖzV0QqU+Ra?=`> GTrF@F熘Ժ/CDE7kHe{myxA WENiKzs-brRM0ϩSz@k;ͳmaXP?[XY}4l thW:?U76'ɣ8pgTk+%[ lpvRoR|Hu99ȴ=o5}LJG;|???O~[!{y{}7tnjگeP54=P~LMy߾."C,8UՍ7}8>T`0{'zFsԈzfpDu#`W(W^ &-0 r88LPi+[y>zg O%jF)d+7=C"D5SV8ցu,o28ʣ\@A,]q+h Dm;/HiRjT88BoVnM,To qcC'쇂xby7vٱS>JMy ^2!2C/>bÔo-9ږC,ch6lPPfbŴKFY#8v2m:ie"?"m%dkF ?dm˽qi*L:bP #AvNٚvyCJk>+L??{۟dAwOUj(3@iȖ!fg6Og9K).ҒUȋᑊ|6!>ˠaLLSJgp5LTx.2bl} ȘDg9iLx'l!kBXX`P :<.2g訲TM!ZTTzxȞyCIݳODvqv:eN0gt*NQœD4<ϑ/ֳxsۈL()kꉲ|myY$yӽYqM 'HL?LXx~ۿe=&ͽ"k mЊet@-@Q\o!/7K&|%]b9\~9}b ^(G0~xBu\ʍyǟ-T\׻kK֡ ywM,sc6mݲ<ݬ~,VăC0bGx9gdKӵѴ&ﴄ_fsYsOWWn;Pu?eRvSቢ`ec'c&dRMjbY*[b|[.hqXO@ j3CNx8QZpڍΜs;Av16I:  ?`DI)/Cpc@/yF< 1|K  E'XJ !:e03jP$\96X6J`SRVr255Y?QWLEtY7@=dt\jr EJO^,Oerzx!Cxb6 'G+_Jn}mE/zQ7ʃZ2] .첸'FыUACg=7ч}o=?uF7?hm#>?쯿+cEYVo 듵TL2qK`evYAg̙s/Z1&; ܫB~G-޽{I~g1q,iqώU=ZvW$^J&'nLLԫlR\xc"|aq?-u(fn%}蠬P+QB1]3dL} {^Ā΂Fv?6!篥?rxuyƏ.# Y޼C@8l):Va45 $x}ur4@Լ[s-ۏDp.T%~򑘱nTU 0"pb,dҙg@|2_}Qzt~:O~;}ʿT=a&R"@#JA!K죘ׂ!<ݒ}!,kSz\qG镝|@;&dtEQ;0Q*W5.ƇN{O9m)O~SA%oz~XԆįDK^ΟٟR>ϔxNT^=OwāN:iUzUO4~OD:ƿRWՋg(S 3#{0jF~!Sqh?{"턬ys=2]>ʄ!H-Yee&WɎΠ˯~mϔ_׫љĬʯSS!F$0Q~8dbaͺ_=,s<*"lbM+ȘSK80M->7ϥrY:tx߁r0kO ]ƞ71o Y߁ʎ=XScғ &V4K~#̀N͑(fAG>PN܆6\ ULg[h#ۃ"=tum/\)gDP}&3C,ys1& [Kf]-x39=|.,|+_Uz};=-wv{~h~ww=_;wъ̐ Bі0cY\򗿼w$O~ؒmGm Iά~'gG>k_Z=M[wǎ7 Y9 BI]zW֛ԟ'=Il2OOu袋: 7 8ɟI}Ї>Tj?qef|T{If|4oVHnsbV\Oe~rj+ˊ˂?g}7!+W!򘣶s8TB _P(.]j XB`F#Y5u hC%³SQ@trՒ>`'#,(s\yP?ŬI@d@bsR:R?1yf~BT?AڄR, `,<5ȟ ѹs稧]۪ oޗQ 2(ã63rt,pۍ16 IDATrgQx+ -/⊠i;x4ǎn(h/茂O|RW29q?WSx?_T[n->97p (ֿ-o+o?9:ij<&bT{L֘(>b5o@̳׼~dF*.xx33\P|.gj& Ez]ŬVrVvϏ܀Hk5iŹzi@,Qo~sǶ3%fž%2`(xV/׿:,JCu?{M]:%@V]uTEeVJ0? r)OyY>2]ǜ/ivMp-(ۯǾ'wh_[LPG_J٠МY&V X^TZׂ&J|DU,~"p<|Pn ,H`Z?mz\,?v֏Y  ]Fc8[dFqOO?*QPT3zV竪s4,`\A'X^+mGm _Gk_K/zOoz[ܯn MOO-/x_ڀ/Eh[g>En+wNz^+^M<=vK' '>~ӟ.ݑߎQ- r۞gW,i,KK@*), i$_L#?ݛ _’ w,R75_x\R[Rx3FUW{x =s?SoQ 8[:}~}1?"/Be,I (WQiv|/ƒ1 >~{L)=C XQ|+ԦzVX.ъv?Kzn9 /dOYqfA-c+\/_NN\b _˜}#//\'L`aFA7˯XE~r;/:X^wu IާJ5_S.0sPέ{~ ['+us6+/@:\5u_%Vcy^5{,{i5~== xuzB7]#v%Kegр1W"GSv{$#4 v3T)$˂9UfaQ:T 8$/Q eAٰM򕯆w,7H~[ވ-I3z8ҵexȸMM>'@BA$9YQ쩧žtdL|c;bINb9?FY`Nu` WC3y?*⨣)P|s+MxⓞTKOޡ7M=/Gyԏ 6k9$; H_tMO}t`@!' qɬ?oR%~ ĕ_&gmrF h+TГe7xcLiZ^}+V^ wƠ1W_7嵘ŏ,%2.'Ef]u@ņ€,+hX}!^"e /ݓNeW6>锓^.0bNAXբi`@fÆ)"Â2T^LHk<U6k3w!>NT.#iцTR)Zo@$X,-ŠUb7%!1_QCT+( M6@+<^.6ؤ$c\E7fF<CzǜY)Xc:[Y #sbҗ4g ׿N+O;e{&KiMZn_EqYYv*&8L/֛ <>AxjjzfH8 h>Ku]gCT7`kj,7ض{}ߙ;3Ҍ@@H6'`b8+aCm0`0N 0 ۡʮrJeS0`bIz# i$>9;߿[>ܹw"s^_VW/tb?En,*6OΜzg*OfjŬ5}Wm$emL:Ifg#:/S:&;6䯥ѱ//\ ɩ4WQ5@"w9\)g3A/k0m]<AE3g ՜)ТR{W OfGY6WG|=ozӛƽr2?fL_[Si>tĕlVU`S#nՍ-ʖŴiі֙ k&pc6qS׋R@ vZ?p;j$r5|)3’v7s+:ךaw@,F_UBg>q"NxAPf3oP :wq9wMݜ@4ܛ% gif "W\bm4rHm|奍B:kf7e6s]Ðg~?Ťi'ߨqp J:y2mv65<يm_MQw>/__}iuZ{N~I":r__)U>54sMX]n7"kludVu[)-5{ǖL -_WFhD8)5}G Ey7EA/'vs+ /\c }d}ٮDpfN!2ŖhW|Wd}|OBo CdOsw;YG_c}Ɵq:4}٩MRv͘lXg+f:Z_E_}qF]7?Fp:3O 8{|~)SlsTLkGIFp1BΨN cEŭ-%"Ry;W:6];'fGU=-i 4Uo|&S g'Nq -rl΍OO,Nq/Z|׼zt_kw_UMy:;g:A_U_>1q0_gav+_1?G>U }#tґ  l˟tſ,~'쏱v۾/oT+hlw 2͉B[8l1z3{kaE_xAQEմd}~ܩ78?utד '݌0 H܇B3'M:RծLRu9'LQy4ixR=)rPAH3 9O |C-Ye9?G?S?v*a|:׾ aLoYl~Dd(4hz91o^~7}RlG=.=Fq~Dvtp.<uN}i_'X! ogN+J?t?+')?Mg"?1IC,GcNpԉ7Q_ ˛7xqfg#֔s/ux%v2'zr"yGVLT?7:C=κbwa/҅OO}f~CEH8&ѦŜh:=cZefEe'yڰZyo)E-K̾+c^D;a9fxs#`EClo`;Ӧn5Dxtzv0u}?1BB\,l1'l+GMJxj;FqhK.[vuI#T@Y~^Ӵ~(kn'#yp"|w3!'S}`r_r]Ib[;~ N!C;huYQe~yå>~lʆCIn&& r`BS`轘6sF^M̋'V\DSFg_'Md_x+XprCz'~2O6~S mqIRDI9_f u7΂T^C;(X}Q*<]xBOHS*b=Jy匰Q~'Чՠ@= q,^ba)lJD!Ҹ`Z!MgetMh_BT"EgFfh3h(j'\4xA_E'|"4w"CZwgOɑTrŬy.}iۄ?o-ͧ\+ÏV:${= '\HN4?S}mW~>-o?}O9؈^/vj:%{kajC+$JV_ M8q_)Rn %YTD|βE_= :`u,(yC*:]wyIo#pZnK_${ 3ѦS I_e&v%;{[ﹱo@hklӍ/V:@aV7fOf՗| FVz$m.]ߘKoy}v:kb^ӎ_o~ku6WwWϮ<`tٯ:ʷ;fcpZ94w|uu>*Zn8.S{~emYƼ~2k_6dC|TnP?N8OrT|31!#ӓpOw!xݢ =O[,Od;&ƺY1_Ʈ<ΓMs#\b%"`?[J|e7N+]w;xBN 5gv,}{gr׭kO”́b6r6ѱΔr]8ƚ_Mb c r-H4j.W=vݺNT,<ܣ '+=@q?8e^O;uvx\kٟ`Sg=(=w4#01p-~C?1{j_XX>Z |b:Ɂ&1r+%EH37 ٞ`X zl12l$|dG/)frΝ??C6}e5x8Pd GFKA%X-yX7Eu9rGgu # ȏMx]7a ,l,9e#Mx87ɘ{RՌ3BO` ɠ.'Z0i].SMQgRom |q$}65+<-DS%8Q}WRmƺ.ͦ B+EU ]qϦDFtpoG"EF'[ןݺsFfj*3Pȗ]nW[MX h'660žLT^͢|nG!^soo"ѳ9hrGܞppt2s^oFo0΍hV޶d yb[;QmǺلexu[zn}d`c6ُ{I -I#ܩuAxG{zR7(_yS\bmM^^ȯAYy\:2{txOK= ~ЋZe/%W"BL a\Q1c#oW| vfW_`~p"klrYҜ)j\}(V9G&=b]ͫEGY'cAA01:Gr` Hց\Ƒ`ldWuS7#A@νaDh@K酫^勫{h6r:lT(86NxO:P~_T'EUץE/=se~ IDATLW|u<&- kȩ7OWt}? ױvʫf`FtHaW_E#OY^l/GЁg o=g˧p8'LYڏF[<|klڡVgA9s*T{9OCǧ!B6 xaWahfU'hǞBhگwm -Q~FE~4Uʹ{_zcZ4*H'0vX)QGf4  v*7B$OڟK {Dtj;yx;i~>rCZ>3L.~lz8wfۧ%ibPoF7Sn!tvO=}Qg{Pڜ"F^\5-WyRiw'b1H):&u81"ʠEstQH\vu|~Sg.;p)>-t mi;2N޼W*mO")DCb =ŠߑS'^/w_4^7|%_Io ] nsZ ${6ރyҩZ,g8ut|Λrvk NϓNk(vp##zȞ?J4[//n_J6u-7aE]6].2w)kF.Qoz(':S3 Lrm٪6۶s]ia ]F|Fai0u {i:ac}(u-6[mx}5~T٦ |ԯR^C^ˡ=́jw id y*5e5rQfrㆹ<ԣ=(ϣ>=\˫ (vw \a1E;$cx&/UA~gȆ^~d]0ahG2Ce|x~˔ "t^*9Q9O<{ӭٵօ1T 3vbխCdU$yMZx>#=Α3;05y~z=(ؚεKz3%\H!@B W3}j} 0V'NKk@tpH)heqZ|DLr#!l`ѶF mN NoiuptzXIj_\hFt{$d$&Q(MX#$u)<׸t/kXtܼGowNd ,SSObJ\}ܔ3-bcOG ?*/fqb]N z)?e#`w^W[y~ g~<]^ex5?B #̋6 Gw;wЉ"9xP\ډP'tje( SxNw?[V=reP+W%M7`0Ɖ׷xwgIĉȹ"`p*@1W8}1گΞu? A=s}p`i_cv4ֺ]FT []svU!!,6d;+i'2_λ꘎tqq!u9ggp8\=hG\WFG%uC]Ƶ󰽲Tkyi;6 xډDT ]T*3 VjmWtu8=qCD%{\y??ho+?~Ϥ?7.\ǽj) u׌citNB(F̧|22s3E>HWJONswQBi:} /Q.p (SC.xɣtq~zCPHR;b.QL\+`F|M:q̖S󧟹nCt,F _+e79lr-1ML%v8,Pa1HdGE\ / ?ц#SeJNR* `8L0j2U]%X!fY|MәA8R ]m0-ZV>F6]r3el;FB3h5]~AMy뱟C'%} ˺&PhKU.:\ϾKtS>Svx.e}۷}ϥ?'w{^ ǫVvkgG-?JF^ݲg~g~)򮼃ֿmѯV5=[#z~p5_.A)}9F:a=zw.5A֍U\~[zp]e˥.֩%z齁(G"tpqfWJ2Tӆ8V~Ļ˗w`%ogdANT;Qptf~v\@pwX' !k:h$PxN&Deօu!'B)鐴/<K4%=h.em94NC /];CX1ȚP TV7; Fۆe6zT-\DI!V%tGވIkޞ! !G䋗raq2 <pqX:[:22$K5ِvv^[סyi8 YD``̥,l~W%u蛙S]tbkGv-t'?$Kwx`N :LT+rv \_{~'3?3gWNW:s먨vyVP )z]u )>*:P[:/e~/~T;r>S\C}]A+PǤ1UbE 82,%n|Y- prs{rZ jyq/TnF@y7ڤ\#{un:T8SGoz8ęʴ7YrS?r71rAgP8X GhG/;;бE9ɻ~EE|;p^z)6]'d-dhi'&&7;ځs561]#TM)z#=4FnMsMHuwr`r5;#h:x6u 8Fllɚ%k{̹Y>,ǩ?wr>/>{Lg|rTx24ٙs'6CWSN6\z:Qxz4 2TY17&'o'z o:Tc|7|e88L@Rt ع憏qw8t%FљzvfWo{ !m2¹5MM+QÁ?MQƚ4!ɱ*tB DB'S8K0}2=i,S'di[e]Ʌc H)=hVidQN_@7&0)BQLbqCTE_wlPpzg͐NFBp6]怳Ǽ:]X?bř˩2nxW҈#V(Gk6݉4uqz\le߳=V:)v_ 5E`?}zYhE:ؓu ~/C_;__Ë'?/<_2` ocD?q\e&y[Rk^^wݳKC~w;雾0Ht3_5_c;ʘw' wcm;pݎ}vsX<5qށn[%l%? SzdLlM]D}H SA}GFuN|+/taSቹL1˫%-LӦhwX*7w^”pv" gyu(gQg+>MNJT>b}!Ų12;p%TeA50樊#+`]<_.,%4:8$Eg%c$Y\F.ypwҊ~e+JܦKR'dž@p@R6Z:4㲩[^)r^CEcbvb<6M]ݜ=dZOJMsRI=~q:Tnj#u@G?2ȖAo{)HǧEښN=?[dM}r5~o#2C^f͓3(ʀd`VjꂡCoʧw!SxLw(gL&, 6hBk~VBόrNw2y`.NpJrtQMD(uf>P3KS8'=ir>'oRگcm#|7zqHҷ{;1')MfPέNp9^On[lP#iv1)y|%3ZMU~bZn_e_3ljY=ᣏ>:ٟك׾bl/忌rk8PᣃV3허;I} 3S[>mz_疰'tX?=E_4T.M$r=/zxAql)>Ks QuHN+Nryc{3| [(12RBǛ4MaI%/#]v5ՅG yw$A~v.ey=9@ԝ6j':pc`Yn(acuc^]6QE }Q,_]-x{Nu|]}~vm{{|X]#OWQza^6x1*yቪ5l[M}M.o*A7u'OB'mK/uXXh'zh?GDvbQ 2׸NՒ)t6QHF-LgsE>3v*a*kSv\Tm R*Lp/.fFfu³wH 'o,uf:9MeaLmjy,OU[-u 'ѷ3,ń'7F6-ʯYuP7x-WȲUU۬Hqf2?z d^b?Q"_U:AGpd||O~x^'p#^`Zڄ,H˿Sq;x+_)j4w-i^Ntܼ{l/Q9q;:~ocZG~SǏO-uX^2[F?I?r&R Ӫ(5F\L#lza:&NsN7e'}GzL#lĥ*SwFHy`eez "Nس޻x#gnoԥGC@b]^z×EMd3us;oAV %r?ԑ4ôQ)K.5Q20`ɫ` ;=:ɰE:}\Oc^tSt Z80LuTiv 9<8 HWHħ >\Õ%ZlN34g,Sd&yDm81t& &+W&jz j!9FJkGi7g>_g6{9gEÅ.ךSlqśI`*HjKh~Tp5g]2?W_`]6v@]აI'I61ŒPJJ+MP|9I W K牺I{%_c0y{fo(Pㆺir+G"nؠg1mj/,T/D9{ E, /q ؍zo~7b#6?DLȚȢLa=|{thDDi% (eTID >d5a%$x\ߺ<ʱ'$q[INc]+]Q05j26dBחbRgM™=:WZ5s7ˉןJes;O5rNGfz -x<'tۆ~^՚|FM4@Xb s)Mxz'OOY1pi_cDĸ-;/H~kG9#rO3:=wLSfb .Za+EλZ~5z`Y"Q\$rw,gra*byy#O.: 3" vc8ॱDq=u^J|[88^6 癞y:ؠ*L9 #>S1P@rxR`9wG'Ug|#[ʵwQSpUG &M-OeiUW.j) 98DIvҪ1h4&fC~a_~Sz5SO9|ψ^NmMw_/OnKcmH!8\ D4! _I?:ep> Ǐªlp-}7F٦o?|TNoe8{X[U)B_89N`gb '<y"=ɂmSѻҊ{"HNT7u1yMC\\dFxk׉%x@W1{Hd[yeMgXW\a+p*xli5DVyh ~*nvEE8Cq#!nyB5W:qK .zbO}/2O{RM 'HwZOZ,3vS{Y< 3䤺EOK65(0@ &K;"FzYnI2 Uv[t'k[F1mp<|7ituSt0Z]C|MΤot+V=A__ =[ox܇5RݮBLa?m8^)ڸ;nScMeu&}ďou2#Ͻʛf9ƹҙuDܴ6O={}5蓯g|Ԃl *klamյ788jHU^Gg?²S| FliU(fkMn > 6`B5H/NgC9ױ'XLyAP#&XW4^j ^=},AJte'ɗ JJ8KDpӷ3~ԷcCI߾&4D[NZhh%J-Fړ֓J*QX5/yPsxW'UoW}j'v*QX&?}h#dậRްDO/)M*J%ͺJэܖuEHϢ?7]^wXA[4yu2}cli?p9sw""k%w/w?("4왽yL_Yt(dIA9SL;F 'Le8;q8?[+GVH|?H t?^nJO96}kqjhkecQW/ H^C7l^H3T2uogNG'{o #ߎ ܨc#U=&B1jr].*x-d޻x,xXt>7?l2*/+:\-FoЯ ǮNxg]їO}`4)& ^`=q!Ս+r00ף7{.߁mvw vp=w  ja`Vn]DȢs[b3)nY')ZN WG)Zr9f09AQ6 ,F -wcl /rN7u5$:dplr޼|@^;'Fث&߬\nTqL^\8҄٠D7lTLK}kyņ"WJߝ%N6/5c,?Fvẑ܈ZrV&M &r8|C{"Df|nKg = -bzx0J:.a!Rw²mzUNS,0kGdJyU(Gy5W585>[[yHk?Sׁl3GO#~ě7 gͮM'9PŰ82IFM~EXN]č"Dt6"Pw_Œ@G A?3G{Z&B$TT>u8tS =|VIү˕(»sSNNF:9N33O*e[.W1 :MdZir+{bOamW(& ~Ob[>:LʩnCeP cN\S6GF2@ߪ}Z};Ŗ,n߭]NecT1Viy뼱LȜǼxkޤxAgɋؓkois˪K GO'7Ru._:zoQm xENMै !9] g ]~ &5gXseIG't u2crUGH$ÏdF析? oq8˄ `]8R2THdaÐFv=!="5V6P*שlS@iq"&-pD40❖=WO4J1/䅷?}1G9ZMy%9? vaʩl4]9KeYVv!?¬7u_>Hz~os~[,~tCs0NXyIOQѬzZWx^IF|)z`׉Y@Ttsh6%_gɈ|#۩B#_.$ǡq7?s/_>|{ދ[bb3"2uYdm{߼?'`84:VcG sq/Yۮn qSsϏpxW`Z=9(-qԇH\*1=S8\mpS֔&7-6Gkl,d[֡^ : $_bY6b%Atsy$ybn$ǟߺAE`/.6V"5t(Ӌz铊6[+&,KH|;eVmjw#?2&~kM4eR֋$G ~zCH8hˆr-FIHmY,SB(Dyj5Q{^ZU_ " ˝ @cl?5a_?M(vjuǺ;6'☊(.4b]M\@PO9:Wg}v@ɗ\ ޝ2|8L}\] 'X wGO>2< Q`;zU+T 9{'iy9,1qx3iЕKg8c!rlVYQ%0uStʺ)M蓂L3޼zco=y!@jR#XL`qfQd];T(aҫ啬^R895h>;6mϕ;/:C=79jZ"J+ކ,ww(͏t,IQ.:bvܙKƾ4{C^skMCLIAȡ!W:pM_v*s`8oW}vm~6Uۯ$N$fs7Ӟ=߉URp-tq6%2"Ho S>B _(mENQ0~֛=x Q(M9(յ[,y;naCK_6AA^gFx9'Q>}^2[>tgh-N"B$3A~j)H:Pƍf]qO+O '̗읣 kyAg/{NE+ IDATJ멕m[A!l;wV'<m񞎓|5Pr3o2^B]*OW]r;zu-ސSznցզt$s tfo**WNuG .oɛ`[wl{+KH݁SzhTK|/&{]rItYDJOqℳo>Ʈ\Z:|~/&}W?U.9@'[T[9RgnxF8fN%Α3/t(Dyc]~P7foNdݎtM>@|<^|_mF0py?HkX!d45hϵJD""Bـ_Dj~]:$?lǶT֡e`ɨgE%]xgj_ӆn`k\y+ˈM-J+ἅ1媓fma[?Dkd6 ٹνIku >~UrEF!܄_\ Gq:JЀ'?ed\ױr:)k[aye d=(7<"pO?upFL9݇NSqdl;{%ā#d;Xͽ]TE VjffG~(%6+)x.>6mƓ{)4M 8G&r?m_ǹT+xe7 n)7mq᫫r:n\gCiVGE޹r3\B3]!<) 1- ڠ94ź2^EL78aJU6b6%5ddnRSѫJ@Ծrʶ4ɧĉ*KW#*(DlUoYSFa&٤o|S s}<~1mRvfLu/i윖pRfǖ:7rӽJnOhS.;Ny]2xF+ u_i[\1}Cm7C]O~NA5˥lq~C}q5,7)߹Ds'2̞JFy Nz(zI3.0ZRcWQ/X>t2]GǢ}tF\ ##my{;}<卛7#p QqKLg~Z~zo͞zكL&2" $Jp ənay liG5܊@AoʈSX`1Kr2ݰ3O])~[ A&54\sw_#ͲU/ߘ"+s 4K;b >kXX ijM_y=PBQ"EdYdA :7 ^ݟt<>š:x:<?FnlEqZE2bts}IVtƧ8[F&|䴝^83;Fe Br&z]SMVeK|4Pkv7; i*$}u@MN\()>:/&KY66NMqҀ,76GnJ~>ɩsu6=G"{)}vr/]]pΗ\dgsL>E[;=i}~ &J/ySoSQNU?utHnhuDZEf Q=],XI^xΚ:%7z)**um$ 5J}$kFU.:|Ƕ]&ې)qK~k;c~~S/8S~_](} I5A֍C_ uwDo0IcSi{u$ubDd3 "r.6t0Ns>FāOzi;wOb7󌯶`qb|ң4K_}NYڪ.sy&6;rBXhqp hV1h@,#Dc^sp{2O:rmQaQU,7fE X2dD~#n}cmV .JKh]&9~F7^K^XL؏Un0K38{a8DC(_pH`|ݜ3;,>3t~r?8J|tش3LDZ8:K|4C9.67K¤bҋnwTZ I{*[;.+~he=WBkd҉Lh|ɇv)ѳkf /miktگmiSp}skO;9C} q Tm#}iNg%oqcGo|B6y>ƙ0H8mG{ig|g,ƛ_eڎC֒ilqvF 5F x<8J"ƼdљnI`D^LOKAKB`rN߆+ 0oPSA8C5嘧9-}m&&|i{覊!}M1ɔ@X;8xfM* ÓjXl JCBPۺp".F[vin1G#;7 G^2W6n\Jlog/B@g8.g,*wtt^j~ 4do Jf@@``c@s[/e9c`EB'2טl~jꊌ8rVUU?O(m;K(v҆[su̪Cr {5&s"J$%8.΋mGe26gϸYsDe&@%FG%bGߜVc?ڜBL;nC_.B=cG@Kj?.ԦJÝIEWe?SS5s_9u͚>]}&XzsF[MXo6*ljkmWox,&np4]U.3`AjG%k+jOOD{.q3tTp5/(``>y`:{#xO=$7l#pѬndMz>90ֲw?'،N۷Ǻ ˳'XW&=]SLQcaT!De ށ:Vl - f)Hu782ƍԪ B(8)S۸p!7۾J`g[6KU(W5՝O4/ɝR\%֦Y$ܗSpL]f/+_?{C4]y8-F;BO*T*гt;/'7[ƍd+ej}dY:Va72MJQv[v4oGǖ}zPH:nݘ6'Q57Z~4tM@oO8$,|/-iگ?c톽Wmb,贼uGn4L<)靲ysB%t}rp͵R=Hmx]:e/#0;쀿`Mܜp%Ľ=:!b p`l1ZDaO+=k,BgcM򥭼-Э|ru3Bƥ<C3wfg8T,,ש>rg1omb&?ա`UgìO9)P2>8OY=AS&B_ TʜD#̶UHL#Ifě rq\d)/[U] zt}܇,]!ʤZ,覯[mOVR/TBHya %wkndE>>̃ %'.|)n^(`̭QMhA#ݼusv}O?gkfoYD*#,:g`rw~9cm}z=udn&hyp`~pyŋdR*L;?xgLc:z9lS&ߛyt7@#@4$ L@ BH !1|1 1'H;t'Ɏ39c;kZu{399[UZv]]{cYTld0W`T&YLUUxϦ-Q eDaU1'2MRaT>*y%(i@(h`ߒN袙A[f__̤ubG Ă@{.o%;Rtj'͓ r`MJhe[)cYgbx6,J6ͼxP h1aZlWa&y͈6,COύ6&˼mb^|M󦞮&Qs^^*v.SJ(@|3G@7;vriWm^}װʃ@Uime2r1#wKb#9KyP;ȌE[z7Z<7j['.W-J^Sy3P ʧF={l0Oz|_1_<;h@=I1O!"%1 \1u`be}}_gמ|Цφ눃>4oZ^Fpc\ Eе4KZ*ֵzM|ݪnz'Pc͓@Y B7ɚQTWu#4|K=RU=5iM[8B|ʀ &Ol!D,aﶨPHp* 2I#ygC:f3jY>l-]-/F@Gy& .Xu&wT.bH6DDK)_jZ֙¦=x5=&>U!f/^WVSP* &c|5L~x`O<=z?cuق6vZմ7uP6VTCUIt$% IJCSޜmcP/Kk oe7=Otkyt 5X`kߛ,,, pW:|sCu>NTocIM2NO K0onvܪ[omz6w>|; kڄ\>~%5_ɣ::$ gKi9Gb ,dz!]("_\W1>ɪ$̿4b7e;H^qc2^۷oP߻_|0Μ9=B{~1 J dzpY%<0/2M kMMg`]Ѥ ۳ݺe[ǚN_Hb\F Gr_'sPo5iLCtM)ő 4is|8L+PW96Ea4+N1yX 4~ :7ϫcŻV;S} K>% r@DzPWHȓz@D IDAT Z.R8/ĠWR?h?Jŗw/'X?~zn?zm ].Nf\_d(/{m59ٟu@~iZ(z_eO":vAJW-!ȌN<꾉~yt]qZ/st= Li1@AG R+*,1xegsM 'x7/}A"d>)R`FrT+ &5oxQGk074$K M2Rc N=K:Thh!~br>pBeaPeJ8!O򤌉:؃rՅ}I~⨫x,Tb $@ )J%>p:\Hku>eOОl^NJM!a? MMВ(WS Ir9snG^*^(ijz UM'mnץv3ĒJʐٰ5-y(g7?oc]?Ҿ/s%NPf.^I +_H]Q[ 89b+/T$z#ϟ _iӲ@>1M<6ҶA#UOS/ƞ|*_Ú1ғ=}44UkO,xq up^,r3uA*e$a:Uk".^NUlIVv #*&sLy,rJ7?lNBJ(ϑ /k@L$pb:/tm,mN@u.@<9F5K@!rX9Ccȼ؟.dVᗼcDQfpEVK_{RⓝoTx]29`D1vIt"G;mN6K* huE丑TGۤ8I!!97l@F׶ӦJK ~HU0D"O&ۖG23Lu9$ cUgP􃇅Z@E}nM+ 45¨JƐk@$7bLElHa(ly)+0q#ſf-&9WR?8-}O}5~gywm 93 f&$珽Pik$VeS1+Ri&K`RKVL\|ȦtWDW&o2R5] zo9y_IJ ɛRM\~~ c$0 &Jȭh\,.ˡ-$Пf!Q??׵OzlV 4|yт/y7<2AfXC6 yAuRy|h; |{nު+5LiBU ,rOf:͙qpd^wVD 0-hHR~*+UtL?h_E^o1_qID :̋yOxAw= $ Da*MkiB^Zkb dem8MJ{~NL,- X&-1Xn;E]{ɰW?@N2DLX&t[# Wx- ;`y(p`|*OZ$ r]b $ HȊ*ksZp&as^[=[uNp㺜;^'6b#H> *ڞuktF1(TFH{I?G:xrv~2Yuc _`ɻf7G3|ގ=0D &1Z94 }Uu7IsI,of֏Oa6c :Sz!3*B(3H’e`P8WqiyЯֻB]?C )_|fG/?hr.qK!cSR#ٺ(?J1CH0o)MzmtM:Hx P5xdG!/ĴE?+"M<Z/gx>@@#<lm7v?Y"(L>ʹ*M̓ 2W+ bkج>:>~Bh `%+tl\ҪO y# 3]fry/ ILksKtSzp[ֶ 4wq_l6_I=Mz&F?h2` aK6q+4#<>uhy vy='uuHd+d =YZyc;1b Оn?6b ]F6eȪ2ۀlNSnKDDa,t;2Q"$ s> /k:?;@&S,.RҤ@^޼N`(I3r^9y#>fYZnH3&x$c:A!,/Z)O#K|E“uRDE\9=eMܿ 2^.wOG.T"/3D̕CCQlc+_yԜ~N9QC6S?}Aױ/zIu=u$3Hk9@"ϧC=jq'y={hbaI5 >I'yʧzsOu%g%Hʓ/t`AIJ>Pcb*Oyz @4 k̀h5 nmخYo_:sZmz&Ɇn,9xNtl"4)3gIH12y+COhL-sbLd/ kㅡ)ǎyvP'9!w]f&{Ha<g!KCn*`uH`y5b+ܦO ӯBߩ {8f2njZXX\_LO>deV}wҒoj)mS oHdhi{qӦ]絬x'ӧt?8J65%<@:N:V4 mX%>CICg#E<DH=icf $uZZyM荿 ݖ͛6h:jUxLsX݄֯mFovkESOl5-CNz͚O6Άhh2Z ݿ$-PQhF-ڋ`CQy9_Z` @˨iE?x7"#T"YfZx'ɛNqRĆw@ESzO[U${x2#I8L HC>8tLSbBbo,zJ}jh̍Sx$le;)/qЃW2˱i* ]QnɎϤ1z*zA!u~&SOӘ0.fO_#XE3OGqI03xKO6ܑN"_?Ow{ zl\?pA½Љ}ZL0̈P#CzRޠrZϼNg$*a?Z9&V8(vħfh3T%+3wNb <u~7rg GGR~1xw۷no6߻cO<՞9{FG'm{vw}@Vnd6t4_8(KZKҗ~Cy.k.jjM^-nX= ݫ6iFAۺidCI"gC)Y C  K}c[nnoz-wTǟ)g2fܴi?Ac#h+ wT Ys~ A\"Nҡ:%(s_#x@OO o@r]L«ؤLimSLZ3 h[M4um H:uܳ/Gp+F[ d AxAoO]'KNTX:KOr yЃ/`~2#Θ%OO)Xz+.t#h,iQ PG~Zy#~L~yZqf)HW8#_sy6j[h'yrY฀/| h/Kj^'al#m%obJGw;zg4nڰy:cbc'^<)oٱ{ z`ܡԅYMi-[v ձ [DFo ݹcYPMt5\k:|zǾVOMl"g>/ĉ9kΞ9IݚTJ%Qn|qOrg:pv 1Ĩ_O,m㭰\'}) /t5}~@KoIE̫KF- -m,ؽĔ3jTE8Bky@ tKWr{I4P>v$^::B@RoLu@\&/]$4N7 @?za !Ū"_U]?MPT:)b4$/ʣ|Z)yRPBL>?cY3)Ə፾ZTv%:h[=P ExAz^y}PW,j̵7r6ˣ3=>W@8Pvs,x rXaJ<,{]; MڶcGced5;ӲT'Hjwԍ ǎ6ǵꌼ>$#GL+<:xXvb9r5kۛ=SZj^IOLmK~Ov :Sw[Nj왗.5uJ0~f붭6۶nV>'LwC`gٲqSw˭4]{]=hLo D?R"stmnExkk&yYRg9{Yq"/tFyAo<{jQ2xRf6<_H?"hxFڈ~tɚk2(#kOSs2hW"Jx]C`w%SXcO +qZbOtS Aid JS+מBO @YSr !e+ *I: T4%]F9iEB!LΙ=W3f'ٸy΍yC z%_W|,rV6RAelhM ,մPg)/-ߨ~-nr |l2-{E$|>6 3MRQ]`O~=&wC[ٳKFFo mbiH=z({9WȽY~yQG襗kM_KtVoU{TٸP<ͫFMj$ 4-ӥ ]){6j:wr `p sujtd曻n21-\T'wbLG aɍe9 r91Wc8goi+^-( CA^:]'K=6%9T*6jS=<.ՇԡMab{_Z˶v1N EP;T44Gt-ݮWB'1a@24^C. ߊ= IDATvgv[2ɶ(M#lV>:'>_Yrje)τIV2vOLP(+*T,$I+lxs/4A:R Kn,1y#Փ';)s;޶ O" od;P ]?VBz n<.)O0L'Ûlۓx/R<(P8Ρ9C *5{ J2GFPۏ|E蘇?J C,y5_@YtTe}։BWVˆ|"MEo&?IM}1q?3xŤPV)b^^-;NڧZ%tOIwH^2`k/-nYY:{TWQ:=KtJ^ u&lbb\n}V=H'ytا>I~}Z:|} Oy9pLٽמRL| "/3=_8u79hx.{δ4SiT6Y,}] /SO$de 亼4۟ ԙjp AW G(iSJS\r4A\ACJخ`Sh4@ ~#*3eHE~.S$hJBXTʤtt*.m]霯ˊ|ؒF',yĂt]qZ/lx] ե_a Yqg! ~f}Ooʎ'ސ#D#^&V<*j @Hc 80'yx<<12nQo&gI^~T&^azN=g {Gh:|Q|E%o.S͗<ڋ֫|c3q[PC brI]툎[8hyZOj }6Nޱ}{{ݵ{Z/,Sdx7:]ؙ<Ѕa%&|aw^a[w)@&BOҒ`: y(KÛjl"G?Z H@6[(i ʤ4ue y&o vU EX8M:c$:U5`qLZ(4 ~B Ǒ52#M!*|PleTBC`* ?2!geb0j{ȓaD^4dKnmD]NLHdf_do6~?FY=||?WA_OPf^A ګ.faaax9Fo@lkk׿UxR~0X VSWC{·[`Lx%=!v>vŖ.j.0f%dٽnO]^'4'OPgN|ԅSgՆ6wkC7{X3@D{&ʑ\gNKGIouxx @4yO͵] |F @(p:su)*Ǥ4rIOHF"w>M0 ,@S]/E? ~ʹ΀6,X|aҸ-xi쥒K zt}ڭ:5x۸fdz  h,w`g _ġ`Tqcr(BRI I#PF$bđz~~)֔HuHE\yN72 MQ M~b"ȏQPW!V'~9|tˬbtx6~=RO8Zj}u=E>OPP'lIWA& |#Ta~EC29NT T.Rثd/ |>!M {Z-lԀ 6?})瞻[<3n5m^t^t/ôs.yvz_&,SӄI 𰬅 Akx✩4Ξ*}>De Ԕzd k/tˆ5AXN3*u+h4F,KhΩl\ %u;E0xEŻ$ %/ƄlEXMZ\7*3$xɳ$ e:&3y$ZMw}7D:ۇpp_hx>C,M_n3I(OLLrD*yrx} jTZ$&eTh .{=Q^|9FC_?ӯ|4>r_񌗙? !S#edj>_GvsXq/>Q|V"m5y3G* Es<Ɛ}>x2l*h9Ф=go682:273k >'@<=q7XI7?刎׼pVgA۴۽k.,OjI0oiN_يҁ:rX~Y>1X.AgOjI ? 2mym8<Ƀۏ믻c:e駞nOd{L 5]}a TlXtXO#>IU16pIݒ7` V9m/GZ˹lwEBPQ(LKBR#Ї$>)C.iY~TL~u~xZ?M\C.i|!4ix4zEyV:-ty+VH,1ƛlsuDܤ)~*;N߹kg{5۶mt%KjSwF$ϷahPIW`_|?iS~~"UIBK^(u?~+GvKۺַd|A}t|-CZ*@!ޗu_h -b_PdЃw ר.WNJ)8B"FA*oA)]?Yo?'#0"Hrh&_GuK1\,7?_=f'ᇪ|DUt1lD~~ #Kx<늊ª&/o< ohFnzQޘ IsG_+[vZc㳀J0 Ȟ/5:=F_h>m unѝwTw.-})P} {\NCtӂAa[L{tz5do{;E^UOj/AGOaq@ #>'/^__81--;lt:0*.֟A>Cӏ4H+0Nˋ<{㴉ow&?11?iLĽA}2W5oմr_/>2By)39/]&ɧ$T)*jӪUb+.ϲ|&{`QRʱ6|\.XnI`Zq 9 ΈiM>-u:'>]7^'\,[o喛S'OuxۄNlٗEyR5lݨϽ4vq .Э74OzGQ;p`=jv%Ozyrʹ,؝r-rا}Ç.CsҚ_'h T^Gu\}.)emM'V4+b@Gh9 |Ї>c > kׯEuwuANMoݦso?ۿ/qz8λYN4q}N|Ti%EE,9o̡$ H )Q;'D9Tz1'Hg(xAQ.f5f2A'i̖ny"gFe|%Sh6<~_>Ҿ.S8i_MI~0t%N J])hS Pgui1Gl|yF:@M:=b {$=^ՈLU _/y60]>Qr]p tT>JKx>LDs PC,@ >:؇E9?@OBK4wt?O}Y rWO+1fr%O&e!a5PWXԃ5)荻N=u"y|Zxi曻SWugΞg_ֲv$ a_/i}ᨾw]_]wN>~ol{,)6i -v= &'@hmBM3XNo # nx3Q#޶؇7i?oe!|<8 ^!'P`` {e>>;*hYW Ř2G)hr'[^rQ*&CYWȋCP1 F}ӣ}}2(L|GceWc[tg9qG9u}e?JmʝG>!ĠElz_!M!qE<_gs?\0I=΃ -q|-_!_Tl ٨VX*i5!Y[uAE||6yлxAV>d^ ? @D~s&~tkIýęRwԼ]ln-n:T3 eNV{w#_h+nVyg;|)9ӥL7řMGe:oM ).Ve4[# fNi IDAT?xoQ ,a>Pt |CeAe ~gRYzgt2]{tMQƦ<þ7hF@gG 2@zeOۢNS(h?+[hJLMSIe M'Br?@fOsuI_Tۻ~axl&ܯ-<@>$ƮMis+my-@xB (*ND{8wu6:?h`b!q0??i_%Mh+ Z8,Q8 !l\*$gOM5v ZjۼeSK(][.GTrmR89Q3KǛ/^\>yvz ٲ2AG;#Փ'?ESv(v$o&x͗euJtX̙di-iَuIIhu3y8[1㇇Ȋ>ieM VT0YEZNǠCY"Di1hkXiKtLF@ V&ykm{^pi=ZgIF@zLYTD"^!A>=3*R՛di5]YJCKOy`B Z+xA061f 0x$k` BN޽x2nƑ=4>Y~$ytRr,c}o>O_w7v-sUhIΙҹQvשE / uBk3y5鼧d4g@6/Nl'$δKut|vlڴYg;}%C53$DŽ3oǤuR֓'<HY_S@@}ҨnQ?SYX!/8OQWA_kptt!QB_7he QF[j:y@qOL楯)D>uP,zdfSk*O QG_rͰ?m?yRr𬐏rxMB"Am.zTnq "O&Z_Z>Sxfgz@k6~ҽA|QyA_y u_Si;._(3MPSe17<g kifOТ8۩n`bs%pҹ{۽{z9@ALVoOGj'\ȃmmn۾Ţڷ䓷;xt '!n-}ڬs w=Xy1E- 0j3Roe` I,e\@EިehPPޚA\T/ۡ'Ǔ!}D $ۋx2!]* r޲Y+x$,f9 :P-T0PF5DYCv'MuWЈyP'*hmzohD#CMagb}'v^*Mu9Z^2Qfy29,{U0__q\Og&뿱k}_W\|]U|A 45¨JD-~U|LXt|;ML XS Poq0'`MњhuQ>Sʓ?o jf~a<6]׳NE,ir~Q/]mY^_%*|0D f{`BKZ,OYQzF%^&%-*B>|Q|r(dU^*^wiLh3r]u[TKu!-}fO`l|̮lzv`H_&v ZcY"hvM˛|A=gϜmٲUVZQfR~Rnܴwl&oK`%eFN#AC^]_.Pkik,(x b3*Iu?A|ЮcmQZ+yRFv@:ޖgGMt^S'sG(_QHȋN#zj59]*dQ|̐7<@,QKlv YNۯ4˛yrci&+ |[yMo6sX ]&>N۶t/7a>fnN={'@m9MsmDo^tk˛ v L!X3p<Ȩ:sm0Qd d's>%ZAm&~lĽMC'qDtf*#1~μ2Hg,Sj!WTDYͨt}EU#O; S4Q(MPڏp( K[-Aޭᣏ={vlk |fgȌ0xܯ>`ޤ81@ϒen/`EȩnXj\yxm? b [b_q/YKlBi@ x.cݒs[)GV!WYXjt [Z>_O5~)}dݯlze/+$*P4j]›DG3-xSDyIlMIa"mU<)M \ W]Ya6N"TiU<(z呟V?G~Zy#k|r^gTMs:?_<:W7##H4yAojyy\&,#, t?b A&-{ftW!tft_&B9`Gʙ O{d)7hkyR,xfpO d@[?*cR=k>x !_ئ)K~nJi1Whԑ')寛 a[K\Wk0C}\9BC?8]x"e=vFYX~qz嗯526:6i?MXfo3žf->~@etK]G}?*5 ܈o ? \=LP L>X./Y@110*,j"-P6Y&!t}M}UMQ$DN%2+%kc$A@XXܨ~7Cٽ4ǤHvnD1B9:Я'f9 HNKO,GOPZu{SyCA aMt#nw͇\/V>׉iP0Hz.=䉣"qf& Yb$yO-O5 wC=v:?Idѥ?𣇺HS`Rw!SV4Itf߃p6|{~Q{5SU~&eH_|9咔*+- îC[Z,CmL ,qt*jSy+&>eo ,"G&0 M߹wCUU\7m^Tᐇ`[.3kz3mz(^ʰ7id#O0qxCAQ<#],1nyetzBFIKH)6v9V#gZ}""6 f*aFW~W4A:@ !3TQjZkai5.p)R=4A@)xR,@L0t}+hL"x&E'/ڟ_0B?ŗ~,ϱ,țxڷ'?K%#+ pR; QaZSA BwG5X2Ѐ?dF(=ԡؓ:4E֐mb]i+ s:DjB%PʇhR/CC:y@ q&x縶)]E!16%mѩ͟ɟy51| ;;r3t&]QE$ͧ?uj;`5zBKL~K.FՊlc%ˠ$ 5m|S߷Ê `*ND{ 44 > a# &ΆG a1m2D%b.2b)}RU^K.l+k__>C#B3O C-ZM<:V؟ӯGD\DS)sB˱зUsjwllx~$VT02r2uڃ,G 0|pLlFhɻh7,1Kcޗ2}寤R\X(Fd옄å!˙yRf<h&aeLdZt }BP J1cỲռ"D:I/ pF+AF^m&?mh4~WH+iM-M5w,/zVgjy*Br~e+lDCyuYGh Ї>ܐݟٟ[^xG[t/4Tro'PL4d}!6sJ^߬Qx()~c{vT1Ɠ'}ooo[E!gV%|sg<ꅍ#H|7s)=e|!W]ʹ&2Ef2&hb@F'!k>l=9\uR0yƼI@yT%XMK1S䱋'I7}Y,r1APN,cy*U5^!d 4~ΥM @e//>Zdv~+;1PQ#K(Bvʇu#OA,_U؟erHW$?ξ˿|G?ѥ=&Z>ɯ+mL}&?#F @`P)AW6sz瞡>^c_MLxT@ě>%:XiIYb9NG.t7x@J]ku@Oe-;Wל1EX韻 IDATyj*O۰JEWv</uJMvD kUޓ P~HC<1XS[{{R}Koo}Ska \__?)Z_@ۿ{: ^*v}`{; Q 8~}%}}G~Gz~{_pRIg_};]{V9s֫}w|߬7??A7~7kjORkVu`u4ucPfʼmd__V^)Kn_>/צWaM:~cU1@5uT|1j5V5N恊JPdЃʭ*ɧNl_I`Izz&3Eɟ`@7򿠃,Ǜe7X#|Wz%7Dk(2q]]tDʃ^/|#?4x3%+2'%@m^§~~z(=!}pwoPfdi4ma-l˿{a(\G:7C??jkWǞЏ}c_>JOO`l>JOO{yx~I?.#|ʃ:[tm kLj+2D5Pm\є3t&Wbśk3F?$uvK2"}kHu)O M=[>F/lrZj%Sg˝yU_<(1@3!NӄVKVm+L ݟdӭ(˾˺ $|_tyj#tw_+PKKy\8@^}jR}׹LޖRx@ 6cw7ӱ<9_šx;OӀ2|˒)LW`g~=(ݸ]]_N&~o'~'ڇ~{{~S_sS}ݿLa?c;gUogoc,Du2(vȫN#q^q"ԕEE~!,<ɧw?=DΪcy~ ylc)1b0W\C9]1dSן{ 2~h J)ÃKɟ}۷}[>$G/6~+_^{ԡl:bJZ.t?|2/ ԴN]aK~tz4V8$* k q[z^Ÿ39g؏sF=3!ޟ4v2SPHruAV%&&_NY<3ч*Z<hIIYz)I+L7ۮj􊟋qexepRơOe?gKL#8䓫Ki2\v-AӇ"J(I#/qGef0MP 'Ѐ370>cgq0 13",M~>˧͊&peΓ }c EWb< WX_~|]V3mODLӶROh؁eLg e#9^g[DeBcCQҸ_* uKn矕$r%.?y?1Gj2_֕:P VLe MGUBlIKn-[)? N\~IИPן\Ɓld&DD=TXK沔UJIZeЎF78qz0a,23 x%EeCJc;JC`BfPs'ߑPllC:Pl ^dOAuVXqcbʀdUT^r^ wz_N.T4vkO?~/i& PL?d:rz%_i0'Q wra(4vP ZG$~SXf~8_KȁRutRVV-w\񯯯o7LA2aӱƸW szr% ο*4)1VX8ZnqœK!%,)1VX8ZnqœK!%,)1VX8Znq2tdqԟ3!Ya(6D|vR6fa6,'<38Q*3F48=8οOi9sii%3e߉r'—VRRc]]]+Vc9UqǙ,Ac orÑ&~ 3Uɹf{T*~4{F:4Ro|)6ivN4&N.ӧOoZ16mZGwww'ʉ Ɍ 9}K,_$/ݱ|";}f,2 a?r& .s?k׮}`U=6hiiI;P”H!nt(Sz2rX1ǿ-"j5k: 8Q$P6` Eb9Bar$u~~M_V¶v͎ ɓUγD~e +p mPY,\:jaXX^m:ujsʔ)-` 2alUE[ .,)U'pq)R)I?dcXd,,D-qEYYf ImEE0w$ DEsb?V9P buPG`wPZŋL6~$mn?qJ>d6"5lY2("HSfLLF0TR'wnq!\n?6pImLḱT0s[Ɗ+TN1t=m*w\~i'ۏ\hm[+9h)I2o,ceTn23zNhmI;!dεۏt%n?~t9r($1dtq38WNp>ȜC-B? ?73Cut u;N ӧ3AySN$s4~:#s.jTN$OacOVgwX*FVXu\˄^=!Ӄ /ʆ#ݢp9R*#`T dsd?є:P $f-7P($9%z?+(ןHA "uJ TdqcÝOk 'VݐȁR)f<[O ?L?\ kɇO>XϷLS(UlŷތIzFYu'? 1.? n?cs?}\Si}WyIht?(]T+\,pyn <7@%U$mVQo1-Njt zg-Vd/X:n?ZF3 g?V+gc*+HQl̀de`Z+##'poa4g#')5*gM&sH$ aTjaW,;(#V&,.\ȄyP_++R>, ,׿_Ba0+m#7Hc(t ^◷uu VNk7ѿݎ(m۾ӯ c/~uw<3&r)YS7[lE/~Z9qT'K7eNr =쳵R?S&6V#=nH- /.vOמZ֋Ω3‹ x<Μ1n36ؓvSmd8'ՃkixA,!(Ņ#S)0륯=¬yCwOWO<*\y~|C}!M#j)۟v(!&E0_]ovqAvy[pX=x|#O ߿qaMow[xiQv_~mV#Xc2=)oEzx衯{̉9wk+gr9 yt͜E. u5gJO`I3sk2M2} O>"v O?w5`BVs9-VZW?u&`*@-ĝ)Ahc?]=STݵ{ l't@L 4C*|ӿaMz͜mfr-T^67km)L?ΏWpgNxꩧ:=𲗽l8gײuܥ9)q%c8>ykt Goq>ssR%z =Z,oq^oڵO~ wp! ը*8č J F%ԛu8!\{\zɖ~}&Lk`:PF@¥BT! iHJCp;E', [Ι&LS26}Ͱjτ,z5 IDATwuV?~pahEKZ~񯿿 g坟ԧ9I ԙeZC0R4xԃ&z.}4|_'N?(No6 ͸_Yg#bC(cvc- gq 'U: )+o}'f̞{'DEzkf㵼yJzxjpWvv+sNԆC@:%ŭ<>>vb *H̫X#mk.%L*PS@% 4Bdkpa`-:5),{xEu,۵?\ͬs^8mOgD'1W[l^@||lS藾I= >Cvgib*#?vG3=;y8'@6)PC>p3.eLy=Caϣ};/|Y;8̛7}% b-b #dztU>[ж`(=x׏{ɿlU:C3¥Ylm:_u4z8Կ \}u7 P 8Le4PjS#2ISx[x.a1؉j;)_pgɝaE{^zp;NXviS'\nz`W$~V+ӷ1]z5^ׄɓ'D>iO+`rkhn‚ ¢E´i<KS.- GᇇᓟEd5f)S׾/:LB9T"$J}gamH7Q.֬YӤ~Q6_:_W4\/8n-aկϦa=ȵrM{s /OJ<x')Ӧڲ+C:u'?tB{xEw}B' ]5UŬpmUt|J'G#ܾCSgYvEa VZڴA6Gg{64'u?n`--! { YA!tŃs n&N utjXr,N  9\wwR Ǽcp*aI`\%fN5vͼ>d:duָ+OdlZr饗vϝ;{Z7L#BQj` u\8iG𶷽-. ^xa:e81E*eNyHӻWDsW/#8l"oAt]o7iqRЍU*ey_|UtLŁbU "1rLak_Pdݵׅo|au("җ~ [:tI.<hC֛CBӆ0b" erAFgS= mwQL%9+s{.ۺӦW'm?'oWWT:4%}eul":7 zdf8L? p?̡E 6GaaƜysfil:Omh5?\tzDa+QK 4yׇ䶮czOLx*+H$At$ FN@ǓTxb'w|ۮ:za?ZyzG7?-<ȃap ֨X©l|Ύ^:P#nޓӧ1=džWU3ۛʉ#۱A4.*#Oa} ?yv}}탥0S C:|"T=xp<÷PTPgOvLvm>wU0sJgYQˠPt#OqaC.8bzi|_OÛw (q#YGJ{v=WMUau asՋxQkӮBV͞r, TXʯG(w9PJ$!I,jcV ɕӧ =0 ` /V7\&^O}1i0caCS*ood?,WW`tjlMr /A, .Ac, } | _yYfuL*~׿Rq9}Gp4^aʕj2qʴ[zjgK.뮻.|ӟ=PW0sL)cy}* 90oNu*21[kmOº x_)/V?u{nKя~$[mC/V3W]u+^ ?嚫e0/'n]-~Z /*ۿg?YMy׻>O$矠wjho8s_=<&l̠zOahj>[ 7_N {X],Ow\zm^φw=v0=(6<ߋ/@O,t@/͙*xDߠK\f{ vI*JUP"\;2ejeIp:Q 5x8V3s.BWO ۋhAptމxʔL8qO4N R>qI&Y$rH10@G84w=qrŠYfSN9%/$G~w~r5|tiA2pC-kIaⲂ?¯N|#u;"O[P4&.c\9LP6oQrU$kE0J'9'4"\ E]~|"q'<3vY#] gʀcR3fyq؎:ꨬ:;&ۿz?5 a0 !y̳[9ފ0X,7Nq_&m1I=uu0UBts[1+i:K<ퟁYK Y:zW1,w=;,u'%_>:wGۿ'8wW\mM17τwy]VK+e{0{1? HW~C{_sDŽ.;/a_4<ʭ:5<x 5 g鴾Hq`?©eg>li@{}sC+_?k 'կ~sm+l -_򒗈G>ݏޯE}b-kvmUU1ΈA?;:Pm.`ܬG!/N2;^S5{L|ze\Y*eNqh6?ʷʾGqY7v1K/x 43.Y$y <#!nr-_Vg>zk3{gl}\>!G[aUDC33 ÐjgOG*'N [`\UBnHvrh|br[+J-7|J6:٦P,aVYU&~-](cç<>rӉF)=cm_qyqb`L~q2!1'.‘> 8/eN'aƚND%e$ЂR,C%`A'Hd}_Yƭ8P_WVqGG?*C\a'OWOO [g|L_YGzjPfؔT~+xYY.8."N _*pg96^8kK߁ʼnIXٞ:ĿG+񉌬1.=_װYBo3sw7z0}Rp+qr@a>XЁҩSgJ;f6=R: C%CD% 0p[z - =X9%|(9Pjɏ~&|'vZ9Ǝ  'qدFwLvm88/? 08xYA'8gRN~8`LڌN;$[ ?Oa{< skC-g3UrfI|m̴ g֋Z Bf voɯ1'Mz:4/cR^THaxJ,Ŧ0Pu[Linnzfo#Oַ~8W׸EG|CljV\}Wx|WV;NǺ?xXR@Gg9}&VW0שɞט!}u?i_/BdupP͑m/E_jݟv:&ӏ.ҿ|QaEo8\3z~ԒsrnD/za}_iҼGm?+@b$0HUmzmLky*+y><ݬG )++[LSl\$WJS$=3Ë >o9/@aƊYa VAp`MCZO+?GL&A(i<\E:-#?y5zö3R4 ^S$(E4N:reBz:P.]ϮĠRA?K^zq~7VP9ph⫣!,_*yϪpڷONo&Ư48C1&j0iTӌ51iə& D~awIJ6/A =P xo-ZHy&(i^k}6{hVs"n✈< Jό}*_oFЯ<UOT5ʕʙixs:7<HoX-9:NĥSa/nuOӌ_DQ/N<*KϗoDQWy0?5|J={ַU'-W*!mG'a+m9yЎffʵXO 1${:ЃO)y'qτaHpҴ2N8rd8m;epƻv 꿆FjiN$k [oC8 7_pw _{i}_vy{@8__v/GxGUO/͞(w~{9kҊhmev4)iBbI [2WiK?EO8|W/,z?3LH5]gilZ/'a,iyWƲ^`H3GڌuJb+M=P$A]I@E0ԗu(אVdڑc9hp啿{93-1H~eby_?4|EϟE1O[N4:XibŤsj\Ǡ+O=.yD-n:·c%oИL\0SK( be]̀o!Wih0eȄ<'I݅=lrx{b&G 73uĚez<Cz݊%ԷX2ޯl` 8X]#?T[h?R8f.m䚟n펭so F,Χґ6ĄQwxC?^a..ܭ˜3wuGy[wԑ, IDAT͟]נy>3ndq~q~g#X;:O0M YU~uq˴XV8oq WǭEnռ9%jl50 7)ؾkʆӦmNNNpi5j؊ik8Z0$gi8MM¶Lol`k:EUƇҟwVfmzDU򳍿|C {/fb_uV/^\jewU=Ĵ/09Ckx˷2u=;OuT4y9f,̦^-̦h9?[uo77A&fӐ])>kP:PޕV @ qhP',pkS%2z>0 OƁ>y.΄롆9}\hw<ևtq 'Xb0;x* hn^ ~ZYӳ܂rs߽in1߶BFy'f? H^ _3gCBz%܂3t*\$xG{HMt|J%ߌlajZJw;])a oϝ@C*)\`@[4nw(Ls1b |E2G╥~#/5|ׁyO|;>cx==< XZRi>8|@*|dB dU@e6SZF%Ժp3C~IYK&vOV@P"<->eYƓm}*͕tvĉў,-_8PmVʭ@ŇU`H.7ArQS(י "8}‡6^lKN40"j&3K|o K~ߧ!4oLk,m1#6QNV`(MBg)cvKcVKr2ZMa;PBd27h:uOrd6"5lY2("HSfLLF0TR'Oָ ?ԈVhL~h65U@ R*9-xZ cE*W:ڞ6;.?ʉ4vGK.~ɕlؔ\\bY72*7F.oNhmI;!dεۏt%n?~t9r($1dtq38WNp>ȜC-B? ?73Cut u;N ӧ3AySN$s4~:#s.jTN$OacOVgwX*FVXu\˄^=!Ӄ /ʆ#ݢp9R*#`T dsd?є:P $f-7P($9%z?+(ןHA "uJ TdqcÝOk 'VݐȁR)f<[O ?L?\ kɇO>XϷLS(UlŷތIzFYu'? 1.? n?cs?}\Si}WyIht?(]T+\,pyn <7@xSYUؒgtp9}@xF&MaοT6Ƹɂ%(n?Ga?em[J'D[XBfj`Rӷ+T[ O\d'U +n?~L`BevI;qM5\⚉kg9o+Ժ,|iwT[\\\b\kqr\pݎk%.YNz1Px KpӤFLJWo0T#mƊ\O\3RY)sq)6Eӟ^tV4.D,{ԁbEJz pq)^(C,Ch2O80*s9ȁdd2OQC߇Nc6Ɋbu,vX/.SQ3O牫OttȍA`KaGCieC U Pe?90 Uy%;t (:IG[wց؃s9p8΁͚Y(:Q\H*} :V@m t0u5WmOgSzuW_5O)<ӼƊWx׸N15V8Ӽet 415.Sxy,4qcFp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx}`]ŕySolɽ۸YBl iv76Mِl6%M¦ t0 &y:h|{OdKb~3gfΜ;wwϔ+׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀׀@"AaNmċ555550d59d%;:}a!  p?kkkkkk`4_n‰D}/B-ǽF/ |kx\$SǽFh%gx<ɔFF'JW>{ x x x x x x UZXzݮ??`D冥уhA LO_ykkkkkk`k)Y 5FW%JW7 Ksnṉ 7/}~?%D)9z%-7NœXnarŵlʯi_}Oy}H{yŻ}m sf_iǍѓ|mtx-<^nZ8˴y찛'vn~;'gadQ">7=^MF\ZENK/ )o0O%h>7niLs.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍnw.wݸ]~7qߍLsKs6arW01!,KvEq kJ#ͧiչJkh8(%}ӷS?ܯր307^<4S;n4[vN g&(Miţ3.#(nX!ͥq7M2\_lzxR/^Xӂ|7O&L)äWԷixhae|` *WPA U-8A yk HWAûv[iT/(/mnAE׸ c̛1|W5l:4ݎKgNaS6$^${"Y5Eä14i6_P4W_PdDi3MA>iJoF%.i꘦C1͎+O;Y1i6 5볼,|Xz%:uyYYY׀׀׀׀׀׀`kq޽{~GףC5A1!БWff)1@Nhh&R)?xPr`iGW?48FJy`@6ˍW$+Ͼ$a:t{1Jތ9^1̟5t:Mpo咵)X}aW0GxJl?S).n鄅m/-~Xkx !-uw6c Ə1G,eRZZ*J9m4ʤ?J~JYt 孧\+͵r{ueKaw ӽgs9G^V7E|CpF43lJg7Ʋ>VAܸ{;d cӂn:ySaןI,<|X^n9 ִ&wHсҁSdvfEީKNXq1;SO.[RSG+@W /TJAAAXr 13rd(8GZ3pihz0+O2&K 9KdxZ}//ȑ#~p7{3gzE) XБ8Gip!?NK3AX@9VcLc}ʣaa?*.2 hz5Oyߟ%7dL]@!/sM#VƆ&ijlvI4y⹇_R;dSxRwJYnYwd^ԥ4;ybzX'ZO;t!CA/׀I< CCtʫ'̏qo_-vNuSQ\:(ͯ)_M|ժU裏_oꮬ4k֬l6S˗˧?iy /wulڴɼnj#V5&>=tbjsH'MiY 8$#o"WQ#gHnnES xZ;R ea* ֺ3dAn>(oej?Z

g!wHz/9K|EHַem :b/vjw}| _0hɥ^j6K}7f X@w}qC׀Ӏ1s33% tԑMLPH#Mm&͘mK,TLpA?/iw0.Z)Η'i粈_N>d;Xy{nȧ>)\B[g}OI]7/|'K%Q3?^^#IY&lvx)a 4r4:)Kͧ4о8y0OV>MS8yl_ä+.cǀ?ӧeTfpqiR\,ipF@3}ZmHSK)2~ijheJAFeQ2B@IϐLX*;ZrF+ڵk c4MnY*|N܏J踦ӠuV>ӧhcN}&QYNIND?4@tFQgvitJ ,vnd ,ӎSt`NbW7}Q pW}Dcc:BGbW1aց8D}q@[=!/+s%=U3c.7jS3c1:;cikUr֜-x C ,qIb;yOqJtZ+Ӛ&u׫M ܺu5n~1^b-gt<`:GmP:4>S_aiQ;ef=꫙׀@7FAhQcŞ%X? m#'4-C*v®+%hUK_Q _P)ȘbY.Pg@i/ȔVPǝz!`#ӟNj>> /s.TӲeڃ+c [4CKPe͒ O,^>k`j$h ?.\sqϐ܀\rIg,8p^~eɁ &Ɂ ̆ޛ< ʸqLӧ5t'^CO(-2V+ZX)S5_Ӽ5504`cq ӷT0a;0&.حЭ#l~f|3`qeKX;tLtBg̵fe˺rك_sub&BwYJ yonL#%F%S-CR; !{[sl}Y)o?&^n^]Aќ9s UNrqÊ+̆/܀+n//rg7Ms ~}g64R%e^qrYg]:քisΕ?_nSG> 5,{W^^#BQ!MS`r #aWPm 3CG_㮯JiSmcxc= Ӡx?E0mLj>7Plqku#c"E8x ڸc MX>Xh9%\C`Ƿ}  rnܻN?.O&N "u{`i2ori^Ao55GPt*1NŊw>#XҩSޓz qyҒN^ޣ s--,.yXH/)>:ZY?2LFkk`Xj-oy |#~p#c&PSWnH׸mamё0})84̑f8M< j:@ozm{qiǴL&j9F e+%%bd\62S``OhOPSu6Ra=O[?I.XzEJWO }2F:cXZ2:sgyt)3z=׀! 8M 4 Nyƙ0t5]}ҌKf*66Zi޾fv 1]&3HoXcVZjηd3񇀍7q͞a:>`t-Ӗsk夕r51,-e${*<|PB`E:1W^1LG_ANy4]|6; cZ,@G:G}6?k>ԂpR*-iBjiao g>޴g|2ӼT(5M q v )Q4G3]i3MLv0,̮-\yg3 t;4*g8q'ܷ^93Q>kkkkkk 1 bkc\HWC4i^W<`+CWD+S!tZp;n c9g0@ kkkkkkk4@Bb.hX}ո"8Vݱ;VN+McXlqdc XGwux4@)``zDFO1̇N*1LNb};U«qZI 4M<);KAC:]3Nkz555550L5Xѷ!mR+ͣac g?NVʸ(Mװ楯 ftjXgb)b4lLD@'c;yw^^^^^#@m M b6[黎4uʧ]޸;(H VB\`J ]4i\ӵ(Zlg:Z,ƃ2ȫaA+O|lw^^^^^#DOg&~af[9y5бioqt|y8=' k Ғыj}nɔ-ϲӼ)RƸm ;DjaX}MOk^|:[x[8fW^8\(u 2L-l.Py'(?i\_שX[x4!Q+SB_AZރ,MgJoC9+} ] +Q gtM}#КNǺ@Lh@M>a嵁ҔWOO6jiovIJgG4u5~>ޱc>tf-}@[Ҍ{iK*p۸S̛>Ĥ46vQI# wi&Rf9n]_ Y 2Ѯ2]1q>]cVpņk8 hqn57ݍk^ҵNMc;i.i=(Md>yGq2sLqǏ{55UUM|h_!Zu})liƵL4:vj͆2eLڢC28Eq (ٲF>!]"7`oewnZPܶ (M}3lľ YA)+^Z>o$~vػxxR.u'4i̫,q̫nyZ֧묳$++˨`nٲeOYUf϶vX;cc[wH;ÝqGu*?W l:3U IDATKs2aܸ^ٸq5Eq,XP(?AM+>JwC/Cz,;E^)#k^|AN]8c(܍Sb>1=8; i9hǷAI+R?0s8}!v96˰:$7|>vŃV@/9i xG e);a7V[^0S[֧e0atlv.LX*u1RP'-eR^^.&MJ3%;uTٽ{xkH@NNqӋq:~koi\~d)Y%W? 7}3rʩvg{~Zij뎏@]]̘18y]RXd1æk_i@ݕ+N3` 10"ӇB;XEhQVMcD+XcXj_SJ/ `}Y[RGFڊb݆7: xFS[\ć@9>lr6&+sK$,}г.t]֧e|eiXniC5K I{n%K޽{T-yzMk^#A9/TsYAAYϱjL;֬Evsv#r䯫]zpbrG!бR>q۶mn<^5Sn0pkشnigA]4>k*NqklLls8i6 S U 7]F3?I4i>&~5k|ߓλ@fa@ߐ]6yuzYhQYӇ HWevӕԦ9P,jHCT5Ic[dEۥ0Me|nL>"1롖)Hc<<}\d=d挒+>qąhg7O1~x0͕9H-8ͅS$u33CF-[)żF#T 2J\ lIĦGDߤh+ ZghW*++<8i&;35U֮}SkoD2~+zGNhww.Rgv93p@<ꏿjڲg_5{@nBr˿I]dijĀkq eTBLdm:îcD\ƕ/(-֟ eE*,6]3uLM2%cl޺EN;5r RũL~!mwSУv*c"~k*CӷLc`cD3a9JHNdbKwʑyIgمe2;_/ >l۩q}"m<>_j+J׋-ҀZeɿ|Z i`s`/uɳϽ gIIdrdF#a:ɯ/EΗdcz/9(KrdRqL͞,#i*Fi;]Z&M1MӶ#M o4,MϿŎc3_q{W?.WؒB9u^c<Ǡvn= _~]<~,(#G)kV;ulnCeO =S3@7NqS隬i1v**%ocx?SV/O8Qy;Z s1XRr׻2L,_]2T,ia>4sxybV6I2rQ?557R6&Cܴ&S<ۢ`[uqM>90M ;ƦNXWD.Zv$#z/Q:-PYY{1cQND0u4Hv\R,\75LdlAFʐYX`otF$7)iq_WWɾ3,DG6InK 7N`ᯡ}=ռZM:91p2cjfwd -޶#?7c;6yD9VpV]]u01]I;@ ҹXM(I|.JNf)4>Uwʮy`>0 " G!5-q;D}mo2eKOp;|' ,63C T31:d)K1 "x8K$7) k̯al~_ߚ)kK'ʎ:鿼h\4*gϐIc`ȈUY.{kMI! ieQhXSl_۩eriQӳ+4ț @[g5tJsSMMHfvDscMHol wi Ѳxh̸N̝Z۝v݊^7#8KeeW^W pcejX_NTnN@\yrN$,n3CkkH',ig\g9fbq,33ӌ5Aߙ& &g.%mɝ/Jwșg &)=ウ Wx\;a<* 6n±0>L/C}7%\/g^&\Yy gm!ȟ.c?r>?9m6{)o| G`ZpOMd]@^$DfbPvO ӂQ|̝,v~Nl#(a!I,byM{j'Q6# oMWŲ/ӤNX.7_S,7ʯ)]iop4 u|3~sf'N<2,jғq:-y'㔗6{@>G s89cA/^;`/KhS$%v0o-kScjYL=;lA|?aϩ19*!vdȦݭ2wj\"ˀ??{ ^2K}K4`u@]4]mfYdk8Rj*@=;Y|՗eԤ}-eJYYYS>zO)NS' Z9('R .ZOHw]d_0v6ɋ`£Q:sq/WL";^=NJ[vZ*i lz\[ccC?(;7?,g-͗l]eR_|9&#qǫo0p23G`Hlَ2%=KCnv|xH4CǬݛh&;,㞇+=R)v58\cͰ(o02K0{w~ yX'Q'Q,IGG A>O6:Ea,w ;aqnQQ|"v v?cLSTY7N'{wy[uS)@+[j&P[&pjJf(cznjdbq|\6尼X\O;)ʩ~P]Z<ΰtn *wWXmrϚ&7]+SƥJXIVi_>//˔?jD9&LoFk/ɖw̖e;0LuYpKٖ|i/)EJw844=+lȌookAZknލM6RWOG`,َ#5vkR4keq;"qg=IJH+ؔӀ&4ַ,ܻv.-E$f/&b Y>}[\6?p9UgV94LCeekET{A}Tյȯϧ|RoN5* /+"/<@,9}Y2ctl3v1Zq-m"ϯoZ)uz)/ W-[I)[ZLuhz zH%{ s l+cu$|FfJu~hן,-Mpu0uCS|9Xn2C$?CrGH y聇%;KgI6dٶEp>WȯЎ5&F sLト-7受?ECb/SVҽRUU%\c:b~O۠HS.:ޗśJ6,14󾋦KSs|/`whoE|9rp\sX6OaˮrNmFim#(oe.ֶ ~UƠu[b/oY0+6Um_yA/UpVҫE /<ﮖsf˕],w+ih(X'gaJ<7ؼU~sd]xٙdʝwJ6°K.͆Lcܦ1Ǧ ' BX\^l_vF_k=?>Y;=rwisOhK$St7o.ha.p|8!)*=yn<= #ػÿG/Z%&S/lGxbyjc)(ɕG6}lWyb,h6{P iM={|m`"muw.4w_#Oʥ⬷𧻓>WXfk{jXcSa2YUS0#+X鸞4փE"\#uxHWJ]~[}),%xpgȨ,(ӏ ̀S53G8F#Aٜikud"sw? _{7+7oyu+R 0%u@hx)N)هONM;Bps-C@i:.Gj{AHRÙrx^VZ&.gxhՏ;ӚS[W$RL9O^Dz|kiݺu9Й^|NK/ot O˴iB_2vc]l]0[6m#w7!K/fN1)o賐No_pC\\X$ˣH.}~Q:iOZ}+M#ON`g lnWvNB0wŲS͆o Jx)-uj3 8qa-CÚ4MLxJ'vnvجhiϾl#Z'5X3gގln"S%`4xr)CX1/۩ ƩX pe<\uuZq{ezxGU2$U.=?[Z.%;?wSd {Z,_!眒2d!,x{w E$ G4}\bֶ=2 _sNevE۵5;WcrLCc}jv+Rjg2Ix\L|.3U n߸)NzqGKEEKqry58/kH7>4^onܴb=|4@g),? 㦠lO5 50 K#=Fs+Ҹ6q7&O/ qc< D|\Ҽp&|ewgѲY.W;cH:VfO^5~PQLmhhf ,|N( _&L _V:j꺀]^G%H 'Gy9%Fk ֎]Hl!ꃪz<-g|)RMer- {}p D d izH'L9ie&Zxq,ȇ;D1CR9h[.z>8pڞS4XE\78˝?>qctX`;֑cY}ũׄ}Ζ=sȣɇ?xlx52yH/5b˄dj/-'rwg5l7M|唯X}&s*30Jlԗm^-ǦV_bla%"N8wj:8|c#ȡð~ӘݤKmMYKֱx'r8Ptlnm  VY2;v65ֽՒO34.e{zDж&kaO 奥O6b_lZ{&unjKl,;ץJw4c-_3QFLNs٪V/@%}~ۼ0.g>ZW'xZ> ^N 4bʷ/2'm߮rR:'-s5LK:UHy6T|Y;ƹ<:|`ݽ -hl~ 6kK͓ӧwLF*sQgN:Opc5OgǙggn֐~#Q6d0tqЃČDMslV >]WA0\^4+?;C\lDWnYwvew%x),(4Wu275'Ӂei'԰SX奵c7f#v | dXY!okrǿ].euОp4=3ꕍ8%sCo_"b&\mtg\2'aac}U7kZ:vɶSz_P~CO.3q}mشy)@8X㳅r9)pjX3iWYIG.+8%EJ D, E/SimiÆ}ഐ|IӭiI9ղ'wI+_̘DL;2Eo WZrX0C׀΢ROM\qƙ5Nqk8ϴDepWlKėN X!.㈼soڬ}Ƈ=x a1tpR);fx=N_ڑZͥ)rsMNSs(9- Ln^/ZW ^yNY*k׮s=GK] vN'?ēًW4K r,_Ѻ4m})4v\^7Wӎen@Jll:,ɇftדq\3GMk1?*?Vy{ES@Sde:zF? SQ#U8mY.u\uߟ5vr;NǟyCV=_KX>U>{ì5Gb .`s3Ɠil8m"]י5v]y] HQUކCwW^%*w[7qYYNeK7eieUaaF m_W')0h>0Lb?4v8z˱-VoU/81b`gkd<:--ޏfsֱfwi9~Ern%ueݾldUa:%a07 +fD8"GK}a'{}'HNF_tVG6n+"F0Oleow]+9ArxR mYvx%?E8!NeG:6aVJ Ly_r N;Wv옉k*|J%FK؎;dӦMƊwgʂt,PY+dg cӦRUYi - 5yU%u)`~/(6N +Ro*Wiayț',o7}0]w ٧F3&Ľ~[̎X _NŎT vބ ңUx͍ssd=M :T2? fviuw[n\.>s#__.V#r,ʗ>64k_jNahu8;2%H>W6[6*V:vfp9{A@KJC1VNU{je.6D8&J۰"gamɯˤqQ/&숭4-g䦢Ntm9Mӑ)cOjb;zGehe;YQ5 J?3v4jqP'-eۃA}TЧb&ḓ7vҽOw~tE`o^'Mh,Pikį@öI%ROfTӦM3ܩM9dL)ZvxTN`@z<<>l,0?Лd}u/Jҵeg?%1&.9sb/^0GuLg80aPu~IcO;490QSSoԌ^׮\kżꪫL3µ [ ={cd^Z/7='Uz؆Aё3@'_븝4un$ 2^Cn7*L'nجsViY/_B~򓟘F}["UY8H4bzt:qb7vnZͯa> )ub2CɮC<&w)/^)e<^ ޢG'o#J;PKF˖=0t` nJaL.%52 WZ3s$#;Ub>4kEbv,LkHeD9vEў ,'"Y*o+gZ.~X7,v>se^x]mI0Akх阂MBTXL醙1U ?T#lZp.^9hxMAWnOq`pK.%GsMf\p\t]jBC4%_FZtt &܏qIvc|Hfy[Կyłxaq-\#7tݵ70@}g&M n˵x~w׬Y=-7αku֔)3Z5}a%x¢EgBs:㨖Վq#1mh:w^;^'H͛wpXnMwhݻwҥKIx  }~WN jeO4Pt۷o7t3^۠MA^Ox㵳@iJS@sP07MuygӔO~w*no_ַXxBE'o?; A]X#Wc_ lLXOZ3|E&zɽw|D~嶟?)߹\v~@:~38W>޳*vuԣ, hrjXytQM]Ξ˼YmW"1geȜIzk 4v n:XpKa`q?Qu׀[jXMZ2Ӵ }dgYxY*7?#g+\qiyHrfFR^Kl+ M LLޫCܹp>|)VN7KEt5 ._܀:NWcyqy䢋.2m+k3_aFcci.eKر2[ (&,+Ô(v&.4Oa+ہi l (3aX֥*#F+|Og/*Y&]&^,<:O}e-kL>4.О"Ͼ@GƮJAYQΘ 8vwgvOVXl)z8T;867K&_*)ĩص-<:QC8za-'x ֌aCEOz{X'ذ_:& gǔ?N/{𹰱hR΁g0P5UʫvػK. ld6al#dak';=/;bѼ9Cӻee{0Q)Kf+O1xko;#%y h]Xx-`8m4}R-]V2's8ǐ W\h,8ӧO7->9x->i϶yNTS$F6۶T<}hc!_uW/eR27ּB?g27p^ϴxr&oe>oy '»3~_7 oh1pqGKpb؁ũÛ!ߤp𴴐.hҙs<_]_tptnl;Ҥ##_w'TeHWݶ 5TR;Rz VR-5M00a\UϙbsEGa .O\X'r?_NKiY-M\CD'?re 2q i;H>?6nNv{&dHl+]5k qliz?nо/֊  -rqʕ?i+W./s!ؔM tҎNɱc0WQ6^{meI`]N aw^_Zx,Xe& 9sNҪ}eHgoŮ9zOYx㵣[D}i.#g/XQM)I:;Q^b튍/0 ôbeE?VF+رwѸV>m6ғ ؅UقB2p]p߀xlDqq_8&6;\~:)ߐ9} 72;?<€߄Yiv&9RC[q .w%o)&mhpwкU ~m|Af6GYQׁ4cQX 3.a7 ;vMRXMba;+*|3*.R*>5_̵.7 o|U@crq|;IfNn|^`gpuȋo4Țm̩26{DZ3gGz  gn3P*SL1vmf8'G_|ELϱMK/mjGg}8ŭVt{l{`dlD1@ˣlG3O}GXh6 VnU_ Okk5A hNT~]( Df +π}Īc@ y\r4lϦ' vs\rʎ%x(0nkNaMweSLYi(3 Wq.-\WEyXO ߖE˷i,+ Σu):l:m@Ѐu-ܕ/mO'ŔI Za=č&SpvzsqkjNC$'g_A-|@3vvINi']&m:u )8B&c>%Ͱg̥OMtpt`l$zj3@GC9 (}zJ3u#21rL"hdt-]=y"tg@-3zk:>Чx7C@=q Jk'CIM1ؿobz={xPNwmKHe:Qmex'?Y`"^oe! ^Gd>p@AHѸaSiԑpOY)BS:v4q2LOVяKKѱlz0_eYM]H ?ƃ<.D4czu+yB^+Ӹ.V&) i,zJ:R!/$5َX;\U^#~ TOVpe/l[%[2:Ͷr2ma[{DgN.%NB^m?uvzxދ>{i2rzqiin\L|;>뢮lCB}Q1h_PQU_mADq K_Z`׹hظ`TѫL):cz{1 nDpivXyhWz, - N0kl8q+s L ;0NFnxck|SZڑpS/67bFD'JÞ:T>./&-Utodt:Ei;~@V4|4͓{~JJ:b lg+ 3oaiv=a>d9Xl' kiX}6Myk~kK@MS?e@Ik0CPZj>6m`xk@>b}4+'O/K:%,nܸmtSw(rJ [Dƙ+XzfyGyrc)^S7[1xKlLԾD_-k1!.״0\I Rz ?w5=1m)n8M1]H~ IDAT=&19JFn_H6Y4^mcud: r,yg _Y|i d]åb?fKx#Y5<\'Q.ħǢ5LDdzE/,Ot汮b<֣ӒAbTlj96hF8`@]N4VDZ~tk3LOF/nJ/?/N]X-L|.eO0R4@<6"-;R+_g;e4s$_Gm/lDSnj>l2%Ւ+Iۯ>ͯJ}M wN,s0]%˅g0seʕIc0gn&&G|o$rz$g$]\O]Lz KM / \rI2.SjRb*-,y. !H0//p)O[7E!'۷O=x.jGpDH~*ꫯHJFOݸ2]>E'#1{e:s8emm9׋5x̙#{$L]8cuV2e; go|C.rkg."~6mZ7 CsJո^>r@=4>IPsYp{wֻcͮR}y!4q 8D^G>y_[no~OZկ#.4>?$3Xp_g<ନ?~^D\, E!Xb{キY6g{+6,OEA?,g̝{wYw29''g2oN2)sw%-RŧUFUv?V2b9o qxX㏫SY*TNL(*V`(.Ƚk*r".sgu:ͮ =5O?Yw۶{gScX#7 2?|p[.qғ. 4,BL=ц69qIa:tl%U8Ơ5v5tܹp67ߴ曫 <.n:>C^| 9M3m3]wiEĻwn/ `5*ɤ}A?|eF96 ǓO^G5uw6!X JwhC!CEqMǴ=zod/R:( ΃? 0<^s5ŵKLyqB??RG?䓶⼟:ƵOq㩦_C'Jm 9:rɧԾYyh'UeB3oV#Fzʶ;i>E=qg xIo.c:Ȏk3qUWvKXEM =}gsh6Drq? L/_CcP|XN}zeU< 2,, y4d+ųF*tAGgƺK˓# R 04V@JG#IFNapf0DGCNHS zCNGȠA;O:)12!@W3ٸ&tp:U< oM9ҁ TP桇jԓ!bKP7f\^HQGu[^՞z:^-GꄧNt};A*iy:y)ˣiph38FcړrKe9+ Z|9a-K -@/<vY#;SZ0]\:qe sg`qہP $GG.8AuC~qεT8o {1<` ]xvj.s׹Wvʛj;A:SGqmXzB?cm۶OY@vO^7xڏ6Tmx00Sۺ:@ă,r:@O@>l_.S}=Be^LVpyPi}g8kxp>BCatc=eqӦGnHBI,NcS( Xؔ{<1:Hg% %xM'.?:>PD, 鯈,x@qϫM=ꐇǓ'[fdsCeن~0xV@{d 9}0W8n8{qOrxxG>}Ìe=λGxXksْtCX+k6c `;`LGKʄ?hMu<裭^xf0@1 .>2˭[0aI`4:s\0 :s^3:s zU܍k~#328pZjF?XH ^sCgwmAz:xtgyFzq吏~h:'CpLBM@{D;E/ ^/ JBGuՠ\s\'^W=|*+/mc@[A.#׀ p#P!GA v8L2ޘeF[ʲ eQ.AO T J9SOT抎&IfV='mf-8餓JO~܀)zW#Շ|;4E@:eՁ#A8`'{Û`GyG=lfa!87/O=XDݣSn*ln~0'q]Xߨ΃km:Ӂb_ke~ *TN/z뀢ڙfg팵ԟ~ p2ӧ[N u<9p|X}N }{r7Лw>pCM9kNS]t*l=Dkܳ5M)Q`5w1Dܿx(@>2JIuc1Y Ns=FaMW:U9x鉏E8J 6XIòzv7Os:,~FO\;Ihtxe P i(9=珛W0 :ME:z<=Lw1-t$:Ýqv*spąS4:Q$ 0djO7[*P0 yz^"(A:Db60O'"} @JYx~ӪLL#G!\Ӊ#:75|ɥ2! QH:S'3?),|k4эKMȴ-Җ!AuYu#-aS(pX@2 O<lͽ ``o LBLUu/Eo7P嚲hHY} S4y(e f7xHzaQXwK@ kKG}dKx:n,[#D>@l|SxDeQULm =L;S pǃ}ꋧ{G{86F&Tut -ͅ J2:}|r>1h4D.P ƕ&p D4ݍt7mt&fK @O<$J4“  xA3`!C~d#Ol :}ڒ NA`Qo1'1䳸 S"x<uiO` L>qtpg zZJ萁LtqC ?Oʣect70us#{Qwʧ xvD)3O:02pQ+ Ѓ qSO#h ڬMܨ+4ؚ~:1^؃#za Lm΍[wYTgGO3D0mv$؊8mJ 6 ase&i{g'@J~& =HJ_:@*OlFV'Ջ{%q"י/ӗAϕs܀tS} טWJµu'qMA!y\3^pK='ԙrh#Ui-r髸fAЏ>טA:h}>Fzs3ד8?I<G0[BNp_Iu i9`s TeHȦg)TGlhq@-OkbL%:zkhxl mT'0yl+KϪ n=nZn%;*?(;x|zL"Ay[[[[[`-b=Rx\IBe(UҪ7-T~:4'z x x x x x x & E#v \aaiQ i !?8-------P,`v/qM-4NȹI!VxIPBBAaZΥqӕqoooooooeDťմ(6&eze;P VU<wiy[[[[[[[:Zu$i.8 ҄UܭLqoooooooj?` vAE(AL\^֟{ x x x x x x T-/,, *W< *)t* y{GKҔ'vI(#|e (>-------Y@q]SKSѕOJ1D *D*h|@ܸHK#=( m&] =JqQD$f/\.S-)l$-PฆYҲam]) oooo4,EF“'HQ )إU9nZIS7e25i5s]Q]yXxɒu/$/]M@-_Hӟ+>֥Gҧ3)sE).(~8ӯSYP7i$qA,Ϭxft|kiZ7x첥-----c( 6QNy0✐t]{hRBA"UܥsituSYST,f{쐒< ꫶}Nh/dʔ)RTTT]zT, >^e*5liݺt]_5ADťմ(hSDW+n"aJ[IW^8/J蚺ygN'R >-^ 6Kn!"k׮Rª:.};x-2bFNAeD$dO?-lFkC*mL(*V&JK2|w)T /HʨholҳgO jroUc ,lYb~>=fey/l֩]Gz!ͳlI;o`^DiW @0O @)&qɒ%4<%+r 7ҬDxTYPhYYْYG IDATUu/Xkl Mw}Wր/ P:Ҽ( TvRn]YhJ`%99InӨZǏ{̂K.D4hvT,ӷ?ӧJ{ˌ䝗ɁǞYjD KC"ik4jtIuVQQ/dڴi^{d1vYj ~aÆ<93GAu](~L<ɈT2W&(Xz\r/\,X o@: 9S壏>.̺sss>|?y[oI{d…rŝ⡇*vl6,_䤓N7|S^u[ֳ>kZQ-"3gΔʹ瞛1dA+;}]SyRK.rUW]U.k娣9C ~Yڪvnn5j~)2wqr`f e.=/)vrLNr9Ƞ#(IF^|v/rUȈox~{_OWvrz%#F|%I7m)K堓.667K*s̨ro4c\tn{_Ν;gLߊ evp,91 o ^G.qqf!t譼$ <]+V~=$N {B;v; GB}7t:FD駟nno3Fj!Or<3r?c<|^a xmY@HCu][sho& _%6' @lJHċLu <.xya m;̩[駟Z մiS+& O {" b֡ȼ`Ik^? }[6_|Bו%P~d[Ybf y8&*?b#Qr[ɸ_ Vz8HiqeFTdv2Zv}Yius*rMm7Im%Ƈt(W IrmP>V:%2x)7<7m𜴴BVqJ@U4**ztҎx/;,t;}X/ݰal*^tlR]vlԅ45\coQÃg-mmGwq{6G2[o- /Yge<@[]we70O [nf=;lV#Nqg G.R=-cs8|WM?nމ'ʍ7h}pcM K<.Bڵ}8>Ay o6r\8d{9cPOsKIy⮫y ⅇno$ןy%|?rKYsټo@{E%t7{IɹgA o&9fzM!gS.|%f1cr.ZTm+w^xr2wJ}fyG5WZ>sd16^zTyfrNeVޥGb韼G\Ӹkuoϝ;׶s~''O N  *qq<۷4Q0a}eslrgN ‹k;͋;)Z]0+b๦'>fcU`(&C1m:{Nڴi#vh4>R|שSK .-qҠ *4IGZ*]:c g}fJ>>^> p-*'L Ls*0i٩> $>ǃ=EW4(vL/>5lsX'.oP9 ;ﴝ2Ze 㡇wyǂL sSOY]zme#^%Rc;Z/9kٲdX-2Nje_6k}hP& Sg'ZV;_*a2o]}L0QRP&O[*^w]ud$;7OO5:<*9ud;;m6daM߾n8VZoy4밍CRa_|?M2)ϹʺϟM*{>iB/pԇF9˖N[neb$a\IH-MܽwFۦbs#G#FȆnho%4[OƹA0Wpկ_ߖ'OKc`[oe?-XC>7[xCK |A `-S |hc8z;vLM8'ypӧҡl{}Թmv 8aHk{\TwpCjf[Y;tq#2zȲyӤ~BSLɑMZJmr IA^|+ҡ'q?d}6e5!zL?o)HN3KAՖ{%fȈ7zqg;l2dINv-iya6hɕR*Gg2gD[-/rY@^Yw=hda񣾱}sZ[qpXwY!u 6o#;jav#3TC*T6^:ʣj-c053qia0}RX_Cc&eqPur2)CNƍ[Q@_H]7 AMwBI](DBT8q[Y| <44| )i.xpx; @}Kǫd{t$0kk5z.xq}Ȍl|VTtt<*| tlSd||-)ya!}@f [{mt O{D>OŹI\s@&kG\$9Y,OJ`/0@nyhҬu;vt}8@8.^_)[:[0wy ͑Y&tr;yR6+ P5<6&ן.:7xO1?}-5,m#gnč瘺̗3Y˗#U\vm/! gMœ1jF#7mꀮ[l]P9fU(Aoh% mq}E~ K/AFqc-i'&T\drtXXlc@ G1uJD^懼$[(3 n!MK9xR,eN\LU8qQyn9)4ׄrP`ҧ#Р!J-vHrsMFt<d4o'O,g]OlӫW/),,S\p5fCg1y)d`XGS}&=q~J^~k{O=AʕIO0)7ҹx+pdWF:P0k7_{'XZl%G^xygܭc0w 4vGt|[v9r_\3ƍcx ա cF_t6"]'gL6Zȱ`>8xIRx=r^7o=**^ӬBS64`+Wz/]pnRر<{yr%7;"C/Gv(i԰xأlsIVɖ.=j̙1Mm^ibͯ8dg4(+ˡg.ZcPTC,6{1އ{,/b $'GEa}\`^)e<4B"YD?GT6#痉r]8F(< O!,8(쒒"c0Ntstsw#=급q^g LZ,D8ȝ+2-~O\3,L./ZזNm̓9& ቘ:S'J[h=:늆yҷW@WE-h L٣̏Uڸ_Dsa?H4]~&$ JU=1~ *M<iA:"xIa! kI7 d:Y޲%Aŭ˩ ]YfPPwX, 6/T4(^FRP7kuKUF0ӬnTidp4a}tjMgmW:faR]Y1f:WB:#x@vu8 ӳia4h]x$}:N+,,-J -t4dG3ヷ`:fڒ@: k"f{q7]5@A>/'e|5N^?]~NRF2B_P\b(Zh!xӡ} {h[sΑ}? uCei(g>0A6ʡ)̞mʫ_ϖ+TW_oooooc Ns=FaMW:5&皧ii3 U\]0ZKfʤnYc>>kr.^̧W7̙[o[P!FC?$].ME3]ލ"46"%xj֒3l)[oRW/Z.}3[[Fu喣j˓v'3m%y滏YG3oG,ޚ.GLΒ_,_m۩)$~;foY[Nw;bǦҿ{{Rt=aMw.+(a΂eV~nNر߆D?z x x T Tq9dxIQ %UByk:rylMH|Œ0Y1{Ҿ~&߹㛑lxowq>n+*742dYRxYjSSg%^&8WvV_NۣLٽWC9q;׹]9֜v-Ծ[7 (KO+g?i!`)Kduʃڔ֍seo |/ۥܷv|k}[ENsve⼝7k o}?ǂ:3թgvn/ܜeܰ@ZpKSdeMci|Y`@؏cͷDNvZSv7P4WkaOܒ)V@k9r[Yk_wk }UwԋkAMwBGP(Dₛqx*WVʼœ__&~Onv5Sl:&Q:=vϗÇ7zԩcH IDAT'=-޿SLYXc'nzdԐm@JiztV''6e_߶ fLlYA}h(Ѽ(CuqI#+]̪3)x]UR34^J]G4i"}kJ8qsˏ?h[߬7ow;L:9dڴ |d[־ћn9?MGoooood( 5.uitQ'Vyve#\”4+__#)SX/IL2Yv*|fsyr)WҥmٲyONoƌ2vX3g,=zVS/Cߞn'L4k|(epN搕29y$ VU<ݥ q=yZRG4}ەLzi_voχ f?'֨Qux|"о}{abrq6D5ة̭1+----P]-PQSzeE4i*V&H;>sLh0aa++[ڮ+?\٭O6`;vՓOFaAөS'yeܸqkLϸ'W+2TD+B8a Q2. Ҹy|`T@ S͋wTns+cnߌYn6kca6s׽{wV?\x 9COCg-yg+L"M뵭zq؅<=z *F4eIb*PFwtQ|^d/={/nm/,w}fceB9%| ֗;_&O|OI:o=aUz;,5_ȶ_Ifό0o?)G:J&';GrYXv]39//~ڵkuX,G.q㩪:V^``ϡ 1_mĿ駟}vqGyK.'[46ã7zh;%ۻwo;x֩S[N=yq ,k7D:0ۨuie"ڣ,\R{m|Hl >YJCIA䐾Mﴖx :3gl6swDŽwq~|e /YL_Qa=jP#Uj k=#ơ VsF๫hTU\U8߼d5\d2~xcm38Cz;C/Gp0ߐm֬lVV^׭fv!uHn 'W?9Wwo ovZ_>7_p d ަq`-o1e ]V_K,PT> -msݴ&2FK=|----q q1 hҩbku*Tswvd(X^n~,1I5߆W<]գG .2-ܲT9;Q||Mzne>X0qtRX%8$ߋeӧ h>x_}[{@Jњ$v*T * 湲]:7=v3A͇κ{'^6ۜ4/Yl#2f Yl>!μIz 7)h+-m42_|j@φƷeMSblR'{n%4F9<3Yk(Q3A׵]]"xgM7nÃAc֊----PPq(6b)XS"p|7Dv\khU(o5mn[gbZp"ov b3{1E*rr)lĴa f ] *5w,k[Gn?v]ivn[tM41[jK-QKyq r}$g!R+nDo}7[9i=yv?w#qf^J~4}diZn]~6|mk:jc*3[^r-7/S7)xY?)pk߾t0_\a5x>x x x 4 d(`͋?^i عq`<.+7c|"Yp7Yv+6Y1g1}<3{HclҠa#i62D%ʈKvI[Ɋedy֓d Ȼ2WzW;?Kh4v'v6Z`iͶBܤxJݑ;ڍno]d{ǀ;>7aP)"b-K^|Eՙ[[[[ xLxP; qD`:*M U2W,_&˖.eo+-8N͝ MOPs~#X/KwK3$;7_j5ޔ\V2kTW!L'{:y 3Q6͗ Zԑ~X$[h,^zi vt66mm|Zj%Vgs& V?,Nw4/[[z[ ?W(Z&.I C+aiQ i hd%ʛQ+,D-Z [,+̾`+INd#3o5ސq㍺;\6rrrjoUz>oUXn^zmm[<0{ KD$v:5{Kf:l/ mm;G7J6˯7/~={K*`ZPk{M Dloڗ+UX $fz;XS$VӢ m*(ޒv%M$Lt+xvܵM2^-! J[΃١t߰xCk3nlڳx?DވϏ盽QqƩū6ƻ'XǷsyپ}{+MD8~f|WT6[vsg˝]f̺v6/`83-(@;cI/iU [2 ~ejݫFUUk?ݣ>]USQSeBq@.ned4>-P#,b[f,n"Q̶ovYlР<4 OM+(( K-v=1i{x~{ˑGiz!{r!u}d<#Bo f.O?M{wx~"O>dV?z r͙.c-gN=J֫, @믿_^xA^~eK”r+5Ar_.]Hǎϖ'x&]5θkŠ2A('_.ojSN9ꫯ ;NKf͚%o+"[lq.~:toܹr[醶u6N[3z6 Yy\`׎X9O34 8h+v-}e뭷?e ?u%lKKLR:-e_Z_aB^;uQ~`{*a?3*h|N,YXX3Aie%'LIⱋ*U2Xesoo X>kxg6k=t~?L 6s~<?Ɗt# ,:~Dw0x3"|L4GӦMMǤC>{I ZwDr1`ii_c8f`k.2H%Nj~X?: \#WvF`[[^-8g &--I'zAz iݴf%1u 0KT[P;z9ɷI _}#otfgr L]NL;s]}.HxH" "U`O)vd@\jNL `O,k@ N:jhdC;μN W\!?wH 6z /5߶_̤^c6ÈL*'+ Pdj a6"w-7x}v- dl~'@#N۹tzڴi]o`.ԁs#kve3@iPywux㍅m^&bYDQ.=9ū!x&ubSvڃ{xO 7nS0)'M0|4y)-)zG +ĹK鉏vQrnz i5[ ~ct9tM hLDebdQ{T`Y~ `"_?xHY`*Z)l(~N̖۠㲰BRQ4`=,`Wg}EXvZ"y^fQEԕp ~]Fa>vUv4qpa@M'Mxt417Xlnɹ# :IW=nb&\g LZ,D85o\ 2-~O\s,[S֗NkK6yrIW^}Q? \CLc%PgyaAi/k>N %c8ި<lA lȘ_?2-G5[xYF`k IIy1T|xIYt >x.1Ah$=rĶa:]c G[wm-iȋ q]+R:/Dɣ><(Ц+#.-ѯ-ys]*7?X`dtO9=M'x$(ЋƓȎӽjN 0wRzIuʇ464~r#:I:9)A;S]/a੨h$l߻}3oFdM\ic:*%9qUPGfP7|6U<QhCK9-^8=zuк|OKJ%Ouwә2uF[O{*.) y.ye" x*k޸ ,j񤟟WKXgNG K\tHOUV郊# kJm:%^ %. 4 ع>^5`-{v)*GjJx DZ u2jĕOn$9*)L;WaW[`T8<r *hr ؆ 轾ۢfz~0u89zβ=\pHRSJ?MdoRF9---X++n~!M(Z&.IS0 KR H ]0 Qn>-P#, C]73Ingu=+zm}R ^P DqM-4A[[[[[[[`uZ S\b7NKvNZZ!S.hU<**zt|[[[[[[[:X S\QGӕN--b+---PS,)QSjZKE22[(J+*sy<-------P-PQS:eE4i*V&H@uLh*T"I M V&./HϽ*AqLse+Ђq]:q؅<=z #ߥwiē 2A]xOX,G.qJ'v"Nasta"_a4>[[[[[[[`uZ S\b7NKvNZZ!  G]ʯG7ǽjX3!CgZ-/[[[`M@;,tZg]:MO|*Pswvd(XOX-;/_\-[&z^ފeggKVV{W^kz>oooH (~qqN04BʓQPҲ'#'vt-]T>3>|,^]K#UX----Z@Kqi'v`TƓȎ+y 3f;Vڶmz7Nڴi#:t^Y (u0GQsHcR`)dhn፫P\a[`ӯ ._&k\3-냷@(.Q9q>xի{01fcB Zß!@0w `1lE.eɒ~+e}N:ɲnֿ~twKپn:tXv. aejhYh jl2Zpa~ѿ&E@P&!(`6!+: r r7yA܁ΓB-qZp+^gP:ٗ}7UE@H s4 #O6qxǔ(bA0.#e^U(Dk]P^JM`ٗsc"d2>$6!]US!vLdg>YWz }ZV2 ]nr90t"zBHn҅w:CַxOy̽"wB;.lײ"%rdaU|3e[kL=30wyg&M]k-yJ3/Re!& &-AT')Ӳ"fhvί1Ky87нkwgY4Eg63/rR:;v(j"PRGˊ@#f~f)W_fm`oiȐ! mäy#_Kn?VZkS"g7pH5 ;rIWzRzG@ Pre~-ĉ DwAp@,bWQQA+ 6[=7|H-|Tw00o%xE{KMC੧>|x:P+Euqk|A+C_MJY1BI'nd[sк"D`aU챓9˛?iv94w "zx/ h|m7]^5yF|vfﯢ_ه79i?FPՔ.߰TK5y'5{饗~H *F y箻QR7d/u4|S"Ds~%챓9˛cO>z! asNAD_|iΜ9;w+7L[o5mt6vۍ6`ӟԠ)rGnaU_۸'eIU׮q7^ḶJ܄r 駟ZO?M=u?ѶV[5ŵ93.u}S5S}E `ù< Oנ=k`uIe%sQ"AtN͟?{oCzwiԨQ6ua/b&MC=nV|ͩH{p T[k0F zƌV ?l!NjO~gu+++SO#FXn$>fs=裏2ɓ'>w.^'KGumt]w505k|v5h /o%$ox :֊"2[O~o"Z zM7=#E5:i=.ҡN<я&zReE _a盝SncWacW7N)ov7r,rիaX?#,jtb5 |+:re:>>j˫YTRG%}Ј㯠#u=NgeUݏ?ڶnkAdr''],/^lܷ*DKlj^qb('l8}Gm@Gb<;9gyS&vYg$r Xn駟 {p#9@rܹs#~"^yƌ%:$2eQ>6&,dQqa}m4DFƀ<ې?D| ј0P %QD"MqÒhqqqn, Ӡk6ҋ`9߶X¿ % Xp X8\BCTuU$~C7ĩm,#egF3`D˵a9z%U *!8v.6jBQmAAh!!/+l@dp9ao]!G`?^qsFγ9B` 7v`tg"|MTҚ=:a$2viСC+d2XVAV=p@'񥁗eCxb?!"r\p}1Lhlcz@8ƣ%l@C nHdݲŒ8v=$W<4af5M- Go*gc}DsjJi>^<Ǚ="V2TTuB?7{ʬyw3dX_<>/w%,E-I2!Jzh/6chsJ&Dǰ$MXGiА Dv7觷_?9{}1ODA\@K<o…,E~86Rs$Q1,4rB1 7ct#7*KiBӜd>58cP7m7_hC.Ye kEt)цM V- %iLWv@缕{:S^7o]gXPHTvm<P߾}8Dg勞,Fo*D\ghT'c~M^6's_qDuK-U:Sœ\h%paC(`'yHa :Le`HA*8$e_@Ұ È"*K`Ne"q>D $+u>~*Ďɘ' 9BϕWˊ@!{@8ϲ QC]cYZeE@hw & ^#MH:.qɧ[?b1 Jԓ:Rκ]ˊ@!uE9vy +qKڅ"HBeYtB yKDs2Id$=vYbyFVE#\؅XfM\N&ԧѲ"`VhV:At ^tPGȲj*uBPVOZs[\3mԋyO^m왫=)c=ΣXGsE` Z0%w'ߙ5-IDW"(@?CPe$qud[/G]|E9" Бz,\h"rxL;iR%PyY1xDD6jx%2t52T"(4}vGq1E/^NrbׁFtPCv*W2|$'~7 [MMiGz郮."( =K# Tmq]֡t˨9w۵d ]qį4go8DA`$E@H?.O:?M!K)I[q\iY@ kɟ/@u"pa9WsRʛsx"@t\:-צ2E@PE@P"_$ \b:8Oµg9sROʵ("(@[EKlj{q;DగqMPE@P7' ^֓ءdMsl#ͧ2E@PE@PZG}`R6qrobrH*6>`ZQE@PEqpn :mu}:Dn9FeE@PE@P[8r&Jۖ 1;J]vZBv*WE@PE-!/Kҕ:Qe}P?bdLv擅puw^eE@PE@PV!_k$8 IDAT JCt٦Qˎ>'Y&RZV2qeu⊀">=z8sqI=YFtNsRlRWeE XM?3)"44Tb "i:q\}٦eE@PE@P*e\>mmk|C\G8)s'j]PE@PF?r<_3l}5ع@Qȶ({jyVXAxiRE@X=HvwA8w!{ӨuQ+l/吝6@nns"(Vr!v Q3,d{}:*SV+"hnps@(9,MꐥE\Gݺt uYf{)c897M 9$ aejk0 ("("8 8\emiɺ>N"r@ii#ղ"("(m -ÿP9wimJB@Y#Aөs?+@3]Nj꨺he. ٳ+" d tNTgO1d!\]2jYPR@zY-ԬZZΒܩ:Q4wzTUE@P2 5ۄt|-S!vsȝĎK=#+۵(,_Tm\5u*-=PiI!SM gQA^}2;7&E@PHRf"uYn2mB.ѹ)Lu?-+@!q oLjL9''v.^=RIq!PVV-.(/.eԟgPyE%Y"(MD؅XfM\N&ԧѲ"1`/\RRWg"o%RYV-).++(??*1:y}ҥ?Sn& ׊"(pH5 |N:Г2|"uRLw-XsO8q"}Wi!v3g4Kuԯ_?w#:1{~:wѢEe޽{ 7@G}4uqs^=N7{8G Tmq]֡t˨9w۵R@jɴzth>QV6DdQQa.՚f_]9<֔q`b4cBj^4tVOs}-3uTz?={FĐFDT0i.??&'G駟N'OQ***^S%n5\].:ص %imFud,C׭CRJקtuh,g{e6@h2aoݒeTkg?$QLk.5RVJ}MSI-,tޛȝ7. 2ϗyФh=#>z-_7&28N n&fm/¶|Vwޙ^]KHgQQl&}1>Sg~{9?V[m媷gI=P;]ﶎgkB.O:!rc:c"v}iT2Z"1%˨ ?<<Ē\h-,5̹9kas}+F:Eힹ>7(;}N:9:묳, z*uԉ}3f ;6ю[n͛g "~vmrfmF/='Zh"j555/ڦMf'o{mId؛8j(;;~iҤIt衇ҭJoy`5!: {p܄gANxb=#F>̙c>(]ztqN;4 wswߝ^z%|n;K.-ܒN9唄Mwy9;̇Z￿"$Bu]g_mShӧO}`gtwŲ:R3Η_~I{>X/8B4rH/5—#}ѹKs^{ϥv)knIBeabV. 5kr(m cSzReE]#,3ˤ¹ m7̄)ۇzCDkܸqt9Ae{ DO+Fɇ]pv(}.3cpM:;76ȆN}{oK_4/Q'Π)7@Kl8}Gm@Cğ連/C"A'Siy EyeWmDfrhݵؓ-"5#7;ތQ4h6"9px, GBc"eLV^7ac!"tAY RC KH`=n . QMYg9@ĨozrxEY d Q0D@fϞ-,#oI=|)>1|db 0v"B ҋm& 1H —|V$>Hr|920G4 A'|~ŗkqh5֐nhH~ޢڰg/ۼkRx2&۹ ۨ E^3E!еsrմOJ+6%vc9ֻ٣'_+pCOC4juH )ƹ7Tw!z77=zf{@CF"9}PAXVĘXRܹ]޽5aAoݞR~iذaaYoeQԗes 7),r2.,L !OI`|Tߜq]kR%—  Zp8mvHXJM>@x^d[&xɏzoI{BQW mKYW*}ͱ*ai  aejhY( σvD<)K'Ḅ?D(M)G{FMFp z2 9IA x܆'n I!"eh7a 7a@/&ܠ1<<At@ezr6H"v 7bHM'p%s(0ܐJ P/lW+$ 71/eaˎXi_<8JKi6  b9/2*O\[\o1J5-GiI"ż +Dˋا=VuVD@0lSDK%#4g?AA~?hРFcIX}tqRI;d <@9C20ö> ;H/_(9/>OFrl- -P9jPI>䀬˹u)Pe G, w 201 ӞR0&XF{ӅW4QUn6c}DsjJi>^<, ⥗86jb%}t}͛[f}w>5XLOכ^|?&:SF;oI%8ƌn9D]t|uaǑN:dX|L?{}U>0h]⒒K7=s(;7Dpۆ:K І‡$`__q쥎o և."I2ǀ'|>d12 'ߜ9p-}cEɶAJq@`C)+}$yCkk2/@I&2z #u"貌@X/ed/)C&ɝ0/se T"qL4.?~3'f)v b"{=?u:R6~atC"[b6LYk$6^ h/6,"HD :w :^|) }}~JXRāq0x`LҎPJl+ձw/&}.}d>C*O@Fr.t\O*crq'uueF`hsFԹc}{{I7جXa~Dw܉MݺF/?w@A+YBėp͗ZtT: BX.ƾN\M@A@K!#uYn2mB.ѹ)Lu?-+oNa{ڦ e=4jP)}Q ISdZNVؗIX h.iIB,3&.'ShYP<?)@Xd*S LQ",e\>#,C\Gxpmc']Iq:+ID]yE_\wu("ǁ \FWm }5)!vL:d\H@p '+sȹ =Aڤ#UL46#פ(" (6=FKݐiTC:ШrN@"BB1cH xx1a㜁b҆$ÉHAIPE m*ra/K60݁:txnu7=nv;:ر 뀌 D5DΤ/AM"(MB)\YI=uRJ"vi8֥t9mZV= [ `xRrs:˘1CriRE@h)9q;:,<].4(;'NKLXe0j)@8c`L<<DșȜ:FRsE@DZs9nuU; .;*۸γmo'ZVV9@3r &hiRE@H yeDq8l(;DగqMhuZ*"hnoaa]'-%vQCl2l7FTO_e"z更{wy\G|Eƀe2Kپn:]!9` (P[IhEPCێzks1/^z~D=T[z~oNjD!(<?u1&^t;9,rWˊ"}G~![k{Meee)S~SO5ڪUAE )[8AՙB|d'dRE@H tgھ~a4rH:G̀1>lB$ht;c)SM7D+}W_y!BFn!ewW_}k/i޳6>͟?ߎ&£>J^z)Ao-/4ag}hwL}߈qV.^v=}t3f v<x kFo;z衉М.^nѸYfh?hp&L?蠃hƌVh4ig/'tR_-d4>$8!]US!vLdg>YWz }ZVEIT;L?}6\@<% _~9nzgK. 7^z'L; 4h ]iB,z+)g]ٮeE@PH@qq1?n͒(E]D_uHԅ "F~) 2 <_)/cǎnݺ٥dD&D#v[*,, :uӼyl7!Yg ' _ D|Շ֛o9!b ")4g<{M6ѣGry;묳u DO7`ޣG:sZk-b좮ivȐ! -g&`"uY!~ t'"w\ۦuE@PRF9,e":%UCBțZ26<$ڗaGJ@6pCC Ѭd \\} XF+Æ mF21to[ӟ Uď}G]9c_$'hI\Enm%uXR:/rc˹G]Ӑ "HN2J:]ɨ&.=)u(@,SlXݻ% .(ptM}`K :qܹ3͝;=DX(a{,yGX5|}vؑr55^d a _/;խj#qfD~ӗ_~ii%Q(,"b=UМA=6 $\ IDAT";﫮.Clz$('K](;@TԤ@g$qbtV 7%mq m\Iq:+"QGe8,=zi '`"mva{0 T,X`I6cGiAѬE5 :pݯ Hq}uޝcN65F ~=%lSD9we_[wu40o v{}&9?`C؏K g  ɍ"Or/{Ú206pg\lp}Iȹ-Q>"(/af?.4af5M- GR0ǎԔz}̷y63}CE.ıSBXң\sE %%% iڵkBVSSc#iRh\YC?>P_R'N7"g1~@+De./d%8SBsiơLkڒcj߫D\W϶lN2swUg^\ʖl.X-9ꡗiJlU.^%C吝E@h@JBKp.Cʕ}DC}I8e#?'g^Hx H3 Y/ҤNi%d>}_bl`u2nb{v+"&?צ2E@PE@P"_$ \b:8Oµg9sROʵ("(@[EKlj{q;DగqMhup/M"(ڰy).ev(ಝ˰e{_ԣ|*SZ b:"(@,Z3Q$aX,M覃؅ʰ5VF> Z{ :"(@?CBس{&^t;9,rWˊ"("5pB(ߥM-b#c>w #촔T("(@[B_ 5+u>~*ϱc2&;Bse;d/ղ"(@ !/ҥKnWyrsR ڭڢ,b3mBq[GH>_1O'ȝӜԓ:Rײ"(@]g]b-bZ.(CM{[to]s/ѩ'sK.˲ tl vMdiYPExW4rH'NEbyfNJ{ޖ=c7DYW,E@P@MM M88Btmfj:#PʫSxهi~5j!*&Zsӵ腇ަڐr˸|FYP5عN:Г2x]t/&}BD[~ɀO͙DqWO>.c},jpvY7"(@ !K j!b6&[^x!1͛geXvŒ)7t^t5gqVg]vs9ԩS}&{-%v^B8Ǔ4eFM(m)"(*D3_byϞ=*;[Nwy6]5k >v{҄ hK ,z:wl'Ce-@4~ݎ gS8RmC}#v>" 2Qf;Υml@7N:,;ʰq:&E=!:,TٳL&8!2~(^fZ"N{.-^u떐cVӪEs\ԩhxOKL9krCzBڴF>C7n7 YƔ w><)r "fMP"{$KH'b:<gٸ cUWVB$JKBu1ۘkݔ+kyom@F ll)pYQ3M#bA0.#e^UEZ-N[}j\Yt3f̰'XC{1:5Ҏ5T1tNy-ia9ȯ3TU2~9tNTgO1d!\]2jYPE m裏ڟs'jU~~ 5bt&W)~_Zū6+tU/Fr.t\O*crq'uueE@PҌL`~w giRRE%KxOΒ)1, @7N6!o b|N:IٟE@PZD boxlIEEE ݶg?k׮t;$uq/]sOq饓؅XfM\:ShYPE MFv}ѓi4Ӻ>4e[c.ܶf͹9u'6vՁQm"(@Лs!9e$quWR`Iwpe/>("(@[C yQR7d/u4|S"("({8G͋5hC*nfAYutT("(D)\I#hz:d)t;Q.lϹlӲ"("(mpa9\:c9<gp'z6)q2z:yE@X=z? HYCqm\Y~6ٷԓr-+@;@k(j(g)]e]5)"("D׵a9zr\b;v.Ö}cDU("(@k (߰,C]^&N tABCeFهLB+"("2!m!WYu[ڸmOȲ-qZ~("(@[Cy /T]DyR!v>2y2BNKYN@C`Ŋ;mC"H綏@/HHWD}AT1ٙOrՅ+C!{9U*"(HgvmBR?>]iB,z+)g]ٮeE`#U>u@PLA Mݒc"uY! vrP8ND:I[ۦuE@PE@P"?MS:]Ir&.'6-+"("V`.nn[b:IW}H;6WW@!|E?lsRmm-eeeQYY-_< +"BGkvudI8?)"_Q6w(t5WԕUw**ȮeUaɐ!CK.TSSC .;UUE@P ]Ƽs({:q"vqhJKe9drE@ vE.-)EKVŋnILsssil2bE@P4"syd9ِlLA{b Pqu0ʲKܧ2E #WZՉr 3h p޽;-YD("l\u1<6CRJsuPY:6-+K^WtȧԽچM'0>}Z=>ZQfp^++!>eͤ毫에Il=}^@*@#(߰G,C]^&N tF9CrPQ6*3'S/(;r;h$g͚eTt֍l?u{1 -MWoҤI6ylixGҖ[nI~Jyʔ)SOQeeextРA"QP2GxБ!d- ڧ55$n9jI͠Effc~Q~7i]h޼yguA:2Gwyƍ6b1T6$<@s m֑c{tygO-ZDK.޽{۬lΜ93f}\]SlW+VpC威a'yHa :Le`HA*Jwh1T6'4TWЇ;AuUY4ks#:s5;uTS]I˖.4ǟj]ZFQQg컜ZZQWCs5uuu&[]Dm^*XbƣeZ*!k6M8 4 H&H^sŶ<]/K?+u>~Oj#RM&h*䀫 =W~Br -+}DΧn7|1M//E weUUPݲTWVǙtʡ<+2r Ҏo~fg|*֓ϧ_wJ>v'W^y.{=@z6pCg9=6uFmz2@0<{7jOg.**}~Q MN~?Ћ/h!t_[om/LZ§L#DoL!S/Fr.t\OK|t'ˎK=#+۵r3s|-GhxjnXGc۵i׭C{ڍ=p4piۣϧ>9D}iFЎMM(b06m26’$i̙t-e_ԳgO۸9#t 'Zk⤎YCD H/ !O?aA}gwߥQFoOvK~FY";o>hjDo&9s%هݮj :3rtw[#F?+Os; !@9=%ugksw&=\䨣AKKB._9orzGmt͘1ÊSO%{_anW}?cF=cӵ^˦6O)!H]lnH'<+F;&u6+DvZ:(2;5,3{*iETx-FfNoO_}9}Ӕ_i9lQ\qsr"Z+1 WdMhv!,_xopӼKo>?$,㎳nn @8bmȑ)G"** A4mوhC$DdQ*!"_~wawuYoXb~?#[oE'<KO =,wcP> $cSNa2mF#ꊄ2_DdիX46 'Hu~~F4`_c-A yWZS}.뀿mz5/c =g7@mcytQM\N*ԧѲ"D^Q'*_\NU&€WYF$f-~Fs~Eөn"Z@3BHfOӨhqs17lX 'ldFTvyr+%b[gy%, N ;|# f9WM7c$6AU .$`ҌSؗD }! %uDB d> 6tPKŒ6%W_mf$ueuYǒ \{ ;\+Mg mr/=v@#qtuЇcDZWy}h ˢܜ\77<KbR{2zfѢr]0ѸuKL' IDATI4o'3Z RI"`1G{Nd z^\X˥KxdȖc~|1k&@?XGQC`yE]#p_(k \FWmLR9`!'󵅜}Tܗ@"PЩ̍F2 7#r h {s6kiU͝oq5dl<^aJf $^UU56$$.sy@T(po)OXCd 'x-d.jn;v7gDDPƁ>^,˙$I>`nvI'99eRDe]M)n]D(sBt~q|`޻Q-,⽄ , D;"yXO>Mf7Io=x/#Z%TH8?;H;4H$.l{Gڣ l*waCȵzJDq1<^Nr}|  D,T(fY<?nBȱ_Ēq䛯'R~cHہ 6_ V0l)UҨȇ\c؀-c[RRbVKqz>by ֜! EXs|QQ֖|`i>#JI {L뮻n"I\W[CF:id\bCq`yM-\ˊ@G$ܻϵb9&7nN{jP*+&_[I  첊,Ӛ9Na );/$X\Jl+nINL%α/E08qO>.c]5)TeNGJpKi]Pin+럏V\`~JD,Yn"xD];=Kc u5* ^•{̣RÍ; 9m7NM4$ܣcڰg/ۼkRx;l2l&նrx@mb5`MֳK-&V&Xg`7lد0eWiuΧ.]KivT,9eKhْ [-("H~Ý uَs)c897M倡2lCmr-+&qB|uhNQ9 &>!lYR-NdsAYjS!Tx2uSEsgO˺+q+"$G Qy-;td;dH>Y}K v _'[㴴_ZR9 qxgHť]+~",:? М6?tw5͞=kfyzfݷTY>44)"4 -P9jI>R!vD:SXr?RuP@!Bgv&2sjy2he]:Փ>#2{@rrL[Tڹe氄lg쩃s7}qXs*-*ccǡd?iB(@_,+u>~*Ďɘ' 9BϕWˊ@E+[͟IY]hyԵ[wl)27CrL4d͐+̳/A8,R uUaD?-4ncJ,B"(Q lk$ B;n!t[VGDR^9->* uQCIP@K~n0c#~'4%I+is kg@OX6\X%$)]NտzFV[駟\{GPG24~f8H>͕&8Ix rQ}p_+m4~@7j٨:C^x! 0 r/mOFUM11W]u;/҇ƸE m_|J2bǘc> ژpze/uCRQ9C:ШrN劀">Cz뭷lnfcѩr?9SSE@X-`ùG}.Ra|N[ꫯN! {.=tGҖ[niO?4tЬYoh>}:3sO;'>ChԨQt 7X̙3^{eh뭷X//"fq>N;D/Ns7/=cǎMh-.SN˴Cmm+ w`}w +.O:@HrYF!K)عux,g{eE@h2ؿ;O?dI\`o2ۼnzgK. 7~ Z: ˶HQ ~g?E s<,g=ӭO1OT(@CAp3Gn Jh"K2E]dH W#Dc>Hlvm7=H%'OP~@ׯ bQK@Bs:FϷ$ ?$`O=͟0w޶a 〄 k~ta{gCɇauu5ԱcG-yl͂6h9X%O#9I. -qmxlr6A.\ˊ"4 DpGK ,"!GM SoHˈpfr~ e]儂)6بp \nJ!(e]fP]w]K0HTwnݺٱnv aÆI- AĸXf~-IC,=#re^<7׾{l 0K(kAh(ت$eK`!']Q(@uڦnjQƍH ^ n=謿V=Dp JXA’ !k'p=٠1JhX2dao!A"}!a;$DxY{\h(H 0 a҅h9CmwpV4F"bXcv4(^ނ%bE Ai"e-8ϳ3ݷ{cfΜ3swޙ&I@Xb^mݖ KܱD;x|zeb--I!j (X6,g{YOZK:b4eزo6E@oaIQ'xF:ud7̓聐7Dǰ,従N:ɪ`9˲Gy$͝;4@DE%`o_-*e6pȤ+=4GDp8yaY79 CU¼ {߶fMs=suχ`q<."b@'7H)?Yfdޤqox,C]^&NUt}Ar.9!d2_2,vfثLR>]C;e I^&K ˊ\-qf埮]:D Ѻe7Dd£SR(I}D@'aRAʾ9"Jl-o-A{A yc3nss`,qE{ܹzm5_OVj7g͛:(sWYr|e77M6me8,Idڮ(@BK9resĉ6gG8?7W#.I/DIGiJgGDdaZ.e,jRҀe5l$o; "D ,u):BE@P X.=1Q2<%OԀGTUl( dJ> c2&;Bse;d/ղ"(fnKz戋yD _0mBq[GH>u--ɝ?;.lײ"("( )!H]lnH'.Nmei]PE@Pƈ@mONb"i:ɸMˊ"("4V˸|VԆعqARN&պ"("(ux6pg\&Q9smQR\h^hRE@0HvwA_8w!{SuZl/吝F@ԃl"(zfù<(}2*q]@uԭL:(˾.ٞsC l:"(M :vy 92ڤYJ)Eu:֥㡲9mZVE@C~իWO]7rz6R ѐ]og\uCΠm,K)O}9tZ}=jrU("G{~b-hcfߓJztIuksf/>{dw|rS)0/e tQ3q\bCqGcyM-\ˊ"(iF_=z=Snn.]/++3<3.MDr4foml>%/Q')=b`Q^r6E@PZ"PVVF3f̠>Pnak٫o,^UN+J*Sxi؁GUk/-#ZQJ{&CS㷦fs.I~lcڰg/ۼk^x2&۹ ۨ E^3E@P"P^^n#tj*̧ -5DņoLw^}!@<he},έ&J| 0.,Ce\&NUtAòs9` (PGˊ"(@{VXv6.N;DgΝ;'dZXYZI%enN%42qw(701rcRaΩ_FN=^Gh&eWO v@\I8-mOE@PDU87kÇS>}l3!t}7VUR)X}Zg4K˗,'D86Uje"e%H X [8_rϰ|hKq "D7 ,u)niQPEɱC2CM v#G;yDɓ+VZ '@p{エl2ӟd6m=tM7DO=ٓ9j^{E'x"zt饗.⺢:F`e "vF~칄LRoIq_n͕>Dh#ҕ:Qe}P?bdLv擅puw^eE@P4#;t}vF@tnt衇wMr]]t"X"ײeK۶6lCFc9233mСC?^xz!/.;Î9gz7 xjnX^A:A)b/e4͈]+mBq[GH>u-S!vsȝĎK=#+۵("P'Q%D&L`#l9e/2IHN؃׽{whG٨"yHAO>17mTe`njCmۦ5j=-30/[iYcTXXH}nx]^fN}.@mv![fgayG4шO3*-;-.2oPRGˊ"(i@bABmLƏOÆ EY]dAU蠃뮻>+;:;]pv]֭3Y䱪4j^(7.ݾK9oI>s;\Jٹt؉U**R<>7Ocme?2.mմkC\Gxpmc']Iq:+"(*D3_byN*;O^z_x6]1J IDAT|0`vĈ4}ty%K'6mvcPY"P`"vyρn׉ϡ=~>uqG@239dΣ& qk|A+C_5Jq@>-,4WE@8ReRܰ+vU<9 Nx6סC]hY-c˩} 9l55,mZgSW{~"-+縳 SvvebWi^7WH ]ƼswzQR7d/uT|S"(@= B%U$ <%s6nEEEqU(jAE-Cz1tSDYA3~4V*kԴ{8GdحC'Qwsk]hPp>E7w\{kh]S#9EʨUsYw]d?mz#GOF}oqsL?M!K)I[q\iYh ʡIh*裏W@9srtk62ʩ.ig?%#kM:X u^yx&sREBsq鴔`{_C l>:"&|曄7HrT7\9zcIE:i'.ҡN<я&zReE@P4#]߾}-YreG؟ٮ];{tc"u=(ǥ;v0ʉa/e9NQj"(@vHӄisQz56x%oQ}wmXmr\b5^/Cp<A\mԄ"(@hté5M|E5PG82}t,|KerPQ69E@PE@oBB뷴qdkb'e9[㴴jYPE@PƆ_廴B|d'dRE@PE@hL dtNTgO1d!\]2jYPE@P@ _ x6!]s.Tq۩t$ˤCYWkYP &MRE@ؠ86D%O E,dd:!ۄ.]sS9$eZVl_zE@hԖTb bQD7q9NOeE@PE@Pe\>mm c2&;Bse;d/ղ"l_Mm~3 :vmEvUR?SW_ѪwߢO'\L6OGl5G'(G _3% B;n!t׵xOy̽"wB;.lײ"l;}:}w?hv2 [RTT״f<҅{>}G΋⧞)6>$ֿFYWZ" yJ+/Re!& &uAT')Ӳ"l`R#VA?Jf|E??p-]BūhmYeS!|YPvz]#ixwMK?A]=t⊀"PԖtˌ"rɄ:ZVc~JvBkW̧/>YAmG=(uk*YJ~2I~ʞ~L{ѐ!;kMݯY$/zꩧ跿-H\E@`˸|Fk׆عι:Г2eW$j_D=۴|3+h׎ۚvҜ.]iS3hef4D>,VVV>YYZݩӽK&y׮3V@`6pg\2UIx rQ}p_+yJj6-|!jCE M7U:rX =@ [iOTZoO_|f-h*a# O(_qqU)xTPPPEVʃ>H&MW^y6mz4oZ6zKG<6dE#]Ƽs({:q]\u^AY٩\P ~n`ŗyӳ F U챖1^6wٍDūZ[^xv^-3KH| -Z foĈrc/q7N#؉Ny3>6^,mczQDӫHO<m4`G|lg}:5mX`I'T.… c'L?x7je~x6%dC>}_:<܁:txnu7=nf@wQƲ%T>k?ӕ_| }D uفZ_s)GTIm4dGiir**6pϫ_kg]v^z%ꐷ6{6TQQAdGij.[g _Csl|iM7C=J ޽{^x6wBG%^{-JŶa<jdk&/@jaF; :ԞP?c҂ss,~DW'N4SfICb ΗmIyz٭NN . lϹlӲ"(2{>*g}G&rV u@k/fyɃO\Ծe]9xZl 21()ʊJZayg=C [m0K}`ǂ_eロk/WiCeԩӎ;Hw_VZEy&P)t;_3KiْE4?RQm)+?`K~2wZbns=z5љg]ɓ'ۨt@P?2i~F[\uCøuEB>Lh6UV6ZNEDC0Z ^/iL( W¿]l*;v[lAūVPYꙈT֜Yp޼yt-Fmd  JwWS!H?u]%±cVK{7p+2񫽊b *fa\;p0M,~ZO᧏̌GÇevm7ٳ裏J!;m7|3vO?2?y<3hw#i֬Yt!%W,csS7E]D ~yw3$xW@ڣ"M>(]~儾~{L3A]z뭷}|BTsαB-_:V,q:蠃h=$N/r_WGy$7Y#E ǃ]nFiB\>h^X!A<ui̙vmZffIYsCȝwIRC@-5J2pYTmPZn"t׌?np񥂶92zkv%vE%\H̓~`/'SD_uꪫ,q@T @$0e3\^|Emq%ga0a6HNi)`K/.{pSݓ8n {͚5;5yDz#zc )S_s7 |zwiƌ\"JG k90Ѡ]&HShrH4H,H@@NO;4C\v687"K/I|n!qV>wd?#M6qqS )+p# ?Bq{[lI]v=@:9ꉿu&ܧAHo& G){޽-1²z(38qH>.c]5). WZTiHXY>5*_̲C˹Uǎ;sCŇ_KK =ܱbs)3䫬ܐRZi"lM:u(A@XBbh.ȸK/iڀ3ebG2?#vm㎳s1Ly2[w4\p )$`H7ϪD9B9gb r "pEL`mSsq~e^ych|'2f{۽0Dkr)sg_f .۹ [W"Po>\ԺЛLyȡM$C&&w=nfVw悸DZ͘Irf}ny]EWfŴk7MZ uRrsY&KnqX^̠y9מ4줫YnA+kmٙ-~>=4,qaO$8!*  $SD@.DD9,UbP4#&DEqu]mXr2⎃c2[흑 ۷u؄|A.#4?DQ)m;CE zQG)+Juٗ\(16 8F/8`<γ{BWn?ι֡@K,-֐$4-HS񅍏H~ê,C]^&NUtABCeFهڪLB+@}#P_S(ӛ]4;}^" Ɔ𩍉mq?hFF9-YeeQϿ]h-ʡ5x,2&yr)_BŲ ¯s+…&ӐOHXʠl~ıDu u3!4ѽd ˱XQf<D5Dɻ ˃>t ˂ ̈}6D:8 ,[=I,QFD$qNq ZXJo,ˉM!@T"Y7/-O,}c-"ZXj9_\qW3A@A s)4G8'OgD} w\GJv̥=~E;lsm$"ЁbH>\k;KsJw8;p!NJ(<?IӜ  vU:9[㴴jQh^(VD/bʢKF 2CD/3OiS!{k̒Jsj=ptџ'{ŅQljDD9{r@7n[L;^[&>cDrfZѦ M@ .BytU|B?XObB"X1!&c=6 0 f+C}cܐ8h .)AN>d.x2c=cZ?M( ƈ a&,.Gq6"ALo{Ϗ DQe`0)%`Q\#hSKD~qO:u%fXDz6>\*"s(` {3"XE m t?ezJ[8ǰrK&J3\: ʜ?,u̲2y?s1X^bJi5S ܐ0]ZXVDRn9686Ye;$t-1:Ӣ[oF^W#g%,=~I]q9(rO/?3rZdPY`r:ΉTh~Ѧ;! 7\A8a uDmu#s=R[b֧ҷSSO8{ڙ~ĝ'"E&*NFߒ,l@/}2 chtO d 2AK ( qMBsF%W,JsDDgc1g9v8/qq(-3רs Q:DهCqڤ.]5,7U4  MpD/hCdQ>AK/K /ۚawG,ڐµ-hlr:!u8 _$ܽu*lO>{lSh,"D~⒱P?E"Lq. Dxw&/6)j|A:# - Ǐr/488=q3$q-tH_|I:#EymBq[GH>u-S!vsȝĎK=#+۵4K=,q~1u hݎz,Ϡw>AS>7wmj].]hS4iT65^Ee˞љglpA$B_E\\HA|c~(fͲPLuzD@а%#uYn2mB^.ѹ)Lu?-+=ѥtyU"|T5O!Κv頡3Gjjj:]eoIW7q9W_iYhvxXz:v,(Mu |Bŋ4oo:?iI[s=:oE`.ܶZ9Zb:Cn;@OX6\h6` q~[gn.m,D%gQV: zMs۷~{Kg>&dٜ6:QE@H/!Q|m2ϸ:hseF)`!'Կ IDAT}Tܗ技" ֘;ÆzmPݩW_Cf_EspԱg~ːM.Di6}kRE@Qm{8w!{S=:_/`{,T(@rf/X[Ƕ2*]UL恣kcZdYPWfs<<@IT!+N<Ԥ(@0\rYN-Sѷ!vF;[O-&m׺",)%w"8,PpX:uQtGeU(@u\ua&u됥EpKGCe8s.۴4k!5(1&E#ysWҴ[6^,mczQL] ޾CyF!Wet7^U>V=Q4!E:ir]7xWTy=1&zReE@Pb#K2`EEws-WK~ Yc}}لmz #YV'|b5'^x8ݫy*ӕ_8NSK('l8}Gm"D"QfQ]S芳w&@kgMҲ%hRV~}|`O?Mg*? 2U`{.=CM_t/MŜ70?ܥkr.#v(A\-ƈjLP/y%Yw`6Y1b7_~J/=~؅?}7|sOcٳg[̙3#nn;x_,ExY/mw}ݗ>**7|3?>*m\uT36zhz飏>", ahwы/HX]s{7|A<{tkX0tP:Gv!@ZA:A'L`V0G̣Ē{r-;5jK4f;̻K3f̠g}.Cr&Xr CBT>˄cr #0x-w}ux01E¾oy޼y‰9oFX$q~a^zOefQ~L6 "y4H98`2w`=[nCn Y\B\r@iiÓ\h4 kqJ "]gQ,swo7oK_/LŶ}%;7ybw1*"v Q獴4ֲĵ> d݇tNTgԯT LƤOrՅ+C!{9E@H ,dePa~l?Xgt{:wg/WD=@$+V$ڰ Q,u!a)n.Q:|z}WX'D8"JᒑAC\XD u?r?La.}4}tkS|ؿhoX#_x$˵ > s=?TH-5<_x6!]OmTSIY 92'r֕ZVE e6n[L;1F 1MVmLׯlS^~Jq{*{EQD%Clm /={+@B ` Y}elHҖ[ni "#@`=XKv@A* _&,b'L b|馛,@.bK0@mROH0q@f?ǒ3XHx Uڵ́hA"y D/RsD!ưӧ՗aKÇܷIVч믏T?묳,qyGVް>BcW\+uئ~a'E,dd:!ۄ\BXe7G2nbIQ$ʾڸ=Wy4}B){?n} AJW0]ZXVDRn96 "#NةN e[y?ݺo>z㋈p\P;JCg#cF2DhC.;A8ApB w',?Q>ƍ|rD zr%Cع투7{#tJ#QzQm #xI[~?t}A܀^(QH1qo6D5/ͧ|p {(Gv m q܎2d'("A} Ď6WƺȣڤE@"n}X;]#*Db\zJ X"L.ە$Gȟ(k[\.ss;hlݴx$u7GQljI֖xI{9G)Oq ُ[#WOU`.ܶ*Z s ru'eyTh(@$ ؗ:"$>.^N٩q"pxn.b-z!Y7_3\YC0t|m!ga"(FD dQ;MMDLS6L/ 1u%^NrbׁjtPCv*WE (qK;ڡ"TEyrU5اo{Hncݲo|ܧ2E@PE@Ppst:d)t;4pPY:6-+"("py 9qŭ" 2eml_E7.0Tm}$("(@=#(<?pu\&^t;9,rWˊ"(Xp@7p-_<'|>H6M>Pla-2TUDyR!v>2y2BNKYN@C 9 wygjh}3rP0WV< 28q"\2^xH4Jl*WO^ެ6i#ϓԉ*;&c3,䀫 =WCr\-+ Al|AbvQ~?m5O׿3lh7tF@C3&+uM<bW8 dԓ]I9v-+ @ |.ŁlBᄈS9zg0뮻oA>(]~tEoOiСC魷޲ͣN8>>*}K nfc=C,/~GO?tb @j}ل+Q¬Y6;:蠃;E Q6wT\\l}6lh/}]pTQQP )Y`aIq1%`{=(y~'{^1c~q{cy_=vn8J;GD.9{-um,E啈 &CgvYgЉ:~a:-f8W8vm u Mݒܜeu˲-R3Dnۻu۴(@,/Op07^5kl_?#M6]vمVXA=M2yK p?iҤI֮e˖tevÇz(ą'tR/8 ꫓\zԶm[zL裰N;?O+{%,7=Gې-Zdz뭷ZRSII hvO=W^^zYR @@t'H;:.8;w>}XG] 0ꪫ覛nK.[n7O?#["@8GE cƌ3gδݪUhɒ%&t4c {chM6$$6 8ؾ7x`z7-㏭<< =H4}ᇔ{Κ?5F$.D$9su|qeE@gMSNk+իW.>^{ݗ%6ЗBD@}Bܺukѣ%Cpmڴ~+}!6,DA8l͗$}g4g޽;ݻjii%c$eҥJ C )//v[:>#cݥAoCF&D^uI~G9999q> :~uԉڵkg}r6שּׁ,:sϐ!|8 w 1~!k.]9 q7">nYr]VVF| uQ sr#^ ;;ΣO?gI-@F0f˸|V+xja:IW}HNTuE@P`)H,!!G_h^:+lk-푃 I[\ A,ʱ}66hG]MKbyDcw!'Ǐ ,r wytG >" 3H~%e˖|uS-8 +;1e ˽X\D@dAzkE$ ѯ Q|.1Q?"0wa D@doKb\l3ƏD4+'&xG> .SH>͕>S*lj؅Nʶ({uE@PAŋE 7|p!M’\(! KOQ}\!JGBvZ2'uo ~a;`{))I sCc{yk`\=p@ٝ-Lb|C=.q?l!|A`92}: }a~/_ Qw *Q:D0'%,ucL,c)q M=Cpܹv~>|Er- v%>?S|B$492 p Bxo6v`⸡l@ C87/N_19(8>|L|6,{>rq-HQS,3\rYN6wOWg˹ !grmȥ2nβ-f_w8iR>w !7$4C&LzQԿ[勮]G: "k!ZKL ,!E/Dp+n.3_&܈5n`kkHDCQs="7n܁- %cUAAA5%4EXͱOPaNXw f[f,˥vq.bG&7D6k4]f>x$n-uC~Q2GQBM6}p9Lnp 9s.۴(@Zj۩$H=d)D$'塋5Ħd}H9Hƌ{\BXM7>B/1፽#GKxn>@tO&\Cڥ:ЇSyxsREBsq鴔`{_E@P̈!n:3n3a"y[fN8.ҡN<я&zReE@P :F@tiAKlj3y\(a/e9NQj"("(oOa]'-%vQCl2l7FTO_e"(">" 2eml_E7.0Tm}$("(@=#(<?pu\&^t;9,rWˊ"("46pB(ߥM-b#c>w #촔T("(@cB_ 5+u>~*Ďɘ' 9BϕWˊ"("4!_k$ JCt٦Z fH|NLɮueGOG"(@%O M/Re!I*;v#u6+ @:^Aՠx-^SSvV4]<2+x][ScR?bB$M3W7q9/۴4`ԁh[uk ɦ1MwZ@=Tp͙gtE.--aN6fzf.ܶՆع0ƃ:Г2/E@P21c|r 휕]ǣjūiEIEW~xT2DmB=4N9~knRRwA]n^T+!vqzKe9drE@PzBF***hժUTYO99+VТEW^>7m4i1>(׏jj}DUSހ+K2yתm**WWТ ZRC82_OyI=UDOE!vUF T܁:xn%sQ"(@:5~…tYgk׮6ʇ6|`g}j3d߿?=i޼yԩS'>jƵmzee%^ dGT[J*KsҳBLf~E&J Zd̜tьDs.Y煺cy켮gi)96)";DYdOwޡK/4Ap:vH{vmn%gΜi ;Ѝ7h YsΡb{30~ -_;0W\q\y֍#8&Md~\@ӧOAyg '> eĉtwX*ǻ7}]+>c D L0ΟgG={$mVj~칄LRoIq_n>Dib"y[fB_Tt\:k+۸γnۯ5SkYPE &:ف[Ԯ];ZxqimV`zi„ z۽i h#GwߝƌcelM233>/2-[=\ S'x ロ>5j)--?P yK(?Ґ!C¸O>iq~'K Md?,Cܴ!0 f9Q'd+)%v-G {.qvҺ"(@q#N#i zn.6l1ª /إ7xZnM|r{vUwӀhΜ9Ҕ)ShW_QmҥtꩧZ@)ݻw1+оKZDѣms~mܲeK| $}5e~U?VZVnح;aN@J׆>{-%v^B8Ǔ4eFM(m)",ł؁,BqٳiM6a1}l@B ˵ wCC = Xسe]DڦbH`T? Q6$<}/F&ylD >\bz.9Ĵzm+ 9O: #v>" c2Qf;Υml_E7N:,;ʰq("@~@RBDKb=v/ݱXjꪫ$ڙuF;:MayKݻۻpdHB D0bn8蠃9l[HԩSoFUD.Æl Po]}r*~$}Tr)eac'Vѫ\K%k6~9 !g^E-̏V+he_5G#= pW4ϳ馛 vn>e98#QAelr-&ۆvH6rU  =WO)"\pAb& $Y 4ݺuKī'!v&DI' S2Z'SOˊ"(uXb:th#ruv;oKIy+ϟG>y;o6\<.2or2>zG{Ѥ4ps<|M}_݁: es4kUPE@PG)\F]YJ)]N: ܺt4T=Mˊ"("4\uCsq,؅9}r_kS"("(/i?.cS'ڳmr 'ZVE@PE"%=eĎr"jpvYwԸڦ("(@c@@_׆l/Iq]TGP2&۹ [W"("(H~> uYf{)c89WM 9$ aej2 ("("P8 8\emiɺ>N"r@ii#ղ"("( -ÿP9wimKȘO.;-e!;+"("И#} J> c2&;Bse;d/ղ"("( @mBR?>]B,z+)g]ٮeE@PE@P SB>0, HݐNRy];9(t'"wۤ-RmӺ"("().D$9su|qeE@PE@h0q wV s㤫>̝LTuE@PE@P|m2ϸ:MUrb:E9"ۢ"("((6=󈲗!{SuZl/吝E@PE@`ùٺ{2Dn9ҦT("(@By .T\DyR!v>2y2BNKYN劀"("4&|2H_CR'B옌|.\q("(@C /Fr9Omjt$ˤJYWkYPE@PB@_.B6R7T'DnۗubgؓZwSm,< رcT("( ?5h:]IV&.'˶X姞zJKK8 %<ź=zoH)"(pHj!v#<8䶱8jcȼC4jԨH4u]uoMQE@PE@Be$quWRbC/E@PE@Vf\H?';k)ULԳ5ԝv9`KIjvU:J]Ƽsw({:q]\u^AY٩\PE@P*ЕӤ̢@c;:(lZ]IS>Y=脱PنUeUp.9,'dحC'Qwsk]PE@P u ~ZBM&ȥEvܼ,4D0̖9Խw6z( %>9OЩW K7sy 9rleuRJ;R*K!pPY6-+"(@3C7-=~ e?y_*hYH%++hrWZ*YQI+ʨdU%QIm S=Icry 9ʬ.uEB$(>XזvNhRE@Pƅ@YY=|;Yц Gy9T"WJ*+!$[Ikˈrsi۝豛?<,-y\b:(;ڳmr 'uR |4)"(@AQY_ٟͧvm[Qey6UeЗ_~Em=7޲ ~5%kM{6efRV-i6ٟ.Pv>Dq+K>;vP֣l8}q\|׎E@PneNԹKG*(7wJC-YFEt }vt=Wl"vQEy,*4duх>ys6ܴ3\ߠ(6,6o9.!8v.6jBQm뇯]vaYRC+q?Jkj("4VSe!r9&"GN׵ѭkYĵvܹt}WfSyW\CZPi완@|EFevKپn:tXv. aej$-/[,x :&aIle `T_9E@PU޺j۶5QV~!fYTipO2*(;7*hS(7'$s-Ϥu$jױ=q.6mGБ!dZO:̯5$n9^\={챶ϘɻxƜs={sFgiz9L'_۱&{n|z>Jls~k̵Fzq?9#'kuٟR6hZVTFOҏiz'o~nnniz=_o1߱3>ǯon3^|nd߃779s7.od&39"Z.sjnռ7҉VhZVTK{ǧ?|/~duv?Gɛ~>jO^pG?}.?u&^&3\g[Q7fD^[ՀݪyD@+ ]?#Lg?L}9G_Nǿv4tsc77ͷOw>ﯻZ]hghG>r.p)%Gq?"ߊ+_ʭvUޒ@+ cۿ[7|?=+i7κþ5wbo~czMwNڿM_'|f?ۢ}6/c8a67߈ݣhZVh ]x`zꩧ0瞛/xzOMߘ~o?xeַ5ӓx|k꨿>XOEnMǍq1wMYr5hZVm?>=+K/M翚~OoͿ?8}#~7??=ӣ>:t}vSsbsbgjFWsX_kZVhZ{L?Ӎ7v??GC(l˹Ú 'L kš\""~+ @+ Ь̿rXwA&g˶ήعM-N}GkvhZVhQ.rkFҿ_PN5h1OrVhZVh]_~9Y(/F}#fk:ц#\'6A+ @+ Z~21f`HIDATч+:mg[oVll͸ uScym[VhZVxG_>ӗ%˽ 1VvF'MyObͻ͙剹\''@+ @+p TMp"ݨ?= G_:}l3G"I#d&qcص@+ @+ r^xKO.6G )чyli\nĸ7Y"FM|bVhZVhU5q#cԧ%;}hc>snrGMGߣhZVhZkUj'u/60qK>DZFI(+Pks/Ea~W_ףhZVhZw]{Mȉ>weF^\XCu"'}~Q_a^ӂw͓Olټ9]^uDG9u4vn 7D!0Q9~lk3%&8> j*7#cF:,/2%3G:?V`?s;V`tNFq{x '6>4Z?)#ʏs݈wmhsHؒɃMam4Z 6]%AKtibۚ5kX9kYm믟fr~ՙ(qߟ?ՙ汑3֜\y>mDbqn2Ζg;'\pbҨezfxA(焯4yl]sv뉭cF̻g? &߱>}~w2bFÙsЂO 31r1?>[zXO޾k?ȡZ1g8viOb},>%#qq--bѾ.E$WԳUG׷~}~z{?Z wߟ|MM6b-Yy|.#f[~~~+Q}bwDktlF<53瘃!k 6=pq}\|r ytj4O%64e~*q#".S:|٭JHG31fca-C5ZvjP\{u5vNxiMcFk.(\Vq.|:eC_8#ӜuE;֩Ϣ@ߟsL w%Z|g'IZkk#p%+̗{ҞEF uc1(6zbK Ϙ\`<6`c9bVVQbQ#b1CeD@Z>? B%5sޟk{b15mc6NɌ_]#1{ΌX&ҧAb`ǟy^99|c̘ϱ<ӲVgh<1#[0D'>wt}[spC F A#1sXlc^5ȹ9ο19N8lEMY4i`r%0Ktha#W^e5Wl+n:[a򳭸+n϶VX3&?ۊ[aθVl+n:[a򳭸+n϶VX3&?ۊ[aθVl+n:[a򳭸+n϶VX3&?ۊ[aθVl+n:[a򳭸+n϶VX3&?[jC]+^sڼq7 Xƙpmu p0֚PqrNYuFk֯C3ϝw |cȍzfXz8W.׫4vnV6X57.|k1C&Gð~_1zqrβYuFk֯C3ϝq|09|U,fz1qE\7}bF/ȉDx6FhӇ> Ѥ.r2׵6 jrhŲETɹ-q׷~}~ܔOߟnlA{f`}f,aɳуc̼Ǽ;Wڿۏ-Kł c|7}l_oy#f vv:\F9y99ؕ dlpa}4Isnţ}A'd_]w5v0ViiZsk>I}~ɷb{|'q|_3꓋ Y̋p3;ōs[ӣhZVhnb;5>9GPOOE93 9'Ǝ m*c$I0# džǽhbˉ63e?ĵSjS&kNtd>?}~];8;= qȉkŢsThkcSݞxa/ gX[И/I99$ok=YxVhZVGŲspد`3x1]/Z3gرXn~ĢeCWb2c>px7Z1!Q9-?gt}s8'3?hF^Cb Џk/9y|<2kcL%̖ D.8 `F}8<s<@+ @+pw({Qƈ>ϸ6sșKEn =u{n_&Ir4Do26l 6{r`#8bs5Zn5rߢFk֯C3>?x&YķQ9 \#bF/Zٯxru5v{FDžhx6P*3FaΆX,Zjzw_`pGV܊_u.b}~l=+O\lnþӅ{<5 bYqJƎM5=kT&F>s8'&'GlA |q[oOu.b}~l=+n=?ʊu>[5nrQ1-L8q8wĆƎIcc-ٲ < Z ϵ&tUN Kś'b*Lghߑ Xһps5Z4Z˵~ \>?}~=vd?q|Xqn17)"zu1?˞jX'E83‰5E@>mOu$lF85qx#Z?x2XoڜD 2X ]&||/։z}ȑ؎p"z}R9ȉ~׷~< rO>}~.+5~ߟ??}~T7cvͨona,b#\Zy16⑯m#b[g^OHV)69ofc.q}ryS#]n6Oߟ?Jź7ܘg^Xo38d(x׬96ooF\~r#(y#[>?q{2bY?3OhYs`=XȞs*.|Yиԯ}\<-FG9~zoհkFwsϖRs#"ly;gXbZpG#@8Fxk]H~\=:w˺tiGnviGnviGnviGnviGnviGnviGnviGnviGnviG2ǹѺ@+ 9[a4ORV49[\Biy:]_Mα_w{Ϗ|Z(7<[yo”&pʼnKo3oZVhZ{Os-\qߕVtNu7u[qw}V伸;On"ŭyzev9/n+C?zsN9>7Wm6/Bٵo~ekjZVhZ{\mnJߎ+E@+ @+p+4p#U&nxO@+ @+*p[5j[ZVhZVhZVhZVhZVhZVhZVhZVhZVhZWDIENDB`davmail-6.3.0/src/site/resources/images/osx/osx-caldav-account-create-caldav-settings.png0100644 0000000 0000000 00000332120 12564151555 030251 0ustar000000000 0000000 PNG  IHDRtt^ iCCPICC ProfileH Wy\S>,]oad **ԅ!wki."T j H]QV^E ZTZ\pC ^{w93s ;QPp=bJΝåPAM ,USRW#/ZhER!Db < vU L (@$.$űd3 @)( Xs˄H(KRqcl2V"#1F! OɗF!s+$Yc62i1eiQ_R! yRgRJL5hr%DмiNՑR B2CEmp5ob! *zR(@2 (U~U[R)XZD6\IA$Z ! łB FQ:oE=5ȏDR'ԌV,(Ql>ەmȦ-h##D+#1Bch:yyxyOx;T9hD(ʕG*17N.0 { )fBy;rPE&^qh]mhsezE w_0sŪ5X k¾a'X7 և `ϱw83qCw'8Ox> +Zߋ'sU@Ƅ ND2CJbQE D3Nt^ Bp(\;XJEHEY@YN4RZ(()}AG*jAuRSJj u' 4*FҲiʹ}n=N7уt]Eo_hhYkyjEkhɵhh:uIְvvH\{v }#(d,f2=:::::St:tju9ӧiteF01]_/X,#+RVX'YwXov[^Ȯg/j:ugVнDO[Q/BO@^u!}~~rg  DK 4!8v)g4ߐfdgXhXmyA##oL9FFGz cG8cJ׌ߙXM&LM.6gf*62gz,ʬlYms[O?g8.hp\ոnZs-[tY YZYX*,7Z|belfUhՀ5:Zj#ϕqk666jm6mml3lmǰ˷[ga7homd?~MmN׎NY;:>t2uspru|ŅR+*qwI6u/0;ӝ^ǽo K&Nx:~b;'~d[K<={z ==xzy=v{oIܧ烯ҷw/ouCg  T#=(hwINēvLl, *7&Tz7.L3߅_ W 1?x$Yy> *#.NmtA1c cY ǟJ`&%%MtMT&'IIkz&;LOnMɷSRf06%eJR;8i3vJO_~+9Cё9-)uVd֚ީΟz.<[ݖCٙ3I'?3rڵNL?;|lƑ33Rsrw$ Cyqy Ǣ0:р8XF ?8MÂPI4BZ'}V[uQrѮYl_Vqn!H~ĪdNIMQ8kAerg)V:Me6]jgg꾲73g?G>ܵ|Y芯R v̳x^|m y :-\Q̢ŌE^[fO>m_jt{|]y[|!2e}UTͫ~\/=rdE+}WnYE[%_umu5k*[ew]պg?[]uczCombmF6]߷bӲM76_yメ~uc[̶džeM;wVK1T_Sn+{{N{oښݛ3W-|w]۟tsk)oleu?~ ?:lsёGG9Vql'uur+::<]y-.] =K'.G^JܕsW'_qi{onyً]/_v yUju7ovz`x{.?&|)Q^@OpjF-),,|/O Ęhkrgd#}-U## ##Nqy@1_Z%Lm%iTXtXML:com.adobe.xmp 782 628 $@IDATxgY}3d̤IJB3@0\a&(VsTV*,"6vYi. ,H H -I2a&Le9Y_|hnojVVVVVVVV{D*4] :Q~p_m|~&?ǶZrHNZZZZZZZZ L?X͉js@ay"KNƣӫjjjjjjjj L`>tƒjMD77y OtWnG3LkjjjjjjjP>,|,k,9F{s4(Z/^ <|Vy@@@@@@@W{^&L٫s}O~:SMݫe'oSq@@@@@@@U`t۹dg9 y+V?Rdw4dW\+P+P+P+P+P+P+P+pUALGٓt,ڎcg;Vdz(T?EʻmFÓ_  L`ݵ鶻g饯 <)Xlk[l|3_qZZZZZZZZֽx ]ݬ__lum+u Q?wl ׫+Oynxt~kjjjjjjj}+ﰝ:V'u'n8泗^tQ]lg]exY_^毗mimn=y~<@/.Qvps<:ʕt^~~Kw221Lj-wӵ.mӏˣX۬e]zU\+P+P+P+P+P+P+P+pUA:2m'-d>m1o 'μFaO/O yo;uiKSiq/^gtW\+P+P+P+P+P+P+P+TA]zb^<K?v?=O?vҽڽxAX ^?X? t3r;쫗 |e_P>]?Ǎqv{/@wۆ2u&6c`O7ZYwiuv+/O:f^NFJ <u&Gg=u\>^^^ɔ7CrLxƅ=,KR/]hmdY. g^6<\sꪗyBʴg=y k֬mk900 CUmnk]/`pWv69SL{7i|tcɳ\˯<`y.z8˥Y&}6]:Jc h߶~"n}Kjcհujk gӋ]=]\d  o-襗8^ -d^g;֧_M;~yhVܫzYG?x uOӭ5;~ 6ۗ,]gpUWR֔ kv/YIv#`F8v/1({wy݋7F/Rop__=C.޵kqcCN 8lK'v]čr#4xM[^?|iWXƟ !w^>dvby8]>Yۿ'oݭWi5M x\/, ty[V{6yP=Qip]TΉ |v냶4Xч, (7NOOM7n?^Λ7#bإVc?Z;˺tv?1adS}eau:_Y'ٜ]hO;qY기\0mkd5n?@1f:-KK92uh+g|G\Rz:r+Wlzxuuls|i0?l 3Q/_uF[:wmzen|;'n\}GSu*,c[s3?ԁԣ\#O,^]Tsztz6Mח2iry~Yz{hi|c"d ` ítDuey_zj_YO`t/e9t>+8l@ nA:a@dڃe]x@?vW7~˧q! _>yqe(g}tz]?='du1Yy^>SzhI@,P)؍Y^NoϹȳo 2|hȍv d6yQ[n|cd?땫5 n_c~ t

k͡[d~]WO<\ug~1w?XG5Wu'[?r>Lp {zwgġ:[_00͕zxsy367z}GPWS2}цg0Ӧ^Cb/tr ^/_Ӿtui+>2#c m}8f=ǜl;o^u[KX>84Ƶrp'<(.?۠~/=}ѕF?? "ϐcI[ C'KO66uٓ[z"Um{n/S_,?".fc5ɵd4Ql@wCSAܶl!FW֥m\3`mJ֕CX =~Mm$G4'@MBƢ#1q|ȴ:hӛҽ!8aqȤo۱yx ^[MCrd˗/믿>o5rȚ/~(vx/_G=%1}b vXcL\27᡻MGx0Ɣ^_O].bX>7сW[mIѾ|lc6pCFʎ~+go`eXLȶٯ4z.x˶a#Xuh[Slu߼=n>zGS1NJ|,f S4> XheC(oW~3oMb~㭼3##/8.;jvA1;g?1?2{Ftnγwd/3Fcоk]e~??~9d>T?q\\F#cg_)^,_uG:Z30qrۚw~iiyA( \t(]soW[it3N֟~}M&IO.dZ2S_Z=sg&sC;NMp~4.0pmx6l{lb}w~5^cYg Ŷ%WƞƂ3й;_nxt?;$ƛ8J, CжiC#{|gy ڢ9|_xҹ9Gm [l ^X9?_;|mn,hWsM]du8tJ qdt⺫%VmY+MiӖF!luncT?eʖ_U{cbnb}.xL r~X\uoZV1c, <.x1ϴ:gߴ?2\I^VZ~B卅'ls qT~ Y֗W`Am#gq@l.tQ8cbxԶ4,;v42t /l6d<891oΌص䮘2>޹=voZyM.͋k"+v2m+scU [h5ۨ+c\yG7zm6Of]:ȴ':2xΝMȹht-1=}@gy櫇;1.:'|(yer4όV|`ƿ{˝q~*v|=q͒7Ö~ͱE8kx[U$Vz/هN?}{cO G;qeǮ;q9K7_hn\W_~g*6%sxGƶ>ѕe"szU^smϊƥ~]G.n#/xM><[;x߇0,oO['7> xbw=UK/KoǯcQJ|[/i{d oc7_XY~KM}oǙ5Cz;m/=k3]C`7ѮSgwl]7 < MuL ^{3jit+dczdNBvٞ0ngP/t֗670m/.mAJy2Ysë| ō.2.h:޺qI1+bjl)7ĔkZ> mKkW\eIJ ֏sS.%/m@_`/.4<2'K~+_;|3|.sߍ+:bl `/mh.s6m3L^C?hvCcac=_j1Py)H36[Oqſz_ba#`Sxb 1Xxcvsx|]WO%6V4r~K|>ug?7ǍGXxeoxv/~WĕW6<7}KqOZ?yUq1bp/7WOx_\#z~g1şO~w{7[ƮiĖU[y9T?O>w낑4=ڻώw|C#^qQtǘ9_iy=rX'0W3C~]b}gcS`/mh.s6m3m|x<X訫oyX'o֢w =Zfx^j[ .4._n7 NAÜ|Q-Ok!їw}x,l..o:fjU1cF1le34ysbY oj6:KO6"^'?ϼ͙63m?xj6'zjOK] g_1϶WAF7_miN]c-F7.m.32|I<;19$GW0{yph/Gl+Oû~8e ƶScẘ.:/.ryWN兦rZ}H^==.}sbpx#'7س3//B]7xS\rEqeǚEJ Gwi:%?XcҗW>37N}9qi@IZwo+>y8&Nܺ!^~ֻ⟮^SNCgG͙Sta4wJlmxw'\]8Tྛ-8'??~\X M)'"w{}>?N?b8s㨢g,Yd){,'1x5Ah.5Et<9ue!_07aƦE[n%O]\g~PK=<;19$GWżi{>;+C|"uhGҦ>#c ݑE7g?4V㑫14W{xtQ-28lBL8%'o)Q*\+,j?m|qaw=kbCbk!?Yޣ65w 0ȅö98M~ٸ?!9/|8(C\;}x/my/htpf_Տ/Va ackmtu$/]#,8u7f6\ꢞߎg74u~־kSywמQ)6n)6c[+=eoݶ,n]_;5x.ߙg<Pع]e'##gĆ[iqGbKgwM3Ay`f߼=:1 L+9l-[9Z޵(m.L;nHkۯBYe*8쌅eF&Ymc%g`%ymL;GbMX~xdZjWs>9H=ٛʳDw m/qO=xxƦ۩oݳ;okczo+y{~g|[w=Op|Z4OW׋EooԚQ+y_ sH=ҽ .x]ht?n͵crQ;YWuv?y_>ƿE; >n7dž GF߶P.V/Ox4d%\mhfR'94򨣎j>T<<(o s1@xQ^quM0Vdg/7)j8 |\(n'? K.˹~5 f,gڀѧƏї9Ə<<`>`KmyqcO?XEӇ]Gb;?1o=ZʃA 1|kϙ37.dP}Mݻ77>wi.(V9ԳqO%eĶ8%yV_f} DS'{΍qL|ꚻc ;)˃ReXfgrL7˯$}o`-81w7K{[Ѓ>L9*~=oo~?.ߡm?Eܶ#7?M g Iu`elD m}iobc1-Fɱ^.9ۛgfmo(@92.uݐхqG[>t2KGgƄ$x(!/e\߮e۱;Xxoo]Ozz\V_}Yl|dMzMr8<ܭ;/Y?tEV^~q͞{ߍowK2GK8//}SP}J}.tmrKyKiySoОi Lڔ޵':A[g cߎ5['t _\< J4{a\%(ϟc`Eg錡%  \УO9</9hb!ӗigr\.|g?ٯ:7mhw$O`sg`ԘR^oơlWKO+ ͜,^̧'k^rJ7w=>gowf"N_4_nM9U&|yQM)31+v wo{eyqJ$~x~=W@߼|\xYifΒqOuqų_˻_l;_gn;>~/x;Stގ_Q\K[-vu}]ϝ;l)G_?}>t޸oKnbny7azZVpVO~Ώ_ߊշs??8Uۯofy/L>zh݄0nlK-xh/Oog26xbeh^-EGO܋-!}QGU{3jw8psk׮m>Ư)O8PӶ{iEw%vl]W^ٻ!֮%6_{ɱ ⨅Ĵ6ߟȹohdߝ`C~9hKOؾ4JC̋fmkl ks }_3mZ[sn9\3vk|trl{C<1#1vm5/ ,߁S?pl,Gn^{ca b3U~̷)3aL1s6}| hf_07vnXnj1({҂>˴ǡמ7-oc=;-2kU>nKycpF~Ĝ^b-_ޱ~7co[|F?=,1%w6*}/?0men´ݛb{[{5KYSP|̙Lʃԩscִ~CC ҷ]]nj;bO;64qđb5a{Ï*ߑ({|t#f:oZwQioS%x3OsPۮakFij  -܎ǘ3mbA!3GhJF_ml{C8'>r= 8x9G5v\5E7#;gڎA2sԷgش ‡2069xcCG>EW|.W{P)](E4^t/*~,  h= )~33#y`+N/Oyօ3뮿wAI-_S ΫS80;Od}cN[?/xK9 JO)!'G2[q䫏.bF6 `xYC>X:j?ݜr[8@΄߷(7εɎ?jǟ8/5#7ffO!M0.: :M1)&Gx\&\D`G>9&-AÅ/lI.s> qa<|Y>`>gl9>Z;d @QX0 6xwe>#>>i Xꁁn-'&h0wH]d\ߜ3sΎX~S?blǟ:3Fƿ™%dO5#rnc*~^ʊR33->}럇uQa?<9l]/G|e~c hl Ϝy[]d\j^Sq+3`?c0VuGw-Xku SZvٟ_k!q7oe +pYmGxY^Qa{"Xcc)wum{ɷmsKܥe>wܖw`Н, :@IA3y<`ן~sN4'ur6]<Ç[<+@Ͼ<0W]6'!miK<12hc" 2/mAwzb ן~,TǿYXS.:uӇ'?-c8fA:,Nh8~usơ&ƟvGLXZ-*6-ct1X[v @!:-k'oL<1wLn"WGz,AcyN01xC;s2\2h"7&<'+4|lL\_"ƎWs|l>ʋ Z> 12@9_bdat1r ;'iC?|uc~\fnr9?mƀd`\o֦]%05SZz${.8M6% -!Gi%ہ^͸K_H 78&^>& ћ|VȻ ,m P?B9V\x A{F>z`}ևə88Tg,쵁G\]'@c=@WP^!ZxzR?%=h0ևv5뿮4Dz9 #VA} ʀw hw-Gm|Y=iZ+G/| .?c`id3vc0#F H8MJ>Ly  5hΜ9q9jdȑcV^]Ҧ937NS>r UG.mt~e}}B?Y=c}G4`; =q`1A.c_ѯT+mɇׅw}e߽,j|2ʉoŊq뭷ƥ^/| (?N.m]Lȕ;Q<}?|1ׯ_n!?± w>E/3.>weWۼx1.7/oą^Gy|R:yi/vchXw&m~X3F]@=?ڠg, g޴S ж6>'lMr CsW\?bWlc ~u;YdU|zXGpƃ&kBD*~ۼys3w}wz͋+%6pFZn9C<ёFUƾ_0z]76&@my/.60/*mI%\w^|CG7:3\K֋>~i?es(!i}˿2e^tY >@\3m1r^  Jmj髥t71/.>[1Mǯy@sa05rх<7_GXGg]壏=2}~1.z_c"wLgOOtT_\u3ԅu; <4{͋7֏U؟ 0xASNig{キyx]%\s*K{㡭rBQ>zz&8$vBʺmw/6o(0ذy/x7}h{xhzlr-ͫն}?Zͽ7.\]w]'߀'zg93Wecy'.^ t֓.e[͇v褓N~ͼ&:4zA#g]{(8+}|q O:>ds,nc֡vsmV/eq#LLЧͣ~HMkc5?ƍGjhϼ^^w6j&Q/|웏|u]Gϝ;w%ڳYQrsF, βʊ=6z3X=8@ܶF]lNAbb3p-*^w"xzܤ1v9uu!74Ur&J?'tFqþ)DžJgLS3拠mnd!^a~Uh COo-4q][hk or>[ {mcѶƥ`V́X`M!#l 'Cfu;\-r sBxcA.8?mdx!t뫼|il~d;V ?@Ґ^˗G?υ ?Trqd`vݽ%/[3:1 [ӷ>iCs1_z <,/[v%@IDATusŇ~CtN|GsyLn6QƏ>3qd.9m@ډ?P]}BNl98\642hlؒ1:pKs9cN9]`k 8'0uC\:v $^ǃ=^k֬ŋ# [ǐ9 }x`_`zQ{3&o4崱`cmca̼Kc'6~k}G& R׸}eu]96-)X9uGrqu8yݠg۵OF[;;|ߙ/5GM>FB`}>SLJ?sCL=xOm_ccloq{b8rFm&3yc'. SwXn0Vtw,zaƱ`J1cZk7ez^Č2񓁘~ ye-.6aeq#U 42hI6z ̃8xLJ: ?x^1j؈abel <Z#r:u+<<2ss[AZsmp-Kw2Zh4ΆC&/Ahv^1zB؈7mz7'u]e%~ /"|/kKEZT9|c1,Y/@y/" I% V^Fyʺ@>x1c!_ǔW8;cg0Pg >x /4|󠭮| 0eRDzWK7 gQ-|Oݱٳ{gێ~r-<e軁Yy>}NؠC~8s15xo_<@1-}^ڂ|#=|119t#_mZ`mNж.?32T>ıw|z:~A_<8rcg=YC(xPx3@:JNZVyyxp?X?K;Q ]?MdD]Qiy{luz(f^mxSo<= @(~zYih#_FAAFMĬ,898Nxm+Y_6fWǘMC oA@†}'cFqq 6mcG2?tџ1 voBGlwraw" O?JpMߵ6kqwVq/ٽuU|뺯ĭnl?n랕q9~ε|Tьўv:ac]G qկ2C 1axth ܆>yj {hrsFOgqPPn)67sGG>-:;<і ELS>qs_αs]?Uc|qj;ׁ4Ⱦҽp/9'vi-֦,k:_;噗itrvVWyn `xn漒氐.Ha"?fv"yЏ7 ;V.;>Ż<@0^yu'// &W7o8u)qqy9q\P9w6v}!O{3c7>qƫ/>ezy>:ǵ?K#kw/m㞥<֟'΍x|0,+{ǝ8yq9GQ{o+=May)cL͚hr^?V֖6SWhC6c8v=:\94ش k}y_𕉑I/p7|X?dB1hc6#H~ֿ9tW/9;.j`Oky9o߾PżqCS>:s2@r[kO^ŵѸwֺṓ 70bmh˓lFO]_O}Ii]^nC{Oθ(ybd0D`ĀǍM J72+X _=n~ȝ򘬼 '7|s/? WK#}R :_gV<_\w>uk9g]TǰʳOǬS[+C6l6-egS,O7}ύsO?=,]k,_K]e7ǝ/96v_k޴xh@\c~^rb9G(}/6%Á'-((|Tuʵ0ב򠭙 c90Ĥ.> os97 4>ظ蓟yص9V>qy~.+?.(ؼbu.}ڰ0#N^+ccl[wN+|IS1e8dpqX&,?|Əƅ_(?ȴMqX8gGքݻDz17Sfw-^g?ĥ<,7BPdkocXxFc%臏Ȭs:R.rxșwg]tk^07Gm@OsM#SֿzCƔ)53x~,ؗb˦-s>6ǖ|4{wx%M|8{o|dh?7}سcJbʝ wŬEϏi;FƋOٱ2XS~1)هO/#elgMGn{xhˉqTq(|=ǒJ=%{/odw?rO@?ipу9xؠ툃 %K?`ԭŎ>I= c.[c䇜 ;.h|Cxet6@_ڹ=1 ?;`ͅ=/l ;uf\:S/֯k36lh`NP}?7#aۚNJ+ L;yy/[7qjL3wyA k:#}eyk:0${wN/Y.=wapoP`o^.=<`C<<07p^zuC &R&aGNlxy@ |!WSE?Y`ѣ_O r69!C)ޛômxPc@SŮzSXw~Θ{񢘽{],ΝE~B<|hXzCduF>!>.M76Ŵ8Cb1;X~IџO=|ĩ|$ij{=q/K&T$Qr+6y5  ڂodua.8YuЕ[YX<ꠇZ =>e 9 Op~y=z拾qѯ||_O.\+&:3> |x\>la# WjAm<:uGs1Ϩ5̵K僳2ڹ 1\.0 O?zၟDU%|/e]|Qj&Y&s5gFl8TQUSwdT{Ï?x4uN^rx^Yo,nA2\lzެm; D8 It>>tOy`~BWZx`DF|tۗcOc}ߍ,qJyΘg?E|h֒bgN{ǐR>7}~)n?2M.ʯ$M߼66*H0f 9g{ǙvLYޝ[-,l)y#mj馘1}CH;M?ff|/>XX&Ow}=|0_s|x~r=< Ot.:ؘCW?ELdu3o69$5xg8 CyhD+;oh$'1itcwǒwX=8t|/ߕҗmu3a 1)<6'of lJ8xE/jw}C$'|r ]`6>8&>:`s;Ⴡ쇶s8~򝋝_jny8Z]~upZ{[W+76ʋ"^`l޹)֔w+ij˻ nC|7|92^WmDzUcYD^8< |`EcÃyn>;S6Cqq+^˖>UmkܦΏ8>+7YKl%׉zR?=m!zʬX`vX`=lx\>z7yenտ|c1V:{{Ȉ5E;`.ګ}vsǹenqS3ey:Į)s6UhiS~ _3h?K/w|x>P]V`"`=F}r5c>{vQmu^Nn!%=\^KgYcvAAnL2}xڲcV)HYki68l؂ 7 Wvș~b 4rmݸril(LF_"viUލ^i禕[bڸ6"o?YE l}8omK?/gL%2Ǐ_RZv߽MXr_G.w%uƆҖorma/`ǖJ{W=jf3 \ r~?xK i?<<r60rj:@+w}wuYLxG_|:OEj]y #u56osh7V!ˇL$?2Cց^n\>8d`,;^+~2KG^u29ydb𪡇'{!g!6\ڣO}2DG0m ׃|iW=~/q0Rf>w8rD<@;Qq?rVb Pz޴Ea}g9`NP_*t_cG|DGm`R7ڼGOl-vW=>q-`]+rk?.:9m\'xȱ.6r`9no|5?R[kM-#yuw]Mve˖1& l*};l{X ެZ 2,qd9M&Y ~x\ܴ<? /~vxH~YcmY&yck r1:iC{fhe/b~̍x>|0 IЎ?зd}b}2`#s 0;]Tp<rK#c|'z~I?a:3IE[>O`x9 ^x%VW}cAQAFѸdj#*.(t$ j0$&&h0*m&.PAdz{w릛ŠTuWuN:un9U0QûpB篓)4GtQ&P=ah FFq `ed,:w Wѻ<3xJ+ oxe ޔe/\dt4O=ꨣm"\JOV4,?'xKCph3?z VVO -MF'JQVZ[`pp 1pU|éJG02cz7V\)]=+<N[ m-2+S4XW/X`e,FI8}b<|-߿7}Z~vxD%] go<vjkɹ R}S=m~#3.҂HI m m}RZ0#Z? /o_< wz7!B6`-^U L(1x[` #v) S%Qi p↍ӣV|ˇFfHڣxHtqFpt޵miNtYz0KS8Xϖǵ8` 2<W2ctm8Sqd'#)ȭz#~p[$K1:_i) F7_¡G+, Fa (m7.üQ:a@)4(>/&V48GpKzWf_F~2n2IWdcgʓٻp\8L|rD`.ˏ;x_XZAa2gt N2x8Fgx 4rKؕ18ᐿ2cq#ѩ 2\\w)\CF ^iˈ_j{P۠wk'kԮXbo:%mf9WlFSrj3t5?٩&_*LwU\=j)X'a"Y`*-n⪳:KC+\>"_qm xzdW#ZdDET\ONOn)c4*zSQ9 n4SaS0W<[t:g4ZބD-`/”`e;LfpF= ׻VKғ`.[F]3[}:8d&߷&izoR LF=I~N. k>pfݒmloѻa`DsNK^z'j&L( qULEQp'&\x4ASaK(t̶׌d#ctT'OFlŕ~6z.lSdl,yG~2¡td1C¡tcn ^F%XT<W0}W=Q߿P;am&c'ݨѻUVlM;Ǯca8nx,l%c , ap8/[6AY~gNMw-a=Fvp)L~W<n]a`,l~sŕ1))֡c*Fl=aw)xœJOp)< c~wd+=$?ko xa*u|_a&+~-X [J[p+ !8(ktۻ „hFOR#6l>}+_A{'_߅/U_*^4̟=o֐oA,QT i=V n_vsB lz9XI~ ljW?>rV6[aLؖ#UNuߕZGG&ŕcGqe cpѻ ֌/[}I/Z-+hJ}|ʖ1z8-=kx NʳIc4X>&?[j`qN^ʧpzaٻҐw_A} x$7dgIU-_f+a/]_|'et|R)DH[wWQ?r&0N}Q Y3]6f/x=Rz4[n:wɟz]5{{|V=<<<vR Ȗrp+ѵkWwhP"<h_"/QyyR=p@J=6#eA 5xxxxxYR ۔_VKq*&^ɶgO؛8E6HH]d0{_|^xa(:Rl/aDBρp@ )mSd{9UWط`3 R42]n[po<<<<<)aA}) fp+_tjMiidנ^ۄ{xxxPc 8@lY_33+8|g8`Jl) zlRxi5۞) >E\8|Ku/S(Pn/gϾ@9`ʃl HO;n#Z9Gs+{txvȖ 7ޙt|\ρ8(8_ }\9s+_KV Vn3 {)K|=<<<vK`DMIzD%ID=v?6{S8`}{[}~xa)kSρWvu>KR6joRT8999999999xš-a$h{p%Em[ȶwxaGH! !g>[R`V"eQ&Prr.XXfY )L,x_1xa*PS4bi R#)=F~a&rs2dsGu(+ŢMےjϪġGq!Y=Ny Tρ/-GUaMy?pq|0T7DPk@uPV :D4CJB^sС+'ekz}έ@8,>NL-cI؃9qh9fjjj("ܣ=X,6D"P7Truu4P[hG.Hq@ ]YODF9T@ iC-/Ǡ#pX<)xxxxxxxxx484Ǚ/_ h4łO_pd!j#= -D AʂW8PO\)b5*I: q>ظm=+pquK,_r+B} k7Vᅷk#yŹX%ƙNJ )T64i)!hBÅ)lsE=22aBƼeXW_'ρT)miҲUJ52:AC\rvR$k&z4#P k4^J/9R$77QQ:`UUAhhsssssssss ^qHn~O( W`בQ΍UܠOLHteJ]G˘jv5g)H[x l91j\"PѲ4ya7WsssssssKT ,8m֩IWǐoWt[!08@3˹ *1VsjTl1QypqoDn^6 q9RrKܾ_]?/[OBoiڀ r*p~er~X9|R{8]V]]= h(kR* nVtN($pKb\== 2lX¬iIȮGS 2@y/T>ވ2݆GQGxV)D4P%M5c!6#m0jwL]΁e/bүC!gg(M __;~2/E[yO>Nei⷗.-x!3+f'X[j"΍0vdwy|瞱:թfws`ۊxOmw*X)yM,/m)>@8Vi$k+xj.Q^D L ) R4pI66kªOb5:|? 7<^<[I/Fqӓm|f/DEM)8;qE{_{#jn&VM:)MӜ(Q*EuX_2 sBvy[c퍁oszuu-˥9 zDD}(1̽1,  EWbb9#_ -ycA1?gX<0sV8*.c{\ܹ֘<»BoĐ|/+mVQj-.چ! +=38=Z7Ck\$`~N˲5x=@[8pk`mo[˱:w/@ºYuGwpǭRl~) K62LAw||.moUϹ2\|V9eYo ?#-ٌz<IB&4U#sц"f)t֡ VMqdMpHRU][n#(mD: ~7:'T'F&ҥp֬h(k Ԓhp4N*^i6t2['.i=zi_yy(\K[pX&pmY.$)7JfM?xrh4g^_׿czY}xn}.|͸|I";srXbȤY?`&MNr@c Bӆ7&G`tfΎÑe†Ys10li}wOŸ8,upw1w\WcWbgMsʶo z^[:"qN|ܯU~53qw ZA~Qr2b{mG#BeY gS4%0-xSחlwAhּ"9~@VAn}yo6#v-k֞4Gjs`״_mp³ ?A=#f2% \6$2S$tbҚ϶_q?(r]6{aWg )b| z4K "QEKXo٥('-c|>9ذ#X -W҉MZTYNEͻcPc9:tv@IDATpw?wo%1SNqKN^sGy#yb¿_i&Ϝu{[Q?t{*>^N0Ttlu!JJ <[[Œ移CR>fno9%-[Y޽±=kRaE%G9ߦ=T磌*;i_4SGC<#>zbK%L=gKbŕ%d6zcyC\8ts&~2X1Q߽9'ǿOa3d8[eƒ Z8`/`~W>iwU܅=uϏ1knáuxG?F]&NnJc~bZʀ*)JU[ W>33 OV"X P3\>Q_T$WZaQ*j*9pRLS*BJoE*򕨦M-%d\Y5-ћwlhio`+ܷj~aŪmg}`[R[a35Z%l45:~;YUՉaښ۞ʔiG(4TT7*pZRWjU|&9~TpmJWw^Z>vΊ_*ǫS$n bbf &3v&Xbt{?l?Ύ>"Bl%,u]s:r{vf / s3mWʱ6k^ǯk*xcs>8mg O-PX7; 29H Q`8Z8kqu%6| [U#FF%6ݷa[di9Lm1; /.Zқw@4} m_;ePQ Z*^̻T \-35m.l{sxv;VICV.ga#՟긲-m:-ydרަQ=F|WjW9Pa*yl*9%>)mbǶ]k4 &\OW )H}meU tc}.2 ]_Y/=øx؄Sg;9N)~T[pՒ)O SFq}cΒa;   "%$«$:UU׍nɌwcMĝ[T48.Q^&]`H6OTZZƓhdӉge굞Ss+J~ߖڊf(zA4#TQݬe]76ҚeD~]K)0l[Bma$;,s)\qƾ)נ<*لfב 2f)eާ[M2+N::+m?UkEpTq6A_OZ|A`<%}"μ:s=_4a}93#` ҈ѷ ݻ`C }iU=W>G*x,bgi9 a[ǚ~:ϣN>0#a]'Ulaq@|4a%?,Cue=V-+EzBNZZ5&WpDE<蟕AFqf:e(ۻk)pz!Cĉp@?Lv!Ѯ8ϑ# 쌢ՙ?95qy\ii<5|8 YX_Q`i>;:g7r#rABۛ8y8t#!3r QčS%JO#)5_-хH,Gr9q)/W F 4s-7T~i|%[ag(KK9z/U Ok FoLp%vz,>vY{#qq5X`oƱV>ZnuQq>pIC}kU AX2){ss?#msn }4w}G|ҿ.`nb6Nw֏1 NlB+1Or"DY\@M39ܱA!^,5՟dB6MeKTCU! X'`O2F&;Z)/)ړåJj 8-™>5[#yZz:ڦ7*诂~덩Ó<إI|N:>pc-??JéxcΛNg`5;ǁPCpːhU҅:%PHj2= I(+¹'pp|$F9Ӱ⃍dP(T SIţ 7, w=Vnw`W|ʢ{a6SI]ɥS\Cywhp,z6p!ǢcQz 0zt.dWOT,`mD(-Mӭe^K6{}>y3\5޹\4\[Xn^ka溕,Ff9P_J(%N>xJ&pc F Bm֔FĊb+:OA˰pױdpF:{HL=lX9*ô۷|G}<+FnBiM[ͥ !7Ya>Ads#$iȳIuW?Cu}n^s9m^R;-2~app֩W>"\8z}"ř֞=3eܘL|q|{iH0{\| ]#3?QR.M1M6 Jp_?nF%OЦ,CJkp,Zzk?X& sIGvT~ՉZ(* +^WTޑu u xYnB+.RQʦ@Ek3\0%dQV>j<6H SPI'an:FY  VR͘p\-qkަHZ_K)lo }u!eG/ѥA3شh9!~# -Kcn)eUY4K ~ (좺o{4"܍Sw\CKl7\e=% q(WV+L~YSLRf}@n5WĵZa!O ~s(:+%Ezˊڰkyrģ_¨Elj|gOm`^8_)0QCbR\<054Px2™P 1]9׳a\N B وX%+ F Z$;AyQvQH^?7t6f4%z_E/S^. ˫~[g虷:BnegrpB2igeSӦjEaq]yбv\::NS(Zn]$%_H) ds>!r5\e)eRI53AɆ3Oi;qq/7pD() W9Q&)߸i;` =2rЩ3k-J,7u2y<(ib(qVZZӠK,iƥ<4U_?LC4FKaer3\@W %Y_ PrXXˁrtAtJtPh΋0^-!Mٷ;ӳԸnK|7 mW҉V+H#MyQ+ [NYG5g԰TM(%lg_p)ѷ˕oIZ(Tt5pУ*d(?mS|~h4@w(g8)//>.ͦ~A_"κKI1~PtwDsIl?'nhfV"mxO|r>3sۻ:p{%ZfʖLs?ija*HhZZU^7렙hdk8o`>tǺqCf//]/n-l8̫LD^xE`6b+Wdg>GdA 6t"5E4 M.xq0Z[+ 7鰴YٖѰfN@K酣ז`6 H1δ Fƈ#ͭhO 4y;/4n/fylEtO}7`CKZ k66|iI vaRiqunE pi lg)廽pեY<%yOSG$Peq/J#}N_ϒ3I+#畆$Sh7HBwC/3N! T;05Rr3ֲQ_ˈ{!qҒxJcTǵDIӯAؿsRs"Q _^㝅Wz!8åi|lA(?6#xo<P ѥyi{19Ԣ[#D4Ňx|8!as/)Wr} mPLل\ʁb[v5O&RnA$Ay9tN.TNkN<8KީA.xni 71WVоڭWj* RRI@d2Z\d$B9`D`fCHGmhQ7{.@xŃzxxxxn(} H-! RሿT+.| q\-g,JL Y"cZOBCM׉J؊pf8nRlPSpJa4K) #ρ@nWfExL~q r>eyzD6Gk1TAB"ӞZƗ`lZY=Tb`릭 p@grn#ZQc \g0G;BTMh=<<<<<<<pxa7PAonA ΥDm7Q%_8\Z !8KoCώUxtF7=-E7nEg;)o~$Z.nA6pq؉IR]8'vm3vE;Wq7O O&imdŲIOQ汙($%2ٕx[5# <;z3.z=Vi _NO^&dzoV6Mk6g@H^RrɏLꚿ ʃYSS4z."á+["Ոx`]|'3+CO_%/ξnd`l93sAeR\5󕕓l.c"U%RH)p4q櫙r1DO9ٮܔ8u4XxpT*wl==<<<<zJ ،\ؿQkP AGN&j1 Ce1t'+^ϰ5; xtF~Zu3:P6NBh!hD$#g7KG*N$C˙(RwQY7@YeаLN7dR`q`%.8(o;kƝ'OǺo.S{mI `Ǡ]iX| NkXUv*N+<(\<7&1GD$]/M6şyo\Lߴ^KOAƵx=+?z.)**rˑeч@5Q(4 EE||K*ۜr#n 1 ,<—h&K 5\σS,p+V ߚiŒigqvr10NYiTXivfS,K۞97o;- #;H{5ըeH+HU}&>lp}ѳ])>{o5~GVn7֣Q{[ku vh=~[ׁp 1HvTZRty\bR02# n}bY+H2HHy{AWbНCq#ݎylyy)-E}At)f<<2y"d7οy`cGIKќ˷gBWT3`_Dr_8tٚ#7G DV"BaS!zP %sUꩀiCu=j.SRpZrgPӎ`6JFsub|)c0nV$iIS.ATYMҚсI9/mij[lW xN99999sq؍@¶Fu GvK`p@^ѴQHu_ߣRۂ\ v~ۊs6a-3^)jÄ: :7'}ufRPj +`O A;Ϫ@בNvAyUgQP}g^w#vlu֬_A`)^}jMWnE_!蓑[X.74P9pr%oerG):/BS5YfZ2d& cJ !\!n"b&L<l ;mv&'aL*.UQ׆h2b:M dSiPT_!W-UQddOd@TۥAQK!]h˿\i6S.I/r θܲL\"$͍ެV6 e+ϥQt4A߁@&VwwAw6;Nѱư8ZpRORJ}i9^h 1wmRÏSOvsNu0 &6\rpuֵ:tmۆ3_FQ#Ub(sQ0OA j8p@~riG%) N=[chB9Q Xi઄%7Q[AewfOT.f-?r_o͘HٕC[ CyJ+"782]Ǎy<֖3dv꩔)ZF(SII@R@*ɐĢt(*@|]XS m(1 ڟ_~}q'i^}38c1-дt1ŗÞ/&=7r'j@ꏄkov$ĨPӕVu>wK%= ,^'Գ]f>ߐ+~Yq{aXbBK:wG?#Չksݒ"ۏ0;/&(oTϘ>ov Z`cev5=A \W.J&o)ԴvO8v{o4y{4{4_F$Lr%@haX3|,]{f@ v!˃Ex靭ܮdTDg` RiE=VnŊu1|BKyV55jiD(q[K4+?DNYA;%FMlU5ZƓ˵ͥUwds$(6`#ؼh8zru$Wjh xdumNfg*,.Kʬ{㑫NY )iz+fP >5EMU[37|5xx|9@ћS4r t*ϙ'k:7{ܜ*UJ'^w"oOV㧏Vʉ祸2x:}f4A2p9ef ӝ7e6(ZEʞSGus(rPvM]RLx3p #'>xa,\IlG^%%Pd&r~ n]5=. ݽNe77b޳ୟN6<`2}T 4K^F{Sv8љeu0DZ<.ּSKQ6~*/+ڈ۰&q>a<{eSR[G0}pgq-"A7Lͪ11sI:KgnL)y.s9L[ޛK{^EXoKr=3ã%AwJjjGTr.rgއCY:_G 1'cOهoGoS 5"k^~sń?ߩj<9Fx<;uR=<\P^Rln|ӳ;%]`+`̀ DhْS(tt1?ѴAK,^-(&;\Y\y݀8RGhm67v9vQ?Q{") 8ow 9u}&b⤐dDk[qϺ[~4?0 = GCЗAf8AC}Y`&t{"N>zj8}$F_| o}N<)%eqj F>:㆟F吣;m:b耮ܓRSU^sػ; "J"b^73q ~=H*)qN33-v-n*aypiV_sF&Y^n)q% #1\0\IS˽ [q/q+ndu71^]o@ 8'*ËpT7?[xk~攟;ug 82ìg2xoK+q)׃qU׹BB*+;&( V"̈:4nP_k4-Km5R&6*҂8){{{˽{Y/p/|ϋyp9S}OWSNވkMZ찲c^sA`%to@wQ-/U8z`Nh0zof] Ք=*(? [ĻNHztOﺪ0/ǡK^#b8!F\nak]Dl4ЁNG>lK"=xB#4+X5m /\V6J( bA 0YKKzS\ܿ:NtxƉ6X7!4Ȳ&R]@IDATgujZ݆qw %NZ5 ^AHjO_2 D!7m EmRGԟ` E+K8NN7y4[ ޸wENaZCВqk(E1#m~%%9EʊbtfTʩ 6/Va`gxç>]@*8zYlDWvi~!g#i!gRanp[mvnmx-L2D6 ExHxsx2=D|*GKqd# ?ܱw}=/gձFc`{OQ+LZ}Sʩgէ)g*ݔ'nYpbiV6:. Wũ돬^TRVU`_z8SjdIVd:oI#-T_";Ӻb:AE:o_( B =T$cVP"[pM!?j!`I39wX|rR?'U1 Yih{N0#[Fc83}$ .y`Kig]?' }5rك%4BV4?̞Ju3ҐdDdZ-VڮNptF½Q']HWrs3ꤪW:n($PVZV/R r/Nxi`aNOCuRRu'A)M1 ih2e_Nkӈѐ_#>]}g,w, .eR[j.HGt]ҕX٢Xa/#p?c(ZQ@}J+4%SUŽİ䪘2[aN{DA:ZRJB: D"=Z$֩L z̦K1@u OC i 9KD]8x"m3BIP* &j1 \, +яxm}5MoYêϢT()2JMm-.\O 8 m,x zv&2Ӓ2^ K#nHڈσKRVbPL3W GX427qDrğL81k >ĞBك8J9y +lf#-_4 *Z){*BNzAR]#'' ':W)[~~4D˕;uW!f8衆 />Lk,wu8UF<1E͘A_ewd﷘+058rh*bx/O=42wA1'%@idP,iF47@ӌEc[li sv`m͎یMدi [#'84mc4)h+< THkE(./Ћ rSpm_xscIbx_V_' 2Wn5QH/SޕU,I$٤\aɛl sHỶ۩Ĉ0BgwVvҋ5ʠzhy̡>eA@z_IK EM%4MCm-cRc(CM#~Ty"1hLo5ΤkvV_3mWKt"U2گA??Dz귳j]OR=Ac!׭;U>~E%TniYFFֽ{+C&o6ΩE›K~k,WE==[<xO\ 78Iť뙸zO*=J(0lKG)NVrU_6uڊQ&O]APJnǢ}Xu }bTSEjսUi*=}2p`uO:y./A#lsEDKOLmMRF[%JK!.N\BYPWZ0_lpoW"`^t ! GJl ө1|߾1&`<8eJ– XrSHSBnK:fU5y5/YyvAijP2Lή1U[vk9t신4''L T+gh䁿@ʃB( yA5WV@_V"0V4 0&`LXq(ZJ@APL4ȶG e@eB 7&`L 0&PY8TX-ByC,ǐ-c 0&`L T+%Vu:dL 0&hQr8IY47Pg&$L> uQ}a,Ty?:Sڜؼy?l!ϹA } C6G_J q+8-SnνWcǙ uJD)f!yw8w#z8;;Kw 9íT2wP94/}3;#|Y9izZDv qw`%F YV}gn2KM=E_;wЌd@ Puv 0LԩSBFȹ nCbbSH:qfB8q ~~/o`U։]K_/9j._JdæY0vع_Dب/qru臕DX[ٮ`9x4^_jcxvv@A=maÞ_7 m9%ɛ=F qb-yIAC׳咥,e~,t&~ߩÈVFkt9q_ OEyWnt(8շ#OJ+ ü~*M/;pY]VQq7$ $f+O+eҕvqU-Ǖ]a>lܸQ kgg'ٟ|IwYud7.G2&P&VÑL< d$`!Sg"F4-{GtF x+pm}}Ir󻔧ڻ -k(dbΖڿBz%{7aHthFs ӱ}gR *6p: 4AwމYߢyPގ$ǎ 2Ohơi$qD"@9wgrNt'3OKsG@7NK3EEO}2#Awx'bq^eΟ/*!L=իm~܊GlyScNÌK/^3(@Twjup.&jXjtd".CBK\/q 1E[mdN zFP)ڤ\qԎ$ue7UFa~r%W' 3<; ):=JBT>8}T,Fy$7죒dšJo ղ!4ȱ S`f/'\;+BЁ\.} >Lj\yOޝO\H1z Aן Kbь<} ˿J& Zj5ʡ8"I{94i٤P kMRz#}d?J?xl ~6auE@(ǺeE*WL\I?l1?u Faܸq7Gyc@2 HcxyzIMF^_Iwf`QHǕ39qnAcr_ IiLK)d29]4*5$o$cu&(W ([Ћ~)YY 81؄Q958"㑖_b5@H1|<}nÜH\[Hh96M8+1IV0|X2n("ܷKWߵ^{q˳RmGG)6|Ii!=.IȲљW*TKKeZQ<^0 'iXGGth\yukb?0{O_7~x^bq R"0s'p ֘IrBi\8(wk C<]l:IM;l_: ;Wu =u{gaunXv9{ϼWi^\*vag_L量Ci;@le-7J9f1d;nh$l;yCTKH^%t#7f$#Р}'֌9[ Pl /jK$#is4^lTH%>CM@31s`d7 8J潵Wҳ6' 3U@^!&`lo~qJxˬY]e&L 7֘s65B)qi[:Vws6nȇV#lTlxW5`OӈPM}Y4t8$Hub& )͸W@RNyYxbm9>k~Oَ)!Jwͳ4즙h[! rEf&ƣNkCoii5bsu:8I j/+pw͹,OCuuB X-m|ö;taɟ^Pbn!Ob W]?GW6V6JAA;,px3 U_,R*MQO˫0&&MH={+@yY1 sYL@I@lid-\pK0a,Tqu5O FזӸkߢtF3OСCVd\B[(֘ ;;N9oooVĥUP{X5e!j fĸỔTɚ3/O>KZTe+Qk!&c𒛕BK89hRlzυ-)Ht_ddd j/V.C΢PLXY١qc9X,V)a# _l۶ 'O{߉xq~'VrR8p]vcakkK?ʩz$6jH+D0rwE\bl.]hW]OAe5%@bG]陜Fv~9_٦*O-~0/&eaښaRْn `H L؊ӻ 奏`G?(4?^P~U$Y⿼NNb7GLb9f/*kO&P%^6mH_=/ØV*ƉS1&`V-?P] ЅtzW3P;V+ʘ(xѣM (ML8 0&P-x&L@QQbccMG V̬X\&L8I&1}aYB&ЀAܟlVƍs1&$ {{2p$`L 0s"j9j@ lU_Ԫ5>L^+ZF'bO7VwB_JzxC%qr&PE\U#CRn0A܍r * =Gظᗇ s)21'/0aq?5` T+ə@!``!cqZ97>b e=1,FF}-Т "/H+_a kZ 0&@`š%`fL G"ЬY35I9ʙIX, ">U,|(,a>h޼Nf3{m*k*ĉ쬺^W w#(|7~Fжx32n$ӪU+n,򦺼!KUZϪ7p8{G£GD WΖEp?~X[ӟ# [rss%%6m((оKF%'OH E| 0]gƮcL>(|oBx]gi kǬj*:'Ⱦm隼w=[Ct`գG5ёuq?Q  !nLm{LmTݜ { _Oy=pf #_1oL?e˧J`L 8ԓf0pBnVgCˌzH8]O#-m;{*E?oѐq0)6erI$ɏѫ >vV%,߾ >30 @ ;fN: 2hS⽛_~ is4cQ-5S:9'$] 490l7*.^BwCBr E6FRH۹#jfS9,3nq%SѻCK4sF`S,>6;=E Fyl%5#,9`zeeL`М]X3 u{6EREGŏS0cPuh 7Z4`ǘڿ o)߆qh߾|_;kPP}} )G,^x%@Ƿ;REM"k_n|16G}3%[ фJSnDֹر(.ͬ0$<!bX/ui ϱ6tGK%_"&Ǡ%{JjhiѪ`MsfE:T:mE(]ڷh(>~+K>φ ݟ$1L@ɯĒ0&`*lax}2+;vVm [0-CO3 bhm M=ysɽPlmj')j8S)K-܇"x{m̥acQ1ӐKxȍ >[ TPh_в、ۓ` +llTrcsnB^QX|%NT墳+5v";a-Ğ `]#P>:NK(JPO,1E7-"i/çjT GJ1BJliψ!J 0&qȭ`5J5ZKCi(P( ZJCI) R\Ҡg~4c)-Q`R%)9 PBJ?,D> = . *E5HG9׎"r)Ze+k#3a5SHIC<.ȸĹ⭖mM-ϟq+ҪL@ԢJK\If<~8`OǙjœL}MuT4 6[ѱd?0+ђjJ0*;G}lB\ FµrB&P9] B~*@׮]{ޖf+{QkⷾI& B(~W-.yfIV@K ѥKڼyP"ě4[6tv9NKn٦ )E0f@CfaL 0#tA 1/} 2]qJ+3Ҏ*IѴaJR2|eWűLZ ݟ*33B@qW~~>+boM7q O 35w^^ES.qrPyƲ-JtM.)5>'3&PU8TcL 0 ;PxF18 eD8]9(WWVj[Ui*O(U54Ӡ4YEg'*[gL < F&`uN@X>΅3S,hy>c?X_RcL `"1&@0t<ړ|k2 9/4 ^d"2&`^S: 714zhnK+ueLG}}}aaA 0&`2XaFs1 0' NiҤt2 2D@l7iY 7 0&j8اԀ\$`L 0 F `#j+ƉS1 g]P: VKOr;0:$\ɨt85|jJSILv d!fb|Zvpѯ@_.[V,|=u8°W^Crb&`8Կ>1Z'p爺 jwOlIJYTY}^f(uiER}T8 ?MX $yKLQ!4t "/1$^AYlrrVDB{`UzR=P8 ?M#X $Yv L@>%Oreah֬ +t@]ؼ9ȤL)NOnҵl~zBvg1'a<)"7VÉ;;@tuɻ'WKiOn%+TgV>P2[Ϫa`L 0DV&P[ r>cEDC^ وw_;@# S7m _}SHqRH."__Z1؜pz_0r:,aNu,)mA=m.coel7^Fp+nT~ɹ( -+H%q.~KLti:}V̯Xb&`r#0Z&#ihU#"Ȼ36mI/bni {~ϴg__:޳@t}*N#"vE)1|} b(br d*quXI]1nɻLiNQfB6& H9& rߔX9q"qtl*VN 6 "G!ӱƒʊTQN w,RWΜEA"p-G!ՐL 0&PP:@Xa4y f߅>w#&dሴT%ڴ;Z hyGZxyy>һIi D\05,ő^#8w;{K=O"eegkxS޸H"aH\ރCIs2X36_&~&f8wx _PV\΅x]sʜX: ߧʳNlQF"z4wZκ(W]9;w,098\@L< agG8z8oDZ)?KL lwIqF"|[-b;شspMQX`1}NGS[H [6QWT\|Izջkɱ4qQbб+)!7J6BUܡo)DANsI(+0[S"eWo s˾4~tW+g0QOb&G )gܖ&OTS-L 6b~Pkbexg(N]0{,l_4Wr06b soLb@G[],Df-CcaCkfB|q~JYYRb6h\/DȀՒ!HGAFCq :n|t~8M=T mAGqfz>:C*r5A } "1$ g4n][ᚗa6tYℭ"n9-qw[h:tれKFEEE(((9m܊ (DVV.aC3YYr7_طupPEGPD R ~euW$[nVr -Pz?~~~~ρL ǏСCGG78p]vy[[[XYYB:pYo}&M AwEf.ܲ(ic'OH$''K.VGGb-ܺٓn/ %6q-_"Lv6Ii-„ѵ5ä/p3&D, ް2B1gD__|EJʖ7 'L 0&T `L ˈErQL ߟF4H84nF3&P;SRqL!Cuq^&`L 0&@L&j@\\\Vȵ1&a80`. 0GO> Mqx亄@ޒRepaL 0&j@#1jcc 21 8Vj1W`L~3)oS-d`@J5˗KgL 0&P !4p{ln`&3 L 0&`Lbxơb8`LS^W2N@cѕÉP`Ł L 0#/,,,\2@u!66:Ep^&Р Р@MhԨ4i(dL O6L T+Uƹ`eJ}i8 0&9`ۜzeeL,(LJ B2'gK`Xq0߾cə@&lcës2"x)Dݱ皙@y,3Xq0̆cIH=`fhLyy&aw{N(Ah)j9H9uR +BT!A)=BU^],L 0&x;(H=gb]rASݎ[+V߄cu,֦L(:p&7֒Tl8]Ĕ^ |1x1.7s&~q(R- ffD@ܟHVc,G#¥|!BSijiH•rD$f"B(I@.]W?|ÇFsf9ƣgsZnۮҬ_p=8u=[QVSS<ȹ^c iTa8x.Ǿ%H9~(_ױciOT94%}$gbߺ {/(ӟZGN[e=, cZ"/L[^=w;%c§:b`Q`l= ;*`+kaek ݌ߓ~\ወ$HvP{TRlWigwZشgs 4#:  E gôŦ`ޙ;s.D1?xC4V/.. ԦvCajѿvf1^)WXj1Z>&Yb(\]^MٟS*u|"ڴAPĿ7l+#v ="04@L33~hN%ˠ5ezX51W0{@&H˦9pN4/ŒhӦW|HRH,hIcrY\dЭ)}:( z Hʆ Osh+uEeF"`Ka5x9"+.'Dɺ5XC_*de\-6EPҍ`Tt#:˥n R~iAURHWPfUjX:1sH3b@\7MVܸ+o:S~+OZ(0QKβBdׇ@*" P29T7i99BԡD gQ)|96 IC~f7oPOǡkʙ<) 8OcuL: Tؼngƺ4ٹ] K.6&"++N")M9Ws↨UH}b*Y_B7!h8#{䫯9,D}wmmVvgh/f%Tg=%Ec_ ^n#W$ W)c뎙+#yh> :.qHQ18z& lɳewִ7Hlp&RU8q_#OA~*`oI(e90g.w_dJf$W{R%TJZ5@]$FLз9h3xn )UKxL 0&P P[X MĢt턶mhpB#~x7zlSb |=о}'xw4P,'oRQSr_ni?Ҧ5-5}a"Jv~<#Bup<>>COql~0 iaB9ڠ9}#^9 z "t Q F. s.Bz{Fkis4t]Ϭ=t6Zk y@4.t5? pZҮ%С tٸv ѫ󑑦ҔgeiydD&)G7L/d_\@h\HDӎ88JE9ɩnʫ@([v&`t^WX4[זyp]&lC*Nغn1Dpitm9{ޢtF3OСCVd\x8q8NsÛf ڊ m y\z.ƚbz1YX[VHn%gk6g> ;Ǧ )_.RXѬBIEta}OhAWV A;@:@Lu컴))^bNjpn9uRv0% H=t-gT 8]JB.L" ~вM +wEyBByOGˊArr2tbT͛7(.K`C.,ݲ_N/Kq-_"Lv6Ii-„ѵ5äbP_L#um1HFk^"\/ %~E hϪn9-aŁ 5$`3TCf?xf9K+.!TZ4=')Bh*PѮԬfQeshCrYQE"mבz8 5V[?+V'h*Ml\.@qQ44J!c8MLd T4`Ll`LuĈ(&`4ٮà+fI,"`L 0&kT{gL^F1&@%C{n9`5DO>5T2`LRc53&`L 0!3fU,(`L GjǓ"hR돷OϡK@Bq⤶idAgOm(c5L3&@(~B//=,WQ4_=TnNPbPڪ 2k x )*( 6^( `E"0&@hdIw/RƜVMb&0OdV©3O-jB%'^W]@}&M\1J%298-`%Cu r~&={[u^&Pr] &PXq \` -|}}aaaѠ͍eN.&L+&5,`JQFhҤ lll̵ ,7 O6L T+Uƹ`eJ}i8 0&9`ۜzeeL,(yYf!@ Yuv & q5$^}h(&P#\h!KHGs3@E gBEeغ(6A-+UG85ˣ8ȣ -z׼\`L 03$3fi,2)2) -ba{FL 䘘 ڟ{"}NdۢUll۴3GBXr"azlV:@;#܏ jZla%0},\ .~ Zxd(E8v9".eJPXXf2" &DS:@m( &`Xq0߾cə@ _!*5"SU/,>Ad04 ބ[r1dYf>q5OQѼi\W'W'h,(ʓ\wO¥"+r0̧eXџ.>Z^ǡBܪZ9<7UqYBR#;P8`L 0!CpZIppl8/E )5GCx/V5^gþ*bӕIocVD{1a:SJP\o- eTV$|. 6ia2N+ n%Z9x [GRRQ \u8)7n~e@{@kG n$;RK}#kWnWkGC|S9 0%PYsL`št"7 +V=cpl|z]IRI܀H`ZDWHB?׆ zR7`ΣҲFO7N|Yg9#z- ˈ텍:},GiX98BzuS 7#5_ZP/G)P,͗i4ڇ]+ZcL ޟFc@/~}l 0*k%"+H :{>wے]N /ukpeIxT,kO9bm?LRR N#޳-^G~B+1psYgi %rR&Ei&P Rܻ6&PIF`4ٹ#^nOC^`ѐq0)YYtIi +T4}CjIH w.6tq.'o. gܖwq/tW&op6= yE@hΗUmWݹ6oN&08MWL MĢt턶m0*, ?a=!l)߆qh߾|_;%ZOߤ1j}TA=СCgx.ʺU XYXiK<8Q"GnZA\W BSPcX[@|ewA@PS@A9J$&QW$Ư P"jX (9onO=Vw[קz뭫݊8:{\,؇e2z1$@@$I  js.cΝQ@~ڸЖ<צs#㴍LӧO? rUfk9cDUK%=ąϗ^ldffbΝ߿&TWclD Es$ИaOBw< ~qrs dT$1 Ɉr@#MwOkm\ӳ$e(+0j(4hР8d7/obK[řJ\xB5I ++ WƠA4>;w~򌉉q{Uiddoذ!TT^Q[ :жWжݻѩS*"ۋ?"nP"C{܌97FքWߡ C̹ɒU[8m%SKg&7 4#vU;O$Xt?ܞkl㚔;\\x1poНJCf$@$@N@{iHH*2[7&э4xF$ ҿ`BQH@ pā T134^m2nYGiHj@gm@CsJ$@$@$@$@F# e֭cHH!*Yd %0`M @-TZ$IHHHH pġ5ƅU $P!\e-nc{Hs1쏪͒ wT T UTa8YSHϑ}3 9>͓"1 }!*UrK1 9TBJ! p$# 49Yi̫Zc#жqu#_n%oaH${(@$@eiP㈉(@+a. JC)#a^(fHH'*>БHGZ ӓt!..j#Q$ bcVuzr! 8zeHj.6m*/hXù= /IkÂIH 4Pqz`.HX4h $K;ù\U32edHHgIH@NNߏ#Gܹscmذ!ڴi.\h=IH8T @ [/Y}!++ F۶maÇm6h=z' @ K=g$@!E )Ӧar<KWgЄT-U43DϞ=T4~U,TVÔ2p͘jWNJLy)ʤmǂмys4nVzn~i/hAUe @P< @-8n1^K@VMpr㳘3\:_H`^nZr({@6ِˆwbszm]1{ǸY+p!}LWiX {4RpSiHͶ@AUiiiA) *ƙ|O^KC^~ZG8W uQ j<ӡavff~znz:;;rW:O#77yyyŶ|{pУȲ͹/fVcl]wpRݩK5?fR̼ w{3nCc~K?Gk".E:7c) )O5L<Ĕ(\.$Ucx0x#ʞvvw3+.`2,/q RV`111!A7kӰ6.kܜykxfW{8?Mf[5=&>ΰUt, @83Rw_|D,f62m!dFdVJYdZ`|e)X'?aȌȴZ2JNd-H Eg?~9]~;u/val0C i#!<{*. >{z[Vb2:^/#MGUom8{@]F3}{~Xh֬瘆m6̽ٸ ,#YiZ,ݲ=tBos%3{Ljqh?7> S{I ƈߟskDoi-Vي|xҾS| uZ-%+ )˅+vT*M9Cg_z ]w-їb,xv/W\3 *5ǚ) Tw{2&8Ww1M!u9b*.R22/o|tbs+]Z[~W~f۳0duy N^~mP;#o8sŠm wy8N)#_{&ZX^mDK/ F]}k,&AtQxr"[1s ӄnT+#仼$lÆ qlV컸HwtmVUV2C.ü0c 1C٣N}kT,/Ɉ)w- [{=ܳ̊\L n1plrq8;ve? >;umx&TA@nVtqhtRQBҽ@-!J̙]Ɯ;Huw^7Q?pFiO~@lٲ#FQІBJXΝ;ѿMU{2y ί3rˋ#&IH/;Įysj'˺EMK'Ypq8֟/.V4 wvxŦDۜ˳͏17}+8Ufap8rwyyHٰ -ѵe,:2)yfk;nm֭[tQ|7C߾}q(uiCLZ7w<{%Zɑri~o9ܜEՕ;-^>;wF ވ;S˩뵣@; JÉ's0v>t^VwFNв#v9 (z<1bd̹6&9͜[,YMӶY?~{NA^ @F`y{$Lcg/{{/܎=rҨmҦL@ѷ038sFV_$$KԾ?wNH8IxWQѹ駟9@\Hjk17*eh$7iUI@~%R<#(?33꧊MPq?& RLW) hpMBtBßNn6?*sLyDrr2.\|VOa yuaXIяH=*UsTP @Pe@~А >*_ @ h]%&(O\LC lj+  ICݬWH K99>8+y~-[I5nudF!( Z~@C$@$P7 PqR 04OBƲ?!3υ5ZINka[˯hHH&*u^Y* &=-[6I@z fKM& :ҠJ#6ú:(vkݚWw]_ཷS$@U,- @57dG"Gº9k4ho2|W8 @MP @&y&s:]ϕ)\ AdedX **HHЯb?"@" %H߿G kmڴE]#?_> iHH 4 PqzaH˜}ŦF۶mضm4L=ʆ[͹۫=}@y?l87r/7u# :i)"i8:>Շa@Hj pRdl$@$gϞe* J 0L!,|3啓o^Uiꪹ gɒNa9\58 HtL^rLyR`^:**<9q>8h(2iHʙ]rssaUq0^r5]{0X4Xdy-yoY}|SUkS֡uHI9Ϯ נ}T҉mtmv Ƿ.ŋq"3zDz-#vN¤^U _ӔtDiZauA׺ȢxyX} WjX>!)X,5|x)_xhJ2sB]uwah T>z\}3 !2GYÔ2~.{|L?JS—!-Il_Ab)9]yb)k~3`m9Cʾ/ԱdKAjqkO]tD7ӎR]Gcd2vD{SƩ;H|`jb1Wb/)Te^97yZ֝mIMtwG`  'mT`@ @g3мys1s#îmҚZtw]0cuidcsiO; +0k m"9S|Z܇'1򶗊2iooԜҫ p3(1v_m\nOỢHix}@?2ױIϿԭxm-xuOfUr‚,iZ }ZĴUo.w ouVI}?m;XxHZ^2 8g?<̇n(U_=6_wOCoxsYzLWJ Hk9wލLh cEًѻoy̹XlO)mkjR…,x,ՙufQqt3X/V/Sgexʻ%?$@A4* : gΤW>48~$ܯ"g`kpqJ+!Z9Wa(# ÆhU硗ulEMA7wv) -b"}4{샤,. ]*k1\!c||]k^RJ#nSowN}<:}26??}&#|L̒&W4kOJsx1 mqq{죇pyhe]8O\GʎBL_^/DCի0MH5/W_•}0g\6l&u rLU!G{ρ]dP?KDZzOZhۻSTl?r|(Z%%eWY ڟepR\3\:b$W`,eRS%W!~#WRK9Q`7oq,zz =ʔ1Sg~q8/A~2jka׏d0U X}oފGg=f*Rf_@@K38h GCp(哀uSt%.?K>; v|vt? r{ Je%Cզyr%t^w9N08ZPBcQKp鰉6tEcկV(nC&|NYkEpp7&AܳCKk3Vw*ճHi]P]Å-$Fba zFs~.cnӼK?97(JbTo2;J.)6}-pT%RԶ}{\yRrn"_ӈ,+?"B!`@hk4Lq&o#q(@.g}\BKʷ:tLݤ3ꯍ.t.$T1tVUxh;KӐblAfȽ9?$4$z6PА G$Д"=,S)r`>w͇]mǢ/YO 4ƍ{aC*Pę l,=m[:H+m:,}|{q$Q?=9/4G J>n#(&HGQWK==+"2Z [e /\e'Q1`WREFf]q`4pcSk`kT@n|-FM -c]~d4!6|1 k ~$}4\cUGl:75мglZ-atU@Z\+m@=ϝ)vƀF=Yx?2*l}0kNjdj|4R/j䀄]~\cg&;eg0DqbES6΂sKT6̔afcS =@W:3wb$n.¶ h-Rv3!Շ=9|]{Y{Ky8tkt2Ouh\jvII1R9۠ciF,52^'H?2t5 ;q,_GqHwL8-OlƢq{i-q|Q^m`Q%)<L{Lqc?at؛nǭ7\=Cot/JCdt4c%y((2ͩ')\ZJCQ( C-Y(#څ@)/n=%Fܩ3JQ}iȬ`nJRd%|w&H>#G훰a~4QoZ 'bs8p:iGuf %ʢ?'ӳq*`M(;ztq-܂ >(~Hp*%R dڎ!.bx~Yփu&ߠW؁H]r2çq1wxn_7gdڙoc0bE>s%l&N:̟g#6/M]o;c/9{O_lù,Sa ca#WX]8+О9/`}'2|c=p7VL/~ip`'HxYin//߈秾&l;Җt.|ǥ4Ȃ8e9~=K{oBx!2]U-#72qр0ij RR{nvEߛnDsun$[_clRH 䐟\*c1bH[~_"i8OeNyr&βn$v tϗMаy&vn4ȊH!PALtL4rO AeA2`@Hq5(+&cY;hW~hذ!9-S 4;U*WWe5/3t2;:3& Bqp}X;{\wMZt- A.O?qwÄa= ʋ/KNtKQDK/89bfMOoRBug-$"YN1Ucq'EٸFS͵\uOЧ>=خxwudltŸ9X%JC2~ŜS}c_ޖX-JO˶ٙK_0W)+CGY Z([ :n%<7C4',ϵ[rn skyߐb9{>yB$PnVi2i[b2,quw^7S?^3~zndqD̖-[0bĈ*/\#JMyꁙFB6,k8:}]0һ$1~oSb oHeb!><,*Ch)cۙ'vu?:yV1֙m)#V')OņNt4-R!έw18Zd dQjB:=U'Ӎ"W2U)OF "QT&Q˗LG(:`t'3UɦtxrP_-]"+mXټy55[nh0@IDATݺugY|G]A\\uOquƩHϗn!R鉍FRR.׾*طiiOϴ3&_..Aqpw r2d_Q#D6>c22aeﴼ}I;|aݴI+%ꖪyyYɵS$q4A$)8}㬸tWZZ7G2OӇ)JO4hbU2507ӪXY0|sDx͔(cDLbnr(mR_;pqqNDa.Vt(4|:w e/ya'\a5RI齨.z*?ܲܰ7]vk`թSJ ܬYGm:B)П1țj;t9͜[,YMӶY?5rC 'nk6nb5MvkO~湇}>m>>,6ȑftn8CH݈Eoоk6l:j)Mnwc<@#ԡbiω&]+ !luǥYYC C@_FROq禴S墬XRM[ ?w~]hiL:1Y |&Z<}*o ?r4omr9P*Dih$&z=J 8DYKNv5I]*THi<96`mih̹!iO;MØ@ QٚzsEbjN˸\QqroWXLI*NrOːu@>bֽ2]I^,3*&hz(1hx ,IE׌n6 xYz)+>Ş^Vq!Q6MūW Bb1:WL+kMC,, ( Uɣ^қ&H]PRʈ[y2=ʅH~>ࣧdHNN%\//89W^0<^U3BM%im9M[Ùg^|p ٮ5._骛[P !TPexQɫ7܀]-F逊m[ǒEa,v)7WX:-Glq^J$tcvd ܄e|k=5* C7u ÔYx~zW]ͬ)G.>PFzdB9ae!q"gi е k'Lb:DGKW ʀNW̗QתP؍^z1*Sw:AI$P7 ӆ˘smG~ڸy%꧶\FiqHo e{;Vʪ M-˖LE9عs'jJ^:rL_۶M /7'Tr~u}Cݮ=. euJs_Ao$s+y5۱jz*k{<QF4$@KC sF$@$PkMN>Q9wuwkɵ.v6uV74 U[[(,2KI Sęwlj&m_g)ͯXqq*'U$P Pq2 XomK[6pWSApuUK̞[#ՠ1p1׸4Le)fgQeVb-/ͻᖵ0$ `΄@v  ~0ƮھF0&^_5=@ smܫQ`\kwLʊה!]ޜr4@ZÕU#KHpġX3%   Ҳx t`~ Ym%cTR4?FQ  @huT(Fp#>q>HH 1ko\k8mVE#6X b kJPV 8k<:IXdF^$@5K#5˛ "ӰՆfj \ϩ5uٻrյ5iuⲇ-Wze16H4)>ZKe{\zD9:ך$@OC3f uɓ'qa?~u/Zbb"; p-c_/rno*+/L?ooyc;ols9 W/xxa$cHӏH )(ḦiWqa-%wYlc,f%1~w՛8!#cȹ)WavxsͻxS&l<yS%}s<G"sqd\hl_0E8g)C#V)]N&$Pz]P*ƭ8Xʈ4uMC(sqHH+|n)X:sۃ)O~W\}_NF9k{Z<<0EsME_wm?zů~f  %bbE<^bѤa)w|ɟ[)^*ʀ*FS*ƍH"`4\qV\q=5~/rҋV 4;[IE˫c+f>w?ƷC1OܦSF]Ѻ_}WatߖΎ[x MD2)믮oT(ѿ 4"__{vK̔#_u]SjiJ28i}" jA$p$+hH+CbE]ڃsd,. YYvqM%&㒛#zmth}{O+ˠ6_9/b=G-a3ȓ%pY[ HeFC$P1T*ƍH"J-ro xl(1>FDdb͢G0w ſ+vU1E^lC~v)ude[KiӦMįƤ5X?Q#aIu;™۪8TF >%J@ ږĪ 6Th:IG \@qe pD! ]*H#=Mw}|1'sr˝>|E{1ұ[O/ _fCf ܧ'E;ybQ>|A *b$PRH@5K e+Q?=Li|4,x/nKTQ,V='@ͻ1zp87x6@"mJmt[ CY*A)Φ#2: %.]S-ϮdVϮtE !#SlY+ EnL@ҷ}ELSG]|!O>D!R([xOEb>@ΝѠAֵ11Nq|EV%oذ-zn[]v{ vލN:UI>L$͚5{DηˡPȘssmMx"7~znu3 uSnOExxMy8U_WT"ZJ劒F}_\ Rʱ8MiP!qc?KR~é!H 0q~2Yq2az+ .ZHcm[l< w^aZdJDS8I,T"DC@{{$%%Y=U'cMږ?A(-٣DZHѐ T ac Znm-ok.bEE@'lR>Zb  J֭< y7x 8}F>FS@& Bdxo(3 P1n EG>;>Ë$@$P+TAE\\4h$$''I&* R5LPq!Lz胾]vhذaҐ\磨2ǔ h2'N@bb< E8N9!8 kj:M}XCBBB3`t T7*M 4舃6^{ ^{#5_ESt io { ~_!vsN "1eD|ʨ+D]gi)kRnux|w?R X杢}>n H \ Pqךc$pסe>uA8wNR9գ!$S9+qgt2wn"v{>[H\4)3rg_ʯ_E=ebߣQ7 V}hgFyw[@qЏ™p=/xe=Uة445K@ML4##5' T3Ysp0]%>S9Z)+Mg\Yr7`)g^rC*Y^n1R8;E=}yI  PqZc"``WPiPCP8TH RT&U0tZ 5bZ4"P4q bu+_ Ӎ_(*DqHLsR F)0ʃڪ@Ō8 Ulu,W `PWtukUtz(ޭӏts c%(@e l8(k<סݴQמh! ~=Ib9eF|,X[qo'TK0UnL\!p"@!jy-v>rRaѹ)K.P#}RHЗrGQp D~OG8.WXɓh-o!&6N~Zd\p}1"*4< >` 6~ 2~$PY;ˈk҈"^~֊ jBT(Y.ҷ ~8"j)F\;mOOVR@P{*p:Ȩ9я@{2a?4e^?s#=jMDn+u8, MCШ(X_{5odʒR0Ho/es'BpY( V4v?gzپ`w7燾/{+E8]z.ŢUi7qO]A]\NCiԪz_rV#hV 1Ѿ`&Q%O E$@$@5E>S^6pNwgv6 O8 q0vlVW.PJTQSڃ[ij)/؁/_ʑ$@!KCV 3F$@$@~J.Vlu 0 (߽Wih$>=j%TM? $@!4녹"  /.s+@%._0! F Jc}N$f8Y1$@$@ʭҠk/ctj̾:=.NUhH*u.Y  Jޛ[Su -o=جjC~'e#mʴ&ߣҾE?(P\J'K @~h&-   ~pVW797^) q.O;[J뮗}1 N$8D50$@$@$@Pu!Pc>u&nMw2ly^cOg.o0ʓ W6X  OtW!6d}+ *;(kZ&C|R5`O$@IbO,+sM$@$@aE@?H2~:QttCBrp[V& K$P8T?c@$@$@aK@?$ eeDO$&8IE1$@$@@[Y躄2Y݉H~P럥' ae+(kMiI9Ui!|?!7HHB=lmŦJM#rrބۺݦUk!8ߺgIH€}>cY~J.ӖtjMЯNktcZZlZ#?WHH貎E2H$@$t +SжIpCe {ǰ؀iJVT6 O$P38 gB$@$@"(kP5J8Bi`$z@Xd=(?o=šL9 (*HHB.9p<|YI)#Drk L4g!y]+GGMy8=Kɜj)0wq\ڎ@8J']~/z)@=#@šU8K$@Ju+d'&Ys;^P*6_LiG}=˕^xrɜWc7bڎ#/N֨C{O`5&׷݆Gc]?Gs5~G^J˕&腵>'Cηq5ؚxTL]i{nūSZG.ΣuY1~xq[{rW[2ĕǪ_U>o ]UHBn ZF#<@EB*ƙHו+ 0ͣf6aԨTO%Lk@dx+jR<)I!@fs9_U|o;׺B\½s Gk.};ûk+/K }W'o"l+_9;ﲏOڗfͭ0y_sM=NlnFqӎbyꢹBl˪Uvy6'ly {2.=E c٢ˬokfr3.}}j[:\I3M˛.tS;Ϯwm]=uaP[߉KCuVñ!x"[re'vӫh?}i[nΈ^g^s7VE}KOT/[It" "  ~a- .Z`Mh?ٲEzlÂY6#x]#;4ݸn~?DwGټzݯړًޜA, }}Uv͟nNζ[lx!ۯ_y+ħvhXxgg5Smօ߶_܌W|F8\\}9;vp4e.r`rM^eێkáVs/v<}=+mz_O\?,탟CL)WĞޗlz8<]|ַtb6󣟳hGs"i~DFشiͶm6۵kM4ɦNjӦM#8¦O޵K [ҳ{.%M'-Ů}oyLvܓw2S4|c~k;3pmN{-\АYN/dc=tCvd7_ߞɁġeW^a7h K7{_ >_/ c_Ҟxb}o}kk~!{z_!֮]k}xza?yZ^,/Ϟc};mpy__cÞ>1Ǧ5.e۔4_hoWVB̶1k}rE{^lexV:S Ii{1}\b|BX߽P{^;膶ƁCVaƍO|:AxI8T CadkV@o+⇢-vӭڭM7j\vRZgpo2^Gzo?_;BF5 ?fi}Ͳ|n"KS/uue_7nJrGn/ifrJKA>P-m:8 J` kaK2Ewk6^z+l6k5aۋ19\¸q.UKj:[mY}I{gۇn.shۍ_{#> l9ӳzW5أk]iW>Xa5ptr3+W^0V~Gcꬿܙf+~V2|'aϷkqXuۚG_is4g9h; [lW}v]x>y,TaQ3}~aMڦԖ/^i:?ڽ7\eXؖXmWN1{ebgEeqn,R5o\(q-\~=WPt+톾{^®Zp]Q 2aTK-׆zvjޅ7o-^u@]ƏdU㦝-i]Mevyp5Wغ?}kW-˯ZdmG4>|z]:!4X.·ٜާ>[{dܸ ߸1 ܾ–kg|y2d\L[P- kplOlw;~кLߞoLg{f{;I鳟u]א:ԣkVy-*F"5E&IDATk>z,y_6}y1X1P?tĒ9nٲ*҇>OCo"0F ?_t/z[bTH[{p6˃Ʀg&M~}hn9ys{av{l7LvĽckL~gTmx;8wC=i~-Ǟ9f+՞};5r]5{sΠW~aj~8e˖wa?y&F~o:5?x& D38#bW.9 ~…J S>C=a=dޅ2|)+˅#ޗ%c{-" " ]L`Bo80 .Pqz%&=ܷ) =k(n{p/e-{cYO/߸6Pewoi'|r B:x3fd C~%l" " " "0& l HphK%s?1tpo(Gw~ Uطo}[~fyZ0Ycx P~;jYi]w57A%y7i'N4H;ﴧzʮwg4޽;dv睔+T6!9D@D@D@4g`؇?C˩<13gNp>i /|t}*^1۷oB==G=4^q;uJ*Y6'oJN1K??ϩ=ܓzM_#rc0޸aWl,7%%pGg3d_xsf||Aph ?#Gg Pobܲ?Əo'tRǏ7!2{6l`/͚5+PIć7ߜ/aMS@w_o8IvڕJK/eԣ5,Y'CkN=Tvs16}t[nM6ƍl9sfz!CE{)goŊҬ~A}/؛f!" " " m"?ަtGګjo]~m7*X: 6m|+ TlCEp|)>7_D@D@D@A\|J oOżv̩C#CE~x]ј7o^=WE}͔V7땊7럪OD@D@D@M@v\?*n*U֤Joeڻwo\Hbiٙ-R C9$wXnAH9Z}Bflͯ>HsN{w[?jtp-BRewT(r2D@D@(| ӱ6~dC SLi(¦CSDJ a}Hל" "0z 0upCi(x\Xj+7-?:ݿT&u.o8~1(!" " "}vS}tpSOnVF:lџi" "0,G%}SC5nvW,W6Ke@>N86nhZz,"" "0 # U oO«?Fu:8? U*ͤ~1d& )" " "0tp̆B[@uS@{ DD@D@D@D@]ha" " " " "=tpB+%C>5ZtJD@D@D@D@Dk еO&" " " " C@y.Z:8tS@ V"" " " "$ϋh{ɘt߃R|!S#ϟ_7 yE@D@D@D@D`8 SS~T,=B7H_ Lkh#{!Rp:uyk|+" " " "06 3:qp[pϊɬ02jE@D@D@D@D @,ڛ2ת=щyN,7PM^P~ zZ-hHͫm].*ol_ko6lxmHD@D@D@D@1W\AxJF~J_JT(ւ\> S/S:{ׯ߷iӦzzzr!>&*6o޼e͚5O/_o.CqG6}>?}nhQMKёvsA 6CXDc.YsǃwCpmyք"h3q>8sp%nn7rnxnSbW6@Zb) rBR:BȻTb}E69/U[^5" " " " 6^B/sq2A LK_*R]ՃCbQ܌-8NS1078\'6|ŀIt'o% {l9>>eRv\n"uȻ9}~R25D@D@D@D@߷Qz~S26mH?>qn3?m:8R.:'zu/X/yDѽ0_RD@D@D@D` `Ax_HCk$Ob_'|>F=%ѫՃ1Mt>Ƽ:/B6u/NoS? <$0Kc e z80uJ`7$ysx?t g`ʹ}Z=u6l1!X#L61 ǁ . . !BK(e+~-ԑ|l7O ?to`>l<4pNHx@uht2^B ^g(Ɯ*kD-KG}(:8`A~ytJ<!$GzxZI~P:z6/iCGXlߊ  _[ 7f^ hxS1 יK '|b8,P5d.}<(e^̯^tT,!vp6C=XG?%ÀY 7^\À~H>ƠcOң@ u`}ȧ?W$SsXς9 yCe$M|[dX?|CrA!E_ڈs^SEC5K" " " " &g^:l\6uƑ2:s\U}ɸ㼔 _MGC&@l ::^E:F>>)CdÇA k!" " " "y~ECova輼=C)hCY\U$7|O+C98čFcQdz6}t<1C~uu:!ySq`/ڒ" " " " %b>B|v,\:?uP@ 9ޮEj13>1H NYͳ #BGuOI |uH o{=/?uDrp⸹.(27:/<1Xlxp<(P"a-}d{5zԃ@G `ƑҹGd67F+:mJRXr|͋W98 jX8P1$}|^@=~'?D01^)k$jc@g `/A=%|iCrH?י~c DS/Ń}b%{,hs\6Λb/جH7A9h#:$F,k^=0~ڱ1/c6~(h3X5kzp`3,g걌s}1Ç :eʇD:?x=9SW\ Xςz(8SWl7)>^̇}u/cF,/KЮC k^|xX\9>"?cԙm#%~%xl#x\ƘcU{1y2F;ucO|HXX5`cp-[t(`.PË~k=tm)>{Z%vJ҇|ަ/%}<=z@}GՃo7C95'uh{d~(;QĈe[{dtq羒JĩCuTue}.%|sLAfu^ sۿ@yя6@>9/⬧~aP֬ǢXc,2oQ":m^"{Fv| S:s҆:〟:%^|^ e>GERu?1.hG|x@ |c= S:}" " " " #=M_J{LH!΋=hǵ!~`/b> 1h״Cf!ccpH#>>!q(NIlb 1}eIyJ+_$(X@Iԑcx}:>|=G̯:}4:" " " " #^nj!q6%C:O_lA}ؗSc0f <2>੠zp6E9\4z<^g|l#5N<ڜ yWekdO/#5o(󤋀#}b*;H2Hr_)ai3~)̅s0Z=8 LͰי}^q8$``7ޏ\Ç 碆{I?$ " " " "0":%D2}C=&u/gŅ%Z}^gyr(n|.qǃqC&! ?7؟>_ K]CD@D@D@D{='Xbψ?ئD?5<^g>9^oȲ,2K,>qawЏ\ Ĩl@RaI].mIྐxzJztC!u!1 ~5` u/v nǒ9AO SFtoU`6y1a0N=%@S>:myqomꐌC7%s˚wOZ&muskns* ^g c`G{!߯6/QĠ]gYD@D@D@D@FX׹&^dru9GSf.Pmo| ;G1nю~X~nQ}~8bS:%^gdXt^R9̥,1K8}>t?wYǼf6ren.Ѧ"vgI}!y@=: NП}Sq$E@D@D@D@:G c&KQ qO1 `cПwP~Rz>1/iƷ!PˆklNx:)x8/}N.~3%> <Cu^w+B5xR8,L{юvdCcr駌{<=VRD@D@D@D` doX%b:~"?sbոƽR<k eoU*lq~0LD?>!~%` mI!PgÊ|:׹rZyyv缬KI㱿-v"k#6%ka㞱z;=G.(:c$=t@D)!gf6Ĺ76xtnv2AG+q)sS:kp?|{uPt?|C/ŹE@D@D@D@Nh3~bloq'}o̭YT kKvmlS}b_:m6o6Ou}'s|H~" " " " K \svӑXsG?/O"(x?cfTrAROρۜǘGM+c2֙O祏(I( 1/\SG:$uiX|H O; ?Gikc'}N씏7$T xX܏@w(9^Ў%T'{y}:d8s^RgN^_ˣ%Mn_k(qS{0̡dω}>y)c" " " " Goֹ:zQ<ΣMZ)c?mH Qz_1%oQT,y:%ocyQH,1zuQnɩ'KL q5<=z,6$c{=eLjk Lb_)v,~X1&)" " " "}R۸ OɻMk)yNm|y)ys);!>Jcs}|" " " " #K ޜVs\NHbg8^Ϻe'7y[ǹ)yyvGK|It/&<X<t~E-5y=91R9qx?Q6/-" " " "P@Ms^^q3GY69>^Ym9X/c>e}87ʋşW PE1,)^RD@D@D@Dmb:k!gϼ~E|y9(29:Z>" " " " C#0 u8'ZsڢЖ.5).ʩ[eQv_D@D@D@D` m֋VI|x3mʦ]YP㼗>E1K~E񢘿fyCcf=zڦ6Zܪu^t2ur=Vr}ݐn2erbxUjE@D@D@D@?U6ejf+ir+kj%Zσݮ>y,vm[J~+wյj}OA`V[ʣe\uUtP@9ޔW_]!k4n|۵viӠ" " " " @63,pp3,O& pSv*fxv>%" " " "927cSϽ|" " " " C#ph]D'4yE@D@D@D`Sh" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "Э?V%!G.IENDB`davmail-6.3.0/src/site/resources/images/osx/osx-caldav-account-create-caldav.png0100644 0000000 0000000 00000370242 12564151555 026422 0ustar000000000 0000000 PNG  IHDRtt^ iCCPICC ProfileH Wy\S>,]oad **ԅ!wki."T j H]QV^E ZTZ\pC ^{w93s ;QPp=bJΝåPAM ,USRW#/ZhER!Db < vU L (@$.$űd3 @)( Xs˄H(KRqcl2V"#1F! OɗF!s+$Yc62i1eiQ_R! yRgRJL5hr%DмiNՑR B2CEmp5ob! *zR(@2 (U~U[R)XZD6\IA$Z ! łB FQ:oE=5ȏDR'ԌV,(Ql>ەmȦ-h##D+#1Bch:yyxyOx;T9hD(ʕG*17N.0 { )fBy;rPE&^qh]mhsezE w_0sŪ5X k¾a'X7 և `ϱw83qCw'8Ox> +Zߋ'sU@Ƅ ND2CJbQE D3Nt^ Bp(\;XJEHEY@YN4RZ(()}AG*jAuRSJj u' 4*FҲiʹ}n=N7уt]Eo_hhYkyjEkhɵhh:uIְvvH\{v }#(d,f2=:::::St:tju9ӧiteF01]_/X,#+RVX'YwXov[^Ȯg/j:ugVнDO[Q/BO@^u!}~~rg  DK 4!8v)g4ߐfdgXhXmyA##oL9FFGz cG8cJ׌ߙXM&LM.6gf*62gz,ʬlYms[O?g8.hp\ոnZs-[tY YZYX*,7Z|belfUhՀ5:Zj#ϕqk666jm6mml3lmǰ˷[ga7homd?~MmN׎NY;:>t2uspru|ŅR+*qwI6u/0;ӝ^ǽo K&Nx:~b;'~d[K<={z ==xzy=v{oIܧ烯ҷw/ouCg  T#=(hwINēvLl, *7&Tz7.L3߅_ W 1?x$Yy> *#.NmtA1c cY ǟJ`&%%MtMT&'IIkz&;LOnMɷSRf06%eJR;8i3vJO_~+9Cё9-)uVd֚ީΟz.<[ݖCٙ3I'?3rڵNL?;|lƑ33Rsrw$ Cyqy Ǣ0:р8XF ?8MÂPI4BZ'}V[uQrѮYl_Vqn!H~ĪdNIMQ8kAerg)V:Me6]jgg꾲73g?G>ܵ|Y芯R v̳x^|m y :-\Q̢ŌE^[fO>m_jt{|]y[|!2e}UTͫ~\/=rdE+}WnYE[%_umu5k*[ew]պg?[]uczCombmF6]߷bӲM76_yメ~uc[̶džeM;wVK1T_Sn+{{N{oښݛ3W-|w]۟tsk)oleu?~ ?:lsёGG9Vql'uur+::<]y-.] =K'.G^JܕsW'_qi{onyً]/_v yUju7ovz`x{.?&|)Q^@OpjF-),,|/O Ęhkrgd#}-U## ##Nqy@1_Z%Lm%iTXtXML:com.adobe.xmp 782 628 $@IDATxgY}3d̤IJB3@0\a&(VsTV*,"6vYi. ,H H -I2a&Le9Y_|hnojVVVVVVVV{D*4] :Q~p_m|~&?ǶZrHNZZZZZZZZ L?X͉js@ay"KNƣӫjjjjjjjj L`>tƒjMD77y OtWnG3LkjjjjjjjP>,|,k,9F{s4(Z/^ <|Vy@@@@@@@W{^&L٫s}O~:SMݫe'oSq@@@@@@@U`t۹dg9 y+V?Rdw4dW\+P+P+P+P+P+P+P+pUALGٓt,ڎcg;Vdz(T?EʻmFÓ_  L`ݵ鶻g饯 <)Xlk[l|3_qZZZZZZZZֽx ]ݬ__lum+u Q?wl ׫+Oynxt~kjjjjjjj}+ﰝ:V'u'n8泗^tQ]lg]exY_^毗mimn=y~<@/.Qvps<:ʕt^~~Kw221Lj-wӵ.mӏˣX۬e]zU\+P+P+P+P+P+P+P+pUA:2m'-d>m1o 'μFaO/O yo;uiKSiq/^gtW\+P+P+P+P+P+P+P+TA]zb^<K?v?=O?vҽڽxAX ^?X? t3r;쫗 |e_P>]?Ǎqv{/@wۆ2u&6c`O7ZYwiuv+/O:f^NFJ <u&Gg=u\>^^^ɔ7CrLxƅ=,KR/]hmdY. g^6<\sꪗyBʴg=y k֬mk900 CUmnk]/`pWv69SL{7i|tcɳ\˯<`y.z8˥Y&}6]:Jc h߶~"n}Kjcհujk gӋ]=]\d  o-襗8^ -d^g;֧_M;~yhVܫzYG?x uOӭ5;~ 6ۗ,]gpUWR֔ kv/YIv#`F8v/1({wy݋7F/Rop__=C.޵kqcCN 8lK'v]čr#4xM[^?|iWXƟ !w^>dvby8]>Yۿ'oݭWi5M x\/, ty[V{6yP=Qip]TΉ |v냶4Xч, (7NOOM7n?^Λ7#bإVc?Z;˺tv?1adS}eau:_Y'ٜ]hO;qY기\0mkd5n?@1f:-KK92uh+g|G\Rz:r+Wlzxuuls|i0?l 3Q/_uF[:wmzen|;'n\}GSu*,c[s3?ԁԣ\#O,^]Tsztz6Mח2iry~Yz{hi|c"d ` ítDuey_zj_YO`t/e9t>+8l@ nA:a@dڃe]x@?vW7~˧q! _>yqe(g}tz]?='du1Yy^>SzhI@,P)؍Y^NoϹȳo 2|hȍv d6yQ[n|cd?땫5 n_c~ t

k͡[d~]WO<\ug~1w?XG5Wu'[?r>Lp {zwgġ:[_00͕zxsy367z}GPWS2}цg0Ӧ^Cb/tr ^/_Ӿtui+>2#c m}8f=ǜl;o^u[KX>84Ƶrp'<(.?۠~/=}ѕF?? "ϐcI[ C'KO66uٓ[z"Um{n/S_,?".fc5ɵd4Ql@wCSAܶl!FW֥m\3`mJ֕CX =~Mm$G4'@MBƢ#1q|ȴ:hӛҽ!8aqȤo۱yx ^[MCrd˗/믿>o5rȚ/~(vx/_G=%1}b vXcL\27᡻MGx0Ɣ^_O].bX>7сW[mIѾ|lc6pCFʎ~+go`eXLȶٯ4z.x˶a#Xuh[Slu߼=n>zGS1NJ|,f S4> XheC(oW~3oMb~㭼3##/8.;jvA1;g?1?2{Ftnγwd/3Fcоk]e~??~9d>T?q\\F#cg_)^,_uG:Z30qrۚw~iiyA( \t(]soW[it3N֟~}M&IO.dZ2S_Z=sg&sC;NMp~4.0pmx6l{lb}w~5^cYg Ŷ%WƞƂ3й;_nxt?;$ƛ8J, CжiC#{|gy ڢ9|_xҹ9Gm [l ^X9?_;|mn,hWsM]du8tJ qdt⺫%VmY+MiӖF!luncT?eʖ_U{cbnb}.xL r~X\uoZV1c, <.x1ϴ:gߴ?2\I^VZ~B卅'ls qT~ Y֗W`Am#gq@l.tQ8cbxԶ4,;v42t /l6d<891oΌص䮘2>޹=voZyM.͋k"+v2m+scU [h5ۨ+c\yG7zm6Of]:ȴ':2xΝMȹht-1=}@gy櫇;1.:'|(yer4όV|`ƿ{˝q~*v|=q͒7Ö~ͱE8kx[U$Vz/هN?}{cO G;qeǮ;q9K7_hn\W_~g*6%sxGƶ>ѕe"szU^smϊƥ~]G.n#/xM><[;x߇0,oO['7> xbw=UK/KoǯcQJ|[/i{d oc7_XY~KM}oǙ5Cz;m/=k3]C`7ѮSgwl]7 < MuL ^{3jit+dczdNBvٞ0ngP/t֗670m/.mAJy2Ysë| ō.2.h:޺qI1+bjl)7ĔkZ> mKkW\eIJ ֏sS.%/m@_`/.4<2'K~+_;|3|.sߍ+:bl `/mh.s6m3L^C?hvCcac=_j1Py)H36[Oqſz_ba#`Sxb 1Xxcvsx|]WO%6V4r~K|>ug?7ǍGXxeoxv/~WĕW6<7}KqOZ?yUq1bp/7WOx_\#z~g1şO~w{7[ƮiĖU[y9T?O>w낑4=ڻώw|C#^qQtǘ9_iy=rX'0W3C~]b}gcS`/mh.s6m3m|x<X訫oyX'o֢w =Zfx^j[ .4._n7 NAÜ|Q-Ok!їw}x,l..o:fjU1cF1le34ysbY oj6:KO6"^'?ϼ͙63m?xj6'zjOK] g_1϶WAF7_miN]c-F7.m.32|I<;19$GW0{yph/Gl+Oû~8e ƶScẘ.:/.ryWN兦rZ}H^==.}sbpx#'7س3//B]7xS\rEqeǚEJ Gwi:%?XcҗW>37N}9qi@IZwo+>y8&Nܺ!^~ֻ⟮^SNCgG͙Sta4wJlmxw'\]8Tྛ-8'??~\X M)'"w{}>?N?b8s㨢g,Yd){,'1x5Ah.5Et<9ue!_07aƦE[n%O]\g~PK=<;19$GWżi{>;+C|"uhGҦ>#c ݑE7g?4V㑫14W{xtQ-28lBL8%'o)Q*\+,j?m|qaw=kbCbk!?Yޣ65w 0ȅö98M~ٸ?!9/|8(C\;}x/my/htpf_Տ/Va ackmtu$/]#,8u7f6\ꢞߎg74u~־kSywמQ)6n)6c[+=eoݶ,n]_;5x.ߙg<Pع]e'##gĆ[iqGbKgwM3Ay`f߼=:1 L+9l-[9Z޵(m.L;nHkۯBYe*8쌅eF&Ymc%g`%ymL;GbMX~xdZjWs>9H=ٛʳDw m/qO=xxƦ۩oݳ;okczo+y{~g|[w=Op|Z4OW׋EooԚQ+y_ sH=ҽ .x]ht?n͵crQ;YWuv?y_>ƿE; >n7dž GF߶P.V/Ox4d%\mhfR'94򨣎j>T<<(o s1@xQ^quM0Vdg/7)j8 |\(n'? K.˹~5 f,gڀѧƏї9Ə<<`>`KmyqcO?XEӇ]Gb;?1o=ZʃA 1|kϙ37.dP}Mݻ77>wi.(V9ԳqO%eĶ8%yV_f} DS'{΍qL|ꚻc ;)˃ReXfgrL7˯$}o`-81w7K{[Ѓ>L9*~=oo~?.ߡm?Eܶ#7?M g Iu`elD m}iobc1-Fɱ^.9ۛgfmo(@92.uݐхqG[>t2KGgƄ$x(!/e\߮e۱;Xxoo]Ozz\V_}Yl|dMzMr8<ܭ;/Y?tEV^~q͞{ߍowK2GK8//}SP}J}.tmrKyKiySoОi Lڔ޵':A[g cߎ5['t _\< J4{a\%(ϟc`Eg錡%  \УO9</9hb!ӗigr\.|g?ٯ:7mhw$O`sg`ԘR^oơlWKO+ ͜,^̧'k^rJ7w=>gowf"N_4_nM9U&|yQM)31+v wo{eyqJ$~x~=W@߼|\xYifΒqOuqų_˻_l;_gn;>~/x;Stގ_Q\K[-vu}]ϝ;l)G_?}>t޸oKnbny7azZVpVO~Ώ_ߊշs??8Uۯofy/L>zh݄0nlK-xh/Oog26xbeh^-EGO܋-!}QGU{3jw8psk׮m>Ư)O8PӶ{iEw%vl]W^ٻ!֮%6_{ɱ ⨅Ĵ6ߟȹohdߝ`C~9hKOؾ4JC̋fmkl ks }_3mZ[sn9\3vk|trl{C<1#1vm5/ ,߁S?pl,Gn^{ca b3U~̷)3aL1s6}| hf_07vnXnj1({҂>˴ǡמ7-oc=;-2kU>nKycpF~Ĝ^b-_ޱ~7co[|F?=,1%w6*}/?0men´ݛb{[{5KYSP|̙Lʃԩscִ~CC ҷ]]nj;bO;64qđb5a{Ï*ߑ({|t#f:oZwQioS%x3OsPۮakFij  -܎ǘ3mbA!3GhJF_ml{C8'>r= 8x9G5v\5E7#;gڎA2sԷgش ‡2069xcCG>EW|.W{P)](E4^t/*~,  h= )~33#y`+N/Oyօ3뮿wAI-_S ΫS80;Od}cN[?/xK9 JO)!'G2[q䫏.bF6 `xYC>X:j?ݜr[8@΄߷(7εɎ?jǟ8/5#7ffO!M0.: :M1)&Gx\&\D`G>9&-AÅ/lI.s> qa<|Y>`>gl9>Z;d @QX0 6xwe>#>>i Xꁁn-'&h0wH]d\ߜ3sΎX~S?blǟ:3Fƿ™%dO5#rnc*~^ʊR33->}럇uQa?<9l]/G|e~c hl Ϝy[]d\j^Sq+3`?c0VuGw-Xku SZvٟ_k!q7oe +pYmGxY^Qa{"Xcc)wum{ɷmsKܥe>wܖw`Н, :@IA3y<`ן~sN4'ur6]<Ç[<+@Ͼ<0W]6'!miK<12hc" 2/mAwzb ן~,TǿYXS.:uӇ'?-c8fA:,Nh8~usơ&ƟvGLXZ-*6-ct1X[v @!:-k'oL<1wLn"WGz,AcyN01xC;s2\2h"7&<'+4|lL\_"ƎWs|l>ʋ Z> 12@9_bdat1r ;'iC?|uc~\fnr9?mƀd`\o֦]%05SZz${.8M6% -!Gi%ہ^͸K_H 78&^>& ћ|VȻ ,m P?B9V\x A{F>z`}ևə88Tg,쵁G\]'@c=@WP^!ZxzR?%=h0ևv5뿮4Dz9 #VA} ʀw hw-Gm|Y=iZ+G/| .?c`id3vc0#F H8MJ>Ly  5hΜ9q9jdȑcV^]Ҧ937NS>r UG.mt~e}}B?Y=c}G4`; =q`1A.c_ѯT+mɇׅw}e߽,j|2ʉoŊq뭷ƥ^/| (?N.m]Lȕ;Q<}?|1ׯ_n!?± w>E/3.>weWۼx1.7/oą^Gy|R:yi/vchXw&m~X3F]@=?ڠg, g޴S ж6>'lMr CsW\?bWlc ~u;YdU|zXGpƃ&kBD*~ۼys3w}wz͋+%6pFZn9C<ёFUƾ_0z]76&@my/.60/*mI%\w^|CG7:3\K֋>~i?es(!i}˿2e^tY >@\3m1r^  Jmj髥t71/.>[1Mǯy@sa05rх<7_GXGg]壏=2}~1.z_c"wLgOOtT_\u3ԅu; <4{͋7֏U؟ 0xASNig{キyx]%\s*K{㡭rBQ>zz&8$vBʺmw/6o(0ذy/x7}h{xhzlr-ͫն}?Zͽ7.\]w]'߀'zg93Wecy'.^ t֓.e[͇v褓N~ͼ&:4zA#g]{(8+}|q O:>ds,nc֡vsmV/eq#LLЧͣ~HMkc5?ƍGjhϼ^^w6j&Q/|웏|u]Gϝ;w%ڳYQrsF, βʊ=6z3X=8@ܶF]lNAbb3p-*^w"xzܤ1v9uu!74Ur&J?'tFqþ)DžJgLS3拠mnd!^a~Uh COo-4q][hk or>[ {mcѶƥ`V́X`M!#l 'Cfu;\-r sBxcA.8?mdx!t뫼|il~d;V ?@Ґ^˗G?υ ?Trqd`vݽ%/[3:1 [ӷ>iCs1_z <,/[v%@IDATusŇ~CtN|GsyLn6QƏ>3qd.9m@ډ?P]}BNl98\642hlؒ1:pKs9cN9]`k 8'0uC\:v $^ǃ=^k֬ŋ# [ǐ9 }x`_`zQ{3&o4崱`cmca̼Kc'6~k}G& R׸}eu]96-)X9uGrqu8yݠg۵OF[;;|ߙ/5GM>FB`}>SLJ?sCL=xOm_ccloq{b8rFm&3yc'. SwXn0Vtw,zaƱ`J1cZk7ez^Č2񓁘~ ye-.6aeq#U 42hI6z ̃8xLJ: ?x^1j؈abel <Z#r:u+<<2ss[AZsmp-Kw2Zh4ΆC&/Ahv^1zB؈7mz7'u]e%~ /"|/kKEZT9|c1,Y/@y/" I% V^Fyʺ@>x1c!_ǔW8;cg0Pg >x /4|󠭮| 0eRDzWK7 gQ-|Oݱٳ{gێ~r-<e軁Yy>}NؠC~8s15xo_<@1-}^ڂ|#=|119t#_mZ`mNж.?32T>ıw|z:~A_<8rcg=YC(xPx3@:JNZVyyxp?X?K;Q ]?MdD]Qiy{luz(f^mxSo<= @(~zYih#_FAAFMĬ,898Nxm+Y_6fWǘMC oA@†}'cFqq 6mcG2?tџ1 voBGlwraw" O?JpMߵ6kqwVq/ٽuU|뺯ĭnl?n랕q9~ε|Tьўv:ac]G qկ2C 1axth ܆>yj {hrsFOgqPPn)67sGG>-:;<і ELS>qs_αs]?Uc|qj;ׁ4Ⱦҽp/9'vi-֦,k:_;噗itrvVWyn `xn漒氐.Ha"?fv"yЏ7 ;V.;>Ż<@0^yu'// &W7o8u)qqy9q\P9w6v}!O{3c7>qƫ/>ezy>:ǵ?K#kw/m㞥<֟'΍x|0,+{ǝ8yq9GQ{o+=May)cL͚hr^?V֖6SWhC6c8v=:\94ش k}y_𕉑I/p7|X?dB1hc6#H~ֿ9tW/9;.j`Oky9o߾PżqCS>:s2@r[kO^ŵѸwֺṓ 70bmh˓lFO]_O}Ii]^nC{Oθ(ybd0D`ĀǍM J72+X _=n~ȝ򘬼 '7|s/? WK#}R :_gV<_\w>uk9g]TǰʳOǬS[+C6l6-egS,O7}ύsO?=,]k,_K]e7ǝ/96v_k޴xh@\c~^rb9G(}/6%Á'-((|Tuʵ0ב򠭙 c90Ĥ.> os97 4>ظ蓟yص9V>qy~.+?.(ؼbu.}ڰ0#N^+ccl[wN+|IS1e8dpqX&,?|Əƅ_(?ȴMqX8gGքݻDz17Sfw-^g?ĥ<,7BPdkocXxFc%臏Ȭs:R.rxșwg]tk^07Gm@OsM#SֿzCƔ)53x~,ؗb˦-s>6ǖ|4{wx%M|8{o|dh?7}سcJbʝ wŬEϏi;FƋOٱ2XS~1)هO/#elgMGn{xhˉqTq(|=ǒJ=%{/odw?rO@?ipу9xؠ툃 %K?`ԭŎ>I= c.[c䇜 ;.h|Cxet6@_ڹ=1 ?;`ͅ=/l ;uf\:S/֯k36lh`NP}?7#aۚNJ+ L;yy/[7qjL3wyA k:#}eyk:0${wN/Y.=wapoP`o^.=<`C<<07p^zuC &R&aGNlxy@ |!WSE?Y`ѣ_O r69!C)ޛômxPc@SŮzSXw~Θ{񢘽{],ΝE~B<|hXzCduF>!>.M76Ŵ8Cb1;X~IџO=|ĩ|$ij{=q/K&T$Qr+6y5  ڂodua.8YuЕ[YX<ꠇZ =>e 9 Op~y=z拾qѯ||_O.\+&:3> |x\>la# WjAm<:uGs1Ϩ5̵K僳2ڹ 1\.0 O?zၟDU%|/e]|Qj&Y&s5gFl8TQUSwdT{Ï?x4uN^rx^Yo,nA2\lzެm; D8 It>>tOy`~BWZx`DF|tۗcOc}ߍ,qJyΘg?E|h֒bgN{ǐR>7}~)n?2M.ʯ$M߼66*H0f 9g{ǙvLYޝ[-,l)y#mj馘1}CH;M?ff|/>XX&Ow}=|0_s|x~r=< Ot.:ؘCW?ELdu3o69$5xg8 CyhD+;oh$'1itcwǒwX=8t|/ߕҗmu3a 1)<6'of lJ8xE/jw}C$'|r ]`6>8&>:`s;Ⴡ쇶s8~򝋝_jny8Z]~upZ{[W+76ʋ"^`l޹)֔w+ij˻ nC|7|92^WmDzUcYD^8< |`EcÃyn>;S6Cqq+^˖>UmkܦΏ8>+7YKl%׉zR?=m!zʬX`vX`=lx\>z7yenտ|c1V:{{Ȉ5E;`.ګ}vsǹenqS3ey:Į)s6UhiS~ _3h?K/w|x>P]V`"`=F}r5c>{vQmu^Nn!%=\^KgYcvAAnL2}xڲcV)HYki68l؂ 7 Wvș~b 4rmݸril(LF_"viUލ^i禕[bڸ6"o?YE l}8omK?/gL%2Ǐ_RZv߽MXr_G.w%uƆҖorma/`ǖJ{W=jf3 \ r~?xK i?<<r60rj:@+w}wuYLxG_|:OEj]y #u56osh7V!ˇL$?2Cց^n\>8d`,;^+~2KG^u29ydb𪡇'{!g!6\ڣO}2DG0m ׃|iW=~/q0Rf>w8rD<@;Qq?rVb Pz޴Ea}g9`NP_*t_cG|DGm`R7ڼGOl-vW=>q-`]+rk?.:9m\'xȱ.6r`9no|5?R[kM-#yuw]Mve˖1& l*};l{X ެZ 2,qd9M&Y ~x\ܴ<? /~vxH~YcmY&yck r1:iC{fhe/b~̍x>|0 IЎ?зd}b}2`#s 0;]Tp<rK#c|'z~I?a:3IE[>O`x9 ^x&VWݯYA-bD2%L@QtLԟh$E'c$ub!` ,"k{} ;TuWuN:unݺԩE4Qq(:%KxLQt]K0 VGU0rkx+'pfѡ[ҔϜ[`VY'_e~+_$(,gT~'qߓN:)^BK)ª,;*#|2 ^` `6`oY,dt)x2,l>9Mi*Oaeo VJ7>X :\3ʫr#<{KaUե£<t9V_">EMyOU~Vm4Y?O377~~xnG%}4, g<הs]U>]kNguнH >F պkS,G1Rڞ9aF 0r܅~5U{"znֲe\#1׽ rW|45B9uay n)>WXq4ݪsή"ak%ir~׶!8eeҬL4gu0>[ٖ?X~+]N+X^)ѩN味%894OGaK{T% ^ Fa*K`&K8t|Z(8;mFEs7*'ʔma-\rU(psU>R~ZpXDG"ׄѭth.\+p()QX| Wi`-Mp+ P;=ػ!_mSicq459ũ}T]JWU 2_nyNS<4U‰XSXiG WSn/'9jQYJץt͆h|h4c.ץt+O8zJ3V?㣕#rS|7_tѣ< FʑoW.9h/zx!89PJ3j[[+OX>aYLxTe 3iOUVƤ@NGFQ߾}q駻FjN15<9~1A*!۽`18KRye ¡P ) ʯ ?(v{IneXX*|)N7ڍ_o0J׳08ؽYde9cpv/\N,#8$4N# T5<-}`t Ξl^aʼn.i ޜ콰8!\Go4Yjgrٞ`ny6x_x_gJqnxkpw%8oTV0:(N[[˿\}x$?^wLa}~gڻma9{uoﶕ~WNeȉ&S uOSUVK&8AakM1zE`^ 89Yktip˱{6?u~ KN3SXNF-x9I3/:`w mzSw8 1`0{[D1ARcFeUj $t) CgBZe+50pyetY{1T(,$p Z5^Fp%m(`Fu)]N0a&rt?7[(^rt/'EhxI­KqLg$vcU^+ Š/x{֪kWT6 Ceʑ?6^^_䬾ct ],ߔKO#'x:iR.%*]0{KXthTX+)vg|~9I֟ ^~08Ccu00. Cytx7Ѡx嗳`E9֥8&]{7W0{=a`hAx VV!_iweYcFFEQY'_iQp% 50~^L*3|O`Gpoku6:fʫx9oKpN:7z+rO_mFmſW_FA3 [?-ۣvn3xkGt߿cpӔljiAaLD|AY?~?tfcL"U$1`;LK!AT5 h*̈́8 Fysֽ!7ʣtmP+8%zQ×hm¥KaKe)l^x+^tYYAirgt NrxExp9n'n V1/\&Kiɉv+_Jcy[(NMɰxi0_e)=쬮m׽he8^`-?Z3jkrj֦ +޿u#.UQۑ~`_)Ꚁ.w){pu/gk!v z0N%)>|oq& O KT+l0[ 8&2)+>j&tZGMucy0ް)\r*1=a{)x*Op)= cq{<8ko xa*} L`W0-F[T.VCprS~ { ,:v>xZ=yX+]y+17_}_];u$~?^7*l.U [d79epX~uomg:2^EC%a`,lo7vI(4Rg8D?&~Mgi8+2؋x  RJSʐ3XH oŠ[.3\VpkNK:z FS/Z-N[GfVOrF x WX݌.rFS4UD> oV/zV|]Y=篾&Xo1o~Ň۰?vPSL< #۷MmۤC5Vh‰~  {%YifE%F\y|8 %F;YDl2TX1|e<<;Hp+_O̅vڹ-K[XQ8* n[o>!䀔̚!eAg){999p8^)M8Ter<<.JÁD̶`>[aJŗC/ssH%]RdmP8`$z|]8˓89`So}B;ρ) ڠA0ss8|5sMO̢IGZat<<<I,hxxXxc8dؔ`іCF/ss&S`f},ρ{`\)4)JI|80AeHAPd|$.x9WS}s )Ѽ02_}ρCSk C}‰!$99p8Ds)8Ha8Y4r=<<⠚(qs8|ʁR>fi8BY99pr m/FrM2ZFfT_S-;q*;*qBkH䀟ȑCpoSVo(ƌ9(L> }Om(u) eI0Ł5Ƈ( ҠK E@^a5Sб{ l(mh-.%ڼHW9rJxy^нo. I)q7M&UT*9yJB%櫦aәR(4$HGj䕇.?mj۵:@њ݋3x F #[~9Z [<88C) o_̅ЭYpx ^~Aօ.|N$a$t8㒣p\EҲ49o߁݀f9hۥ%eU+6Noj*+";0jPrD|́ES쉬d/k8M~.~{|p84tcjfZ6WvNq 碍u ,v7vY|/ڸjng'wr|Ws 8+-|i ~N%U\+MB.--,*EsEx}8LzyŁCy8a*[]/Б_ O( OFĂq)\ pabǁKŔIObcy~52)Fyi7АOCSKKKQy{*+P>`}77o˸ڲZ?'D$%ceeoZ{11.}8?]H/]1 o40\}xjJbs1݄n7qׅK|>O"&t^LyoQkS++ه[ wq=)+8ۧb7kWigO\mn_F,M GoDLd$VڨomRX8} M Rնo:4]o} ޙg{fEv"ֆRwtx 6ᨎY(mVV:- qLJ!N8US>ŤvxC Jus:@#Ft斎u叻B~́pUز&֌jZH *54/Y:O|L<+wОX$DX?,rSٌ|͕'10qKbp1`Lw̜Mÿ[\=52s/Ŝcv6_eG 3'i)CeV&+,c/MI.1g Qw_gJZ&2S 9J;0bÞuiŲ'U!f.zLR 7c.>z9q}x;H٣k`=22 K>KFn8kӆ$Sfw4lZ }ZvFV&Gy8%Ŝ\(Y<\B#c(MqfӢp^||XQpKQGcEKȨ\|n#V'oWi}3@IDAT bӿs&^਺FLJF'M[-M\r($8)&5,.(/-^圚svvW^Z©enzOnjAe] Ns}#s0my8myC!t9;>| 3|{0gr&ϯs?^h y.ҹ%Z3 KcYc ~3w? ms=LG]U+8.e5qppo CX`[A{_(vn-cQ. \eIzG.[USpsD`Ż24 #orЌsa81Ջ3~hL|:Ͽl§Q;?|vei3oP]+,`칉 q+oy7=xT&T'v=f<p%994ي0wM)o-mf\Ⱥ"=VDZrv}72䚴~ L8¯%[#}ξ'>6 ˗mG|YI݀<<Ӎ65Ȩ\gt}tk ZY2cp4~aCw+MlgOgFV6gQ'_Ch$~KR:9E܋K`gA* DEK2n )D2v <$peY?3ȫ4N+oj2M_ÏEbHJ2Uv~fmSKoM ա!jeKDѮ}(h]>JV%6-޹e&mL P:Ga~R"$$9¶r^9[ͨٺ[6ak} 7;E$囓1c>wf&G%"i~Uz)ȉvAuIѹnz Lh5"8y@c b~1heeqj&>߸g`ЀNq98gPȵ5;(ld->R,'OLwN@~^uK~O;_6G3ЧMfm謅BpRkLzzb}s󉑃0&f]?<ߕYL 1'tKjn'wlSiȮ=49 kwˁoaH6fQ F$5yimlH&:P@%z~QDSJ;ޣ g+x<3+;E7o˳qLG!))N4×qO =MkاP.aA9Ѯ:.é_j}(%H2,<G2G]7(<v>:_Fj4ֶ FV3U,ldFd &z? /2vޤ_ছnw=`VN~tC6Jc3bף!L7$ȘfޔRT%@X1+ 0 6R_x 8p6NK(&n7C` .rKp [4&P7x˯ҼBm_~y a™r._O_rxzcKW :tx:>ޣ9iwᝥ]k?Y5 $b`g1Sp|*;NF1#sqPmX9w*}_`'zW0=sT|i}sDUfǽkӧ`S6Y2R:xp'ۊPGE?%Hy_O7s.<->ʠLG1WPP!ڍ7s*NGw莚sSRp6X)߀SI忧3Z<782{T8|w9B1'B10a>p.DG3#jVB&jӫ&K8ǽ#lSN,@|gRJa?ʎJ5>*κ&8L<B {LM=P?QIE)[!h 6HV6PB@ߚZmԇasj{vEB1D5Է)@A7هƾzOe0n׽-Ν4Dzh2^ hF]:OZFq2Dk0nn.ZGKi{sbN|3NlAZ? 8=o= {g ں>]95Ho pVԷjtE8|-`/ϟDwg|S(V/É-cNIO \ ۚU8kPk IQYy `U3(,M:K^b(ykqէ^ED4&\"i}@(6?p>6l:<2*c{\)&6)0ǞƐsţw] />evT ÖiBrd9z=u*wqh<[P h Q"yǍo'u) efS"Iix[ʼnѯ:w>FѾMk{P ڕ.ly[Z=Ï'W%9*٫:5%F.qz#:Ome<2 ^59;/)WO~TzQO{.u9"Tv/, g]՟zt-"!^ 9.W9Ż1 .r-!O F^ז q|owt9~e8緲95#d(5Mwbk︑z>7-7)ðoD~>d'H{QM1U Pz IW!Kkl|~S y>nqEƝ)d|5!B7'';i2nOv6\Tkj$ IB?#qoerWM#썻MX7;)j5TATcJZT'N :>@UU 9E .F#|?!#[^Z!n4DˠFFC !uˈY*''-!9q͑jl4AgH(Lx)nymky:_kF:%s8~U`zfekWxZ^rMCb')>k6TM f$Fĸs8_ȅƹt7?*r}$ȗ6dQGwF)N*{ W{qYxz>ga#Kz]%:՜T>=mYU7;$.֛.Xt\.L;߁Ic&Rϖo@SO32'U.Dhdۜ[0K%m9:DO0 ; H/3s't.Ƣ韀w?) g]F_Zna"}]1z7ފgM·fbǟig fϴq9n>Ihѕ׹ 2<>fNjػ#P X(,hP#"Kn Mh="9hCpH: u)O[K#iM͸9:).>HTnÓуr~p/Ekn'ysdpmmg~3E/U1qY$h&'S #9'LņL6u? 7 HHr|YfuZ,+bΚQ^đ\q2Z HWcshּNY71c8AAk( ;iWyF;{jYQ7cסQ,W[/Q]+^լsYG9wǶn z"ShKj>\{ 5Uiћ)[ |vH~U'qC:~%M4Kb&-΍k0g֯Rs2w _b(*ߕnRte;\)L7*,36eSZƹtpk5%n DW ȸлM}3[v6i/e|*o:gBJGk\зY۷Zep27o;bpXkWXzawhɡM++2{'eq֮U× V6'>>z\ <6|c-܁UK :⾛8p! $Zq=ݱ6p%Ԡ@! t*1~2Rў 5Y?m5/9'}BkҐ7y}>R6SxhKFcmtu&F)}k@)CF?/q9JC 1]N){V'% kHAŬδ,t<Ѩ&:.i(͠VGvH9q~3nYk=b0ŘSx$t0Q<2%62~p\?/9k8(\7/gt~qZH{pt[.x9hs٭O$;W~QQo ?{. ;j3H:1ocOǔ; r{JaJTV)\@S̥gs,:iw,ZʩIħQ('*.XSHJK*4۔r:_uPQY Lj) FFsr1/sԷD.TNa[_Ubiڥj**s(Sd*첚 'fNIeҝhd's6G$-ܺ~aR gk[e I3UAhm()hŪkz ~*XEmfNE"+9)x8sf@>~G^4r<]X4$$mqꎵ%݇iIDʗ˲f:Sƀ4})J\ Gu {\OJM i!V;6deer6H"Ok}BQRl'$r2`k%=Jf]\}j錤THm.M0v_}j jrAHoY/F} 2&_„FЎM~øs*o]9[*8[C+v9-qWv"5flQi 7qL\3MGCjka9Ct(1vt}UGiݼ㷋VoY?o|-Fw9 &J]@=q >ѷ!Ň/'[.,JfOS`}ߛ9  J(Htgm\gGD2 kvK;E<e+Yg\G7Ѵ/򕝴(hp`.@0ˈ\ȎEt}0#BNi‚byN2p[>R,tʅvMB˪uelq+KMW[~iwZEAA!4_ 272r(ةe]E,jh8WhF_(c ֧ne(aR h.k?È#\r;|%8HJ{  #ɧc43AVevץEo0FE;L@ؗЮwohfTj"/Uh"py[->iҢA9\-IUODiK .`6U 2܆*FA#wld^\^728:I;MMZSuhhBb̃ϝ#|\Z]$&hCnneÖX%Uͣ{Awgӎc,/m(.![no WSi_P0\^8I _ (loYz߷-pCu4ڇփ b(l1Qߘ7 ;:k B;DwKwŽX86 ^BB I=t 9NHg)'ud-\8+C@S hV>FExcM7F&bO^&\>~LL8Pqk7m|5+oo1xxρp 4@wq#Eq,ʱ[)ϱN*2%xD;fs7xH4:q>8 = p:smj|\Pc>aVD}dnyItSh^S2\R]{s$]J*Cx?lZst;.xmzl'v$/)h=]RTξ sic&Mzk~<]c-p;cHªk~נH^m T)+· wb"]ҷ0w{=`R|t1wAkpa f6x^Ro| .k^[y6҉Og%qƙr -]s8YX|n##, =L1-Y%s_}Z<)Î]xr|,]^&^g]Ucp9gH Kx }cӂ&]%SҐœ3Ӹ`e#33-w *4N\0%pROJDVV&*UBOI'wR\=GE8-HO( MR[PVVtW~K/ K B娴$P>* d!+Q ssssss`9*;i ھP]n*( QfwUyi vmRbaNVN@Q;:L ONNVG5OHl5v!AMR` zT<16ܦɕdMg@H Fe neepR(lv=uhWTuͺ;Iӱ掑2fg;e0Qp&zi,^g MZ AΈk,:r&J߹q QS}+Kgp+}=y8L|R=rTdE>5`̄%"uzkqӹdy?:1qh&>E\9M k b2^}]Xî*54ddI_eSHCF5˦P#Őjvx #+mUsCJ @/Z,R(rfHFқؓy&G9+Y 6besM-NzLabPN-W J2bgp3*3U6*X Gp<<<<<<~nl%iĿOmFwW%dG5otEғ Ucۮֹ̄[+HPJ(4 jh=Hv QT$ˢm"p:Gc', 䇭 ZT+8"I luˁPqڿ]Ћx1 -jj Nn5#ѧ_~ VPo%Q#n$F0 ܄Sc񀛪)?3;Eȗױ(ͣ.H˨[pE5LS^OY+7U-9f y7]A˰ 0LJCiBo ,&. rgghQ46x$qsNJNNp*-)Fqq1Jy aкjx%eTAcvJE'IAaYHjh$ሥnUERa;xk%uk܌[:Ut՜<DhU*&GqSpjxhBnyx nEG(_?i4m[)TfwRB$ ^34^gm(G6[I{KWEs< ;7q[/`ҕWx, ѥht}a9 P>-ش/+pāXX4q }vK2a8Wr}`b lB_T3t\8zCw,]]\'O]M^o,nV Y' l= |.y*i0`K.OZg)t[܁|GM3t-&'pݱqjO_Ϊddd$`aCd~M -[a-ضy#"n]ݾQ ep *NnNb{ڌ 7)fpbNݻGh޼9Bڸ傍pڝ<<<<<<_34M %!##{~HWS>L!IB=619MxrAK7Visz,h'rs<.- V-s!E\ ^QT|_?FBUPH¶Fi}[_+7aƣТC ( Nfɨt_?"7tqޱXHa\4dLZ!y1:Z~S1,90cNCA4#MWK ȶkRTw-]uP]\s#Z?:6!'?_5eß?0g-zT`W.x#V ;/…D) ֋>#U097:s*ZSg\]1=bZ zC~֒ OɱQw|< cu;n6 @ո;1I-X!f8#K5 |7Ѹo:6+ Ht../B%q`ɱݥ2\ .(V%k:…+PÉ:73Xbܓz:Tg@߁ր],.q1\x-pKe8餓E49p5٧yxxxxx@ÒA0T{%iFiRv,MaI w~~wȝJmGūvm٩CaT@@#K@J@Q\tn5,vE2'b'vϢu#8kAB}f/#pKS%@[AG%ȊTe'Jh7C)?Ryp4Kȡ"V)h׋/@\).<"28&")xۓ)xr8[x@ENYg.[Fǥ*qc1* O EY2ґC~۶NQ*IXbFMCorֆUTT_Fp''X3hoh, qvRp&=\IeٳѫW/{}O亹C[_@d&h8%/+xIL1 ۽Z~]Yv)3W\s?!1'1/$sЭݕzߊ+@ޝ)s#67 | Z|gG4CcBBQ-Sye:!Є5Q)^Kɘ۹j݃k!Z9E~UiJz ]pzBzY|".;?;97ea԰\lٱV] Fo(dMtK·;qT p}vjϫ[lC[唪$BSNd8p)wQÀ.Ɩ!aL9 >x汞tV^Sd|\OyL6leFAJj۶-:v#%Gi9s]+tshs'$6Ҭ<㘣l.MX6D[u㒓e^q99999þrnLB%Af L*MA. @AJ[jH^ۋkjE35IwdR%/nӔpĔlL9qN oC֫I[6p6iI_gA|c.XNn^mۆN:3tʂD[/vJE>}\jSkS8OfR:-_l;8}*F l?ͻe+TУC.zͭ+1|n=,W2Rۦ ge999999>n2⠑{MW8gX3]5Uhul{νPKʃ Pq38T0^ I"B3nVr) ׏ºLi`Ѽg<+) @˶kU)&A p@J… 2ygֵkW8؁VyPdFknq~1Jꗅ3b({}d#'jzR̊U<pwolĦ*n&Ag b!֦n-D-XEKgP|~ -5 =Vρwť[ <++ (p?<mV`˪HMAe"4m)B@z8w,2;;)1|rrRG*= HF"DY Xs@#GSi`<{86] o-˾B !aIe `qRUhP) U[*``?Zd+* {{3{ Id;7w̙3so;{I# d`[[dzan.9&m};m#39E8_~KL]UjN9ݵ¨Qu5m%)1g$L I\7^X*90gI9,B  `KDᚉ"'瞞y; TJ@!l'6$9HaH|&:Ӆ6 L70м C!J㾀10i1x4%ݻZ 慪 T,ᶵBzy堖ڄ-ڏ)kb8x;v{F'DuBv>mgY[DRm[2붬Ô%PXޫ=lᢚW?;|ūW֭J4[uF鯗cխwfzA9A*D{xmݒsnD2IA@hp848 gÜtK]Qdo/d@IDATH.Z"_ODxyVm5h^f g2>a*:IvAv_LTp ޅxw7cR*] D-0;`YnmkKb@!D$_H'ץ R8yN.f8&Üxg%Zܷ4ؔHͽ@RRZ/ZWXⶵy =KukkhYO5>oww^lyJJ.y:!V.+!Fl5)]L7 m`4ً_ tUxחB|ŗA;)1<h %Y$}"+>h|5.gv`Eb$*P;]JJ-nӟ+kxq;Rcʓ;Yb́U0?)`N}GN_x/}|Cxg!raXvaI:`DfϬ(C|9i[ZS# `'BČ:84 w^Gg_=6'#_0ldOh҈$-56Nyi?' ?t3͜KQraMb0~X}r<5ZHCCw4i^{?u6ܶt%όS%8^"6џ'd !-=WW3=:`%ݐkG[Zz>i5Spwh!R">xYIvYjCۿFdH,'C<:C*7eM9}ǟF!r6ý-ao跑\RYB΂  ڽJR "|C<qCn8u>1wײ|npru%ʴx& )"oD &J`! M3Rn\й6qIO`%6y{E ?g{C{AupԼf9DShOvQ*̤tqu}[ m.O&Ψ+,uyh+ iۄ_wv`G\_Kq`KC;&!˘w}I/?ʵXm^.CO|W?kw"p(o= m>G!LB*1Tnl>#ј;_Ώôom Aw7L{}|З*jL k[5:s%5M>!G4&6r1O W~A'N1tv8lV ͱ4sT}|*nSA~ٖH;2MBoOKYD @ ġ@0?g#P3N;8j۹Kٸx5 WijJҳL((peӭȨ+C?k㌎AN& L,/fT!eZ8Ti&y18)t`(lJ b)>xX:g &1"۠t9!Qsz "#DJE϶uط4lBr:4N uzvlܴU54yØV...޼+&=V `)yA@`7T /,gu`㾨H# |]J$H3':S^Z`U^puʫg>>XE^E㝎^M\m_-{pڒq=M\T*F Z Z][_/a~E{č\"k9Oü 'q䁡yiGd{w]mC0'O1s o"A_pxHD/k[Ti}&gp>ֿR oFοק IqI5)7A#AD&% |m o{8jP}eS>:GZmãwx*w\|Lշ yqڋSK{V󮩦e"m-\mVģ2ةjSA@5ROeYF}pe9?UOnk<^]z! v8"M;tHI,QApRڵ |O+6&a=_wigut \IE@sOzV 9!~!A81 C)滕dNBTwVo+Cx~LßRH]ګ]w f, ^k +tʿErJ"Zy"yN&9n^<:~?oE0})|% zl&^wq}&]CƓ)1c1v ژT < X;%鏙IȞC(pg_.wgPsƣ@w0 q]pxa!L9ChW˶e\:w:jq^ BAn1Eبgc=Vs&Mhl5kL;7o>5q˪26x!iDGGkU[EY3eY^5֖]o?[bƊ628r.ك_E[O !n^pv"MqھޒUH٫xlwX>mV4"#Cdf *LJkgkX|v6yŷ nt UcP mn>L-0.lٲO릺^p)z!7s KXqpkud&W.ﰧq[R_eQL;>[S4* > 3iP= `;\;BX&5D WcLl@]ؿAHq %6eXڵy#ZA@h(*}̶5eT~xp*㳭ɸϖy:+˳JQr(, OR2؈㤼 H )KsמtD //gΜСCx¡CݻkD{= Lѷo_me%[ɡI+W/É>ti86ǯt50ǯO?1g7ס$-Ǻ"}%H<~nB1xB?^#ѶboyAN Jb+P{7+lV[˩|2n􄜿ѕ222elڸ ^nUG^BxmG rrbUݪ .P%ҟAkZVE`ǎ4&L{?$ߣ"+o7јbIz9oyףQyudU{>:Fq^\LE,X Xζ[B/We:!6JN΂@]`V޽CKn۶M$> UĻD'&&ҥKe=vxEM΁u$0kh3,.粋~Kyx? 4XHg|C_6L"*yԼ'>Zdg>+ԥ7&>j>>ʹk&eN59nWװ auUJAq/?A{K"t)]e0`pUڵ $׮]q{ң40vОKSג{VxC+dRU|w9-[_D8(3PBC{GdA@!w+&4L8Ġcǎ90)2uSu%:"9i/9p0#TB4 6 ( A+—*<=C흎|ao5$ 5 ġpJm!.d߭CDR۴- &DA“HϚhENEg&'S&HO)Snq¨X  !P @` 'Obʿ9jjM#rzy`t!IA@# ġA@#>ꪅ^y% {0xo}HBG΂ @P? gwIW45q`e29&^ i" XA@PH6蕁I  P_x$A@A@A@jD@CH   0tO?&ZIAs3 (ъp < I#krvjI||2OZzP/Z (EKƿhѢڵkweޖG:tM&@ ƴ" ũS CjjKL8)Bkk'%L.g[CGI &hޏ+)kkzRWf%NNz@1>I+h]3'zl9z:3R δۻS.5\nes[%ᰢDbϥXmgzY-BA@h<84Yl aÐ_X Gh֤9Xm۴>8DB,5w[Hw]wcw5_B%4xADC\{/L&`]u391?ݑ`ɠ׷6;@r-"cQ,qr@,zh.VB}qۧ|Un<KPA~n0y'_?xCA^G@Bwܿ PKMhZ<m۶K{h6+9Hb}y!0a-0Vkij}X{[ypW1=46TUJ?0>sܵ3çbh /juR U w999AJJ 0d,MH/^ѣG5Rѭ[7xyyxjei޶;_lGD=7+MrTċiX3_Ã0*dEjR 0.c䂗1kv-)9-i {} EjRXp&=V\*J{\V*.}\[^W[ESf4ޟdM hRX߄~!c5yfҍ0±oH(%KRAwH*^At䛃]ѧ߫eEANKph|'Au^}}L$TxErP?~ph,Ǩ'`b}iYx.0aocwb~ hcd ;>1m_|2\JTtztH-7ЄGⵧߣQ˞ӳ϶KD29_廎WQtk=H"6U-߮dM1XSr.70ɮjͼD*ǯ]4Zek<3@$8إSA@yu,p SТ0g&#Yi6i..xcl&жM`"APu8cA9,%E/ m1qst[3 %}yI ưs %_@w-)x苘:Aek"ӗpd$)A}F`2ZތD|9?&A[gR\I٧VгmvIq&u>} t FH1~h fҸ[o^]`Si`0 >G;s arP=3?}{4`EvTԶl4RlMZ4EXHsiZk!#n)M6nA dxn[[ҟl'@0\L\ȰL^~hŴZB##Ii簕ݫfibΙW_}s>\]Z}\Do'xd`)U7*!e@75qP%oQTmHO(z{ to߀D~نdı=&O^"0b.nMv-&aݜ ձ|w 8Vye»;1'|ntt/7ѭPz|vcƌqL8,[͈B|/UGmP3V98-m-j*m+ O+0n|#T.o67E>9DѪVLRR?Nϼk ؾ|-JYڴh9Mߍ226;W\:Ij |<_ٳ&-ݏ+磰hB(L(!RIsSHC8pg>cq\tu@bZ{료CT2f/ؒWғ|14>aM tA_ZͫHrq:_GQ^ %o %7,!#/\t< 4p,mm]ESz^ ?N SqΣs]G=&|b[I&HLD| ;O|\ҵ! bOwh|>gxm/?fj] U3D}j>_)@*I=ErJ"]@3ӓkBCzߏkP[-m8*[iV!!59Iis?`HwD@z[me\d]KMqߑcߜhbW<`&5Oyo: D0YY"vWs2]ɓ#yӤZPה)##-9g|}ѧn`:-L$ٳVTCg,Fe"س,Jh\/ žٿ:)+&/Ѽ!T+g6c8cz-甗wjٖҹɱ`.)A@n[8ܶ/ LѴ Uy`" e| rn[[R٧'K ԄNEH;{r QH>b|Eğ?Aס'Jzv b~4u,6+^{<C!FcJys~p0v~kX|fe+ /= UcP ln>݅-4aPEuXB-`=zCp 1hmyL7 C"| 8a&hmt @ޣtDnVv?u*Tafش{M s#dĨOhuNm}O=xl:L[V +b)(lF C xo&y=VGb֙4͘2:G!<3^cq[R^2xd E3&x&K>exaXٷ ;SE 8V˪B.A@#2*oyVˍ[^2>:lg?㼒<+Iұc0t'"2/ʓyrnn.N:>d6tCݻwGf4؏40iF߾}2|FF;s(,:)xӞ~5 Apr ]rQu-ڴ@0Z%Vfj{x r44ruuź/h&ȑIM9((q6t JՖ4}|3ܼh?ddҙnt`Jʟ;թ[^nJIEĸX~20UB]95Rztr˳%6ޱ8;YXmӳEc+Q@maRv%™U׾w֭[ѩS'xxx;jU%ސ$lҤ'^@un->w3Vرc}֖Ϝ,l 5^3ګwˊZ`WUߓLJ*p%ۡ^W]*dL;!wk%#n 2 0 z*vEO3!עE tڕB3RԿ"%!<{͚{J'zZ鉖zHQQNX\6h>jK..IZ5K8vȱti0!yA@:n]nH@]Ɂ-lгg"3+S#$ ``UrA@AnbI Ǣс& ab<}IA@# P4@Ц&_];K+J+ q.֙r*ڴiQqx". VP%+H 4.LxYzմLh6Y͝𥺄gy@S$ G@C1 PG}ZjݹsgJHL Bx,0x"7}HR_A@l 0R, `'0Uo8N֭ו|4]ߝyrWEz $52?|6Y}TmT6.eJ?7S|6U?2cfelq=e|mlל,T{56]J`u]*諢\'_+*o,:IwBTH#e[kz2Cm<{VgpZjS#q006YMed,u FUs^1urVKJS|VuejJFɩrumԩʌT{UUx2߲eT_~ո|w x.AA#ͷۗۼBzz: 5 xK:3 Btor  @P/   po x.A@A@z! ġ^IcA@A@A@@ý:]   B@VU|Xn^W[IHH@bb"rss>ZG]VZxG9:88X\.UrA@q@## ##i)TJLvd⍊(A\&VmS23c|<Я_?2rGA@Bꇟ@7'ޭ̌\"x'Y.f\P~V@]T(oȄ&k+5Do$k}S[3ިZ  Pw83i!DT3rtBK0௣robaN@3 NzUAChF HD9}"""8hAOgQU2LDCur~`-PrZVZ.KBsG񱪫43Qе_xY K2} FpS $0ݳ5r<}b?8+A@h84 Ekص0psqFN~=P"=ΆG&$ی^+&>EE4/yR9\H+)3*c/فxu%a.Dbu J 6 7d*..6ƙp.]ZC#%q؃o(Ta`eoS_s'BL30Hd*Ķ%Sn a>^˱:%{bRU^A& H_{>}L9Y2[ P@OueA@@LU47(6)xC9ڑq˰,ᶵ%~"IήΎp3ddÅ]הw"Q WM$,go2'֖K]C)[d29ւr%`]m%ߖ?İ=J\.FvFb֜07 49}*Op1;FKWdn$V-&3v;8.<ň`>9k8 R]_.mG""U w.@6ȧɍ%f:|Mvp˸eXpZGtt4=cǎUGZ9iDZs?>$ɁL0\)Op#`4ދ_TKЪ"'M6Sw)3OV%EWro@?Տ7#BF]ٳI."ڪ#h$&?Yo_TSJuDKt%ͨ n'x>F*_oSQfv)ǿ«+q{i-rH{>~>b5T{|ڵӎ\4W5q,l xe|\ϰP&kgٓ_dԌ4Z8^=̪ meA ׮ͷN( ;"⅊^Mqvy6ܶ@*|)t wwwt ͚6EPP#(0͚5<==) \\\z8nTS">A1J='b2 BĈQ1QO"Ɣb^tl:p yYa/EI_ 6-~O *6O^G_Ǡb PavD1rxjTF_,A0w~Pñuk5V`:6][rt[<6u>Xش}9'Ebg?)>L\3/-q*iZn>|G6TRpzWWLBdB_bی䛵B%[m>:y0C+ w?{iPΕ$<>} ktʏDF.ƢiOsOh]N95?!2ZaGŊao`1W}M"V4q X#~w6Crܶ' @<I"`AI)5rք4|u d!f/" AD@<w&~Z@aF2xI; Rz6ܶDLOv"tCΝބ:ǧǁCRSP+RBNi DYȇsfW_Ŝuoh\DogQ0+=b3 -+~.rBv(&08Nƒal/_{IF -E?KIUMZAiú1uApF=-VY2esp[hc0фwaƄA^эwˊ2D덖קؿsv Õwx{,5jӾ|8{RO^hՐbOQ_yyffe &tiuq2@\dR)W #f.͑C+><?hȏ_;ro_J+pS@+Sm{~03)qms}#Ic' /]O6.$63sMƁ+%P<\34R` DSv׈…f.xb6hvC Q'Xl퉮$e\%LɏT!:{T;D Xe"-:"Ŝ3dN 5˩Z#U;&ި.yϲ^'wy Z.u+=:Eĕ\]j> hGWwĦA4As7"{+%fVZ l_tG//ٸSCIYpkQY OlJ A@%ߞ@iv8?}cw y\,=a;(:z*/CG9F'>ҽ{wpxRq92 %5M4X.&_rm)l\| qbrKk#n%#N06qx%b5?S'/ᵽT4Rծ;şQrb {a~.VW=ErJ"}Ln "USШI X/^|$]ꏶ !9򑖜%_S4+),6sAnylX0 &-|)dqN }a=-;Ç')1c1vd6k8_¬H(t C0m @O.⋹o08)3QDVQ8;>hz(Wy{҄\AOGăV߳ڼAu]/kET?3ekڏ25Vnc7g @8^A4 :P:}xGu:,sm_B* !P3AA [{ti煫G%O I67ExGSUW?{ŷ nDª1sL(EǫƼ[Wh,sDt FH0lhI)yz!7s %8qLtuXN},)9E,u]:Ūlœ#_,Ž K1ox5(iP=].m͋Rr{eT.Ve|u/2_窎Jd,rCm0}H+F2 }pmt5ދ|fPRꆺ)Wស'm(F_|~k ?x5%8tѦMk)TXTy;Vnr*hùsܦm:wy`#>> //ddc@vddO'_aCWA2hMZwfOkR#NjvIՀ%'?;4yP/7ͺժ-u0E)ε7G:-Uxl%1;.LU0$Y ߕ0*Qns}l=F1up*Ƥtj˳A0)3j8[dՓnoܬx/JPy1W b">|X8{`1HJ'^ѾQ?vZ%sVњ{儚>uߚLEbW T<.CS||{.L?Z;dz?gܮ2 wcgQ(֞48Xo5UH|8X82z,q)ؒ17VLZ3 V.<{B>ؙZYߴקh;6$ڐ`8s$`G|Cܢes!)<2zcm*jy5D))hӴ"YYhѢ%y.k+.;wN4- 9{$2=e|{o~jj=*1LFu۪Zä2~vy|O3jwc]E+0- 4ڝ&O/yjvM\Ly1zbXC ` @R#^=;k eq?e_\TP nǺ8C '[┞2{8)#!Ih  qL$,51&C2̉3d\(˱Sg.Wɒ4p9-Ij}3![.W#R#yJhIW- 1#:ABA" ` [zbC%%%Eۓ  }eRy啝x'F&Uc啗X\`LLӲiZk]kbW~^*ع??Fe^iFg>\.D D ELE@ZFuƍSA``ㆉ,*FCEKiײrdhk~~[͎] 5BjfвfVنuXSgr$sr[C=yj^I z8@F sL+㏵eU5oA߼LéɨvM:ԙ soyf۷מs 121q6R ꍲgђUxꋩX ]t  `&~~~xy K.ENN6A)|˓Nejpp0 e~{2dIƤ4ٛس>_6j̘([߼ꋠ!h+ëpR͵P25*\JsEl\}aSTy1݄-v YϞ26y^E,F<f0e]|Xٺ_m%/'BnEF%FF!dJ-CXnF axgؠ畍8q؞%qP Z݉Ȳ+4O: g ϤZ=8{ܱ p[ ?-2Rv7":ː%pLbg2yaCh3A`RcI\KAB"e OfɄ@!e, F(opfj?v=_{7ܒ܃ p[ */ BA@@" )O.Ąā۱2ɚ>޾79;,ɉ-yM,p[crvzm<{`(#o$A@h8pX&A@[7ar:6)]cllXgU/L^xNp,^X'*mwߞSTL(69DX:8qSɑC Ɂ,B QD*@;E\^Y^}jhm#܇WZ娐eG? Է;މomBjB@CMH 4 zK||<8<ҽ)rʐM|rp0DD¬6:hR%'&bAĂ-!"\DN}paķl={=QnV ID*窦eѩS{xx"6{MQAV! 8*_AFdqlL (-+s)/1Y3-YZBO0yQG`IIC_\R >9qnSQ.\P%\n]A@7q7@L_5|xKЗotYL(`ѱ@+/󁗫7QÝ4HV{)Ue %3nEL!u}qD^A@H TGʕ+DׯksXm۶J *R{x\[|WTAQv;_ΆIJw{=?d e4WcSczcBu"0~n"0zu3's%\SvIcI`iAxi<)eul kp֭X@2L$N>>۩O&j{fi<N8wFF&Fw{/-^x"l4Z@s/_V|׮ {ff&mxpӶו+W`{egg+0{nn*g1婋|:]&IWAA}9=*/{D?GseϜz; Q˖@MIf?mmuߏf=4 = Tр{CڼNJ'ƼB+pf .$sv ;sQ2yG_RrJ<0rF±)h:̨֣MxN]8| _1q-`NDl9 vⵁ㈠BJ.:M0x` u@&@GgrvvnSDZ5_3=(-m˱12 GX_sVm~3s)?sX,ZZ?ktZ{YOiw>˴^N4Zߵ6ZoxZmG@=7 (m7&9QUޑrq񸜙9 J?Jd72}㉩h0i%x^h9dSHm,6E=遠:$rOzӫ;F-E//h? !5 6/ w}9D1{$t‡aɶ\4/O!}x2n.Cf6 ?}WGx؜4\+ܽ0~jҸd}f+-cly?f/r4UY[KhCe9a2k2JK۴߂>c#Y]Lk*gǴѼoTz0niꓼF2b! ' cBfqo&c<Ǣi$JJty3@-n$|rbZ-b/~0[wT=a;mL'4|N1cH7I eyvwwKA`о;@}p5IA.AO7Βk?եS[(kKQ@vWw8АC?; zn>l#,z/0%nBꢀQ8>: ǎ$v;3~8]տ3k:Ȍfzj'F[,j,c歽yהDzLEعTbSD$ڡû.AjwvfibZ)ieffZ_fF7V tU=K'q~K$Mo${￁G,H(@) Am-BWhk48@+s [h!Wx64d$3/"r cثm3~Yz(.?KACA@2kjpRt#s";cǦt4tD{DZ?g#Hh&={DVZ6>rQxg.wb&ŶoLTMedOߏ]b_b[CoB7BD chPq͙9SE+e囡NIڹQk-kfDTgڭ'{O3,|>+,e؁w{MV'hn[9W&_˺hNls5Ͳx݃gk;)a$?-[n3Hēɕ"_]R.U⍨>=< ly1sg&D䜽fs޵>< N/ܓp~t*Zƒ!8q8uꉰ!T3 W>IGt2 -u"EQqi|^CHTGs7u*I;)$]Qn]8p@96/MHZ9B0-եn)Û?Ù"%Qt:ٕ.:pvr/Y]g_'E&),8빌<$^BEb"bidQ4,e/'D:x%k*w&sԉXm$H<;s(@aVLc8g0L,OymB >NLxQdW~E_Tڥ_߯&AF8hή,nر#bh/<'`ն_#A#UrX!yu-&SvC7w& 1U؎croًCg֝Ȣ1bѭvvBX6xhbdPXX<~ ZnHGYH&]pD# .l1.˺HLS",t]VA@c葫^F5>ke|wtF!6Z]j/uKC>}[ґ P[xןqCqx#G1;ݻh(-~MBTd%=> ?#tJ(mdDX@oD,89i\:YIfMRrf5Sd5Wr`'|¹^iLF;y3Mfx́EG{-NN;(g!FhorjE1v.y]r34Gai&'rٛkdb!,Ya'cOyg;-;WUɝ9iark.ꫯOO yKA__߲ --Z&'sM-n&&&",,L]4u.a_0u__מ5Z=](q^Lkw*R|2Nw}"}iK!ς pW#PN|Al޼Yi؄ 8yJJ N> ޝ65I-J˦Uq; (j! tE2D'Fv#rrt1egP$_J61lzv'!@MͣRg7bdmn6i14K' ͂EGO m0s)ѱ`BZ2 a543sⓤg薊t2Ujݒ%  uAe8Dngj+8Z+ ,$o&-) -$؅HGB+s$ԩPJ6ɦs) Fl䏮-R);Uȋ  \5ϑn. A@=hB'BTc'A6': "rb-*&A/DEH(Vet5J$@KUdʃ9:ɽ 55*  pw! ~j_lvgCdxǚ8v"DQ(V>L$^6S|=WEI$,J|!JT |Õ<3ΔA4ojXLBA@S ',8u^18|85d 9̈iC>!?VZ1,'N2kA@AׄwC"%ds%-ܫ%iB׵ ӳOpxCLI # õc(=@-hS[(MCp`A |qG-"䂀 ]w[- ~]hƒ#S8V(phu-(a|\JF= #WA@p#P>A@n 0_\h9cV Y,`Aj-`A.51 @3'^l:OֺN3ᇏDz{˘eyA@" p3@\=\@3Âk R"Y nsŽ5qFBǞم^nR*1[0y.,:l8h 9Gc "W}wgcYMZ #"8hH]AAe:>8fB|3+$bjJ`tYe"nBGnNPگ>|p;"I5/zYM‰yx 82A~0: ?i'raR8s h^7ҷ>@sNA" SzA@"`tsFhsi >3ڢPyGk$|a6 +J5̻168`hУ7NDİfСI)h-!Lc`V[y:a+"q3,Y[SUGgkLmt0"qT%傀 p+]  zpa'*%f\33E&BUF2ba!s] J`]iGB+ qؼǹf[Sgj,P^MC̓hN2M1H:vvE/ jt9:PWGb+?!?t3p67n'C@AIП$A@A.@|bhv%ol ߙ6 LW(;Ri1״ Z\~-8ϽLh <] pp\ B+[BkmQ^YB}V,B;9+I2Ғ+ݛ[L A#  v]+W NNIIAnn:A#tɚ& /1#5o_qE?.{P? ZbfjKpAN1$0=s(}]yf}ڧ])d5 Q5MKm,8ZO*ULqT")J/ߜ/3|g-:M1ZCD@%  233k.xoiㅒRfȞ;»g(,X(c0p%D'Eg_'-B\Dt `E;UpfcA6 dMP~;__z>kҴ -Q窄-<0PN ST};γA/8\8n_4:< MB@ #n'O$!E!v032T̋89@D Y3Zlȝk,愹8ܢ\exC$ك]v%'0ƆJђ8z>{zwصuvvq2lgYAƒw5 6}+s {RmcJWD) }5߬)فE͟MSb%89GJa0磘#JlKʹkk&esfƺzҝE2χ૯6P Ow9| fV6Vs/`GBCY?NQ|.QgƻL *&֢+Z=[-p]nZ8su#5m' @Ƀ pU}_W14HXp*m(,2e2%3#D x d"A\:@rVҳry"Dp#?AoQlrT/>oY͚{&Lf4ilTll3=k/:иĴNauX٦Op9Lk ZMi8UkkdhWh$r7pN8{rdpQ൰AѴiS4n\M܆Mf3}3ȟGs\" JfI)D i JKH&Lfb|cyT`wŨ'lj{BcX`2_+!LXkz1 YfeMG qURGDgkY`Rаm`q]ςHmt7JhRhŋςX43 а/{߄6]D@.єʠ pK. 9998x ޽{+aWBĩSO?)urZĤ+Ԗ Tچ"b3%>D\PꂀoUfDFF,t,HNRCXI8y< 7oE _5m*'$w5/`{C3c\SA䐧cɎÚⓣ=pA4`Tx)P|,x:4%<1r4:A7-'hCp=k= ,<(S0Q(u$E5àmG5@gsȽ2B G@ аgxxxࡇB=r8֧uEݻWvԩZP31\@4%$=y?>x#[Q?iiY`2X#I)Ĝ¥L4܈Qܿy/X:gb1YA~z 0 x%K? Kex$`\ƌYR@s?N@qYcTO4_{h >C*vr?)F6_YQv}ԙw2֐i̽HVuGsZbT MKѝ͇tʳ&<_63b3(K$焻5̈́oem wj^ύ۞OB]8hp%-![DFց!ވUn -7x"F®~ p@# pݸy#H G}.]7U BXСVq8+-8f.J);9jQMiR .g`@1*%j͚, )/m"C0(ŒOt/ʷ:NPix/ 6KQi 8s <_wf)vi«^?ڶƶs'+EAkaJԌFjPx!j|@IDAToOyI¬ C$A@uW$A@#%q\aVv~n-G`_6(nL1eabq% wmE(,$dzD! $8H(., b2҅8z859=E?̝;+>?Xa +1 uxu! Y\߀X偊z@ƂظMȴ$A3VЮNu\ަ=.e? XE)EZob$.H8ϲ@kڲԎTQ<|ϭAgʸu?5T{ ' *ìۤ819XOu3V'*Z~IZ?&V^UoeXkݱ3x(8c i~)akZD)OTTZ PxXOaaMX8_Z-/s^deYC !PwzVW+4lܮ"zGh@m KZ#PABˊ L .>y??|4Ay5`@]\0=u佡m^}#Ƽӡ)ElH8*8v"^p/+$FTv:X'oJZ6=u)&n^$dS*Zq>|~uRJ.:M; Fbm|dȋr/aq/d#1TEc[ }&J2u <'vo0Jqm_/ئgJ\}Gc&bݷ س-+…}~zRܷ[7C, YWXނO߯B3еYܵdM%!$1 7}?+bÕ1xsF<ݹIY?,Xٲ"aj;bG Ru`GPޥ/!ň]0lvlD#厓Ô McnT4 |6m 7ёMPv8vbW36YӑPπ,ڂvbt۞8Z^ZZW:Gerں pt6JZ xrnBGG#lcꬢYl 2ڽkYcrrs'$ƭā 1vc|Y쿼Fk DH=ho'r vtF^ d#D ME͘skU8۠FvA3E<HkBŬZIhpdSECW)$m@-|12}A@>GGrVΙpRt#3"Q<~D5 Ci }`YiYFaf.wZM:m샧͎ݹIN:/]vŰ.4(, mAg* u͙zpR@aʾhw8.4PBÉ< X;@BtLx1:!M7ήm]x(0>N6[G2X,\>ZamsX k^u6G~}гsCy#w/6>(N#d2 x;_,oǑ3HEyul_ΐg(t{|3q"U_FTˋ w_n`A@vr[hQApd222W;p|ʤ?/K>pBvf.?]VZREك+Rz 0+ `%dNULS>.g1+m> ba*m<s6MǪ1Mo"|b{Td,ZMY=ϫ1p41*$M[9WiڤOWRNd/?2#h Q]@FacobRlR9EOt"k2Zaj[/}Z+FqqƊڂJT"q[ǑdWt?53APp~Ev”/G~f8^BDH>s#ؕc{S@TS uZУ-*XZ2 ]O$A@"uKf҄3 rn[]  v?#Ȕ"*ѩϮdSB7zogxx 3w_WP{`}.#ɩr1S_k1 B7ixQ4,e/>x1Gyץ~κٴ9?tbprۜw$9FM0@1&\\+kjVk`ѱرEcW,#7:#<^gRf;l^Atc)S<=w(Z$ Pf}ӆ\*#18&E1`9a!h tП[8fۈ'#eBZՓcnl+3*)V/NAB& W=k/.}Bm$Z5ۻFEXDt-߿uO:js#vBf\9rqމv DGG# @i hq}Jz}>33}:y%2V( (ArEO(⒓ƥ@YN. +EȽCt<εU?M90wЗ)4Pj1FF64ܽKޯq܌|ݽ */Of’۝3rrXa] +nC 9eɛՠrU|WtCUpUJ-$yNɛ[|fbb"TzMQ_&Sw^hyYŪQeZ^S;qKokZy:u:tJ&LU'KJmnSԢ,urh:9zٴ7nGbE)$!2[˞C\v#tn ETĻtCFI^rg;LRҾ:pխfw,LX~l4V)r;6\dyjv Ip'A 6|.Cnݐsa۶m`'!** !!!puu-n:H`Jl<7a^Ήpr&i:"!"?BN}_9H   jP w5,<+. fu/'chTWMbqI㐍qX:[tj mKU<.3 X L9I҉TRT/IA@ "8\A@#TXh`A$yT%|0BR*.H]@0h6G" XINDNԢV%p.e\ѵeS*Pch@^A@Ax\usi(@`-E:x;z89Q,QIeT !X9ɲ'KUdʣSpwz}1x,I  p/c(=@-`#>"ó=ıs!B NdzħK蹄%E(R!XX0Bib+yf)Cv1h޼ĩrA@A@*UD AF#;\Ç9]( 9̈iC>!?VZ1,7zEҿ  p# Ý _l>Lpf * ڵk~.\H粒89)Ũ[7FNUj2YA@A6D@M) w26|ի .z~zCroB^^>sq,Z< C?t'"kA@n9"8@& @jy|50L@l HhprF^@4nCbF  pp7TRj/èg&sxd@0Dž\NY(,*!m죍d”3S.0fdc#j7P  @F0 (Ncuń{QQW._Fݠ@lwIr,LJy(2˗'N#DL2O N M6Eƍk MJYl6 W7O\Ѡa}䚑FJ^0?vXIpB3DAp'“2]p:،b\9 (q]hhj)!"8(!frrrpAnNpp0zƄSN᧟~RBE֭Ssuxt#ȴ̥͋IDv?>E&J($ciqB|zkHt/i$Nh8v.w?EXhب1.%XY<&OST^A@͓DuCA`aϞ=dF䁇zvUXoHHbҽ{*N:U)F9YHFݺcǫJY]Xo1*gbjT'ǀ#،K0"0XAe]<>0;oJ[Cc2ش_7coAf;k#ƏdND "8foLWOåKСCuZuclLmtYeP'-7S&I{~Lp98t4Φ^B:8;wɧ. EzBєhԠ<;EbZctZ 7ɜmbcSD߀wgDgoCo#Z `Ng-zRA@1UfAE}4ivfs;܆:rb!? Tm`]{S4@h_H PU> n|<)-_a2krusC~n L~#Sj]oYu+7c\\\~bF#Ȳꦥ3hߛ8PS8"cҿae4W0g#st1%Oa1q~<7O!bx"UAI&>x=H=[ϋ0n j[!ς TgY HMMVᶎoD{{{,AELnD!(ȏ|I7ҙĨy#rMn!3̻恴 LIјٔr|p4k (a T+>hjf8I j ]nj[̧SCc7 !k~y"A9ٚ%@*q vDwHWoN|N-Ehvw|7rD$O/gX ?-B7=|2U,cX2=bkQtR>3xWgòޕص>N _~# 3ɴj!wK&\=ESeaCm^Il6 dk0|\Vڧ]+ʰ9%5ޟT؁qdi=әjrWL<uv.bnQ:ҔW{ iH4u${e(N11?ۇ&@lW)?HWi{_uPLDp3WY p]|bbx'2m%/O/k<= ҡp,)-#{k4$$__O$`T@?MIJ:g04̪H _6*`x`5j)bmbJZp.E͋ }JE\>sr"6܇7<ݯT@RRqH,hQ%X<1Ql7"Hrn=ZC* lrk(Q"d{qtemqf˳~Rjf:͊ #ʽ^px'zǡT\SzX xGbݛ1ecjBeYx } Wm{cB6ջˆHb ͼ3:`0dI,~ڲ9(Zw`ָ Jb&d\g'Ӈ|4YվEqhM&];֍Щ> A֬+,NOb߾t`ԡ*Sj; -gbhr v$.#)3-8i>|8~ڧ<>㪌h ͩUر-iLI  Dp˘m:(6~) mƍ[|ؼ]ɅN&B>"䚔ҥ9ȥpdԴ& =ȬU>"()S321Q?hҨiК U;cɘ2<}Nrq` 1:!*U ʷ̇2U"L2DG!8ZU^\|ۨ+'t0JiW8fe|ǭmǐi+˘skaś!M]3?c"1Ŕ0}Ѧ}MDz@TrA3j3DNGx<"1ehּt^Hv}Yޖŵfi+(2Uj@ d |D;uMlz/vT0ozMCE$8 Zk-;MSğ1Tiϋah( p .C  lёi u5w4(LX0s\NஜP6m.yr9dV3/DAap'ΩL|zt1Xrp Hߍ;u.^~?va]ih>DB7BDЦ BYVg(fA(N\*(L-JN֓?P^ކ8"F7\9Ѫ-=z6+Sz"ƼF2 oJ'_Bpa|iYc}Vް#^`Č[pBYLOQfꆠ K?`7/,"&|+/zy eNYێy#`IEēe Z BѾ*&oDNt(\o.!i$lqMA0~5e:b!Sc,=|*GbJ>)dΖmW ^b"y["''Ip(9g<Ix-b{ƽKߏ"n~dᄗ? <2 I;CfPlVM=P9L[f#w #zu{t*V'$!3={)!",$ߑlЙ -'_{wLN{|6hJ'ңJKT)YsAZse,M *3We6Xi,)A Dpvi׿.80Η&$hw#0-Uv`&&I3U=ThDxzFJ(p#I+E4I~$X4!S&3w1CiYj.)bRg&¨W@L#f|gߣNiX:!^N>x1; r">Kgg%wڴl:`=9Zew6Ur/1h7]~HL_ 6%ƱgvNnh_V홅pg[C&)2ysΡ!'a b yi]xoFc+:/b-.݂delFZex< BB)&{.Xa{A?uxa=%.9qdF^b{ 骱u22Zw3Iu3lwޟe/Ag֝`~t+݄qֲ ƿ(|OыwUh( qdZ5i&]pDVy(?[BU9$hkIB}f&ό%}M -HDZ ?҄.0tA@VʿwMrZ]:Yq^k4QtKDwq_#A0S;LQl.cD@w'm3 lx~y.ך+ӆES,ǵ#>wЗ"g?O[wbDλtfw311aaa44ux.V7]hyY;?Z絋˴v"Ew.d{ח)ۗl,w=uԡH.)tAl޼Yi 蔔>}Z Lmj:;#Aڇ栘d"qu}/Ȍ# 'U`憙7//kYiLϑl Bc!]a$w> dł P2t 8wmFeVt`[LMugPy2h!\aRE{1idh!hf4llPlr:"aaj2* `?ۼΟO5͎ji۱ !:  P"8T;DŚ'ڿTD0F?8$"?Z1t[37lbj]cYh`WR4熴+9d⩜9"R118ZjsHIRq)6@&Jr uGZ g\!G:np>yg]]Kf"A{w[r{񚘞̀X(qYNkLg=A@EmA,X(8Mtoԉ0iqT,ָZimq7qlQ4m7/۰;`ه٣ߜa‹L./sd&( N '?gR΂CPDB2M*v"3 :quӣ=1HJNӅcp 9@*f1N5GL> ۜ1ڱ0`/ ]{Q?hL 4$~X cKvKj_6÷7~%9B/;|1cB%>?؆dO'% & j< |8U$#êk4!!nhߵ~x{V;eޑ#~/I T5vUu,uw6{C=lX tmO=1MZaKڵйsѾkWņJ}Ư^#`#d;ͰŐh!nYۏY-m˰x3L=RÔmX4G>Pp'{xv ' ޙIUy? p} ATPEu=&#Ƹ]ɩqJֈ5œ$xpQB9faTyՇUUަ7HnINJ9o6jiV{(5`Ѓo.otS(={E{ H˶훍7R،ݷ3Om-E^Ο:w΃zpz<3y~6ڲa3M$@^8xQ,Bavȳ _&?8WϤe'{į+亻-FXvˌC,9Ӽܩx?eqw?_ϙ&ɶͻCf.M{M%hfˏȋ+gMS' snSc^\Ui@5bVKi-f[q@ʊߔrȶwd|QrZQ2YYV(?SvڭgӗC&u獑͛$GKv}8h^.c x֍ˆ5:C.e%SpPsΎ;0AAo=Gk鐗uUmS@!GXkj+?0Niߕ#;_/Z~2YQ\*xlz.|:e>sIXЇM ?*9gJH^83rߕ1~UqrP}0߽H3[[8Y? A*sw8U9R;y}eܑd;mŇaNy/ cwnv+~&g33 7S!`p9yϊ뛍M 6]ygF[))pm5 Kλtyɋf#jqK8`4^УYulx)o U> C~G^ϞwP }t5n3,#_-3Y4̧L6c?~U/k%'t=89oySY;fl]|VLV'e{MM ҃Gʲd[3O1<-+YџJ Y0F`&yymS2ew{2gߖ7^vNap 0{;^wf AX@6>qB8;Nփvfz-n72I.>U^V?G^ gaw2BÈ`8AdER\R!%eF_ ln:sw r' ǝ |sWIr1s "_uV)--0gcJ٧"vHɎbMR;DN:ܼexֺǯD>YY5vd?S8$U%Q[xЋ"]adnL&ei)WP*:av fR$,?{Bv0XwcgU xo! ~vt!-9d:Wc HmvٻT!`p/Iʒ.Ti)L ](zEy$1T4i8ݲj|iO$҂aߐsWg>ϒK~0M}|lyөU8Rz 8YBxqyao6p8reߟ7xp7PF$pWHHH01tp7wۅ#bR,u>uY2&h;8v%τHH 0 AF]tp =;o?9ILL?tvߐF\N*03a„TN-m`Opf[/eapc: 1~s<PWW/9 q,@; @ǡ\d" .2x`9Ӥ($fp :TJKK?UV9ȑ#tS!ǧBWEx嗣>?-g^1NTINf! ^gFTYz=ǡu2`TY، @ @ǡ]\f$ NNuQfTL8Qv*~j4D{;쉧B_O)2Fu,Hv: ] J$;SOhe3f2硪a $@@@IDAT$GH@(_F.,||2:^.Zeaqr{#C;ܾLK^u fuj\D5{AXʣ+¸c7_-Y \)??݌<58 _ȏ^Z'+#OѱS^_or}W[}(>hʺɄ͒/5*{iw%+&smիO)G~`~ hFno4k T&PRR⼧A~}ޫ*ٴ9}KCgU(58)5:7o՘;һޕj[aY>c· s{߷-jErhriY6|hoY{JEEzr/ʧ ƮB+O8.}3ukLWqL83-U_e䢧qfcc2S]zLwCZTS쯐]ep[#N!f5q}5ȑ1So~l,Vو Ət*9 GrhL,33sg?3K-hua'qvƌIUUţ厙ʍS`!#\|b\xۣt%3#`WVI>Irt2y/?`"ʆA^߾e %ͷ^iMvevkPcjpr̯1e48lS#[';C=c9sG\-7+NS׾T~̻j63O5uڨ#^Y-|'FmdUPOyRix% !@ $ iI%@vs=lcjQcX ;-m\{{U0M:b {?8 [N{x)u2ᦀѨZ}8;;Dͻ0-lT"c$YAbS, 8Oѱnuf>$_}itt+̙&2ޓѐ3}S+U/ajE>\ϱo,¹ƶY'۞"oyAZ+[>Y+y1b3ڲMv/ ϵ% _}WȆvMty$h9d":Dޭ8V.<ۍCJO|Y6dS[tyn%sUrש妓̫fM{-W#*x-Qa8 Her@ hOg,BR3W_=v2jeץ_IvleZYA304Ϲ7ŵfA1]=$ْ_/Y֒(޻\פ=\ve6k{P=G,Y2w}205JTMYfIdIM#TRsOZ^XƗgS#eL f~|XZY4 lCmػu|ٻaL9%,1zˬA$qhWH- cƌ1> eݺuMدзo_1_( ~WcrOЧOgզMd͚5r|8lp^'sC߹K-D HH?2 _ C tg k.a l"gc$@$K/ xۋ e$@$@$ qhטgH$@$#`068KPv4l"x $]l,60OqPZ+[W 20S:'<1 &:y]+  V"PmF4I ͋=S\`njI9/[kM }5jVBU5,RiabжTay9W%{oo,/Ɓrl;ɂ:|H|sۭ< @2 qH&}M$@$4XccӠuzp` ϵnC'ȹ0PnxcF>l@s66-վkk8Y!k!F*m=Ur٠֙ hM3."  ]^sЏrv꣪^9rnMv{8/;ߤՔr;+M%>F([_pnxnsYh²=G] XN$@$b08Th7[Xh%"à< c5" Hmv#Pca` HLk $@4Y Yu iCY a/\DǶ_mK*0uA'2gt7K(w'jª:9;4C $$g$@$@O@b96g@!hH:KwZOR#m.aG([vpir 4aGli8k\~hvE"`_)xqL $Xr{IHH 0Ł8Bm*SBE]li{huGՇMN6l]fu@A-VM$@HxU'  ;nP7(~AUGv::ծ[N1.~./ ;,c'fP3{@$;R! đ:wLC%G]s:t银gKC Uǎ#q.o} ;~ [㻈tE aC UbL$tt~   d!r: ^(} h)Ds0NJr>&\єfH u CHHH@^Maw:M\?{g` ԇ'Cߢ}L9 pi@SLI1Nr<60S:xmhJ @+Њ ċޱC  N:5: JpճΝ;cǎJe$/5+v̐=g*L]N$3~3ޮ\fn dvy9~DW 8##Suʕ9W YSPh"Sq.Cn37:$# 鴁YfoCE$@I @! $ ă: ql}MYLl<'j3:t0cRXXH!$%Ɠ<a)?'X{_`O$ )ͻc-gL$~85cITspn03*\Pz,#H-Qj!:H$R 7 -  hsN'D$@$@$@$@$tA6HHHHH/0OHHHHAC<( qt @<qE     6NC<=    :H$@$@$@$@$ qhG$@$@$@$@ 7Gǃ"m KiZ;'v]M:HܫdZOؖyU]mnr2Շ,3#SCW-C]۾AƐzZXG#~z*Gl[fc_}_AeuGpːwˠ[;W2r[uܶOot$@I$?菥Wêkغv[v44h3ilznlh]i^41v@]g0怞)_nxmV}OB vt̵\-JmiLܱ]O^^2w^^2w={zT{2!LmTOk=v/غHUfU<"\M9և-G:4`Sej v=;-CuTdd`[ḩ?: y$@I$lcHvs$& ( a(MR=MpC\(vHHHHIC2m    HtB$@$@$@$@$LtIm @&$    dLlHHHH҄4P& $dg$@$@$@$@$&8Ʌb7IHHHH 8$>&    4!&d7IHH elS';T 2_V! D(K$@$ЦP.WJU T!@!UA$@$r|\㻴': @ pR< @Xim?[Q`{CH} @:W}' H(h?͑OmQU{>+ @kК @Z8i}/~+x$@@k'  ޗ?â" @!6s)y"$@$@-%ªL7^u?4K1,'+m؍|fePx By{yq؏Ux(565oqфl-S6~9m; B6KɶE?IR@{$@$@$-Z\Q{ŭCS3Zmnq`WAm:V>?OxŵOU $i@S5Sxd7qXd_z7R@$8aHHH -s+WKC:gV)*_ šgDg7x: ZΘH }qHkŞ cOEYxy*YNyҹC}W;OWhH 8$y  GV4`E4{'zƷʌrdtlq` h;8k3! h!do\tLOhBd0m~r㢭F} #~gSu!  D~ WNjٲ!v'(W: sHtC$8aHH1!ThBٵ0ђv(G2M$z85aHHH eErϯўÊ©H MqH n ?&POjӝH7:IHR@}ͩqXǻ1 $@훀 ϞHHRc_{5-ZF>/iXWcZV KCi=m -󪫺ڮ2^1dv=YfF3(^y[}-!룱^G=F]TNk;N/v`ː"!Aw$>tAejHyLm18cIH@4]Kǯ2~Uֱu5>\hifr-nS2к(Ӽi^c퀺8a=Sf)krU2v=NAkK#V][敶r/c/]/tdtdz;ҵeHC(^7qۂ9|555z4_uV=ΫLyEPm*s[uuuVi>zv:ZX,ȸXi]uOt HH:I<6M$@Q4FuQz4P& $dg$@$@$@$@$&8Ʌb7IHHHH 8$>&    4!@!M.I$@$@$@$@$@!6 :irM    H&:ɤ϶IHHHH MqH n @2 qH&}M$@$@$@$@iBC\(vHHHHIC2m    HtB$@$@$@$@$LtIm @&$    dLlHHHH҄4P& $dg$@$@-&P__& MϘ+۫}Eg?(7Kq1R¾]O g3UĘHҖt8 =xIcE=#f?/[*C3TVxJ.;D0Q&Nq xߓ/-@;#@ǡ]p. *-,2r5\="YwwnaIde$R=f}}є{'.'qd=ęu(^zz.2Op[Mޘ}[CmrKLg^83fNX(ūtg9 QY%S2/B}"X*GϜG%_ɍ}sL`};prn>9sR `ڲМސ]ZϜm^(O]yK%7`ظ*{$@#[ ?- Gg3(~T-EfW˙x%+%7XHT)11B;IlpqlfˢyN"/y9'9EN3Ma+3 />J}Ɯey=,Sm7gɨ d"so#̞=s0bT*wM-%kj !пN`[^I_"pM{K#\ss5bԉ2Խcra2DV,٩B5ŘH 8$0͓ 'Pnˮ+ECxA+Cq>ʝƙ0^cMTn \Az:RmCμE<^Ny G5+(O.y\Eʮ3Ϝ!~ǔ_ 8 >'/rS[Gt/O,M~sG؟a?)O9E 3HP2aǬ[2KkenYujxK@luCĻd 7HSK䘟O+_ZpA98;>89)z2^Y񇫥q.}Lo2seeI7˔+Ov06o,۷o73Ld߾}RQQ!ҹsgѣ[oORty$@$t/:Crމlyue`/|Y$;gddw-!Dq;2.rM^݌]4j@[q\N} 䗮\./.Wwd;:qǭ2+0Mk3,56, o⭷5: ^8 (ȗ/bڈBe5s䱀y^AŕMЃ̤[ʒ%K?; ' W\q?vb!G9ϐ\M%lHH?oæ;,c)N%JO猶>u, >#ճ42t&HBv gzt+=(7Cl+4ۺ1Gi[zdLp Cj*ؚoQ rZޣGqJ.SMjާ_9Xg!JRBJkʗ_~)z7NaåTVZ%|򉔕a'ƽC_wx/?oG0C`H*NKlyNzwBWfܸ@8IN!SǡǞȞ뛲̪4&1#i 8 /Xn =INrGdeI)JZ#Q:~c߄Ke`eU7=[Xژ&CqhQ7h2~x9ã Ql)*tqS74D$@$-uo4nнys#wKE:ou]|̘5[f͘.cϹ {::22 #sx| P݋َrń䁹oȻ+WgECϘ<*?Դ[rw\^Z]#/YXӳh=vy鍷77Ȍ=zZl9~i=ke?wX5pSRbޣywA3"BSry%r|y7ʴ7}[^u3Tal.@ΐo[fk7X>rۻYOo,vR)OsšYm^̾Tܴ#hos,}fqf i{/OY8S3nBfm6B,_K1mryLCrDa`$#| A3as1,_~0p=ᷙ $#1s^m`e֕.mr*qREA$<1 {jkk_~yg-Cu6D3gΖ-[b +F 9P[GXrw^e24@=ȑVw:wޭO3-ؠs)-@;%?[Nu&BbY$P]Vb`vyPz~d毥 G+DO C,*+%OS,3#>X&ʌ|ع)ՄJf(̨awt@z ұ*b68S\jn Q@$@$@$Ю t1{`ko߾Φek02es{`Z<@$@$@$@$@ %p!8PŌ_(--u٣> { K31c4Y-{$@$@$@^'ȑGl|̟?ߙZpq2/K-VFhU?,õr   'l.//S9 37gBU#}GtT"B=\ D5 Sx wC%sݺusާN=m:aQH b>+& /8;wvȄQ|y\lטCl1V[MacTHj$HˁPQHHE4^ڕ:rdI }`z/ʒJ'}.{J$@B%7!KD!6nꫯX3jn? 6llܸQlBOPe^`dv]IHHHH xq*O9&q;1/8:y>$=%   hZ{5Nh8uZvBŎ&!%    ?fEv$ގC":'݀U˖-ܯr    h fU6ZGa"Hկ>q r)svzڵH{g?+..*nhHHHH 1ΝI3{챪ʼbWyHi?+di0ѴWlː:xфUǎзv}[^vښ͛7ϯڵkA  B`׮]x㍏f͚+js؃:52[ߝuFۚc`#!pѴWlːơxQQ9EdiȲ2wZu.bj.3!λywl86LVc    Κ=0VQGZe&mhkbMטsUGcճcd>yj^^-CY%vpWOBA)a]怃wO8l'BZ*PvHHHHZt|h:>t[cim{ڞW-TϮ-(FrDpIy2wrBTG Xō> DGiڎV#UѴWeSevl׵4b 1ՋqC yUf5m mk]k?1eIHHHR=nӴ#0T]kT1trcmmrw:R=wv8 / w̖eZf5EyŦ (Si    '`4mH: GrUy#mݺZ8QNQN{+ i=캶Lv ];N*A_PIHHHO> cP8 Z/F^enO%4VC:ђAW}H켦ƗK4o$hݖ1#(m    бҴ*C>Α+kÖ#`! im=[r,%lhT-SYLUkR.v!C} @ б!i;q~@*iA]Lqw۵*r(נk:: &bAMҪ~0 ϡgc;*SXb#jӐym5V;ɵ<8^:d^r#!AƸj64X&i{*ִ5eZ1 @b xhڎX-C^-tS/2#yXCN1 @`NCP9ƉvGֺXbb~.Ӫ%ӲqKatk2[OӈUvQCrY=Z2; OzɽaSyUiCfU%S[Ziai/Ht4n(N)=c#u-wq05hEˠae2MkhW9c    бZHt4cDĐil!SWZf4i2RÇڰe I8s:SZ'NuAiF<1|`CvuTN;    H(4xueȵ,TeZ-ӪvZ+{ɴ_y3y,C3#VeC`}2 r;Mm'BPLŨeZ1 @b `,A^1dz@E#iqzZGz#hC(sǔo΄GZ'׺$ʵLc+hj׈yaP档i8 ' @` `:Tݱ-̎iͫچ\4kr-en{A:j ԁݱ[.GCA{PzZi)2ȽwE؝v A$@$@$@$PiдƐ#;r@+ <-2mzc`2G!֏x9p0Fڎ%Ez |*&   eȫ,TzbWHklUWW5#%Sƪ;*SHtTWu+6$И2;m# ZX`c`m9tQ2ePn]4m*GN!?HHHHBWjZc2!*\ǘc;uԾvhm$|]FtSD3d@fšǛ\?;u韎~8n0ysϘ3cL>|Ow~rx:G{:^ᐇ\;᧷̠Ǜ+=K@xj3Z]އF H@$ \]&_֒SgGBs%v?C\̐wLjwW|88Lgijzi?y@><RQQzOr% H@$ &*婓S>zM&OMD'F犖kO/ʝ#齇]H`za1?g]s/>\ԟ_x:vI@$  1yyhG5{Y3WM=?nR?yYӻg{y4Q=Y8s4t[?3맗>91:91z$  H@@ɉyۃxӱ?vy=?.Sg߭6>z]MH>ꃡu&;:\? ?=ǵW}4$  H@r*G#L~SԹw %WZ9e󄸚oEybW3C^zZK@$  cljҺOΎ]sn׫fOū=S;̩͚hmwQn. H@$^p[z+o|z??+ީasFkOYszffhO8sľ/( H@$py#O$GJß?xD뙛Uݞ3Uxqz^]Vo6J@$  | gCUojUZPP&[iǷ%  H@Azj[yЉ=5g:~ss׾Sg&rzj[c۞xo. H@$w i9ȉxM}Wt:swW|wѧ .g/}G=$  H@%:4ޠ{|zۗޮ[қtՁE[w:B#rYw̬g={?:wӞ$  H@0̹[5 _V?q7GJ?ҎzL{;ԻN;朵$  H@cwts+x߾w[8zGڪ8;p?k|G񑙣}$  H@!azz>ٮN칳3+?[ޝ{^3n6z<7J@$  |=Gor^&^s%݇3yhzg5<{$  H@x@}f~zfoݫٞK]%gGG{;?YK@$  =;-a|t,W?$  H@xΝ{ \{3_WH@$  |#Wt]ޛH@$  "ŮL^WۻK$  HuG _|տ$  H@s#{2[sQ$  H@ߍq|^ H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$U jռ8IENDB`davmail-6.3.0/src/site/resources/images/osx/osx-caldav-account-create.png0100644 0000000 0000000 00000254721 12564151555 025175 0ustar000000000 0000000 PNG  IHDRtt^ iCCPICC ProfileH Wy\S>,]oad **ԅ!wki."T j H]QV^E ZTZ\pC ^{w93s ;QPp=bJΝåPAM ,USRW#/ZhER!Db < vU L (@$.$űd3 @)( Xs˄H(KRqcl2V"#1F! OɗF!s+$Yc62i1eiQ_R! yRgRJL5hr%DмiNՑR B2CEmp5ob! *zR(@2 (U~U[R)XZD6\IA$Z ! łB FQ:oE=5ȏDR'ԌV,(Ql>ەmȦ-h##D+#1Bch:yyxyOx;T9hD(ʕG*17N.0 { )fBy;rPE&^qh]mhsezE w_0sŪ5X k¾a'X7 և `ϱw83qCw'8Ox> +Zߋ'sU@Ƅ ND2CJbQE D3Nt^ Bp(\;XJEHEY@YN4RZ(()}AG*jAuRSJj u' 4*FҲiʹ}n=N7уt]Eo_hhYkyjEkhɵhh:uIְvvH\{v }#(d,f2=:::::St:tju9ӧiteF01]_/X,#+RVX'YwXov[^Ȯg/j:ugVнDO[Q/BO@^u!}~~rg  DK 4!8v)g4ߐfdgXhXmyA##oL9FFGz cG8cJ׌ߙXM&LM.6gf*62gz,ʬlYms[O?g8.hp\ոnZs-[tY YZYX*,7Z|belfUhՀ5:Zj#ϕqk666jm6mml3lmǰ˷[ga7homd?~MmN׎NY;:>t2uspru|ŅR+*qwI6u/0;ӝ^ǽo K&Nx:~b;'~d[K<={z ==xzy=v{oIܧ烯ҷw/ouCg  T#=(hwINēvLl, *7&Tz7.L3߅_ W 1?x$Yy> *#.NmtA1c cY ǟJ`&%%MtMT&'IIkz&;LOnMɷSRf06%eJR;8i3vJO_~+9Cё9-)uVd֚ީΟz.<[ݖCٙ3I'?3rڵNL?;|lƑ33Rsrw$ Cyqy Ǣ0:р8XF ?8MÂPI4BZ'}V[uQrѮYl_Vqn!H~ĪdNIMQ8kAerg)V:Me6]jgg꾲73g?G>ܵ|Y芯R v̳x^|m y :-\Q̢ŌE^[fO>m_jt{|]y[|!2e}UTͫ~\/=rdE+}WnYE[%_umu5k*[ew]պg?[]uczCombmF6]߷bӲM76_yメ~uc[̶džeM;wVK1T_Sn+{{N{oښݛ3W-|w]۟tsk)oleu?~ ?:lsёGG9Vql'uur+::<]y-.] =K'.G^JܕsW'_qi{onyً]/_v yUju7ovz`x{.?&|)Q^@OpjF-),,|/O Ęhkrgd#}-U## ##Nqy@1_Z%Lm%iTXtXML:com.adobe.xmp 782 628 $@IDATxUu0:"5&ƒXM$|F`KL Ѩ&&h@PTTap({ssn^}{{jDZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ*W0 ԚdՠVVVVVVVYGdVФG˯U+P+P+P+P+P+P+3]GՍ!u\?;&_+P+P+P+P+P+P+(MQPkjjjjjjxW?ݕLLuZ+P+P+P+P+P+P+P+]~B'DZXzcC}XڍmԻA|onooWjVVVVVVVVzx*?i<t&awkjjjjjjj xG<mGxEj۴ 9nvv^? Zv`=NGK6^X|fB?b -IfqGI}ŵ :H2G2NeZۑbW_p~G1l$^7ŷmyHx"6#ZZZZZZZZS6~;^rl7V6Ggqaw4#Fu3֣Kދ1V] Lc=<7,ϴrp7ȼLg|/6oMg7&zw|GM徴>t~ŵ yiqMO~zLg{}(K_ݶc [u}d:m|lڲdi9,ϼntc;C9ӧ60Щe___@3SY[W=v.zqm=m`Lџ4iRر~o%Ͼrq7e ,.g|x)l+-}g{Պuw/uT~A֭=n4<@Mg/˥z۸8ZM/UpzYG?YZryp[~y>Ow:[_{~1z!Af<֧]Okvl͛7/ZxeEoۯ+z+JFBoMy` :O0ÜvͰ(TjbۼF #ˍڟ[nNyk^f:y۶mC'.a B{a[6'?T&n˃|۷7}ymso\e`}d0ׇ^G9?xry8m>Y=<~zh'T]<bkNh/,y;Z:!k?v}рíuOE5u/x}A_CCn'GgSLkߗU@ilt7XGgYŃ?* QU*tϼL~/NCu2!W\qwG^FTǍ7P!o :4cT\Y<`@RLhA=_>:4M_s^7@ǚ 7V5ru2_XP>M[^[n@_Η<}q/ -\a\nM}-|]Y& V>~'?E4oĘHq/YCpG:,Ϻz'=dtٍ\x0~޲c*O.@Ln^|tdڃ˺^2|i@ol"滛O}iF_>y2C>~^`Ǟ:9Y)ur>zA[p7<|p5s=sW?u:rMܟI3hk } ~?{y.g\~4p/d{Ph 7[xYޓnbAv~Ao^>KxؠnRdygZ;yn >"Ͼ66#7.:\Cf^'۵ Lh[րcՏqr6ُvg>@ډs r\7@6#7vM8vm=mbo?X^GViu'[?27j6=>:DqfFu(d]C9-iۍV:,\/h2}čvv㾟8"|1gs?``woŝ7_Xx/Ʊ'9y|S>Cv[}q7Ϗ>8>3gPl}d>`'WA,L!A]}NvE>~O}CxOzP9#VСY nѧciW/bcOe@yWs5c g9|k>}:E_>:#C:KvZ:q]+`כz\]ueLyg,k^A[h VX1ϡ@c׍b]DCu`gHabq_a,mcSkraHA[G9oV/S7[}{ǩ'\XsMrm'z[?0^g'<(6?۠~7=}ѕFo-wR:g2UyKUwBO~R6:paqP}a9hHgLo2'1&\8dѮZ$/|/g1'7Ӻ+bEߌݾļtIƅ+7wcMSgQ,bo+//{~|d<{~C{3y%4?3L 3[/)gn0vƔ^7AEF o,R/A_`jCߚ"ϯ P&M|u@;Ȍcg Gq+;;1n9L]}++sl2wdB~ѓvmqgnr62uy )k^{~|S㕿uf+vЀ^}~|톟DxNgmKC6[}_cƳ^g,sFwꥏQkanܬ/e{~s?q\b-ձȧܡ(q5փ6?|61z8_oMe̗:`|dɱ9h d 9t,zJ:Xk4 Lz{l 76-TikйGjx ?mx7'xb2pCfՏICtvޙ ,&;|h@A9}hub#A[=# O:?稭1ѰƼeZl︍S>z6@п#M"F_cmۮ1& >cضzuWG,xK K#O q3bim-1if7oͱ}F]Ew֗6?h.^4QcԩxqqڲeK#C]A.ѷ.92/X}u6ïWye>Y:FW2 ޺uk~5r|%F,|92b:EGdqe9^3lC晱>w9o9|0xbyW@=-r/>ov_zƗN{XFbEgn?gr l5ļ_yfŏ/0~q9_͌v3knz_ŋp83^ƯOl_Z/my+18h;;|/xg믎;xoܡ?:3^0,kˇ}ŗ>wuqbo#ʛ.sܸyWY'ҹośaGmo ǿ-هTiw>;y,-?oğ1oϜ7Ǿx Mޮ^Y!0OD^2 =\w[ BIuL8ΓQFWB6ꠇMd@.dl\qYO3on4yh>c5 ?n3*73miK%˚=1cƢ3kpgc/.kŁ΍i#&}MLںӶٴ y 6%h/> C] ? ryX\r/`u56.4u>%^1'/stPώ)pN_|~;*^җ P cڼK_'>{DEWO|(_'X?x}Ct~%.ě?f ?oX\m;o?{y|›ʳ.,;/h\xq'>8xe?fM+>}`f/6ƀ66}h@>6>ury`Ϙ^0u֌\d<3 ofL3+.xƏ8{1%ΛShӛ or3:KO.DӧOoU6mZj|9]@^3ϼ͙>3#=3x[.~7㐍k9緯kjc-zm7k͜nO.^1k~q)sK>c}bό}ulS^cĢeNkLN9qUj Pͥ~8iM}@qO};ܑ1܀kcq螳6cV9wܷGiroka> ܹsQ >Z*%?y < 4`G y_`|onwҗgBq1 km9ll.QGL5mٮ1w,ѥuzg>s>iJyIsxض#9jb>6"QM/܍w\nqe+oag~9+163-֔w lB]7m߿?cZl-?<>XjWsuzrm*~߁=bjY]_n$J}|`ؼqcS +cY͘}џKn{gG_h3^6I=緩E4 =W=A[3|XCVG+3yzdй/y/=C01 xTN/~32l]A;eȋ 2r-ǜ/> šX4ckˋ[6ވoRhW~2z)rcPrBSWVM M+;jq{q.٧or/oLO8Wx_}سX|])RNe<[:ڻq/}ָ_͖-yFԲ}q,]5_W~?fw:PQ%^ʯ\u;Ix麟q'e_C? Ģgg Ɓ\&N>c0;Nem+Μhc/:X>'ȵA7r|e_拎465~COX/ȃ/ 6wčRyOGwGSr˷sw N۷:y[b]yѠoGq.w&}quMq%DzU|X\:+1&M*2S8#Vrw/.XxQ\{eqQ~J2b;[tFyqӟ{+_k#_&V} qKcaOӋޕǸƻc+}/npzG_ʻKn8>iϏ# S\ӾkcߏÿKf𑣲FK8//cQZѿae'~=. tCyCgƞSv5LYOL>\/`e`4֪{S> y06^;C-jDM։~,A 4rn˕ n2®<3o4:Hg m×4b:)r?-{"rAݐ3ʻ ?[L,'+.{o- xfƢsޱ_7߽8brCX4غca,xs]7;r/*#orܣ|qcEn柢͛z\' 64:|WOv-乱x:釸Ѐ1qF`u oe` c2i=l`s.B/cϠ >Wnz>4;O9SlWʫ< ƞvSfMVЬ=x[W{__g}s\ECIY]e :˸;iڌ2ge'ms>-__KMOzn;5 =?֭_׬er/c_4n^vf<%owq7>g_qȏ.|x@y2jWAX~[c}6Y9%i7;mO>.–+{WKu5fY?1=ǜ 97 <9w޸%!߸O8sh4m9B?C#@ qY~;U`>q>rq|06tILuQ|0/Y71me0di|}#vW8hmι[;dosUٯɱlÇ2069xcCG#gh_O۶.V.8ԿGьNsٻ߿fsČǤ|' c9o*:͌fMk693֕_rT5oغX]>fԙI]̜sʯ=|^s;2}V>jCyZ{Fl.ʗ-:iΚ Īrۊ/{̽bִI~[{);6xe.wl_XgQ5佱(,ٰbE^C1cv̚#֔ɓˏMLG@p]W 6%veMS#ާ zEN}w$VTaĞs5-KԷsܘ}Kl,R_|^_18YkP@kV~cpoe]〵5;?1&CX?퐙#4rs%6W?@>6|('GG|ɍ#y;/֚A[䁝3}Z[sn9\3vk|trl MyHc=%[KT mciKFg2`ЋVЮ1~7Z88`rxtg]h[s-| Qt2C:AW_50 ;/d}cD[?7/Ǎ %'h#/V~G ١ѡ'}6ξ塝SKܗG YȡCZaGM7)C-`m=jܸƳn>C߆9WQ.e[i1q0|n 2'>IAcK7>k:ڀu-.YL}FU k=1 @#F"9~s<9;be%N;Ԗ?ug) 9K;7׌ȹ;(513rius.5[A?yW8@>z`Ɩoxd;EFCW2ϜrλX9ݻ熹?>O72h1i_'Γ7K}y\h ygü,W  ?QmrєۺKm[oiyϳKK?od 0.&pʠY<@^L,0zڂO?9'}:9]<Ç[<+@Ͼ<0W]6wWW4uԿ1Ƀc6Ƞ ;cd=tO?`PsߩY\S6:΍uӇ'?o/c9҃.2tm=>ophLCߋ ^O<`7}WqlAȈ~sSW 7>M,:spF|6眯:V)guXKqוk5w#F}=>zơ?c5Q'зm=Z``>p"֎~]g3GhԆ:јZ"Uc`c'dEйP찑e6 12@9_bda1r ;'AO=c/@ }x|Z}pmsll<׏Oƀ/fGAe_'gR sc?OV{0:Hja~K>z`乯Ը'Ooz/rw+#3(9 c@~m=H&wKg w2 î8 ֺ0V9zY7SpKt?c/f(BG}˿|p7@>z;2kȑ3h9z}mdȑc/_^Yvq3v@N񌯭čtzGեNۯS?y m:ۡ\'/{wz snw+w zЬo}G5ٗ·_8<YE0Vy"Soޘc|kîvNJd{p[o,4zmϼ ].%K_zjgan) @ƺ&̟1Oi=c_M0yNbbs$W# }0>g}OؚŇ6殾e;| dĤ[lz0@ ??:u] u^Žx9bܹsc̙~b/VOr^vmZ!dp_bHo{GG}&#aڀolv LƁ ڴqn:m}0ŷ!^>T@'8{SN9%6}Of;YZ@~ɺЇ S6Ol|N8 NCnG/t[dr說,E+ַqy2xzkS_hWj PK_-E;E\`k[4 9tzȍq]ȣc4uT/xU>#ӧ9Wg5&rIxXD0Ogm uK:C]7sӛk1S?FBx+kmٲe 7tS)k9=wa eϬ>|h!MOnXd]yqh L@ݐy۲vɐ=X>{v.Ng>sOa/}mPO뮻y~E^zi'?>3 gřgɸKl>v=%϶cvaqe5O t4zA#g]{(8+}|'ox9 F71P;soW/eԑ&ȍcn`cSo|S[E?|=&ֵ^G\˼9eO8o^!FqBvSkzA77xcI 47Ѯ%ϞŅ̓O,c#g!ՍĝpWm՘1X 4&' ,>#+e=id^Շym=r0~7rmGK.{Bg ޖUt}cS yX;K=`@IDAT89fsN>=|:fA;<19}@2͇ܙ!_d k=`ݤӫB[l}ca 20cfk菾7.57fؑ{ 2F;~>CX/F=ua} }rrh|bl:9C?!4hiOc.|౮ t|Z7~q 3vy N\|Wv`C9wAc/܌6`u珺~wͰ\c)עlmפ~ sqq C!~d֬YǓMChѢ+6Ϥ?)OC9nZ1W5ڲƸyػ;8∡}0Ȭђ~)_~oE?}[;ƛ~rM3>}i0Їx _7au7zwuV\tǚ| Ɵ3Mq}/y1U]u'Kc'Wx\4>#:ro؀cyg?`}S7SmK/׾;yzyq%ņgrߎvh:}JAnSo.`uC&܃@~c>~Z~s馁_׿Hů7GǞA|s .:ϣj&R,kȯwikOEFaDҦwCIr,O=vܶH,FÓ/&"`ѸѸhy#,x8_6)npӞE~bΗ>8mЧ8G\'P/'>32p=峥xc4ysLzⅯWmơoҔ806yMשB'>< &`9^|%¹kg/ԩj :o,;͵  &';l;>vm[}:Wοc|`PFLs9C,oM[p/t䃱/&&rx r|Ѭm^s<*sN壋 }P翳Kk;`Y]Gd'1]x+_<4 < k;Nk[k?7|QybvNΓȰvE'ɎN7Ŭ׭ơab(DK/2m䋕{OP$f.;ҟԧꫯn0s7,/*{P| |;kvi5)lN`׿$L[}ǻb3"~c.{Bms[o>x~3&/r[U >oƅ߾5NzMơVF| g.e#Ϳuƺj _e\=|Сy;}f]=n 3%~<P)67sGG>-:=i`/mዘL}殿c: k>4o޼nC_tǚymy ;-p77}{](GQ6Mų$t^>=hM6T^YgD:ʄ";ȼL۴s_]0cx2pXsQE><}1 r9h ׅ _ ?C˾7a$/}Kq6oOn28*Ҍi.ت O{c⩥V~mqMŦsS|ʌXՏǮ<8/:rS|_%޶mw_ꍇ_G#8_w{#W^XW5wƟ|3nYg |96zB?Ǥ' ^SF?.{/theЩ+sLmzCs@o>k7s>E=ѐcgx/ǐqՃyw5?i E`OoA#GpLaL?576?d C]Ǘ.m:b>@Κ^5uw~>V'zу:gm]bt\ߕO|15Eg4U^+ckx;T"F6vw;#%8dh[ۯqc.>^xڋ "'8 'j??*nY<|c &~ ML/xŅo˿K%/ D9vwLZ۹E. kşqx/Ou:n}.88<[⾕bʲe\?)7fO?~Uo׸Ƴ+⎍ωnA,.O?x¼5'/q%DzaKu^~RxѫN>sU\~ӯ YS>ƻ%&}ӦMG͋ݎJSj8i*׃ZWF򠭙 ke 13j1~g_ʔe]e#afxw8=/V7iňEʼn@] _+_J~ͅB s`{1$WE+|Γ+^9lO|A>z99>o6ƶlxo3ge\}uͭqϜeqOq񻇖6w!'`rsq?}o3b=6o|x᧖YZfLMgNW aC_y<:5huGuV>rg]te^l^dIƖdCS< `|Л}♓~͇>?kc?˥է/;sC:5m u_?낵\؇|䈽Gx3|Aӟth^`!qP+;* G%k&Wv~:AbĽnjwØ&E҆̃}t<91>smTf ^7?yW=;[|}&lL02`ߛI`agq\,y <'Kdž-;(Ssm2qئ5[9Pưq!LxKC;%r| 1?7)kM[&łg8`Vۼ5<-?Ƿ,n\8vzXy7z2xsTr۹f~SN@_{x^pg} zE?5^#202H<絛=cf[G#cY0CNGƷ>縌.FhK?ד̻=9yCӰȗ6CA]iu;yz}<}<&ť^||'a=Zv颋.jͻjv-z3&>]^aA]6sCβ7nOE_U,6Dߜ/wh̜,r:~z^U(6g'O.- N'3łW|E~bq-q3NɟG(ɱc)G:g Ė /y^,/֒q_gE\ŕ,w'7o冦9hvM1X[07OäseP ]iun偸@yU=9>{?>]e rƯk 2t O sr]i2q?txyƖ'>in :<9ˇGa ipzys-S:vS?5'w|pCF?=_}:f?AgI.!|͛hbcatI; @pf~.X|d ]4}:~mXW^tYiWy<}Kc`T;[΋G񿽢`ϓmU1Sc֤cSǙ6O7vpw_7^qwzoPyR:Hx˕bU6} ¬/| KKCハ-`\ /Z{9%Vwo)Cm4uNӦqu79>سS,kI`ں?:Xlm3qyرcJ𠘺c}ܽxe;cӊNng!̏)XK:C'6}ׄ6Nby@+׼ 28'zćcr.s<`_J+wWONy;n=B7[p:s̾5Cr 64~uk|4c'Hs:x'< 9ch_%&p<7hwGKǚS?-m(w`ΟP]-+آmӵ+mK;e\@ ;tyZ|_d09TOM.XwdNKcd#orm|s+[WZdظ``|hbh}+ cCN5ܜsiri̺y?nj>2/|}_ȡo}Ǟ欽|\;mu߽q%u馛(:l9^-7 #V< ;>.Nj^1utshw8; Y>h i;tް88D`4;ne?צQ;.8.}~xU `.fb4=z0Oro^ ;}x2>$_/:e%!aG@@AGTb.V\3i"SŎtEgƊkR E֨A!Ql!=yIܼ;}gw;{{K?*5gNr`q*G[sf,o9/yЭ2d i5 `[IO0O}hkZ N:Xdhx*7t%4a!һц8O c>tP͎4m3?UziX. ,t4tEΝw^LÙ2l3H7 p-?nMCȓ<V}guPɼiO򠛼/Bg8iy񡥃byiNC? ?Ӑy;??GqetQSgcM8!ͼTn<(4O?zz4OF>*)N0t~Z4ON?y^JiU&y*eRyOgM4ed4*y1\ nTڤcycMC kbOf3È-4P=E=gr*_x=YK^f A/'\~9/F>ߟnAmICCzk8psf q:Z!Z`ڱNCکµ086}fF:$6ѐi m>d$l #/m #OKyFݴIǙ>!C8σzBVV ߢ\TFerhYICôʇ4e,38?fJayiy(/mҫ@7 iɋ1`VyuB^̏fc^Z#AH2)-ig:zGaP ofYƋ204-Aٙ/gonhCnS7QZt'$i|tٱ0Aj_tKа3nT<eW>rRNMy0~ņҐʫ1Ca-e}?翟Rh+yi,y)_7MA?zok^ ii e"ӯ>3/}St*Ogx3E4Uy'Sa4 5WÕ&Sh~V?uNȋS*;&= qHIEFKx/)mtǐQ+JqP#(MKmMn74/6&mTX‹ni iRzљN??Rz2a|1/@YFU\*y"-EmZ0 iTFƫy14~\yi~Õ< g4ihk褧2y1*RZGˋ~00O,Fy3??K! Mzk5Z,aX4JG̓ṫxЭXLO^4Z^Q/Ň婲Z*/iɗFmmWa{ Yo?=l'60 va=Oy\44LxڼpQC*\EC%BC9O'`^hS}Me|TFy4Wpƫ Ed$ ÙnJχSlt̋񤧛q̓헉n5L<(#/ZpUNi0_ik: W :"x ^4lWl+lSl4zj miJ"={{kQG[? O0C#㏫~QXlQw,[ \O?4 tm~:3,Vw>\m#;M8ik?cGŽVߢ\ӯn1Oh2N/ポ~~04KÙ|i ՇȟqU^馭rRvōb0/$o5 !CM%&FKGLC9U&͋tQ4NxqD[6 ۉ_ziCcV>wF ?՞ r_~G #-MxXaLHNAM `?N dw/fuṕ3 u"/6vuz0Ѧa^4̃a䩃`E1fTnތF~*',|4^ob!W !-JGc8y]iN^c陎rj34 'tnô4ӫ:b4y1o䭲ЦIy)Ӧ!Y{Z6j{!2lk4lڦ 3 bdد٤'g4ޞ6 GTH:@ԥDK(O烈FyyhM)6F64 _:0ӯH* 2 Vp[i?B8l4hf>)iH56i4 送2ɋ)/ē/Wg:h.R~4LkYW56S~yL ?а*++>?u~YT6śl1o^<)4L0ҪWZhy̔CeWZoC|C<}ke+>f`_7>qx!Kӳ4f56k_m ߫=ވ=}jx?-r-*ozڑ.VFWzMO;NA֋aV[-mф0Glx߉K]ITR;b+f#ew̃FiFbO~I;"aZkN(/G"~ #36/E㠇7,{PRE#h> }{%!5-E)HI(+AqI5 JM,*p3IIINy0$x0 C0 8ˑ8@O+ `OIkt\tQ*PCe P\ TA. 3"2d HCj_חⴶ8DZ93$D0 C0 C80+.G CUU>ͫ]}bx֨Iن:. {jZY$NԉP'u@e.4qNLLB>ɢ VrK0D3n C0 C0 C 8DCSaUQQ7V?KBӺbعiJAB$Q0PYJ3Ԋ d)cJ+-Mh3;=iX .[1PPl0 C0 Ck)_Q>U]EJf+@( MfdRSTqe u2@%]BR,tt;XZx뒆6Iؐ[}E|h vLuHpC0 C0 C [ Ҥ_bɚJwĹt@]V(فj=~-gTq:  5PJ/9T$do/Ei|zk/3 ˥(C0 C0 C S9E) 1+\. p˔d v(ղJT])x._tAr&U28dvOGIb''Nɔ!`!`_Sl 8nIbŻvڠR2p@rn*pʄ(9҇*QzJ` F8*% imSd9R"}[VjjIʵ:$"S>I.E.l l!`!`'98 ҏUVVʞjԥwigA( nVAR9 [CNCa~%~QeHK <9- I8TQDs|$m? nCtm!r<|SZ2 J\Ҵp23pp_V)UcZV~ C0 C0NiLq8կi{ih}xx ](م/v!c#0&i4混 p/%ۤѪg ݕMuԅxw W>kQ>_7-S3fMMړXVP[qF+u.}i3i>oDmR3^b L"Ito๻&aؐa0<-e>^c۶u"8"$z[DbaB㈴!kG&9Yg$,NvTˢ%X?}\{D=qӨ[}Ũ◫=˕xb1*}:(uPfg+ xtUbSh4\zh?#S3ApaqN X-XfcWbsk)X}^ݡl3G੍9c^1=21|sQwOW7 naܼO$O͞Zf˱4Y0mDRmLEJ\9|6C,pcWr- `ͼ)T6k8,fN){tAi '<򿅼Y.C/[َ<,Df(¯n(UzzJ0pnܖe|A{ًCޔy+OcQV7Azevm5_Qin^c˩.څ3C8MY:hyԛm}Ce4 SӑM=_xg)A@IDATSQ-#, k/GZU kп]WqHiJŻ2H*Q2*J%*]/xоJ2#9v5!! xhy,9?S&tE߶2[V)Z=2Y qq58'M»ÞĪuޗ8lo}u{efU<]*lݺwaY+oGGa.qc`xaKm}ɑ_1mX70VfSz H4 .]G~4s~? f\H`ۯzY}>yEfR㿷pZx SeY{+{ Ƣ9Xpxc89ÿPn9(Fbu=",FaP.VdTc,X 4wkf-ĝ/ll}K$s(w=>T_ڲ[!a=?0Rqߵu;yGXc5]7@͞ \2R0_Etm.zn =ydy^q ]Nױ +v]y*Mƛ%7_e9!2lƦ5wQے,n9jc+GSҢ:0|?pޖ>٦Y "^Xex\tՅmp޺xb*;>A W$d7bˑٸ3#gq-KM>넢:j?UH +9~k p7-c3JpسB[ui/'~x9w-VͿ+_WEQ 6KћD_}-(YXr4\={'\KNe^d=5 .gZi{Xm04! LqhHGB~K}fn騑~N3Gz Ea]*bw[ G 2甆2QTb疃p.d {Q/jÿM{"'[c9I:T~tMZmPTD>^ ֭Z;YXuPL1]f\a20aiedb&qa#1lmo?+!1~XWTTdRٜuKI.M] sLEC~aaqk%`=4٫EfL6|:}%lDsѓH/H 7|۹1r ȇ^~ٌU"ãxDٿgO b Z?`ٳ?F_6Be LBn0d 3~ڽ&YrKZ]|^G:DU?=`oK}à^mQB`ǖ(O+eNa4өQ(AS%3eJ_iFZ ;$d-RϿfpw2Zz#Q&mbP潸x`Op[-J|.;4b Œ`pNp?BjA8 ˟Gd胾ahD[:j{h/RZ{͑W1Q;R{\>dtnY旃-V,^.o|IH>>VߣY6و;k"3x{KҒsj? [ꑾ V}shpݺǤ9v/RI8 /ma?`X.|#%٢ة1I6m0ࢉQaq݉ևFj[B㒄4LM0nr_7e&!)t g%8@J+baCͧ6&!e!\x9Np#XNCSD9I~NaT\WFq@M2ex7OHA2ȒC˝(_&04P)}|l9oe8P!JXU CkA# HEnffuHKIv Zy%>&/;S6Kql .2.7Bg9$pwd`WW|P NAG+x#|=-wb3?닺Ro3y|0c4K9csl¸oĒRO3wOrS_){93,$7.k*~uCzj$8]~L/,iFI{,AF=i|摻~(30m1LBk "1lsȷ6R}e ە_cX־>J'ױl+ahT/1l 1J X)k0JWS_[spþK~&3Y`qۊB&iFٙ>Qy }>k>ib`$9w~7Bjǰ9m`d1Z@|KPii^JЪ]ۃ) wr SK1P*'gI I2 C-2tYI;qNaipz=6L*ǭֺ<+*_BP1yNtr] _-#Rٔ+U $3$@}(6˦wm!  #񫊜G\σw1RlȓEK20 -ÇLj_$/bٺ]/ggc ٯ1+Hc+!s!+4Г}%v{R֕MDˮJHzL[QތGn쏹7y}~DvͪbCpؔQs _0O[Ekl'?}_j\P<-ݴhϘk=6<ay=u8d:|"T0+,Qڜǥ-Jå Q2p<'o^9V[:1r7TL[ZoZx-yp)=l>d:x̺Mwa|Sn?>/PvԾ"f;h"W߾or~uAyg"~BDGHDX?nf$&rѹ/:2?zY*˯ι4I߾݌!ߌj*m]*4!gO|))Mc$9{c\'z Z„7!)a [$~YNd.@eAfhh@3 ŅT9H$ɛ?}T2Ӱވ8̝ۓ6ңʀn^+i;Jp3[ a.;UhIAdT2,Z.D47eS3f?'{0JPRJ(}xfo{())le M|۾ 3ΓEyqg?&\I_cUpiAg0wk|j-Vt/N,޴`ڵ}gZry'󋋱+k1~tB1Rҡ76 wZiΥ44WխX[H鄾uܒ-NלyUy`,Hz MB*`uN^ͽvzYev<+[~pC4~G\YKj| SFzxݬ\,r&\2EӲt[Qq0r.mKnd0n֣ wechKSn+jM˫9hm{\a*Ϋr0t3Q1[  ?pu<~R{.@|7ڏ.y4uuz /m᝕ 1ޕv;˲aqwm|nyfCvQ| G(*EƷT }BI954 l<@{"Խ 1ix%\r&ThD`8 6xMz3Kf]~'7)GE1t@o7c&>ݲ&& ߤ4q {߶&`sѻw? e [;Dw>qϸAl]ƑV YN6hεyj 7C\q?wZㆡ߀A8(ٷr 6Ȇ腲!Oc,o{c2+@C/)<_'01%Ϸꋇw޸BNV12t'W#mcYe.|'O+; g#o|Dy2pٿ)O1|pex_yd1o8p {DMD1\e>*cΤYqN_휆Y{KTd(,Y+h2ǎ޽1`La6RNp#/QF~B9Ʃ_FxIC#s܈A๢ p1Xu(FmEk "ס#'iNʞԄ2q,&̗G&>ᴔt|U6`ac'vmo )~OJP#F* _ kh0vݶѭ4 %-f8澀byK_ϗ3ض˘)i~+VwwNwm([qQĽS{:ˌdR$3 7P!:3}p?TpBqa)tog7+AeYЪ, XOA[lX^"MEpKI`(,,BۋޖGQܯ԰Ply1ܖ_?F}E$hDcŴ.C1W4Ś>>/K5ev['Ծ>-Ŵ"(Y QR3xImԶ"CqQpM,)fٛ3/ۭ/%Vu6%$<> F}H}мB@!"%A7 Q |t-N^Uhi3&9'ex*PX>8"qХZyՈӒ`mS))7>faN(!IeЯG;jɊD G|ʉLTZd5/)edSgBDW12 NDFF%JRF!(/>\t #ï452 M-~bԏSp99ʳSVUdZ,LLvFJ',taѨMǨm8&sS85(-ouJ,RcW4!$ F'Bx/^(TH)qnQ9Rr3ӄ ҇6Ԯ* 1nMemFT ї&ܱ@K@aep`A6bt%ƻq.7H)n ϴy[Z 'S(O]qćJ*a5¸NwXcj,2IIZ9#!*K@e d F1y6!7I <ό!p!/<nhTؓc쬌8sC( >^NlN|5uXkhWD2P~4Ƞ\ϝ2! w\P"CDQZ$]t~k—{ ĥV +]Hg9Uf,-,P 9) #'+tU U C0 SSCsЮs8@A9kEh;Mħz42C0ozhnو8r|`Ni> *zz3 ZF0A;i46!`!5FTyjۺ 奲<n΁,.>\i KD!HXA.uW,R!/eE[p4<_G|trH x2d{ָ0fx'GW%tAN(2 z :KpFJ Oj*;+ayKD^*. "ál̿!%FF੍CqYq )gay+C㼱pf0L̜/~%g/a4`ᡴSƧfef^ksCI-+g/ƖwLj`Sd^`*2tAy2:#?k0FG:qi&>Љt!e ]d @4\ʳ1[0\9t/]/_zQ 6^ie*ء<-A2ֺyg.C0 CGz,l)_͗ )% 98I2Iqh/(}P 7 IeeXV4kGb6H~Ixi]OWe*/%u%x=9UTxY.Sř6E  kj+B~Gkd,>r\'fWǮ8{5(ů<ј 6nYW\D~,{sR E $E%vK؜ބ%o;b6=~=&~s7qXSm1]*lݺwcn~֭ߺ]rge#kr0(ӥigU޴~54(.-q/Ǣ*yEpHS0yܿx-ߴ g3KᬱbϸǰQ0xc, LziXfv )\YX`8wh",%-&V(&^Z%Kf`Ղ[O 7;FK y :CYE-$gOoWU)CiɕI>q!8$9ngDa-r6ِb(CVm2lGkċs#طtpݳߡkOfL62Oz lpD9[KqEE BUQR&:^Ų|~{zˋ~_OE)Yyl+]ߜtLqg M'3/e$rd*Fݽ%6= O 90u@}+.W`$ad7y~97?=ga!!p&0E0gBpqBh"5aЇ=s p0d)|m+Y5/mk!+_ͅIݸc!`a+0ogPD|UrSлP-v{ [!IZ8p̌Vq8(KqDNaNeLDM]_NdpF!!',,gJ8j 53^x$Ɖle`Y@to ʊxavuIGֱ4d}+pSk{b'Ø8t2G<.O-Ҧ{cf>R# Xp+"/^e5b &Fo`E8gen`[=zLo{;deE!hB2ky3&ّP|*A )a^Lj[Q̆ftws=& MBקwgevK֋pB7Rp7Gɡ7̣}z:t;哳G^7E@C0 CG87! < !KxQA2~YljF_*rˌ8P``;<4ϊP~}_cTelNh?!ZC ȩI5H.nh~ cd7* ɒP[3:w ,!awژ7(0iXu=8 )7?GAAAڀN³Y [:)L <-4ވGvB♒] d`E<쓣@Sp#ܱ_s'6 M5ѵ;l쏯m"dg$[ "/ 1pae6tw^!I$iw L4}L\IMԋSǏ_=ylF50 C0"`CCb:9"9w̘r%{ck/˰vK)wBɢ rWbB# LY!@}ؓ~{HIDY/x6ZN67<}= %$Kp JynܔC8zT\{5BxȌȶWNr{d%pni82E]=7Lp^uMw&ec!`!,_5܈Z|S.<>ك=;]v7oϡ)7*s=[R8Y@+Яg<",^)fɞ G$zt5U5 `$57;)kdtMg$.Kb.o+FDiHR OdndgXce{nw@X$Ŀm_V?ɣ ?3 LY7v )\kވA q3Ý~G1cxc҅2k⩋ #Om2k1t<[q[x 둃k |wZ GŸ95k.3Y,/As!2t|U9ǍpT3Oߍjъdƈaǰ_猓Y+d(e)4 uK$IeWW |=ɩi_r93`|z(%s.YQV !`@B,Cę>e(<]hG(PMGY))Hc{\;y[~ KTNʒtjR#Q䓭*!sh<1.; n!E:G@fR*BR #]fyg M KXտA,Ei S&0ȾD J32+-S4#C^Ub N (TKB1!G E0 C0Z7⌝Opoi0ѮYӭ|e3"h-充xC^]uG( ܸS)p3-q2P#ejc: z""v "/SJ)(&qrP9Eݒ6_$IM cheM6^:~ri~EcqAJI$$JxcG:.,r]UcM5'ɩ0 CGTqP ~u贡@֋~ Sw$Fq"%F\T^^]ȏwUEYK#S|=|Z#ke$Q }bj0<4Mڠrt:?ŤoONiHMMu%_Ke0 C0 SAqqDˇ7o\^=a$*'-}dȘ 9wǬMw̪{yk|Y!yڑ*D&Q/s0 nNRiUѧMQFʪ3 21 C0 C850;޺ׁ֭[c@$tن}'ڂjf])2V*"s(\|'Vhv aT$ĕpUTgf8Y(e!`!`>0SSy7|׀uHI.Ċu'Ȕ'FYC˖Dp/Qis@-~*pDQYDYT[y0*O@ZZS(.ORُ60 C0 C끀)'8%U4>qx}nlz5u׮K/IW *rɿs/47@A"5o4$F>ۅC+#2ܑiJe51 C0 C 8v8DYtz"{c|~m -_\'h)8h0Qe3u]Q'ˑY.O} :܆!`!`68+trBAuk>d m'$w@4yZp"KSp'A eA<%)=8{!.0p8syL) DЌ!`!`@88#r<+T8 TOv"{!Jh )iHl" Gj r.dmR\MrU2WFvߧ%~ ; yI'- C0 C0U4 )0(UUo@lUw8PCrI ":DZJ5ڷJwE= gJ }J *t3/$b0 C0 C)P9Aa:PAuց*4>M(Urj,O%Ql=M^Hڼ/,ڏ!`!`!)ah8ց_3UiJ/.0]Ӗ!`!`_oLq8IO@U(lmFӪB*f 1s!`!`4S +SAL* jSHU9P[ m0 C0 Ch)8D|* DU$MV: C0 C0 "`CK @0 C0 CGG1 C0 C0 C &8Ą" C0 C0 C`0 C0 C0D&!2C0 C0 C0ڀ!`!`!`4)MBd!`!`!`C0 C0 ChS C0 C0 Ck!`!`!$84 !`!`@Ar~'!o?g(((@FF"X!`!,jjjP\\N:wJcD 0š! <cƌi@c|Ɓa! ѣ0*.?XlAgv?砪Hx%}:eUx-JKK3[;PZ^iI~. +8?/Qv_x^W9-CpwOf;ԹCk\zQ/'Ӻ}/4O(HIIA۶m|/s*//GNN8㌿k|GLq8OC8jAuHMM=j~j|n =څCZZ>U SGiEuAt^eo+sta>,J) +Gן/Ek/(=~D<8X2l<3S{ȯN2`ܮ?T-(ˁ`7^~S5ڧu)KnD<{6?Dنli( A8RlSZ)-R @ ==-O25k I/G7dG yox] lho(t0u, u(*EyziA=G2D̊Lp6]' L8/ o7"ղPHR&@CշG,È>~ Yh@K`ʹr,!`8If %<,*`WA6q W4>i)I!AVͶ9CQQp˭8\ oƅ5hqVGXFG -훋N({*Ǣ CC@ץ~uXΧ J=5GWمw"r9V$~WFܜyi~,KEf!#/e@d 5E ilF%[QXY!`Lq8  C0 TG4(IobHEf!"lz>G\= Mt*B%!|f˗zswө0᫮0 C!D$?4u,ןt<Oi#+U:CMT޷G%WdkCS= dDj3O=`snJ'nIs.eӶSi XD eUmEٜ-5tvm>[yQu܂Zhڂ:uq:e)ف~a}@ 0U( @9F:Qfi7ډomO}hH9*wi:Yΐ\R=ᤣwf >e q/!@ hg79GSdZNN[ʄp[1fdj -4\{u腞\WgJG;r::e)*C}_GՅ HL!1r @ {&4@m ::Ί(p5mDvS ZV;7]~p8\ƷE?QD3NHm<4__]C"OP4ч@ PױpliiSPqZeh9cjժ_9>?~v L6MFϟ/]v'#%oZxJI.vUJNݺT7GwW˒MET};)EV.8_PF2رK^^ZT@IDAT^L^kS\\,sΕAyGnnpu}>eS^uSu8ѧk][DA=LC8eBDHC@ :uѐtP]j!e^$DE&P=`= @ f8iL @h pS @ f8iL @h pS @ f8iL @h pS @ f8iL @h pS @ f8iL @h pS @ f8iL @h pS @ f-\?Ch***ͮĮ-6p:\uYڵ&!Y[k:V>,2/a*w*5*˴_婌}Y؞}"S]˙\ceu}JT޷Ku42Me5!,tXzZ?Яꆃɬk?Yp]sCn??2H4 TM/Koe6]_׵V:Tnym^XuXYͳYbA>mAlv%eV6z:VF@= ]V^ceQ~[%p% tnqn,\QQ2QL!̞WӂYb+T{d~df[گd×kr/NYӪcy[TZ곲˒}8 @ __Ҏ 4 :ak:Vz`C<(̄ @@& 8d>mC @ G8ȃL@ dC&6 @rC<(̄ @@& 8d>mC @ G8ȃL@ dC&6 @rȃL@@Xi\rll+?9vϓ1=ʵZ)@'C @a|kyu&ZV!74GԶ ^8K &Ol!0i&T4z@@S'9;ɍ\Qw] FNL2̝g ݺu?rwȒ%Kd}]L'ykir[=g`M%ׂw$K1dC@@ W~fڌ&~^sʽӋ=6K.5ݎ \{V?Z[kW 6qNG@FH4 @,;wn۱XBXj<2|)((<ᄇ^{u.../"ֿȿKydΜ9zji۶t!Ȟ{p-[;'-Z~ɡ*Z*\=v*Zh2.Y/%n% {wmk!|hl+&C"=lcz YI2ݩ*?!иj6n@ ˗/?<|Ϝ93=r7{「t"|Ɓ*r]wNK(++ Iq s{=ѳ*O3fx2dȐHu:~j{>}og՞vBK7raЂ!KV3!E\]_ m9g ) ,Lt[|~rӟVA9 )8Jt*6l-E~=n8z+*ݺ:!q?;JB@3%/zUn6׿ex„ _*HO4I暸s'W 6ȹ+7n4l۶M.`jS0Sp>ٍN{VaMwkRNޣHi唧(d@z8+B@3 еk`P6m"6|Rt>Sr 7e7NH۩HG~_k.Fk4taڴi2bĈ:!QO>ф1tP9#e=qJ$zsrݖ)NL!Ja2@h.~_ٳYdq:?i\Y]p=.pwMҵzn:2:jvdy _w}v1`Q'GGH4_O)S 2Fj|Ιr҃ȸޑCA!:@ڟh/s@']p,IIҥ#˖- bҺ{9#[n[|`&x2uaԨQhѢe;@PziP%BF`ȑg4z1mc1wqG)L:eɂ.5:1f!t%P7=.]oa;8b}WDNo l84G͍Bh>֛w+rKzVhժUpVG-~An㠊z:@zH\~~~^K.$+r7ӏ>&O?-}ү_?ѳ|ɸ p4Kqh l"g@D_Sc9袋mYuZӞ{ljL"~GL>09fV𶭦G 4_8s Eqg}6OqV\R˗@O0xjgdnݺ%ʼ~y<6yrVڇQU8]%5]0$f?E:I7gB(4]׿5怹(::ӠZ_¥!?f/\Ҳ~鵮O[A8l?@ kͽvuou 52.D`YZ :e馛nzW M&guVnz:fӓt֩ӚN=`R\EUO+6ҍ%Eb6ݎ5FYdFTw-. u:vmBG4NM5O:;צMgۃWNos:~VAШQ޶v־}zdB'09>UKB%0*_Н _:eT~Bnu tP3J\7qWǎYLN˃ ;w 4hrN OGT㨏`:vmiӷ'&k̮-v@WciǾ,P`!L4 @ &Us oQ.XK%Gc֚ݦLUe\@i%VT@h(psB@CVNVSLA:. ǩ_YJA cZL2u "Xi D ~\OVomjjH/*/C< 5! 0@ @!H@ @qh? @R $T @ 84 @)qH* @hpo@ 8 @ 4w@***u^^صŦN'~. ~YuQ6$Y9kKc_Ut]_ʇeVb|;L_eyXE1F}<=+{>soy]dkc~9k_[;̿]v_i5eTOGWp0գz2+tnq@ ؗ})ei_æv8?u]-bM ˴+y6=K[r?h٠_P=-ͮT6}ߦ@Phgrkl,odtdrҍ~8ҍY:J7Jf8Jחu8$s3p]ZjZ0=K[l45 ~o|]6=O촴`rKu,P~r-_^^Vi2_r~Zu,Oc+c]B2[}VpYҹO!!wd@ 2V;"_: PG7b-[X*Qqȑ @$Lҧm@ yP @ Lq$}چ @@qȑ @$Lҧm@ yP @ Lq$}چ @@qȑ @$Lҧm@ yP @ Lq$}چ @@qȑ @$Lҧm@ 9b'fBj%jFZ)ɘ&FoZzK! qH[j F&u2׹Ck7:u@EEX,$[7Jϓ6 Mҭ{iߵU5 +ȌjUW3NH/v@hD{GC-śe+eqVRμ}ԫlUoR)+-dqA|)lm[ߕ¶5m̯LwVДnu%dkdGkd[qY9a݂g6R ]KU=@`;k*@@& hgNGVǘU~rU#cī̓Ŀ~3Jotswo%m ͱ;νJ[ڦ(m[ʤu@]m[KIEΣEuSiL{j;wu*+d㪭Α شz|rܯrYj2YZMRZthm;2`Ϯ!k7l/)֌{_F/pБm{i_5K6SPf\>\ jx5," 4FL Y۷7y5QAַQ. _%d%\\Ur胿kˆmWl[vw.ҮK`@ϧ/i9@cQ=ۊ(\*nkKh7gseq=dC V܍ <~1NёSFuqd5mAgK-'^$@cqhLڴ@#oG-}ؕ䜻Jɧ|Fy sA^:zP^^3:P.NVgFsp?|6ppL0^n Ϯw>YSToݡsN]:?::[$N1kGNu# #[9,S+E-/ ,hơWB2C!3i2L&+(E~Smα7y z&}C4#/v?J|K\[fAtJԗ|t7K(&_ES߰9+~MOaՎrѩ_$YX;$m1DbwEQ(F @cqh ʴ@YG@ԅ -lZS"\6ӍB>BN+fŜU~;cuM:H;3)q@`Z_U鴥$nMw܁wzO~Qr8h;v_T!Qn-^ricm[HYiyvB"@! @Mnj/}s<㠷dO8߭xt}4T鷎 р+&g=N:?z`'LygݭϮ ;]o;Km[z#~24[YVt=:J[6s/I6[J~Ǡ u{{Lo_>\<u @q 84.oZ &B@B[zN+w J;}uC]ou4@՟rN*kެkG]C,ҒfQ` u$:rۦuہ=E?znu-/^-xuqƻnWV]=OCº6ށdC2 d Sӊv+qӃiEzDxZmS/C#ץ}J7tSȰjN׷tz.Dkw(.@8d=-C@X6wHK6*ŪU)6@GFW,,.R[= WΑ3[@Qvuswe1in p9` 4uy%to؄Y$tv_9M\k;m{A38b@ 8d@H+ %he`5N&,I0$+)eWM@J![ vA@ZhԝR(9 \ J.6B @i'v4@ 'ϐ; @@ 81 @ @ 83 @ v8iGL @}8 @ C @rC?C @i'v4@ 'ϐ; @@ 81 @ @ 83 @ v8iGL @}-r@!PQQQݰ]][lJt"Gk_GMeC24eQeMu|Xfe,?*V_ηU/UckTڗiY~S!سc=GKE;3ؕohejZCXL.$_} Y=~:,2H6~~Xd}ib_=lk ˭]u,,4L밲giӳ* U}3ۂӧOOO)ԺjժH>J4'8is QO>lٲ%ΆG}4N֘dqJ fEǡY=nn2EXLi믿k a^^^\3Q8%@"Ь77 @"kNU ֭gy&*  !5C @)m:c=&M89n?C _Njٳe֬Y2f̘z̕+Wf[۪U+e]dر2n8޽{i@u&Pgd ԍ.޼yst!Uaƍr-?,|M\o_vAN=TO~"m۶C@ ULUJz z'x"#0FիcdQ 8餓nt2:"w]Yx5 :q.!@u#oΝSe˖rM!ґuk9#|A2<u@HC*Ё ԓ#<Wrw:HF+**&k>d>H~֩  33[o}@>^[SvfHI _ye , dgɁ(-Z>8.wߕ?8N3gJ#y#G?AM7,Vy8p38C)9Ӄ:~ũˤI Fǡ6B'!Po2e֪`Ҡ-~$o.rimC-5$r㎲{w6p@mR ;zoӝn8D*o֭Z@]4oWn^^^Sr/,^ b_U]HyQxc.;ZN?[eMoQ.n[2c_*֮ ]~Ƚ]Fy'evyB]$eqdw.r7Ox| =vhpI'nJR)v١,UKVJ1%ϐE6KEs X+j@sfϞ].**I rdaӦMryɳ>[dhNmZF>t"قkىIu"~ @ Тy&wnNn씤s)2HQ堀'g\0Qu-Su⏿W3ʼU;:eMA^AY釟HAG?=MgL.htӆ &˽ϐICFQ'](GOGUw`حҁx1q`.WiPҦU-ݼPlQPmo\G9L>u^Br!4t8餓;+VTtyz]c1gΜK蔧'Z2X^E]yd hRWױpl#*?*MqXN1wp_` gOHnqtʑڪg=lܸ1:zK/4qsw)KA@Kرc0zny`^G:w;wn0z{٭[\}v3ʫbtصMkS}T߮-vU!@!UiXJ۝@AD m&|ju}ҡCauҿ|␸\2~Su=iз:'߬׃tzt*SO=嶑(p A[nRVwR* A@ @h +Wʃ>YaVӠU/*Y_pWȵ^FDe =]K. gӪtKpόPg#P'FI AK@H3=Y .q-xq(q'ӦM FFY _L>].\Xg ֞y4).mݪV[N;dg>o ӶtN=SE Aǡy,2/a*w*5*˴_婌}Y؞}"S]˙\ceu}JT޷Ku42Me5!,tXzZ?Яꆃɬk?Yp]sCn??2H4 TM/Koe6]_׵V:Tnym^XuXYͳYbA>mAlv%eV6z:VF@= ]V^ceQ~[%p% tnqn,\QQ2QL!̞WӂYb+T{d~df[گd×kr/NYӪcy[TZ곲˒}8 @ __Ҏ 4 :ak:Vz`C<(̄ @@& 8d>mC @ G8ȃL@ dC&6 @rC<(̄ @@& R&6 4 K+dIq;ήY8Lr Bh[4DlCK!{ A@%pTO&h-4i8Mrs sR|o`ko<$@`WlB@9ICZ2ocԤ]ډ-_ڶ`!'(FC/ @ Av/7@ D0VD$@ t`!trѺ .!OFtK:Hu{{U|IĶUݣc^4U[+õ0k~C߬NLUN[-fs 뼍$;Fdp{rR!"]k @ h'vr@WɏD:- 3wf_VeܲzZF;}In;!Qڶ:7^\\!Z;'QxuZ,s"jA C:bu˂:OSou^qk>DMA/)^!@ ˰!4@hL\iӓ[]^j^k9KNV=1ﴫ+|=* mASuxf D4hgee6L@IDAT;@{%Ǝ`:>!$Ԃ:9[[T"z4mBN@%2dk2I!@ #3pg܌7~θvk K+띱:ۋrLOkI4}sN/K[~8V&QP67~^tksՋSssX ";]k @ uحt-wM/a7FHX Lo&]z.llj2Hv~.yMQu=?e}-ē9 ~G Ǻc] .Չo|7х0S6R l[*w.v^iNT\8Z*ж}|TNn +[1E[& |V!QTD P\@HW%mB@@HˆN_:U)㜨)Xڕ:5Qm6'Ǘ'zuݺ5QݱIG&%Sz-_k@ Zf., 4 ]E7;|}?Dm9hIkê~:4v6}=E~v8rlk@DCS4$Ѽ=ܚDA#@O /Xۋ J`d_~GX;ىoduD?iMAw<ҵ~5)АL::9#-S qYbH1}b@ sX9 @Y@@ڀNNٯ[I )6&O8ҔH_զ %65OEr:tH(tux\2!qH[j !E-7zY)H;wpx}⪭a~?/[y 6,~Ս Qa8gALELG9:hl8ۇ#@@Ўz㠷bd?D:}}(#`' "nտ:Gk.~MW$Z=$ Y@f8d;B@^׭}slʏJ5_6?(NK;Q[&[tm!nS4$u|m5{]tёDZԚ @2K!iNrV&`~7VGLG'T6;u+[݉m ʤJ6U>z4}>":B'B'cq;. Cl8۟)5B@әS`Aߪ';u r+vF3%:&Sk %骶C#|鳍!@F Ϊ: 5NG7g]lJRѭڡB54G?q'\sL]iNYC@4) @ ' h<|v#!iӵUmǮjyH%gEԦ+S١BCT# 0tp {$Վ:PZNCdLUʞg% azҘ6];̉Tg@ߚw R`۹I2U Z/sb| /$V}ݚr ѱjzWȔ ١eI$iy]HOuqDryvYy K:SaHT5 Y8O ev5vTj I'΂ךWHQ[NP^1YDZ\;=եsOG3+tAwm\잉!!=K @ K,`P3PK>v#ѩmU:%u-> ]R{m]6c  @ p8A @  8Sf@ 42FNs @E8԰ @Lǡ @rC.>5l @@#qhd4@ \$㐋O !@ p8A @  8Sf@ 42FNs @E8԰ @LE#Gs {뼼|_2gS@cqhLڴ@9E PAA{;9c!Mfys!@)ڛϔa484Gɍ@@C X^ K?n;+Ӡw ]vwQ{enԦٕ)X+ Ľ[5IV,,N=JQ]c+Jihps. @ 0ԛNT˥nV.tTns[]Y t%|Jj#WC6|;@ht$bAFE@ f4 @C<  @@q⇃i @8$ @YL!A @ [8d˓@ d1,~8@ l!-O; @ p` @C<  @@hŶa &PQQQm]][lJt"Gk_GMeC24eQeMu|Xfe,?*V_ηU/UckTڗiY~S!سc=GKE;3ؕohejZCXL.$_} Y=~:,2H6~~Xd}ib_=lk ˭]u,,4L밲giӳ* U}3ۂ?VF-Gr8srvުfV\5բEjm 58Y n:|G.z^B鷁 84BVKxL:8s.S!o,/3w7Nt'勍qj_bĹnSFter}y5u(zfZ.r?u m? }-^rb.Ϻ!f"XqYÛ_Ϟ\?OJiy['rpPN%gt'zWk 2oKe7ă+uǧc֜Tl<z*]9Wg^]/{=i{7emN߮]ض5xߜtM^cO l?y&@h**X+e[We}xGTaY=t0.JƵJ|HUk⭲fz ݽF]9x%S$s4A:xy.8 k jyӤ͠rݑ}E;\|Aw_*N60uL+]vo]6wL>t!nE uazLeav;mJi_zE2鵢n]L+ݟȊ箐ۮ<8RϥoKb=M:8VT-oQ6{>Tw{轺g1aX^1:1XVfiS*b@ p !@v[*W낂ϖZ zcRt20x7iiS*;gu\ UdV0x0@:O٢om;K?!^u&ZVߏ.TYUثdc?|'޿;Mξr'TCƮO{#w|O:aeSG+/gr9WΊvbZ/e˖odݺuR\\,mڴN:IݥgϞҷo߬9TW@YJ߹KKlrX5.yvVZd&9ݪEa2ZTTL?6&Fjj7mѕ.rG4Adɿ|}Z~_xAӁlŲ A\R=ASa*Uͭaړj0/iмr 'j3gMy*^7!]4S1[kIKʫ*}kN89EkZ嚯zO,~!@2[](~.3n)AW1{O*mOu?w0aRgz~V;LQě:YZ,+b',סʋ)Wٺ& qK7vmO/|:Sq\+]*6o;fT,{8T&), N"$YsΕJvyg9rt;OG3x`ٰa|ƍe]waqᇇ%<&Ay2&ٴ}\|׃0e̬tp5!cTb~|7Xb/VM9ZvNqՒ^Ȇ O]ߨ. S$iZ ug*6,/%/RpFoz~sݹ< spӰ`{eܸqqNC$u*TO'dCf* 8:E?z}>rC֛||'>U^{y5U=)/ .uͷ/sp=+ЉϺF@E;zMpɺA;;>=tYFUZlYi*s1m%vUs7?s6̸ͫ!VdyޣrL)KOjF!u݄Ki`K/~wU* (f:"ĉ1Cf4c1!&ĖN0f&&&N:|$ԗ1iߒR3ė "Dch"P }[rOZz~=l>pjMo)j>=i}v'G&_[>tm?7ON|r7)778r}׏e)woɮ]{?ن`s/*4w|vz0I'L{a4m?/76k;W>ؾ2S:9~{e=vpxߵΧ(u!&4K;KJz׻ʹ~ 3L馛թOh %=d+9bO|d7>crM>s饗n~"f%|?}N;7`7W$O=N~ܳ׃uAzS呇_ygK9g}=>㏖״Pg9]wG{f={ˉ҅O=>n={O,oF깆d۽o_go3=c=6̛/Ny,Tm{キo7~ͯڽFw[n|_.zիzҾ'x}wBzץay/:t s1ѬflKo֮C~ٮK;|_6R[++M#ۨ؞Ub@8n_s`K׭zhݺ:n_shga(b{}o]}SvroýVަ/v7g$^ .hAȿt'GsizC}%akys7@ # <޼#/tӡ!"y ?^<80~Ղ@ 03<~=л/Ow7|Sj?O73ߔw#ڧ|k_O}@ v<ׇ sE&À)|_-?ˇ?{ggv"\0#wGNmϿ @7i`Myk^~h72˪ Ah>_b@ @`!@ر^׷ߟ@;7 thл _]^mAX,##lw> @v$={? = G)<@⋛/Jd ?ϵ'[p7n@%/?l/xAܽ~IC_:4O\nCgppψզT?K,{N= @`л]tQ{Hʣ>ھ{p 'Acݭաgmߥ/ԯyIX8 G @L@OxXڑ~.}k~_?C|Ά /S?0 //|a:thkYkδ/n?sWp?m  @`Nׯ)uY׿uyGOE%9֓O>q .hiPk 0r#L럖?uZ|׼ @`tu$׺eד|nd0~o\uUi;}4gUOփ@M.n>#َx3KGXcD @K@tj;bY @džy\g xaa,~kweZ4mO?y@ 0O O?]yu4y4q88~fad렶Eo==@O)@ءW7 /8CI'4iPSTD@ǂ؇u,sO@ۗrJ?Fq^c㸭C>Ч,X#EV oyˁFQ @`^|yMణ^nۇ^֗޽<|yX) -!gƽDq+wyam}aOI wy,?p΃S͋  H@?bЯ*דnÔ cvfgVw^xV>6j -%a!@ %-K @ <88,kJ @ 88,K @ <88,kJ @ 88,K @ <88,kJ @ 88,K @ <88,kJ @ 88,K @ <vJ @^^{ppz?: @" =}ϱlmtc-b Ku @J]Ԛ.-rv<8B|@k505-C @`q֏3.`58z5,~ @ 3 l^qpZp65c37 @]^oo\Tct͙"S}pXf@] {JC @`3V/0G:au]6up뢚7^WOG?sD @hhyj?4WއQܫZ_ˏՆ޿wݽIrW_Q_tP麅uD[U_Cn޽/z'f @ !裏>v]w7lb];k)V| ͱklޱ*u_iї'Z:Nmu|sNn6Ӵs*}kX@ gڀky_ yoc֞o5mxvEwNuʏWCu1Vc556ޛZĬc/|ZksMzt@躴&]عmZV9(y @[G@g0۸&5qӞ\{{[Y߯к#kxA7A7kBCQ˾֕?1#O @l~\Zר~mzU7f{p@-ʛ񾞾+֢n?s>^6~a!@@ُܷV~ߥ=`_>D@GYUM̻'Q~#Zŋ>8xz眵g͹AyVM @ ~Y רg55a=js4EP]D{f?Z8}x,B {y؏6 rhpOkuO95>f=8hD,}BGuؾQWGC^UF- @ xoٷx5 ѕGk5L5;uQYej߬XP[l 3N5[k}н4|@]u0 @sZh;oۗs5#jqz.v^-(n{Xk{NXֿY_{A9?m܋ @X,t^/k}9X֚s9>moz4bDY[oW>Qٟvc-0nUr~@Z]+1br:,غ=>HGVsR{}~wB~\b1 @G گyN~ѺZΚku^#ښkچSuiݔA9mCl:<}?*o> D߽4wR5Ws5<$' @ }KϚɏqk>[5Y gM.\mj 98&yucھ8沯YЋ{8B=_ռ}מZS @&gf_.ؾe}h}fսQZ,kSǐIFht}Mק> | 獾5ͣ8mR/4 [^| @ }[]K{?YfԧGݾmc3->nE??Ԑjf_5u(39/߱rZJ5, @h}ie]Ęs,;wk^lmhήsw}Msn'"je/ιXg_u7녑.;q}I:e}u鵼\ @%b5|FZ;6|]./로kb(*q5lc ko @X(l1Ð6uizܧZǪ %_5AzӐ}筫־kbyπ @8vӨYiQ^R|sُι6Q @ Hڷy|iG^%f^~lo[]-.oy[wMc=|08jsux*g_V#ۉ:\!@G |kʯֽAVy4bkbVXCsix~[kmr%g9ǃ؃C\7 ;g;PN5Q:o9Znuܤڼm._C9 Ig_n}% @ڷu lU'߱hU=cb9ٚzӺqyHok=ھ\g98fjgEڗ;/ys89ǚ##wɕ|ͷ @X b>sg9l @ cgt^;{Pr[sfQ5yjⵁVuYy&_C־jX b -k؟c+{@ 8';XV~WͻKs,kz_x5jlVumkڤjA?7spbg1&_C൙ՈcY6h>9V~ǶƹU @`ÚlUg-Q[n֚bk|1smJ _au&ً9^0׈瑦;W|ϡrq}}QYkZ; @XόX6yOsmUg_6w޺7u\P^uhkoփn:m3WEkXg_6a> (o]5Qu9Tu5vM3ZkxN~b> @0'֪sN>>}k˷kZ;vt5ͺkїsזY+np]Ǽ|Ἤ``7QWiWF~sZRhz(a6@ cB +zAe󥚨iI~wwu҈$3&jw~FZ7W}y8~YjoͿ5'/o-J=gkF0 IDAT @C 9g=t_9>j>M}hc^jC/ٗp<~:hת @1m{MҬ=jԈ}YW}mۛORCI;sOΜ/9o5u[ j~ߕWNy=J @Ǟ@$۷;~qm_5A{؟kubuڱZ_jsuDځ!W8Gէ5ۂΣ˯a!@G ou|kGZȺct(Pau~q5TGM5]޾8;7zoz=r4b_??滴\C @ 0? qrKx8pn! D?޳K=l^DzQM~f-g8o^:iyi.DZ& @E nklҬǃA:@ǾܳX+_D5-櫾7k:]51/?^&]=רZsHpNqsB l=AqU*|mtd)ְ>֯hs]-ץ׎J8nm-oV/{ؚ˗lۺ7UX@ cCoϦż}{Q~ǽ1ou]q}_l%^!/R@ۺWq1o?ϙcKF]t^| b_"~@ ,@އFY}c]~֦Ś'ƹc jsd/V.l8_Ӝ69qĚZb@ Lwn?[,k9?MyƹkvMk=d統͓XϾcҭُQs&C l-ݣֹ.k\g]qMk9^ӜdYTSTgkط9dͺzrosowm5۾k @#зAs]^e+g_־u1W\/c{v͓!q~-i~pdrҺry>X@ 0dsk'pNz-uӥŹyf_vZ޵`7˃+]se}h8ZZ}ۚs|ҝB l rUŜ}[q9k>4>&6=z5]z[ƚZ4 @G nֽE/۪Wc۬;pmڂ1o}7}rY}[?XXul4GKpHj1 @hslZMwy[uκcYlGwi5rDsھ9kuQQ X\Mia!@@m#)nwl{Q8 źA6]sc[?\-ΚjFse-ƚ @ǖ@ޜVkڨٷuw]fv=k⬫>j]絍u}sX@ %Pۄ4?Au6)w鞯\;?6ģ&4M+Vl}컧yr{}}s @&еdrߴź\c뺘Vչ޶Qviwkz֗`bms|Z!@iҽ5ݚX5wNG_j9 .s>;o>r @!0f3{rW֕nj;';-kgr;^]]՗3Ⱦ @Goݗ\+;/sv\Vo~ܯfV]rOkm`!@6G`!& rC5swe&Ze|  @` tmVRiq؜wMn>j6ӗs? @`ۈOl^6G\c)jmHM ؾ\h @G`f|HߴiHkطiY6ijcH퐚 oLO @G`f}HϐӜ=s˸YeM ܬ]5O @%0R?Kbi5/xֵZn?G @ o Yα}C/z @`Eo?oSϡj;n|y3) @ym5ϖ{%l>[s@ U[ߪ>s\.}EkNl[8v\ ?޴%/dm<5,y iir<(--fF'Sr<%?W]Λsfr|dƜεixr{|*e,rls#j43c\.Sgy3Kcٹst__yۚpWOl[8KUޜ3(roYZw w^yzt.Ϊ/|;=tP:ή<62cK>k~WffY5&,@^vCH}ppKS@|/M\sh_*I'cGmH|/>,\||+V ww3[qhգ߿|^!D[<?#_ܰYfK^̏;5"R1V̵̄gf >- snG| gO)oXy?QQ)GZMhh&e;9;_d}7)F=`izmoLz3E7\WSAc:EM_r_!mR|ܮOO9KzCd [{%l1uͼSpsiw510׆EG_fG>{`H|w ioo=>`);3;>Pj3,& |lk~oi3=pN~ߋKx76~Ξ6>y/nvOIL CNafaaUKWGߧm-vDPQ;l8ԭ!+fF e?67>nֳVagZJqfZ" x| xl+ߘo}R ? QL5x_Z}G_i>>ÕIOemgϜE;-\R_ή^CyDkgqu ,#IOE}/_sjRyA}~}kXJ_/  g4|KN-$&8 zAar{K|;qrdX숇 ].oTyHظ~I, &p:mԈH`|3W7t3]A-JES̟:yUllhS랉}}|Cx۴m;\?˷$>@7mnlh@ Bn϶5mWtDCl;qg4%MX49gZU\ʱ;L5͍ݵ Xt/מ|˞3@co yٳ廹 6Ï&ۯ` Z/9%ozͭ{98e~߼vjZMxȁ-Knc.V]V`kցhO@>/{W~%ms#h_o%7iѩjFFOyTg.4`ǃ_dAۄlN/<lzܕ(YhYk~8`;OgdL. mnZ#H ճV,ׯ /+{ P2vl i=/x< ?δsċ?pgֿ\3C{ϟ+?-M&|7g^.کjWtڹsgrrWd3NHW&u3mfMeҖP. iR,m<)y^b@ .K;wym6D2) @6X*BUTDٜ IKJdiȲ,BLɚ|N,MC\;f'n/iDR)^L]tan^sӊP`Q`0X0 `Q`0,j `Q`0,j E `a0,j E `a0 5 `a0 ~OtbAmt7wܞ,j%%M~X+ K !8 ?401,m7|{ g|ժUxPx 5kV+L>w6,jkJ$>1v'7\~3@@p%:tq<ĔHc 'cqKaaaZZڄ :$}ԩbVt:(R3p@?7nh6Em˖-E BWKy.@ y y 3C=8!D!X7Bsx|8~,j7V@׫ѣG+Jt幹&>>i"ըREy-6aFɢ UỴ6!R?ш:O$I2$$?w}Ac,-HƏZV:)))]5qq_r@C}ȱ,%z~;E5}]dʕ!COf6m6=X__orX,K$tHzRLOO߽{w~~aúP/@H@g&۝:\/Vg oeȲ.z"d]֛G .0Pn H>~hܿ?CWٛ6m:}4v뭷}ݭ?|mo6/^^?ffff@w֬YɸbQôKUUU]]T4H4x]vUUUu>HCS\g}%CIQoqzz&s3`gdٮqܹs@*z7>|a۷oϞ=nҥK8_m۶pA5_Xh0ȉ'^u6 .\8goaڥ<**JP^5GPDEEwE ԘA$̜eDC} @@p#A 9&=fG8Cյw~  薆bfŹt'&&$YQQzꢢ"ټhѢe˖%$$\Μ9h"N:522nlٲX0jnj0 ˲8NRٳ5sB@B@ #GLwIw)IwRu&:=hcOwin}UVV֬Y+ZTT|M QTC}wO{߷cz.[WcǾ RRRnW^ybn ,݉d4ChV(&5#)kFX2XY$$B"@H !(]yޠe@B(]{,o%ͶvZ>`in ϟ/yWKߚ{j4[cBBC=-5LG&q:q:1עPHH%IBd6K4"" @B( "$$es.bY~PiP"ZsŇ ۺOFFW\ޘ]w曧&L'5Ld2^ \^d]K um.6 D F9*O+F"tkv`{e]SKFSSS,ӥvsj 2JV I N$IFDuBI($F'((dpDH15NVVңGDEEJƕ|}}yM&fvRJKKF#BMcn4KKKU*UDM@!!ʭcB(!'"p|R5D5 $Q}ԙ:x]/CI4kxc;JXԼ77;Qyyy$Iru鼼@Z݅)A+20%,r}۽3tp'P_bR?:F$B~py]o_>Z@ӴwPu㡨[^[f 5I2111;;;+++))I.5јgZSRRH!}sq̌M]V8 `{S%7ۻ8P0bĈ?apѣG_M+)ʢ"߿e***֜D"\ nvu uϏ em6[{!<,jyyy{쉊RT|D]]Fdxv?)'ÿ4E O8-"(ZPPȑ#_ZatxGN:2ɷ~~~UWW>/\Ǐ5jT+aMpL f}VXbŊ}.{p$H>LDI @$ I H N8 nD D@'C=x ~R+#55Nv}Æ qy?۷E]vmѿ{QD"QLLLZZڔ)Sf̘1cƌ)SĈD+Iq!A!$D|"|z?JPHD""P? $Dl;ϟ;wטjM2 IOOEwm,~Ǽ<;iMZW7n}zddN;pCjᨭm1ٳ;_KKKNaX< d>Gכcۉxj=v(1VָAciȓCPЋ'Fæx2222z駟F_Bj`foҥ/jUUUoV2W_m1#L&{g{=j˗/ Zxkkk[s=F~6s=W]]͋~ a=;H_+Spq!ćڛC111믿>tЁrss[JQT>}=<$${_}o_5WFRy뭷{m9n8__o=EQ#G|'"##[\9B'LHHXvٳg?vU`Ν;d|W-siM$[ uB:u ͢hdjZ?rź3s Nض=\RdRmJL;;G@pTF73Z*DQm Zi 6{VKmJK("Z.-N#"Q@J @'cQ4/H\aWT޽;??ذaWs'kuoyszcf]wuU٦}|?Ƀ.9!O)Uz:dZ`27toN 1ϼh[ͬ䀉}nO IDAT=u\4N/n/9_ݮ;RnDYf]N}j͞W75X@ui9gOD<6\J-4\Z}?VJ)CCBᕭԸ\Q~> B-AO @3,ֻ\,5*V=E ɑF<2,$л[j(//R(4MwPLPDEE_͠q_շޠj\Yo-sU<~vBk5j]642o|O,x{Uom~4!hD :/^t05Z9(}yB.NT=*B7kW05>Aݸ:od8-ʷ-OU 8ߨy#^\G<^𒜕6WU=>\~We_{zdAvsjU* T*VA}BDYxzbf YYߡFJ?UMV]TƄP~gYF( G2¨e/ug4bc{5W47F_ɥ34NipVs 0Z")7%j j\YފK rPeapƖ͎d4(eYBa2\=kusBdqU 젡HEĬ*W[Ժ:eYj2ޜzun*|{J.%f؃%v`rk{+DDc.h`t~&X/\4Οwőz3lIs@W5dwPz.$vv7]a@VfiborO=:L`Q) jaaa tliЫ9w6.ݻuw E~~ 8t72*&Xd~c{@? &fM]bksknÏVַ1\`bE ½t'*h4"P[iNvXZZRZ zN:;`]<6[OZeu1/ ə{٘f_hgL]2IIf{Ib ;|c.0 u1l;cia.j!Q>Ŏ&5Lrpd=Kw E;7 GٮWΝ;qCt#,z<2Ff3d2BR)".8v*^0[WCip22 qG{l`-zAL+}Eȫf 6|\`K!B$DGG{<EQ%Z NIS,9t"w0@m}{Y-ҹ֜ۘA*#" X0~bHɐHwK]T,Թ k\:gbajӖjg3= Zn&\2t9OTV>ɤ=5h,j7)g*NU{HR$I6Xm%>e?qr`BC3q- BᵵNT,:*a򍬍 v){ꅟ,M®SBCѮcS&MmZU>'OcyoPcsOqʠ%^C,~,j7,gs _ퟒ2Cbz^~li$&L6c98Z1,j7#Πsʦ sJBdӮqƪv}PUUht:]}}=(JJq%q;NFOPmly! ;( _cYca]Xւ^VGT*@ӕj4x__.չ4]Q׭(J"th"1 ҲvG…( ejF4<!Zk0 O!.X0n&!\nوcV5dJ#-5*~FBC%eF}H QblFB}Cmi$ټ"10\:X~^hx޸" TTT;w? '??_"Q*w6lX'bIfNW7_5Y੖>Dbјot5G,{,M-ID) uJ6]OGfY=Qf@>5UQՍ p k̐!(?~I[fq|J2d . L1"5nm*H$& y-'wr%N3}U1Ej\n?T){i̸޳+CÔ>( hŚۿ4xٳÆ1| SNtsй2g!`V&]2oC= ̫O[Λ- /}`y;222::zСCE)//R(t(NVk4fʲ9)Q5e-vdųhmFsvqVvpa[Ƶ8$P./= s+y2i4hrH;BʃlEEq{F= 8Ur:&zАf6Ä.LWRjZ@ 򀀀p0XԺVRNRZm'u{a8$UÔk6G`G{8Il& f瀉 `.T`9N^ KR%c5tAEMEaka? ]?ʗY+? cj&7aYVPLNV#h&{`}} jYFPպP(8wW19m??jb@or'p.zi9k2׶(ɜAm9IEÈ:Wx.!Ym\0vo`Cpx؞"eَߐ("lT嗽3,q<`sr|||8QJ>1].2 #b-ˀm֮󸕔$i8BH\w+(e(8lf#w FbedjSP% "mf Cŕq 1wRqlniTC1N%6$)f O$uv>qĮfa0cjKhhV&7t`iNVKpUƞ/)m<|lZۦ %%gKQiX"lkg# ʢm&ځ% D48]bj*.yHDqnY9b uhc6{z~2iXm=8DxHr3EyBBmB)mc͹?FRFPSvXZZR:kNd` pbM3P"&23^z']&3؜zu/I2w8x whDN|\*H:50LX[Wѳ ̅*"*y</<za,=Y>tuvmͦZIq[ $$ķ0ӸfFH. KZ9?|tNDV1 CAa] {O?* c/1jա?Z ñ4'I.׹kXmJ4ub` ?nq8SQi_y^׸ڴi.v~٠I6_-FT)sRN.O+$BoIrrx'@@\lAw6L{f͚ueF`D,VWWYV b1˲'O(jРAAAA]}G&󋋶-ZXYeq"T&W.qܟ%1qȈLC%{yÙGl 6CKr؉Wo̞6DbF#JK_R2:e[+Ȝ5F iedDSYn8 C%|Bȡky'pj RvGVݲUѣFtfFբ;w&''FXxzT$s8t'"{o~LaCmp̺w3L`QiaBE +~y5󩼂qu7)?p4IB҅ A~~}T={ Eٶ:tJ#:bb2d|J2U(TØcs'$XDco4mxd0pV$ l!".RSWg;B!#QrD"gbYnkgK&i,yx[Rk6|{x$ PP%~CpuH$+WֻgIzG6i<xcK}kO<ӿ;tP}~ >%Ք<(MZ=wXcG SocFpJuC딎`Og,]6 $$Du G^KbopJm\mp3`g`0X0 t ;9#kKwHJ֤Ѿiz) ۈD&|Z+ZvvD"?~(ILEChdl׻]6Z$"E_U:gltw9y1ja>߿|w0hm]5XEΆ\R]yc^Eh :()e` [\e²\F\"7(wͣkXԺ;r㹬F˲R3$S98F5~^ftwha7^:]Ѩc_^:< t24P'0L{Ǚ=5 J=_^ree Hҍo%쬬$\BԌFc^^jMII钢]%*[eQo<*i]yCs qT%@ONOJcHJ p|7_ pWsgaQfryrrr^^ޞ={T*Upp0i4 L,w f[k*?,>x)Cٞ ^Nԝ^wK8y{4}kiOZhпU ;nƷ>„u Lz 2LPThj[t5 zG]8PnkGrHGI19rUȯ%k}:E?<+ٵ~%|l5~-!bbb=g(@Ѝ^g  ľTD|$(1qqi1 AmA2᭷S"7n" 5]pZ$Ig#坥GGu#U\ﺆz0k W^85[j hCR`nT]z7װa07]]E M6JttbQ`n p5uHqN;?3;{~\I NE;-uC.-jաimQ-[mB$IHH䶛Mvs1tl6k7;̼3yߙY(@5[=*rkDl7@!HךMJ AZZ|D -7dkc5FC!HKbk OiZQVxC DF\q5b >Czo/J A78iH*z6|xI BXDC!b-}ܼf 6xYk4qV Hy(4hWP0,| !fid*jhQ]]ړʙ3gDL>ݱ?S"nݺmޒCvk" [JB=lٲEȑ#(?)4x嵆bR Ϧ ??HV_```@@@+/..>xxZNLL>шiT0U#ƉVS?ˢIAAAIIIllN.Ɩ4l-[nNvڍ;Vw޺i)8pॗ^~z}yDꊦ4WKCfadM(5GC['(((//(--ݿgϞ&M>:tlٳgL&5o޼yƍx1Z]wz! ^kčlnRRs$w dl 00ݻ XERRRii_~ݺukݺ83[?.//>T3gn޼yʕfp}QII G4I1a؈z˱O͡auX4pT*U=Hի0ٳYYYbϊo޽{?|)S8p`ԨQܒqp=4lTh`(5&`0TY`0LtIǘ>F4hOt:9sw.|d+V$''qDgy]g%@C5nnnmVU\\fo?30ѣG 2C{n^&Ʉ:}}}wFžޮ l4_hժݻwDIwmժ]WTTݻW| 'N;v,55U|۷i"gHcbi"-h cf_XBCCݡ𲲲.]UCGz޺uȑ#_,K.uA\Rgff }||o0'N(**ڵ8C{c~sͳ{c0Rs$ Ð$I$!0LzzGpp]=nd>֭D"Zl|>1׳gO+j?f0`_~]33X[-^pp #(s:dO>:wL6s^`0ڵ Ş~Qvڕ}ܹYf^Z#FR~{a_IIIxܛ?Ucj⸚NO~񠠠@ooo())Ͽ}[\\x~gqsPPY|Ν;gϞ-J.\8j(dx(Wꫯ%fe>{s1ZcTO  $Izyy;777???;;n'***$$D*z2NLJ]-:uٗjNNNBB`?^vԩS.\b qF޽;c}Kڴi)jF&x Z#Rk*򰰰~4sDBDq\.5j}111gΜlذ`Duׯ_/~qHUU؀^L6ÇfLDDDDDCWjthf5QDβ6l5U@!H58z ȣ4ZSZ _ixY&(5iFk'J AZњeRCh4hFC!H3Z3ND!H2ZKPj"BO O*nVZPjSԖ(5iFkiaJ Ay~ҌRCLC?mL礟liO Pj'jЮ*O7]3z7:bUnv˓O޶[+黧;Y󤁃o+/Ca[`oz0Ⳮgs_7%;I9mD5{??~'7.v+qՄ JІjR_\Rs$V7*2qU&`*İqmߗv&휺H}KAx-̐K-TysmzKc͠>l SwvoimY“ފnܱc?C^]*MWՄd\Z_CY7uV/I2Q9)Qjʕ!~JJSe 4:I'UTLPeJp r=5;Y`wRZidu4E=*o^ C;Gt{m?Έ7-] W~Z{@7. \v$wJZR/}_V6͆?>3J!~>IܺU[Uh@Z[5I+?\3_Vh0\U5{V5_=1~|[\EGzyy6{mB>w޾']pSeQ⺭D P;E[+xR9N3G>v#<[==}}='~M'&hM~jZ{]\Okfb9{z_]ߵomІZMNM23қ3xvGy ݐg=Y:~;2o[$ R!('R 8ywrjr;y'n9gaDsJ&0aTswWWA=ސ,5S$;ЅIc.`k8=1ax[!{Ц燽I/hV߁KO+^JQxrʖ=<̕fk3mI::l{w }.nJ-_J5ol0^PbKCQ^j˜5emys/'/e {:$#JNFu1%)EH)g!6=S0}}lxǷoϛ7u`34S$bk{jH?:<}C*M֒G=XuYfn~QUs' (ȧ]Қ\{ˁ#G2- 98OO6mF~'ӎi.zdo{֧Om2o %?C&zjhYׁ"m[[T( IIܸc0te9ameS)+7#zd y'3a];s.jӺyOM:jedMU}bolrqhGk%=oɥ ziPyzAGb/LLg j2o?/7yz6Ըp/>Njo=ә@~Y}ᷔFzJ׽cՃl恰buZH$c@U~6]Q$t5dD!#*H''R芒ȎyȖL:gÇ?scC;]o`姛eg_i N 8Gs: {@j~=vyjh4c2+m2o#fUi$?D'@x:,` F_ZZCv5Ԑ#J.~6'#NՔ["pz\/)}筚.vzLj t$6:7~})cBGe9 F'cyG}u͝_9_|w2c ~%!c[.N,fi瑛h/s?FjV̙x΀ > (߷t#:O@+y`8 OWV:׮YQ1ДC PQc*7C7ZSZjR{z*C0@Q ӡak rSQ|rcF@=F6/F`C{z6hQjeق)9ECnnA^V~n}$t:0O)Rkwt>OcLKu-ןRgH>DKR{(ZPRknDL&%B*J$ ? /(rAolAPj (5A J A J A RCA!RCA!APj (5APj (5A J A J A RCq {ꪪ*R-GII۷zbA<o7U*_PP^^RYT7x,2#6'c$w޸qCյҥK7ol߾}֭Fի]tʎbIDAT.77իQQQݵG }qF $ @\ڄXݮH+8z4kڵknݺ<`ڵkjҴZmxx8^ƈݻ7˽f&''GG؄HX%I$xs:dc8`ɠ@il&#M)>mĞ>1$ ,/)@76V~3wJ.m{A6fw^ֻUk;$,d`bidZPPJb8 /⧟~:p H&0TTAAA(5,E6v~|\.~.\]2mWeGՠMa%a 8R{݇RgK36l] O2Ij/GPRX`9RklYTT.{&\L7_7M=.{R76\ <;Z6Mjn?}V5FF{b/w8q3gc9g=(cw;l~RSl=t*a˗kw}7,,L5qJtx%#fR[d 9 {c!m0pV`rNh Kzb*6t{Cc|++g~0eՊWY8 O3, $QAJk-63o Io3$i.HJZN?ޢ2IâFߵ{ȁepr HX?t7'K\T8s](oqdȄXi%xv~Q" zMFM]J/<3#](BKTIR`jRA@.KR "R CUQ$ER@eR}"3Me}"\lvpgk'fcNNNS-,,WZ H,,,iTI, ;fL&=DSҭj>TWnFg90(?=`~IQ:o/ltkNN.L?RBe{VJ)Nzw뇎r:g3;g~KA;gz;R`_pJ*Ȥkp4U ԔWR!N2*Jg~=M.8j( o&>r]CvTH~VJjlֹsgTj%&&axhҥ ^H#۬[inEE/z,lYGwZ{rR3H)\u^?mH_ܧۿt0>dVW`Xoݵe,QȁBF$IQ=nNQM'L,Y%'::W_"JBt*2~+`٢b"r\IE(XXv`Ċ΂'rB)w6iI_=vvj`X~[`4H Ç|`h>r䈿llY/СCСCuKSRRݻ7x`𲴽7yN}V&#%$Is֕ޯ(L D"t4ZP(嶞LC!fѹU+g SR h]BAȤEA{EԩuNrW{6Siߎ]9e,A-+0V&ߩEDXXVSSS $$ĉ onnnjjjpppPP^ƈB(++svvno_@YY\.&|Ů>2$9z6L$T),F?BvuHΝ;sRRRҩS'R$UUUW\ ܹ3iܮ]fsqJ$\???:&>%BI#ƒf\@$$F}j9)Ed^MeE$)+OwYRitt7rrrT*^/--w^^^RԩSHHT*1;${(//˻w^+P|:dGDl#'RǶjզDBHH WƇi, é]OR~+{PB &k}p$IIb?{F1 '***((H&aXXsNfffsmc8fW\jժCZڑ;+Fu 86双ݟ*hŵKޖ ߰-:Aps طkȶB+$ T7;˲ EQEk.44i~|EQuX9yhnl4HpID.iQ)}Dx(B߾`Q%$I!dd.7ӁH$"P-Do?o.' ,lZT+9x<{lCc X+eq<ε i/A 44&{ HƉB8I' M.iVA!APj (5APj (5AOjjiAAǙׂz0:C@M4W׍O$deMJr\+5W !]Wo5g*Юsu\nTG{zwN"%W&q\.t$%'{ܬfkC/ash5u . (ͮfpXMFۺ*3DG?ut2.˝yGJ1I緧*ݎd9ҜQ֎+wdĬ6rm:^{j k[y*+Q/<kaNQ~Ÿʡq1 `oZns\*F٩ }7-X9I|l޹]vd;Z[/Jih/G.+]9 5SGyN%KiHѥ|28tВ]'RSیӻ|BP0loxTg~Ǵq%{; ;M8b R0gԍWiHw Opp@ӷJɳM^Ti4}Qϑwpm Z ; oVw=P*%>>"~>S)/=8.)S6Үz2t4n ]- r. x7E{gevXe3([jnos?XgL/0:5}?8 Fm1W4;t~,+ {C>>iukS'7'۵t5~ "!SI0b~\UO I ]]q[ _,e|q@f֧qqqqk̰zs'mRRӪtJoGf~` Z$L,NH2ɁBe$㖌`'~ xmsbiTaP8`rbEwu H<1X?O )6gGHz9:.tUVM@J$í>TV.2ӘľߕE?K6|vkcݕ3v[gؼ뛉+Ce%]=߬Y,Dz=sUW9 VM`hh5V4Yz!ǒbvUT v闀ön=FJ+LW[.rGdRQ~+uV>c*|ΞKzSx`傱\;[x9(_ꕟ'QVX3Brz˸\.w_bT?n\ʠ'r;:tIGgցY{=q_M5.bF ]fPonB,ե=\yܭ6_-+vtuu;XO/r6\.5>j}a@8{Wε\?\wziKxp 5%!rzꕋD⑮g.|lJR~ZӾc5-^ҥGK2]h_'ه)K"o_pw7%`_+wz5[ANAi^W}njp}q|GH R[yUUh6͙<ै6(ȝ7利rJB~eǴ 3%=;e8iOcnJM(lNW!2#^K٦y-ll}Hѭ3mgUe(dvW:ty3=(Ļ;[՚a~ =%`yXk>Ӯ$ 1ý6ԴGX가B*Tz$lRRqzn  -tyu0oqi>0gNP,mި0c#ڕ=D]a|gV|ɣ>k @~ʸ53,6+>S@###nm/:;Iz$`zw3^p)!oˊyߢjbaW~$hԮ39saFkVI<_xV|S N)Rff+G8nÍx=%9>kλukF{ rFH(x ~p @D?⡾x^?ՍDO ԺrS5'k a)[unKS^1VO5ʢl~KVЭc^2u^jŌBp>]Kȕԅ1O_^Ժg|niL$*ȂV}-@J#fmּeSˀMS󤓮cF*Gݻw,.t [W$#e`|( : aoO 0 ;{hauV l1V7>y,cg%SʊoJKmXܐ+OB  /U Uw1ۡhӺ꒓Х`7ԗ0URg_Y1ƦPY1F@;#t^I|69fhu 3_wS zTv&s*fW[B1`1ve˸,rZ>P.=l5 \Ie@T7Z[]j>N\O K+;C^|ce%;}k2U؅֟y!^ N+ڼ&}jyy(jJDy {iJAWVi[ܹ'?(]q- ԔzP,#Qو_2P_춙w7\>`x?#9ǥf[@ȚkB`?ް{B%tX]Qc;]\!**ݶVzv7 𙅚j_:Vy 6_Λ)*?ggʋ֛xL\3 `ϊþW~N[&:w[DQyO2ӥ7RDZ]<Ckv|@KU2 H Um#}84=`9tv?0D)I4Ijc=iYǥ)RWt-f'/ Ϙ;J!4pUNOK+fOgg _<8:[4X 4]KQ|iSO}5f`4a_?θHHU؏ VO۩jqqLUO/vo(w?8y?wEumUGʟ˝WvN{mDe죧gz$犂؃ҊL87P9;Msz x(Q gIǜ'6R/M~z&8[ʕqt.;>Dݦ~qJWsl~ޯHGfR/ l3=t_v)qCL跀'YS, .Lr5'N[或^7 LVh{ >tJOmƀ2іɪr[Jzz=FeI*,r~+N7ugM+A:L᪯{h쯧8X4Q+|rmN#fWu[xvtB=[mU7@䣂JIs3()P4gϢ=0))X,+l-J4bWĻbe)%RV^y/PR€ib4[R/3XJ$&GRCNF6s'tcU3oG E6,oj9J$P㯵ߪ-Eͩ' Ht:W] h|5DEU:_jiWMZjUcZL5\qlV_UhhRaikk娡rD;׎nU.q/%T>( [Y7r" l^ԽnHK嫱♪m'[5mu%ރR{c7d7סrmTJ odg|҂VW3KI RB ȗ "%H @ RB DJ@@ )!"%H @ RB @@ )!DJH @ RB ;D?!!!WãP(["%MMM555b B3D&%Lf۶mأ@HR&"%6ݺukb'x$&`D ^-WJ,AbJkE)Etpb%|KY-n*b犅*vWGdnj9}>XhiYuy:j;я+qCefդWd?+W46 n^GeM>Ә,u}@T$9pxY熪f.3Ic>xaۗk^nk]taɲm77qOL̴xD.dKҮ.]1K5?aǻl?pG Vه[{|,!HuH f0To\wϢnY" [y (E.'BRR%9jqZ<81$8!qϪ];b,e߸ \ΝuWN}$f&;?GbV(r0[u"*1k1ͦ駟6(`y^% PsPOdggg?S^<qWިy /_7y,K} ?'[$b߭?@QnTţ’FJ8ќ`0,IV=C]]1CeS.#GWO(GxK㫔b߫OB)%m!5ψ3222h_VC|ުW wă]p,`Գ]Z3:)QYL4`Q#,,KMֿ=8t"B쁍Ím dgE̠Ƈ4"Gzף9 s=獱<[N.oJ.oOڋ( M,/$JIq̶^ B0?nv UIy\`פq>+bru;wC( 4L _]1# ^:707SU[NK|~? #>P+R6>/.onnmkD?y#Rδ)[6C۾Ax YBaa5BE5(xqށh6J%Ym;rdGe%Vj+={LҵGt[IH -*'f<4uڮmT3*/^<Ͼt VkɻQTޓ4 M]t1c+ѩO$ =%߁zWRU$qPLU{%R^ *n%{h[s5(9akx,: S΃.3Z74hi?+biT< }g~iYO=a%Jq @/( ; Ky)Lv[87l_&G5?7=3=%%%1ל;"淯G-j`ِ)OW))/%"!^IBPgHK)6n[()aX.-`f= #>>~̘1eΗ}QG7xMTTSQJ.>=y\\bI||<1hHLֳL&cl'A@@ )!DJH @ RB "%@@ '[m09P(["%MMM555b B3D&%Lf۶ml61"Jlv2ԝA%Ox6g))ٯ}|~FrRMӢP IDATiOSG/Ѧ.n:GRV'ʚsfo @nj9zvxWsǎ;V]2$--QdJ$9?[9  i-6n0.w3ٵl;Glv|9;75V`Ԕ??~~b{yo: 0k9|fr䴫]w/QYW<l~ rh,64MX,͏kda=,C٭![~W٥]Hw uv]PTĞ9\.˝Wv^-\.n9},B᪘t0.Ky]O- ݶWmǖţ+<$.WWk;\^+6\nGpQwS.8@PiΞK*h,5r:S[.H$4hSP؄ 7o}";bB-M#iTe蝴rF|RR,E^E\ q0Lfԗ?KeX7] @Z6RbZ_&> p޹Ŝ~ecbsϝ' § ;e x,buBYxӜaqi#f[/W Wu!E( ~3/:OVU{edw< &H ހq>KMNNKK\qV^[QW/SNQUwx^?|*P(J2lH{DPd`"'EP(6Ј/J;+"6ZBPm𿕑}+0SXtKY'zOyvVG)+ۮ(3%lg`-${j$Ӣ"rJEiG>s+t4:#G 9 BQmC4^Y) 6D)xsD|- N:h)x7iAKSb&hhP*6[罀!]ZX)W ѵ5V,*9f׉bS:N/%`Ьܚl x}4.S'6=7í-DnV mF;ߙP9ĀYDv&L9fˎ)45`O@KECGYvC3v[ݕ`u,~Y5+kE![>bTi| [աaK-tw3{^u}[e1Q쏺:fW[kY %qQK92Zi>LWX·J\I !BR+U{-8n'!K(?4==|6|>?ۍu.K5hJ3wtdzfhӃnRn:k=xSV]fFw/4S}Jx~ CU[gO]K@OnFum^0m0կ~%{~Onh|[sk@#)9q\\ jeeThS~rƑm7cr{&i9ze ^(x} .( )M=8yɓ'O8qae*Fg Oξ~nW_ iʰ9m욼mE=HLONx>>=:z d ?p6pGtREs݊[{)Jn rj&%B)x?1O+R(n>jKTAs_vBB̽ [~uu6/+ Y!@zF2c_%Y/*Oؽ6e˖upfSkxO&i׆c8#aÆ 6rؒZ nEI @SK-Yzn4FDׇ4XՕp;1Uɬꏰ[ _7uAÆ ?l,xX##9ý9;Msz x(Q iJF7?ܿdW/AQnf𸄮|D%?L?fSȤEz_x6eCVD<_e$e޳R'~?;BsOޜ;b!eۛÆo4Y|,1˧/?ig՗bäcEc_DVpw <&vY;s׹O3w(x-65dj^upT,{Lxa:bm v/{y=_AIYlSJY, 7_p*6e mQpB6$4K[RZG?_lHBkr,La9`f|-R)M+ZcIPhߐ@,48m߀yJo-s6Z%^bMKޑy&=s`l,^n/-P*Wu:ZZh ?E}:;|H;NI2B^´!F*ɭs}#ǴP<(/6Wj#QY; xηBlBmf )ķS`pyf0+ZP0 g\ C3>>~̘12%hU%ڢ"@]KO"Zi5xPZ".B+-MիVZ^~^u:;K͵ƛ7o|JMYZkX,-.R*ҀY^ ~P.?eGi329 ۞~v*DY4۷o$JD4XՇ_nVWW󃍿~] 8f=6+͗*fܼv+9DQ=cvj5h"k8-:~)#B pbbbk╴GCԳL&cZ{@@ )!"%H @ RB  oU~8BBBȶBo4w455MLLԈ)LKL2m۶efT*%Wb`K杒A%Ox)iI{'!#4 pOCG}3٢k3P' -eH Nil y.>fPFՃWHC GVp?{<<\FX{$yw醾ڃ'bvxWŤqYjy33KKOV/wzSxИ;'f' 鵠ͥGpAWio܏^? yI\.qwj/QYn_t*Y4KKS'9ahޅ#}-jx)1-sWZ@?h:?jo+aC:kV/iNW!2#^K? N;:vUjolF!+XI;q;CIñ kӒ=ۦ(7TQa J+ivhegk}L`C'p,`Գ]Z3Q Rsj{itljN#C>kλukF{ r,7fudƞ7?f&/+r{6<{P?{`'ue0#_U8`0ntTҥSPk*ՕFG{uP!9N"Pg>󭭭g+Mf\B3bm>SZufȣ\q2[Ɯ=BWk;\})gԤHINs(kٳ8ǜsJn_S#Xr.!))!^,? N \C UGu g5R7Nv嵝w5WwS<_uv^7R:WZ4g=8%W;Z</ΛpقK|RcCtɘP##[k9%`_+wSi ñ ~cjG\"nw".8&L3˟_v,؛. }-jx)1-sWZɯ0;cKC"nqn?3$(GMNKoͳ%N_}!mXs2¸o;{zC# ^Mu_ZLK9iӄ~!5n)^88>kSzjS{{KԷM}L:}CtiVۯqqԹ6 tfzPww6suHB &PsH/]]㟜a6rдDl3RN|4)pk~90 G~4}[k6nGvbܯ u^G.L]4}Th1:@ 7'<Љo>c:ȗDe6Xg8tG lҨE3Z2Ajlp3#U9$ت_z]roЬˁxNEEs-8{?&`h`泭ؐ޺_7Dsd5=?nw 4[Cp*Ŧ0`Pj1OmөXl?5g(L _A91 {wP<{hPѭ+@$#g8n%s6ԟS>>hP*:.Wsg1ti4Yə\ng=IK6rs)rݢgѵJ n+^ԭWV_INk.K7! +OWqh (\JINvԪņ ^:700* kjB)B<'CJo'>m ϟ%$8[/Jb)3MKr+Z> gpϙtUaQm93RٓWN?-m܂uTaKSb0 ڼ&}PIP%AVWkq[> YBaaUfGג=:#ױ ?B(`cp4 ){X,ߤI'O8~Ӫm@dp=s{ ~Wʓ'iqqiv?ֲcsEYO|aj8oOϧt{/T$#tiJȍ)׎@ړոGZK}-ז^xGfR> 08mXo3E_SesGi,GS(7%1)âE/gs: e  H UMtji]/^:cK$esoHg7oе|z"8:_[k1Eޣcg ZoapY~N[&:w[DQyO2Ӏo4cᨌVѶ~xoIĶ:AJr/ Ʊb߆7q!髌޶G\C~֠g!aD`&vGO&IDATȍ bж\. ^17lcӽkLQ݃8,z,NZsr4{zɇ޿dp=-spC# ]ύƈh4;eUq8.egg@h/7Nx@⁕dƕ`5y/]._?֨gq_hdzOzz)!R!x}#e<~T'G=7=>F";Xw)%Lj3f&DJD& %BuԤ)Ц|}-EMtM-(a4&DJ4Nޫ)!Z{ȷNޟ+Ђ}FD<&b-WM~;T-:i.X"%;D4&jB@4ܓ%RB |:GTv%>5iʱM@ jR&?"%'QئpN@T&b+{Qnn.EQzm,өSݻwЁ,M¿^ݺn+aU+]eGnvCtojҠ6[޽ۭ[=z|z[^^^vv'OّoQt$ǭt2۹LL"{9r)YaE J&-٬Ν;WСCd2YVVqLF{-arEHd0Lقrr(4Zs-vO+JI}B$)y왑ѧzur-IK)`2d0 0Z+2B.Gw5MVeX$)-vMg&]iiԫ}#|XL8/^ak.KjLreD}3hD&gk~M I oU0&9hMy=Nyu9C@[[ȇf CL$|*Hiy Z9eb9qV!]dODacl?DZRZ^m je:?卸^%h }&X$FUkuS?@n S L&kCbZ!!LEc4X;i\|Bۙؠٵk:xD9 X&O2yRP(ryzB`_h4t 4TF L&yV@C5jRR6piIXouP-SaU ōu)d)Py%դÝ^'r\.zqu &^^PWgd2ir 㼣d2LtjѸQs44444TGR}O)6%dOS5|@Æ)dّˈ(2X RJJ=% RϮq0q0LJ#ZsRRa iVès0wQ2P\ սJV %ƙo"1II_Yay&W.W8Xڄu=sa;+,sryß:Z'k g'gߤ|#r+i($QBPy%2UhhJO #,p"Jd(QP)[cНEK:|t/qhʬ"n:l;sZkY1ee5f$YT[R58 ޘru5[[.%N\P i#}@o4 ~dX~1zvL0}e>iSw m#WP4`0$!B.{gEm#\JrE)K c?h%hFM"!TE@"Ch5X7zrzv[iTwK?\v{}Y&$L$g^!HQ^nyP!C@k| Ȣx't"6ag>[jVMt#$c`x\sIKZ3Ɖ8 Oo6hr8`浫|U[=Kʧd*p\5F!ENU2$*A`˶{K*ֲ~^^3J;N7u) 8[2O"Dĥl g1cp, \aAto1@rz(L+qA?y`ʰjš7Z:}~Xo#ߪyZoKjGu{cHsSSgŋ+ݸ=iHAaSWaYH9d&e{4bHH)uNOr#h%s_T2 CcDBiiiiDVZZZB077jPBaikkkiirkFVT*JED A4aq,˪T*2OHPFJhV/CBz4֊Jb|~CBBGT I͙6j 0**!A9hii HQT,-_PJPT< ZMBDAB A$(AAABDm d 2A)&T*   HP >A'EG$p܃ЛIRxsORQ£GҥZ2Ґ%7ӎ!YP{\bȬww{LZbeX8@P1)u |ba¢'-|#VYbg511v+CI'P6۽cVm-UI6~bwy:2Vi| c]^q<ŷ[| Q! iָN0zͣڃh{r˺cgb4=ke&*>Qr`fz:,N{>AQE,$bb'8$jf7y/5x!9W|/O[eQ7ޡmڎ#8˾+ E= Zw|)}X<8ЀS [^]/s+MZ3aW3+9ꛒ] ~I{`:vDςOS6h&ONSIK ->,}o;ށIy ϶__mo߇zmQ"Wx8c'yMحa@@I5>tpChtޙlǭcMzE\CCC%ST|ִZXZw4WS=UW;i?߱45pLj'(BTh ~¨ԓ۾i%`!ߏ;f̴+:=-u5cݖf pfho`>kBO@_mۦ)2ze @znfO=}}hfe].#WYΎ:Ķ]܌Y{ޗfv_Ӹ"MN5Ŭc@\:#C {/1|LV9ݥ]@%x0Q19vXG@事\X~Ahhۧ5bd.nnݺU`ەMcٺw'gGDu ߯)fzl4#u `v0>"@Ǩ~Mͤ`meVe JaL6W`dC=Mܠ؊_j(0~\"29NyMLƨgd0:16oܶDŽXo371vT @V|D 3o-63a_F"QP ̧jgO,9A 𚝥ЬrEgӴmzxToba)~<=:< 5aiO|s'_e#skϟO4[t2wչGsjy6|Nv.ӌ\-f5t[jz{4)@a 5գDTE@֑S /v6xx3qq)_5f}4-ͤr\<% 5jD7233i@)T<5Qj(U5fJpWw/fxLcA ;>ycE:PKNkDdrj-A%oc:̟825go/1Sü&o5A:u`Ɠ~_ Aa6259GJw~Td\6c:Ɵ~9rp !dZr_Nn(e)P"Ecsb+Oߣ~ؖ^Ob7o֤I&{>/mҤI͛5}GZP#W *j}/)xgٹ*d=uoyI >?Q=)(k+~\{R-~;5>jM*TCOwWݤ8چy|2z{Jrs{VklhxA+\??"eA Y(E‰0&ρ(o[Lv_ӯ40d`c:cUF u3H r&smO.>pڹ7Db²/ AE̝Zoe(U@&u<=8>8t4߿7f.^\QjQ۳%MPEߪZ#K0#FbX,w?,kyi6OgMJ/m<焧cw4^'< &b띡D{X<@tO.)4od E0LḬ Uӟ1RͰٚıkL&1\t,=P?%VAhw6 E@&O¶nĠ]{!hߏ8M%\PBa`H,vUoPTj5Բ\JR}.';qy߆Lu, 32"jPHPʉ,N7 [yOu݋'DD\ 7̘v8'ŻGF^ >xy>-O^~6_5E߹?+Я'E504CB.OGn#' yG't5fwa`gQWZ-y~$Ь?YMWذnj31S&{c.sXމ@_- D,>X7ein- }Ϛ )vʖ, ܺYJeֈ걬E`ǡꚻqH,r9gA Km<'>wgFWJ<ɂ?m{_un 4ew/=źgճ49ry1m!3'Ƅkܓxj\/b:SB./f!A!A) ZzAO >ws+.6)P8)Sb_YY݆W2?| )_}) 铠/-5cfm7*N6ԻwJ}vWU,À 0<^YFؤ˷7I8ui`>#wxnM6W#l'v^O뫴]'Y~ۨcf7rXm-iѬ.L9uVJ4P" Jyñg;vDn.{K>>i/L|P/|.GӂXVܹ@+y*j ɒ^jB~IF,)ܥ ް˜qEw~PؠȣB.1b1g6l@)=FG{p}r6~6JSfE[a9{͖ᕘKz4+x Xpsy;c/BP <ڬ5bA:tРip-]%'? LV:*}'{IJOyz.n{[Wcٮ4%nۏm'OU_ ߲#)_j? nfe*tz_R>H3WSpߙQzLt\7tRi8@txa1|cBtLmjCGgc h1:m 8 0#$G};vy!n9A) '+^i<6F=7m.7y%Jv@Lkߌ-Aʛñ ƨ7l+Z.s\tQΑY#g] !QҶۆ}:_{8[.* }`NFh,``|5b̌z, rq뜾{X-!Ե0s6be/ӤӃNSʡ|-8 #6&XU'eo 1 SybQGFP:CBnw}of*th/x硻p[[hqJEGSSk 7~khy-Ÿƽǻ.Kq6ҋ }s!Vc<]*c"-&Uz%M*D+R"Qʹ*)+?{QyDcWHXHz`Yh bɫQ+Z,ax5hݿ[Lnֳd ۨuxk_ϩuبy#--F^0RYhii|211ɓ'&&&IP7X"n[s9-~{&G3c8BQFڵ# 僡T*9S|Rɲx<6Z'%e|~93TB|'  HP A!   HP A!ȑ#tVNRs 6667xQJeHHY(5ۥ QÑo; jG ԩSƁ(Π4 Pj:ADG%E.-SYxKvwgHb߲_C=n̲ӑlW<ϳ_K ?&P^#0>rD|Zԕq9"+ >"I(dBǯwFBujB ZEIN>+q| C^QcCb*6]f{MyAYm}\-Yp *DGJUV9IS=zVj5R`;!Jj an{]I߿Ӯ"Y(l<<>4 y @E<KPg^U.FbX,LӐא9,2rOCJ'K, w:Xl2銛pѱVUJKSޱ⻭eZ%(0` Yqaj@c_9{c9S\;ד˨V5]qI?F{'a?J d$\1zVWnܩ*sYmu|^-%Td\:alΣ~i$F_r"∫y˲"pKK^saeux~TLY` cCY(BkebDilIDgl]Q: fvY W>^եaxű|.q7;SN|5vܶ&aץEG̘هC8@v?+F jTzoCLt]SSSw 72}[bƈto?c>㻠rۻ)0!| .~ d"6~e3~9Kq⽺|/!A7ݮY=uhcHP2VGO;wx{^P{Xܠqc97 46hzdovffz԰N+di:}7Q89wtduV f$} sn&MX:ν.x8&.ޝ;Y9:Z 3TOc!@rzNAg 6΁,ꗙ~KB~pldnsuܾ_߲goz,Ǹ=zZYŎ-:,Wت\3뫯mn2mW6 v^r/Gؗ&}(S>e֯]=AU0U]6dp }@R"Ɖ`>qI3~]ddnm<)KT)8Ҧݝ|!2-D:iӀpt IDAT(g U0b@A1'{Odfd)S=;]{. |fDl `㒤[q)%]biT˗m27bOv#ǀ^ާvgEMY?XPo_8\JdONz@NO#"<$Z'(-: [y:1;)Ͱ2`Rk 2L]gȹ:mݸq[yF|oh[[׋OlwFoq|]Z׺x*!֯"331b?f'O9"ŋĨ 8M_f=O~@=MiG$d/.o_ثdq>d[34"{INS{r 'YHj^rTW.Mϒq"O *J, 44O>?[ 3,l&}@6\]'7} i.w.fc _$8ׂאE8tpؿ`+5hYw^]ou4փ,nHR3 H$ƍ(UA).cKH2rWO'́N@$0"$(Z:Նd ˓. *\^=2MhֶGݾ+ AUΗ;Ww_+H%vwY(Snwqk}IV A|x.>}-jaw>Ф=hodA yhA<6qsY):]1IN;K{Os+Q.rɇrĨR[3?N&, ya,&(fOZI~I^Yݷ̲`L{> 0RL;>O8EͲAo8oL|n %BIܻs_&l)2dE6fgۉ/f_u1,zzɫ (!>{eua˳n'GJ am5bdz,+nE)kkE1^lۑגpgL^$0ؠ@F,bzb?d / Ad?с"39x6L /N9vcnOHbsMɑ3RF^ `7~_05?uy(]|H/,pr @ܖ;}}pzyn6oz꼼u:liQaֶq&|hBjf̌+Itn_\f:3:(*oxw" ȻVȌ:U?:=zg۾5|L.0!`@K!lEv3fdBuC'p̜=q@03QO23£^?¹_$`GD_#,޶],&55t]A-'V$zTIrV W"R9XZAyڧO/m\Vjwf|Ȍ 8yۮ][Ƶdճ-2ý?| KMb/zd:]#3;Ev c y{ 2@%s숻Έ}9{F Qbd|dggI$Jpƍ&( N@=v)ESe @GGJ2s'd4zŠPv[Phk`_ W_T]vyHP-QJt񴴗$(AT)P$ 0#z޽J*+JZM@?'  HP HP A!   j2.ʬ^9B$j jz.ORB--- T*CBB޲jv)y<}}}AE G\NCwl# JCPP+ JI+"e]1y# \|ҵ琡֬и?`SE [(OB|W5i"NmwװbqyE\\ofZ5c~6$A"&.td y @-9qYSkWc$ $qY%9EC];N,mYbqbT')I H5WP!rgcֻH2]kDžq<K\j;1h{4Oנ_S/>/ge9uv8m/)wmw~EVʥ<ff}'{k~l~?sĨRBRCE[<ƀ=>4~쁖5jXO yJblO"_pX8]ğ:q[[,85yÆ#{.Hg6ʤ(>dSˆ-Yy.kjj186>̠ͧ=$vVE,$v#e{6El`ڵGhZ,i|$\ݽpn[?{?j9Aoh;(xm>Hazfv.@ԑ}ەQ@q3%kf[ZAN1zj^aQS +uvVB݇M)5z>]6ime'ZgwLj;i.)(/{M+(<^e&lvړ0TmqW-v8KNsQsXC@RQ)556)'YHj^"\*HTMMefKqAŮ ӧ8dggI$Jpƍr*b $-"KVr Qb(dCD-]ܫ-Q-W W;aaa4 Qt]RߒT*,KR+Qog<^ ZV-wwC5ajukPk4, ʻSB!Z)oU)$(Q[|mM!A!ZfTNލD3UP9]xBAYvJ%|%A!Z)oehTCqaZ*U2O L%A! BAY@4mVU, MhJ >4 j-5 >HYyaZZ]%ӹX; }2;y>Z6osJ4EV AyyxR>׷!K +O,qǯrqUeݕ;> >-RYqv~ڱ'f?˦8y/wyٛ&[sE~noۖsRrbqIEVԩu8n۲3A!'47 O ,%]S%{q|&>*2Dr?ްԉuqoȓ3%HkyhH5Ea_s%_%`ۏ@Xdzڏڕ:-w/EOVa3krgߺE;ET3}!r?< yjR4R~ xZjRSeo`>@[&Drp]2۩eÖ},C.~nmtY|&4mwakqÆ]l4~k 3[Aޣ:tҼuI{^\Ev_WH!jhbݮ5c֦Ie*7mM®!6aL+K;W7G[Zr[ <iC{65>H(jmICQ܅= sr7Mz⮴pj~/xECyaqQ,*E6fgۉ/3̚yRQUW,5!(w>M?λրt _k+I/FDW\Դ{KEE& ` vnYP&+4h齪8ӥ))7=d 5Fudk_bT±IHni:l+<"/fs.%I qR`\xĽ-GMԼ%ܖ ;u5c~?vY.A;=Ft7 t֠VJZZ:MW቟ߨ`~~ܪУm#_jlV6 ke lۼcص/{|޽ |&;oUC6vGZoo!qvMtu۰ǑbIMS. ^=6o޶҄I'#W /RfmC lQx_#f1m͚7VHH,0^y^ޫt=u_U:Ӷ[q0_#_W{^ |s~uz͛6eS%sNgKٓf/uKp`.7la֒aIDATf-Z|ź_/ußߘMgv[ȭV5)eos~uf#8@TB@'9HĖQTƲ?,DHOO/Gu|EHT0'*h)JDZ9T@$*= M^UrB!2EVYӚӥ,+vIh 2V%OU| b-J9@ yJ5.+үOMvv_C|9Jm^{H*,7tALZBA)eK߁\Jk kάfST7on&-"(ja60|FU~(Q(QM>Zp~kRT$(>UY<*rIPv[:;*HDB[MM|>e VI9;5 jTS\& ~ X jToS PIu9;o A>5ng >"5ovHPT쐠DS쐠DS쐠DS쐠DmR5\MHP֨I wvHP6I7OHPIpvHPvIpvHPvIm1OHPFI-rvHPI-rvHP]eQդv'$(~djDujcIP&Im4OHPDQMHP g !A!rvHP̓ =9 jR/IPY(::QeAB A0oMNNRijfpH$jذa->A[ݼ"6eZ-d&ut߾]&(͚5v]rrrBBBttt>NM}MM z(nn8db---F *5J(e~gCo)4n> R|)(4EƆmLVeex<AW PRt t-{]ד&(O>7ӧ?N(q)v̲,Jx Pj*JTSYǿ7'33-+,FFFԠ"1ݸ^_YMIՕsrZj0JZ>j͟QrN)uV|Tf奮<,gIU۸bw{U݁+<9w^qJC %8P!R 7ydH%kNeUJ)T8B\82N pBR*7շtEAg }fJ-lyJ%koI淄㰽lzmwL;6Vg=^+@ Vr NJZ(YIW^8uu1u4)/]4f*T_~^%4ORT"WJ po32Y[ ZVT,dY@QaC |ڵ'Ju߫NUl~Jȕ(7W Yr<:،u~; ; ;}vwOv4L2%wkx[w}`ȑ.LșZѫi>OZA/gOV@p5aep;gPqC[AVC6 )Ma1YY9[Gfe^[u4:'3^*xgG>F_Ȑ0hcSMmZ~C{ WYՑuqծ/nW?iz}>snoSeΝQ I T`a },2bAE$&1}{Ǖ Xc~ b4M!La |ϕ/8555b (|>[[[SSSȸJ|5}D,A!(P "(Sdgg E|ԩ}>0+UUu8)))CB^g+4;o|| :>?vV֤ h=Y5Gt$kDY5gyHK*|!˲(Q^<}җJDE@ Ad(AAAB Ad(Ad(AABAB Ad(AAABĠ1FBD LX?IENDB`davmail-6.3.0/src/site/resources/images/osx/osxMavericksMailImap4.png0100644 0000000 0000000 00000322336 12564151555 024413 0ustar000000000 0000000 PNG  IHDR@n< iCCPICC ProfileH Wy\S>,]oad **ԅ!wki."T j H]QV^E ZTZ\pC ^{w93s ;QPp=bJΝåPAM ,USRW#/ZhER!Db < vU L (@$.$űd3 @)( Xs˄H(KRqcl2V"#1F! OɗF!s+$Yc62i1eiQ_R! yRgRJL5hr%DмiNՑR B2CEmp5ob! *zR(@2 (U~U[R)XZD6\IA$Z ! łB FQ:oE=5ȏDR'ԌV,(Ql>ەmȦ-h##D+#1Bch:yyxyOx;T9hD(ʕG*17N.0 { )fBy;rPE&^qh]mhsezE w_0sŪ5X k¾a'X7 և `ϱw83qCw'8Ox> +Zߋ'sU@Ƅ ND2CJbQE D3Nt^ Bp(\;XJEHEY@YN4RZ(()}AG*jAuRSJj u' 4*FҲiʹ}n=N7уt]Eo_hhYkyjEkhɵhh:uIְvvH\{v }#(d,f2=:::::St:tju9ӧiteF01]_/X,#+RVX'YwXov[^Ȯg/j:ugVнDO[Q/BO@^u!}~~rg  DK 4!8v)g4ߐfdgXhXmyA##oL9FFGz cG8cJ׌ߙXM&LM.6gf*62gz,ʬlYms[O?g8.hp\ոnZs-[tY YZYX*,7Z|belfUhՀ5:Zj#ϕqk666jm6mml3lmǰ˷[ga7homd?~MmN׎NY;:>t2uspru|ŅR+*qwI6u/0;ӝ^ǽo K&Nx:~b;'~d[K<={z ==xzy=v{oIܧ烯ҷw/ouCg  T#=(hwINēvLl, *7&Tz7.L3߅_ W 1?x$Yy> *#.NmtA1c cY ǟJ`&%%MtMT&'IIkz&;LOnMɷSRf06%eJR;8i3vJO_~+9Cё9-)uVd֚ީΟz.<[ݖCٙ3I'?3rڵNL?;|lƑ33Rsrw$ Cyqy Ǣ0:р8XF ?8MÂPI4BZ'}V[uQrѮYl_Vqn!H~ĪdNIMQ8kAerg)V:Me6]jgg꾲73g?G>ܵ|Y芯R v̳x^|m y :-\Q̢ŌE^[fO>m_jt{|]y[|!2e}UTͫ~\/=rdE+}WnYE[%_umu5k*[ew]պg?[]uczCombmF6]߷bӲM76_yメ~uc[̶džeM;wVK1T_Sn+{{N{oښݛ3W-|w]۟tsk)oleu?~ ?:lsёGG9Vql'uur+::<]y-.] =K'.G^JܕsW'_qi{onyً]/_v yUju7ovz`x{.?&|)Q^@OpjF-),,|/O Ęhkrgd#}-U## ##Nqy@1_Z%Lm%iTXtXML:com.adobe.xmp 914 714 ?@IDATx WY떺R=!$L\ t+j{l^3b{YM ֙:-:jj&@R@R\*-5}y\*g^w9FOF<96[@@@@@@@@@+جԺWj'n*Ɯ$~UYY1ߘ=8|bgafoUUUUUUUUUU6h|n&}) ٌgiOƆh6clKNJVX̘mqcUUUUUUUUUUT`MTu\qclrmǰY?+gV)ߘ}m.HbSqS)JraUUUUUUUUUUV`V6'n*NdS҆fk~:lLYf4_@@@@@@@@@j7SuRN\c~lbSĊױg$f;S?e\̵{6UUUUUUUUUU]MrKQrK}8blL-;ppV1rlb4r˱טe11kVVVVVVVVVVnfmubRqLٌ[1?cl 0e1PSkS¤ɭO LmҞr()QrSf3vi *T1{m^˩tmr.&O[j9o9⚭UUUUUUUUUU+02R~pQ'qOl\mK`^kRz6UUUUUUUUUUFl)QQϲglʙR&)כ&3fmczjyJ^sTor1ɧ|Smr@@@@@@@@@ק^L듧#Oj=O1}6˞fgzOh,ZVOrbSOcXm <5+PoeRv'/O 6peS*53ň]6?Kү,pei(3Om'/i)]{O ,wUʎ][͕6d1?6H&Oٴ'GN.iaэQN 5UUUUUUUUUUɩʖk_:F;<;9pì-cc 2ϠT7:c-1Y#+zj}k /|qg㏗5kɓ'{8eM旓?e۫mk׮98TǤBXI\gmɉOΧOo;_^gb7\)sxryڳgϧwOwפݑ4d.Ybԗi1}ʆ}IZYX|R&8uZ]L'7u{my#Af1IZ;'Ncsi-ecCC.^\2&iK-֭[dsyxn={cܜySN\cQy=ߵnDm*\qlַB5k6Vca֗zN1SN|8ϙC\r#mprެJ:r|<lk76Ūj6k25+ɹج/Sd,0sutuծVia6[q!Bd l+sfusTڝ{>kk??? Ktm tR^AMB&c-Zu¦]yLח1Sgzrx\t,0O̍_ayj rזcbd[˳[ctq7em| OS^*3'\uPO_c>ab5'g]#tk?e+_p[#)Ws/ ٮ 5 ˗ Oڵ[?Xv*=y}庱^-v̓׫?%F$.m)4}K''޽{{Cg;x,],>81cΧ\b:cuM-:Plڕt}İwV| 9Ehs/i3V {S9̃-9r1?vrI6QvmX'Ug['.srƈOx3ɶj?16f~^knNs8tl}yĊIGXbSpSHR'9+:_}@`O9Gn[⟪8q]҆n.}|,6 .66A^f~!OO8d^e6'̽d\ڕgxk/ubՑA?XXd 0,n{Kݟyr嗗ҽ{`!E{Zn;ɲ{W][zK/zeqe,u.sX׷~,׉r57n:GNyƟqƫSSbKu?۶Agvmڮ/rcŢ[;d( ΂{ (gWr9mx#+M#)g]/u@<ՖEo?T6Ιf5Zk)so۶Ot?X:~^t8iЃrpc'0Åb𧮼T` }E| ++ 9 ϒɍEFa!mK$ox~" Ǐ}c;7zֳ_\>\>AW6]}ٻ~[.ZUn)Unğ[{Q9K^8Ϸ|[?}潥{\yeg|+O9oۅ//\ e> O^͸%};F|!i/^H cОr/ˉ%ر\?|/cD=P˃?埗w?zuy5:g͉{gxYIcش;wb}1vp)6:; !u>Yqb5[;m,uq`q u\w>ĥ]ܸCmˍgls袋}oLD~6ۘӷ-۩{{FMElލc4\)?%O$Og'ȕaKOR* yC|3eUzU֭[q}|-9眳h3I|N9vO増}9k+:Ěr5'˶ aɤDo/7?W~,}*}c}3q)z\pE.}9s1XIfh3L:xyeLbӖqi;^1Kgnm>A֎e>?FvLƋsá͘; ֱGQv&IY|a.Va=)=;˧/9:8_ eyy0Ϋs ʝ?~xv+Ǧ],}m0k*9 2g!6#wc~m˘ŧ-c.Vb<`%${ mY;5ב5$CmxY~O衇koƼCz`1'cWW^́F1\I}$dE̽@:Y=y-[Ĩ9$2m:M~{o$)$@r9rc B.:`9zˇyN9]<뾥;F0?}|<\w5w?cW?ǀ2?vn>(0~i s/iK\bK[?Gx8Ǔsm;iʉz?.,zH bjNWaem0ց|zQ綝-s$;zR/ᄎ}EuZn9%?eMʱc:Y{޵؃10!rd>YUNlh< Ӟ/IG.Wr<+?wo͝')9\^}aݺ~s639qϝnl'1Iy.\ym8q`xf{Kg{ծv/-`>C;|tҗ3 g\ޱ^=zrRve8\㖥'fu_gie&<= ta95gx/r,(0|56?oWeR֗e]G7-O}`67yiP)e;/(k|G.[{?u9Tn:Y.3}5Eǎ΁? ^[6xvCg>iӮ^iؽE{9q2gneο9M2O3e_Xƚjq͸^%mĜdgSZn}T~ͯ+>[~~}l6)s7\S}y|+\ћuw˯+7w/-?7C}{}?-xkŘYK_v(r_O[:[mr:1gzM7Pd,[l)]U֯_z##tv1ړ҆f>UD8xe2$Fs!s1vۗ%Ĉ#oMu\܋>&w><&OsͷtcjyL6Ib C{1Y=w=+ohL,BݱcG4__e#ɦ9㫮`= -|.|Vyesc[Xk?س-屲l!+}K$Kq`9-P.}͛]v[8U[=aõ,!D]7uYGb>92y 91ș8|u_GbanP Nft\s|gsv"?}s=_zW܋{u7𱃩Ю,ǞyM+MJFc6f7\2ܾղ &zwyb#bӦMJ"s+X}3_P9Zl躱e}Ykf;nC Xb%'5>{09Zzt͖}c['oY}zb}9Hy֥_$ َ5Mp5q9[ʙ7 ٣816\/.sa^/pѽF{#o)7ʿ{m֖=:w1i1/}rcڍ6 Ez $t1zsxI3f*m~\sV֙P u-[bW7~!{g<ֱedAΝ;{rWs==d:?}wÈny-@.n>tryETo('&_,￿HU᧔  ŚW&ϕ}g9;wxG Ss./@9kf͙<7 6\YyO}4=}e`~Q;ĀK.(ulK# pbOu^HL/ԈZZ+X-;I,mչKA8xf֚|Sfk֭/뻟8_߰pݴ(Z|{˵ۏg|<ܽ}_~_sm?򶷽lor:ڗ+26ο8m9v^_o1n_:Աp.YKk͚|Sϡo,v|7FĀK.(ulm\њi9sIꗃA&IʿYO"-db3g؛,pӹ .#{Mj^tc|3m+dN;9uBS_sp]Yl=1 XrX;r-//w^;{o}G[ʕ83T0|lYwQy~o9o.d瀴ʜ,O6 nmig1L>ȼW~Mw/)?/~l<_~~)}wXy?x~9v+_/WW=Y^˿Ʈ_eo~CւX+V||I^]WumeOؖ79w;ߜ{uV>hBv,cSjXK!_kv08oi?D;5wr'~LNullNJIڵ9]~b-nރ6_ru,zeND}G~ya9H}C{'rιW/\|Me4'?˻?W~K벝,츬\qsʳ|AxcH_uSWAZc#'%&i'd ޶{pd.cmg~c6X؆X+æ\1s? Jdz][|Ƨsm8m%›+^?X=p;9ݿI:qOGyrǹee϶9MƲI‰cˡks6cLJ v屃Gol)[6(wla͆reG#nEַmT֜8R>vEt䜣(kur ү:xWm9H?>ٶy8!v_xnIʹQ"Թ;j?m@m9aݔIԱ>X|uKoo?+bmfa|`/О9Ov:vkwpcLg#(wE96h69)yx]Xʜ1Yq!cl[4K,Sqw>ao)Ov{8;ܺlF|_s_ة<΁6=źRuFک$N=*Ra<ܼÓkxSֈZfO;Z6繖=OҊL,˞={zNG3̋ ߹sәr# cKrr䱃< $V9,$䫭yE| &qc69q&;lwX\\,yS2w`Qa 3QK7&>t1xt}c[?|̵!x|&ydANXbr6vsc8:F]n>Ǫ=sk;67.^Y.}&)Rk-1\}VMn,6Yf+짲Ͼ%Kuۦ26 5zums9r.s.RϾiknmbaۦ?5Bi"':lnC6ɑi Zy?8ȶmhu8m1`WcžiiMmG~GnMR ZcX㉵lCXtւku:=HV&&ֽ>cconm%|]y z(}vjs\=IcXMdᦄgq1|؈Ӈ 6_3qL@N9\:*'WDhCOY=q~12=F,}.ԋ_Rcl_,~Zm6Ovϵv{6C85Nv:2~X9fc[S>ᴍq'J_cME GN{^0̑xڹx@ 9쇺XОIc3xlWg~'v8SdxAǧ<8َm9M Huvb\5矺X۵MsiGW56sl>89l`XO_ te/mR_þٞ:>rdZZx5Vy7v1Λ3>6onpb!!Wbj،O\ڑ*濝y>z`SfG]Y^ xMR_zpt|c%7Vݼ̃w-.\#nX'o?5y0bX>Fgf,m1V;>ǜ7txx3'6`,m5gʮv/v/\ߨ%e׎>9k zL\ը֮Ƈ]up>8=?ʞwKMEGv\C=~)8`O 1X-+'rZF:ꍣ9ϏX&I C'{,HpЇy n[|h'p!F<ص%?}5>9v{p"XnqhlKMa3N?\ozsۆ6[aNfڬul?\?\]' F?\秼UO?psۆ6Ю vnr K]7PƠ{~ʱANkÜ۞6\p&Ϛ6 rw&"nB>utyrmJiűÎbͬ?1mkiGN@-6/A{# .<1ҏݓFAܩ1ͅL~/fۮc+.;dsW:$|͗c_p̛v󈁧"+7|wMMwcl\\et(t3풟6!v2\Ys>8sLN>|9fQ+Sz~c'y+.;d[į ޅW|>Y :~mjښZy5DNu;kuM qN쏸A?܌ݏ7o},)xvty91Ydu0^1\7o.]vY+ʅ^8F9`zϼR k̅|gK.\y/N|-d/8qRO2bI~dnr83{キ_S\k7v-e)'8lx.&̋rW.S}Y1r,v֭d^tEߏ@]8jcV}Kԕi^ ~Xږmg<2^Lmd-d888n?Ҧse>6M8dlb͏.^xd0Nƀ!;&d{J;cߵͶj|7n sNٱcG'eڡ N?翱= sc 'ݻt'E/mi듟ӹck16 [s2 r}/.zիʶmuۖXq;__=y*~3db3vrp@-^B 3gg9~ۛGԧ>UvWe{IG~ص![f;%k^~__xmK<o Vۜ5ꋸ)}*9lso_iMy5쇲Ιr0xPb z];˭1 ->QZ('?_3k׼gbET)}*&y׮]1sf=skuL_y8Go6ݻ*UW}L{ihX|ĵ.=P9s!Lh?7y×Gn+O\1SNܔ=1˒Oe#I'jJJd<ȟ2v7j7&?|c(*7> s/FcƤŏ|_(4կ_a9$Zp ٜf6&c%wqG mC^j3FNkCϾ#[? ۮX%xrm/M'^ȣ2].N .qb; x8TŘm ް{wH'm99I6y )L Zy,w#IvƸ15w 4 t8_|+^o.yg{pi#_֏|#8oBz&{3qu{7V:e;u{b2.Mo0y#+(06z#)s!sd#m!8 W }_}nŪW9}OMY>s&6e>椌U+7kO{3!O~j?שg_y?VylOv!ůbŨ|sxױ>MkZ/gnC_n3Gq>vcn^mcy'8!uDg̐aa>|7q'nЕ9kݽA ?]d3-g#IR+m=)5_zQfcÛ*y2/!oVg>Kklj^/Jcpio.ƓSENR]ӔL,_җ\S<6lJ׿[eщJ8cؕ1'M:t7~o!1|Ӕ?uj33;EOOg9)9梏_7?lX8V#mI[L#l;un_ɘ9fq|` bL1ێ ȃto(<rj7Hu_+]} g?[u_򗗍X6ڵ1?8غV5ڼē;Ǚ+~&MyW8hJ{ihXU8!y s Ϫ6m:6D5MY0C`jJlӗ/g#98m42{ጟŒNq?߮7&ɗ m2Tpsa×".覆6qMbG&fAiWsmoC] p!88n,UF 裏>X6olDR:A.yx;^|Ν60! 63z}θ@>vX^}ʜ)-et*y;q؞g,ʱܶ}2h,ؔ3?[1_M9r-:SD~ېUcwcRfvb}O yscNuv\!l~2xAN6c݋~P/7'|kɆuC@ ʎ6}#/?~yi۱k3n+OfQ<>lO"ow' k)wl** x9xy}Ϟ=Gv _r¾ªmxA7Åqc~7OFr*ZVA\s`YR.lAMF;1۷o_{<9;'^lwbNO;Hvt1??2Xkʾꫯ'c x>ͤM7qݶ!KE.Q99abkO/Ec99쫹/is]ߕ::f?/|_ykB~/ }cMęS80Y_s1{˫_}Wq6fkG[5e;/:ec<l( cdk~{&:=Ixh@i4 &r}EX3Y$־ԕ8yŻv.!7b-Rpw/xǐwY_} y2fʽsΏ 񤎍͍- ;$Yvł7D>g32F'rn;O/|p#k;e9Ҏ}zMmܶkӖHc쟱k;2?xWy0g]ojw𻮰'6Y;V𬗬xsk5G9y`I`jp !\sr`ljM2Ft6j/kNGe.6c9Ꮉ mXCY8r0̵ü7=|#n?·{xµzַ,[\\뭼aFr.6ع@"Ggz-1L>rH6s tm$i4f3eWᵬm D|`$ycB>/xMDo/;w|<&M6<CbBn/b8 \'^Љ 8۰/mXvs(ϸԎ nԂZ闟؎>jg;b  /[1Y' BW*~ <ro<\ҟ6}pxA&T9Бy7Cz+g̣XrqH:dn9x?׊88 F+CO=9>pHёO3å?sX/9$f.5w^2־d21|9ڎp7<<^wv[tG'}_d!'zuܵ]!p]dlၽ2GGX:b:.9klqЗw5*oem֬//=acK`OqؗR~1Y+eX9g,>N>q_pdmOFe.>p o5jhX}898yN`38uw-A|P6dH 7fgEtn$| zgL-o2^ fQpxFNbhf?C%8>fox}>܋1`M)N^ǂ< h,<qY\!0rk'|j!?x_t/0cfv>3d}5KX|g7 *Vx(ǍN.~O8y9=??)[}`Xggq aO<׉w HI}?x@m~C-8䍭W$?6lC̣L`|6c!mer HŃ+_#'`C Wb̥ n \'y}s`[)݌U }Blv\1 X91|'Imm<ۮ1RK2C'>b! > rBśwv/ٿ'><m269Xys e!#7t骫!?dIFe?vk(D "3ʱ.זݻw/}6I߹!x2&G|TreI}?|)ob_mpqRW^Soû..j'*kOtnrr߁rPs_Ϛr9.|a#%o!bC͟c՟\c!7++}n5** pWZ:: EO۬qSˎ_Fr>6~)v1Ӗ6qk0廯X9s>w < >cSl| o*yl\b?ݛ":qƘc@/~ŗFA[Evc&yx;w73$2dK? tI91L?O>piWƎC<*g96u>mS :>tv}@3>62>H a1?Xdlbe l^j,vP"/}>zσ756\x+u"N8g?1\+jN0>G+籛*#enmDf>̍:ȭ:$>㑧cH\|ǚ8A9Xmga3'298#7屲~]qⲲ/~l8֭y%eGb=i 2':ٶ{ }'2:&'y!qiW69 ?y̽0^/|T_cs5UU`܃{E_}w~oJ \2j}.6uVFrP*.M`G,zŝrd. Ǎ<_䟘K39+I| w!c>N7\e߼);&oh~u|4Np8

$ڴlŋ냟C{' 6C_6x=a yQ~I9ĀYؽC+wpr;Sg 6i8 mAY uqԇTUI~ˉxh'uq̑2>I\O'q;wO&V=6j'|:uگۥmhj柸̯ =a6Ǹ-]u<ɫ=S yoߵۮ_xS9rc{^~^7kocZ [[@WswLcP-ᐐK2}u ~`,omq 1V{cs~-/}K7i'>o x.zY$uбQm5n"6ħ1g\^F.ɧbS6SNn; 6F'^1 {CXDLp7|xUWqǍ #7ybƃ-L5Xx ~ٶI2<ۜ)omWnW~yHefOe.e\!sbI<}6ma>m lĩ;frBSj>~G ̏xdm62۶ 60^}Oi>nC>bm+u12'c"/c+|~|E 2>>eSØD0Λa`+to$tf6ƲWu96#&ұ8?c2XǢ=4?dP`o0oqIcuĩñi/xX\\SC]T?p9ԭM7lw]21]lȎ9c9x 9)''D\5'֓M"Oc;opFo5jhX}@<_puC5#.~ ]ԑ08un̿Θ|EIV"טMC>3NrYL>aXo(ډ'lq&ハ79bש)ڱ $~q֖Xo.^ˍ}q'`cmجqԅ E 9MDl8ts9~lSyuŒ!p_NdA^ ӱ!!..6Oڽn~8:8q!ElC610 ,~M 6"=fatz{ OʎUN>rCG 6HXdd1p97D`zhl¸Az-c'C۷hC'o$^:9_O[t2.p1f拍(c#m_teV;}2^?vb^%dNJ?3"8I[po<'rONNʡIq+{cOn{0k2>e%6XsЖ928ȼrq`Hrbg|}I OڼIM򗿼߈** Ҹ9y̹'|ᢠgY,_zSHփ_N7 S,'T̄;r;Xly36w ll,"d zW 1b] 6'\plO>98dc}P-vG_y0bØ'ԇ>qB"CG.d8D$|~>)7=s}ɟs#.=HĦ=6'  ~8kNooOIxA qؾm/6džl|bKy͡n;\ᒵL>o.C_½i;sZv$u}ݜ[S22]W˽fx>[vb8l6%1m,μa \syfKcSM"c5< yA:61'v9oL^i}݋m+17S5~`K;>b!%>dNte^>r}+W켢qpȼs)u!۲ԍs)SN<Ē_9C'I}odH?ql"CLiz*99Ƚ]+1ָY'ybз9Ս|UxV8$'Nx} 7eto DEAp2vޡ?b8 /kP!x1o `+-LJ ?74OF#@ 朓-eck$yƖ2qgwJlJ$$3H ȹшӞW E0_߷N|qP.q/XB#6vؘy^w'QxN>:| PO#RzKEҊ7~򩏶uy,WSB'C}KOljUyХ-x@NڲO^TNYԥN P׶8?J٠FZ%=쫷 8A]{#}(4:Jz@}YzSMQ7m2Vߺ<േ:ʧNT}ꔦ^48(8gC7ǡx\ ~c/^m[g ^I>e7Ս :SsE l5~A< Q=},etgMW濴EGK%}cܭ! 5И:< N}Kl~kݲSgitsN,K^ܡ!𣣔=\!䑶RPR(WuPPY'%=mh?yO85ณzy򖶁g?30zk P-&=tlXW~ %}jxJe٧iE_KBvJrdɒ%yެdouЈ@#.sU\~OM,ffihXOjT{u"SR]/O#..Д$+H NY(C#Է^gI;WEtڏ 187qSWPڥ QUb z*:%'^[}rP'=4-i$tm++Wŏ6@<~qrWBu6I.h 'Ȑ6pAT G'vs`m xk:Lp%C6zcET-m )иUFt-Wq ڨo'@u/md>pBNZTm6d/=>W3ɳ|г`,Jې]=h+k.x#MKi\i/:*г5~q}.zjگ1+n1˝j@UJ]r 귲,-%-m}ϸ₈ʹуgܰQ; g~ʾ:m6/<lfN&/cBjeӈ@#(AX |9X8ws~ZsD.p,N,NDryNpf>DכCۖ_ߒgpPwA$ف tW_bl/r1PJm%-uE|)>p7=;Ih1=POitȖRJ{;U\-mnԭ=RWv+% C[cbaÆXJg?md[byrm)~J}"8AN5k*ȇw #S7mGɣ\A=_O:|_.2q2qƸ+*v\/|,;(޼3l_zh569޴U~ԍrs-/8zOQꀦG[@}^ZuGmmOY©_}ږy>*^Zh_֞G^h8՘6PS}1fY[@Oz#i_|j 6 YP >}KZȁxh2n2)_?_ZJUneO헷8 u␡:9qU 0rrGG{iDӊs5Ňu(JsSQX;Sy ԩFnMB[Ւz}YۻMTmlg]wUSH\ ,.`<|['; hIH-OOZq>pYs"`lISڤ)PQc1ĂXHlhSK9#Y^uO[%xvaɒ%ՕX[=Q&%]܁NҮR&>G%@ˆL짤 HI:UxU6 S4Y/2_OOۯUʓ|i8ΆpllS/苲JzʒE%-DJ~QO9>آM`$x!6݃O~c/2I+ZJ@}Y*Ǟ.iח}/7mquO[P'KS?$рpTapЖf@_:_lcmeXB+6§O ఫi?8~ 汀* *>RW m:&#'/HHï~e!1oُ|@U#Kۺ/vFƜ6Q&8L8>~q',Eʰұb_<ڥL]ylYz^m<֥5_hc >I+[;[މ4>棾.>K{g R"委"J6ɯȠ ^^uIMCĂq" >)Wٴ\odj'%q\<87huy,C=ԑ mG z6 7GOٔ%>mGrot*Bü̿rۇ]r^mgʒ~_^Jy}Ҕ`@?CqEyG Oۍg=1M^p3M>@_ZpRڌ)KYRW&u+43Nہ z7P:*e?mW6ٮ?xpzGmSn* ñnDt8%zᗮ,yE>J:6)Q1T>ۏ,^zhJvүt.v t84Т[=nڋ1k>=ua'ڀr-|6*+J":lSjsE?QKY):h+Ӻ}%8}LgKt4D(-6KOh߯v\['XZ4~e QNKʂ_?wbkKG\艏ml;86xDuͣuw!lC'%z_`o'JmOcE SQ|٦$.o,(BL(а&B&2I =]TumTni<4D(-6K}'#lN8[忴ʗϺZH'zu6XB{D*[:۔SdIiYq;Qst"N\'o`~ 8 H:PNJhDlбQeJg[%z\dٶOuJipq-5h\'?xi<.pƀqq xtwVC'86iÃhT8mDF%gdVvyʴVKڦ ![T>`~ hs?zٌ- l|xx[}oU :q -ڡⱭm+h'm{l`>1im>kv鳾t`h@'څД8}w*1f(eZGm2+!ol#uJxJ^öN(e4Ȣ>)CJuA(zi2JcxCG)U/ %>o=J7Ƴmh[AZ}%^T&3cN8 `c|ip0OB&BdVsg \!`>/XUGq[뻏ģ]UcG /+m4G?tPgЁ4S8hxdZ,˼꿶P'Q膟Md_(A7)zCcxtg<ԑi?rcoNl:Mokd):nlB} @lqLΆ̒PBj P~yXW&_ukW3[ZۧcC¯*uÒ~y(m#߹Qkc;?vs|;^J9׿?a,v.vd>(=(\_G\Q8sNu?>?^Y+&2nʬr4̸(R_:e\c[/S9QG>- .\jm#YJSNZmcwR% 㭌6?v)v)`߱?14Rし _=]*Wi3mc^ ^" \#'矘9G!S~Gm`N2x2>=ؓ;SG%}f{b^>9QNdL;-47Ŀy+kOG6??Y5.jnYin514W&ЁcmtAtpWX9fq/3tP&6"_lc3v O;=D7cuL+]IW  ulPv6+veWAoz|x?e*WztP+c@rAѝ':g ?!܁;.||88s\gWt_kqִWO-jqah ꢟ:KsگmWmd㕑[!aj_q}WQ߱0톸`NcRp`s߉ᅰ2/Rܺ䩍x,}hX#F#?7FW,;7'X'aӴ4xA96W_g orheEKجb~wGu rWO%|󏍹V4RUw}tgcEd~a_1YZ}G\Y1Xh~_Wȉ7_e奄NJ_qvl^J#^O7o||8Px!:Vٸl^{'u<60 O]ЀS/Ě3[eďzXt=`1u\99ÇDD`@g9oyCѽ's~667 ^;Ԫ|N[vD% bj~ y8vn_LG&ڢ_x̫_hLࣤM2iZ?6}Oy`|f:䎋6lVh+:y RV] ^q%uRB-q?/ 'Eʃ?gY}s>SCxLw;k;7ڟEF'{9A}.N{!:x~@S 2+]mz;oyіfxKGyȶ6ԥ}O|MLٕ9|m|+ȶg{?o,9'V̪Pgk&U<էʢ,8#V)WKjݸ/F⹟/yX|ϊh 1ny+ksZD?j[ww=<9m r@IDATnꘜ!?Cܚ;*-'@7|5?OڧŔ|9،G^9'圸RXQ?_>doii:foh 5(qج}ੇc תaس7;RBy)_J1%Gp )٠?@?;VK.rƦm smJ:ʥV[*ʐG{#fp϶)5uiũ2`]!>Tm#M^',=ֻ+>7b8sXyJaY?)A]m6V+rCk|_Ĝ\3wu> 8t N`']{JW|F{ow835DGrA8km1r^v{v8#yjo~8~Ꜹӷ\<`ZPht6펝{⢅]1zdWlSY8kj?On⶛.iy@cp5qLȬkPSM:#>s 9e#=?R g{ު㎋=oT,};/?~mm/c[EZr-bӶq9y[6SX,kWWvW:-w_ }؎X؝#*>wϪ?5V?:v YM-0;)qwŋ&Woxc0Ϙ'3]+ۖGKw˿^ٝw%&xs', 9?ĕzR.ϱ/xiͧrUO1-g)qS_ߋ ΎѾ#y0UV_wŔ׿u{31gm7ƣbZo h\4)v[O[xMϞv|Q%>H?~ՃqH?q4-4o _l}\b^KO׳>~x{E2z(V?j̿xVKѓ2W^ܩ9Dn#?~8jJ/6!{XGZn@93ס¦x}`ۢcd^Nsۮ14zw/6V~8'X{+? 9!.sN&V>2wTmŋKr]p^:_;i;s+u慵x9ӯTKoV. jNx{ŵX{_~06_-}Xmb ]Ŕݔc)DOS,,`ѽko4rlg<t%7+9O޿&>>ZswVw۲h0-2ƃ[>z^C@1+oWeǓx9^83Oʏ|..y#ʞ\!'f;1'o\9J`[|*?wp7C*3GUlT/-UݯƃO0:A~ 3:~⡿,? 搶_tC/KqLa-1U8ij1N@2ʮϿ_W%zvlذ+Zr1r\ޛba^d?xypay6\1wC+bf m|6מ1$< #=֜҇őjMq?5oķ񥘼Xh8_yO\]>wkWY[f\ׯo 6Ɯ+n{񦘛~ߊocF~܉9My0B2lNN@b<ǯ=Ś1wQ9m};RL}7X~nGlّ;<ݷu{u`lgO=GZGTv< 'UcC}iX 1'Əӿx&qkX!5ϸ766۟y8̹˗omVMO]ڕŗ+qC^P|휸dXl~ۡydQ^tfblŲ|¥3V/۷q3ޒڍ*h&܍1;}#`c|{ƃ:󆗞W׿kncsKѱ?o溏6o=sgsu+q<ҞښAٴu2%_9J^c )M=zZhhj {U7m풞ҹIq JiN'`Wm T8vѦSV^ʒXgMm沸)vE6&K[^1\pa|k߈[gɋT*Zsmݶ6/b|+7GWWgba,6O_n~㲱]@Iy^ldk6.߫qtC EȅF|@{G.Fy9GE)l|H,\$b>x)OB$@t<KLJb1=wX=<+['"=Gby]iIGj`ӡ<~\;zcֹˣy]mVWb$+n:Ҟ)O|+1%̝>ǎ~xJкAO.TQ(G'\xhj#yŴyh>|0O_^9r9#-#3_sb//nOy`;r~tģ?^1њw8͹4!1?O9bڄ]t9=z5uG]ѕO?:=9s{k;*:Xپ6}썏 ԥWEK޾17n8vi,<}t;zwl#yw_썹ά׷fW(j9&ix#*(ϸf4/Bf%DGԮ|w):3&GsNM^8-l3Vu^׻Œh>)?=Z;3bE`=؞xI^Gc^4W}|f9ه#~v[G1>ۉQk|Ek^\89989.wisbY>6ڗPƶ'#[PɚS&Qܷ M^^vu=;ws/}WO(\mV_eĄۏl?#|to=81̿Zs@W|K/uWi2#1???x'œ?x_tG>^ϊJg>Ѽ޸IѝǍeʤeq8woΦwg݇bjgktL͉`,\ͭv#A3!x渒L/ü3UFP"Ckޒh~;/j!:l-+4+.ё DpCNsN 0|}}q~ t>6=4D(3vqӥscyR[Ri8T8j^_y f͖d}ݱO-?տYӻέNU_~]]y#|L|6%zh壵w_t Жض+ι8?c5iZ3%]<M 39ҌѱSX^2ۛA13;v,:`G<ⱟnd\|]sO*qbflY3mB笌+_wؗcj6G쉼$s.6ͣ#mn{(o:],{ v:Տ߈|'rfW΃ {7O$;4É1E>xD@Z3c/U*a;w2qᘜ2"pޝhI<=w>u3{8 7~8|G~ӹ4.4OqQyٙ|} Y<ͅ!X>0|8V9;َ!ƙy'Ohhhdc-1K|·eC b)wx"5 {u-:2.W:m^n3cWƛ~6u zԧ-FʓBҀg}ZY»ͿL|s.WqƵxcOlt,}ӟ;?qxn&pķɘ!AII4$3[f4^y?MyRGi"f,Zi>66S]ʖ&>"ѕU8]9w#y޵1+\878Tc1wlyt>y ? V3~|(_|:),v72#B}yŬewh<&Mʫ-qo0:ѵ];NJeS3/vʯœ3YЋQbYÃ1l{gtI-?%nE덑< ߻23qvޞϻXwŵwlwǴc~(p~GSyDxnӞؿ{SFh]c1'چ֫J mo oنFZrLVѓWq]'6ES~`9wXR/4-'⓱hq?9F>;P>׆&.~8~֘65x0/̌ühP;zwFt1bk[#ΙQ+;9/^bFl].̽*0f̟eͺ윈e5N3wd7bqcľXlIāMqx%s-ОnGm߽-Hܜo58w^"7mge s>$=vo O׾nW<Υ:|aK ?^3{ b8s 8k~:m~,LA%4C9g^k/Nϱ8q, o||0&-^GEO☒mf/{I3|"/M2._17\K0ƙhe{ǿ wmּ3u#\0bfm-wL1C?)icSͮ|'ԝwgSdyQaŜʧ)3yjJ1.~~{tek'eC~Dz>O:bࡄ~}dP1*G|V(])AO ڃ.m;څ-i ?Kp@ Mt-Ȫl?nPl߼+`^15:f/vʓ̮|B%{sʫyy`>z5ǷNzXZ#C\M]VTúZ,jF߫*Oct3Pܑ4yL<3}{/eYi>>qV~!ěŧnYIk/"WOvu3Ӭ bS>6;qJ̝G1z:Ϻ0.ڼ# j[+G@w@ՁV5n_|ac:teuzꇧi/t]w]±?Iɻ 7+fŴsύ}rxie[Uё;?j.U񅽾scYq'_u}RlΓ9}&x}Z0{o?/nx*y\25̈[.-1o~5[7)nlY|գO-Mg_̫;/}<~IPHcz[c&%cW8O/tQt<)h+C~btбA@T![Qb@ڗw /"HG\[>?XW{lwޜw2_q;;>6s>WߐBϾ;12ݹ"B־x?.pV{;楹/&-]m ._ygp(KcB Y3QwŌkr.{,rf-fU]S|>?{?'Ū;> |mS!y-Fg,6F#i׉S-Ѷس9A<25ܲ?JK.q˵ cnShub@<89n qՖm%m/ I g|誳c8q%y?/-l|z`+bƧj~0XOj]v9PĜ#>imV?Гct^3E6`wH_?3pb_J^;Ugŵ˷ů~5,](/ڭe5 GY.x˃n̊)AUjc6Oh5OƯwc1;' oiIcfSLo|C(.M})ͪ < ,/?P>/i bۻ;I6Eƌ|Gۦ̮z绚̅`zKݲ-zCs97VBSųqd5f̞Wnk1;oٱ7w-`+y@ߖ@3<ʛu;󝁳Cy\vA-3ϊ9]Zio;c4g:kA~-7y?oaEȃZeƸ?]k̨'lmy> =q;5p(ZuE}yxXxVL:;^ccqhG|sN,1&{cuJ,؟coRwޜ-gx }[3-JbCU_|Rcq~Hli|m8gTr dᇛ9IcyƤHN{4gY井y8z,m˼znSc{]% %$uhr^]rz0lgr{mr:'߫5qG3^bL gMmSy {Pr[>hcm?eD-='ת;Ӗ )c ?$jX{˗gYs#;ĿS| ȏcN8t~hSp-^lMi_Jϱ }^;'/|h2gS:'{򏜦I9og@^@ϋ۝hjFSci~^cŖA@u1w[y/7BN[v9cy@_Y_c\[{eyKή>P^@8V0Ɗ h7xȫwkU%wm7F8hۖV~7H}YLTEK /K\EPSۻcOn4Kh87ODHH1",>LJr9wX ]uvmF.o<p&9Q+'12zYaĕ&v@1B?Xp2*ur>>vtk2ytc3wr؇,.m>>BxT  {;۞WSٸ6g&^;q# =?l[H|m--:1񉜧)?}(/i2kX"O0l|ԑ W='F~@hо8Hѥ>N{eqʬ _K>Vv40KOĝRzm1IJNXޗ_/_DʬbqQ]%F.2*|a >1/c?9[emT<;raU8Wlyhqh?̧ 9pRXúЖQ!US:3+fơ<{/8V@?)eX;:]m~zq?rVs3OL3kqL<|q[''RK_.Kh#'xv^ #AW<8>s@YʇPrGMkɻyջ%`NntN꼠UȨ3<у*vDV܀_o:S4Jzu7^s}q"YMxGݔU~JÆLxiR=@.1+o٦^^}&hח)eSO[MYCuKcmW;U1/u}A^mP>DT%c!M<5ȗ>@/Dz+C8__/Ƽ ]s>*mj+{K]~`~SClVb>yG[J}r;R?ytCG[(nlNNw/c1to7@s \XBK?m6t ԑQrRVi;>AS}Ik8|%ۤx. vR]t-}l|DyGͅzڀBCG}U% =u,M?%%6Ե}.g_Y*~ʗ)U_yb3.B+qS:mբۿ*|S-e#ߘ\i 'Ŧĸi1'J{3kz|n'xN_@LJwN {`";Tc? ]N.x=,4FdQgrRZzJfS~m~xhi[QsNzdS ul0>ꄞ/c Z>~&]cC5hE?}o䟱4yHL^ocb>:q>c߀cί?ھCJG ,.2]ʧZ[zF0S{PmƕИXr\7uEY1kkģ Ǐ%U1 tl9<^=>^KߛWI8>H:8q`гտ'IEΙ ֙hЉ*$wppE?.I. ^Nfxx餕^(mȔ<'sچ,~6@yũ}ڄ<@)::oW 譯2D<oչӘ'm'kmQc~HX[J|c8cL0>j?I)5#KAc,:lN*>pGҝ86CwaV2g]~,~[Ҫu՗n৯J P?8uF>%8FOFԘ'x~~X/˲Xklcwߞ3?+Ic3O_mINXX]q Ty8L ::?/>cXpL&3F;OƱU =>',Nā'<(r28Żȃ<:З/8~xI[4h<6@"6dx-r(m.x׆S:ʝ0i;iiWvxy/e4?c8a1Fhg<( # T((E ,b9Կމg;zY~ީCP=bN@B ! I>>&$!@$˴gy>rq<_:|FV:k] kB.tv#wyDC R!ɉ` ' oиDn,NԨQ8op7h8Q'|'o]L8:"&u8]VNLgMrc}ạ&kK8it9?|yc`eY1lzfrL煞3ϜgyQuXfegMc}tñ`궱6 S娓g-:2c<1P>y=Y[)y4s ~c0櫟 jC3\8O8l2t5l Y9jyƏ:CTGV!Vb:md߱.[yҰ /L3<(ϴڵk{O|tgy:3niLItzg8LErt&K귶O[_Y?FV(y`?4s: fk/;y>c/<4<ۜCz)˃a;^;>.V(_?}il\2s_qxUp IP?[Vr&˺(OYY]n}cܜX9c{xX.SPu.6Re4?ؘ7rsGh 5Zf9u:+)g<ikkcL?r :aK3Y>t>ڟ@IDAT;6o88l"U@d:[lqooNY[cϛg}]vb8y+Z"N?9a6O7Uۊ{d9z=Nr'`xzc@VqE:x uӟХq$Rxoo[mP3]aZ(4+tr3=&Ga:fV1lM93䭝gY;O_015XXhC7b6/uf_?: G1yNqٶC^+<Ȇk/L3&t+t1t,Ʉ̑9_ fA0mņf)N5j}UcaΜ9^<&oF-B:7;#c^:#!oVåtv:$eaV_x ze EXl;#jd8c6ϗeAa7/7XlaeKcY:j2NVcؚ<36En 3L:cʱ oӧc%g<+cg?&LAgm"?3LY~孬_?uPa0X1n锷:۸._[SllĮ9k~sLk]uwTaHrq36 f2΋+}qסEhٲ(웼|4k'.QQpwi4qxDlFnǡVnmBS>随ͩpjZȠZlۄٮ=A8ɶ|:0ef_i(a匯0aQcUtӧNRtX[Nj[oi|O_ooSb<Кqq^:kdIy:k`7->X[-5!Ɨ''2_?{vN/ld2neC'tt̳ybsȮ_y M֟)te=ky@g@p/$ǐ  3l6A7l۶ wqSN9ŻQߔN3Hۊ%)y{xɛ}%vؘjQ1kn/.ޣtel5٨\lX׮GD(jΞy).#?30K'"8j8Al7+n2~)g:(KNvb̲wʲnMt>LvǤGY٘RLc1ΰR_n1g#>P9?uQ361neO,c2LQ1lPrGqO95cL +>?tcek?ө_s|,˘>2;Q<젬ɕ6~>Q 7X,gV (t+ga>>Q1lae2L?t?'K/=)L|:ugssغGY/:1ߟ##1Naˣ6'tW~<+=n"I;9xb.V(قʋO&>iDxذawΛ'{㽟L Bꤳ"w-xi-p_.FrlI/g&;?'d> 럊q[V"=N;1gwkmvհa]bLi,K9u384:)1(z,feMNMaG}V?6:g:}:->2ye?aM/e1 i ml8bm^kꤣeMŸߙXFyu3O"gF_c8qʸ*Lf錳ӧ~ymg03>vn1nz-qoyvYtku+tk67YI}9mRGhLgE6mp>rٹjsv><6'zblC)ukyb5;]rrakq#GA> yRUáY]z2.%tqK_N/ky LQdڎ?<9io<'7x޽ ^f1Q/=zv1)Oݬh>vs fG#ۿ谬(ZtƈIo)a }Ị+.]x[ V|6QNGvaam3} #Moegykk42Lc>u0ÛN2c4:c9kGy:a:f3ʲ.cY>Z ̷a}3N_1$aL8_l~ܷsl~}_>q6mjo熮~:e/[7~袋.z,p _=#M/1l,lKd3OIX968xLQ^=ya3ʳ wO6n܈]vyqH,,1& eǃd9Ña.`qcvcyŸ-zLaxIź'>k;XieXfoƃr[sidtctk5sN뿮vc]Cda*0$FNLMāNKKΝ;=ҙ ohP'vMTY>˳.ә||3ߌLOLlXe3'%\騛u`[(oF9eXu20Ld)o}^ouѧ3&O4O0rƏg7gyƭWg_g_oZC;Cq2Uم,C7 '= Ͱͳ:P0tہb9q0Ltt+ Eex>y41ϯrF:mgYd,N46mQ蛣,@ʚam2NV'u>:˷ 01>cu3r.X,tR35 ^c6X:N*oI_o{z_-#GΒ]'3H}+`īn($7\xSŎFӸǸdE'8EI]\D)|+4[Pӱ>YyQq~[xf;`L-a6#"dl=|5?٪ ^+/Xi>՗: 79o叺ꪫI7x1.輀3-\bDE9K0̧Ity`if0yB?C]ŃagʰAeyLg)ÃeXitayۑ,x؅KGyk3}V̳v2lz,'Q?Qdy28}Ɵ*㜏:u煅k[a:"?[=i/?L88ONqsK?s~+qyCkߺa^,J;x|;5z6Źҋ-6Ww6ax!dLE'-Ԕb6Ǔf|P9Y)G]6qri<ggXmm!0emS/1 (ŭ~k[Z\\OXa>>1NX_^̧σ8RV/xظ##Pi Fr z,̺cSalu1lQy08R[?;om9Cgx󁾭}tvM:Y2kl/Ϫ0{"7as%'4G791%WFi" "@0$틳:K#."PB>ȔogKYUJE%%y]9AƢg z:3;@{T1ZV@#0lذlq 𼙑(_4 1țsvdHVQS:4s֓#U}?8|aHr(E D{G7&|O<,Z2vY"ˤ]H;I\p hG2cWL\yPn$js*aHf6{B{HvzX'?,i1T?-%-L}IWed\Q|A]n$쌳z)U_%}'P WDOG631WۿFITU2$Ȫ_ F1A;ydv8aHv7~/(4n 㧹˱tD{hz V_̞-nUĐtY>^b?ȱ _>jE`˖mHY=FUǕgWkf5 iH( ?h?ߋ &L@dU]Gk6rOofe-"pRfuO*3<bzBL vߞļ`抭غ-q9pt̛9f%.&^̓Y8:?Տίk  )[ӑ$siȘ;g}ѮN4 O"X`W34`I8(b/"Ww&bۢXY0g@1fCҭN~/r8^\3Mtgm^眉F L2˗/o7o={ZT~ H{ՌKb"RdHj*@#uS[Zo"aHuqG۪)m-Pnפ IYX&I9̚G3v܁]pBXn\q{Š 1긺uu,\H91 |F2F]cȨpf|"|?e.y4&ڴոeLZk(̞>_߭yfW$#2F0 HCq_.k +uX̘o; sj@E#+<`.]_f⧅e1+οָֻHp m0u&>bT3w#)nsм΀+f g&bX h|36\k`+VQL24t3tXz#r膭ѱ"#sʻyؽ;F>}`ܸqDPϿfӀ4h}I$D@*3$"3$+NkJ āNŴsq\\6wcyD?/ٌz|7.u?N-6\(/1*ղv,v@z|^۽qrp(EI|Ϙ2fbNjUԸ ^ؔ1aRئ ꯟ-p/ջn?ږHWGգjhҮHJ D1:4֯1?z>G=%/pÜ8pxSR)S~uE5Wo "P ,D+NG:شxW1MbϏXv>&Ϩ65S1i9"N$Gѻ瘴h,8t8+|kh]||<2f215܆X2..2\ ><~ė.66qe?AHY1=؝؄ ٛ;sFkaԾ?_*r>?&b#3}k_B{a3st{"sޑtt(􎛧L@5Z{TK,A=H**|7WhfTl3gD֭ޗU|zµr;xΛz|d,lqK:ey 4 SAUP3D@D@D@D@D@J$C+CD@D@D@D@D@D V~h&}UNDښ}_nNqUilaH/966jT8~C_8NOOGjjj'm*\kՠ ?gʃt@"G[x7" " " " " "p L9# D@D@D@D@D@D :DL*." " " " " "`aHjG҆[:@؎Y)==gBap(ʹӑ< )!+'C䵥W֭r&HO{c'ѿ{wwzK|劀@@XX=VHDH;N:xg ]KF~dxȢޠw ϻP:>lwM1fB݆СC'wE :.;qphŧ`"yBԮ o32 +VLD@D@K ?VESAƈ qvNN!w0/j ҫqXs&ۢѡypDO*AӮ^u}k<6~1%eGpmW?rՉ@Ns,*D ;*4cՕN B 'cuQn]t&0hǵyA ryĵpZnʏx߇ǒXn2GNͧ"F,(UJy߀Gz|5;0ps_T9@RV6mܻ}o/5.b _mz #ǣCۑ/6[Wik̖b~_ķ#gD2j;k]vyvv) _s,@gpFb {ԑ<~~?p ]GE9!#gO>  b'OK7:m{88 xǥ\wy=%sP0j8<9Ə|Q> #Ge{X>{v uq` m+{;N{#gL8awǘyoFjNkߎȗ[;Cmͭ_^go"ѨCpOÅWD pnZ֩읗1z&|@!T'E B`V;!K|&rf'Q׿^{+^NJ,k?t4*3>xnTȳ'5p7o]z-ocM8_#6|Lb _[ {mt|+^#ٻn /N >ڄwD^'*g0+ЦIKvιFBJ4Ϧa6 c0$[FF-(@aï@4mcp;ce8% G,zu~R2k%죶ĄX;fW#1l|֩h4y>y%i D.G#{WLY ݄+SvDs5b 8%Y8`rnn¤غuwl޼7ULN^~Ѧ .<6vބ]?RmeNXaW<oC!oZl6JTO" " "PE"cn@"v'5+q˳'avqmwyy~ >~Ao m|qUTy=p;E62/W1(e-Wa{7$c~xzH/.w|v͖0oIxm늆Ǵ ׅ {g[_`җᕇƘšG[xQvŋ0#*6$vbC0Q|>^ŧ#ǒž}Sžzj`bwrt {KZqj+E)." " U@ IdUSKĨڡ,k4=L^ڇO:CNsB򿙷^wnzCݵh;ZЧ+3V??1a)L۫ޅ9/b?ZՓ, >7_}53GK@T~x\4suX! ~"B ocX1"ܣipW hyx+DwW㲫ãf\LkrESO1>txU݉0T #M R}"x'|˅>tkIys`炚Mȳ\v/cᢾLL/4%6 6ɴO<`'*'"p(S:g222Es·0AtDE!11=cyq:L(VmV g)'~7os[d"Kev8qq-bݕrґ+jnbd!=;vY &=$\7r%(x`5N`̙޻\'ގ?{TTQǯ-nV~Iq<`wI,}i@~7Qd%c;hT(7΀YXJ+(sSz>7zgTn L(,>M)6!*65yNt^;GrR^Z^YZuTF0$"'" @\1;6CzǠgczjJ =U* e#{R@9{UiG:(" " " " "p q(0$@ I}U]D@D@D@D@D@ʏ@ I#Y~FD@D@D@D@D@D $XWND@D@D@D@D@D|ԎdLi!w^@9!lpaHjE@D@D@D@D@D@ʏ@ #&M" " " " " "p0$srr>@GLD@D@D@D@D@D aH|}(W2$@'C277ꏤz(" " " " " G@ #SՈ@'Cr޽U$C8BaHꫭGh6@!aV'E@D@D@D@D@D+?b$" " " " " ' C2@%CR?qB" " " " " "P2@QQQ%P!R V-,u)" " " " " E  .#" " " " " @ Ɉ@9!w$iH80$#." " " " " G dddd&8@z5\(W0$˕@ Ȑ PE@D@D@D@D@D@ Ȑ}p|b ;h*"D@_9r!Cr޽KJD@tLxaݰ3Ѭs\ri_4:0W?<t{2Ykxzp@BvAˮ7ZqFJ|5gB&qejH -Ѣa@ mգ 0u8>^ Aʌax֫7T95U9ie!-6PZiݛf?Ç㗄:K_מ/w[`˦~{KƽOSS"c]++i=yx71eq'?ݏ\ydFCta!PwX*R@QQxP+[DOe]w=W#wX(ŏ?+ 5}!l[_cÿv-¢ջVXxB\ DaVW 55ZYJԔYGҖM9KS+qqԶu3՘)c٬ ڲmu Vo*v"QYu]/^-ŝV*D@DP!2S]iF<:uꄏ{\ny!`je#nCQu2AFǵnlџG?KxWgzyfT##d.n~X-guU\_W`Nc\E^~nw{]<{3'|I%%!{VLyvw ě&u6\6mξ3kX=F4s#e&KW&m\~相xg&ڟλ7i3~ u'8Ͻ?1w9>vŻ̨.ᬢ;"{œ=@.S-0oK2q)@cg N{5,n-R1y)w`c0SCLwz0C<5k~-nhU +T oS_DaZ_vx˜$ E_CiѺܐUf;@^x=Mk}Eho3o~-q>}qMG:WAn&w(7Ci+11ƸTu9Q99*tk8N ۉtwr" "#Ps'gflZ5oafΈX5M>aȟR8LBv~Nծ)7}6k!sGy>[: {}n\o_C zzڬ:[$=.j%xvZd,(WrmvqWB}vDj˻ WL֌ ؎_{~dӾ8A`tO)ߗܳg;v,cЭ=6 {z@IDATNG~ otwW⋯c'ev)[ێEC9cv3LvEw_~8"PsU&E" "PpQr2.AtqK_/`ǰMQ|饗:Q9C!s^vp7Xh:w^qBTl"b ~[016xJLwۑG9ر#QQqHL,xTpWw^_6m:,$$$ŲiWF}OF'_ӫ#}v; _ŏ=W'^3z[ ~΄޹ʞGYg^r\p=۔f*k^rb7f-LALkO4*$5B@"{n|gfΜ֭[u%񈎎Yt@Ps Fe?kX&otcY|g]Qߟ  ¢_E}mtLL/4%EGʙxرcܿBNDPÐ<BUl p[g:IuTh0lԵ8gJ#+yuYޢ;؏Jp7EKOZZbsjWT8|dH>,@ IeUWND@D h]d< ?WS%ˡGq2qy$:VjABE'%%E(0TCD@B dPSMwA 1u}pYE8P?D@*@|KND@D$-" " "PnaHr/R$" wD@D@D@M d}m1cދ!8ˬ_r_z5*A9!CRd @\&@ڑ, #M" " " " " "CR;" " " " " "P~aHc;7aID@D@D@D@D@]v" "phrr󐑽iY!? YCkZrbϏ(:PD@D@*;@}~5 Јܙ[s%-;3"'o-ժ_ID9F|5OBDl_@ I#35@DN$%){~G 7"r%Dn ё@ROND@D@D @ ɨ@t3P$YI#2%%9*Se79ˤeE"-׍Q'#TJD@D@DSiD F;|;ZUwn\]/ˉ&C2R$uD@D:NdB8:q*hܚX*$] U" " "paHꫭ>QAD@@LL ,Ze|dV>#" " "p<\WD@D 233b _;v(D͚5ѨQ#4k qqzTXaHVW٣F@e TY|rڵ ݺu꠱9o`vھܲ|6ƽ84{_KIc/՜+F0/MH)}2$㲶ۑ㑼*PVNf F;܅1] ܋?~G`eݛᣱ<}ڧD ?*ӔT[E@ Z>S{VB׺ )_7.S}>ʚ6ORvNI)FKwC;?M,'ۓ`ԷqRYC,W7/bYXfW8ާA&oD& @"Cޛ/lUND@D*!YZ Y&%@5ӣ7a ܌GYMAOE= ]l v?㎫AȔ9uW NwA5vk-V_Uh[Ϙ| 5= <>T7ڴov]935&U-(>FLۼ=waQw$>}S>DM33w37&"\,oϾFCkXejntN]ڧIhC>w|_>f |ͳƤ-ۧre-U.1z?o.Ԏ?%xW44bqU"uZLݘﰱ52wSSV 'Un;9 ;2@^J'."P1_˞ƽvcOp뽓=`.1#٘܇wrީ(.1?Peά* 0 Nm};wA.sg-(Y2~AI&ڜٯ]&-u㒃f7!D3'bkVm~ ަ/pw3&/NAzZb&Mj|ǘjҳܜEmQ<Ǭi)V-[e</FJLaKwb?^uTѼy/ pܻ?LC\Wn u1^wD\p7kW+08j9F9fe-ĆթشrWrը[# oqmVcgNuٺiVo:P?>z1kJ;PzL ڴtl0sԛn^M_P,LJJƍQ~ᒮ5W,(2Ź6\uPN*8g^2~տvǥ]lȽ[7`R@[^+wtQpGץ c Q|G2.&Ӌ-~IEY+R1%'ԏƉ bpQtW? j G}W֟oaݴiXꩧZ>~Mu9nǑXrc]Htrp#ƺq-q*8;v 3IBݚ~=T%T3gom)X||E.&ca_ґc[|4?(_9~(_ʫVE@@ *5 e+ 璺gȕ0Ľ8d_N1qeNlKKs F|ڨw-Z`ҥHNNFYNdÆ 2ĺ [%9%:5뺣:J+N^i" " A&P Q_D@D@@eߥKrxNYYF o߻|"]aHJe8]D@D%@㐏!AUE@D< D7Σo[8)<ۅӽt7/'" " "P@ IdAWLD@@|t5ԈĘȈO6`J_5]zn$D-_(L >Sx!IQh~=yeeyװNxhT37/'" " "P@ ɘ}?^b" " %\}~J Fjؙ9}\5=8+w"i ?@|=++I/5k %%鈈(w+HtXD //4'&&A8P^Cҥ" "PaHjGx "x*/*"e=^Q] EDWA.9ÄS\L9zfW=ϤGuOw?Gz3S ~Y(cJ(H_~~m,{lNwȻ^2k`YKʱ@]ّy뮳SO~l[)5@RVu=ZUn6@B۫:R캅߲seXC}vo:rg(&-ʮ>9==[я%9ѿix/N[N<lM'3li-vuǺOWOrݜ()QZ:LOYnoS:::LϽַe~ F$uCBH=퐝zdWq}|6-K6e|OѺf?"S_͆{GFV~[smҤI# ɷYvuF_]ι_uۯ?NK##^+=tXoll_ow<;mɽG?R=.Vs/a_7.=0KJnmCε#pzËkҿ-#>tv‚ٵ-wم~vd)[ nv{🮶?|ie뗸3_j{w~4m0]y{m g.^lF;d UVwO{s{/rwbkN=|Ǩ>+\d^W7{Q_yʇ TslKO]LOaJ*(Ԗ[k>z>om& .;v;e?{;ߴ~y-unm7\b_bQ/dK~|=~ڒ]\|{ㇾjhWcrNDu\vGeZ_~vlw\;W~y=6"@ jlGizDYKYHF~jH jMTHnB j[]ym6[lNٗnnN䑱vhG=fVs_cڪfsw}ym:[}ܵ7Z;a{t1`{W6-'G7v{ώq;kn>9;b\;zS.3=1gݲ)l+Wjܷ|sY;Վ#h=ƾmV_g)"?+>l{_U}`Qu&; od߻Q{;[Se_yEg->vͻsei7K E F3UЩުP6dh2f4\h,n >t7^Tܿ|Z[r֑0Bj lxEqHZkNCDtgq>] IOp@J)xl0eZ>ܯQӍ䮳S=`eno9{^{f4{ZgG~6e<}[7}޺Km6xIv*gWٔ_㚋s2ښޢڹۉvgd?lǯo/xmk 6٥Z-1b??هynw螉6Ho|ur5wṯ3/:m_ź׭=iĘs:#1խe{]?t"=ن5D%wl/.׮/6gt4t|\sэ|6]^,umTwm~qvY]k=T.彭.G4,k;)^Sܰm͙:7JC.s/;}^3׮_;v}ͷMc'V'fISvvA|ή ڇw:f)Yd6mڪgH3  In]]:"BQ{_EɎvs7=Ҡ9#vwsl~}[@r׾>W}`^WEgkeZtE=vOn8o}JBr4?88hʆ H:wGmܹ[ƺ}k]ӭ#?fKv]gueϐ?1nx.,lu_/E8%=.WRXcKWޮn$#=/lt:/'n:F:tctutʙ+9:I)8Ӣ;LjYi)e==SU3:Sז)Sך_\ zݶ.mvVv'N<_ }f[U贷G9餓e)y}g{p»ܨDY]v/05?K>?~}Msc޿߿S7+*GSSʜE2̑Ff59n@BFsl FǮq+@\_H建Ƃ̀ú+or{].[bMuVԁfi(Hmս}lcƮq~q:c-lV1ݰ@ratv[$@VJ=VS@* ̞=ۖ-[fx`4:MLVl :AF.]ݔ3#Z^ye;#b}>"m]I 0@$wm(L`v{,ʼ;̙@)r!@QV~^x3gN⧜vuM0nQ@MB$@.@`<HjDg9"|^m]zFdKKA SX58k挨k P@$H-ȏ @c (_R-I0Y lڞ:k!79?m\A$@N"Kn Կ?H2TX h|/Un3+*+tweﳶ6:uJ*M U @RL@@ D.K(K/}J@vf8cQnНYuzn3]c/|e ̂$9 qL*(gT,^Lfj(9)n9:S9mTkoo/|Er"@AQ T_@~诐?=rGy$LUUddRfUɰRo3fL:nW(v8V 4d[Z `rlE-&LsR)ȕΑqKXrq!Yfv'&B@r"& Ԍ@s䯱F!u d575Ϝw鰻IϐLsWB INmV@Wt\01Tt=& Re&=άY3gkdTlb&/&D Ɉdu[ڃ @|0Tf#~Ŋѣ8::::}wxx)r$wfMQ"dD2R@htxT[eդJn9zF+܍p:OitZlkkM: l p$EGB@JI,u=ԩ4Ih-9s'аNuMvMIgQ rϯ}G@@>sg^ TV/%&8Ww!'G0ZwTyӦMF6+_{I H2"Tw@HM p"_ׯk{=ܝYݝY]@QŢ[%w#3fLYK_ b"dD2M@KrdRu+UR]f=썞\ڙΪpVa=&V @Ll'c 4L]LN:U#: ]+6lf"IC$@.@(\5sT<_~ܕ_W\|:; "; X{{Muwf%!@} ?/o)-D@QO&|09/+,斖F8%D:!s7ՙZ ؝Rl$v8e PAH/:GT@j\ }87IR3";(d[[[tSv "ӧOs%J P{AN@@IiIWh]mժzHwX}u\9W̙3MZ!@ HW5  Pij6luѝYG1Q) R9:ҏ 4~K$R;@@`@<On:"qڞ7z8aZ#9DQf5;Y "|@F*wkyWT5n԰ŦMZk {[ggMU^YjZ "o  Pm }Xӣ[WV^m HD67vh R) "9@ mQʬH  D2$cO*TKi$RN>I4@  L~RsDɡQcBݣBj(RTxBK$+ĈdkkrRZ @ -f`Re|]~k;F*vٔ3F"\H]kIB0$yGV" PؠoL2^o.AI0Oe4@d.Z $)/ĬM̺d-Cz>wgNwMQ!SLnأy  lH@@n |J;yN}~>_>SYu' ܳ&XW&M&w!\7!  +D ?0@jR 3pl)L6U &D̙3Dfg)dh< ɲ8o"@>`̶Y,GmTJ]9:f3fɖ>uTpj"g~z^s^ @w$ D@\f9Z;5sqџUb=CSHzffFbS\u6]3dm|c"b>  DB6&P&1:Yn`6˝쮁,$S\j',A F(5O $5t 7N27)t]k'O6=ޣ3S\LLNs&5YL*61e"lu@@Jd "-**%RNa}.>m $'ef)Nqmnj Q09iMH0YPɄE HVK}@v@S\Ad& 2HrCvtWO=D*=s& &reejE @V 4@ 24)p*7m &-)j@R.|,t4?x]gI0_z"B=@@r$H/&ӟ*qF u={zS_|WZ`!b'D9ԡ@d_u_2 $(0^YcrIWeSZtdvL @2ɋ4@"+JklƛWκ㕝k?U7A dӦ q;GL jJg@OHZfT@蓯k_ϫtA{Nf2@A$lJ3@]3IK;|މst{d)W`r"̶hP l_T ?i $ PX91&м -":uZzl86@S@B($"!P5 ɪi!@ bHNin1=[߆nLb!" R< Ԡ@)A$ߑ]\OwdS\UQd [@ @$HG@ ,bHDVS\SWy^/yؤ5-!PAuh -PJ9XٕMS\ݍw E&[a+D ?& @} D2YlI=1"R*%D ɩ> @ DUoǜZ@5& @"  H˅  DrJ)f &9H W @6ne dPQN BVo?ŵS\U335kzfK&D nMB@J  "kזK.&Nh@ZZ[ \l P@H-ȏ @Z{]~ZɶhZTƿOQőF",эi / 񝪝cWLW[![ @/%   ݞwL ~k))q#:4@$H6bץM $'YVRNqT]()! Lڈ %pJk h); +D I  @6NiͦRFZS\k "Wt@ZVD­ȉ@%$+ H •K@IDAT PF߾rWwԸxJ+ϑlNKk@HJ@#!Jr>E).qZM[[kuttjAHr 2D@hZnL +tMdSk $'+Qd!w=!ĩa6@@@"p&!  $#D    H @@@7@`D @/_nE$@&$NM5*@k׮mѵ=]=};hyȐHmKZb9vYK+V3@߬Z ¹pH߃5*)Ag28<쌆"+@ZϾΠ Hk>Q_ 'm{w7o>ĶYbÂaԍ_8y}q{GWĞS;0$^.Vf4ײ_b JjL~%oT}ǖl2>2gFBjEz?YN`@|6@:ӌrⰳ}뿼rzv=:޸][8hm7G7F[mITUi^ylۻ/O_y}W۪_bSs4|wnN.O{`"jas]jؚ5chdvtݵ&K.WQ+[e^ۮ/|ӧ5;Fj1q.2Rǡa7HJ{1~۰4ڶ鸩/ߧRߨHr\lrD`]tioۣ3*GѠXu&RjAb2mԵeA\R t$orU@xe>׾c+;_kNWOɵ8t.˰SK;l+7F#]9.F2ZSy;0<t7󶉊~?jUJk^w DƬ9iN-{6~l1B[2i$kkk :(;O 3gbBU@z鎤={W[wmS5>s}FƭOvj7㔑K7]qc.]o{/ٟW(RNJۻzħ\ۧ>0vC-ö4^t92t?2[|r AtisAI|D*wϳG]nnkYv¾zb7B?>ڑ){)wbK\W-9Zh_HVIԄ@~]#!@} !Zʴ?} % JVvO=ShzNmnCٛ֯oN9ӾSos]Q))SԎS/P/H6w=fOvs ~N;첓p*SƲr߰q<.ffښ`®l#γS]as+W[W:n f{mgWۓϭюv{GgOy{v9wQ{̌N7v[wwM:)ERґ $e Hi 0:%?ͯ[U묯/י =v5ى|mf/k/m=Yjټ얬[׍&=}z ;n6\@2ZDEl*I|`)c~`{hgOhGmݛOs uAͻ~=_ڠeNMe֞[i;67;^EA ߦߺNnOgw}&{>`>|K]ӽKTrDĈdR qj#!@x[no^uh?oҖ/ݮ;7ͩ ֶh+2Kaz[vݷ|+Wۯd>_ Y[۱J'|}2wK['r6oх6+]&ݝd:ښ\_>';ʜuϹ!ۋ+x]R[E;97 \cg-]c=_wo!#= _5{μ}2_S@w͟}q->jIm-6ɺ\kH 9yٯY`{7Ϛsi a-m>WgO9[v}H?Z"]lMʟpld$+L:!ĩna 欟m.q>C8~Nzw]jw.čsϧ==S]I౅feg}HclmkKn1go5읶m yG$@ԏq򽎱K~9{n%Wݝٺmvܣ ³lwM.tmv#.FjiqQrppAXG{؏R=h62U?>h/8뤫\I?]e?h}}v3lF+#?mmE߷gco{˗sG65?~^M4| 2y2>޿կ;]V#kt]?a[n=6wrdkN=ԲSp^t#kum>#~=SʍTZkͿz]):-0u\97RziSܲNףKI't_J<@}%NV-"*'s7V qyy.:kv}YG BIM&"[cC[;Mݘ_pE_\ Kw?~}MsinVWSSʜE2SdHϾx؍d\ֹ.PtA㔍Z|Oj3f;+O)") x_Ѫ}荕w*􈤻yV H7ۉH]YJP 9L܇Io&^ @E$N7r(K4)%YɌ0r+6}Y][HFd5jX!1z8W^1@Z"f;ݨ ̞=ۖ-[fp@t*֚\\ ^?Jfd;&챽fVw;"iic@oQmЭtVwnk=DE؏;+@Z"V@0v{(;XSC QmZz /؜9sjuX+_a;w!nߖ:lmlkv'iT2:ӍL O#.F"Q/=УfSͤ  Ag4Ј~god1^GBt [om;#u" {Kt?٪zx )S`挩f8;Gd2#!"D (iН>v[ji](6|/+6br{WmS:~X);H @QԗQ}F-:{8@e(2@@@S @6fU   01A\w11"  @c H"u   @2AH&Y(@@@GGB@@HF @$Y(@@@$@@@ 9 ɶ( @@\ @2Ji>   @dSSSrb  .D >   @rR   A'i!   P% ɖ*q@@@$OB@@@JAܵJ%+ 4h =αRT@$fhsxYځ! ;<{=Dڌ J1<<\԰:Wkkvmmk֬uن l``U vZrkfO?wR){m]v)pKdCJ (`lkkI&YWWM6ͦOnm[d=(G@q%-A CSt`G$ 8zzzl\\]R Z:;;MmL? ~I\~H=33 @`@R? M<٦LbSNI?*jCa{{{!D @5>L0AF#u`@C#PJ: с>HNJdڏ:w?HMQx['o{ߎN{9ӏhN;479Nm+/F]ڮB? 4*r-]_y{'y-{ٳ+"rz Ge\' t=Sy~uRs@n I}A@ 9p(`ߖt0?+Kt`r?~I]#fͪoj?fΜ_g*m-f#~>[~lP@V[^ۭOwhc<}^݌3u^ߢ,1yT~ҙ AR?C7iL@ҟVKAH4@H ?`A ï;-'շ~Ёv|뽒?uu "5[o7߼"ۭEz;mr駟`Lhޓ[@:`:\}{IRc \:pVSur: ߣ3#f}ӨFSTŷ< "hKڳ>;ZQ鷡/KtP^^*5 b ͫo׿nR֨?ZhGOmҩ `gOIIyFΩptи׋#H)  2-ꩧL#Zzx[=VlI6to*cml:N]?N.?F#~8l^hbS5*: P՟Uy$A @4 Ԃ?z?U  (~k ?$kD &DD}DIO <-2 $i}GTT`LVpU2ni*K,EASF4OoO˖-ڧ'D(eTV0{6zL~|uRݴ\Vv5zoyߨ. v1E$_D;&TZ}O:`^_єz)с5Z~:R#X:H^{5 Qe)P߾ *i*WA+gm[F;齂#mOuUZ**8PEI C/=E HURy qVGuPGKS;t\Pi{~$QV|;NGmԩj־,%͗~PR{5_SmG#iř:3sjSf?^ӶTg $|01~ګNV}oijt]wwnWnz c=6HF3 D `j^5_Q*X sMUH|gWІT~Mmݢr)Px?R`%) ztPlɗcHxO/j4JW蕂0zBR`A%WvjNTYJZмSRpF#zz2wMTx৑;mSmF(O:^RxyQbQHA я t*ꡇo ̤^"{VvY. IJZG/HlWے *'W~eG^$GB@ (Xnp]5xRPOU-$eھF(@ϗm@EK:~]U(`T( -s!Dmy5MuP DxSF9WRSz))(T7yYevm*ӷOF~i13Բ֍Q}V;ۮꦶ*FwsOx@ HΡ ԓȕ4GT(`<~$?2G/KYE%}y~ZOV|KI(huTB ?ZD( J*CT)uz(3ԶUoEMmK/a-S{̧bڨgKjn=,QlhF#U^ꥩTme6+l__t>Pfϯ+GJ9#q+rF|Rg@= Hޣ L/_]g\tOytЯng >t:O:k^r5Ft }:)؉کH(RP2t zi[.OI#`P9 Xtf!y]^ p+)X<_oS^S7эOjy<_h_{tNVHj?@瑳Tz=fŷ`Qƾm~VQGuZWɟZv}(hHUy'|6"P; 5*k+ *pԨI):ȜFԴ(_7 RС5UG\kZOR3ZL/]AQʣ(5U~M(Q]UR5AUi]qvL1Lu5U&mO/[Զlkzi]LjӟGI_]+F}ҝWt" _tYӣL4Yv ! ]Qʏ@# lHih$@jF@C<]#W:L:=Qo(<} h2m%m?3\_# (0Q7(Q avW P|FʧX2V*ȗWmV^2z2T=Q7Q}!z,H%G fقbژ?tVmSNڦ6je]nWm>DyFd}K<쳣A}M?%}T_/vڏ߮>l$AN$LB@t|>:XL:V< xi@DAfU }G#Ouz@DUPz@Fچz+u|5EP0 RhڢTW%呑qmǯz*_:Z6SG &ezAOlWףBGT-?z:5ӾоT^MYNg*rʔRU=ԯTkKG}z($Š3> K3?yzu-4Nɜ<{W:wYI hE:ҏr:T/Ӂttwڱ[Q|?)(k"Hԏ+)`Sprսм 86.\j{h=Uw=ST#ߎb6ߺ$+8e˫yIlWگPa[ %#%fb߇m3_}XVNӚf{<5-{R~OݬM5O)seOHK +/Xv@zQ/ IU`4^pP#ҏ8:V|jK?)iAFϕM MIlWm֫TLʷ/n!ZШ]ç_4@^>GF4 X:wΜ9 @@`b mbVL@@FtmH=ZBNT%#XH @$u @h4BN;5Zhԁ@W:   @2AH&Y(@@@$#tv@@@ 9 In\$@@@ @I::   @KB@@HF @)-JA@@f;g@@@LRɉQ   @$i>  $*D ޞ(!  ! Hi;   @Ph  ,D 5!wqڎ  I H&Fy   @A<#M@@@ApH@@@ X`w= G@@J"uB@@ Hrly   @iA---   &A   % Hrd@@@M$[[[7i83@@@J".M@@@6"ܤ@@@(Y @r``d VD@@+D ɩcw:@@@r$;::1b]@@@@PɼE@@(G @S["  "lnc,@@@ a1"YC   @$#Am  "f;=  A Hi4   P@d<   )D 5   @A &    T*5|@@@(] @t!D@@#D ?s>   e H%   c$4    Hrd5@@@L F@@@t IQzaM@@@ S @S[3w;@@@$JbM@@@1Aܵu>   P@dss,#2   P@Hȇ  /D 94449@@@ ".L    Hr   @Az@@@` ɶqX   P@$Hȇ  /D 9>9@@@ "9v!   Hr;9@@@B$    8A0@@@P B1ȇ   0@$7#@@(T @P !  /D 94449@@@ "lnp2!   a+   @`Al'^Ms@@@A}}}Ep@@@ $ IF$CҴ@@*-D v*ݍ(@@B"iV@@@AmmmEp@@@ $ )mE@@**D YQA G@@"ljj l\@@@rAܵr@@@ < ɡ,-F@@*$D Y!;E@@"9Am  "lii"   Hr:6-F@@ HWN@@@$yd`"  @E$hp@@L @2J[i.   P9 Q2   @$wm cb@@@$HVQ2  'D ޞ   @$PX@@R @rhh(ȝK@@@JHrJtD@@P$Cݹ@@@d[[[%(@@R @2Jsi4   P ɦJQ&   @d{F#   ,"  *D 988بv!  U"lii:,D@@U @rhhQB@@.D ][ޯ   4d\  TB @rxxv  )@ n   @A<š   @@dkkkf   P@$#%VC@@H67,Y   @ADXwJD@@p$ô@@HX @k$5  A H2"t   @dKKKl  +D ɩvpZ   H&F   @{Z  $@ Y+!   H i9   @$HP  -D D34@@'DũPl @@_ @ȴ@@'D Ɉd:[B@@"l=I @@@* HT   /D ɈdwdZ  "dDz-!  @ Hrȴ@@'D Ɉd:[B@@"n=I @@@* H655U   /D "  "LReK   @ Hrjkb  U"loo**C@@Y @rpp!mC@@*D 944TUT6  4@$H6rm   Pm j=@@@a$yG_   D 9l@@hXɆݵ4 @@@$LT@@S @ٹi5  TF @2z  (D ~   @$Fb@@@ @ w-MF@@*#D 9<<\=JE@@" pd@@@bA`@@@ 4 INm [^@@@dGGG% )@@J @rhh(Jc@@@J Hrjk%e#  @hAA43K{@@@`="=$ϏHNPb  )0&BgYTj)fftL9H  TW)~귮J~143_i-B-_A`l &2!  w2c\ZJ7.@yuJzO Y+!  @md͋V+*Hx62^oJRz   @#&1[?3n)Bˎ5?$=Zfm_ߗN}vg3   ?أ/GſSl/1&H&]qh_iDV^w0*EY   b/| wWW<&)d>)v̲g+sRotq+}i<;=?xp 6@@(G@b ?we(/3^3m13>(Ú E<mz)P5mɘk_ʣ_ud_y/o^emwGj>yL@@@:ɿٴ>z Ɩ)^yjZ^gTF^}fNU^ʗ9Uxr?-]g&ID%ߘ|ϣiOr3׸W)ŗe{<(뺷E%OB@@g{:/$___槚 ]/;^_?xb׵r1A-60*>~*v|駾l   P:ɿOq@"4,{mCr-/dY<{RIUd*i0r|Ry}|>ߺʫH9="  @=ďTs " ]+6ut 7R1!_b<Ϛ*?ޏPfEyL@@@|if,?ǃ{ܩ/KϚmUV*T_=N|?OSy!*/{%-/)N}x{<   Pq|ϕ|F|+둞qϗ9/9}f3@R('8ʶ~yh^>~}D߆|~06}`Z/{_~{KB@@ O}|?>O͋oϫ~_7:e꽒jH}{KB@@бO}|cM1Be9^+|y*e~^EIjHfpmoXf^@_yJ~Y~y3}z(xI4O|=3= @IDAT@+~;gF+|#Jte{8CQ͎(="]}̓Ug--sc{qJ#w>k̅ M3G_ٜңcOU>']:/ H@$  | տ3/=ٗkЦ5G[_ϢEk͚A'͓ն}rl' ԣ>jW#xG5]$  H@k > ?Jo7}&>*nZh/$=<͋%53>b/0A.1 +Y=[Yb8>aH; Cz8BWy|lƳ~ sFzeOV<M]VJF$  H@^Ghzٿceg>qN=9>v~ O՞$9z@KVO0$ʏpy9;s$  H@^I BOjeNq۝> K-* T^fJ]S~Mm'Y aNJc{Qߚ$  H@$ИgFH?O;wGzOmUKʶvO^3ܡAr6%VSS;U-_^xޤ2H悏HN?$G8ǻN3N K$  H@$*Xy:f:vׇw6ᷝ~GVθ$zxZՓ/s'zh_Yç5;z$  H@$=dVZh[G=yg`] κZz rw.}o=R}'6>>Z H@$  H\hϜF ;SC][t4Xٷw$V+{mǕA22y.uӮrFd^@⟸'y: CQyz,O^+ H@$  ANk-vh~z&FkUM%κG5+fU ! mw'GgeS?{'zX΋hYm㳨'J@$  H@#'~bm;:q[|Ѱ1}Ǯ4nU??SyA2dxjwUjbO TYѨ#͢65YE~@Zcаh+~b$  H@$:}"F |Gæ~Ѧ]GltP{~h&=H\8U^K0:`98FKs?@>62I :FcћX+ H@$  @ֶ%=g 9cbg=Ӳgꉿl}f̅JN/.xg_q|bgᷝ*撀$  H@^C1~'FK9ܑM95A1qˊqՓSG{K}c' {~ѵ$  H@#< c63GVk4c>6moOzuuL:^\f%Ͼ6+p |rٗyMM[[$  H@$ I!_χ@|Wy>aW䲸C_hAtQpZ c[~dP &}$^YlkY"J@$  H@#0gʢe"=z;Y7}ѳZ[Gݞ3\}.~lV ?>vzɐ?1}b&k_2Y~S$  H@n@gUG-bW` nƫBX$n%Arw`.PEOmg4d ٫但\lV)OԐkM+ H@$  Y'Gm|m;S{/sc ?{ӵS[ŭwI@$  H@ߗ5*'o;ɣ%gߑelgֽo{$k2\am)MhYhmoOTs~vg~gE?ߍZjȷ%  H@$ 'bcSƭ:sO?>YEiYd.CӌW&6+Wqբkdq'j8AUK$SmVuL>kڛSU}t̅{::kyQk?=Sq=#5'~BR,[tѱ+k%  H@$ MO7N%7S9PjZ3cYŢ߳WeztN8]5޻ҺO,Xj:ך$  H@$g &4ln~K_<ԓOs]$  H@~ǟvUUԩIrh\l=n{ ңvimwtޏCv->g=u$  H@$|Gԙ5rO~ZntY=#?s܁}ƠqO<>6/}F< ;]$  H@9@ ԉN^XG%fuOvG7UiVG;nUu{y$  H@ vW6sG6X>+Omk:ߋuWvEb=u/M*\3|,}8/ZEV{٣$  H@or&5GRO݌gZ䏏|vVVqk+j1Zl9M}N^{%  H@$ y+j7Nܳӻ^Ϯzl۹No֧q Uhֺn]?sg{I@$  H@'|/ҧf8W/gvd B(\4>J#6~V׷>[oWӺ$  H@$ V5y:vk-~ ~|t} HՆlk3OZ:5 H@$  H ^}i4l;gkR5M=wN;~?szD$  H@&r3z״?yj߮hO\0ui޻J1k8zkg֜{;h9 H@$  H`vw/o׵[wm^ZG9j.ۯvr+H;M ]K+=Vj$  H@s \v;v}+ {vY&){e(z{g+v/zgƫ=+}^j$  H@xtfܷZogԯjs&ߵW ?9ʯr+-/zQڣ$  H@Ah(;vG5k+}(ާWDg:껺yW3zI@$  H@7||Ǭ1\ճogk!z|!nG}dO=.$  H@$ ?C̀jJcW{Կ>̹j>Q$  H@Ih0;5{uGܕ3)}^Xg>Z H@$  H!pvotv߽{y=[Gwl:@^gV$  H@:?[Wj }]_e^$  H@zʮRK}ס꽮O?K@$  H@.tW_rwW?{$  H@$ |hG=Nοmz}jK%  H@$ gr@/=@$  H@8EUݫ9W!_{+ߥ$  H@%+\M$  H@԰xί9YH$  H@ }q$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@W ?.ǡ*IENDB`davmail-6.3.0/src/site/resources/images/osx/osxMavericksMailImap5.png0100644 0000000 0000000 00000326310 12564151555 024410 0ustar000000000 0000000 PNG  IHDR@n< iCCPICC ProfileH Wy\S>,]oad **ԅ!wki."T j H]QV^E ZTZ\pC ^{w93s ;QPp=bJΝåPAM ,USRW#/ZhER!Db < vU L (@$.$űd3 @)( Xs˄H(KRqcl2V"#1F! OɗF!s+$Yc62i1eiQ_R! yRgRJL5hr%DмiNՑR B2CEmp5ob! *zR(@2 (U~U[R)XZD6\IA$Z ! łB FQ:oE=5ȏDR'ԌV,(Ql>ەmȦ-h##D+#1Bch:yyxyOx;T9hD(ʕG*17N.0 { )fBy;rPE&^qh]mhsezE w_0sŪ5X k¾a'X7 և `ϱw83qCw'8Ox> +Zߋ'sU@Ƅ ND2CJbQE D3Nt^ Bp(\;XJEHEY@YN4RZ(()}AG*jAuRSJj u' 4*FҲiʹ}n=N7уt]Eo_hhYkyjEkhɵhh:uIְvvH\{v }#(d,f2=:::::St:tju9ӧiteF01]_/X,#+RVX'YwXov[^Ȯg/j:ugVнDO[Q/BO@^u!}~~rg  DK 4!8v)g4ߐfdgXhXmyA##oL9FFGz cG8cJ׌ߙXM&LM.6gf*62gz,ʬlYms[O?g8.hp\ոnZs-[tY YZYX*,7Z|belfUhՀ5:Zj#ϕqk666jm6mml3lmǰ˷[ga7homd?~MmN׎NY;:>t2uspru|ŅR+*qwI6u/0;ӝ^ǽo K&Nx:~b;'~d[K<={z ==xzy=v{oIܧ烯ҷw/ouCg  T#=(hwINēvLl, *7&Tz7.L3߅_ W 1?x$Yy> *#.NmtA1c cY ǟJ`&%%MtMT&'IIkz&;LOnMɷSRf06%eJR;8i3vJO_~+9Cё9-)uVd֚ީΟz.<[ݖCٙ3I'?3rڵNL?;|lƑ33Rsrw$ Cyqy Ǣ0:р8XF ?8MÂPI4BZ'}V[uQrѮYl_Vqn!H~ĪdNIMQ8kAerg)V:Me6]jgg꾲73g?G>ܵ|Y芯R v̳x^|m y :-\Q̢ŌE^[fO>m_jt{|]y[|!2e}UTͫ~\/=rdE+}WnYE[%_umu5k*[ew]պg?[]uczCombmF6]߷bӲM76_yメ~uc[̶džeM;wVK1T_Sn+{{N{oښݛ3W-|w]۟tsk)oleu?~ ?:lsёGG9Vql'uur+::<]y-.] =K'.G^JܕsW'_qi{onyً]/_v yUju7ovz`x{.?&|)Q^@OpjF-),,|/O Ęhkrgd#}-U## ##Nqy@1_Z%Lm%iTXtXML:com.adobe.xmp 914 714 ?@IDATx WY떺R=!$L\ t+j{l^3b{YM ֙:-:jj&@R@R\*-5}y\*g^w9FOF<96[@@@@@@@@@+جԺWj'n*Ɯ$~UYY1ߘ=8|bgafoUUUUUUUUUU6h|n&}) ٌgiOƆh6clKNJVX̘mqcUUUUUUUUUUT`MTu\qclrmǰY?+gV)ߘ}m.HbSqS)JraUUUUUUUUUUV`V6'n*NdS҆fk~:lLYf4_@@@@@@@@@j7SuRN\c~lbSĊױg$f;S?e\̵{6UUUUUUUUUU]MrKQrK}8blL-;ppV1rlb4r˱טe11kVVVVVVVVVVnfmubRqLٌ[1?cl 0e1PSkS¤ɭO LmҞr()QrSf3vi *T1{m^˩tmr.&O[j9o9⚭UUUUUUUUUU+02R~pQ'qOl\mK`^kRz6UUUUUUUUUUFl)QQϲglʙR&)כ&3fmczjyJ^sTor1ɧ|Smr@@@@@@@@@ק^L듧#Oj=O1}6˞fgzOh,ZVOrbSOcXm <5+PoeRv'/O 6peS*53ň]6?Kү,pei(3Om'/i)]{O ,wUʎ][͕6d1?6H&Oٴ'GN.iaэQN 5UUUUUUUUUUɩʖk_:F;<;9pì-cc 2ϠT7:c-1Y#+zj}k /|qg㏗5kɓ'{8eM旓?e۫mk׮98TǤBXI\gmɉOΧOo;_^gb7\)sxryڳgϧwOwפݑ4d.Ybԗi1}ʆ}IZYX|R&8uZ]L'7u{my#Af1IZ;'Ncsi-ecCC.^\2&iK-֭[dsyxn={cܜySN\cQy=ߵnDm*\qlַB5k6Vca֗zN1SN|8ϙC\r#mprެJ:r|<lk76Ūj6k25+ɹج/Sd,0sutuծVia6[q!Bd l+sfusTڝ{>kk??? Ktm tR^AMB&c-Zu¦]yLח1Sgzrx\t,0O̍_ayj rזcbd[˳[ctq7em| OS^*3'\uPO_c>ab5'g]#tk?e+_p[#)Ws/ ٮ 5 ˗ Oڵ[?Xv*=y}庱^-v̓׫?%F$.m)4}K''޽{{Cg;x,],>81cΧ\b:cuM-:Plڕt}İwV| 9Ehs/i3V {S9̃-9r1?vrI6QvmX'Ug['.srƈOx3ɶj?16f~^knNs8tl}yĊIGXbSpSHR'9+:_}@`O9Gn[⟪8q]҆n.}|,6 .66A^f~!OO8d^e6'̽d\ڕgxk/ubՑA?XXd 0,n{Kݟyr嗗ҽ{`!E{Zn;ɲ{W][zK/zeqe,u.sX׷~,׉r57n:GNyƟqƫSSbKu?۶Agvmڮ/rcŢ[;d( ΂{ (gWr9mx#+M#)g]/u@<ՖEo?T6Ιf5Zk)so۶Ot?X:~^t8iЃrpc'0Åb𧮼T` }E| ++ 9 ϒɍEFa!mK$ox~" Ǐ}c;7zֳ_\>\>AW6]}ٻ~[.ZUn)Unğ[{Q9K^8Ϸ|[?}潥{\yeg|+O9oۅ//\ e> O^͸%};F|!i/^H cОr/ˉ%ر\?|/cD=P˃?埗w?zuy5:g͉{gxYIcش;wb}1vp)6:; !u>Yqb5[;m,uq`q u\w>ĥ]ܸCmˍgls袋}oLD~6ۘӷ-۩{{FMElލc4\)?%O$Og'ȕaKOR* yC|3eUzU֭[q}|-9眳h3I|N9vO増}9k+:Ěr5'˶ aɤDo/7?W~,}*}c}3q)z\pE.}9s1XIfh3L:xyeLbӖqi;^1Kgnm>A֎e>?FvLƋsá͘; ֱGQv&IY|a.Va=)=;˧/9:8_ eyy0Ϋs ʝ?~xv+Ǧ],}m0k*9 2g!6#wc~m˘ŧ-c.Vb<`%${ mY;5ב5$CmxY~O衇koƼCz`1'cWW^́F1\I}$dE̽@:Y=y-[Ĩ9$2m:M~{o$)$@r9rc B.:`9zˇyN9]<뾥;F0?}|<\w5w?cW?ǀ2?vn>(0~i s/iK\bK[?Gx8Ǔsm;iʉz?.,zH bjNWaem0ց|zQ綝-s$;zR/ᄎ}EuZn9%?eMʱc:Y{޵؃10!rd>YUNlh< Ӟ/IG.Wr<+?wo͝')9\^}aݺ~s639qϝnl'1Iy.\ym8q`xf{Kg{ծv/-`>C;|tҗ3 g\ޱ^=zrRve8\㖥'fu_gie&<= ta95gx/r,(0|56?oWeR֗e]G7-O}`67yiP)e;/(k|G.[{?u9Tn:Y.3}5Eǎ΁? ^[6xvCg>iӮ^iؽE{9q2gneο9M2O3e_Xƚjq͸^%mĜdgSZn}T~ͯ+>[~~}l6)s7\S}y|+\ћuw˯+7w/-?7C}{}?-xkŘYK_v(r_O[:[mr:1gzM7Pd,[l)]U֯_z##tv1ړ҆f>UD8xe2$Fs!s1vۗ%Ĉ#oMu\܋>&w><&OsͷtcjyL6Ib C{1Y=w=+ohL,BݱcG4__e#ɦ9㫮`= -|.|Vyesc[Xk?س-屲l!+}K$Kq`9-P.}͛]v[8U[=aõ,!D]7uYGb>92y 91ș8|u_GbanP Nft\s|gsv"?}s=_zW܋{u7𱃩Ю,ǞyM+MJFc6f7\2ܾղ &zwyb#bӦMJ"s+X}3_P9Zl躱e}Ykf;nC Xb%'5>{09Zzt͖}c['oY}zb}9Hy֥_$ َ5Mp5q9[ʙ7 ٣816\/.sa^/pѽF{#o)7ʿ{m֖=:w1i1/}rcڍ6 Ez $t1zsxI3f*m~\sV֙P u-[bW7~!{g<ֱedAΝ;{rWs==d:?}wÈny-@.n>tryETo('&_,￿HU᧔  ŚW&ϕ}g9;wxG Ss./@9kf͙<7 6\YyO}4=}e`~Q;ĀK.(ulK# pbOu^HL/ԈZZ+X-;I,mչKA8xf֚|Sfk֭/뻟8_߰pݴ(Z|{˵ۏg|<ܽ}_~_sm?򶷽lor:ڗ+26ο8m9v^_o1n_:Աp.YKk͚|Sϡo,v|7FĀK.(ulm\њi9sIꗃA&IʿYO"-db3g؛,pӹ .#{Mj^tc|3m+dN;9uBS_sp]Yl=1 XrX;r-//w^;{o}G[ʕ83T0|lYwQy~o9o.d瀴ʜ,O6 nmig1L>ȼW~Mw/)?/~l<_~~)}wXy?x~9v+_/WW=Y^˿Ʈ_eo~CւX+V||I^]WumeOؖ79w;ߜ{uV>hBv,cSjXK!_kv08oi?D;5wr'~LNullNJIڵ9]~b-nރ6_ru,zeND}G~ya9H}C{'rιW/\|Me4'?˻?W~K벝,츬\qsʳ|AxcH_uSWAZc#'%&i'd ޶{pd.cmg~c6X؆X+æ\1s? Jdz][|Ƨsm8m%›+^?X=p;9ݿI:qOGyrǹee϶9MƲI‰cˡks6cLJ v屃Gol)[6(wla͆reG#nEַmT֜8R>vEt䜣(kur ү:xWm9H?>ٶy8!v_xnIʹQ"Թ;j?m@m9aݔIԱ>X|uKoo?+bmfa|`/О9Ov:vkwpcLg#(wE96h69)yx]Xʜ1Yq!cl[4K,Sqw>ao)Ov{8;ܺlF|_s_ة<΁6=źRuFک$N=*Ra<ܼÓkxSֈZfO;Z6繖=OҊL,˞={zNG3̋ ߹sәr# cKrr䱃< $V9,$䫭yE| &qc69q&;lwX\\,yS2w`Qa 3QK7&>t1xt}c[?|̵!x|&ydANXbr6vsc8:F]n>Ǫ=sk;67.^Y.}&)Rk-1\}VMn,6Yf+짲Ͼ%Kuۦ26 5zums9r.s.RϾiknmbaۦ?5Bi"':lnC6ɑi Zy?8ȶmhu8m1`WcžiiMmG~GnMR ZcX㉵lCXtւku:=HV&&ֽ>cconm%|]y z(}vjs\=IcXMdᦄgq1|؈Ӈ 6_3qL@N9\:*'WDhCOY=q~12=F,}.ԋ_Rcl_,~Zm6Ovϵv{6C85Nv:2~X9fc[S>ᴍq'J_cME GN{^0̑xڹx@ 9쇺XОIc3xlWg~'v8SdxAǧ<8َm9M Huvb\5矺X۵MsiGW56sl>89l`XO_ te/mR_þٞ:>rdZZx5Vy7v1Λ3>6onpb!!Wbj،O\ڑ*濝y>z`SfG]Y^ xMR_zpt|c%7Vݼ̃w-.\#nX'o?5y0bX>Fgf,m1V;>ǜ7txx3'6`,m5gʮv/v/\ߨ%e׎>9k zL\ը֮Ƈ]up>8=?ʞwKMEGv\C=~)8`O 1X-+'rZF:ꍣ9ϏX&I C'{,HpЇy n[|h'p!F<ص%?}5>9v{p"XnqhlKMa3N?\ozsۆ6[aNfڬul?\?\]' F?\秼UO?psۆ6Ю vnr K]7PƠ{~ʱANkÜ۞6\p&Ϛ6 rw&"nB>utyrmJiűÎbͬ?1mkiGN@-6/A{# .<1ҏݓFAܩ1ͅL~/fۮc+.;dsW:$|͗c_p̛v󈁧"+7|wMMwcl\\et(t3풟6!v2\Ys>8sLN>|9fQ+Sz~c'y+.;d[į ޅW|>Y :~mjښZy5DNu;kuM qN쏸A?܌ݏ7o},)xvty91Ydu0^1\7o.]vY+ʅ^8F9`zϼR k̅|gK.\y/N|-d/8qRO2bI~dnr83{キ_S\k7v-e)'8lx.&̋rW.S}Y1r,v֭d^tEߏ@]8jcV}Kԕi^ ~Xږmg<2^Lmd-d888n?Ҧse>6M8dlb͏.^xd0Nƀ!;&d{J;cߵͶj|7n sNٱcG'eڡ N?翱= sc 'ݻt'E/mi듟ӹck16 [s2 r}/.zիʶmuۖXq;__=y*~3db3vrp@-^B 3gg9~ۛGԧ>UvWe{IG~ص![f;%k^~__xmK<o Vۜ5ꋸ)}*9lso_iMy5쇲Ιr0xPb z];˭1 ->QZ('?_3k׼gbET)}*&y׮]1sf=skuL_y8Go6ݻ*UW}L{ihX|ĵ.=P9s!Lh?7y×Gn+O\1SNܔ=1˒Oe#I'jJJd<ȟ2v7j7&?|c(*7> s/FcƤŏ|_(4կ_a9$Zp ٜf6&c%wqG mC^j3FNkCϾ#[? ۮX%xrm/M'^ȣ2].N .qb; x8TŘm ް{wH'm99I6y )L Zy,w#IvƸ15w 4 t8_|+^o.yg{pi#_֏|#8oBz&{3qu{7V:e;u{b2.Mo0y#+(06z#)s!sd#m!8 W }_}nŪW9}OMY>s&6e>椌U+7kO{3!O~j?שg_y?VylOv!ůbŨ|sxױ>MkZ/gnC_n3Gq>vcn^mcy'8!uDg̐aa>|7q'nЕ9kݽA ?]d3-g#IR+m=)5_zQfcÛ*y2/!oVg>Kklj^/Jcpio.ƓSENR]ӔL,_җ\S<6lJ׿[eщJ8cؕ1'M:t7~o!1|Ӕ?uj33;EOOg9)9梏_7?lX8V#mI[L#l;un_ɘ9fq|` bL1ێ ȃto(<rj7Hu_+]} g?[u_򗗍X6ڵ1?8غV5ڼē;Ǚ+~&MyW8hJ{ihXU8!y s Ϫ6m:6D5MY0C`jJlӗ/g#98m42{ጟŒNq?߮7&ɗ m2Tpsa×".覆6qMbG&fAiWsmoC] p!88n,UF 裏>X6olDR:A.yx;^|Ν60! 63z}θ@>vX^}ʜ)-et*y;q؞g,ʱܶ}2h,ؔ3?[1_M9r-:SD~ېUcwcRfvb}O yscNuv\!l~2xAN6c݋~P/7'|kɆuC@ ʎ6}#/?~yi۱k3n+OfQ<>lO"ow' k)wl** x9xy}Ϟ=Gv _r¾ªmxA7Åqc~7OFr*ZVA\s`YR.lAMF;1۷o_{<9;'^lwbNO;Hvt1??2Xkʾꫯ'c x>ͤM7qݶ!KE.Q99abkO/Ec99쫹/is]ߕ::f?/|_ykB~/ }cMęS80Y_s1{˫_}Wq6fkG[5e;/:ec<l( cdk~{&:=Ixh@i4 &r}EX3Y$־ԕ8yŻv.!7b-Rpw/xǐwY_} y2fʽsΏ 񤎍͍- ;$Yvł7D>g32F'rn;O/|p#k;e9Ҏ}zMmܶkӖHc쟱k;2?xWy0g]ojw𻮰'6Y;V𬗬xsk5G9y`I`jp !\sr`ljM2Ft6j/kNGe.6c9Ꮉ mXCY8r0̵ü7=|#n?·{xµzַ,[\\뭼aFr.6ع@"Ggz-1L>rH6s tm$i4f3eWᵬm D|`$ycB>/xMDo/;w|<&M6<CbBn/b8 \'^Љ 8۰/mXvs(ϸԎ nԂZ闟؎>jg;b  /[1Y' BW*~ <ro<\ҟ6}pxA&T9Бy7Cz+g̣XrqH:dn9x?׊88 F+CO=9>pHёO3å?sX/9$f.5w^2־d21|9ڎp7<<^wv[tG'}_d!'zuܵ]!p]dlၽ2GGX:b:.9klqЗw5*oem֬//=acK`OqؗR~1Y+eX9g,>N>q_pdmOFe.>p o5jhX}898yN`38uw-A|P6dH 7fgEtn$| zgL-o2^ fQpxFNbhf?C%8>fox}>܋1`M)N^ǂ< h,<qY\!0rk'|j!?x_t/0cfv>3d}5KX|g7 *Vx(ǍN.~O8y9=??)[}`Xggq aO<׉w HI}?x@m~C-8䍭W$?6lC̣L`|6c!mer HŃ+_#'`C Wb̥ n \'y}s`[)݌U }Blv\1 X91|'Imm<ۮ1RK2C'>b! > rBśwv/ٿ'><m269Xys e!#7t骫!?dIFe?vk(D "3ʱ.זݻw/}6I߹!x2&G|TreI}?|)ob_mpqRW^Soû..j'*kOtnrr߁rPs_Ϛr9.|a#%o!bC͟c՟\c!7++}n5** pWZ:: EO۬qSˎ_Fr>6~)v1Ӗ6qk0廯X9s>w < >cSl| o*yl\b?ݛ":qƘc@/~ŗFA[Evc&yx;w73$2dK? tI91L?O>piWƎC<*g96u>mS :>tv}@3>62>H a1?Xdlbe l^j,vP"/}>zσ756\x+u"N8g?1\+jN0>G+籛*#enmDf>̍:ȭ:$>㑧cH\|ǚ8A9Xmga3'298#7屲~]qⲲ/~l8֭y%eGb=i 2':ٶ{ }'2:&'y!qiW69 ?y̽0^/|T_cs5UU`܃{E_}w~oJ \2j}.6uVFrP*.M`G,zŝrd. Ǎ<_䟘K39+I| w!c>N7\e߼);&oh~u|4Np8

$ڴlŋ냟C{' 6C_6x=a yQ~I9ĀYؽC+wpr;Sg 6i8 mAY uqԇTUI~ˉxh'uq̑2>I\O'q;wO&V=6j'|:uگۥmhj柸̯ =a6Ǹ-]u<ɫ=S yoߵۮ_xS9rc{^~^7kocZ [[@WswLcP-ᐐK2}u ~`,omq 1V{cs~-/}K7i'>o x.zY$uбQm5n"6ħ1g\^F.ɧbS6SNn; 6F'^1 {CXDLp7|xUWqǍ #7ybƃ-L5Xx ~ٶI2<ۜ)omWnW~yHefOe.e\!sbI<}6ma>m lĩ;frBSj>~G ̏xdm62۶ 60^}Oi>nC>bm+u12'c"/c+|~|E 2>>eSØD0Λa`+to$tf6ƲWu96#&ұ8?c2XǢ=4?dP`o0oqIcuĩñi/xX\\SC]T?p9ԭM7lw]21]lȎ9c9x 9)''D\5'֓M"Oc;opFo5jhX}@<_puC5#.~ ]ԑ08un̿Θ|EIV"טMC>3NrYL>aXo(ډ'lq&ハ79bש)ڱ $~q֖Xo.^ˍ}q'`cmجqԅ E 9MDl8ts9~lSyuŒ!p_NdA^ ӱ!!..6Oڽn~8:8q!ElC610 ,~M 6"=fatz{ OʎUN>rCG 6HXdd1p97D`zhl¸Az-c'C۷hC'o$^:9_O[t2.p1f拍(c#m_teV;}2^?vb^%dNJ?3"8I[po<'rONNʡIq+{cOn{0k2>e%6XsЖ928ȼrq`Hrbg|}I OڼIM򗿼߈** Ҹ9y̹'|ᢠgY,_zSHփ_N7 S,'T̄;r;Xly36w ll,"d zW 1b] 6'\plO>98dc}P-vG_y0bØ'ԇ>qB"CG.d8D$|~>)7=s}ɟs#.=HĦ=6'  ~8kNooOIxA qؾm/6džl|bKy͡n;\ᒵL>o.C_½i;sZv$u}ݜ[S22]W˽fx>[vb8l6%1m,μa \syfKcSM"c5< yA:61'v9oL^i}݋m+17S5~`K;>b!%>dNte^>r}+W켢qpȼs)u!۲ԍs)SN<Ē_9C'I}odH?ql"CLiz*99Ƚ]+1ָY'ybз9Ս|UxV8$'Nx} 7eto DEAp2vޡ?b8 /kP!x1o `+-LJ ?74OF#@ 朓-eck$yƖ2qgwJlJ$$3H ȹшӞW E0_߷N|qP.q/XB#6vؘy^w'QxN>:| PO#RzKEҊ7~򩏶uy,WSB'C}KOljUyХ-x@NڲO^TNYԥN P׶8?J٠FZ%=쫷 8A]{#}(4:Jz@}YzSMQ7m2Vߺ<േ:ʧNT}ꔦ^48(8gC7ǡx\ ~c/^m[g ^I>e7Ս :SsE l5~A< Q=},etgMW濴EGK%}cܭ! 5И:< N}Kl~kݲSgitsN,K^ܡ!𣣔=\!䑶RPR(WuPPY'%=mh?yO85ณzy򖶁g?30zk P-&=tlXW~ %}jxJe٧iE_KBvJrdɒ%yެdouЈ@#.sU\~OM,ffihXOjT{u"SR]/O#..Д$+H NY(C#Է^gI;WEtڏ 187qSWPڥ QUb z*:%'^[}rP'=4-i$tm++Wŏ6@<~qrWBu6I.h 'Ȑ6pAT G'vs`m xk:Lp%C6zcET-m )иUFt-Wq ڨo'@u/md>pBNZTm6d/=>W3ɳ|г`,Jې]=h+k.x#MKi\i/:*г5~q}.zjگ1+n1˝j@UJ]r 귲,-%-m}ϸ₈ʹуgܰQ; g~ʾ:m6/<lfN&/cBjeӈ@#(AX |9X8ws~ZsD.p,N,NDryNpf>DכCۖ_ߒgpPwA$ف tW_bl/r1PJm%-uE|)>p7=;Ih1=POitȖRJ{;U\-mnԭ=RWv+% C[cbaÆXJg?md[byrm)~J}"8AN5k*ȇw #S7mGɣ\A=_O:|_.2q2qƸ+*v\/|,;(޼3l_zh569޴U~ԍrs-/8zOQꀦG[@}^ZuGmmOY©_}ږy>*^Zh_֞G^h8՘6PS}1fY[@Oz#i_|j 6 YP >}KZȁxh2n2)_?_ZJUneO헷8 u␡:9qU 0rrGG{iDӊs5Ňu(JsSQX;Sy ԩFnMB[Ւz}YۻMTmlg]wUSH\ ,.`<|['; hIH-OOZq>pYs"`lISڤ)PQc1ĂXHlhSK9#Y^uO[%xvaɒ%ՕX[=Q&%]܁NҮR&>G%@ˆL짤 HI:UxU6 S4Y/2_OOۯUʓ|i8ΆpllS/苲JzʒE%-DJ~QO9>آM`$x!6݃O~c/2I+ZJ@}Y*Ǟ.iח}/7mquO[P'KS?$рpTapЖf@_:_lcmeXB+6§O ఫi?8~ 汀* *>RW m:&#'/HHï~e!1oُ|@U#Kۺ/vFƜ6Q&8L8>~q',Eʰұb_<ڥL]ylYz^m<֥5_hc >I+[;[މ4>棾.>K{g R"委"J6ɯȠ ^^uIMCĂq" >)Wٴ\odj'%q\<87huy,C=ԑ mG z6 7GOٔ%>mGrot*Bü̿rۇ]r^mgʒ~_^Jy}Ҕ`@?CqEyG Oۍg=1M^p3M>@_ZpRڌ)KYRW&u+43Nہ z7P:*e?mW6ٮ?xpzGmSn* ñnDt8%zᗮ,yE>J:6)Q1T>ۏ,^zhJvүt.v t84Т[=nڋ1k>=ua'ڀr-|6*+J":lSjsE?QKY):h+Ӻ}%8}LgKt4D(-6KOh߯v\['XZ4~e QNKʂ_?wbkKG\艏ml;86xDuͣuw!lC'%z_`o'JmOcE SQ|٦$.o,(BL(а&B&2I =]TumTni<4D(-6K}'#lN8[忴ʗϺZH'zu6XB{D*[:۔SdIiYq;Qst"N\'o`~ 8 H:PNJhDlбQeJg[%z\dٶOuJipq-5h\'?xi<.pƀqq xtwVC'86iÃhT8mDF%gdVvyʴVKڦ ![T>`~ hs?zٌ- l|xx[}oU :q -ڡⱭm+h'm{l`>1im>kv鳾t`h@'څД8}w*1f(eZGm2+!ol#uJxJ^öN(e4Ȣ>)CJuA(zi2JcxCG)U/ %>o=J7Ƴmh[AZ}%^T&3cN8 `c|ip0OB&BdVsg \!`>/XUGq[뻏ģ]UcG /+m4G?tPgЁ4S8hxdZ,˼꿶P'Q膟Md_(A7)zCcxtg<ԑi?rcoNl:Mokd):nlB} @lqLΆ̒PBj P~yXW&_ukW3[ZۧcC¯*uÒ~y(m#߹Qkc;?vs|;^J9׿?a,v.vd>(=(\_G\Q8sNu?>?^Y+&2nʬr4̸(R_:e\c[/S9QG>- .\jm#YJSNZmcwR% 㭌6?v)v)`߱?14Rし _=]*Wi3mc^ ^" \#'矘9G!S~Gm`N2x2>=ؓ;SG%}f{b^>9QNdL;-47Ŀy+kOG6??Y5.jnYin514W&ЁcmtAtpWX9fq/3tP&6"_lc3v O;=D7cuL+]IW  ulPv6+veWAoz|x?e*WztP+c@rAѝ':g ?!܁;.||88s\gWt_kqִWO-jqah ꢟ:KsگmWmd㕑[!aj_q}WQ߱0톸`NcRp`s߉ᅰ2/Rܺ䩍x,}hX#F#?7FW,;7'X'aӴ4xA96W_g orheEKجb~wGu rWO%|󏍹V4RUw}tgcEd~a_1YZ}G\Y1Xh~_Wȉ7_e奄NJ_qvl^J#^O7o||8Px!:Vٸl^{'u<60 O]ЀS/Ě3[eďzXt=`1u\99ÇDD`@g9oyCѽ's~667 ^;Ԫ|N[vD% bj~ y8vn_LG&ڢ_x̫_hLࣤM2iZ?6}Oy`|f:䎋6lVh+:y RV] ^q%uRB-q?/ 'Eʃ?gY}s>SCxLw;k;7ڟEF'{9A}.N{!:x~@S 2+]mz;oyіfxKGyȶ6ԥ}O|MLٕ9|m|+ȶg{?o,9'V̪Pgk&U<էʢ,8#V)WKjݸ/F⹟/yX|ϊh 1ny+ksZD?j[ww=<9m r@IDATnꘜ!?Cܚ;*-'@7|5?OڧŔ|9،G^9'圸RXQ?_>doii:foh 5(qج}ੇc תaس7;RBy)_J1%Gp )٠?@?;VK.rƦm smJ:ʥV[*ʐG{#fp϶)5uiũ2`]!>Tm#M^',=ֻ+>7b8sXyJaY?)A]m6V+rCk|_Ĝ\3wu> 8t N`']{JW|F{ow835DGrA8km1r^v{v8#yjo~8~Ꜹӷ\<`ZPht6펝{⢅]1zdWlSY8kj?On⶛.iy@cp5qLȬkPSM:#>s 9e#=?R g{ު㎋=oT,};/?~mm/c[EZr-bӶq9y[6SX,kWWvW:-w_ }؎X؝#*>wϪ?5V?:v YM-0;)qwŋ&Woxc0Ϙ'3]+ۖGKw˿^ٝw%&xs', 9?ĕzR.ϱ/xiͧrUO1-g)qS_ߋ ΎѾ#y0UV_wŔ׿u{31gm7ƣbZo h\4)v[O[xMϞv|Q%>H?~ՃqH?q4-4o _l}\b^KO׳>~x{E2z(V?j̿xVKѓ2W^ܩ9Dn#?~8jJ/6!{XGZn@93ס¦x}`ۢcd^Nsۮ14zw/6V~8'X{+? 9!.sN&V>2wTmŋKr]p^:_;i;s+u慵x9ӯTKoV. jNx{ŵX{_~06_-}Xmb ]Ŕݔc)DOS,,`ѽko4rlg<t%7+9O޿&>>ZswVw۲h0-2ƃ[>z^C@1+oWeǓx9^83Oʏ|..y#ʞ\!'f;1'o\9J`[|*?wp7C*3GUlT/-UݯƃO0:A~ 3:~⡿,? 搶_tC/KqLa-1U8ij1N@2ʮϿ_W%zvlذ+Zr1r\ޛba^d?xypay6\1wC+bf m|6מ1$< #=֜҇őjMq?5oķ񥘼Xh8_yO\]>wkWY[f\ׯo 6Ɯ+n{񦘛~ߊocF~܉9My0B2lNN@b<ǯ=Ś1wQ9m};RL}7X~nGlّ;<ݷu{u`lgO=GZGTv< 'UcC}iX 1'Əӿx&qkX!5ϸ766۟y8̹˗omVMO]ڕŗ+qC^P|휸dXl~ۡydQ^tfblŲ|¥3V/۷q3ޒڍ*h&܍1;}#`c|{ƃ:󆗞W׿kncsKѱ?o溏6o=sgsu+q<ҞښAٴu2%_9J^c )M=zZhhj {U7m풞ҹIq JiN'`Wm T8vѦSV^ʒXgMm沸)vE6&K[^1\pa|k߈[gɋT*Zsmݶ6/b|+7GWWgba,6O_n~㲱]@Iy^ldk6.߫qtC EȅF|@{G.Fy9GE)l|H,\$b>x)OB$@t<KLJb1=wX=<+['"=Gby]iIGj`ӡ<~\;zcֹˣy]mVWb$+n:Ҟ)O|+1%̝>ǎ~xJкAO.TQ(G'\xhj#yŴyh>|0O_^9r9#-#3_sb//nOy`;r~tģ?^1њw8͹4!1?O9bڄ]t9=z5uG]ѕO?:=9s{k;*:Xپ6}썏 ԥWEK޾17n8vi,<}t;zwl#yw_썹ά׷fW(j9&ix#*(ϸf4/Bf%DGԮ|w):3&GsNM^8-l3Vu^׻Œh>)?=Z;3bE`=؞xI^Gc^4W}|f9ه#~v[G1>ۉQk|Ek^\89989.wisbY>6ڗPƶ'#[PɚS&Qܷ M^^vu=;ws/}WO(\mV_eĄۏl?#|to=81̿Zs@W|K/uWi2#1???x'œ?x_tG>^ϊJg>Ѽ޸IѝǍeʤeq8woΦwg݇bjgktL͉`,\ͭv#A3!x渒L/ü3UFP"Ckޒh~;/j!:l-+4+.ё DpCNsN 0|}}q~ t>6=4D(3vqӥscyR[Ri8T8j^_y f͖d}ݱO-?տYӻέNU_~]]y#|L|6%zh壵w_t Жض+ι8?c5iZ3%]<M 39ҌѱSX^2ۛA13;v,:`G<ⱟnd\|]sO*qbflY3mB笌+_wؗcj6G쉼$s.6ͣ#mn{(o:],{ v:Տ߈|'rfW΃ {7O$;4É1E>xD@Z3c/U*a;w2qᘜ2"pޝhI<=w>u3{8 7~8|G~ӹ4.4OqQyٙ|} Y<ͅ!X>0|8V9;َ!ƙy'Ohhhdc-1K|·eC b)wx"5 {u-:2.W:m^n3cWƛ~6u zԧ-FʓBҀg}ZY»ͿL|s.WqƵxcOlt,}ӟ;?qxn&pķɘ!AII4$3[f4^y?MyRGi"f,Zi>66S]ʖ&>"ѕU8]9w#y޵1+\878Tc1wlyt>y ? V3~|(_|:),v72#B}yŬewh<&Mʫ-qo0:ѵ];NJeS3/vʯœ3YЋQbYÃ1l{gtI-?%nE덑< ߻23qvޞϻXwŵwlwǴc~(p~GSyDxnӞؿ{SFh]c1'چ֫J mo oنFZrLVѓWq]'6ES~`9wXR/4-'⓱hq?9F>;P>׆&.~8~֘65x0/̌ühP;zwFt1bk[#ΙQ+;9/^bFl].̽*0f̟eͺ윈e5N3wd7bqcľXlIāMqx%s-ОnGm߽-Hܜo58w^"7mge s>$=vo O׾nW<Υ:|aK ?^3{ b8s 8k~:m~,LA%4C9g^k/Nϱ8q, o||0&-^GEO☒mf/{I3|"/M2._17\K0ƙhe{ǿ wmּ3u#\0bfm-wL1C?)icSͮ|'ԝwgSdyQaŜʧ)3yjJ1.~~{tek'eC~Dz>O:bࡄ~}dP1*G|V(])AO ڃ.m;څ-i ?Kp@ Mt-Ȫl?nPl߼+`^15:f/vʓ̮|B%{sʫyy`>z5ǷNzXZ#C\M]VTúZ,jF߫*Oct3Pܑ4yL<3}{/eYi>>qV~!ěŧnYIk/"WOvu3Ӭ bS>6;qJ̝G1z:Ϻ0.ڼ# j[+G@w@ՁV5n_|ac:teuzꇧi/t]w]±?Iɻ 7+fŴsύ}rxie[Uё;?j.U񅽾scYq'_u}RlΓ9}&x}Z0{o?/nx*y\25̈[.-1o~5[7)nlY|գO-Mg_̫;/}<~IPHcz[c&%cW8O/tQt<)h+C~btбA@T![Qb@ڗw /"HG\[>?XW{lwޜw2_q;;>6s>WߐBϾ;12ݹ"B־x?.pV{;楹/&-]m ._ygp(KcB Y3QwŌkr.{,rf-fU]S|>?{?'Ū;> |mS!y-Fg,6F#i׉S-Ѷس9A<25ܲ?JK.q˵ cnShub@<89n qՖm%m/ I g|誳c8q%y?/-l|z`+bƧj~0XOj]v9PĜ#>imV?Гct^3E6`wH_?3pb_J^;Ugŵ˷ů~5,](/ڭe5 GY.x˃n̊)AUjc6Oh5OƯwc1;' oiIcfSLo|C(.M})ͪ < ,/?P>/i bۻ;I6Eƌ|Gۦ̮z绚̅`zKݲ-zCs97VBSųqd5f̞Wnk1;oٱ7w-`+y@ߖ@3<ʛu;󝁳Cy\vA-3ϊ9]Zio;c4g:kA~-7y?oaEȃZeƸ?]k̨'lmy> =q;5p(ZuE}yxXxVL:;^ccqhG|sN,1&{cuJ,؟coRwޜ-gx }[3-JbCU_|Rcq~Hli|m8gTr dᇛ9IcyƤHN{4gY井y8z,m˼znSc{]% %$uhr^]rz0lgr{mr:'߫5qG3^bL gMmSy {Pr[>hcm?eD-='ת;Ӗ )c ?$jX{˗gYs#;ĿS| ȏcN8t~hSp-^lMi_Jϱ }^;'/|h2gS:'{򏜦I9og@^@ϋ۝hjFSci~^cŖA@u1w[y/7BN[v9cy@_Y_c\[{eyKή>P^@8V0Ɗ h7xȫwkU%wm7F8hۖV~7H}YLTEK /K\EPSۻcOn4Kh87ODHH1",>LJr9wX ]uvmF.o<p&9Q+'12zYaĕ&v@1B?Xp2*ur>>vtk2ytc3wr؇,.m>>BxT  {;۞WSٸ6g&^;q# =?l[H|m--:1񉜧)?}(/i2kX"O0l|ԑ W='F~@hо8Hѥ>N{eqʬ _K>Vv40KOĝRzm1IJNXޗ_/_DʬbqQ]%F.2*|a >1/c?9[emT<;raU8Wlyhqh?̧ 9pRXúЖQ!US:3+fơ<{/8V@?)eX;:]m~zq?rVs3OL3kqL<|q[''RK_.Kh#'xv^ #AW<8>s@YʇPrGMkɻyջ%`NntN꼠UȨ3<у*vDV܀_o:S4Jzu7^s}q"YMxGݔU~JÆLxiR=@.1+o٦^^}&hח)eSO[MYCuKcmW;U1/u}A^mP>DT%c!M<5ȗ>@/Dz+C8__/Ƽ ]s>*mj+{K]~`~SClVb>yG[J}r;R?ytCG[(nlNNw/c1to7@s \XBK?m6t ԑQrRVi;>AS}Ik8|%ۤx. vR]t-}l|DyGͅzڀBCG}U% =u,M?%%6Ե}.g_Y*~ʗ)U_yb3.B+qS:mբۿ*|S-e#ߘ\i 'Ŧĸi1'J{3kz|n'xN_@LJwN {`";Tc? ]N.x=,4FdQgrRZzJfS~m~xhi[QsNzdS ul0>ꄞ/c Z>~&]cC5hE?}o䟱4yHL^ocb>:q>c߀cί?ھCJG ,.2]ʧZ[zF0S{PmƕИXr\7uEY1kkģ Ǐ%U1 tl9<^=>^KߛWI8>H:8q`гտ'IEΙ ֙hЉ*$wppE?.I. ^Nfxx餕^(mȔ<'sچ,~6@yũ}ڄ<@)::oW 譯2D<oչӘ'm'kmQc~HX[J|c8cL0>j?I)5#KAc,:lN*>pGҝ86CwaV2g]~,~[Ҫu՗n৯J P?8uF>%8FOFԘ'x~~X/˲Xklcwߞ3?+Ic3O_mINXX]q Ty8L ::?/>cXpL&3F;OƱU =>',Nā'<(r28Żȃ<:З/8~xI[4h<6@"6dx-r(m.x׆S:ʝ0i;iiWvxy/e4?c8a1Fhg<(7((StEl)ϊ(~zr ''R 4$!@&@36yg;2;GASuǞ!ɺxpەKwyшNlHZҫy˓eetz$g=)<1n,oFgk׮9:)˲/uc0 =eg9Ḳ<60 W訇c5fmckmd>Q'eڛ)ke(oa|+kyLc:,}`{/ [RM7,i6a:W?2fppe:CkI!:su1Zy~k獗c2Y?FV(y`?4s:sS:1^v|2Rv.[vNg}7]QN 04]ǃm9hCccjI 5$[CkɃM^w̧9ܲkvQ3g1n-dL_]@IDATssؼ<ߋ?0$9t@@@Ǟ7?<ڶm=&OAVrTh!tڶ6tBdCwl@#\q58ڵ >gO]E?V\zzMD&Oλ^iP)ߏmp˅ Q6Eyb"i02LQzN&vYiz(OOyH9~ya7$tL^im(S;nkh2,϶[ȄeK0(g̬r gGǸ4yk'ay!nL76ЍKc|s|St\Cdbk9Ɛ k79!/ӌ3xƙ?%9o4B>K\,(ǽ-ذ "8ex؉¼SNX|9{1̟?+ÓȱE~S;321?SKrFdjrP:Y{ߑ./s|~.!<=~%^ V>MjEcɗ挨 I r׺nŜϖqQMn^/o<:.Ʋt4leǜ5yf1ll)o }A Af=p0;ѥww4tXDe{fFnm"l?Z )hfjȠZ6ٺG9F: lk(w^(|{ aqZ9l~.aHr 0p?öXpani͛qǂ9ӼuM9y}6:2=y#Į6kwUBJ+V\ܽGW1d##va͊5Xj5"*DHTpdOs]|S,yk/GOuTOq(ƾZ3Nc'0JǶqʙʒX0|k:,41/GQi68ni3lLr[˘ Ӭ}5} [=g\8dDdXi9BJ&X'C~LsC3,ia?'s-c9:2i3t:[ ,eu1Wk7˘i]xtKL3 _O!Gr&#?wu]7J)~ I[@q2#nv'!zWsŪUeo3Y,Orz3~KV ݻh:q\?ө_s|,˘>2;Q<젬m)Ol} :Y-N[oܱ :[Y PV,o}0}̣cd)8eu''?H88l./C68l.3o+OK&ce9(|\c8~-rZۜ_*.\$qXd */J<+oxqua͚5 ;o=~2ꪸ'|9y8=Uv坕 gKzXw?3{>7_fn*l\]p 0qyA=gW4Gƶ 4n8a>2 S&˲8lAgzvYu1w&4yɺg94:)1(z,feMNMaG}V?6:g:}:->2ye?aM/e1 i ml8bm^kꤣeMŸߙXFyu3O"gF_c8qʸ*Lf錳ӧ~ymg03>vn1nz-qoyvYtku+tk67YI}9mRG+"Z4ֹMۅ~#wן/c`W&,eov("#+޵k' FʺXv:{_-n-\Drt[,c'YL|f4g>H9sv/vzɗ>Va,0u3lav)gec:~MgywYry1_yl#}E9k_϶Z;Y77r>əoܨccﳍ&t)\9j #瞝6n#3n '6_?[yydh풓[9:]CAϓ/cYLL4daǰMɓ Ikr3'ۑݠ؉e:x!>s]LS7E8*ʽ#H/:,k7JE-vxc$ѷv򰅌~Qc|hӦθ`7leLtm:ǰ1bZ;m,V|Mzәfu]i̧nVzxIfLcF4s,g(O3LguSӬ^tYYP?a}Gk^<1yi6]: /vZO:g7:CsQZ_=]eu ';hd0-nV~ao,a;fa]'Kit}'O v$B`dsy0ǑGn3:煅|+2t=Yv-my#m'33tdV+0p#\xDtq[䩇œuO|vR812yбe>u1zYDŽeg:e,01N5gdS< ]a2 }+ð9/aeX3Lw?4OFh||8&Ȋ:xok:]sǺ9?k{yaHڍѱ&[z23(.Nh;턷|g]L3eg?ә.aN# >Rۻ9Lg>O^za9~:f<ʛQNA̳2 5Y[d[]L- 1}V7l۾A=6,ϸt< lk\_z_v?΃}Q)]7c/G9ꢌM'u>KY0:љ~knA2ƈ4w:k2r},u>y.Њcl]9\/@>sQM;ELnA\g $uq lAOOgGYƩme1Sb،a]]Kg7 RyVeLqaӭNtSzrtc>=ilV.:&<<69µ;2Α',qfe0Ӵk|\kl.1l<]sYs[_8Vx/s_ra;؃W_ꠟ?\Ps嗷I7x1.輀3-bDE9K0̧Ity`if0yBc{.SqteXƿ chT?(cu<[_yassqG:-q z0{(&osiZsuO.:S{)??9?xp8_57n6[?liE= c\aFë;0O2ϓjpi J]v3` >e✬.A94  ,6Yݶ~2ŶY]ygy~V--&&r'z,LY?0Lr [c{//<3Cg>6n>a4XIϱ1ɚ8ɟqccC0X14>a| C<8/:1?$KEϰ婋nk)vPN9gm5,4eg9dYe犕Y~ǎyVH[4~c_/ca00Lr [ga뇵̧σƑz7k9xyks>:W&bB7!<˻,j!YGMm.h8Hϵ[OWD!RNDx7ޘ=J3#xjHnTbf(~G|,?:_YO" O =?^ FL zL-܅s40yv$;y$ EF2̏nqY:LL dQof37.¤OgcKΈUD㳻ᜓk%;u5IA퓚~U%>8(#Opsr+nq9M/u}'#OWDMGmg c&o(dHבU2~c*v"Ȫ"PaHv;H4oQKd88~71$!>}4ͽ~c~3Fm7c٘Y:PW$Ԧ!Y2D`xs^$oNܷ6Ig2$oe<\}}34jn#Cnn5}~~Rj'ӓ) 6a[JX0k-S]1λlUy'|eġ)!V,jkGT3+'!Spyg`G瘞]y(!p/Q1m9ƾ96/^mΟfbߐj~4N;J~/rڸڻ*IX4gF:.hs1c.]n 4j{Ei(GZ͸$1 "u9L@>]GPLl߾ kGx;uI&\X0C>7EKCL"!"Pz!!5ܟ^zZV0$7Df fMODı-w`x1nRwn#4Т+ e5FVFkp;ݻL>/޸m{wvBl/1fb$NirqOWR8mJ,pmDS~XT96Dzwq\2Q#]*N{4l}$jF2:4֮S1?z>G=%8a ۉ  uxxSɽ"Rv57N (aHi*Ċ~H|&լuI뼢GkwUbwѴz -V  RAcQ{0$3W v&{u^ UCr3Pkqr:ˈTo::ڑ5#{]'SikTk oƆLXrP-W*5ŏ".Nl2^\Znv-{~Wo6,u\D@8[e@TE0!YG*>Ťg`X)4'᷅˫szwBulIU{uv=|ܡ ˭ajd=\б܅NĩUsiǷlHwE˯m1{+/…%!vXDLX7Y ƇdQ+13L[< L%1hyQ[֎h5>8:rs)o9{jt#5mk_(cì3=f澯dwzUܕLkDw: yc{^K%8$#T ^}`[W]v} ޘ3233ٰ;",˦n5iVhժ ~w.&;DC͚5cاekyHH8NWR 1$3Vؓeh$["֗%I&&WÐ1aѢ@p]]@i$*&";\t{-O%-kbFBoI?vEye C뿼#諚^q"bV䠥^MNMY+0I3'вQW6ME&?vBD0ڶ 3eBmo+8/k#Iƿ}vFFy߂-RE@D@D ?@H"P6ZU3;ڴik/ubhۧ:wMO fI}>uҗ9#nҨѽ]w|D"?|4WGk<ەy#峒uejyZށάۑoX=ښp[an;c+c𠁸o w'{ W>͕#?㟿\_|0m^^v_}=>Z5 OCVtCnOrK d=uL95F4:OD6qbVV %$`wB)flLHqHޞ#p'4m c˧p_ǔE!!˜s!m!nj-g w!a[K Ә^7cfJYpnڐ-]W1oj=2yzǔaOq1nk^Ϭv#t&/t0s*z'pƟ1a$|g#L7=n lfaŜW1nܫXGYMWGCz&[ |$'w6ƥwǸ>YSFw^L ͚ /u3H@=x/}qÓ"iU폵>}ONt1P1ڷ) е1,|)c0$#""k"P~ $E4>|T1 3vQt&EźWx*Np nR+_^ZG#kϓ^O6~.jH/g';йJ^9oWb;a+֧:;|8L/}; w:_|OGN,6\3'7_v.w;`fW=΍q:-Vp^G78G V$_ov,/ꃻ WBV߀a}B2f6'{xG6Q?2*{5gr;<2];7g/| ]kS0>,U۞/]|3'ޫwn[ V\YX^PPeJrF Zf7{R|]ߖIyM7% Bg7 #d+{6a ;{r^KUpOȑժkh#.9qm !4T<354@||<ڸ{er^|'=e(~n:r~A3= },tsE7 f[> -]/>l lb /qf33B̌Ҝ;4d`C^D@D@D!{ !РY]|ŒχЦaJ~&}RI*ۚ=GWl/=Ӽqx5[ȄBW#TuTO[w3B9 ɯRp& qfaΔ9ȪX_"gtE^sNq+>Rtf.KAʪtZ\#'_Ͻ×x~k~1m)afjɿ|Z]CVv+ѳm/ƧÐ>n85,y2ߞ972F d5WD=#yָk$[ #5ԃnqnvv' C[].9}Sx}eh~opIJlj@^,y~,uB꟯(T~S7mu^/ji~ξ8QG̬+3L/<UK'.kwqpᑳs=ǡ˭sqaA0C?Ч{prk6Ǒ-`XTu '*.7@" " "P.뗱p~ R[664ٳ8)]v9ca8Fmf y$tIy9~i[ +2Y > ,W::.0w=v2j]e_Ds}wBC\qq8rZn4,|N=HDfIOǠUڥ*bӝ,lْ~(lQ_ `Yo۶t_#j!ӹ -\cU<. iYv/ZB|( %!'0w\=jooWXw&(5 1pKt|ώ~AomL7y+OXv0$O>4O Rp)ߤc;TE DVݺ6}h!v(q+w1")/GLX;Qtz/3h<>ؽ،HH'wuȟ'8w?E(c[|[S^'0$"'" is: c͖lT;uZ5< bKk~;rʏHZ/v: ZlK$@e$-(ѸU;(EV6ydKD@D@D@#,N;~A$C2+b$" " " " " 'C2+++ì@!Q|ĤID@D@D@D@D@N dXb% CXqJ0$wUGR="CbŊ%SՈ@'Cr$C(!0$MFD@D@D@D@D dHbI(>0$4@ Ȑ PE@D@D@D@D@D` ﴐN dddd#" " " " " "_aHjGr愄E@D@D@D@D@D`aHVnu)" " " " " E  .#" " " " " @ Ɉ@1!w$iH80$#." " " " " G dŊ4@ ԣ@!YĤLD@D@D@D@D@N@d'/" " " " " K@@ ݻw|}(>0$7aID@D@D@D@D@aHVnj6@G[Kd.!ɀfuSD@D@D@D@DDԎd%U"" " " " "0$wT7E@D@D@D@D@D!YbCOR5@@Ԏd@f)" " " " "P"aHjGD*@N@f)" " " " "P"aHjGD*@NuSD@D@D@D@D@=C_!""7B-RD`XDM"۷CO ǨD@DlAGָ%/Ϝ93sRG dVVV$PBTV ч[D222VND@J @z|L7CD4Yr$ED@D@DmUT )" %C@V2U'ISD@@ IW '" "K@PH eeN@<ں{`z)@fz={%ܫx<;㑕<OykkÏ_~3!qO3C:qN"=۷{iip[#.u5Ѯsotm=nއm7aʢ u.Fե@Y_@0 K[Vjn^: TYCV+@HQb3R&%BO)S}~W?oN_ბbFҶ<73s b*A8裑:9r$n&'DHכ>-jq]vxedhzmzlr!Y\wz/>[O@jCZ@'y[;拀iؑ D7DTE / $N㒆[{ i/0W#qiz|:PPx/XLhu# ĄmI}?}ӕ|7)횙`<&= m٨VmUt?*Тzt͜J|O_..#@Aan0@H?<2J Glھ%jB;~5mONŠH3{_WmP:]хI됑WE8̗cmrI[#QfMww ˥a^^ȁz #Q#X 0.f:ܫsn鷸]- hOc ׯ5%uJ]u%'37+pKڧ3F#i\o%ɈK|Ұu7x27%ּ1vO~_&ڣ\w]ے1=xcҦر~);#zL egce8!c/u͏r9cW&as-qnr+y͘!9mmѶqX m IciNfZFcr)AE9o`d2J@d85[;#[ ybP x▋q|ϯfti8Ea7.<9h0/lۜ1wţ 1jeΐ+SmI!KZ#nG6=Wܝn4Wlck{JӺV_.^&>m/Y(܏٘د`[ީՕ9PLYZ`}g݈gbehSxtXz1޽?Z$eR m}&.opm9gE{PĨO-ɉ'@2%%GJóԤM7%4gg#9#L6_vF6G!s[Z3&y`k7<#]#vT>ѴES4o;ЙU9WQSv9kǽ׹Iߊ  s,\W=MNށ}}cї;7O@Vg:b6^(#fNx7Bmн{:߆{tBUq9¥mڲqtߔsp[s.L'ţ3`V#IM0ɿyyKe:!VnBs:I ;.j˨mAb)*'e۲7]D!MLX_~VӤY'b*6CN @ .AvФy3 E= ޞLE q`gaM_ rw0%eP y[vB˝< #_ ]t Eѵ4"#r{4Y+X=toun LݣIViljpH)(\}')BwY=&׉q0$qzL{ ONff TEC)+e2-5\D!Yb2:{8?v'#cw1ԳNќ{g2c;9 ,6^h6V'oq_McNOGJθͅ'GZ,OI>7q-O:s\~f=O@tc;׻Gsz@*N'Gtfj~@IDATQ.' gc]yk왩?ݙ?=R#|1kxv$;'G(w^eC \ً&;ܖc냏=Fn )i[apk,\!'hZUѰj%Y{sѕ\{n }sz{˾E-л9/}MjE"q7b+W8kBtE#2꨼j\ۙ9!OIw7bĘTl_)R? 7?  FZ؆ WO}h&YXf_^3mk1$nZs܋}M˜7AÆ'XQy1ZkjUT"Pz --WD@#n}X8o;LL4BdajY&7f&LxwNTND`d&s;v]4,^nh߳lۖN(k%-U qfḰq|\q7$!!w*WNNkპ?ZyiIE|{su]|i7{s]1[? sW/7;xtO /<2i̕yp;=c[KV jNs#+WXCqO&;b[su$7r圑9Mɥׂt;pcB_aoL7Y+O^Yv0$O>4O 3~ i10=v7)g"oa,ΰMĉ޽8%mHL[Uv4$ J v_c]~Ln~zfpb q2Nbݮ`_ɾ驩Q_5^Aˋuɫ? ݻڶ$! 7&j@ ɼܽ(y%PG"cP^ -$?j ^NxbZQx^$>AWREmj#"P^ pNND@D `Z\-tޖaT'D!D@D@D@D@D@D@m-"" eY\`A dtJxBD@':H޽/FgkJ 4@<!9!CR_m-"-" " " " " "@0$lMv(>0$#Y|FD@D@D@D@D@D v$5E@D@D@D@D@DvoHȐ/0$E@D@D@D@D@D@J ޑP.‘f5[Dp?~<"""GժSD +}=*&" K VVVVR6(bbbо}{TXD`صkfΜΪ" e@ I(F >_Z5DGG`JD@ ddd@(=8aH?ԑNNFdʕz7~@ 9 \Ujz?T'y[ %&0$^@.="B!(+tޖR;E aH`Lf2`V/x0hȓ\쑬乸@1mU^KGt[b" " " "PaH,R&"P"26q<-OuY1nT5Nk'>7cvq_`!_い܁PS8t^]D /@ ~*׽CJYO߀P{22Zr#r0D*"<^D @z5Ϙ+""o=5i>r% <2~6ޙ.% o}wvpgǼ{gLXG:橿HX#Gk8$&ꩃzߧcko:up:ǾtuW5q_k]- svWb" " "pԣ hHrY˧ǃ`⹘4ajWdWg1wb|2-n&:u7x27%k{~):Ǻ?ke-Wsk#\ 2%cACc0_P,WLZnA~;.@2REvqq^5/N >gvúIxIد?ՈDdcI鞖*-DJJ F_q Lכݞ<7y_G)abL2Gy]]!5[ࡪb՘ꙸ}|1f۲iuc\:L2 '0mh\7e&&8ꁉIatVt~u90=&>'ەMp{H?oGjn1s{o_XH~gѲ#+;cC,e }{W[} qarƣV%rrD p5p0^f8n trh3ޮ(ڴihW-TTh'UHqGvewsb׸pڸ)qyPaOjڣXh;6+sK/ަ+:unS|\Ac^یN#r.6U:W1edt>.w8 <=m pYzkcx{#'SÓrg0>{Ƚ%D(-3PCE@@Hr5gnsU_6! .G{b4tHٰ ޼3oܻac+]<䥤¥MN/#!0>{xS>L&gD2O[\) Ly'2_#_S0E2xk*U)2}޹֌B!caOR~Qa}4lδ3;jcD:ctv5(W1XTkH>m㏯*w3"CN9q>ˉ@Y P,Dm(aH޽< "@u4m#c%pYcwרIZiHΈ1Ï|: JθLOZ-X#^Sپ#q)O۱u߹eֹeb]yn[1ؒM9sxv'?s@CT$u ELcZWLAk^@vV0~L{ +.dfً?lEvvvk+QQ^8 t}ǎǻ9 e浶6tEiU-_D@D@DaHFND8wlch6pzBx=9nTr\ק7m5/3 eޮwx4hpW2{*)}')XSE`/3p뱍VCd p1'^viZD"..z w=s&mu`4t̗reɍ0l:t\ WQHd&D\7< W?GTt7ΕU \أ#67"Wx3(p3ZҤ"P yޖu" @Qp~v6??ni ;~杆1l2}i6nܸDD@wLرhig-O?*{$$$CʕԞT1[b{:T~'i{a驩㪱Us=u1Ўx ͛]b9@W;6(۷cԩh׮݁(ܹs-tO2Z ĥD(2w}oYX&ovLcY|g]~ߟ sJo@.žԈ{ڈ႑΀, eǸBV]]WUaXW^HJ@amV"e" "PDܵ+NH!VE@vEy[ AM!C2 4@<ڪߑ e%CR;芉ፄe9P6%~9y5a6/_>˹i8] '}^7Gk軘pOsu>D7מgL(^&@H j!O (PQ(<@Q CHT@@9ܐkl=[lԧ}S߮-~wo_c;v @( d. P<j7'Vh7{M=Զm#톇E]xԝBf%ٷfju"{{ljVWۂ(r=l=h<kNi\{q՛&;iNvגPmY9vɋ엷?`Wl5.Ϧ~ suܢF7 l-lyLGld7~~(B#;5k@WUnsO̶ ~Y疨}ۨQٸae.ߚZQaCݮuB{cm6έO֍{δ|n5*Mw<=xU)lc_{;o47n?[v s#K8f*a׎=d_<^~6w} Gv㶳~Rpw _2|IrJwǮecLa~U m߲][=#71ږu F(]_6 G !9dȐ ( NlUr[Gpg[=Mm¶pG-9v]m+;ڼhj7SD'~'XЏݻw^~lg2)l]!v[>6u`^+?|o{ujYdZ/3;Jc'`^Jtqm_ɘLi̾l6yS_,@ۙ9(2~EfŅJ@B %b1y8hؾӶڎsOyՍͳߜ.|n延/g7vEFB/ۗ>7,2mo7x]|I6k(~Eƌ-tr[wmɝh_ZnNnɯxLŖ/w:F{~ӂ,}[:ؐ*])n?ԦwOӌ1nعuSYOIՓw?_t9ukjZM5;n݅z٭?3֙_ͮi:sߥ7?iNORVTnu]w+s_:ig}NoG-s;>O)133ll~m咃'_mցitjv,Oi[Y59PۮCjm^x&AwRtIH AO vB%K@+KRٔ&s}w^j5ӏկtä}]뮯}.( ڰa544UG>ݿbu gGUTZ$MMnAȠ&w.iV][)t;(R|>l55[cj ms?A6lXa ׯ~f~i2eպ{СCҴLZ!po;5MMs2}PL>?>}w`k:;(KߧE%uH~l@ .N4&]iQ2))םP=Fum]W!@@"#5@O)r_Xn4[jr73c?"m:>&T- 0m-/lD6nm01bS[;jVdG@c֒b  @@#zi@] ̛7g@@Q`6 5 $#YBoTc;N+VpqA4 G q~R @ P|,S| C @@Brd @@BjC 3-8!eq @  d+ƃT @  diU@ @X|k`; @0aC^l֕2dHߏ-!ZHR1(WHI@BRA *ȑ#mQV[[kCBRu`ɞ2 Oڪ'k8@  mG@bJknnADDbD-l@r!dpϰYr**d'/@ !?=.A I@}d'?'VXXE{7J@ !D6,Zd98R@BH'h @'ɞV_-ZMȇB2jā @_ h Ԉ*lnzF"'?ӱR&b'L)? @``$ŤQk֬u+6G"} ^AB+*˃Q2Kg֚D2{Em|Җ'ő%O7dw226߉^u̸]juNd_Ed[{i A{ PAIF$ xH@`;O;w/v6!V(6.f>ա$_K65lsy߿d]Q6bg̞myޚsRZ7g?8?eWv9OKϴ{GLWE>%}mъCkj=tEL۔^F+wb-zxK:dC ! ?=nV;Mt1ѭ8_lYZr 0aS_%溼W aEmr* o?{]zݶb#M&7X99{nyNIdgvwo?.qp־v#]ŎkA휙.U'wt+ȩz?;襌=Q.$lq?䪧;˩߄o{/s'uSzcDN^ h?f|Ozo.g؍OR{誳lq6ε/|:{j$&c &Sq}#ֽ,UX(mvۘѣҍn BHd9@a78PqO~d;so7: i\zM6E%t3սc sۓoWe{vo'igeW=}@M4M؂ mmsR6.vywEћ/>>q\V,k~ܾ͚{]zMk- سm7جݵ_H^oqUh=g=d$7FkkO#leO>=zݶ]~v񯷳{>cotKwlêٲn=3'g_iw?n?,iڷg蟰{+>2M:Nݹ~=iuM[1}/ormmSfg矗vogWz/cOv;#7qI'/_:WlwE_Bft}$O6) ?-շ}ysGYm9w,qu`~ߞBGOKLvϾ3^{]x8 65߈싈ls"%y䛓YW!gABg$ (>h׺ا\`Ǣ;/?~;?ɾmq?y]yeq5.~.s{ڎkˏOn{;3v6}t'?r]1xFU:狮;Nv9G}.U/r/|vvs=igjC0=M{Km=m֬ڍZ+G<;l <-sGlc0Ӿ+]1/(#:X`wN=d_}^hVrg#l}>`ӧm [J4%S̽y2}>BitYՎl촽ںhQYD)?Wx!{Xk>oN?N:(i[kk?m!?T;mm~GwuŚLڕ vYepbcj-sg6rͽ+Z\*2ql9?J^܄Աk{P >w3vs wkS^V&i=̵vy_еvOKq'Ĥ˄)?^nFd 铈lk7lJ<U{voW H,Nlb$d(U_EŷNv={m֙CGrm ]o_r#-?ўI{fmn^L2uk"{eUKWc:G7 Pk>|sms;r!kmhc]hqQb\ڍVRkg=u:`{cT3{Iŗ^g|ˍuD;s_YݪK Ҿ@OM e37Y1#S~%kz1o}N{-=vcrJ>1cy:<Φ{r=ʸ2kmm9y״K–/;<]zdebŊm}LU9Hz0cBri(DKcT}2SMLzA]%VXinqhN/mĈὊ|  ; dD`$av|#vqّ=Ax7*ia[vܶvo7-6wޏg.%i7]GYݶxE5%A;|;֮q p qyEMbĭA _ڙcAr.9mzS)y6+חܹ/Yz};δ9yީ_aΟk|uL'9νކ_?d3w kryOڒחݗo' Ō\wv/m *^NZnǦi\g @5+z/eL66 v2׆߱|V$*lt{yܖ.]~/;ٷ܈{}N9>r!s:s}v2{_;}ɵ?>ZۺsZ爕ҔDL&Gp"M?M~ޣâ&{fBh$RSYzݎr\g.(B2jH@`#wܷ#o/>L8|ڑE^x:Ϯ;HlkG.)c?2k+!>'/_\?gc6r˔Z;?sMwoxS㎣dOv~qx6TklE3;I T۬&`M>pK݋>Î(D>q?lnឝo}gyvBsڕvO_wM}N!G=;&ٷtNdo-;{6)u6ks/>L3;AULd]}:s9Sɔ+*jm"#:;7HMtjwӿ_6'ڔwwվjN2Ů<ʸ]%K5;|>sKӵOg_mou^qo׮}KwdZ]<L g{!{õvҕNg\;OF{4 'dOarL{W>DJkQ1^sCPjTϽmC:i~>'0{f+G} B@鲖Yת{ nl[er}K:nht#.uuiӗVS[g)OM&kpÑnn0 TV56&IGQNǹ醊Y__cٺƭ:j*;n\5\i&'ڊ9Zfkp#ruG~νF򜑛)dGwrښDuznvI{]5qPy҆g6eʔhUkXYY-^r557۪UmKB]Khq#Cʶ}Rdf֯_omrpMvmmMi:Nt;a?a}|4-_ӱyEa\>/ 7bkn>@>%{:u=H\Qmnѹu9%Z󺺔w6zg>rUC1UebX55K?31Ϟ&tikiu禽Y2&mЃj vƭ+LIb>hcrIRi|E)b>\_p*e#+OAr]$ @ȉ@lmyGm٧'#а>,/]k[{}*d[KnbBX!$z#+ʤ A&;&\H!Mj0|,IB6)Ü+/니kmneV-32n-\.@F !ejր&c@@R'&ݥ(&eއ^u,냈TZG3ScK_o\!PHr6@@ax1gJĤnգ~ޣ Ȅ91YH BH2"!E@@R_\qܿD߈tJ@j׾آJ֍ާA \AIp @ ^ |HSbRSO5OHyFvv}ݧ]fL-mC%ӅR @xf^:RB=-zu}}F-F"ȑãKC @`!$E "MZ=oJmuneV} j*\1F"G+ʬy/g!$ ac1 @P\#*:/TMw͚n1FdYyC3ΪEu[#ăBH62r ?2]QLLʪa>H>ޯ;vt,qABH+@(@'G>f!Oϧ}_+WEohMMDd2kSUUU2+(nnr{;C.}K Pr}/sOS]p^LtEkLr+w D߈w:fMnQne~VJpҀ@bD(6 @@Q:$ [YF!H-s"RTF#JH#|) @F?H?JÏJƑ^eijnUV!7"bDd-.ѣGEߛ̶ ? @@ -[Lnذ֭kVf\c")-- VΘB (wIl$G @+TJ~g7 կYn=lq0'9$"(dr3YubA`BH27DJ@(%^ITT׾Yjk}7j8F衳=ݻ6|xmߌ&6 0 j^A & A)`_ON&kZrZމ,/ϯk({466Za8*4 0 wFO76 @I1!ɔ%&%"룵t{aϔ=Hՙ7J@S[uA "_\O?G"R*ke$FMS˵JK r DNoʮl]!Mp(]AHVTKb @ x^L*\/WT>R] 2F"\Hk a4f  F-Wכ=ԲvOד4E=ZUɞq C !Y:Յ% t&7ّ`bFSdOB5,³ͽVfqD>2bh!&Hd T"&@ 0dn}%erTާLOp׳:wSY~ [ívXgCk̭kd' P|d/A%tL.)& y_M6z;uLqU^t:C!$t,:"@ H׺њ|K-K3\>inicGGf:bprBLf5|)q%O !9dȐH  @` x.K)^/|!{72S7D>1vH,T?Uط=5@ d9 @ IDlK;qNUOzTϨqYݿaJ@IDAT;8?ŵml N@ 'rJrW' PJ2Hg`8dx6pN666ڰaLi&75tsdr@3\\sI(-A $ @ A T>[yˈf>V=or"nH'$\S\ʣ!CZӀɬL @ GA X @H t'"{Dd‰H'Ƹ!T+uu#πh쉾3W"C`BHؔ !нL& b)_4',f8fsiHMqmn޳DL\\@BHeR(' @@w"R~CDzI1<+|1*>:|=)Nvdz: qsϮ0%*t`6wz[+Y*bRS\7l`nkEŦQd4j(irK\j[mP+F!#&fJS8=7lԄlCFX H7=S ze =1.01+!){5Ҹ|鸞#&= #98@wz->}zwO#0i$|9͗/7rŋWجOf7[ey:9m4QԢcn ?*gmPSSm4WrI(nvr ]@)BHf2QM(k׮-ѵ_nW>~_׮rg}>ӽvGֹYlw~gqhcSR ߱KYF:(xNnV.ZŵN 0%{ILjFd,;R>lJw{LlsOy[J0yu2lP]o3ّWګ7}6s8q/Y?xmm.=67b)ǥccZ2eLó-$h[uLIMV$Fqگ~>}v{bOõH4v+H0d)キµ^e-&}!/ř&iAxl1.obHD^[q7 ٔyĊʪ(k+Sev=|KWnMw!MKO ZVŖvǒn묧6}KPK'"m\_ؼG٥Zƽs]Gi:6b$Vb8ŵ 褄n/&%A ~AIpH@b8Aw96kmmݺMW[c)ks_s;_kzkY͎ڹnűϼjmoDfM攀ЦYkvϫAmޟǵѼ+Mg.3?!AaΓh,{Zmݲm:5{CŽ+n}.8s=]i!Tu-om>OT6nlR%ikylb2J@ڪ ι oCo8ljl`θ.8r?]n4oر~ɞ~;ٹOdU!]jf#Kmw3t\;y}/,;o*57!염4uV=t\.+v-}N<Ƚ{{oslAݪ5dڍ%I7fh FEW~_i7"WMOe 4cҟS\cmw~}DSg7ab,~nw?ھob}Iv7x}ӟ;]N`EmT Fϔp#VQ34X][eٺu.Kj׸.P56]۩ϖWO<1_툩Dc/Ua,H˹Ƚ\Ι/3~dG~IhʤP:;y,ψFo!VՌ!]=ܤ17M*@(5`]]s}7>O۔)S-\3Mѭ4w_ɒ)w֬[`U]d2oa5pVdSNm9nlp!º-pGB^0؟>mukѳ'wRu,r<}z- 'dz9)VXCI!ubŶ[n N4xo<ˎwj1*Jzx9Ř$I9kl/g\Ιs/L1tZ}l^[jjc>NLZǤ]b}0~ׄZY8D,d,A 4"")H[Q Ը+WFN93\<hqkj-޵-ZUEiaL …:Z%[ۭױrBt~W1*wF";1N !$5-ʖ.]j{G4V%GLv?߉׃23\<hsMyz!C3cRj!nnDrV]XYNu#lڎ)BdLt@S, lQۮSC{/ zj[l6y["+/ kkGnf;9նu$"%&Y+Iխ 1[oْڪwvS:wl>7Oā@)BHf; + P4"ZOccr!l)F~7{5s-vډ`pkeLV{ >a]u_xv#qLYibgkȼ&lnKn0 >f7n%HTGŖߊjOweGi)콽yN*\#98kjVg]Wx ~=<AܑrY9&G^B)j:΅Q?u\kk_I|@VҶtq $@*US\[[R|UGK@B s @F" f?%㧸6C6@S[uA t yT[ݨMSFRMY\lZ::9@BvE @ fk ᵵV[; ɡu%LCTC` 1U+ @ @ Aɖxh  @ XBz @ !$Yl'CJ @d e !$cF @&;CpL @b',/ B @D ~ @ - $t[\ @ 3 dSSS`@ @ Td.-_F$K>$ηf۰ʭͬ2a7ŝUQH$@BvCS  oyz9vh7nsC:!Y j >j91 !㡎@t2@BH@jgCL+@XSQ@S[yx$%-hh {G֬Yc } aڵk:z<|u3z7lҤIݦ@H0jȑ#Ǝy?+9AL !YD!0N1?~|!Xn_޴RdVn5UVYMMMє!zxAwT]2eJQO!P*{ԃaÆmĈb;v@!XCaI:%TDBït:*:GHQ=әZʟchѨF AD ň jqJdyy;co}4 - 4rˠ%BUIIhDt̘1eQ=ql"%Wճ_bEƍ}.H)[jyAFSrL`H v?^1r#)@u&!Qva#q8h|F}kQ_F>|OCQzs ֗^q)'>rȈ?vqh:^"Iu̙\ozrJC[6NT,*$zr䛞owS\`"ĈdOP ʠ, b#(ʩ{@KDlֽVZڶv[/lu]*D4M $(y[n]U8qM4Oa5$]=vX>}zg:@~#?W_{u=.fkc:N"UwoyTb'n/*lGMeP>l. ũmi\Q>cWc+~9nk׮C9$kzꨌb!߂oA!${G* @I@BGNBC:&$h*1za%45'kQCbJS0ĀF|93 $){'ksr J H)wgʔ)9U$R)]L8kZFZFJhIidP.\l׿5o-#6Z(k~Q%-<msε3ftfۖ [oEmc=F{Tvk?pzFJO/YH Pi @Ыθ:ϟ?sVKu+W:ŒSg[#7TZAFhѢNA?8 T| - 2IXyA#LԴL#SCBBU:8XVX[ WJ0HHHV*M T]$]U9H*Qu]K //VSC l|Vϲ`E0@@$n::дOuIOw :]ZU#~J:kd2[t|zK8I|\b;OVb}{_TM=TKhHIǑX1rUJS$Q+;}ݨ< koEZHv gok6vQ>^qUY蟦5?CQ*N_F:Q[ĪR|饗:Šڟo[zS*|IQv]{ާ璯+r9#|\S(FUoީ@1@HsQv@P9u4ŋw):pKI|iZ/؇ItWg]dު$nޣ\jx+}/@T&ԩDD;x*)/-"0('!ZES6 |5z)$p_Ur+/P>2mڴ( /]O z2SVMBR䅤KQqTl*/$t.yJ,?owmKmRaU?*kT\;?5|< JOz8my@1@HsQv@ %:W#TXMT[#sQS\ QD$:~ȏΥNU٤Sy%|T.]*|ZlH#~>q/]^ľmiU7Tِ`AqKEO2%_lY ʨtR"/ J4L  Nw\ß4=Qoċek\7_ObijQMEDQ#nHHH$L81W(DILJfѱPY~'*O&ϋH@IIJDY.6Ϊ~TeJjSxեjsqNR%U~)rr])՝ʥ}C dRO~nu]>Xq50{f+Gu  \hEduPN,NX,͛7ώ8\#l$DV{(k Iy;'&qsݕ=۰R=PN~*Xy)WBMIJRۖcONu$'Ku[=kK~Jmg|}x_k:cw^Q:O.}H;i @ %ȶQ/mٸlJ&$ 5Q/=ѷu./=S"Rب9-[GY[.S]o6um J@v%ҟ(@@g%p$4J0`jjɓKBC GhSreD26$@ !w$ i GMt,8@";8@ Pj4rĉf@E@ zJ @ x!$  @ BH2"Ic @  $`H  @@BI: @ !$^ @ C !YVV-R @ 0ۡ!@ @ >AH& @ !$x+|@ @ VAɪX @ !$[[[Ccl @ + d[[[H  @@#rv@ @ nAɊ @ ` !$G!@ BHIB @B2تp@ @BH @ d"dLU @ !$ bA @&X @ M !;y"B @؄@Bb @ !$C,@ @؄@Br @ !$[ZZDD@ @J !֮ @ BHVWWq!@ @ @B-d!@ @/LmK!. @ Aٵf9 @ P A(,F$ zH @@B 6FC @"d @$ 1 @@!& @ BHdzs@ @ AɊ  @BH&.Fs@ @BH2$BĄ @ .|Ks@ @O}"Dd@ @B !hN @ @ AIޑ̿ @@: dќC @@|#BL@ @LmMv!@ O !YVV?!bB @@AIVmR@ @ dyyf! @@PX#ms  @ !$z'A@ @Ȋ@B=+ @ !$yG@@ @BH677g˃p @ deee/ @ @BHd́p @z'! @ @ [AI#ms  @ !$Yl@@ @BHVUUe˃p @ dKKK/ @ @BHf p @ ; $@ @ [Ala @z'lkk! @ @ +A ̪ @ @PX}%H|@ @BHN`s!@ BH655"C @@Bɐ4B @&dB7#҇ @B"lii N @@A !$+++ !@ D !Rb+ @ BH C @@B,j\@ @#d5 R @#lkk f @@!$ Ďd!@ I !w$l @ @BrȐ!G @#d6C @#loo/AR @  $ߑ Uc. @ PPAIF$ چH @@B2HV @ @pG @#d6C @#5 R @#2dHx5 @ D !ɈdZB @ABHY @ @,SC @@V.vC @( deee!ؑ& @ !$D @ A !YVVVv @ @ HA k!@ B@`I @@BHja @ ~'2dH%C@ @J !V] @@BU[]! @ P%\@ @`G @$ 1 @@|#BL@ @vs@ @yBH2"g  @ Az @ ? B2C @@eee0C @@Bw$cn5$@ M !Ɉdm!@ !$ 36 @ . $S[mX@ O !?6R @ .du @"  @ K !n c9 @ !$G̭ @ !$˃03膌 @@Ba19A @O !Ɉd7޹8YTy!{?ҟTiR LFu'"wZ!$3284m~cP$  H@x$~7J@$  H@x$?} # H@$  HxAҿH~dP$  H@x$~ϯ/& H@$  |O1H~) H@$  Hp_/& H@$  H>bqJ@$  H@I)I[K@$  H@!OCϮ$  H@S O$  H@F)IɻX$  H@xBO1HOO$  H@C)~>* H@$  H < ߫, H@$  Hnb?y76$  H@$lbm}kW$  H@'$?ܓ%  H@$  <$קR}Y H@$  H@$h=- H@$  <$_5g$  H@} r?DE;ty$  H@WEǐ sS_/_0$  H@K9鉳|Cua0ahU ],$  H@ygF[ur++\;H^M$  H@ VZ6{[ү}' H@$  H`/ϳ73a[S׽~K{ @zK؜<)K@$  H@5=ko-l$o}q^د^b_oUrAII$  H@ӟ?O${`ֹt>[ 9l[/?S7m_?CuR_$  H@[d̬z7QM8uݢǿn-e['*~짡IMNh<݋v9y?]?l>V$  H@x |tʥ>OjbV䯑:M96n;G;_+ZoVxS5W5 9y@MM,lwI@$  H@߇@)D۞!g_lgO=]˹ݻY3k;?}L![\=O;UCnuEOM\~H2 ^% H@$  |{<~'{jٟ=Fko{wo延K{uَ tLϗ% m9ssC$Z H@$  H Ym{h!۹3gm&>މ'p{ 34uح--:O֦joj"$  H@@ot\t{n޺\;H~ tbnJ^Pz4>|sѴ$  H@'ⷝq>$q,k%5>kKf8-6kƭ?:n??Yɟ[a8M+ H@$  <@~NO|gg={Ud.h$EF<)!wu092K>>b\$  H@$ s~6u͹<:6mד[i؋_:HɅVCּhץGb4,rӃ!h3~?y  K$  H@x> -@,g_hfwYԭ|ج=*G]-ɼV/6kyAt>Z-eXͰ{dxdEϊ65h]$  H@c ~~~ϓUg-1sc{qJ#w R7kg8/9wG˗O?J}9x?:B't ԻhUYY?rZil|AruP.8cdm[6_r||GH/ޑ~CM|$  H@$X]Jo7}&>+Zh$=<͋%53>b/0A.1_ +Y=w?4,XΟ\Ry9(vڬmjv?b8dgwJ]VeE'%ۋ%  H@$ w> |fts4ڼVԬlk5Ν2HƹjpjfNG˗;28&މ~^qI@$  H@߇@n byßa15>o t6WG {J}^K{Jj0G'~ h zSK,zN;sıߚ$  H@$=Op"*\||N9h=yzkP6RvnQ^ج]cS7ubj7Y?%  H@$ G`yGi!ෝ~[8sQuG原 {y5O}g|H ?ϺY?*~J@$  H@"chÿn-}N?5+g\$O 17Y'_$O1+:+<ؿh]Ojl]$  H@ Y!keAXjzWq4?kڕFMgud. u5xg靸|1ٗ1zbw&*:jV6ZzN^gQK$  H@GODIe5b߲Z3OݩsOΟ:H<`h_Y.?=ԢwM|$Jvo-ٛIe$  H@$ Agܨ=F)K.{^l#-s楸>)rV' rˋ'˘d5 ='G:5$2 [Xbpe nщOK>v'wɾ/ [$S[W&@@e:,jSE]gxLn>6 X'J@$  H@#'l4oy4l꧟mU4Fnjo6[?@RG<-/> ?k3zEf1P&^=A_h,zk%  H@$ ySڶ[O%fNkE=YOz⻭ AiC p}:Oڜz,4_\$  H@c=uvcwccN!&ϾmgoV[c6mloo$i.Υ>ĩcO@dkh&]23-8,Ϣ}k%  H@$ wyN؊c}3ɳ7GBkѲܬ"{A0|_8yb|lj񩉆 z g_V쌣:!Ïʞ,16FJ@$  H@ߏ7 FǏ>ZYŏҨCk/|lj>kץd2sO.-ym?Y9˾mne[$  H@'fe[?a_9'ŝ_Gm/$w7y grA=O h&M]ʢe[ϢV$  H@x9kW-Eq쩇uS=[Tnk-\}.~lV?!/~jӧcN h_2Y~S$  H@n@gUG-bW` nƫB?X$nEցCM>>+=&OX`L^ŇrY?SCu4$  H@$} 0[>9mPEoܩ1ݯ>:Vh7 ̭%^~F? =,2\'go~}j. H@$  H)ENDhwʲ?6ct3ֹ7{$i2\am)MhYhmӟ 0#>E"wԐo5K@$  H@'bcSƭ:sO?>Y;F_fVd.CӌW&6+Wqբkdq'j8AS;sH'Ƨ|ִG5A2A]ˋ\険L>9 KmjЏ1FrS$  H@7ڼA4tb,z΁rUZˢ/_kj:sh\٪{WZIKMZӗ$  H@/ =',⮙z_՜cOlV"~I|:ﲫAhE-ǟ15̸fnﱩϘ9c H@$  H}Z߲y:߹U ufsŮo G";5`Lm\X桞|zeu]=$  H@G`yyiWYM %Ec'g}€tmSxoimwmu)۵IT%  H@$ 85LQ3-79g5fM]5^3/tV=ic[~cagak%  H@$ C`P[hmg~mOL/b,zS%fuOvG7Uaew{u}i%  H@$ 87,m[_#>e;̬6xg[ :[}~*&Oܶ={fME.񖿪EJ@$  H@@_xOkc ί>*~)Zԡ̋z(_U>gSG,Xp^gQw5ɭG+ H@$  |?wɞ\״>Ӟʥzf=k֢$?rҧ[[S#Xbasjޫ/ H@$  v.[Q3mqr-5lP3V{;۟Զ֧q Uhֺn]?s{{I@$  H@o'5L\>u]Oq,V|{Z۪eE tQ[=W9<6GOȵߪi]_$  H@x aYwʵ?zlk/?:Ҷb5 ]ܨ6Ѩ;ޣϚ?ī걪S$  H@/o5S~[ޚe>[KF=S}rSߊt^'q3Gkޫ/ H@$  o,7ޣwMqkǮzmա5shSr+}jX1譵ϞY'N1' H@$  ܖvqk37㮍kUKTSr+v*7tm.V~KǪVM$  H@-K-v}+ zSMMڃΝ_s;=3^Yi[R$  H@Cjqv+zݫ~UK=sSUn[o9Tͩ$  H@APv*۝\]+=r[{ȁhYjr{W-zI@$  H@87|鼧Ǭ1\gzOW~!TVnK?ukߵNŜ$  H@$}V7[[iGޱwݛ59\[;TZ H@$  Hc855surѵ7tj偵zد$  H@~{F{;ܽu̾;[K٧$  H@u!~IͿ4@]zK/=Νe^$  H@?[eڻR{Cѥ~B}X$  H@:]kx=$  H@'p!;aVU P[* H@$  |PnQw9w=@$  H@EQݣҗ}!飽%ߥ$  H@%+6x=s5 H@$  H>>԰x ):_d5# H@$  |4O3~/$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@$  H@˻έIENDB`davmail-6.3.0/src/site/resources/images/osx/osxMavericksMailImap6.png0100644 0000000 0000000 00000315440 12564151555 024413 0ustar000000000 0000000 PNG  IHDR@n< iCCPICC ProfileH Wy\S>,]oad **ԅ!wki."T j H]QV^E ZTZ\pC ^{w93s ;QPp=bJΝåPAM ,USRW#/ZhER!Db < vU L (@$.$űd3 @)( Xs˄H(KRqcl2V"#1F! OɗF!s+$Yc62i1eiQ_R! yRgRJL5hr%DмiNՑR B2CEmp5ob! *zR(@2 (U~U[R)XZD6\IA$Z ! łB FQ:oE=5ȏDR'ԌV,(Ql>ەmȦ-h##D+#1Bch:yyxyOx;T9hD(ʕG*17N.0 { )fBy;rPE&^qh]mhsezE w_0sŪ5X k¾a'X7 և `ϱw83qCw'8Ox> +Zߋ'sU@Ƅ ND2CJbQE D3Nt^ Bp(\;XJEHEY@YN4RZ(()}AG*jAuRSJj u' 4*FҲiʹ}n=N7уt]Eo_hhYkyjEkhɵhh:uIְvvH\{v }#(d,f2=:::::St:tju9ӧiteF01]_/X,#+RVX'YwXov[^Ȯg/j:ugVнDO[Q/BO@^u!}~~rg  DK 4!8v)g4ߐfdgXhXmyA##oL9FFGz cG8cJ׌ߙXM&LM.6gf*62gz,ʬlYms[O?g8.hp\ոnZs-[tY YZYX*,7Z|belfUhՀ5:Zj#ϕqk666jm6mml3lmǰ˷[ga7homd?~MmN׎NY;:>t2uspru|ŅR+*qwI6u/0;ӝ^ǽo K&Nx:~b;'~d[K<={z ==xzy=v{oIܧ烯ҷw/ouCg  T#=(hwINēvLl, *7&Tz7.L3߅_ W 1?x$Yy> *#.NmtA1c cY ǟJ`&%%MtMT&'IIkz&;LOnMɷSRf06%eJR;8i3vJO_~+9Cё9-)uVd֚ީΟz.<[ݖCٙ3I'?3rڵNL?;|lƑ33Rsrw$ Cyqy Ǣ0:р8XF ?8MÂPI4BZ'}V[uQrѮYl_Vqn!H~ĪdNIMQ8kAerg)V:Me6]jgg꾲73g?G>ܵ|Y芯R v̳x^|m y :-\Q̢ŌE^[fO>m_jt{|]y[|!2e}UTͫ~\/=rdE+}WnYE[%_umu5k*[ew]պg?[]uczCombmF6]߷bӲM76_yメ~uc[̶džeM;wVK1T_Sn+{{N{oښݛ3W-|w]۟tsk)oleu?~ ?:lsёGG9Vql'uur+::<]y-.] =K'.G^JܕsW'_qi{onyً]/_v yUju7ovz`x{.?&|)Q^@OpjF-),,|/O Ęhkrgd#}-U## ##Nqy@1_Z%Lm%iTXtXML:com.adobe.xmp 914 714 ?@IDATx WY떺R=!$L\ t+j{l^3b{YM ֙:-:jj&@R@R\*-5}y\*g^w9FOF<96[@@@@@@@@@+جԺWj'n*Ɯ$~UYY1ߘ=8|bgafoUUUUUUUUUU6h|n&}) ٌgiOƆh6clKNJVX̘mqcUUUUUUUUUUT`MTu\qclrmǰY?+gV)ߘ}m.HbSqS)JraUUUUUUUUUUV`V6'n*NdS҆fk~:lLYf4_@@@@@@@@@j7SuRN\c~lbSĊױg$f;S?e\̵{6UUUUUUUUUU]MrKQrK}8blL-;ppV1rlb4r˱טe11kVVVVVVVVVVnfmubRqLٌ[1?cl 0e1PSkS¤ɭO LmҞr()QrSf3vi *T1{m^˩tmr.&O[j9o9⚭UUUUUUUUUU+02R~pQ'qOl\mK`^kRz6UUUUUUUUUUFl)QQϲglʙR&)כ&3fmczjyJ^sTor1ɧ|Smr@@@@@@@@@ק^L듧#Oj=O1}6˞fgzOh,ZVOrbSOcXm <5+PoeRv'/O 6peS*53ň]6?Kү,pei(3Om'/i)]{O ,wUʎ][͕6d1?6H&Oٴ'GN.iaэQN 5UUUUUUUUUUɩʖk_:F;<;9pì-cc 2ϠT7:c-1Y#+zj}k /|qg㏗5kɓ'{8eM旓?e۫mk׮98TǤBXI\gmɉOΧOo;_^gb7\)sxryڳgϧwOwפݑ4d.Ybԗi1}ʆ}IZYX|R&8uZ]L'7u{my#Af1IZ;'Ncsi-ecCC.^\2&iK-֭[dsyxn={cܜySN\cQy=ߵnDm*\qlַB5k6Vca֗zN1SN|8ϙC\r#mprެJ:r|<lk76Ūj6k25+ɹج/Sd,0sutuծVia6[q!Bd l+sfusTڝ{>kk??? Ktm tR^AMB&c-Zu¦]yLח1Sgzrx\t,0O̍_ayj rזcbd[˳[ctq7em| OS^*3'\uPO_c>ab5'g]#tk?e+_p[#)Ws/ ٮ 5 ˗ Oڵ[?Xv*=y}庱^-v̓׫?%F$.m)4}K''޽{{Cg;x,],>81cΧ\b:cuM-:Plڕt}İwV| 9Ehs/i3V {S9̃-9r1?vrI6QvmX'Ug['.srƈOx3ɶj?16f~^knNs8tl}yĊIGXbSpSHR'9+:_}@`O9Gn[⟪8q]҆n.}|,6 .66A^f~!OO8d^e6'̽d\ڕgxk/ubՑA?XXd 0,n{Kݟyr嗗ҽ{`!E{Zn;ɲ{W][zK/zeqe,u.sX׷~,׉r57n:GNyƟqƫSSbKu?۶Agvmڮ/rcŢ[;d( ΂{ (gWr9mx#+M#)g]/u@<ՖEo?T6Ιf5Zk)so۶Ot?X:~^t8iЃrpc'0Åb𧮼T` }E| ++ 9 ϒɍEFa!mK$ox~" Ǐ}c;7zֳ_\>\>AW6]}ٻ~[.ZUn)Unğ[{Q9K^8Ϸ|[?}潥{\yeg|+O9oۅ//\ e> O^͸%};F|!i/^H cОr/ˉ%ر\?|/cD=P˃?埗w?zuy5:g͉{gxYIcش;wb}1vp)6:; !u>Yqb5[;m,uq`q u\w>ĥ]ܸCmˍgls袋}oLD~6ۘӷ-۩{{FMElލc4\)?%O$Og'ȕaKOR* yC|3eUzU֭[q}|-9眳h3I|N9vO増}9k+:Ěr5'˶ aɤDo/7?W~,}*}c}3q)z\pE.}9s1XIfh3L:xyeLbӖqi;^1Kgnm>A֎e>?FvLƋsá͘; ֱGQv&IY|a.Va=)=;˧/9:8_ eyy0Ϋs ʝ?~xv+Ǧ],}m0k*9 2g!6#wc~m˘ŧ-c.Vb<`%${ mY;5ב5$CmxY~O衇koƼCz`1'cWW^́F1\I}$dE̽@:Y=y-[Ĩ9$2m:M~{o$)$@r9rc B.:`9zˇyN9]<뾥;F0?}|<\w5w?cW?ǀ2?vn>(0~i s/iK\bK[?Gx8Ǔsm;iʉz?.,zH bjNWaem0ց|zQ綝-s$;zR/ᄎ}EuZn9%?eMʱc:Y{޵؃10!rd>YUNlh< Ӟ/IG.Wr<+?wo͝')9\^}aݺ~s639qϝnl'1Iy.\ym8q`xf{Kg{ծv/-`>C;|tҗ3 g\ޱ^=zrRve8\㖥'fu_gie&<= ta95gx/r,(0|56?oWeR֗e]G7-O}`67yiP)e;/(k|G.[{?u9Tn:Y.3}5Eǎ΁? ^[6xvCg>iӮ^iؽE{9q2gneο9M2O3e_Xƚjq͸^%mĜdgSZn}T~ͯ+>[~~}l6)s7\S}y|+\ћuw˯+7w/-?7C}{}?-xkŘYK_v(r_O[:[mr:1gzM7Pd,[l)]U֯_z##tv1ړ҆f>UD8xe2$Fs!s1vۗ%Ĉ#oMu\܋>&w><&OsͷtcjyL6Ib C{1Y=w=+ohL,BݱcG4__e#ɦ9㫮`= -|.|Vyesc[Xk?س-屲l!+}K$Kq`9-P.}͛]v[8U[=aõ,!D]7uYGb>92y 91ș8|u_GbanP Nft\s|gsv"?}s=_zW܋{u7𱃩Ю,ǞyM+MJFc6f7\2ܾղ &zwyb#bӦMJ"s+X}3_P9Zl躱e}Ykf;nC Xb%'5>{09Zzt͖}c['oY}zb}9Hy֥_$ َ5Mp5q9[ʙ7 ٣816\/.sa^/pѽF{#o)7ʿ{m֖=:w1i1/}rcڍ6 Ez $t1zsxI3f*m~\sV֙P u-[bW7~!{g<ֱedAΝ;{rWs==d:?}wÈny-@.n>tryETo('&_,￿HU᧔  ŚW&ϕ}g9;wxG Ss./@9kf͙<7 6\YyO}4=}e`~Q;ĀK.(ulK# pbOu^HL/ԈZZ+X-;I,mչKA8xf֚|Sfk֭/뻟8_߰pݴ(Z|{˵ۏg|<ܽ}_~_sm?򶷽lor:ڗ+26ο8m9v^_o1n_:Աp.YKk͚|Sϡo,v|7FĀK.(ulm\њi9sIꗃA&IʿYO"-db3g؛,pӹ .#{Mj^tc|3m+dN;9uBS_sp]Yl=1 XrX;r-//w^;{o}G[ʕ83T0|lYwQy~o9o.d瀴ʜ,O6 nmig1L>ȼW~Mw/)?/~l<_~~)}wXy?x~9v+_/WW=Y^˿Ʈ_eo~CւX+V||I^]WumeOؖ79w;ߜ{uV>hBv,cSjXK!_kv08oi?D;5wr'~LNullNJIڵ9]~b-nރ6_ru,zeND}G~ya9H}C{'rιW/\|Me4'?˻?W~K벝,츬\qsʳ|AxcH_uSWAZc#'%&i'd ޶{pd.cmg~c6X؆X+æ\1s? Jdz][|Ƨsm8m%›+^?X=p;9ݿI:qOGyrǹee϶9MƲI‰cˡks6cLJ v屃Gol)[6(wla͆reG#nEַmT֜8R>vEt䜣(kur ү:xWm9H?>ٶy8!v_xnIʹQ"Թ;j?m@m9aݔIԱ>X|uKoo?+bmfa|`/О9Ov:vkwpcLg#(wE96h69)yx]Xʜ1Yq!cl[4K,Sqw>ao)Ov{8;ܺlF|_s_ة<΁6=źRuFک$N=*Ra<ܼÓkxSֈZfO;Z6繖=OҊL,˞={zNG3̋ ߹sәr# cKrr䱃< $V9,$䫭yE| &qc69q&;lwX\\,yS2w`Qa 3QK7&>t1xt}c[?|̵!x|&ydANXbr6vsc8:F]n>Ǫ=sk;67.^Y.}&)Rk-1\}VMn,6Yf+짲Ͼ%Kuۦ26 5zums9r.s.RϾiknmbaۦ?5Bi"':lnC6ɑi Zy?8ȶmhu8m1`WcžiiMmG~GnMR ZcX㉵lCXtւku:=HV&&ֽ>cconm%|]y z(}vjs\=IcXMdᦄgq1|؈Ӈ 6_3qL@N9\:*'WDhCOY=q~12=F,}.ԋ_Rcl_,~Zm6Ovϵv{6C85Nv:2~X9fc[S>ᴍq'J_cME GN{^0̑xڹx@ 9쇺XОIc3xlWg~'v8SdxAǧ<8َm9M Huvb\5矺X۵MsiGW56sl>89l`XO_ te/mR_þٞ:>rdZZx5Vy7v1Λ3>6onpb!!Wbj،O\ڑ*濝y>z`SfG]Y^ xMR_zpt|c%7Vݼ̃w-.\#nX'o?5y0bX>Fgf,m1V;>ǜ7txx3'6`,m5gʮv/v/\ߨ%e׎>9k zL\ը֮Ƈ]up>8=?ʞwKMEGv\C=~)8`O 1X-+'rZF:ꍣ9ϏX&I C'{,HpЇy n[|h'p!F<ص%?}5>9v{p"XnqhlKMa3N?\ozsۆ6[aNfڬul?\?\]' F?\秼UO?psۆ6Ю vnr K]7PƠ{~ʱANkÜ۞6\p&Ϛ6 rw&"nB>utyrmJiűÎbͬ?1mkiGN@-6/A{# .<1ҏݓFAܩ1ͅL~/fۮc+.;dsW:$|͗c_p̛v󈁧"+7|wMMwcl\\et(t3풟6!v2\Ys>8sLN>|9fQ+Sz~c'y+.;d[į ޅW|>Y :~mjښZy5DNu;kuM qN쏸A?܌ݏ7o},)xvty91Ydu0^1\7o.]vY+ʅ^8F9`zϼR k̅|gK.\y/N|-d/8qRO2bI~dnr83{キ_S\k7v-e)'8lx.&̋rW.S}Y1r,v֭d^tEߏ@]8jcV}Kԕi^ ~Xږmg<2^Lmd-d888n?Ҧse>6M8dlb͏.^xd0Nƀ!;&d{J;cߵͶj|7n sNٱcG'eڡ N?翱= sc 'ݻt'E/mi듟ӹck16 [s2 r}/.zիʶmuۖXq;__=y*~3db3vrp@-^B 3gg9~ۛGԧ>UvWe{IG~ص![f;%k^~__xmK<o Vۜ5ꋸ)}*9lso_iMy5쇲Ιr0xPb z];˭1 ->QZ('?_3k׼gbET)}*&y׮]1sf=skuL_y8Go6ݻ*UW}L{ihX|ĵ.=P9s!Lh?7y×Gn+O\1SNܔ=1˒Oe#I'jJJd<ȟ2v7j7&?|c(*7> s/FcƤŏ|_(4կ_a9$Zp ٜf6&c%wqG mC^j3FNkCϾ#[? ۮX%xrm/M'^ȣ2].N .qb; x8TŘm ް{wH'm99I6y )L Zy,w#IvƸ15w 4 t8_|+^o.yg{pi#_֏|#8oBz&{3qu{7V:e;u{b2.Mo0y#+(06z#)s!sd#m!8 W }_}nŪW9}OMY>s&6e>椌U+7kO{3!O~j?שg_y?VylOv!ůbŨ|sxױ>MkZ/gnC_n3Gq>vcn^mcy'8!uDg̐aa>|7q'nЕ9kݽA ?]d3-g#IR+m=)5_zQfcÛ*y2/!oVg>Kklj^/Jcpio.ƓSENR]ӔL,_җ\S<6lJ׿[eщJ8cؕ1'M:t7~o!1|Ӕ?uj33;EOOg9)9梏_7?lX8V#mI[L#l;un_ɘ9fq|` bL1ێ ȃto(<rj7Hu_+]} g?[u_򗗍X6ڵ1?8غV5ڼē;Ǚ+~&MyW8hJ{ihXU8!y s Ϫ6m:6D5MY0C`jJlӗ/g#98m42{ጟŒNq?߮7&ɗ m2Tpsa×".覆6qMbG&fAiWsmoC] p!88n,UF 裏>X6olDR:A.yx;^|Ν60! 63z}θ@>vX^}ʜ)-et*y;q؞g,ʱܶ}2h,ؔ3?[1_M9r-:SD~ېUcwcRfvb}O yscNuv\!l~2xAN6c݋~P/7'|kɆuC@ ʎ6}#/?~yi۱k3n+OfQ<>lO"ow' k)wl** x9xy}Ϟ=Gv _r¾ªmxA7Åqc~7OFr*ZVA\s`YR.lAMF;1۷o_{<9;'^lwbNO;Hvt1??2Xkʾꫯ'c x>ͤM7qݶ!KE.Q99abkO/Ec99쫹/is]ߕ::f?/|_ykB~/ }cMęS80Y_s1{˫_}Wq6fkG[5e;/:ec<l( cdk~{&:=Ixh@i4 &r}EX3Y$־ԕ8yŻv.!7b-Rpw/xǐwY_} y2fʽsΏ 񤎍͍- ;$Yvł7D>g32F'rn;O/|p#k;e9Ҏ}zMmܶkӖHc쟱k;2?xWy0g]ojw𻮰'6Y;V𬗬xsk5G9y`I`jp !\sr`ljM2Ft6j/kNGe.6c9Ꮉ mXCY8r0̵ü7=|#n?·{xµzַ,[\\뭼aFr.6ع@"Ggz-1L>rH6s tm$i4f3eWᵬm D|`$ycB>/xMDo/;w|<&M6<CbBn/b8 \'^Љ 8۰/mXvs(ϸԎ nԂZ闟؎>jg;b  /[1Y' BW*~ <ro<\ҟ6}pxA&T9Бy7Cz+g̣XrqH:dn9x?׊88 F+CO=9>pHёO3å?sX/9$f.5w^2־d21|9ڎp7<<^wv[tG'}_d!'zuܵ]!p]dlၽ2GGX:b:.9klqЗw5*oem֬//=acK`OqؗR~1Y+eX9g,>N>q_pdmOFe.>p o5jhX}898yN`38uw-A|P6dH 7fgEtn$| zgL-o2^ fQpxFNbhf?C%8>fox}>܋1`M)N^ǂ< h,<qY\!0rk'|j!?x_t/0cfv>3d}5KX|g7 *Vx(ǍN.~O8y9=??)[}`Xggq aO<׉w HI}?x@m~C-8䍭W$?6lC̣L`|6c!mer HŃ+_#'`C Wb̥ n \'y}s`[)݌U }Blv\1 X91|'Imm<ۮ1RK2C'>b! > rBśwv/ٿ'><m269Xys e!#7t骫!?dIFe?vk(D "3ʱ.זݻw/}6I߹!x2&G|TreI}?|)ob_mpqRW^Soû..j'*kOtnrr߁rPs_Ϛr9.|a#%o!bC͟c՟\c!7++}n5** pWZ:: EO۬qSˎ_Fr>6~)v1Ӗ6qk0廯X9s>w < >cSl| o*yl\b?ݛ":qƘc@/~ŗFA[Evc&yx;w73$2dK? tI91L?O>piWƎC<*g96u>mS :>tv}@3>62>H a1?Xdlbe l^j,vP"/}>zσ756\x+u"N8g?1\+jN0>G+籛*#enmDf>̍:ȭ:$>㑧cH\|ǚ8A9Xmga3'298#7屲~]qⲲ/~l8֭y%eGb=i 2':ٶ{ }'2:&'y!qiW69 ?y̽0^/|T_cs5UU`܃{E_}w~oJ \2j}.6uVFrP*.M`G,zŝrd. Ǎ<_䟘K39+I| w!c>N7\e߼);&oh~u|4Np8

$ڴlŋ냟C{' 6C_6x=a yQ~I9ĀYؽC+wpr;Sg 6i8 mAY uqԇTUI~ˉxh'uq̑2>I\O'q;wO&V=6j'|:uگۥmhj柸̯ =a6Ǹ-]u<ɫ=S yoߵۮ_xS9rc{^~^7kocZ [[@WswLcP-ᐐK2}u ~`,omq 1V{cs~-/}K7i'>o x.zY$uбQm5n"6ħ1g\^F.ɧbS6SNn; 6F'^1 {CXDLp7|xUWqǍ #7ybƃ-L5Xx ~ٶI2<ۜ)omWnW~yHefOe.e\!sbI<}6ma>m lĩ;frBSj>~G ̏xdm62۶ 60^}Oi>nC>bm+u12'c"/c+|~|E 2>>eSØD0Λa`+to$tf6ƲWu96#&ұ8?c2XǢ=4?dP`o0oqIcuĩñi/xX\\SC]T?p9ԭM7lw]21]lȎ9c9x 9)''D\5'֓M"Oc;opFo5jhX}@<_puC5#.~ ]ԑ08un̿Θ|EIV"טMC>3NrYL>aXo(ډ'lq&ハ79bש)ڱ $~q֖Xo.^ˍ}q'`cmجqԅ E 9MDl8ts9~lSyuŒ!p_NdA^ ӱ!!..6Oڽn~8:8q!ElC610 ,~M 6"=fatz{ OʎUN>rCG 6HXdd1p97D`zhl¸Az-c'C۷hC'o$^:9_O[t2.p1f拍(c#m_teV;}2^?vb^%dNJ?3"8I[po<'rONNʡIq+{cOn{0k2>e%6XsЖ928ȼrq`Hrbg|}I OڼIM򗿼߈** Ҹ9y̹'|ᢠgY,_zSHփ_N7 S,'T̄;r;Xly36w ll,"d zW 1b] 6'\plO>98dc}P-vG_y0bØ'ԇ>qB"CG.d8D$|~>)7=s}ɟs#.=HĦ=6'  ~8kNooOIxA qؾm/6džl|bKy͡n;\ᒵL>o.C_½i;sZv$u}ݜ[S22]W˽fx>[vb8l6%1m,μa \syfKcSM"c5< yA:61'v9oL^i}݋m+17S5~`K;>b!%>dNte^>r}+W켢qpȼs)u!۲ԍs)SN<Ē_9C'I}odH?ql"CLiz*99Ƚ]+1ָY'ybз9Ս|UxV8$'Nx} 7eto DEAp2vޡ?b8 /kP!x1o `+-LJ ?74OF#@ 朓-eck$yƖ2qgwJlJ$$3H ȹшӞW E0_߷N|qP.q/XB#6vؘy^w'QxN>:| PO#RzKEҊ7~򩏶uy,WSB'C}KOljUyХ-x@NڲO^TNYԥN P׶8?J٠FZ%=쫷 8A]{#}(4:Jz@}YzSMQ7m2Vߺ<േ:ʧNT}ꔦ^48(8gC7ǡx\ ~c/^m[g ^I>e7Ս :SsE l5~A< Q=},etgMW濴EGK%}cܭ! 5И:< N}Kl~kݲSgitsN,K^ܡ!𣣔=\!䑶RPR(WuPPY'%=mh?yO85ณzy򖶁g?30zk P-&=tlXW~ %}jxJe٧iE_KBvJrdɒ%yެdouЈ@#.sU\~OM,ffihXOjT{u"SR]/O#..Д$+H NY(C#Է^gI;WEtڏ 187qSWPڥ QUb z*:%'^[}rP'=4-i$tm++Wŏ6@<~qrWBu6I.h 'Ȑ6pAT G'vs`m xk:Lp%C6zcET-m )иUFt-Wq ڨo'@u/md>pBNZTm6d/=>W3ɳ|г`,Jې]=h+k.x#MKi\i/:*г5~q}.zjگ1+n1˝j@UJ]r 귲,-%-m}ϸ₈ʹуgܰQ; g~ʾ:m6/<lfN&/cBjeӈ@#(AX |9X8ws~ZsD.p,N,NDryNpf>DכCۖ_ߒgpPwA$ف tW_bl/r1PJm%-uE|)>p7=;Ih1=POitȖRJ{;U\-mnԭ=RWv+% C[cbaÆXJg?md[byrm)~J}"8AN5k*ȇw #S7mGɣ\A=_O:|_.2q2qƸ+*v\/|,;(޼3l_zh569޴U~ԍrs-/8zOQꀦG[@}^ZuGmmOY©_}ږy>*^Zh_֞G^h8՘6PS}1fY[@Oz#i_|j 6 YP >}KZȁxh2n2)_?_ZJUneO헷8 u␡:9qU 0rrGG{iDӊs5Ňu(JsSQX;Sy ԩFnMB[Ւz}YۻMTmlg]wUSH\ ,.`<|['; hIH-OOZq>pYs"`lISڤ)PQc1ĂXHlhSK9#Y^uO[%xvaɒ%ՕX[=Q&%]܁NҮR&>G%@ˆL짤 HI:UxU6 S4Y/2_OOۯUʓ|i8ΆpllS/苲JzʒE%-DJ~QO9>آM`$x!6݃O~c/2I+ZJ@}Y*Ǟ.iח}/7mquO[P'KS?$рpTapЖf@_:_lcmeXB+6§O ఫi?8~ 汀* *>RW m:&#'/HHï~e!1oُ|@U#Kۺ/vFƜ6Q&8L8>~q',Eʰұb_<ڥL]ylYz^m<֥5_hc >I+[;[މ4>棾.>K{g R"委"J6ɯȠ ^^uIMCĂq" >)Wٴ\odj'%q\<87huy,C=ԑ mG z6 7GOٔ%>mGrot*Bü̿rۇ]r^mgʒ~_^Jy}Ҕ`@?CqEyG Oۍg=1M^p3M>@_ZpRڌ)KYRW&u+43Nہ z7P:*e?mW6ٮ?xpzGmSn* ñnDt8%zᗮ,yE>J:6)Q1T>ۏ,^zhJvүt.v t84Т[=nڋ1k>=ua'ڀr-|6*+J":lSjsE?QKY):h+Ӻ}%8}LgKt4D(-6KOh߯v\['XZ4~e QNKʂ_?wbkKG\艏ml;86xDuͣuw!lC'%z_`o'JmOcE SQ|٦$.o,(BL(а&B&2I =]TumTni<4D(-6K}'#lN8[忴ʗϺZH'zu6XB{D*[:۔SdIiYq;Qst"N\'o`~ 8 H:PNJhDlбQeJg[%z\dٶOuJipq-5h\'?xi<.pƀqq xtwVC'86iÃhT8mDF%gdVvyʴVKڦ ![T>`~ hs?zٌ- l|xx[}oU :q -ڡⱭm+h'm{l`>1im>kv鳾t`h@'څД8}w*1f(eZGm2+!ol#uJxJ^öN(e4Ȣ>)CJuA(zi2JcxCG)U/ %>o=J7Ƴmh[AZ}%^T&3cN8 `c|ip0OB&BdVsg \!`>/XUGq[뻏ģ]UcG /+m4G?tPgЁ4S8hxdZ,˼꿶P'Q膟Md_(A7)zCcxtg<ԑi?rcoNl:Mokd):nlB} @lqLΆ̒PBj P~yXW&_ukW3[ZۧcC¯*uÒ~y(m#߹Qkc;?vs|;^J9׿?a,v.vd>(=(\_G\Q8sNu?>?^Y+&2nʬr4̸(R_:e\c[/S9QG>- .\jm#YJSNZmcwR% 㭌6?v)v)`߱?14Rし _=]*Wi3mc^ ^" \#'矘9G!S~Gm`N2x2>=ؓ;SG%}f{b^>9QNdL;-47Ŀy+kOG6??Y5.jnYin514W&ЁcmtAtpWX9fq/3tP&6"_lc3v O;=D7cuL+]IW  ulPv6+veWAoz|x?e*WztP+c@rAѝ':g ?!܁;.||88s\gWt_kqִWO-jqah ꢟ:KsگmWmd㕑[!aj_q}WQ߱0톸`NcRp`s߉ᅰ2/Rܺ䩍x,}hX#F#?7FW,;7'X'aӴ4xA96W_g orheEKجb~wGu rWO%|󏍹V4RUw}tgcEd~a_1YZ}G\Y1Xh~_Wȉ7_e奄NJ_qvl^J#^O7o||8Px!:Vٸl^{'u<60 O]ЀS/Ě3[eďzXt=`1u\99ÇDD`@g9oyCѽ's~667 ^;Ԫ|N[vD% bj~ y8vn_LG&ڢ_x̫_hLࣤM2iZ?6}Oy`|f:䎋6lVh+:y RV] ^q%uRB-q?/ 'Eʃ?gY}s>SCxLw;k;7ڟEF'{9A}.N{!:x~@S 2+]mz;oyіfxKGyȶ6ԥ}O|MLٕ9|m|+ȶg{?o,9'V̪Pgk&U<էʢ,8#V)WKjݸ/F⹟/yX|ϊh 1ny+ksZD?j[ww=<9m r@IDATnꘜ!?Cܚ;*-'@7|5?OڧŔ|9،G^9'圸RXQ?_>doii:foh 5(qج}ੇc תaس7;RBy)_J1%Gp )٠?@?;VK.rƦm smJ:ʥV[*ʐG{#fp϶)5uiũ2`]!>Tm#M^',=ֻ+>7b8sXyJaY?)A]m6V+rCk|_Ĝ\3wu> 8t N`']{JW|F{ow835DGrA8km1r^v{v8#yjo~8~Ꜹӷ\<`ZPht6펝{⢅]1zdWlSY8kj?On⶛.iy@cp5qLȬkPSM:#>s 9e#=?R g{ު㎋=oT,};/?~mm/c[EZr-bӶq9y[6SX,kWWvW:-w_ }؎X؝#*>wϪ?5V?:v YM-0;)qwŋ&Woxc0Ϙ'3]+ۖGKw˿^ٝw%&xs', 9?ĕzR.ϱ/xiͧrUO1-g)qS_ߋ ΎѾ#y0UV_wŔ׿u{31gm7ƣbZo h\4)v[O[xMϞv|Q%>H?~ՃqH?q4-4o _l}\b^KO׳>~x{E2z(V?j̿xVKѓ2W^ܩ9Dn#?~8jJ/6!{XGZn@93ס¦x}`ۢcd^Nsۮ14zw/6V~8'X{+? 9!.sN&V>2wTmŋKr]p^:_;i;s+u慵x9ӯTKoV. jNx{ŵX{_~06_-}Xmb ]Ŕݔc)DOS,,`ѽko4rlg<t%7+9O޿&>>ZswVw۲h0-2ƃ[>z^C@1+oWeǓx9^83Oʏ|..y#ʞ\!'f;1'o\9J`[|*?wp7C*3GUlT/-UݯƃO0:A~ 3:~⡿,? 搶_tC/KqLa-1U8ij1N@2ʮϿ_W%zvlذ+Zr1r\ޛba^d?xypay6\1wC+bf m|6מ1$< #=֜҇őjMq?5oķ񥘼Xh8_yO\]>wkWY[f\ׯo 6Ɯ+n{񦘛~ߊocF~܉9My0B2lNN@b<ǯ=Ś1wQ9m};RL}7X~nGlّ;<ݷu{u`lgO=GZGTv< 'UcC}iX 1'Əӿx&qkX!5ϸ766۟y8̹˗omVMO]ڕŗ+qC^P|휸dXl~ۡydQ^tfblŲ|¥3V/۷q3ޒڍ*h&܍1;}#`c|{ƃ:󆗞W׿kncsKѱ?o溏6o=sgsu+q<ҞښAٴu2%_9J^c )M=zZhhj {U7m풞ҹIq JiN'`Wm T8vѦSV^ʒXgMm沸)vE6&K[^1\pa|k߈[gɋT*Zsmݶ6/b|+7GWWgba,6O_n~㲱]@Iy^ldk6.߫qtC EȅF|@{G.Fy9GE)l|H,\$b>x)OB$@t<KLJb1=wX=<+['"=Gby]iIGj`ӡ<~\;zcֹˣy]mVWb$+n:Ҟ)O|+1%̝>ǎ~xJкAO.TQ(G'\xhj#yŴyh>|0O_^9r9#-#3_sb//nOy`;r~tģ?^1њw8͹4!1?O9bڄ]t9=z5uG]ѕO?:=9s{k;*:Xپ6}썏 ԥWEK޾17n8vi,<}t;zwl#yw_썹ά׷fW(j9&ix#*(ϸf4/Bf%DGԮ|w):3&GsNM^8-l3Vu^׻Œh>)?=Z;3bE`=؞xI^Gc^4W}|f9ه#~v[G1>ۉQk|Ek^\89989.wisbY>6ڗPƶ'#[PɚS&Qܷ M^^vu=;ws/}WO(\mV_eĄۏl?#|to=81̿Zs@W|K/uWi2#1???x'œ?x_tG>^ϊJg>Ѽ޸IѝǍeʤeq8woΦwg݇bjgktL͉`,\ͭv#A3!x渒L/ü3UFP"Ckޒh~;/j!:l-+4+.ё DpCNsN 0|}}q~ t>6=4D(3vqӥscyR[Ri8T8j^_y f͖d}ݱO-?տYӻέNU_~]]y#|L|6%zh壵w_t Жض+ι8?c5iZ3%]<M 39ҌѱSX^2ۛA13;v,:`G<ⱟnd\|]sO*qbflY3mB笌+_wؗcj6G쉼$s.6ͣ#mn{(o:],{ v:Տ߈|'rfW΃ {7O$;4É1E>xD@Z3c/U*a;w2qᘜ2"pޝhI<=w>u3{8 7~8|G~ӹ4.4OqQyٙ|} Y<ͅ!X>0|8V9;َ!ƙy'Ohhhdc-1K|·eC b)wx"5 {u-:2.W:m^n3cWƛ~6u zԧ-FʓBҀg}ZY»ͿL|s.WqƵxcOlt,}ӟ;?qxn&pķɘ!AII4$3[f4^y?MyRGi"f,Zi>66S]ʖ&>"ѕU8]9w#y޵1+\878Tc1wlyt>y ? V3~|(_|:),v72#B}yŬewh<&Mʫ-qo0:ѵ];NJeS3/vʯœ3YЋQbYÃ1l{gtI-?%nE덑< ߻23qvޞϻXwŵwlwǴc~(p~GSyDxnӞؿ{SFh]c1'چ֫J mo oنFZrLVѓWq]'6ES~`9wXR/4-'⓱hq?9F>;P>׆&.~8~֘65x0/̌ühP;zwFt1bk[#ΙQ+;9/^bFl].̽*0f̟eͺ윈e5N3wd7bqcľXlIāMqx%s-ОnGm߽-Hܜo58w^"7mge s>$=vo O׾nW<Υ:|aK ?^3{ b8s 8k~:m~,LA%4C9g^k/Nϱ8q, o||0&-^GEO☒mf/{I3|"/M2._17\K0ƙhe{ǿ wmּ3u#\0bfm-wL1C?)icSͮ|'ԝwgSdyQaŜʧ)3yjJ1.~~{tek'eC~Dz>O:bࡄ~}dP1*G|V(])AO ڃ.m;څ-i ?Kp@ Mt-Ȫl?nPl߼+`^15:f/vʓ̮|B%{sʫyy`>z5ǷNzXZ#C\M]VTúZ,jF߫*Oct3Pܑ4yL<3}{/eYi>>qV~!ěŧnYIk/"WOvu3Ӭ bS>6;qJ̝G1z:Ϻ0.ڼ# j[+G@w@ՁV5n_|ac:teuzꇧi/t]w]±?Iɻ 7+fŴsύ}rxie[Uё;?j.U񅽾scYq'_u}RlΓ9}&x}Z0{o?/nx*y\25̈[.-1o~5[7)nlY|գO-Mg_̫;/}<~IPHcz[c&%cW8O/tQt<)h+C~btбA@T![Qb@ڗw /"HG\[>?XW{lwޜw2_q;;>6s>WߐBϾ;12ݹ"B־x?.pV{;楹/&-]m ._ygp(KcB Y3QwŌkr.{,rf-fU]S|>?{?'Ū;> |mS!y-Fg,6F#i׉S-Ѷس9A<25ܲ?JK.q˵ cnShub@<89n qՖm%m/ I g|誳c8q%y?/-l|z`+bƧj~0XOj]v9PĜ#>imV?Гct^3E6`wH_?3pb_J^;Ugŵ˷ů~5,](/ڭe5 GY.x˃n̊)AUjc6Oh5OƯwc1;' oiIcfSLo|C(.M})ͪ < ,/?P>/i bۻ;I6Eƌ|Gۦ̮z绚̅`zKݲ-zCs97VBSųqd5f̞Wnk1;oٱ7w-`+y@ߖ@3<ʛu;󝁳Cy\vA-3ϊ9]Zio;c4g:kA~-7y?oaEȃZeƸ?]k̨'lmy> =q;5p(ZuE}yxXxVL:;^ccqhG|sN,1&{cuJ,؟coRwޜ-gx }[3-JbCU_|Rcq~Hli|m8gTr dᇛ9IcyƤHN{4gY井y8z,m˼znSc{]% %$uhr^]rz0lgr{mr:'߫5qG3^bL gMmSy {Pr[>hcm?eD-='ת;Ӗ )c ?$jX{˗gYs#;ĿS| ȏcN8t~hSp-^lMi_Jϱ }^;'/|h2gS:'{򏜦I9og@^@ϋ۝hjFSci~^cŖA@u1w[y/7BN[v9cy@_Y_c\[{eyKή>P^@8V0Ɗ h7xȫwkU%wm7F8hۖV~7H}YLTEK /K\EPSۻcOn4Kh87ODHH1",>LJr9wX ]uvmF.o<p&9Q+'12zYaĕ&v@1B?Xp2*ur>>vtk2ytc3wr؇,.m>>BxT  {;۞WSٸ6g&^;q# =?l[H|m--:1񉜧)?}(/i2kX"O0l|ԑ W='F~@hо8Hѥ>N{eqʬ _K>Vv40KOĝRzm1IJNXޗ_/_DʬbqQ]%F.2*|a >1/c?9[emT<;raU8Wlyhqh?̧ 9pRXúЖQ!US:3+fơ<{/8V@?)eX;:]m~zq?rVs3OL3kqL<|q[''RK_.Kh#'xv^ #AW<8>s@YʇPrGMkɻyջ%`NntN꼠UȨ3<у*vDV܀_o:S4Jzu7^s}q"YMxGݔU~JÆLxiR=@.1+o٦^^}&hח)eSO[MYCuKcmW;U1/u}A^mP>DT%c!M<5ȗ>@/Dz+C8__/Ƽ ]s>*mj+{K]~`~SClVb>yG[J}r;R?ytCG[(nlNNw/c1to7@s \XBK?m6t ԑQrRVi;>AS}Ik8|%ۤx. vR]t-}l|DyGͅzڀBCG}U% =u,M?%%6Ե}.g_Y*~ʗ)U_yb3.B+qS:mբۿ*|S-e#ߘ\i 'Ŧĸi1'J{3kz|n'xN_@LJwN {`";Tc? ]N.x=,4FdQgrRZzJfS~m~xhi[QsNzdS ul0>ꄞ/c Z>~&]cC5hE?}o䟱4yHL^ocb>:q>c߀cί?ھCJG ,.2]ʧZ[zF0S{PmƕИXr\7uEY1kkģ Ǐ%U1 tl9<^=>^KߛWI8>H:8q`гտ'IEΙ ֙hЉ*$wppE?.I. ^Nfxx餕^(mȔ<'sچ,~6@yũ}ڄ<@)::oW 譯2D<oչӘ'm'kmQc~HX[J|c8cL0>j?I)5#KAc,:lN*>pGҝ86CwaV2g]~,~[Ҫu՗n৯J P?8uF>%8FOFԘ'x~~X/˲Xklcwߞ3?+Ic3O_mINXX]q Ty8L ::?/>cXpL&3F;OƱU =>',Nā'<(r28Żȃ<:З/8~xI[4h<6@"6dx-r(m.x׆S:ʝ0i;iiWvxy/e4?c8a1Fhg<(?KB"RE((EYb/ zSNPQ~)C,ΆxȁJGi`H yC7O IsI|X=wfg9yjWgY_Q'eڛw)ke(oa|+kyLc:,}`{/ [RM7,i6a:W?2gppe:kI!:su1Zy~k獗_vTRyY^!aHڢw^vm'0Ã+Ca`q-^]28񛉘q -~ qdh2FkӭJy:ʳ<]4$e:Y=3 "@G9: [[ͧ ӭ[ŲsZ=Maǰ՛3ybqEXE]0Y]V?jeg=EkR<gt %}[cH,#+cy1r?&3YEy2tLYuQǟX:tQ2(!Ը_?;:kIh55\_O9seH[\g)ϰcI [8'8{@IDATܱyyyHg)!A66蔵?)gѱcG1P.(6y򓷲+ȈHp9#;| \G\?FRee_OgSuYwOuW? #^~[@l3[t-'-&k} Ӭ,edb'[ԝYgWNyCB4562E`9Yɯ-lLXt 3rj:Y,ǰq6}d Hv2ag>2cicވټ9v~qϹ';9E5J:D&fۚc yv#σή63͸<ӭW8ӵ$23G>ZF| 3 qoi -66ö0Nv0~ѣ裏bѢE^<&oF-B?;:##~ګuhLa3"'`XgḬ{glBܯ4{g q-.?6-o< Iy(f!RceXϏ[]{bWЬAa7/7XlaeKcY:j2NVcؚ<36En 3L:cʱ oӧc%g<+cg?&LAgm"?3LY&~孬_?uPa0X1n锷:۸._[SllĮ9k~sLk]u?)!͌ ۸2N2a8/]MYfޣvocoxSSb_D=2d0xJ K7_:5BV&nmr$&Wt-ŎX>;)hPX]{akgז5a+~mf`0i3n@WJtxa%drŒS]p˰ʻRS'e)g:-ҭ̷4lз)o}g]hM88P/t2Lr[˘ Ӭ}5} [=g\8dDdXi9J&X'C~Ls3,?LNZFrteLgtL46Ybn1g5 GK7f:61+ޟ?CƹMF~nocS0$mCǓʌ(Yb>O4aAеkWlܸނgY娛m?-[ ~Ī H.Z.9Gyt"c<7$b嘶 ĩ]9I꣣MMLEYAÓwĩhŘpڂcf, $/XQy>?ө_s|,˘>2;Q<젬6~>Q 7X,gV (t+ga>>Q1lae2L?x?'K/=)L|:ugssغGY/:1ߟ?##1Naˣ6'tW|<ʻ˹.=n"I;9xb.V(قʋO&>iD|زewΛ'{*UdR' Ly5E[ygU%p%w?3}qcCs/㿟2YsR2q 1M8S}INY ñeS%"RvXr>2N6l3' 4>1~mttt 3n}d>󌷵~t^emcd&qH[;=IG9:Zq39>Xf?Hƿq2q#Uƃs1gKOQ,O|v-W+yis6l^1ns.^̷yj)(km.Ʋ63uni3Fd-gg9-.\T[ [bbbGXXO>A0uAZ -T6)7qYA^}.{md$_#~g n9Qp%+Fa+8?D!azߚ.'Wls /ƶm 58X9i73߸36RΜ]|^ϸa{X71LG xXyqtYNtSYca}trcHtQίc|(No-ͱfr7Xll3qj568m9ȹg-<󟤂뉱 牭<y7(v{GwŤ[+TpCmLb{4鱺ڍ-@No$@9n^7k;XieXfoƃ3|3~3]>1F|Lc9.:ӷws|͛Et:x-72:ge& k>RзәN['rƏg7gyƭg_g_oZ;Cq2-C7 '= Ͱͳ:P0tہb9q0Ltt+ fg`}vNiYyc_,2tl/βVX:h(m۶͓,7GYzY5dNA}to`c}0f(G]6Xgz)kfyA4:omtM<(CW^?845T[Fv%Ng:c>ge귅i4BLa3b:.Bf>S/v!v.4R'S2<߯KY=1ƅyL2:?MY>Qt6v1[=4A}tƑz̷z>t2?V rb<u96>YS23N6~ slAy+rG=ϲσүx x a\ʰ.|m,O]v[;OYrntʱ>k`916,8˱-&8e,βt.;Wx0ڂ稥/~ .Xac8@]t [?}g>}L7øV_[Cypټ2P:Q,Kz5/0{"! o JOVi" " ?_ !ٳgOЈO#r0wlg2J>r" Eۉ9|ϒ;:vug:wlt\G`̘1eG␸fFNDx X7&|Ą#oBx˻,j!YGMm.h8Hϵ[OWD#$K9!@wxc+sΌUZ"Q-mWE<̓&wnO|yd>;0$t$J0"Z62i(h,r1fD!#cN\yPn$js*(B,l\$fXu]NRXkj ch*~,i]ed\ |N]n4k?tiYͿWSڜ\Mʥ_8<{ viH/<\M%Q^ Ȑ,#~e4ƤUDUE !Y}4"#ѰE[ԩ~^ N'՗ @1$g؏r3^T6Gsl_5GV6*P 4$ Ro4xNhEΌkDy& Cذ4! [;s,Y)kǾHIvͬ߰:jdVF$D_{LEbŦ8vřdif>(TvK\pfV%c09#@W`unY dc߾ NjF6Gx{ɓ'g_X0C>M%!&(=̐d̐O/=UKD@J+0$7DzaݼKYk/;pMtݏ@Ht.12,w@fxf H{>z#QȨv-bՊ_1kH8S.bVھ XpmDm S4@Q{"{]v׶tD:U鴇q#)Q3!vmٟ~?)!G>19a;!C.oJ#Y("e@7N (B,Dk;&5#m6qu遟qRZVK5܊<5+ TiWK1Zhx`%WZU `ؽ5I1r:ˈ$<+ւvd--ΓLRk=34cۆ#@_]ZhҤ~uдCxq93ݮ>{*!K7v,u\D@8[e@TE@ $ "=Z~.+&O bC`n=ZTGtXd]=xy5}AIӳ*{n_: sj'U, ]=L r8X)N Զ"ݍz^U~e̞y.<{Q*?|iZɍn i7~㷂!MX:k j-Œc/TuDoxݻ{?2@HnT/cἾ LL4|yiZ&7V~]t=TRfRc odttOR3G|颢3)=q\LMOE;k ^?]*r>?&*GaoA׾QdžYg{}_7HGJ{G5";n2'y/֜kQi+V/ҥKIEE=mLM`hѢbbb{ ~W{ԺOCV.soySO?-nV~Aw,a;fa]'Kity}'ؑ䏥 d*0湸Y؟XZ~"mF$&aԬCF$Zx_Zk_o0;779]ϛLn@H=).-p|=chs駪?0$15ꠒۥ̔{Nb"bR[c;jZ)5CD@D@D@D@D@!aH{e1xIr_b86z_m[~l\UZD@D@D@0$u-kc@#7$㔔$$$ҦԵV *C~8HJ/z|z#" " " " " ;0$v~W" " " " " "pBLKK;FL*." " " " " "`BԎ |8v!aHc;r" e@mG||<6oOD4u'm;΋ü]2 `y[)L>aR -{;6y)j me&Ęaѹsg3oxtzTJD@D@ٰ;"Zx֬mڡ]vh$|2TH3߫z::t?xӞubDۧ!}> 6{$3V'#5߸tއ>4.Ұp{tfN3xtحr^+S3.LYA7L 6{nՖX2:sv,Sc܈#q={Y=dnq nSШmGnۼ]?du€!Vs -KbڴYظ(Q /j ?w.OXTV-43㭾|m w 9g.mx Jr.c5z_x{Ϧg9?q4=Ϙƨmt׿_'|{<5@TCNOrK $ r;zs[y= kW\gױC>{@a)lH┸ؽ/ Ohٸ.2< ny S/M_o])Kq[qH<{$^}⦼{q[= k1fx={Ww aזnERct^Nc, 9ycEwu L?SYm՞I7~R31{2Kvg߄ S'aM0eh,c6`1XGYMWyx64u=>[daҰfg1ԱO]+{t &d*ള`ʔ)xw6/-C5y6;^} Luƛ8.g{s  ~ ̶jvxdn'ߍ D:dosݪ"0 ) " " @Haaax5(vЅ5>|EfiryZ&ED<M/;J7/u%[[L ĝ;q QݼǟLB*{ug;90,'9;W|2L/{i>#;7P.ѓOK sng0,g g_p3܂hŮkuhL,q{sp€b=a)q1z'cpE^தw诰=n7f6t{b]TOy E0ǽn➭o!5F4gIW.ߍe#{njpӵ"(!ʔ&" " @Hjk9Nլ׃S zr's^AC)wK Yb;Jd*{ὛzD!Nᡵd 9/U՜&pә~1.Y'MȪ9 DՓU|?t% sG8 Ol~iEk\6Zm 1=̩#0虙 ZNvx*[9g0;lGg➻/9?l[o/oa9;8(.?+@|֫!aH<迹*.@hܬ]7|`ָg8~%?xu rޤ MO Mۗ+ik~"ߵp5g➱o5ƹ\Ogl`[n`\Ι#,kpN{./sG+UAi0704 7WSuNYڱOQQK@GUG ;\d+a/!ݼ2Y}nvqymLqx/r^ժMh}>>∿`Ql/x;A>]w%t30#n>uw<7'kc:߼%.p*_D@D@J!0$;pI"PDy񌹷~H,QU;#\n/?\1@m{ߘ'.=9w/|F޸Hjl}g$>|cD.{1;!;{/ |2g97  D6+:h?!p䍯5Q^,[)_p]ߋq ӫ{ ։ĠK}W۟U:7RtѬvYaac<ُ5`XtȖUYL8ṪT(rX8o)-~AX%'zTP^(Lqr1UR\r/Z|( %N`{VG*^]e~!;V1 C2籬c" @%ٹjѡ;Uu@{iG:(" " " " "PB s VU%" " " " " @Hw3(y!aHꫭ%?T@%ޑ,X=(y!aHuD@D@D@D@D@D@@Hڑ,"-" " " " " "@!aHb$" " " " " !N $ @ ì@ C2,,I80$C|}(V2$@'dFFFIPD@D@D@D@D@J@H%SՈ@'H" " " " " "PBBW[Kh6 C2$Y#dfff&q2$C|" " " " " "pB鴐L $ Ȃ (GD@D@D@D@D@D!#B !,t)" " " " " E $,,5]GD@D@D@D@D@0$4" " " " " " D $ I#YLEjD@D@D@D@D@D CR;" " " " " "P|B(>b$" " " " " !N $ I=\(V!aH+1)' C2'/" " " " " GJ@80$<ì@ CR?Q|FD@D@D@D@D@D $ fhk%U"" " " " ""BԎdfuSD@D@D@D@DD!KDD@D@D@D@D D!"énO $ Ɉߟj!v$Cd6" " " " " %B $ IH\R%" " " " " !B 2(" '@F&DRZ<|m\{#" xxU%*ZB8b,J BR&/'fe>Z@!d 5TD@J!HqVDFwۜ\ ߟU[fD@D@D@r C2b" " E&;hzB 6ZeM0z^W(*k}T{E@D@DX !G[uX"*WPB+;" " "PBM'T]7oFbbbUOFt^,2E@D@0$32Q#E@B@%WV u;Or+#ŝ0jAT|h4{;۶_Q{P RD $m nih[.yg z+'cGQE~z!|pCW("9&ysp^}X54wn4|}{z݊s6g>zYڶ.} @KKڛ}VU~fffHxaC\)p )[<=F?pCPYJ|yŢڒSJ $v$euz" $?kQ&A YǮ_apZُ)>a;+}?{1y_!!p2tlvؼc?qm{H{|2>`,Nn?ɌŻsxoOghs^7FSŘ{xOuiR!kLQ#5:s(}({k3V`GR>ฬNx޶E-5of >@ayV^!믂" "PTbS0sW^c+G#u$m v+V`G١㺱?g/-+`i+1嶹vˉؿ} >ur{E٩+\CaW;lBQsMzKQw74{3u=-l/H8ڏbѯ}e폽и,ǘ_jtX.\p8i_|ᣑףIǣcs}AAѲMK8-Prֳ42ތw¿F]%o^%UX! " "B_RE@}{q6SJ&b5C錅 FC~goZVk OУˮݼz|W˥[߬a\\Qd j.nxʯ;raq.1(u#Hر3޹q߹26YrBy\DB;3ñxH TXD@D !H㬾aͺwx}`gwJ 6-g°{''ϱrw Ҝɏ}x!ⲿ `*Dn݂96=@ }aH+A;tQ|.3*Xq3篬Z^Wgro?ୱycrR73cwZ$4#*-{Nr;RR'7LpX )iinL[SMVVXWY1^իʕ؞r*u&iGEU/1[ѱ x۵\E}nRe}[ܴj=jU:'?m8`oCNW0t=Ny⽓mٌJRzfyX`\f^yEgll,n݊ڵN)u{,zǖ;`D@x!ncx|Eϻ% <ՇAqYG7t/ـEa?`R@_wuuQXYp+T ٫CNaήVDD@DBFX8o;LL4Bda^,aL &83m2ZyW ]vaÆ ؾ};RRR,ߑ<&*#8/ĠN:hԨ;Q80$@U" "P Ј\l4hmۢv屛93pOPWF\A@HqT/D|H[3bsq V7F`]0T+bkx/j荘b/Sލ.=X5Eov Mn*{ +9p՗QtQj(2+pyw5Ji#լH`ҤIoѸqc\vev#+D(!#YU@`xj2%,I9 -^}*DDX˪lT鳏߫ғu47g?7G%Ј1Y-3^ǿ~Dz5} ~s|k]htHU,m)\Ύ;"661*7G>-c[%[@1HĔ75>g\zru^/<72 E"m܃wx/'SkGO=n芛X}-6]^1o9 ~޻.5V&ބp:7QnDE!:q汪Uy 1c <<QQQHKK+#F䂣\8(%BbGR?QJf!G@ )N9z]7{wFO`{r'Қbd]J}yCϖ  ?A5q51٩HnW f5]A/}]i+1s38g~z{.X@?]{݇f\prه#yܽ.s)4Zwjr݉dlgE#G_Y;+Uq8Uu,½"TQ1»!>c!޹K P>$$V{_fދ'a32\ޗF+‰/ųM^{gҏ4`7ҦQX \pxzK2qoluUu x8+7#<=q./gz`2hf܆_Qy!~OD(JQiz%@&vƎn9WO =]}m Q'ǵq hh+/;ѭKt!95-޽9WV5cILt̵IC/gs!DVC.AٝЮy26>Qx}m\|$6mKAa.#6 hgz65jvccK@q\x; 5^*m"!Esv[mׅf&qq ^ivRSQ3 5ןW 8FsFRMwl. ?G-Ŵ6K} 9Ld$%Zw>/1n =dxU z O_۴x_ixoꕹW1HOAA*D@D ${ '"Pvl?ܑ`غfLY5~c]}a} -gNrI҈r3߉3$C. n-ΠH͘CF<].t=;scy.gG^v)-в% pꡟK/g9y\^s+}m+V8h9 < U+N2{)'5X#ݬ? 1Gz c_ JwfgƜe8)zio3nSq%j[ݡU<տZgnwn"hD2؏}΋üŲxꩧpBx駃ʉ@i'ޑ,P?cw_W7?Ν;%Q79 r=j,c KMfzIB Lܥ6>ss Lla.(XۤUr]mG9f:Wxw_ٓG]N4m.8,Cp?/bPלõ=Gg:]z6fD-3"_v;],g^vmqw!n1{/ i}W9.g $eMu٧iuAL#_@g3CNowN) $5(xٹxv٥:wsŇ/}ĺ&?Ƿa7qJru lZ ))ٟ%+C]XĔڴex*d sXS?+F;wc8|3oi:ءx&gdװϱrw e65ݮݛO3Pahk҇ΟDž>shQTGśwp7 QMs1abJD&m=9n9W rۆ"poRww1}n["Äś#01耎|7WdvFja‚Un!Ήi> $Z* 﫭 ID@D, CR6@/iD Ƶ΃D4: 4v\>3ۙ|+AC2rp n+a[K4lg|FV8!Nx*._nc㤆 qJq[wX(u)>bW c[_/_wCn}0ym"ރWlǏ~Խ=.i1 1h~5[VTw8sy}`kwn7aan,'1ݷ#];rO畫%?v_7O^!W@ ?ǎuZ@kG/e䅨vh{q~ϻw"^&8 4%ڇ5CΪX\7*C.:{\xҵ8|[q1+hpu guzc^RB 埂䗱p^ R[pٷZ5ۿ?:v4\j ЁThUazz:EU:.K. 3­kn=w8+"@7#}%>}}>+2MG}P\eJ<.*J#$E۾y`dn{[Isrl@}|89cs2=Z]jlc[w+B;>$fFͶ95Ntj:'ۛ[nI۱#@ N@83;G?Z,/ xB珄 @$9rvs9nl7=\۹s P}?)~;{﵋/x H@ M$4-{T/=ywg7T=~c@%࣊ZkA.BF$;Ed=@$2=9wh /93NZb&'!@zю~yKT+yN' !@e/h $>O{@Wd|+I   $H6{v5  %D !eo@@@ $HޞD  i $HuH[@@@I.3   @5I&   @5DX8    @$/I|fG@@@I }d   @IHq2   $I^ӟ   @IKKKiM@@@T(   @JGD@@ D G6  $#D 966eG@@@^ $H^F  ) $H)  T @4  $&D H&vV   S$ɉ"8   @$/If_@@@I+++v}@@@ $IG2E@@>$H2"ه3M   @2IZ-ʎ"  h@V^w۷x`9rfggmjjT Ùg>@" $Hag@H5Ql[n9۴iSjHV,w2P @@(#Ĉn !  kz!'%UY#! C<={Az@#z=n# @;H8:َS?β{MOMHm!B @8X f \ }۞=m69 #!`Hq  0 q ͛7g/!B/p$Iˢ49  J`Nm^Ļ.zD@5A@ 8`xucGÇܖ0򣟉W-Sm @$_1)G@`cWN$--gogKuN+D v6$c LV_LOU# 2<+N9eg%UCrI@-@(/#_yMyk~w,4;Uuaɦlkx3+ [ >! @[s7tkɃɍ~;&x`OLd/x$2ԗ^)AdUp@`H_Cz6  @Zct^Sղ SSSKu::!T@ؾ}[VBH"uܲxi'r9TgWBz߬߬)@@dտO1 K:kuQk>F3[Jar|bvͬuB`$ODz ( x*?ap¶maS[ _ﱰh3e\w; 0IUy@@~ (T`oN6^m[Z_ڷ1 =9>٥H}mLY \S @F0dIޥ333 4bonI@. @(~^'9 "oe _ɡQSmkBW PSگ|Ͳ-RHbDrr2xytR @!`Rm/Zr*\#uZx3F"H=kIB4$4Nf@Av`2zmZxBv;^УJVr,C`t$Gp'  0LMm&zL T})lDa=<9?:ܖ}U-[`"U8  @QঠS#l9:ͽ]f/zízc&6mzXL0 $H#{c  @>p|Qjc=z*ȅE۹sG=~Wm`2<'D /; PƢ&f*-ԞARܗ+,̾#TgqiN9egvւj[\nPOi v7o%@Hv@6^|Tˣ^۞W{!n |D*Whkg,⪻ &IjXk$13  @H,F0xnSJ5j2oqL8u@-rjr*z ( a6֩%6`r&[ؐ`Tm $Hpǀ  0͂*=LfAd-!l߾5⪤ɾg`+WVF`P$~  4"AnӉ`ۖZ}YZY-zUq7nqݦ[\WDYL>,E`X$5rP'  @ RVXE`1׋'4bo}GٗxZ-!xWA0Je @d !  KVAd9|dRcU} rqɦlgx3kocmknqU=͵(D 933e@@bAdu6붏NV..-ܦ-6uy|k}ՍcaR3ُ`RbO;K$$D y't\U@XUMU}Kkd27=l[UT{L;nh!H"W  DZ`RUS~%g1y0ٯd;$&D YC㉝.  D֢dѲʺYw-[\ĕ+ANl:6>\Olg\r $Hyd@@`8 "WHP'kyY?[\ukbQzdx{@`G`D% Hݻw]we9rT7¨TڨT_s٦N;9o't}}v 7nov/hٟn'n;y]zEN=_]0u=ٛ[h4%!` $HCA@t7Ygezԣ&;Ȭ.2r>rSOmNi?j&¦Ëmx3ߗqڲM=iA';RpLVY9{{>bOgg~Oi/f+W =/ԙ_Zos/ܺX Sl\tn^ۧy_ګPMv_kü5۶=U K 6 1,3#vD8tsAZ &`cZ!@?$u K@Ado\WA..ShoۼVN\Wׄ죞-+gkw1ğ9~#z-#&[םlMcT|=y]'Yo~gνg܎F$O^}o}'e?n)^7;="lGR/?:mkxБ-33'ddjldrɓ(@I\}t1߃@@Paϑo|~mﶟ|vƦ >}ݯ xW?^W/_~EX~|}H_3g}yzٸB}sw✩V]ݹ\Ar_9v=hzdXS+0-NniQI5.f/?ix;>߾?V{__wü~WnW;F;v?~ٲ|{mv#77wooOmu_'4}aXcMbvpZ$X.,L@`8^ P7..6|So1BsnߜeO ̑ك«?{+)a=~9k/8]noG[?97wno^e{+w7_'lc/-]>vj|;~X׏M7_+~r=fo%vb-\=&tzvڎ~'[98[reݝaD2 uӭH?=_ѽvOgۖN[zU/v^eG~{c7gx{om| ࡝?`vg_g/=g_E6By}7乶3^h| vR{ZIQIw;%hghH66{=ٛ{ %&6WF&1Q@$T @SG76s¢Z]객I`=XSmA?NN g?Eu 6O *9[53wP_?=ѣ_5{?n]E{lh7PD]w~kzL*+jٽ__|/]t99ڿ~v6,8-Www-{D20?zFQB9vd6åa {WY٥~N[ۼ.}o5[Z8dsK/}|h;vŗiU?뇯f;/{=DvfuGG_'Y0 bkfS[\g?5]$lfD9H"^F@KKKuj. A5{a^? 5/K/660`fOzmÒ#G0C؜f5i}6G25zݞM҅|Fͺװ[`9]:y]{?g/|vg>lz΅Lyo"Io%]_A˺;-~و䔮FB@QɶS1?vԴⅵikM_.ܻ~޿UAlohgzP-weU/[6¾(}llL/ Aj_Q[,V-ǎrl7kBT$Aŧ_ [BC7|I˂w}KwWc_(-N6.\ޣq;{ηw=4?,Y~g{?9k3&ΛllƾW_d]!_`f<Kk~jmςȟowi{? ~Ƶ~XhHJǃ{׽ :~nNv4 ;Y i0*G,ɯ>w(0yxMmnɮ~oo~B/_a8\<ÚڐㅿiWp}puhe~QX7ݾlwfy$n;q5_ln olqN:Ԁ_\߶G̻=mv28ej6OCezϩ/~ox- S1 njn5?)/ >g -7pf&X/W^L'?lz3)?ߞj|5o{wMQ/f;(HVQO~ hI ;Λ0ts쏯 WԜ\846NK}FxnYvލl6fOZ/RHiv #o2@IDAT;uG|aW #69%?ZaW̗M:a2S-UP۝-aYIOڒҗjtڤh$+w'+o:=9ޟ\xnο_wS^e&GNs-t%|:;5;ͭS <ʤCa r?%\Gpn|Kbķ&ԩ_^eG#l[^ s!;nM^x%\bsssyM65k?7\~-/S &Ύ<`]~4͑#б@_G]yG!:>^W_LQO{U㲬B~y:Lj"E>H&?o1[N, 'z֚ͧ 3MZ[9wheVj*கMldsY՗Sg-lLxF2\LN;7ßam>=% pc 㟺y튝ȋlcEj0uYdwnN{ʏ^YX[\#C'D HНt8q@w}w2}%Ҩhz[0O?t \·nϿ.}hiۍ_/l{K~|kjs]z9y,մzkxO[\;*u#:@d FO ygifX*(>&+ע]οrbݞr~eۅ¾Ϲ2S{rkkY#rz;RN⚲@kGG*8r;ν $5vDW\Uoq #n!T {9Zӥ#@߉DB@q$׉0m-JBH"s{(: +5Bb__.-. z@dǘG@&F6bujx#!3CB@LyT;n՛x'@n7uff&8G> $H>Ql @!䀩s7ٖ9lL@2vIl@$@@@j$Ѣ@@@K"8#  T'D v;ah @Y3v $+WA@@@ a$Ig(3]G@@$ǓOD@@T(C@@h*D v   m $H.,,    ţUʈhO@ M#??hǎظfSS5uX՛jPN"0IlgN50jϨ'{sLN=u~mnnfggC 9t eZE`4uiii4{4#p$ P@~1_&hFT Iu BCLNNڵ^kڑ#GmRLY^^n!l:Q_pz;7l (`ЦMm۶SNY}?kd(H"䙊O) Er}targ.Hp>|؎=jzɺ! }B~xY:\rIi <*6ol[l[fJ϶U6C"D 9$ǂn"0G%ԅD*'Cڲ:茏VyVQx@`wt6*I&R˵<t$Ib$!@uP]bD|ՙoTK=Y/ bz@R#vڨ]s}~LMB $H@=B 9"V {z A@a|=p߭>g<+l~N=Xԝ$ p$|{K@`$nNE8LP%@EHa:PwlHw.N5cǎ`)MW+G~?} BH" 0@Q B `h:pvEQIg@RtۜIl@g{@ozcz.D [H P_hr](pOu[P0`ҏu@R}%!w $H‡ r ɏ@C@eI=[jKB羜XO @R@$^zlQ>eI:I 0X{zEo@`$Ӓ(|Nrz'J   @CuEΰ0  l@$#}}@@%$I   P@d5T   $IɎ  T'D 3՝0  $H=f   @uIHVw   D Y9    $H򲝊A@@@$G@@@:$ɩh @@H\ @V%~}@@@:$ɱh @@H\ @2c#   HVIc   $H.//d@@@> $HNLL   /D YGH   @$ykk&6  IH&qI@@@:$ɕh @@H\`2'L(  oߎ?==ͳ=@$Il@җdǎ3@}Sz~r-vޢsN{#yRN vow^5 xխ_WNjWmr)vW _׳2Wھnմ{39òfCgdB2=(;[Luٮ׾QP{3<.2UYtnVkc|&s3ᗿe;t=OmwwYe U? ~~($HQ8 )@GIFut^ կ~5P1z`f+8Э]w]G/%Q0~(-jOFɼE [buI)T0DRm*H3wZK.ivB"IjZh;rmiU-qT}ǹױ}?o\G6zyQQvR%+z9__IOzܒ[Zs/Gs1~ӟΞ-nKV;C.D _$@^/uᭋqP0M7ݴVՋ޽{kb)ŶFn46o~Y~<A -dS`kq4 2UG $4Zi's UWV火F0(XQ N]TkAڮjO˴/ "TھaGyjg}|Qm꣤oLyaTSD~6O2ҹ}ձU0{ٴ[R?զ[o9Gu<}4x_:Վ1ڎ~9(pm}$@P@{tM+mEz>k8tKL%Tݺd٤v= |i^6LV?VQG 4)Ѽ}U Fj_ڔDJ]j?~dQ=-SH/:~gײ쭷jGo镃^Gt[>jn}g՞ΕB*3nm5疞*)@[ܕsZv[_cFB`"  }|Y.)`'+Ż8)H蒖\tW\/? @,*mC 4>y(?zsSAk +p~jSA\픩FITod е_qB L@L[nnTbvQ# %! ݲIIӾ^A OxBi[?ovȭt\d㦏S}мtIAzGZ琧vm\P0'm˘F`X$  P x%kż.V t 1?ZD R-8x)Qyjh?Q*pS j<1٨kٺӋvoE߸,:uY> &QR]f<䬶n~?}[:|Zmȏ-@Ro~]M::G42'?<1 $H  .ȕ4`J;]$yU>oKEhzIk=m_Ao[)Ҩ'ǓQ}TPs9 D)PPRJnq-SW9Cm[־(V@=h[Z2O_z|KzSF'dF356Q/ڧ2mrjԶWjڞrT0c9n;Sh=>yRfa>z@ Ѕs6[ne-^Outѯ ng >t[_,:q*źFt{.UF=*5=Qķvk$D)(QzO}zږ^0=O,eL]mW8~˯Uy-U2 G>Y}k~;,kUH8y TTVu߾Lr`Q~|-㣾ƁU=e6Q#>Z4?N6fa>z@Ѕ.\#]S SӈU "r<裠Cm+W#D>:|mW)T?m f\I>zZGm`OWW7`D}U[ H׼`Iu5vLtϲSrO~kږmk;ꗖvU?zِFo1;W$_U_~nͫ:_j?,h]%y|yU2ig uC]Qʏ( ;J{w|_ (x.5r |퉪F+@PNe|.v7_-jJ~>˷Fm \(xԈU(@Qpyeծ}NS0~hF+D}V]2V_}SE@*)8R0\}, ǼvVmSNڦ}T7v]틎, \QPY%˭[Z^=:״?%M9iWݮ :oWjdT @R?$@^@W࣋|ŵ(zw饗fA/ D>?C?op^}p)ʵvH֋mWAGFچ~+i5rAM;uFQ"y(Q~hTVW%ՑqmQ?U/VG)AAS;~<}}WV}PS)t|TOu,UW ܓJ-WMy*]CѱS`~Q~ } @+RLynP2iݎ4u׹<UI hEȺt\h?],}s=yl (ŷ'%~~mc94K (`YU y5d#ڞ+~Y(y`>:E~W%YyTTWeUlW_IV)>0J:FJ2v٪?,^7nʋ>:鼎O7D4iCQ֎r),'g$K +A PDًzS&hHFB5?5S#_"U>~mS6U]>eS;Vcvò*QO(  0~KH`ދ/xArBۘUUF$+!@=ۧR_-Qy*%W@^ $H   0jb@`U#!  T#D Ɉd5'   H"dD@@N @Tw   D Ɉ$':   P@   P@X5Z   v8    $1"Yժ%@@@ q$InmM,g@@@R$Jh @@HY @ryy9c̾#   $HJh @@HY @g$S>w@@Z @rrrj7C@@H"?=q@@@dh@@HV@2Cώ#   $H   $H֢CO   Й@Dg:   p@I{M   @I<#   II'8    $HtZ   ' $H   t,D 1+"  H"ֵ9@@@$ənX@@@ H".3   Ѝ@$vs.   V @r|<\{dC@@z$DňdE@@$$Lf@@@GIlGg"  @Ivv@@\ @sD@@ $Hd3  t.D 999ٹk"  H"jkv@@@$'&&:bM@@@5I|ǚc    Е@dWB   F @ryyyN3   й@$Hv~&   H"4    $H   $5ؙG@@:H"\5@@@$H5ǜ@@@+$$v@@@IDX<#Yt   @d^__   $WVVJaP @@@`}$I\D   PV @rqq@@@H"Z   e$yF@=@@@`}$   PV @,{:P@@X_ @"P@@(+D 9==]փz   $H.--b@@@Ie1   @$/YD   PV @,@@@H"KP@@@@xYS @@V[AG@@H"e;.  T @raa4  $D ɈdJ4  H"e;>h@@RH"\ZZJ防   @O$zH   @JI+++)S@@@dOi@@HL @rll,"  H"䭭;h@@H"Y@@@dh@@HR @Lf@@@GI=Y@@@ =$I^މ#  @$WVVz'H   @bI|dbg5  =H"dD#  @bIZ-"  H"-#   $HNl@@z'D 3;h@@H"HȲ   @$C   @d^O   @/$yN/ND@@T$S=7   $ɩ^&   @dVK   @/$zaG   @IIYv@@d`i@@U$Q=~   w$ɉòA@@@`T$? @@@$omy@@@`$Gk   @/$WVVzaG   @Ivv@@\ @aM@@@ /D 999o@@@:H"dDó@@@$$vR  T/DE YC   @XG=G@@*H"ɊC@@$Lg@@@b$ɉh@@HW @[[=s@@^ @z6ZD@@ Lس   @G   @d^O   @I|Gg !  @IIf'2;  H"Pl @@F_ @?C@@@$#;  @I@@@D8    0IH"  @$ Ŗ@@@`$y!  O @Pl @@F_ @reee${  I @rllOl@@}$?!   ?$Z?Q  @$Y!  @_$@@@QH"\^^cȾ!  }H"}Eec   ( $H(  [ @rrr߮l@@Y$Icd_v @@6@ @r\$   0#{h1@@@7I|GoNZE@@4$ykk'7{  H""   $H&x\e@@@gI<#ٳ@@@ A$-  F @ree7z  $(D qe@@@ $H.-- @@@$5ӚE@@^ $HҐ@@@$zRE@@z)D ɭVt7hn^nՁdv=_3z{,P@@*P񖷼c2XmE $};HX1nzpkhk|j'iTE6Vq.2M@էO}rכ<^y'n xO+x_z֮r{@@#M>]?i7,GT_r/S2>r_ϫ?\]v||Q|>r/ WtQi@lL`(W=qEuƒEڎ>l//UGJkZ@@@`cHyX""[}⺾]qtNn @@6F 8tGյ|>]7[׍ۭkk+1ζ@:/ܻqo?^Ov<&G@@u'8=<^V4m\2:mk>}; $yZuyެnF2GtvtuUWɃHo/   @|qfvȢvܨ2k7:~zk4\H3Nk?q^+WNe5 2r@@|S|,qOns>SQun^کVW~xr|\ON1.W[LJZ^RNn?^F  im]4F\ie>˗~w4n Nt_Tܧ[ }|M,U_rM{[}y$!   ܓOǹ?.tQY\g^WMSy\ߗ2y[H@:Td;S2Wi/[/:q`,nSJ~bh?Dj0IB@@е's5Okx))״+2JqFI̗yYO*IH>**txʔ|Yi_,`1<.=XT?_T/_/ZGeJ1ߢev\\ǗIuLФz>_!.ʵݢr5[eVU|vu=-SQYi@@荀_>ZO:Csk׍kZ4l,_gɢ */Or}\Iu| sx_'xuvM $88j֖W?^Ӟm?}\Y6ԖQҴ>^\]%-e>O  NjUwq}jߧrI(y4[n@R-8@:ikmxfܶ*+y;ZMLIaѴeGsm=/׼Ә_@@觀˔?2 2fӾ/2Ͻ|//ZdQ3@).kgZuj\u#2r\ɃC_/}R=%r_Ӟrqq   e7x:>15Oe|j;v)vՉ).u+)OͫLO}PBre޶浮^:i/<.y_^k^EIyҼ@2:\ZeV޾x`*ejFU^Lm(y<ۏ˘F@@o<^(O+U?}޾|74ڈ|,{] $SAŹS=xY~Z:@^ߧCQV\I˵,Nޗ|:Z=W|{Ӎ  Bۋ}^e<~2M{t:Pꏖkz"V<`χEܧ˽|E@@~ (FӞ\=TOO7kǷ,z̧mxf@@@`0+(*xOkɽN^~h^e5ϋʼNLJFIvH3Hu f<5h=*׼'QJ)U6]{\˛E˼Lz VO^ͼbQYt7NxEwVuӾԲx}qx>Jmt\mk]-/htQ2   @SG񼦋\~r_u-nk{\ӞT/x*Gxɪv{ u}}Z˚`䟃T}S~R} 8}s&N\GQ%'r/'G@@ AS<^xc A<ܗyr%r%_'2_Ӟ'}{Hjg<ӼǹOk^%_ Tx:̮޺im+^Ge>RjG/mk>kHos-W7J@@)k8|5죸B8|^xZmj|:j'_?_|6y^y_UlY;亍Eԁ|e:Z^&hoWeWܓ{=rQ4a22J>qiO^@@@G[8Okk|{VǹOr{f~ʋ|/k:wIu҃xYWxZmx*WRyJ^WuʵZ(U+W2Ͻ(W'_@@@;[\e:>˽sOkyQ^\>}|iuoP~AՁd}*^q;B@PJQejS ~\/W>>]̓   ?8zYӪfx^=N}:my}_<_s_'_nIuluyc6<t\Mkxe}ާkZ|:E*#!  @޷t5ej#rZqr_(RtcI_/qfӾNM˻ $F;//yuT&Di2oۗ{^4 Vm2%r%qi%ۘ;y@@@w~-[h6x=J^G/u{ϫLČ IDATio[e>ʔ|܉zez^@2ި:<O{>uTӂ@Fͫ\))ϫv^.iJZG^N  '=WO+O{Y+P42<O UWiUקQ޿V $x8Eޙ:ʴ׋xZud~Z˵L)m}T?y_y(:h+2M@@@`0O  r\E)P3Zׁ{A@5xrXeh4(%l^U_ղ<뤦|tf̶~"”_&5:s>~tKryU}bIͽ/>ٓ'si@ | ~׎ҕs2uwju9sGϨx"9z^K_Tt2jgxT/տ,{:9w(oq/ukD@ @{ x[rϨ?9ZϨlAeu(OnWI]˒?n볏ҘˢKߣzkIuuj9 @Yzy.[SsyE{sk"%EKxY.MZƣ3R.~~vZsγ']ǽm~N@ )8孽_5KU;1uV_CYێWIp.RYRw;:#]ˣ=_#W?h<:֏ꨭ;un? @xmwx5 Yw^W=k{ByRg:WqZ5Cu]^Ό|8l=XWўF@ |/na7r@ @~ejgO~Ss~f_d~:g;=~[EL˾sG}sESyz;=UsQ}kU։ @ ԨZF_ukwvqמjr`1vTmVwQZ9{u??ug} @ΖQ?.iz՛Mz[yq=e4kSY힣^3f2:{GyF @^@._zYKsE kﴜԔdg}9>S_DKYt}[>辢eZǾ=u!B @G>dug=yuڣ+gSJ~3ӫթuy\; )x瞧9K@  u;UԘ_ufw{Fֺ-u9ZGuzFu5Zښ_յuEk鯽;94@ @F˔o>˗玾'}Z9:9s(6zf+-B[}Gwv澣Ns/rg~tߩg>N@ >%R<{^juwLa}6v-Hήe^=9_s|h @-^k3zzөywo;>k;U}Tt|3W?kw]s @xmB7^ӓ8̻wF>볙lu>1:jZ枩:ggyz @bz{;}o2W֩^ӫ{ٙ?uL*f^}GsGE @%D#oWtk۽OŝΞ1wvᄀԺ鴫s]h @s\]\mG3&=+n_=gzO= fֳwB3g7g< @xOlKgYyFzoɿsQyoX>y@  \չ3Y][|iV>{@ {vUOw .;;:{}@ @\vxJUWQC @K uέB @NK]'1Ӗ{6Pc @ޔ]K]<O^ݿ9O @Z9Kcz%ݾg/ @ ~!{?s4@ @9jY!b?yPA @3= @ @ @ @ @ @ @ @ @ @ @ @ @ @] MӕIENDB`davmail-6.3.0/src/site/resources/images/osxconfirm.png0100644 0000000 0000000 00000044024 12564151557 021612 0ustar000000000 0000000 PNG  IHDRsuM IDATxwXv"E4"`c׏QSc&vnbK؍X FX˶qu\weEٝs̝*ʒJ+8M?]Wa@ :_qz71=A:-AG  +++0u$oն!z 0uTm۶ Opn-[Զ!z {m30:SNe?*[nh^B4gϞ6yTegg׶!z iذam[WSwUƼ`%wLWy3;Ly*cn0 +@+0g1u4&|:ܒŘܞLMC`OL찋!p{S'@bSa]< ƌmca`0 |(( C`c0La0\a0<^`>ޏahrTZQ۶ƍp{ն9/)++;rŋEM4lҤI˖-wޤIo߮s9M/^4iҺu׸#Gh4jfk|Lرc&MBRU`oMwUE,GKCնQ0`Ubb̙3>|EV(8vU]]]ŋ)S_}=|LL EQ**&&… yyy111΁111SLIJJz;kK.K,2eB6?ڝ<ɧ|Z`m۞={V$kkkwAKKK9~T=ڸqc|=""B? X~9ʕ+̙ݭ1yd#㓚zq8ṣG?^ZZhײeK#wsҥ111k׮ݾ} NeqbA2?,TQTqL JKK`…Æ k޼yp9'˗/5=\.wrѣÆ |Ȑ!_~OHH$$$R\f0XGWx␐wwwww7n"B3f͚5QQQwE1bӦM-ڶm9s%\p...۶m :uTp:uR4<<^'wz{{C =zJ ߾}ŋ ^)t޽ƍqqq"(>>ӧO͛`ƍÇOcbi7kwNrqq(*))ҥK觺Voܸ֭5m۶3uT??qrrB<== 99YgnQs+ F@n}Qlt"8{ɓ';wxռ={O~~~iiD"a-xi@hhhff͛7ϟOD||ɓ';tРAnFDDxyyEDDtaڵ:Ժ۞%JJW^d_9w p QFi9c\IHHHMMurr8yUڴioF;Y޾};i^bLsJ5iҤ˗/ѳc8q˗̙zpT*j}ѢE^bŃڷo_Q2T 64ݨQ#`FD,M_"ƞ={6,,,888//oվ87h@$de˖q8^z";s̶m,--W\YO;wUDkIfcc@"G]ۖVHQQ8hѢ1cƐ$b > a^zѯ, +{- jСoMjax<ӧO׮] 暇uΝ={1ںL.Qi(ݻw+7 uҥ[j;?۷WZ6r&M.\ O>.X[[>|ҥKؑv>yO>1Jݾ}[Rup|Mbb[AS x.\ xiiiO>E6Tt7_vڡC`1/h!;+\vr%XW,5+>qiӦ?~[nOF#z سgԩS+H6lp]ׯJ'C }ͨ_E"̜93//u!%%='77~ԩSܶlقY:ԩSLgOhƦ&0L~~Dzꈈ5k >=i$VMZV˗O4 F.-77w=z[o阱@0Q+D uFok^@^$+Du'O<~QIII111+Y7._˫e˖U>,GG:%l+9l0GGӧר=Ҟ/Iq[/4@>@z I( UZUb8=&9~H$Z|~ۮ]=סCZhaÆ=SNuqqyIu&.xqbbH$:zA@>u¿(H,mrTL3| THW5bQӇڬY>}hˣSy@$3ouӧO֭Z‰$w*[n(|)bp4o﫯C YѣGZh1cƌ2vZo޼#KӦO>Jk׮HU:u*1yԩSzyy <877w۶m۷ =z`[S:t((((((ї9'NlӦҥK+AQl篿z)R',[f͚oܹs} ڨ"##==='OP(ѓs>}̚5˔rXdI@@ܾ}*~Ph@迓] Hpi5tԗ -8/!HT;߱G1c.\0z#Fh?k֬YdI&M~7oڴ ݻ^C.\xmX;wjժC޽{̘1J5(fyɓ'-^X*"DDDիnݺK.͙3i3g'ҿ\paNNN+Uʜ3gP(tssxA?ޱc[n:jذ!d ֯_tRaj'|1pM6U*_lgHHHӦM`ڴi (g$zIT;88-NұWRgϞ1cƌ=hKZ'gڴiM6m׮)ХK?}ݺuD"6=y-Tm:KgiJ-*MJ {hh_wHW ի?//O.ٝ={K."hgϾrJlliӴ31.߈6>>>=JKKرի?-gLe9\T*˫L]XR&zX///.r|@eE4uܹ@tEw#T*iBb~'vYzxx"Sa bB_ZUR6艭4 ;>9/pa輤ݻrQS#??㹹^~'6mڵkWii9s0tM$IDuZcZpOw:TPWwD?5j٭5H֭nݺlٲ5k֠ @j>\2-- H… aaa7vwwOHHtvv6#F[n#%%ȑ#P(~琐+ѬX[[x4]ZZzȑT=zq$IdȡCڵ+::[J}ΊPT+tѢEB}Cuq=NڠlKJJ*aΝkggT1>Ļ즔sjZB Pe(G]^x|ilW"BoGVVZqㆇرcM9D[rǎ |^^^aaaJ9}ڠ{7RJ޽{aa7⬭E"Q||xzz@rrAt.7dvQQѺuZSdL})s *vJ Bf514  K9s^hʕ+P&Hθ "Ro&O\Q3|UVM>ɓ'(e:_">{lƍO<9wի}}}6lR&Mdeeue.۲eKb1NmNz,k޿x<USr(ZzYrƼc|aŻҼ*̹c:pկwUU)g1 /$''wiN}///޼y30lr˦=z`dÇ?ƍQM񂂂n߾Rv 1VxO>Ez::{:i6RVhTTԥKnݚkFOˑd| 1˻hY%u =w tMҘ}f䨨xzz^~/DSӶmGEEFСöm5kVHHȼyptkLA;ao!Pmh Uf?,4er`0le)Ra ޜYbugZUӀ"KP.MjcG`V=w@ O"Țy@w`r4,4`> j*<_\bӆeY-h8RPf@Z(; BoD3 K 14b*xt7sDe#\)Ѕh%M[Oti*ah552>0, m/ 0G+eNPL= `A4Y:g`9Zjpθm]TC Q RS\f؝ԛn U'SU5s r -)ٷ(0{AW0͟?;dM}gɪ3CX-sh( qe|8ԈpHM\Z(:T: Ih.KH:5Uq\>*>N}p8x$I+..Fӗ۷Ν;'NDoͪU&Old߿ӓU 3'Fw€gϞ޽oJhի?3b߾}^^^oWDUB_&?? VHD={֤I+nj͡N bD"H$B˹6mڈ#Wfǎ߸q㬭u֯H͛7orرN0 YP999;v[i ͛8hР tLEdI,Y\Y,X0qıc/ܰaG\xq- u˰ѣ{~v횣-{qttLNN6/HҒfyyu\?W\IIIAF&%%9ҔǏA=wGz bb $%%mܸVѰ6p7o~H1rѣGwmҥ{ݸqرc { cǴ[nҥmڴٵkWdddDD!7n(--XU,:tUZ=p@=2ITAy 8us] @.zP233Gٳg>}M6]reٲe3gӧ'$$U֭ݻ;wUV}ԩӬYغ!!!CMOO/)) AV.]:w\l bQQQ~~Cǣv4̙3;t萑dUVLJ=~mܵk?l 4d;w?eR9lذ={k[2wܼ0k3gDX2lʔ)`\P =Mv&Lлwףw[*\}/w֭?^v- Ϟ=xblllHHHiiiAAY""",Fٳg\?@ 9sɓ'iy&jnܸq6A|XVZtҥիWϞ==v0̷~w޽{.[ ekZ̙3CBBbcc 33ɓ'M49x %tSN?lWll PpVX&66v#G㋋Qet!F?;9NlloVVŋѣ:VH?hÆ Qׯ_r;vp8Ç?uR =w\rrr6m6mzۚ1cF˖-5kV^^PR}+W:u*<<`gϞ߼yW{⢢" rUExEi4иSN+$$$!!!66AV5@rY2///׷Ӡ٨0`m<<< &3 CQ;s=޽kb(\.׾p<}TgٲeӧOh'|sڵ;j'6 TJ.]vtVVVΝTٳgϝ;hvڵSΘ1cݺuQQQr|#FxMVZۯ[ťؿ.999(D@  NNN'N:tiiIŋ5k6~x Fcʂ6ӧOS;ٹs|[̙3!!!m۶Ϟ= ٹs]Q,$Ihhٳgӧyyy]tѷӠ(3Lkk뜜SV&YYY}w]v~) kiiYVVZ @ӧO4ѣ۷o;W_( t[L3}J 8u0E},Xr کo͛Ǐ߷o߰04֡L #9s b*{{}ٳ^^^]tرc׮]PѣڶmtRwwwtLҫW/WWh4aԨQÆ 1@>N_ujjjXX 0~H0FM:Ǐ_jNd˽{ߟattt޽7bĈ޽Q7o_++ ʕ+ǍWf(LMRh 2L 0,--JjZRi30r\'1EQNnnvZNf0 gggǶI &&??ֶRh.--zѷJ"TU*YtZ2L$Q\\޽;11qӦM|OZ)yyy$IV:aSFkz Ί+Ə_f`0%!!!˗/_YjJ4Tۆ`Lb0o A{ dH C S/0̇0̇o`>,PY ۳ Cw Cl0w"M4R K eÜG<3RʫG]rnZL@zpǎzj~~Z~O_f#4hСC~qjX^\( h4+㯝I=p|NR*WdubP߄1,~ᘘ-Zxzzۛ(Tg(*777%%%))ɓWG)XX̯0L_J~5I 0 hT\$oS=6iC34M MSոGڵ;|rrrԧR2c`NVZ$tifC$Api ( jZMkTJAiZ:4~\n̻A;vƍCѹWkQ@ cyMSEwqv5R>>c&~^ l,i R_GOkөKǐ#gPj,-<|o_avMсaLv^zYXXFltaN8ҬYӈ7޽{}wphf(a,,{uܹPKKKS\:vؿV}}}ƴ{X B2h4:6qhh/(VŅb_\?V紪\3aJCXH% i䘜ٽazF9{lFZnhrPpK?|pĈ^^?ZvڵF<IQT֭[߽{7..o߾T7f)%(,,7~\ƳO>Bbv 6G0KĜ\.M/oTb!*$ʽ/?ܴcO5r8"p?\.FaSSS[lUJU9K4IPcRfO<9j=|^Mʟ0 ZV*Ji>J'0`ٲeVV0eʔ}zϞ3;:*E"9N&q)P,$E<>Uh'ikpx8X@{2Jq0r\V;99$Ip ZMS4T.S;wXB$2GLLÇ[j5o|b(;07nTTcƌ3g*_~͗.] 駟D")X bdJF"<y$W <+kDiՎ$y<>)D"R4%z0JR$YYYq_Ap xٟm=bM6:88,Yvvv[nE???3_xq֭C)G=s̤$ Om0A$p\.IVVV"HTVdR(ÇEjo {ݼysFgϞR(ڿ޽{ݻcǎPR|޾E;v<}ٳQA<> C3 0 C0͡94hHjݔ*͛kݪU+  2uTX`}GGG4Md˖-<<bZM\.<> ^<<$h(`!84JB-(+5p8ȭ(//~l$,JMM8q޽{uk׮~ 7}F9kڴ)ܼym۶l\.ѣ:Cm9TM4? {7K)cbb XDIDAT؍OH$m۶xפI~zP2$"%J,0X,7TJ`ԤK /><ե>@ G QJDb.309L&Cm4ȓ"M@",X ::z˖-U!̙3iiiXZZa[$I"$Iww?#I2-- O>|ƍ*$ɼ<[[rA)$),Y$''Ogvpp@uʕ2mccӳgO$'L_]rY^XXGVybsw!%_{Gk$|?}N,5j._=ʾ֬X,6%X,nРAIIIii&Ϥ:uH$-[$}||VXطo_ ̟?̙3'NvFXo>a„X|m77|ׯH$7n܀3` 4MaaaYY/YJ ƌCI,--\nnn… +P(C.+ʨ ɓlkkT*Ǎl2CM;A̩@t^^^\\=z{id%P$^yAT z^|ʯWg^T*Ud+(pZM+e<ٙē_\ * Y>F$ݿI&B4mh4III/^Gf&Ja___4ΨN۳gO3wKisIg(JÊwqN``H$•"\H$wރbrrr<שS&MTJ׷&<8#TX)}cJUPPɓ̂Zlll7nԠA `>;wxxxk׮y涶ﻌEQ=~zJJJV|}}7n&U)TJf,8_}ռye64M+ʲ2\!b@ }vaFV={,---##HRq6UM4iڴ5՛R2ohS#Dh:Ҵq`J...2L.+ k۴jAP(D"T 7dbƜg k7`A4h)wh,yփRbA` veh5 {0̇0̇90 .C; ۳ Cg1̇ڶ`{mۀ`0"==m`0wQf g1̇0̇0̇^_`>//ڶ`ؿ`0 $^頢(-EEho9.Gm_Q'Nӛ1\.h4NNN/^(++C ,,,6lP(Pz$nzٖA ] r\V\E;vypz -dAF7'ҾSZ2%6mJ Vpl5GQ>vs^`7cl$[lY^^.JUVZQZZTP`zAڒ$!I3zOӮ7B?_jmap=B;WcjIENDB`davmail-6.3.0/src/site/resources/images/osxdesktop.jpg0100644 0000000 0000000 00000245536 12564151525 021630 0ustar000000000 0000000 JFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" a !1AQ"aq2RTU#4Srs$B357bu'6CVcet%&dDEF4!1QAa2"3q#RB ??Z:˾1_N|St<1ju}g5>Gc!x omj.tT1SS;՝a<-{HxF\$}+΢G+> `кaO0%+ Ѳu|c\\b&Wan-hwe]ګ+:GCK {YZHy4j."n.k)ԍm3˾ǻo ݹxMW85,7>"R@8潮sa(>.֎}k? ArGOMMI{"׾gUύ ",KSA>Q۫KNi*5qU'/3J'8N|ۯ-kVo~^s;v?V>!}%j*f .־q aX5]:I͗?~O~β6٩|?#i]km|KmW۫⨨csro08^c=؅K;k[H0N֐A>Wg ¸&."k12gi;Woaz_ Yw>u|cZ: eWY{szB6=z72HݕRWIQI E5;c^e#\dvFG#G+U_Wj[b$MO.c݆U6K4V q5T~HPdK\]EC#pHF>D-T|a pT:JTIl25NrwOVIۓq% vHfG*u-|t2 u|A W4˃Ik\3W\EEL8ct @8:YxBʗWZ)? `$rsz+N*+⪚!_2p\{I qFM$-)Y+]489357{]sTUG$-\5`\Oۓ`-%"9#&j-V 89#X G;lk8Td,gƹ4A7k6]e¶RZH_>ם@5{tPW6]qH8# +[ݭyZWP3lsHypN2-8Nk4DwE'HZc~Yw>u|cZ2 }G߿{W)WNO~2H0Zo~M?O n;O4p4 A՟~>5wB;"WtG1目'5í<8i߻ԏ / |!GDËC?揿w :=;_G}8_0xc};Bc)c{p1<(㏢~|/pޏ_ kSGAO /E}_0G߯a5@)D诿_ ha?tyl_>pa?a5c@<8xQW߯{~뇰CGCO}~뇰}c| )wO ,Ꮲ>\1pޏO w\=:=xQ|`=~3n{M8_ /Ak=HpŸ{<>ܓ‡ᯋp)Ÿ{qܘS_~^`>>7n}[̃N;‡Ǽxo\=Hĸ{ 2>7.}?~N`>qMOՇO /Ǻ8s\}J>7.}}Xw)m&O$ΚW}8s\=Hĸ{Uڧ-mD/=j<(ws\=Hĸ{a܎g>|9.}}s\}K:d~N`>ҏ'|KixQߒ/'upĸ{Έp/ u/ )X|KiOߋ'q/ ekiFSÉ_~؏~NG^$^[+(=PhJGS\}K R rO-{$89:Z-ȹKܡ@r>/ {+"5Mq5lLi˻?/oJGP|/Qܫ}')FZ=ÿ{ <1#?/4 7zxQ~Z=ÿ}s\=K (Hi>V=ßGߏ>%/yaܞ>V=ßGߓ>%+w'vpĸ{}8o\=K%tdbSdxQ~V=Gߓ%$ӌrQy'c7.}}8o\=K8$u2>V=Gߗ%ӏ2 0Ӝχ>7.}}8o\=K0#d>Z=Sωp/ø)N|{ߏ>%|KixWVE6N=>|9.}}s\=KM7GV;!~>`>>|9.}}[̃MO'Ǻ}s\=Hĸ QܤSܾ\9.>}}w\}KM0A>Z=ÿGߏ>%4Ӄ7# -ωp#ß^|M7<3|9.}}s\}KH'sĸ5fkOpv<^N)F9& ׬>]McP T/#s洛>}S~IDF2*PhS zm4;d UxRI-< V$nIWO0KF{dzw^C{?QTۭRSL.68x<ܑ}Ką.i|o=3C/4>l|(G}w\}Hpĸ\v%4e<(|{ߏq~}~N`>ά;aܞ>Z=dweø.8K:gp>Z=yE#R|27mixGVM8e<3ݛᏆX-P<2p.";.98>:('Jxq>Z=`cMi~~`>SL7%rN|{cn>}}k=K>ܔ|v'|{ߟ-? |[ixW#O}pzǣL{(j++ZrOjN3/W v}뇰}8g|;008H]^Ti J(BpDi t@q|RyYI'NFi~. ׺Ljr2S-hBK[pniWFs6TcFxj @PSх`W Sф+J2X`Hw,BqzB!YFTB*KwTM=|?.ˢi`^,K1Gc.Zւ(=.:nZOWNhM"fu 9= `ec.:fs<{ϣ˃/+xVSq}Kcc`hݻ6\WxeGR-(7_G-+L슋F /\B [INڊtpiCQS b&=5-o'cy;n+@ B>b70Fڊ0P1e8Bgc>HA6)U@L5*@F60@ʭ\&1H Ǝ;фH6(4 4n2Q2U#΍hÒ`FmƼhxp|ʦdBPVV9jj-jrU*2$e`KBbTR9&taf`c( ŠA Sj*8EAQQ(-$8{k'p.99ϝ0 ]ye)&mGG+"n6*Kוe%c#3Jcd1[|̳b=.| v73۷X_:PCtΨ#Ȧ#㍖S&lFܖ1.|.;]VLRV~^^?'};%[56y?޼{%+Ny{e}/'?[TR\ZF`T(T0 #.m0#H惲(J*@HPA 0) p2`sMp@RB3HӧQv) p+sPBta^a[ڔV&0aJ7Fjq( l)G<*rNĠn zŁĝՠjSv6QN@%a IV`ܪksuؠ8f)Vcd=R֓v)ӔQvZrRw " K2b'BiUtXp8%v';4;YS+XhXąX9& FLѸLFh8h-$rA1fsYR4AQ :*)pLt<5pьp-E&2PF誻rь*@NjvHi v y "N w($!NZlLi'[mrUeCH ao<(#e-kp4rNFJܣ U I'qK!GI@条Hh%Z#-ƠFFwDCCkQ*KXv&‡.e8Bl)K0R#|rlVRa 2tڪKϱZFBRCjJB瑨 0!x;ih"&Hd-N-N3SF:2;fo#q| /ܮoD9Prψmػ(?;.=3}!qOwA_76?ػ$F<[Or?gx`Sx.xM: +\1μ;„Qպl1]$ڵKppTP[ڬ!BۦP@/>@9;Ua8( `sԢ+!A[:z:ymU2VSuKd[-ki0q -9U+O@ TQ22q0) T ;$ٺeU *`qʐX`@R 5<鰐s[:hUFD)'|j0Tdv“ۃ5$# b qHc&u#Zak\ZC R^7V5Io- )6L -F @n[XX)#yV@'V`Ml' b('!dd( /jbݔpiŠF@Esߍn.02yn1NѲcG#BuӴaXЕdUJle  ;AJᲳAn1j!|hv3* *2}*#l:!XᲥEڇ$!Zᔎ*-+#ҹXH ʜ" +096#n(2j.V6.;v n HjpR|n-,.0 Bf0;ZA "! %(7lc)@Aة McG54'c7YcSd‚Hǖ)(!) yBe> l#J¬ 1an*# O%a UJD9$!XB2^;V.`',qD, c Ob$ec }0Vd~Jӟ/u\qkCU75_Vd$Tc,\9y.ָ8 {mTCY#&G%-F2Q[ TaN7Ķ1n8sըglrIyWNzmLm5Ujs)t(]=(ji!̅V[mgx)aj=WQҴy!1b94oݫq% 5N(.q%%)&bKٓҷ qK9slӌuE,V5 #-8N9IEU꣚7c82p5y;7W񅎞w %jcl$>P絤F݋NxR'REUqEIΆ<:yaJ]-:kq+跗"drFuVf [t&0(h` /9;4 #AAR Qv # p B7L0@ۚ@vS ژ%Ru9FܧiU8UW5h v#3JAEu=\CR1/)DAf;[Mݲ攔U3BIJPJW)jRwA慑PFTCG<\%%1) R$*R%)/#5* J%A TPHNT Yfc.fZNM۽` NR&vH* pz4h)ҥHCHdaNMi Pe4iY 4qR<;T](s|p+j%yt9q cP6RFSJ rPAJP%(Eq{2{P2leKN PTEN*V5k]pU@N6 QW4RƕչLӂ V5 *Ƹ,vcJiqw|P?KUy#m;wTʍilvK18~/QedLlkԵVHE';#Ҩ Ȧĥ.UJ^JSn["a"aԱC 픤Ld4ޥuَs'cF0+7ŬuugnM1ǫMNĘ)Ċea0%dh:*sl[0uM9FVx=T>Da[g:s{J?lv*bWT_6PnVg}TU,NHXv0Z{~I uA1K+r?)kWFV zdcd<9Uى5*ɖ퀆ւ:r{D6R2ԧZ]u֡;HՓ;KSl,P٫APvTwՕ6Cs)ta] \yѕ,puMekFOEvrg,\*+U.)Zܑǚn|@"ʷ&y̫*ZsI *0n%T)TeRKMUҽD?NgBw%CdfF2SD!npn.۔ wTV;vQ ! H$)H䄧)OjV8L/v=+ pEœ)MH*Z0KzT`jS+c{aaY*idcAnS!YҒ+H!jɢ*nHRT))A B(L8p7CG*.|AaJZӅcNU 9NӂrͳE^Ӑ*ZpF `튨A:(n|GAGU%d5v>/gMIu2\HW,x{z~7|\+qZF\k˟&8o[bpOCƺZkLNIк;8jAmhNNQF+p{lK;K(Ѵخ}I%{[ v'Wi^..LlK}'ÓvY4op͎Z=c;7r8uT\XZ:+q1g3ʊߋScЇrί+|i[4AQb;\QBG^.5x:N,eebf(竮7.]̐["2t)ei|a򌚎+/^ɗdw zfRZ("ZiH#O/8[YgN/k2OFbر/68]Z/Qz9\g'VSVo_RnGZC'6o_RVo_RnGZU{_*|Wg8^tu:gN/gN/zםkΆ+vSv-S^GZ󡺱p0`F,leyk 8MHV9.V8;,UMt95GOEע,B!Y$j Cu-le$tvY_Asib cb<|O5<Üsߞe^")_,D~̩mkn:QGϩV/ZyexEq}xEq}ּ^tٺe_(]_+yּnWh8hN/Z>hN/zםkΆ+Ŗ-Seg+yּn[i8<[i8^tu:mGmT9{uQG 6Pɤ]Z82O`n {۰+!*z-tAKFOK6j^JAC R^U/rwePDqs<$T8 PS)vBd鱔i(NT(! Òͤ CG2Fv%°+’6ZЯJ0UR0ֆFv!Jl#:Jڏ<_*kj> ~# vVVEEK;u>05'*Q݋/įOrO-ɖvVupկ6 Wjϟ)bẺtI6N7;yQ݋/ģG|btK){x{لͱܛ0gD$3'V>9bs{^~t}AH}`8A[̃m e;l*h:uGV \G7 a/O4Ok=X ^-s y?^~t}AG/?:[ j:6Pxv'6Af6p#mI zyibyv(r5~sDx?J^~t}AQΖ?<\Q>'}n4c>#OG|dGb3  6y93hx2:Jڏŷ-P-rWUQB5Jȩ748ʺJڏ/g#!J*kj>:Jڏ<_*kj> ~# Jڏ/hB*kj>:Jڏ<_*kj> ~# Jڏ*|ޚ 3ɨOξ^7>?JuNJg 1e8Y!W2vJ('eZy V?ҨpQH&G58E"8E@!1 HRV6Q)@A QYIq%SU%<ʌ$ZB\a HV+ARBR6U'eY@Bp71dxR:6M1 9 TqM{ T4'rnZi-3?,:VGteE[VFi_ֽ!Y ;SJ%ҬPy V8ls1؁sHO0E39*qNy:F~Q; )) lccZrӃސ&o%V *p) kTIWK"0liX~XjʡeEφv|KIX +cɕW8`~sީҳiQV-M.2( ΍ARݕPTѦ;svYeUXc+YozņQfbDNSF[$a8榓ESޛ Z裚ˠu]K!c;QH8*.#H:N2JvM&wUI[uxJV/L}GpX{?˞ҕ?$_Q??/W %޸ԗֻt+/66CKCrˁI .M z;|5F{EYWՃ~(>L۬Ndi;c $XKUwk{peC[Raq:@xϒIdIrBJfVTJЂ2 AB_]h U3 &nssVSk)\vꆗBedv@YhAYhAU6T~|<}*?}]u*?}]G>U6T~;_ԨCEv{ԨCEv{6T~xڃQR GR TxڃQjGO/cuJ4_WgJ4_WgQjGG>U<<}*?}]u*?}]G>U6T~;_ԨCEv{ԨCEv{6T~xڃQR GR TxڃQjGO/cuJ4_WgJ4_WgQjGG>U<<}*?}]u*?}]G>U6T~;_ԨCEv{ԨCEv{6T~xڃQR GR TxڃQjGO/cuJ4_WgTzx] 5=lKTVncLQnӲ;ܦ+اdeNl]N@AMK:$e3m永hp;#G54(rNJc:F/?bUgs~$S~7U(?l%cS~7U(?l%a!@!@!@!@!@!@!@!@!@,hk'$L3j&7۔YUOEN' 5 }*GWvp.FJJkRd kZVE9\@ ;X62 o 䤴(뤘@Ȝ#yn>쟐-#/0ein.Gz 270gAƗrkc~Bgܕ5bf5Xܜ huWVSzuKbs td ;> =:(Kv:(XYo2O XX@Fɾ쟐,YS5H4B&4=^ЮkF `9hszj~_vrOVl5VU!i%qkA$.zܦM*VF@:\ H'\U3 jJǺ( kN;sYnovrOVl/doϹr_+5EAuTNi!.96~@ܵnN2I~GO ko Q_'DbC?y)~ߣ~Bg܏{'+~}ˉoٮ7 $Q2.N4k$×o |@mq@l7V"];^U)"* rWi=!Z=͆# A\-uqleKe:=09rn\+7j:~fINӰH^\$Ѵ5{Y1tiۿM~@~Bg܏{'+~}˖[c\#ԔH=~xku]Y÷Ku:X2Ɲ2H晤%@!vUc=[mߣ~Bgܕ5bf5Xܜ r5.*TIKQUyA$|EĹF6 󮂮7q=,ϩ|/W=z(˃@2͂Wɭ{~ܽ[>}?![\ 8Ē#["TTBz٩pߥ2$ /¼KsY5UQ f|u 4@vlq;ou3킞 &QCK֐ִ I.$:6AA- ׃ wuCmU/4,6Nt$a߂u8Mb]J6 aI$yt;~쟐#^ ߭r%=beM@/( m_,%$THh u@ vHXZ N߷>쟐#^ ߭r.|Yt" h[odU##Z@'_-'z3q0&ֈ/#&GF6Ve/߷TpKƲ5cx'r𬎒is'x E\Z(yH#'y)Gi#s"uY~ k'é/B? ֛%^IKSgugW>qq SV4\Tc8Z} +ܕY j6Fޘҍ(}*tPvET۫^*kyҘ5D|HV)j2J`P4w%qU=Q\,hq#RFsAy' ^Vj^Fj%ӜC3<r`*IZG5Qвg ϒVܥEnTrBGVt)dc'(Ӻ-##t_X\l&1i@La0Âj&VBW4Q` % 䝣*ЛJ)VX :TttxI+4+Y4хY<edUbӄΘOf;e9T56sTagLV eZGAh#+:"p-SJ*5VPŕ.Lg 61c1l~q"c_/cq"c^^OW"AeY+AeY+BBBBBBBBBZ[/[U1nRZPR=UBhlyCJ 8&dR+"561` ldASQQ <1TctF8 =euK_#ԚftsH-%AـA]S'M,FMA1rwʺ*ZxfQ>VIa3_o݇nhXs\rK ցc 5UOT2y<^R8۞kqb"1ֹ_ObLQuFalTk $s9n[,J*H t̎ƶBӖqEn1ֹ_F#?Ջ< ߻cjW%4kY8;krZʦ4A5s۴@=mqֹ_IK),~7?< >[zѿ#mjv1`0: ;mb|SAXHMc+X}o2~J*N &PeDhtw<7|* BihG8O-d4Ud$pV KUT҈Yh9Zp$1n^eXs# rU9'uY+yQ=RyNJ]%DTFBR0** ʭ۫HHF*қN'{y^TpRh(ǙXy(‹cn)ߗnZ3MYH(ZaTczmY rXW-J\ncZ9WMB vW`e6.VسK,ieYVcYiZ|K-PNӐk6&ǀ-[7Xs)hO)j;ӎJt%8Jy{;IUӌ,4{{ Ŕc͕X ŎPt}?_h/< Og'?)UU8!!!!!!;<=t21#e 'Ō.~Z(Wku;&p Oret:JgS2W8@wvXqke}yPcuǴ8gm2ھKCeDYiJ,1l0 v.#<ŻE[}oV6R uYLXNqc>)IjEëtP%s"dc7uxW*-h2;A,nH رo\[wyU1UR\cj!N؃u5; fλ%eKG+dmCMFH 997\[~[v[]Y y}d5A;Z.+n]5}Tt07tMkKF^\<3qwļG`QU(R'nfF7 9Uw-|T AC#%eEiM;45n7N`7 lyp4qAol0+=їܖH;t< 3qtA0S,N|deqr9GbU]"dדAQWY{p0 -˰nNNܗ[)-QQ۩`b8`1`64v8}5MR` d.k^Z\$9䭵qqm wI;D#Y6Ɏ$8~w-,afWXXX 'Q'N+Nkm4\`GG众a6U^8v8i&R)h ܍'-n\6uTME$!xtnnF~]\<<tnS[:̆m.v[I#!}'~S:L*bd31\qj X'>dKMjzI6>@"s1|e\ !(W]]тPs =.W{Q,0SC$ h.;d>ؼXۄw['bw~7>X^,7rcɔx:|nV;d|9!wla=E[)YDΉaqd܌mc+V`w9^Gf04cYL3ǑNHǃc92zn.^bY/σ] j<Ӻ8^ֹXkm9q;hpS;k5 6!5IiAIAt35k5L? w!#jZ,ԖnQD_'C3XƳ[ar&EƵ5wH(7n"̧"&I,FWkyg+s7κa ԶFpyBO%EP[/\1,UHj[&jy``6Ynrtw2NkbdL`q p7'd"k@Vrk@PkЄ        ~9CGEzo(HȂ)>Oxmy*OS_x֟%V;p~7L֝g%fZq_k!䈙ޯӰU(w%KD S0PPFPBEDw) NȚ/bS9#e+)\*sMTiHQT̯sRDQ'%VU8w5G<_'jm;*(KpY! dW%_FW9@n?YPBJ0܋ 웱@L1_y%9 aF0'QޣpQSRUŬzn@|NvqvܬkJcDnWnúv9^µ+qpNvRь(jc5 N4܊n=;NBC͆ ıZuePbYqa|yYgVZlkd̩-lV4\Xd41i4 V*4+NNlĜsX8?>~Ef?elŏAx?ߍ~*Xߍ~*\p!!!!!!$FM'w'4@!SSUOJa3 ABGy nyù<2==#NG=΁Ыh/Hǖ;C.=(OLH= zh3 d>G}%jy`w葥np~G}'_,K Sl;=9=~^`~r o(HȯTME'é/B #i>O`nxYܥ#6-;6 maҋ0ovN)!@vʆQQu8A_b*"HKq)QEܝ۔`5[nV߲2* ܹ(*v;*ryc㝕% QI@j 01ZR[܍ȫNJ`ԄqXJԋ6)VP@)aJp`wq9q c̅1KsڜH!E0)LVܱa!YZ,oakns bFK!]+!ʘ}*vc(GFHwbF@AfT̶V,Nָ !g=fYRYbFsY *{Kبd.v1f ×pAYۚŘlXDŽMgM~t߸}/_h/?|ΫAeY+AeY+      pm{H(G4qٲգ kEec OqqpNPpQ|RqT]٘XΊHiF߬Q*m|.w'MZa L5ac$]Mgt(PP2jvG~v3̬z~jJZ{ *juIY6FIAPkc4[m|!)hk輍C^]g8;OVldKEGLn8`skISIOTa5TaK@ssȌ}mg_i.^8fK]3t3[\ myZk%mڛAbzmFֺJX F 0NYdjIh@ $-܏eKdS9C %(8g6fUx4"]kE =Q+&- Z i<>kue7*ZQIt`l31$c lwxvh+-S]Q>tqq~8\y$y[h㤷A%,C :60y k@U~XweVG{ִF쓏B t!!!!!!!!DߎP^?2 OS_۞1C%^IKpC%V;p~75L0V SNWHX.U@XTF4PZ)XJnP#F2RR# Q*7JFԤlveAXpqe08VS 3U<_UVᔎBw#GwnUrJM)-QkhgάLUV%$.%제R#40e nV6>ҝ+ZܭHņҲ^ee_Z-WԺ:ysAQ/fL o YKsQ+A.qto$&2R~QXyQbRݕt1~ܤ*tܤ1BR,Jj14et}ҍ$+[5 pk¤3N(e1Y ~V pܕtƳ~zcvY wWYYvH C6 Q2c'GXA5Õr+{6T> 5`;TԯdJs$c8۹vV KeTvX))"# c B#N]sKGk%X{%YŲBIsӇ8:J:g 'j>&ja`/%sB x>G7nu;=\uz# \^FCNuaTNgDc @e]-DOU t<1 d퓤b}c_knmndjߴGqI6~^:drt<[si]G´лȇJ<7)u3gt1^< rF6(##hkry3\3rvS/ QT2 KUR> ڞbk.k5!'pgm rnH+cd}S625/q .Ǭ~]ߪr:G,4tMf\L"=}(uõ3bU)6I QgnNÒ5w܎Qw~}7+eaXfVUOX$$ik!!!!!!!!?2+~9CGDIKC]u?^?`Vw;ki@WX\A^ce{V pʰFU!#b8搅Sdc+G^p{*C߂Ys2=$,i$$EQ>tp ܕ4GeCĕwCPpaV]s#snpP' R7bUd䑄bԋ1(ir#' ـsڷ1nb*lmipHoi±8;Pr71T%;hj܍ӵƵX䮛N6)҂ҽ??0F hԥԁҩ-.7;#RQ^X6H %ܬ|aHV2qgl:JNQ`,'Dd 0TM.AY&5[#XRiw(Xǜ{ÿX,?\,&esw+g2Bk  Zkv ֹWXԜ׫Z9سIʙ[͉ZZ󕧫f3TnLW Ϟ,7$_G,= oDŽ)ZoHX{?\)UUBBBBBJ5sִdpL? 'E8ɹ6٠#;惲Q׵Ɔ7gdkVTSҘELBfErC[gc\:v8VMӶJh/26F\ ^HW ;I5F" ƾ5dUUOHU9E^ov+q[tUQ\/Ɍ=V2=;p!-ccc̆sg9A܋狅!cHf'>cYqck{^ 4xIfg=E] ؛PzNy<}j8nWXUV Z<y2@p7'`B>n 4tKK5:hlr=VvNL@ CbTBUqׅxB[ՐqK 16 u;-'JXZCbsZ:< @Ђ`mtE O#̆18ZkX3UPB9YݹZ Q;lNT JƲ@,'y/)ŕoEly- 6Doqǎ^{ɟU۝q io=SGS:A#$`edTOrZ%IKG.)c8HupltX*J:a-v؀GkcǗ~3/vͳu\}7ѧuj<菆-R'S!ao~uc 4K5SZdV׌㪽ѵÑQ>+֊.-ۺ(j8ǴufpM#^F.nW6ކ>pu&}0YZe? !dKeeW5üי[[GjSӼqYy.u1p8v󑒻-l77kYi301r,,,1]:#) j2x*0j%fަz{b'bΙ?'cb󜪞TRD.vTc)GA1y$ؔLZR9A8{)s8'.@c@WK1+ܫ6- ¬d$K[W2>sbXܷ1j`FD5;XIl{-ScV5cXlD]&*U\ؼ{{̏[dJFd^e{!-e%Bւ4FLh4M)qHM8SIS4TX@WNQX0 Rr Un( WYHoTd젷)=5;JѪK{qvM:Jj,4U6 xV\ǫ"vƳ쫚penꭎGEh4;89jՔI!sɼ:#σo5Prer_Λ/? "Y~Eg=W~3\)UUBBBBBTVSRK[UҷLLzZi$2rw[4 ejd'qby=sYQ,,`k0H灰YAZ]_UIU mE8{Z'9GjzAyкN\.<`mۣcKK[VdP.9I ]3`ck DX7rǴ9L[Xۺ$Q-{U-wj*۹'nQ#j:< 8.kQZ.Z.V;wGg};emr|:AHN;Nm]:;m5W=_,c\- !@!@!@!@!@!@!@!@*&r̊DߎPR|:/"\W|:/#y*OGKA8nic-u{nz/&,6KV-TwVM&\O/=sjžnk3ڙfbK!wjY|SLg?/%s#O 1ڳΉJ\җ!q)1^ԹJ2֖b \ oڪ| ^䓌zCsNCG -sNZ%Q9& cudYFp2ԕM·v9 ]3ܬ]1ulƮ浧7XµnbKc5kc°5ZenF*cc%\̌lXcd^e)dK!U ;S|Ϙ][7CK/n)Ki8VcYt3pr2{y+nfT1ڛIfɟقF h̺P:f!5ڀg l+6]a Ti4AM5sZ\ւOpP[*iT)rWMNp Nvt*̣Lyʮ`* 4"9Jw*sTQp8*ƿujM:Jd˷5V6Aޫ/r.3]Ny(qr wIS#,XɜgċŏA|eq"c_#oO"AeY+AeY+BBBBBB ^ü7Ssn8\g?6 6xQ N{b` sMk +Y W#[m\,a, 9Z騬 Esjm|EP rF? q؃l2W\hnOtEiׯ]9+*Ilձ[ m 8q{4j`c~K/O-xG\΁z>bqM/[:hSWG x8F1KC 7 0In}:h%.iҮm-nmwKes4pO ֺUAj{`̑C-I=vdwߠ}}NJw5W?P ;W?W_;u+QSR1|A1s+8IAhzǶ#^!O/%~OsIUAk#\m76)ߪzsNBC匃)䱎?1?KO!ieq.0ٸe lT{{؋9iai۽mxf+}s顧aX˘ s=R;'*XiqEֲRwÜqp  w}@ʻݖZa8&xcAwF@'I.h#?3i NJan~?Lߗ< ռvI$G6gYi dմ# ָ)*N&tL; k'clsi]G´лȇJ<7)u3gt1^< rF6<ɔwOo r_k?Sx Mdl878HwL^_54FUR[GXν:?>OV{]h*`: dmnA.6[km܍O\)@؃Ӎ&L㫃e Qꓝ0v3˘@;o+g % Zk S`y|n:pZw#|esV ỽ{MLSdзK3K5 3`eeαՓGN>8ke\q`̵ߠ+9`̵ߠ(5BBBBBBBB #s"Q7?dA ʼ*7OxPQUׇ=='#CHKmNK_H݀[Xh^Qpf n<٥aM6{UoVbsK,sZSMhJrV+߾d,gmlM2jׯ9Xh_UQzR5Y%␁pS#G"Q :t! zm̱skR_(+gXHx*v|#:oHX{? ] V_Λ/k?zĿ?)Uu=GR GR Aj?.ofVR GR Aj?.ofVR GR Aj?.oUTiIߢFJ4_WgJ4_WgTu*?}]u*?}]QԨCEv{ԨCEv{^GR GR AzJ4_WgJ4_WgTu*?}]u*?}]QԨCEv{ԨCEv{^GR GR AzJ4_WgJ4_Wgꉿ#s":hrhx|4 FFw JOS_^-E$^IKt>+<ۑuOOIa+ZS+|#ᏻ>IXSTw%F{V3$iEHI/ikaTm%$^՘H󣒭 k]5L`lԓO~飴\p`3|ɀS!XV cZ+'nuw)kI*ZƒV-$왱jb0 vsCZʃ&]H:@|RMtX䜥'e6r^II0ny.fkܡ/xkFHaNr o<̩ 7 sʺ\WF|HrHZ;:nUe1dN7S)f y8+([BF48T>]t 4tJFrG0+v*Ű|jGh`#eʬ4b{ѝ0{NgriCN[iH YQdt܈FAhbiJSj8M:Ee2#4RqSN{1 Hy9XRyf+Gy.9G<geċzŏA|qcOӵg_|]EDqt9ip[\ Σv8lpK[!lAeZ nFkX)JjF]78dWy\l6lRpC-)*؛JK+$luN(#\#7CC_5h3u)d2;|B\$=ikIw;U9mJ)Ls5SS,Lk{vp9AwP[F>*9^0 /f{u֊]”Qh)i .|J3'F qfM^<ea6|ڮ%dQS9X=iZJt]8*{ȍCVTjC)S PFy*ҲRrpnm) j1ѬAH@9WMHs2ty[GT?2id`:2dlKi0HAVK s;QK+vUR^5eI r)!UnD!e`;رX5,aAfK0خ,O =?$_PW,= ?F/+?=?$S~7U(?l%cS~7U(?l%y^ !!!!!!!!;<=t21#e 'Ō.~_d(ILWZm!΍0gSsuh\'XjSQ9pkwfT;,pLꞧh$493tHZ98t2 kӂB8jhmrz]im꧐ޒV:lPvZJ~(^ͦǎLh/rr0r6Z ^oڡ7KK,hi98hqk@$A!iĶwEpWS8d/i{_nָgYw zdH_XD`hb8az>0Tx֯ E=A ?k.t]{BsLJT]Hd<&::PGj]{udGZ#_)nWVڰB ^:ͳ{+zH2t}t+G~t2nz@R-s*G4ӤX0 iY=)FӤe1+RMJؔrX!N$UVA9H$ڍt} 8QN+; %-4tg𐶎gT"{Ul`T>أR0NAJFVSFsڨ#p!S&q;K©qgFIќg(R1n 9g]_cq"c_/x?cq"c_}w?$S~7U(?l%cS~7U(?l%y0!!!!!!!!(%N6zIt=qܸ_b*˳KRi210s By[p}U5,UR'tฑwe ֊H.{r ۪I^M١%ApurvVݪP)/&Fև'sq a _xmC擧{ WN4`8`g#PxwlJmzzܪ$RGWc.## _VDΧ [5;KP۪@ѨtgH:;/OB $6^["D e7r|ez.5uhm0й%09, h/<9v񅮼PZ-։ >n5N2v={cgYUvs*,A?sE]ӆ#ѧyF5k'W-7YUu˻[ABu˻[GYU=Ok՝fVs88<!@!@!@!@!@!@!@!@!@*&r̊DߎPR|:/)RcOS_{27y%fEXPq~tgp3$d)zL,r:NdȨVQ8Ldr5ϙ)TL *]#`|XNFq[21czTpUI_Lkd=AQUUOHU]tQu3^::PxtְkoUExl$ŧGN{z9XqE>3Yo~Yǝ_IKj#gR3lQˤtcX==TW>_wiq/~_T >_wiQKleU U51FTT>]'/娜vzXUAzBBBBBBBBBTMꉿ#s"u?_<(c([e_CR|:/TE؀ٗ~}c͢qY-eUm*~27!VnݳMҬf# zqH.z8,&ׅ]&22ik\lN]F)}eMGJ5U 6mp#;Z׼FwqXNx^Χrw3\אǽGMK _Hrm}l]c&7Tڨ-c]7f#f:i̻sX8/s ipH<ǒ}حJFtX9ltueH<,nu[9Lz03jsrLǡ6JFS\29Q9ڕ~jۚ:J7*:S$)ǽcjSklkjOzhnv0qҠ; 2m,!!'uk+OGlg>uIrfۦ9eWsZ*:L*S6h ykj2L[QZԑePM6}q0'ҶwT3-ˈ{S6Kd2 N*qڍ1*/jO$a#s6ȣZΤ̫s6c ^ )W`X2u+7SGӧ1GmS6vؚس!ЃQAV+{*Ae2il4`oP{\8SEEEMmmc頥ccn P]Rb[-V6RZXIl4 ܜ Xr\]f#ԚVZKܶAwxgZ r4x-K?*!{=HalOжAw [QOTԶ1&6AP,4`|r{KOLA*'47Qp9gA E#KIrKvQEs%lW%sozG41EAYXZb0 =N*yVOz{\>V02IXҰ̘J{)pnw wc,{DS=ˣY]P|HDOisX.rq%\ * /#kQ9Ue)rɷfKzܗ'{nWtd`9Sl& 2g)׺NO&zԇ6!]˶V9K^sru&X6ڙ259 =8rjde?JPFkr Uk)ޫ]˃RHpapz`N3بՔgΛjdc9LX݊2B5l۫X0wgmA=XL_ڛjfٶ皱d R%+]ۦ !hħAC-cb ֜8j Ciǝ;AAm}ASUKK2=e-fN58\eqCQE=ME4\'I4icKs@ bK*{=Si.QKjYI5ƢՇFӭ[k![s^\s3R;iy !:H8Vբ(l*nDy$#,K5vObľp]}}J6I|=0ì21|51" U4 ,KXCz0A4yjGwS4Ji2ttjEmWKUR\N19 -s;'aqQ|Mt'UQKQIƒWXȋ 0%wHuB=+j] eʢ' h9|s)+(N Z繭! (<6-tx3KTlL&N-gKF9 Y+o{] &]Y,UR=&5cC7p7IWxHjꨩ+E|MafIkG;n"WSIQ,+K)9@p']ToQe;*q#ML{20KIJzGW8KoᦫQXGDZNw56Gi g6d#\\Z4| Z0=qѷS׆s% QPetAtϭ:]CK'hnx{,J ꤹT6H ë1äsuddloPG[.5њjImvD 4nsqű3t<@`URnL\ֹ b;@dnvb/~7AeY+ L1F1Ib/39 Ib#Ib B5R{5R{3z?T/r:?T/r ,OU'܎OU'܃9 Ib#Ib B5R{5R{3z?T/r:?T/r ,OU'܎OU'܃9 Ib#Ib B5R{5R{3z?T/r:?T/r ,OU'܎OU'܃9 Ib#Ib -d{581 Qw~}Yj1{j1{lG#~]ߪruz=^uz=^>Qw~}5wܵ^Oc^OcϬ~]ߪr{ִg>OU'܎OU'܃9 Ib#Ib B5R{5R{3z?T/r:?T/r ,OU'܎OU'܃9 Ib#Ib B5R{5R{3z?T/r:?T/r ,OU'܎OU'܃9 Ib#Ib TM^OcdFIțNTeFQMI ߨ6(p9R${X55z&NWFRQ9Jjd Jdoӑ2jM^KRk庑'j5ܴ?tꠤrZ;U;])wr+|\0{T*&W{uܽ2pr R:R Q;2;Q׸dwPFJ\A

HFeWgqjJP%:ZN 8 m63X\#~Ue6Ŧ.A* Pe((q/B8PIQCfʌPJeIgefʂp(.WI);(ʅf2Ds(ҡA=2PRJʄR/[w(T p 2H+[jf)Bz(R3HGj{ AQH //j`2<@%Mӹ|EGѸ49AHP 2>9M69Ԥ;ήۜQ)S0=@!1# N-jf/Um$\1MDژ^W׈<^MG*|m /Ǖ}Q{B!@!@!@!@!@,+ʞmg s8 @,OUeOfQ1ACk"mMHxi(`F9@k/j^=/V];gk8'>×;lOJwN=eT~hP#vM~qd}UޫDZ uNY4h*ёVٞcK0ג t!8Im;7j<[lp}K!_:9$1y̒Fl5WzƗ(WcKOųiu\"aKia x.\tc|z_vo!:Cp5A# z⑆kwKW+Fz 8 =CqƢ.Zmx4\MMaW\*B;U5?M4s 'S\ŗxKur\`ʩOO&vmٖv; x4G_{_7qG^Vݼ_%׊3pˏy,*q{8ظzZi-QVD)Z+$.{I @_;lzxx$hBCbmڢuUfeԵF<z$ސGu>Kd?5u,!8Agv[H]J3 9AB\ F DbPı'] eEe1:z^!Y&s$JZ[⩂kI+z }<]<ڥk˽;z'P(џV}kN}(5^-sv~E##wD:L9t=xg?{NY+YX ou:ۮF9.ޟ \}(;Z QXH4 I`jzydmH潱yzM8Kf}W+p&ѳ" =&kˁhEgE$|9qxGj[goF9Ua-TN: (D;sQwjk(FjsA$y[zL Ƴ`[`.Æ H f{#U^g1WX_ד!!!!!!RUʋ/W?ʴ5ZӋcpA(hj84oWv.Q:NkAt56a#ã#+l@<-ԃ>5      s(yNs3RT?b Ld6Ac̍wuY'wO:cQ>Ӄ~dSCmijm,??;3u8vg6q-c)iN T}9vwJFWk丌УRR2{MFBw#dd<23xۨ6 SK5>>2F2;bXn'* KF2RH%FRD>TeFR6[;Ŏg[8*[ +YIٍ*XC$m7JLüguafKA1^JM-oz_GH_+ѵgy8M٤4mn3,DBRicg+Zȏ}Akcduƌކ#f~hGAcOg$0?I%Ks,w쯆GQ_(  8;$%3<6TrZR**jE> Gб,Ԫ|uKYF;~(*[=JY+ApJqAAs.pFr`5D)B 0;!3/Bi;:Z6a   mSm`{s{إ,o8k4MM$N[ֹ6B!*2ACi% Pm*P5 !]aTJ7g\nݻ GT́H1gcv} zBnL+NHn%b%q mpe!xN9rRAz܄23Qw*wےJ:qe^.LCݤgQslMխq" u6ypyzntMр`PgT "M;gV$8R%*x4:SQխJ)O&QJ&q -y=vNf:cFwpywWUļrpX 5~4;.nFF~w %UKeʒ 'VR+ .48!s3#%APhSGz )TFa3#sѳFJʫ0v,,e]5_I e .i…%AUJD!J.6)F77@Bvw Q)  0 躻@kb=+0!am8TL쌪>Q&QSgԤ9o5^PJ6QFP>:yAEnޔ\J3(SMsii#8* ʡAKN**fp8۹q'm[coSMY đH0ZTzkЄFTGruʭdU:Mv՛\\*&L75UxXEMnm].>\c"S"LueHdʝČj ʠtlg) ]/.J\J,..GaMu#)2 eGjSbrTO2RIPw+F{(VeCcS"2,ԧRe;QUg̝_z5璧*u'x9Y*Q.M˦ҪYSK =ETl{k=kyI䓌ZeA%*ѶQS=L 7)^[83,7kU߬j4k[\` ۤvp< VJFe0QZLyy-G,߅jS!Fݖcqk jd%%@irB7С$m *-$006"p{ʣ?OA;.œʅ6r*=PNT*@FT(m RN%.Qm$*^%6(ʂ0HPCQ6lFPye66SR[v0R9z*Z*)tS=*ʮ]-mƦZNdWe>rysR^AXV >JXX:On6IM9t +)jO#ƱĴny2NOQIz`ՈI`9:Mw LQC5\GG[drs̥@Sءsh!DB2B&" ݦ:vd0c!FpQv7 E[dfgF0arF9QdK$H8Գl]Az6ifu^e6> (o 6hjJpr;ݫ;*5p PFJ2Ͻ!% 2DPPn@ PaJAҨ*$ 2b̎ R+DŽ+ӂh8^m<8W tj],{I' r)˰S՞d m $sIiqr ]IjRCj8ʩNN9 r*mLJBNR8۫**2ksF{A(Pt(ZTy{wRTaCc(ʗcG%6 6%P jBWJ.JN$a"rFXN^^HΜCaeN0w;eGhL@#>O<%LJ#*P (#(p-{wA9B *26'(P I;߹BmKC@ް*S"8fM2c'!v{Tnqe<)rvzO:C'Q{./)KUZ;arJJmN]ArL*l6TjkeSbF{.TM'sGjDq˲%@!A;(NW9@@} "r>'h@=F$HC4j'p62 ST6PR@82"$#rjsލJGjk"A!A%AB4M2dIRv;{bȘd yBwKڡMԌ (GjԡS( \$-;T @`oJ‚r< :Ap0a!}ž*4BѰJ hJZ:j'eKc3cnqZpHgMK8IFUB! #H9@ PDaX^c&qrEbaNTF dgMť@!BS  2 AA*2@FR (;(@A(BDNR eET601tmj~5dGh,Gq>=}e6<o8)Qw )(30d]HIjPi,:%-h s8Yҧ<$Tg!x_{Y g)e =^iMSQLn5TTC.].v7~p?l3\ra-isqNwsmhcvYWuMWncYUK+9qFT5NvtC%(hdL#ǂ=%]MRW:Nw'K qG0z>Sja;} l?ѕMAJv}+7x>P))_QJtŇCHqUaX$)PD*'*0{l6QKP CIGbeQ=ʅ WqGfKMS|-f2wScʜM]4&.~v ^5 8PunKuK7oc{Bw J"ob9sMAHK0G ./%K\xFMZw\6<(^8o%n$sͷ3OCWH';{iH7 < 7UKseل8wBUTB*(R7d^ v [QYSDNl]/ ʘ奱l%LW0e`='w4BQԻiuoc>.+U@X8gV!oJ5#ir"lhQ{p v`6\i(Zv>y4DƒI#[?VQTIOԶƇ1AN&I'V1םITf6`Ir`vKGb>*3:HY#\kh [4!i5)pV6JO3{_vAz[;n?Q%g Z(x pK#Ǽ`\AٮQIu%Q:C ({$nhlF&I9\7P}2qЬGknUh8^,RɬX;]`s_? ͭC4,: ITk|F~WL$IzzZRUJ#c!l 3'޵[Q{!CN kjjiZG~BGUE űn`|t1y,)W:C~պJǷ~2?b *\lpZ}EgY:l2v'dyYJuo 7X.dT.dmpûH'm ]PLa4{-2 5Hy8{dKm pÊLzjǰm7Sjz1]=aBѹ>f%y{,KM;]7lP=;4S k7;>|.-}yggm_. \$1ÏIX^%-[??&zFL(piI#\i-trDtrqpsqg="wLѲ }񻱲9'WB^һIƗypiCCKВǩwW+9̷'+2m22a,@ } aѶfP#dn~t$៿Ǩ𧗭lx%YkBiJzS1р;p9S]2O.{#^l;ͅϓZ港lON\j=-Uj2#rH1,-nrNx9ez>Tu/ 8.s \ _ouO!})d0o<*:H-Vt8w23q(]Q~'H\ d~84OO#ZAih>JP p&0[549_R6Gq~21Jfp{`:I4|!#8q使 Y}UrӥK5 WSEr4+Z#.(lr9o펳Kv%Ύ]3&b\儗w7%ǒoc x:tj듫d1'p8?p + /JeVi_ 4C)38Zsm:,L/.yxgj)i-n[Ef<LXuq9H #CQ4:v+TM!dSY¼ bPu;*2F_Jֱ،|sL75uO3F\BQvq/m\:Ia 䭖˭|6i'vᅅy//ϭ<_'&fO= v$j wN9<T/+O Ibn(4;b9v!q+0p%=9 F;^l^\%cy:hAɪ :yLۜzU$"mMG>._zm#TKJ\Zwߜg:g&!S7\`rWx:\qu9sܻ3; u4u:;E\6FPnp3O|I xs/0J#g/㋅GTSѼ-;c"{a8 wE &ꈥdf 8 q:|Ɇr^]\gwʗxOMYo>+M] ǒK'{Oc{y//lGWRHGc3 ѾFغ5h hzxחQ.\vqzBLƿx4`w4 <u֛\rtmt'\h]K^] Qalq8Ӿr X8srNS&WF2g-ɯ;>yۍu;z9h{֗)iSH ZZ'}+cGKKms4Ԃr<}4YP:/" 7`+n>zSLrw|r+%u> P@ *qyq; W + UO FCFw~N٘vI$;r2vaر柈mnA$TlGSuMe58].2 Gw7֏JeGOvk)jLCX;<jvޣ| 6~'8lTwy8ǩ~!?M,.Q[[-ֵ ˌl8c^*(3[+ cx|2ZJhǑ~%!wk\m5Yu;߻{cy~ۉ-D|Bp)hAəa6q6EApDIL$rҋ1ugޏ75cfRD$荌/Dm vYb*Wڥ|5hc$muRu[vvG2 /RmmtZv.VVbk]#XP0M&kvuco:+gR]/2alD:,6\rGhAu]P|gY/x9x ΖVHLq27d7-vT,׎m|UsR[-[:vNq<ك9.:E,H yG;w  >88x'x{RG#yeoj.k7Y'ܖZhm)l hl^W,:,nSyYrp3up3SFR iu3ࣕ%Dv>}i_S5Z^Z>ѐpNs!RL}u|>79潤pvlr9R<eJ]5Ci\Ɔ@W]佗0q(hJX ,K9<-eHKU(=ô p%YLa=_|9cp]ggI=<>3 >7kÆ[n:o'_ԒDa #[p9ϝy8RBʁXhnYnK[=ݞ[o^(:L&pR #_x|ܤe;Z2F65ݎr7]Gdv $lir|e$nmI\"[ <v>Z$Na8{v!yr+U&:.-G3}DQLs:6Fl_:߁/SiWY-<)8$.wwKւFLJ{s:i^Η=a|yw ͹p-ޑ,lØ#Βx?=b@'B/8voڼ-~)8Mi|?KE~J6&3:GGeڎ ˸C]o^)w]H|vD!w^Z{i^,ܶhFh 81Ӝy]$;(UUXgG.vM G}pVIIr;\Ƿ+Ѽ EqՕ0p. Sl$>'D*_f%ڰw9,ɫk\c7?٦7EK$Í>T.k\ i$umq[6StQ \Q#$ a A}̥Hqŭ2wGzqR_Vt}QmU3<̌8Jӕh# w!zv.-@ fbwiϒ6-$i o'lQT xs1.&֒p5v-Do1cp|nӻv8?q4׷e;}ItҗzNǝuWv+c$ irz:4KK3FKz;/ly9:lnw.?/t}쵯ݶq == }%D0GM20Nvˬ|ClnnUj/OL)d1|MRS20mt=n}>~]Q'N*!/ _W4l v#d%O>Y7Ꮊx.u#`%eꁏ 8rcc+iBClAXv`xgR:*Y47.c=w5UGJ:X䶸dk{s¨٦4Ub{Y#\wqϜ̱o|NIu|7BTQ[ydSҽ[lZ۹7- F[\m,Jg?P q$7YSU̶Z#\Җarcv3x[7Qz:JWQKOL{{\;rc! I+9XZeXYM?;޵>ݷ鬼IiQJǖ[|%N#ZYY$swpT>I.<YXPorpÖ9K&缒^e~ #x~UO$mN0 hqX ,]I0+Z [sM CTm>fܧ]8aCarּiERlQ6weӀHb8r ?ķ^jC8>BD~5w(54CRdž _7P';N=>[ӄ;92}l+8U-솁4=nGs,GSe m pIN.wwkeg'5>Glnp{~V9<Z$~/su2ˏ-]_ʶҴSgkQŔYGitAC0=| + H.+FxB]8syGSpT55R d IV%ƨ;4\a$gό8'60 dML35o,R_|WSrJZȩ <`zʉϭvɫ-6o'.uDn_ q|M 暥reKdkt|Y˚Qӊ:gRpj.>v8DE`ֹ8MIxP/4Uܫoe8q:9zW`dr^'6kbzZh`qUHdلck+ǼO4T{CVco|}'̵59h:fܯTHؚ1ðv4 ][ -7x묏P\B5C팯=z^%fdq{X<82V,ϨT7M,ʠ5dulN6ߚϏpӦ\|s.9C2>8gv;O!jS o >eqtqHM׏t>eQWfg< VT5nmddO (]2o%ro_=+橦 =E q̕oOVX :CvgJkӈlo%>Kyq5Ֆs5sO'?Ow> s埖>.>X:QB5[,$isz#_9|_|DlqQ<1nKr+kegp7 Us˩|͏mhƧyoQmIIS-J(*c25= az]PeVhV+U.{ 2JG67#8S*EEkoaNdv~FOpY ]T/1rGF (%h$[mbNzhڗ[V2OƝٙi/녉QD$˩nj2q J!R jF0| lFSQHKhlLۥ;A[ /N)xZ&^,7.9浵UUmDl/ {r3/ypǎIW+[jOJʪJxx`L$`g;c)p57+o{X1;KH;c5GS6:̵20yg9 gnFZ?!p?'xcqp}UY($Kù^x`JP5=AYqņew]j8˵5M$ל maÈS\|'6.7TCC}P&:;;+M%3dsA ]5ϒ΂ws-HLr^n9&7zoypa>3α ss(̑.k^piw"<ו8[ЎM4[ygEtj[|=_񽗁*il3Et'K6{IO/+e]EC7=3쿞$9]⦑ďnk[[/y$F67{s\R9ia=srm7v^^ L]]e4l"OR{,}Fә} -vnؚ>{iM ϗ[='Ky<21lz/2:%~Sb-MS1Fq OC1|K>vCh7[EM#\XC\{a*|rRYv)j'=K?:gٔzh]j#:@)Gq=G {Ǭ -@ߣTQx'/wQ$MR1 aom*n.N`3\>0W107'd쫢klG-[ {t4^/q2 1XY~jmy 𼝆?BZH%nv 輏{⋷^6]_I8Xa:Av'pw!9IXXO1uV0ͲO$RHJh6`g]ǥ*b1ݨ_JgmgVyh Г3j͆K qMh oqq5DG)\܀r^FܻU,6LNsh!iف^؀Z=!{~%orɯywEŕ`jʮ!4;wp^c7¯xI]+]^Fqyƽ[ nNifW[_o3I9ˋwp}J*kUwjó1y`(O e’&ޮBX~qhp'1շJS&-QJpZ*ent76qڶ۩o:Z:wd:&;i6euƵr01ew3񇛼3S4p+[$#IA^GML1%s >KeUnKR4g$4y٥՗xB\sHһzN*[a{񻠗I?Nj='9:~S_'Vۿٴc=Cu*S5+#Kysڎ$lmX>w?ع†*x($eq~|C۩Sٛ*<'LѾY-]#-W/pR%7~ª~;_$.sy*sK " _?>|&~ۤpx<^m9%!|~]39".T}GQ39'FG=>A+ɇ.L%ח˧,ꖫ"71pf18㛉9$Xsز_ѿK9Þ?ۭegȓv^Y'fsWC#yN?%\bCi#v> ;6:4O #Ð}'ֺN'I!2S>~jeQAqxfɷĵN֏+J⥟t52bkpkNΗ+YÏ28KMI4MK L+a=yT:FֵĝClARqв^D(uF2Apr{_qw*eᯎ.#c}ڸ=CܤOzSJq'ʊ褳ZIE>Ljվ~f[EL:صqqr Uw{wa^-l7y|ʁ%6H1KF}]-= McFe^rqpk.-'8u}7?nY]k}MZBql3p q4"gI.:TKSR9t5ظ?)ϜcN<H56q cpWK] cW ޼pp[lƚtmuLs\֟+#8N}}Z]iDѨΒGo~{בUxL\$z!kr: th2l|3GKM <5+b8h4:o 8FQ h`Emڳ8]7EoKT6nLhˁҵ>/"hÆu_۟>0^cT3ZW)1YKt]eƽXs5/ gA_Ң%%u@-s?QI|v/#⻵>W UhƠ2 `=-viu;@_7ĸiq[e~ߔwé2ֿ::9[7W+y8Lδ7{E<좥v*bu8wX8 {˧GW='޼]oİ8>_῎K¦2QPҿ9Oj(~_ $ 51gcvp3{9, }2f)ilDHײR845;r'>h߄kCFA lme`tIozgE?0;ʿu֞oFAϓrymM+Ι@h9oK(y`iϐz]5). m 5Y R{|n̸_ 6^g7.k?W5ߺҏ>UGTI,NF Q>Q+c7n;4>UQ!9yĸPGr… -Z)H*O"<gAK%ml4ЌWEo4Tpj26E1Z֭xb\/3|_mAҭf\/aXkXo_H)puDˎz[UxnwK9ukhj/|?N4Ͼ =lq/L\+RVFr2} Y~YQ,uоLxoxGbry/YY.y#ph͒?-gܵ}_mqM%1B51/yжsKƞ7?O,p:VDTqEpjZƇP{r7߽C2p6߹nK߇Z jj8Rᖹxr93YWMH4>7 Lx txZ扽?moq,+2HXSE[s|CDhQwZQw~G)>;T+\QY:x~_?mb5)ҐyNVm-Αp + ġ?bM*?=ˡ c<ύ-KKHgi/F7? XJ;X5zyC[Q$b1h(%v$n<<$ݧAuOڨpo&I?C>\)AnuJʌ.sk~^]q\ ͣq_Ѐ9;ַԜĬK҃?jp Y3x1ŋl_?bsp53.vuw1.O/R2ir?krŲƄӴϭQUY 3]Wܗ7j?$m\&!iUO7N1;2KlrGz}_`,<'z~W 2;\db8yMq{3tlzٷH^4i DD sOå0A!cSվY48 =2Z* I—O6(v4#?j8mo/q|O. /[X^&\e&o zּilzm6j˫!fX)n1#. 9Dp7O:^eo<)?7{=m"yji*dл'i d9I-yX\'nA%~׬?f[G-Y7SN%,w{X]Ä mo"7 ^#-RN.LcrrqkhDO!޳K!$c,8fHKEՃEVSw>N^gƧݒBo2?\r4_m/;Z,?mADpX8]G .A_mc}>kE77eSغ7Ϛ}[b\/<$pT~D? o6S9jt+68[ZR-%u?by!C%L4w)IͮnZvVhWs dDD,.k;8:@S\ΘEQ}/Ιx%p moSfg/;{mwc>aٿs OOEaXK8|2y _׆jkfYAc.fp)\t>"2.Hzΰ+W O=^@>48[=.AAcX ^ ˽go}fj?}XueE{{۝ܛI/-I ͌ u\xEQrk:&"o7GFzz|񜬩q g^Џg`x"S[S,] mN16a DƑH:KBsA=7w@H#|?sBNE{{o|qɂlg̜kpn }lmmS; ts/ܸJkuũ_aꪊgO$=n, G֖.>~{|ٿڿB\6 -}JKjF޹}CB[YY랮CAW7Ғw65INM?Qaame%Ϟ,[7ϞaX;.&ĤtcGE(8~'Uk ,eq{ҤgOg=3c,V\|ҙSּM[$ZT\D)<=GN􁣣3_(,FE,.|]]P #,/{ߟ}qm/Q%e`0J7BVc( V{777VaXXh,զacc7q{w\\ݟ1˔',%$8>eoLUBGGa͜B\l7Bq-}|G B]NMg_,A!a7PEčkWQnlb]+JPFӪATRvq= u4˚ۯ{ojjITTE: CYgF0wL6f)rttp8W/gN8PUH@`WlgّccLY2k,_Ph,{xglzK}vc£-~&`tжlTf˦VU&\suoikS\D#|F -GFn[Rw?rroßmܢ>c"OeJRnQmMeTL,]cwi?vt۳sߞ0WbOпGa|b2=}``wkⅳں 6mR(/>tК5k$T*uV['3>N>_jqcN@r9'2^mm8J4rQi z['ޘ4Ke󌉁~Đ1cFzz: aF$ˍ_~,*`X0K2`mmrpx?@+=@9`5#BQ.\x!Ei\.722͛׮\x\#)Ӟxd;ML Wd~3f>|a yss3a/G1Fw>ɇx}CO=kݡ;ѣGgϞM'cfff>>>nnn&&& "Ūʊu000<:k5kց]:Ғbi4?iZ[[kW.< O#rMP)onnaie- 6 "$|]v(f#I^ϧ(J$?2 'INT$mm2Yl4IJZ Cy<dΐ,̙3'55bhϢn{EQ|>M8O&JPT j-b$ȇ)$qR! -p9!|8LHn8Ÿ^ GQ 'Ix<FccmIRKƞg޽Alذac)NPҐj a]j eASaGT?qo#X |p "-4ĵ$pب qPF>fjSaЩ6V)Ӿqe 2R L3S>_.xXV7BK55P }@F3-I...E, ւJЅ\p9#r<_a"[ڒ6:+%rklj] 憋tFUA]0 HBF džι}O3D=j'''4}Zs ]\B L16{XY#XZYdMJ^YE:s`jʷ)KM,d* ffJ=cO ~۷og="Z@I@ `%#Ewu<~} i^(::9;7# gԗkp]_c``EIII1'&&CF%ΞSYQ}~L:T<4DѡQqW׍Iǎsp{i߁»tߓĆNKKO>~ر:ybbzC&6RFI۽ 0J19N=P]UwFLlQ^Z|1 KkRt}?@ssi>˹~9AǛߟ$^MuՀ@ EIO5wхs'+IrvqF'$Iڶ0 v?|E)_o-445H[̫E.|e@s3}o/8+"j@{zGG{B3zp0c݆  |>?vX>aÆ A ̤zyqQ+~>K{|]ARJq(}U"b?xC"gyj:X؄gH7lJgVG+5ݬ'F9:4J%nZy@š{ٰ(.w/I&NΝ=şYs] ~,?)}X?賮.ՠ+ryL&437穪( vpr1x\\p'fyY,M䘘,6!I? NHXd#H A"Z!)"} ¹ KPgieӽV$-]/Dt*@]>vэTInI.O/>#k*|pOz q&ЈQC sV5I:;;,XjkPTx7u++Jٽp]ǏdXU+׼ST^>S)~q}I(/ 36*f+YUbEg/::8)=񤒺IAa):~? 0gkF5o?}XA!Fdoz2UbR|E$m|MS-}-84”׿ihe5Yִohk=|.?Vw MϞʐz[?q}]^d NDDfYSaYWT_Whyiq\$^Jӡ$&?y-yx?*&-ͯZG.;99$I>Ӝ NF sYYTjZ\ۢXzgOeLL~V,_$ϝXWF5WVw; fz=$v/\J_$_uy75~B?֯}uպv|9*fؘ 1strU)Z-NDuekoǏ 5jjg0OO~fFNR_hkM{wto>,BO_Oq ]Q-,ȋOe%n`kg_W[0Q͍kU]Exe,,Ѩu)ӹ\ގZG>jus AtYΜ)qT|A@`ȸDo[I<$=uيickdG^p&.a4ˬmM>7sOUe9t%c,׶{s<CziI]gg=HM9]u}]-l*m `l6{zze6˚$)/o_@T5Vӡ+J[estrw $10X,6EQRW7 !ޟxT*%&&\Okٕ$I<_SX$+  5I횿k{ڢ ք H|F?z`[{'Ny^=q2_Jw|$$M غy/-suL5J% |"!2T-љ,)?&"cmm-[  ͊ t)+}9e$I"io6t%LJ߿£ AnLQ!.| YgOr8&&&&͜0qㇳ_rtr8iZus0zF\p%)IԸ@xdLsy7s@KS'O8$I$9A}p\3PZ7 qcx uIENDB`davmail-6.3.0/src/site/resources/images/osxgatekeeper.png0100644 0000000 0000000 00000165710 12564151525 022272 0ustar000000000 0000000 PNG  IHDRE5 IDATx]w|TU?LɤP"A",(*]]l+ڗ]be J&H1* uf279$XOys߽w߽*TWW : i(xODQ?4\ jS(jWb XX 8 ]@H 75r9?N@e06t<>i[EZ u>i5m=ඞD{ 0t9H )s9'˿$Ix5q3ٿ6) oQ 34b?)xk _iMx_^C1@G ıKq9?+PׁA,o˟S*" x"֎(Ph GJ.IJX}hߴÆ's9߼ ԕ wˑ sν{wxFP)B}Mٞ-?RQb:tx:": ?4M+--Į]GcZúMiJ[L*5֔q&M[? 7qOEHs9?\_8|A9:Ȉ8]kjSp]=z[D/ڿmVIOMawu/}KKKnZSSzeeeEEEddd^jւFV=2Z%UYUo5*C_ D-g C W[Y̟Ы]]U;}37vpߴ_Ǯtj8{xkSFe~=Qj|z5,sku5xw}9>KˆhV_Q_n& 2?ٰ3WYC=c#dJ#_eφ'zsUamŦX!a`۷nt: >,++  9tV(~K) $6b8?{7P;AkKEG6EWPVt+6Ul_~߾ `9[~ jY\v>?`o Z^1f~ uV-gGޛ:,ȿp|s-E5kk7o!Y/,t{k,@aBǔi56Yitk}n>=#ų4{idKn>ݗa߶yF`v=###44vWVVVVVz<Ќ ݾ~CEQ Ϗ9Ae쾬FWH(#NJG?>aBގjf c{OدVg }q}h~F-ޟ7Lxm;]hrOM+MNI21dX =.lEq̤'Ի?5E J4?;xډ!|?u]gv e.P]#ThEb%jEؽˀiG3͍N|>h6XX7z~Ơ*A >0zl> H#Ŀ߆FA8 Gkaʶ?:YPA_Q$Ƕ{^έ2>5n}s+o(SYYYcƌ;t[M&i{e׳ƌ=us`wo~-I;v?g{nofƵ{Pʥɢ7wz $ urlIs~}o߼7+kvw ۨU}/¡kO~Iʾ|1cƌ;vjYE|r̘1YYYYY|dw46=|pOc|k45d1WTryRStY-":q0!%28%Q%]Rda pA2ZQrHA_7(|Q Ɣ!Ty9ev UI?z"3O. Ѷ/!Ҡ矚8N=sWykG|6R r䃉KSߞ56XY<U,j MΪe5yEʪ"zʠQ}E1lw&Ct_i ,-I2Qֿ̙e6땎yAE5;6 ]4H?J驩wR,jн4]סjG2/了o{֬rp5@WLi2:nt뺦i6,ڧK4|2"~lrH- 8(lrU@spP@hphHPD%)-dBLa!@9$@ 0B0sDjBEa|Lli 6d2QO7j$1P ?(QD1;OEed*&I("5&)}ڡ?6Rc4)̒g͖/>6e4Ms۔#îI1=GaO3c3^)lEQ R4d[=_nؽkIQCDAusDbpB׮]$&/TUfnݟnU({iKoB(-X{YqE5Eמtz}gnH@D|ӂ@A ht$][5Dq؈K!(,^3LL(}6'߹OkQ#B|K?&pOz%C5 aBDGBh4څ:Tߨk!qtH'uQVb mb`0@9-!)DAFn6M&0*!Bej`V P㍁t] ijM(z'9ùNeYQI~-TeߠC jr8-k kcw| ?~jLo%I2 $I.>1!I 5,.I25؛+JSKznAt! 3~??JC\Vuiѯ?tSG?ҧ=t ]cj.IRQ7wH5)ޮ*HRB(ꪪ/Y(we+Tx0kKo;ih3K-]z=odegd^#Iģ?_8ȿLs0Bĥ?tAjM2LFG䥽XIVU|1I,XJ/,'7 Qgۓq/Ǩk0!OK! I Q y q8C~&城͌V?MCZùe0Ǧ;{!qo^i։oT4 >YG2 j/Ȳ\VՠG_S%PEcKvWz+2x`RUU5e ${|-S; {wьiWDjBjmt:BOzlfM}B&%Tէj4O;P5t;7{H쓓UU-//gqI$IbzEEIIIaw1ȆT$#'apT *hm ::[F rC4Rhr&hH ^?쨨wxWI{XӮ,K69thۦuʚL ş?Guջss= $Ho;J ~ן'1 ˁRʕ{<*Q=R+^;J٫DZwQW o$Ir2XAEQ[&D˃%IE@v!N7 j$yJ oYb2]j }DKԲ/eggͶꊊ ժZ,v`y=A)Æ$$ҍ#eG ܪ[?tԔ#C“j>f988d2Y,Mjjj v{NExkд;Td3D&e+mT!QQIG>0ւzBj j-M.h}h#9}gVZ|uCxq%4vv+WZˆu?w/KV]Úɭ3l`DDtԡ ?i[;@FIJ n󊟓tʁu'*-LĄ9?nZi`^X5X`+mU+_1_ܓԿ(JÁU9{ qQDW ׮<華0@SɎ QCt4Js5=Q&MץԐ ~̓B!Ǒ6#{WdŏX[+/60BxknٛL&_ccU}eG 8>!KZLrpfڊb 36l aV3נ@tȑZ, ̂Dҡ' J7Ͷ4ETN?~CE9C  ^4( tq9?K<MhvNmԻV~/ KsZ. Cz Qd0"|tNWߒ'k44P)s9?&OLSYA(2Ch/h-w S GC>{؆<ԩm!4~yg:XLk@)f0ʉވ11h~ s9?K=(*Zz *uyto @ T=i _T#Bq9? ۷o^^^^VVv;_vok5EtԙlXPUUuС&äA;9 j/YcmZUAuC}O UQˁAY8!d*2DEZ?C+="4*#SoX?\rUWW;NE]i$tm'?MϿHԔCSoM7G1h#聛/b``````XXXddf;߱c.s~u144چh4p͛7322S0>kr}ԩSHH ,!'Ͻz6dH%:PcA6іD$BK 7dhoa: xk) " UxQsA].Wyyymmm```dddxxxPP,Gs,BpWUU9ΈD|/l߾XֳgO?$5'<󿦭`ǎ4 Kbμ-[''86$k}~NxaE۱c޽{/2xHCs$ш I4T?0]S!5"Tb1$@fUeΠTfp Ś., N!8sRֱcXI ]^E\***RRRۚ2tR^^>dCVAT״{A-RSS7lzBnU}A1* qzA޴Jq:iZJJY_Q}>] Y=|@G15XIZ:*Tc8Hz|p@S55QW\QDUpŸ ;\pMǃ5N___nݺL&YF~oIIIv*..u=44/C]䛚i-dUZ~:wYbCaSWG```SS!vFUmV)ֆj96$5Ğ+mIp ֑]od5 C$- p`!UbcaɄC#fHuazP3F&UPjs=OIII|||=$Ic=zjXZl?U=QyZ5?TSD+W0Խ05RC C:~y[Һa5_) t_}}!]3SCeZǾUE'LiC\lux \H~*ںXvL< =ZsG 2 U+ٿʑ&Ȳq }R?b0{(7n,--!11+LIItYgEgϞ6m*--ԩ?z}>-XTV}E?"]~ŖQ>ŦLwXD~ޚFʷϾuïW9E\xhUUz8:,$)->ǨiZ}ޢw;{>sݓ/<ꀪjӁW_xaՁFl8(*Eu6ElEpC6ih=Ӎ7m<(,کS&?e<4SFd/|Glat|3f ><55 b|ub5ժ5WehQ {= b}}&$K}5eM" %EL 0ѐF~L=@r³ngf YHYTULQ 0uMhTZYвHKA)ZFI@H;[Lvh+AG$J<,S*pa3jn>5Hyy?ƴ9ccchhh\\ⅅ˗/;XK&&&vЁɑqqq!!! V0Qff-|: 4h̙v GP ?v>22+p>f3\G=M{x]כjJM?KHz|ޣ \*&ұ C&RQ'~/L˶U,.D]UETTɤ>r[ӴƖ3fY  Pt\JmϮ14e1^@Zp2TcPM2lYf ӈRePO?)ڌ^uNgRRয়~;Fgq͜93''oݹ\${a/PD>ﯿڹsTUULjHgޘ4Y\hQlll~KƐ~_+h2XuAE֟vv"Ior (:A?͟}7酬q ¹dgɇ:Xʿ|e5S&I9eeן`3ǽ1k\٫kEL@A@WEi3CPiL ,"L&[SA$Q^F*fY1*' 6x$2S`t٥g2z0e4" c j $A%#\ž:tPBB; !:udNw ̟#<<|޽lw_db'-I,c_}:tX,%f]4!5طl˲ڥKA,Yjժ<㲋Ea"=ڳήGc矘ҭi\Ū?tSSNWT |wN}듏}C^z#zTצMӝW\*\«mKuttŷ>#oeIڻ#hKEAg]E]U&A7M}"PG7uEg:}^?{XH;P"TV GĖ0 u(#d7d͊TY}Nԭ s}>_HH;N. |QbphNA.wV)r᧟~:>>X,xjZCGML~d-DDD|YYYaaatF O `tݦub|ƻYtriGċxc޲Z򷍒4?G/vssov?쳏H=,ڱ抁wI7=SU5!IRݎ\Q^ pݙgo3 M(vU$IS}jQ >4=/$SKA=8ñIv8\&M&$].zv b?d!3h(!-a?PTTTUUE充MMMiiiD~*i$:EB ubb9s R]]v%Ibt& ߸IQE3hpTVVvOShh( ~(1FGsfx<*^gep/Aq▅o߮(*>(UN{C[mVQ$Y:&G}& AWĉm]/<14x}vn)/>Eaw4uY!wo|QWeDAgDQ5_ J&vvAcw*^i0f+wε'dYNi x,>Uv"C^Vu{pZ曕qy ͫ_|M<{פ6qq:թD݋ox񖟼r۳n dIT XiKqZ(A%(˂МWB:bȏk$V4 3ϐ8XTz%˲5L@,&afBM@B(i,c^-6Z:8s:Cn!%%姟~bm:tHOO_z1cߟȷlXVLՀ_  .!@j.kd2M0l˝:2:MPHHHfffhhhcciY&#rT+/*Є0̐/4UlZaӪձRA$qU@|>_ߟF[_;-S`)?|efb%U* XkcIAK~Wl7DIMQQmd,Jii'<|CWaALQ"$u tI^F*q)eGÿas9gI-W\l %%%3fpƍݻ7#}0M6y</Gb 1 kt(--ŒAT6V'UTTyj(@ *0B>lt: +B0-˲#>k͐ 5t ` u .Ђg/`~`VC)%I3`?0wtQ& -+!L4z@iZVqŠo3ۢ%ACЙ?GWU544ûw)ZERRRRR#ϋyyy .tK&LluftSw СCSSA$Ѕ#Ͱ'Ԕzuul ìIXM嫪ƚe(7 j Q N|iwFsЇ Cƒ <4 $EEEo AWaCɤSyEJU=h[!6ݴ" 2DŽK'{4HaBg[?web˲(py^QQWVV+/x:d;vt)"""((760 o^I55wPvkD:nhhطo_FFF@@-+ضm[ZZZDDD@@}m C<2Tgg;+aP 4 9:jk =ӰThI755 ͆B7.xa &F"kBjC Ӣ8j 1Bx>i@V48EUv.Ds)* & _8>q?⟍DGGGEE\[h8kkkkkkdYff濰|r4ka:Ç>|vc"W7WT(ϭVkjjjrrrppFc< ,7"43kn(4Q)p1͔G3.8±uXƄTV{}A-ptCÊ@ SUqP 7xbu  lzE _ MZ;Fy ۨA+V3 b$n?w\^:.l i?[ϩҬ`5}e˖QG*p- G^H7] i+C'SQnjj%`FSقJ (IแF5Δ+cRE mЎEg؛iE{V6 HA#pH:I"Q!tg uo6T{D|ѨABj$T$Wd|$gxFɿvR7dmk1ASNv o_{-=m'’%K032sI+TL AݾWMT`aR$I.l63,cqB .41^?e F^/+R_M9??eǣZ[b.u3j8t Ў,j= &a@;=Y|>b*ᆽ¤g3Z0mo[hj3Oa%%s9)/? u`r X賆̀㣲 սD(g ;X%h j/(X 3`uP//HhD旎ms9/}݆eĐR/3ȲU Txb!sƵ!zarfBe  s/ TII=6g0YMhcJA 88??eqa ɏM>c`z4qFE"/ ,: bp>fGg$btfsY$=RCcE0Jaeeꛀ~1fND:O^̞n'jbn]9??ec`Lq  [AAԙA@! }5N0u.@Y .=TȠ.Ԓi" `4) }"!- DI3f3FTs9?XNCb&L@7<@?0kw! 4f\ii F=` B @c2i-lJaBgكA0Pmr9? ˋ-\p46GoL =&b0FP`1dUGOȿ5 *J3ߔb B0$ˆ# PZͥs9I/x)DN9888888F7rsppppppo|#99888888F7rsppppppo|#99888888F7rsppppppo|#] s 8N{ݻwoCC Xt]g:x`p9 l6[lllrrrtt4g p8N [xqYYfe|IQ_qVP]]]TTTRRr~"8ضm[eeettl$ \4ب*g QQQQQQ󍜃og!!!&I?j]46 fffAܹŋ"7r3 aZ%Il䚦)"˲(O.:ٗ07!_f  R sn)|I_d8Fq',L&Y۩W=:ח.؝_z}ī?-hlA$IE}}+O+45Uty7+vɴ^ }4~SSWw>{S>|p`~>?3Ob\EKSg 󌁌˵?cg`PNVE_#i_d8N <'M A`kg~徒m.sW_7,3J| ]k>ϙ!&nfWUUUUQ`-:w]=,fGԓhg۷?44 󌁌K5]WI)JOH(ݧケíU]ng|'rlf8gv/tM~aᑢڮW ~?mpv,qS}#JZME8G|kvN0ȸt]o`8{O_-xA\޻ڹw8yС_נ՟G MHuxl:|[^-Il; Bhn{}F{;AhUG 挡nY[lׁC;֛^SN:3csY@Safl6yc|xa]L17c9+[}n蚪g=LyWOtn9썯fM65le |'KTOc2gp.:&s'媪jod{xq\}N *$M 0ʰɟ,5%l /dBO~/:lUO Ú{=f%-GݟL2ɿfJO8 ~"99SbJxrx()us։}b]{]6t[KU-NXۿh/# ߫gUXP-uN+w]Ν֛Bv@ס^M4yxb|04M DX=砦i7'`56~6 wuOXXiymbz*W4vr4-em?k5 ^;M80UP IDATy3)㹫^c>K_=t䚚yo|QӴX'JN=Njb}`'8(,k<{1th;9a栗"Ξ t7]q%ZS9;sqM4/~oss~;:SfhyiVGE\9=֏9r&N'XǏ)*: 4gwlھiϏm=m|FwtT߷ V(z asB.B7}^7@O}3$888wٜ\)0"-ϛz[l(BsؠqL!o@yrAwO.[?&JJwZ] > ޽Gݾc߉xd]8vM)7 j:^~uwO[GO?xoUK\1^YOԎ3^f պf 8b~piF35.@+o!yzj\Pl F^VVVPP\98 48z@[' ]ͪ}Y=yIrC͝lP`瓰0+Xҟ}b D,@<J1NW4gB)9%M05Ny7<`9(~C|yտ.+zx<džϧ1@zz:xLU4К*r#IMijG|>if=@P[w |ejW~ܒ_5ﭘT~'fȚԜhEMiOoObP0Goԋw q( fjD\f~Oxwׇ^a7`t $hR:⭽']z zXXXbb"_@.x A]7򘘘?FN=[zdkUt%]EQ,P|_߫K\(VYt4۶EQỞ{ [qI, ` 173o|s[]/ ؾy;}N-\@׮G|LPQS>~o}aE_OQݍmAlLEi)ԓzuud?8ݫd$xBc a@ L֮ 67_9 X1< A/{iV[ p@Myv`[C:ZàH\8u]QƲu#@~h{wvxoFx-k褑{rpppppaW1,p 888888F7rspppppo|#99888888F7rspppppp9꒒ 89Dž秤'::r0??/{9988.P'&&ۗSq!:::::ZUb8Eiq88.dw҅pK.圇sˮz(vSwnYEMAnn+^;;.3gi}͛bthԕ u:>7o>,EGG;9qv ka waxV_7 Oia/xgb3t󝧑wn+=}T uЌ[ny|A7kiAoY٫6<{׃xٯt}~"ǹ(\w+<隶^Zso1J۪kp2V_)mu4-3t}{)џJ4}nHA/̮~g_rV|߽ԡ*,g -΀}O= tz?.TgM,_myqԕJK`) Ȳdn:0Y>>_ /e9{ l:d1ryN*]۷CfgV| VMs:貦iod3<4[;{XM:g:{y*~"?oiӲ6~}K&2Lfd%&&&&~Y(q9Nh;kڵNLLLLL̚[wr84å _d7zqsfˋsj.P&q,|zhf6}.X0&f[;Pܽ;7?39S &D,df3.RUUU=?bnư '2kfŪ6,>]=W&dj{|ucXڹ\njDv>l՟ ktVsޘјY əfհO4YTd,L̜AUgMmifY㻿2lʬ_1͙ojϳ69sƒ\8?E7Ϭ;o뮻X̷? nR.l{}̝,9/~N/ +6.-]{8|l]߿w_͞Mz?|љUx졟.^nڝ_} ({fcg;~Y>wnFڂz}@xLܞ3j~ {`_Ja{R2:迼gss׽t]υNP5ge1]K3oK [g~"?!^7 ԩoMn؛%~v7=1RMӴچ/N +4MӴƊuMq"Wd.:o]}@SWHyQ&(Zc}iE ]SiUW݁aVv]ghڎHmG۰b+*TQ! 7?7=|<{VUw􋅵jPm+Cx0=V-`3MrVIҋZG}=VkWủԵeuZN?ej<~+V ~t$cRcIy0]8#Uj5vWļp{=MQ)?645^c 'BS< w' #XuH~+cm_D쫥Ŋ̂&>6؏t}8÷( yw{>#Z*N N) ]V~(rퟋ3}5Q0 [wDd &#6hkb dufF [Q a,56/tmFf2pr-qܵ+ 8-HL}&/xŋ .H QdlPh(&-KENn+P楢ʉW]'si\Buzf$Ne2 |RMÜ<5&/b@ l2(7KqK"DMc[[N&WN s`Dr\Z'W=jNZo,~➆w~UooO6Ӱa󦸻O ar_7]ᄮWs\nÙBwj5jk9O>9j=$X|}RcZ?ofa?b۪~~sֽspju+E/MxC`mk7j99EڶmW קo?d3wYtߖ+ 71[\a .<1 fhjJ~hܛՀ13􏥻;㗄m4Nį 27, ڔs\Bg[NT`{ei6**Tln!`2_"^9qh:Eŀ,#\ld6Reߦn?S+i~L~ľΏ-ċD 'HH$>rv'Ns٤`28{idʱyuh Cμ!07u_͝Xr!qe`0hO=;7/X0F+𥦧/?#0(͂'½C7$>JJF}M,.rgET\ 0O/kçOMi``mXU>k_V>;z7מ0z9TUo܉+͠3Z+X͆d"*HD[Se˖=〼\+ŨPu]8+Pa7'O{[Tu@ k()#oweFsI~G4W |i72rK[*vm,l%mAޛzJ0q*R*Cr(@;) k@Np׻]a:"P_%Qe&e91cU~Az^X3VwHyF=4F:-.s< ƹC'Z󮽊2{_8]>lZknMooG@7l>SoKn;{;Y3O q[S^}晵k>LJjP!;*Jk-EiJR3Z#O R%Eb3!@ۅ6jk{mkoky?M軺͠[JNh TZSS&Wk-sBx l* fp*J. elt"3ACښCyyB6sr`CvAV6Oϗ[y^`ǿrfݝ7?;]-Ʈ_Kz]`k˫__]|_ ?j]ݷ]fAw;\wҿ76Wǟ Gc5Os?$1<#q`dWa'h.,v= dɋ?~WJodXAizf݇?ImEK{dL^, ܨ\.UUP2̋x>j$/ ҽ8R{BٚIN5w 9Yf,[lGIŹ ={8cgh/nHq,,ޖ4Ǧt?Dpgbdv$l,o˪y"S^6x Ǧdl([ҷUy6)~Nz2-a,|7t=^"'aY~LX!~Yv"6#+)%~=TPXiS I G6xr7k\^\gn@h˒ IJ|$;=#m`8sdDY&䌿l}OC_ت_Ab.V?; ^[ם^ `d_#/K>xrm`~;%xmƧqs[(ԛ[6z9icR+bm޸Vj[ۿJ{âÝYlK}GͯM IDATt_~G|૔ES<~W6. W7w?[O^?^oA ᗂV@ .\eup8̻A`:dnSٕ(wtCbH /CG Qe`xrL_  ( 9i04l)2&~54lݺarݓ3p5Ӕ l6s\uiNS)g}(cK|MtOo <ԫ+Fqg7ow3L0nf31Gpٌ>oVܤ5kf M_ q;m{_7=4lJ6G63Lǻ-ѱlW^ *67xW%&K#]y*~%Ht.3![G … f͚5uT +'r0AVիWϟ?KORz?AԘ[\AD0]KZ]LGd֭Vj%kmm]`˾3g.XuZx66Ni,)gy;zL"nUVll?szfmi~loXəabX,h~doll>2^~12U+:-.k%{^TuBN]Cgg稛3gئ(]傂i)^E}F'X;ݾvX?PM[ө}R{趜iLbT#f[}Sn*I;Aw],ShS%Jn _Se:^m*fߩzw/nSHc"=E~("5E5raG GJ*nl 盢E_]ZVÕO9pB}w'nh{(oժR={)/r{~={?p`ڃ};E_XVI}=8jUz睂WجVwޯ8orW:VN>bjkkdeaEeT@hu5FHHvxю>?F9xi3sڪ;Jؔ]uR((PҲ퀸z@4{{l[stm;AL|݉̚|imf@{H#=xv} T TSAAAA\5ma>,1N䈫tz(=D﯐[,W*nX\ yLYPW$4ѻ8UE r-4n)*].wLf;[G8`:Ru;*$)>T"JH2ݮ(ظ#^V*˒`Ȓ& 0UJeUv"3uvɖ*岍坤 x'gzh dG훲<u]|馒)7cV)I^̷1&JskeQh *UVN,rTWbl6K74*>*с0>~CS]{y״s?xqf9vKAOKK~wmfY wLw(f{he^̟XyVg1 0'%̮M6f}w]LXy'$ɚ5k$ITT \IX1{ҍK As'lt9Oyo2wky[6fK+rS^* Jr+U{TJ&jxo<͏O)R.,=[tvE^Z҆r~ai8UfRq۰y_嵵*r +*d0ھޘxl`UEd?&E5$i+kw.GABcs粢gnpq? >qlw\Y[Y9A}h4h˃ Uf$>CX&@OG4?)MW9{ŃS@ ]TǹXu{zMOza G3iKEK7 pb_M}Fy8} ŖPas MhH9IPI8y.(W@ba ~~n+2 h[3.B}j#]]v_e6̾uϝ-MϞ0[7vM+@`X,w.s},^&0 Gf<ċfr8\.^!5#lN lُ.z]l-uM&Lۆi  0dH$ X8[L$1@ ol]!C묙i{S__])ZowAQ~F7h^ޟY!LFLvtimIJ`(6V[t"qG2V"c$B3:Gj>Sf?qk(?{>gUʟN\1~3vOowW3p@y<%422Mg$z bkEq`5:Lb(n1Jyo IEN }߯JB!<25:MaV͑`ẗ́KKV~-P҄RD'(ε~ [ Cԡr4wY@@ P0ͳc3⠖jX,XM'Obŋ aXr_۳`y1a jX,[, hxչ`sbqY, 7t/N뜏./A4ܯ`tiÀud6 {F('t0fvڛ=BrH1>2m2uš@Hmܛ8[-WҙvI%Cf=H\X|S֝2Bg/rw\X3WtQrk3Gz r=Ncs"~]u!)sCA&ƒ7\Z:id [aAm٧Y6Gpw)@0OLC!ֹ^vś7G.Gez@QRF^K42ͱ`iRMLZr6DhkkwD~O[ 9+*d/8sWS p3~0 &#acugE=yBX^ Z[̀IKY1ZSuƂ[_5h.Wk(p\qCx1Ft0)Nȭrڛn+0udQطAp4~n6uI]WZS҉P6J9Io%[Xqil(w?]k;0# o(+yo3 Dn~C5H64AlW!"LWj9x)uJFQREfV4,Aqw? ʆc6B.7ZPedh)HZ$/<>H؂BEfjI5病'EBƾVQMuɱ4_{j&yVT[ >K͕ q0qOI=: *%h_bPT |Pkjj3xNO %+קMg_~}1c3Rfԥ72+=S7D;qeW^pֿUjMؚ@%ȴBc_dHR#i} X1=Q땥ؚ_~ sd+^'fH2⌝I+w*R|7 [78I.޲̾xR/Q̪ul$3S) jϒisg?/: AQN LzCpW{zzT*@9~:moܻ<9s%=nCfRxf6jf&oQVH@\za!E55~I_UEi oе$BdXd\`1F7eP&YRᖬtI殭x5Yq^4a߹?K^Y{<<_([7ɓ'?ے(X"8DjV@ .LҟJl6ϝ;wNƍϟg2"heu: LS)(:qc[ {|S2NG1}ZPb5G^ (<96Pa318l63M,-أE(%M aѢE[?d0Ѵ`w,hh`sX.5[h`Y _ 6L /$rֿ;eB{KgϞ]`w1W5a8iՃ~:mNXZޤ>}tݥ#AQ0Fq]!-ް=9#&h$_i{N+_3mf琤4+iH<]ދlʃfzjXXY̞=ɓݮӧO={esO6<V౻jlo7RsQ9 W9+¨F,l}bfqFY#3lп0FI_ƵowɣS&:,\pB7њHYuv|M(7Z@veL ۩sH44Ǖ/>'pIQtٮ<d6_&+ɓ͛'\=,d2=<<[A?9{+gdBCf2{{{=<>>O"䄟-\.fuuuf␉ L&y衇\.@@AqwwM,}@ ;r!ᾭAUCNGQ{px<ޤI7_x3fQ"Ov___D /ɓ'=x{{{{{l"D|z{{[ZZ_^rg̘EE /(9s&ÃC=N@ǧ`0\՘rڵg677NDcN, }O-UY-ka  nnxkou` ~/SDkk FX̜9sC۔Ebv6P/?vx>`*D}>?1_2ܚ;Jm%j&>?(((fۡ(y6}=In6eq@Z!gS_ىMy$/k@5(q"$=.}o?((:Ц,r21Agʶ%(ʷdP 35Q4Re}%9Td9thǦ>lSh\QTݻ9C#&HM4[" @,JvQSoUP16ϤG^O7W߳gϞ={9ZVõ꒳=@wSP3[O9 -++xWz_Qc~v"[,W*nX 9gN`mw<.;7n8/5,y IDAT,-L*nMNXTfڪEuQa9r;j(B% k 2T Z!tz**;YtL;|!ԭUmO:tvI% 2>U4K2/ﯬ-߯߹!LR۸ST,s]zylm"V^\B顁oT;,wUvll6s[Ue}O^\&3m6[o0>> wf{hGJ|ᅧNs\f5,<| W[z(f,lZ;ut~CO;"F㰳5W{%hQHc5 ##+Dq@@O3#|~fUHݷURM`wz9># |HJ.]ޘ6riܪ8ޟYɺṠTSLF3-)&-KEv(4eqagW,ݐ"{G:쬾\ƝF"pM݇))BCF2E概 +`朽1oٗ_xlCO/jz6^Fft}D6'?ũ w@3|Ϯ.7\v$)Y17_0W0fX@gY1w'N؂y-UZɢy33֨ÂxF#'l ^l6@-(0Mk/2m6;wEb6{FP=jmcW1._˞񪢱  fr TV^?U=~kSsW/[rF^z,/܌;#qR\Ź]qK7_/ H0XLB`9)^ f#Mns"e?_g]HP9<0VFI *>92ص B4OqX^B=UO ŹwaKa("b1S@\ )Ҿq+KX`0QrSs 4TΜ~7}8OىYw8ir2qX1[}&by7wx_6_Q/&,mV2lcb^ӧA6oV°<=<i/t N.Jo4hCnOuj/E}NfXXӞ]pٲ ]),Q/zcHjzF9&+s@8ֱ{,01<"?\M0e(>tR;`hP\A/{6}y!m=zH6BiqZ5|qR$LsTO`qeCoh6I˜W#xL =MQIYK.xѕ }U@q]"#)2s"V26n=T*_8uxsb\2hQLFY6Gp\vaΙvbiʴkGuܭQO 7)l͔ 7sQ  ܧy&UYSf깨 nu @ꥨAE=ibz:Ma5Ý@AYKtVq%ۈ2O n5 sz/K 3eֲ|yqgkkzy|-TS]eٯjZC=v,='꟟0p_ cC}@ϳ6J@yKԡVGZ#·M3'*xP(?eQsxgsP)ĀB!]d|rQ8(2JM- a ~=ku뼼tVOLzz0*?/P~켦[f`ÀN-{Wܸuƍ7nh4P_\Bi_|æsXWnE;j!I^k_ @w3a@{ѯoilmj[ӭ3қ8>Ӽ&mFox ̎6=ދ9w,2tVMM7k33͎izf{g1u6]us' Y?hx{{_~}ڴip$ׇv.3-#˟ eL`^+K R\ 0+uqPTH =N*͐De;DWfL2+bsn1Rw-}ai(%%)ͱ*T8°໡l ;+r./&)u^+dTS~O 1yK_1Ga3+=S7Dʮ 4!pJ\H>cp\QN]1 ܩIsZ")K6D?˫-OuVJU [HI-6s:?g-Yx: U~VYdݼ/,nEϋBrԠ`8Wy\_5E~Za5G[5'U%/`L ,EWvb}`:kWM1 YӗgKL]iںj`FEvm* X$ dEsV]0YS?>M~$Iテ(gU(IU~\kjK\=sh:}NY,ڳ 5 _Oj DS&R4sΝ>}S!qLH$Ltm6lLQ΄&_f20<9l/=Ziga)ei0{#`tb>#hczͫ>#u0t1UMQӓsg$xQLokK\ĬQ`rxch -X,c:6e)dC~-0Yh`Xc,4mbI4M uJ E Z6XLih`s XL ,6aU_]vii;͍`EDDvbz@0{d[gnjj:ydww%gϞ=le9㪩 *{Xt'AÆ٠ $? !{Y5͠>^TRqkGI@tMQN_VC7ѩmc͛ }ش/?;110q[;r i{YU߃1BnX\b$oKqc`:Rù`.Re\qt\UJeUv"3bg֎xY,K"KNdGdW+eH6ȵC~_JlwlƓ-4˝ k\V>l!KK=A7̏OJ,?=7Mb~U)27nXSXZ%\&K%m[0 וkkU3d@e˛O4*I%ܾ\Vؗڱ̂ŕU2r4f]wU$VK;P\ cu+Ғ6 Kǩ2H'?1ȩ{h4FWRtssK:=V p]n Ŗg. [Ǿ ip z@ZX`ix\л[Ĕd. KkBt=xW.]%D`}S0yal U2}t M(`A`3bP!* >&rĸ@$À֫ϰ#'wY噑}ovAtFjӯY's2;$(k` .}q !@ V?X4x<2=N& SC;ެ@KnJhhIt BICqmʢM|~HXsoՠ_[z&=nշ ĉ|"L5G@t{>q<t}~PHس/THb2XL k  y2Crݭf#pY"?3&Q)gV nM'H}Os*KLjk()#oweFsɠ=XS0d_88~1?Z_hNy7_LF Uˮ+ŨPu&Կm{MoO;e˫.i4'NC 0 sT鸼(.p\k5:qU-C\L"?!;/54jC 2 sEE5-m o_pQR~ wuaGfRCg+G/2N(JעV袴Z}v|(@ɚ|[HtAY : /FKQLj 0jM (Ωtj' Zx-ؘtږg8s7 ZҪS5 }b 3eo'dXD ׯ_6ׯ{{{*7%*2*:::ac GV;\JѩLDB7䪶P6]'#C%𲷋Hmo1èIX2.E~LL=?2=`C(,,<2:vۼ](䣮G%]k1K& 2"vٻ|OFGiDQPQG?BnPfz[uus?W{.~/5늮h X5-D1 G 1X=s~q}L;)!0yY2+Hʊ z*!{w@~R(]%1s~)5!qKyҀ`wO^#)&;q:08O Alvى'sIGLŠqz÷~{TV $-ptn+ پD\&M&dRM`\\Ri͐+R&ݚҽ9:erY*WAlߝht+w% &A ^Z3Эi{bQϪS|I ft钟 ]C2eʔC5555e7nܔ)S vQ_(owOuk Yo;k˥2B6~*:[Z1 ߬fLq"Gj/D*:;;s5uUŇ|.c" g?:D&qGsO"DDD '""b Zm""": 8hfCHU1|! ""bDDD r"""bDDD r"""bANDDD r"""bA+jZ9|DDDC7T2%dxf6mݶVndzmm d]th~ПCyZ!vZavz]sp;ŰA6R2w87P22CLU)~h0ݍ]܍f{0ݿGXpʸKf»{ ]Sӈif7"""91ȉANDD '"""91ȉANDD '"""91ȉDDD '"""9 ZVGDD4tCIAD"H8'""YRaLDDt?pDDD '"""9X^RRc{}WS^R^cP]VvW5%%U $=TDD XY-oF|0:&z7`N_ɯRy5ӊ~^XWwu@11 `}}?1JWF/_A6BD t(3N[3UDn/*JUVo u9"T>>*}`s7:I,Ċ\r-MH_HQPVvdFX[-f60}\¼_eUzϘm4ee-+W*uɶۻ5Jc]˻j;SY&v9 )ڽs<QwH ]@6!$5 @ؖ]Le5OΞGv*M^lyjWޤe{5\(;u`.=O3jՋ]2ˊ3wdeeGPxTf@ؓQX}NĒ)A>uW")++ؑr{9S)(>~ 30kK|Q=rvٝ.,O;rloڬĘ(ߩYQrN9s~*VZ<-hJEDk_֭I ּ$k(ky=uԋ,A9zcvx3 d4{}Bա @=ՄIs FىaIyk&פo 8B憇ՓR@2,Y kwr @͕jux*c'eM/WD I7lldJs^(+ysQ}YSzIPXX/F҇{4QWZ[oLOl}VxNP]'6>P3E]Qs+ `鵡ۯ"H]=9ʛ:NMޖsUie= _~Z(GGݑC? CtMǛM˚C VYF=,u#Fz XM{-hǺZ_ƺh\܅*) kiXlsu6hlm:p)oWLl[5~Z,K1{2g#*!եBCCd)sN$anW"`49dsE[lJ}?xN z-VDtTI{/) n>;;_1.3|/IT5K{%fm9X1NIpsV@wێ[_N7yݧPVXϺ?(4=:hݎ=IG3!{+n |2:0V޸+|)w 7j9^04oFkk*]o?93v)g(}]rd(ٙ"*tA*u⅓ 8ʀ=Q_`0苶@%H|gWU ԕgaZkyR{}gqPS^\T75h5ՔDL*k B|@[ `zw}^01޾ހ|W6oy<'D]d}Ht*u@l]%t s' Z Cu8t+0 ]e55%15@rt:A0TULO.95oy6brNDVjއ; HXr/| NΔ>g=.zopLbVҎ#k P>0 !l ]e8mMRLe*u= 3b6/@@P秎ڂn0X_˻,O&}GRLv2u`pxFϙh3_HK n:FrGW7kW\L^pŵ{1:#gqÃ|fػ6ǚGgawфُQ>@hoRM+Hʊ z*!=nKcRjB n+"{SM^̄U/T/\E?)om.n媴԰QvݵkwHO?n?`fgϞ8qÏgM`]267!WȥM.rTԑ+'(~&A ,OZQ̎r}" GI0EB!h2 fTޭF\u`47yk\қFƝGDlK. b[ L.)T2nuAT:kyR#i!R.vt'Og}vnw}uNGD4ėe;TA~/2|Q,'""ƔANDDD r"""b1ȉANDDD r"""b1ȉANDDD r"""91ȉ~rjZ9|DDDC7TϘJ$nz˗F#B9~xJ!"=aTYYi0&M /_5j|RtԨQO<񄗗Wɓ'O<ʕ+_|EiiYDD4yUTT5*22kw򊌌5jTEEEG ͆S 5զVe,լƪmXJR"b711{zڵksqqqk9s\vMw]^jٹD]]-o .ӡ8m6.0a҅Hۡݛˮ- Uw |1S.];vدc\tήiؾЇPc;Zvwa8)\.DX _]٩r_s1SW\ +Wzk#`>?yU5풜vV2?JK=:8C솝Ei+ GН3SuDUEhr:J䗷DTĦ䧫Tmer/ǦE>?ׯ{xxq۶6"L$Pu(a[wQwH ]T,bL怤#Ǐhp(Bʕ+ď:/7W]iScqyxndk!=ل0a[vi_Z o-#aGAYّa]tɠˊYwn.֥sՋヶ:u0ѿ /16d2d2lNyR2>Nt.|q"$sT\-^\4UhXVlY;Pز(孵ҿ&DfSzȹ~w! _;R*-a&&p i- A>r%+n#QSK{ʿ>zaO}sk+&9V__u׻xmEE $ WAxgJ&ӧt4'@^߰aﲲ$Xy:Cf}-k\8#)2;?[h5 @sW^(+hDOj߃d(\>w\⸣'>?cx$Immرc{>*&KUvZ.v䠱|ϲĬ-+6}A>TDT^xgϞmhh|K]^>^NDD^Z6ocX,H$RT*nZV#GP2h:my~?6h膒 c""$C@DD '""o6zuuuFB?~JTYYi0&M /_5j/CJ$'xG&f7=&?}uZ0:}&Z&/|U\VaVmZ11 a."bXk׮͙3ťu\\\̙s5O鲵_ޜ鏮.Ԗ7X*2㴅ڸCÔKn"mvof.N0Tޙ[|o7t̳0805^`KP{M, =ٙ٥WZڬ+4>pҥK>>>cǎ5vXK.ut?鈗CC}]5{G .5 G?ŕKϕ!V?;Uwp@:>^F1_Oߧׯp{xc+>]41ʕ+ޖrJomd_'c]3E.v{qMl$'=そZ*t{Wuq ;rW#wyyNWvݙ:gaE"49B{miiO"sSbSrJU*UĶ2ue9c{y׾ bSro^yC8MQ6l.msS"6 Y_(޾lJ~D5i +'U }*T=?нtDDDDDDllllJnQrVg 'STS|{F(ߠȩz] 9}ܲڷM<9;B~J솝E9)*UDS]Y ɩruoCEׯwݶa 9Cۺ#cd66*2󎔕I[K^YŘIG/q$bW\&~wMUqףyl\[-&Y0dEl/koO6!$5 @ؖ]kHQPVvdFXloGl2c֝ۺKu郦\yNL@FrKz]V]y{*N]>m:SYz _],\ 27.OͷPK^<(]?&-XoVxh;SY&J=f}㭷z+t35#ǏhؘkY6)ht>8E1IG좿xyֽy4^^wwtQ*;v"XYH^٩YA l6/fzl:9Ia8Q"bΛ)5y')# BDm⢩*pGƲ,`yjŖ@FA-of5!5ңG iܑPn܈ ;&@6i31k`htO{m ==.IL^qҞX S@c{L[ Ƿ[߁VQi%.PGF:ىaIyk&פo p9}oۘgܥ կrC uRGx~sB]]*W=:.8KVC: 㦪ÛtMTԐ%rjV=%S& HZ>{.M}_X^߷DAWci:z5 J)L|]skzz*hsCV__?n8[scnnn=jlush $+yteY@@@8 @i>+2I H$%%n\N*zMoV%.N-#C:۫; HثrT>ɄyO^j/>w֣q[pʙk6GZ_>gՒvYV:wg8><+SZe}=YMy-@zf }?}M^.[پb̖!Sk3o'/ L;Oxs5Gs0vv㊐?M,y6X53!n]gwZB ONo[oqh) ]iK8g7ţ?Mth9 qUUĉ9ĉ b̙JG 'Oٳg+;l[\&( &A LLS*fRh2) YfGYG)&A(H.rOkH& GGHe\ Xn_:nfEwPm׼U]3{`-ǫرS@D?^ҥKߌ\"H$,j̙3EEE>>>cƌpՋ/^pMVt{JeAVt?m>,F+z]m+\>)A}Pw4v-+dGͷ]^`w#?+яPRaJehhŋ/_|نnnnyK]^>^NSnUp U~ى'z{׏X-jT*JyDDDl.]&"&""bDDD?9kT}eIFMS?_|"""=+xeJWTh 7^=p۳_ WSxs_k;='΢sG ǂ\54ʼnDD l92,zES$ &Q0M&*@=2rd˽nn,լJqoFa""bS/ 6>8j VfkilͭfIMmcUխ_g:-e2ݍ'(""9rw6KKLm06?䯟|k -62M9٫J K wFN.D؉]MMbgK$L"n4_nƦo_hl10VbgMM} DTZ_1KJ~*JM+3@NMmi,o[ UbByJ*%՚U\o>۶ZԕĪ/o]Oݰ('%B(7Z0/1|uMdɂÇvyC/]8|o&w]ᄉ~Ob!V|ʕkmGmJ]'fgiF2~Q%4ӽpJoJ^X87zPE~V%vo.@l^{S0Um;u`2{H7]e'oŎ]o|fỸǏd6n\'"bSAxv`QѾB.^ⶱ زvZeQq˛rC =OU(h{%V<4fJ_ x>zaO}sk+Z[Ͼ&rZ)Ve&" w ãk9rjZ7F)k5^(qpppӏkΟ0'dB6,V[j$e/a#@#>c" ۷ ǥɅaS2ץkh>ldbb隖n]Seצ'uYÅ= Cm|ѰD"l>>/ȧA /X7pj땺74g#*!~ M߳ns֞!.[M=*W^~6°lk+vZUIܮgSa(Rsҭ]jm8)`8p܅&*?ZK 1ȉANDDD r"""91ȉANDDD r"""91ȉANDD '"""91ȉANDD jZ>""J2%D<p̪ c""$C@DD '"""91ȉDDD '"""91ȉDDD '"""9DDD '"""9ق\"XVYVd=m4gݣ37n899N2ŞLx ""{4EQtqq=z͋RD"~T*Z<DDDh;;;;:::;;L, ruyKKKkkb1 ""~رcAl6d29ѽ䍍\]]{DDߧK.x59rĉ=<<Bmm~[__ƍ#F=cܸq&L׃h4pss1#onn6 r"'+**&L0sLwc]zwz믿nll 3f[CCիWkkkTWWO6MR3ѣG84L r"fܸqsP ˜1cƌcXjjj(ȫΟ??iҤ{յsѣG=uSN:ur[k#K=VsE`\wKc[8f͕x:vYfqbԩyyyw555?p```_븺335]rM&J?}])xF>5YiwAordԖf6)>>i+8NJ7k ;`Mj^\w?~G&;fDV6 O<.5Kt?eepnO~CZe$'n0!88|Ɉ#q__-[lܸ Ayiy͡b=Rinݺk׮W_}Y\>qA| m3kzKUb Il4W̵WM kn,MlXaZDM ~}.tL*=aڬ3t. ^)JRT)Ao)>vAb[~T>wpJRǒ)J2;nZ9OT*Og޼x~`fUT{ǾUyU48{z:ڦ^NwWgOw+Vv+ʧK\+JRVtƱ/zj+?OT>^";vҟ^&׿n οM V>ǙJ2#w{;D^?sЎG^[U@<ۧE_<3jԔyAeD2s?sX?__^]{3j؟%~W?x̙cORϋc~{}}::_3/瞹ѣ.^ooϿ7/m_15t-\O^+7zM9 eI}eˮޑXY/3g/4Df|Ct,Zn.{̙coפ~҄ _u:v:q"=nƙhg<у0?螚ߩ_] qij\24jUNz/lZV3 6M(.*dަjZ[OIx鿇:O9VxdQqUUYG1ks)Mqolžg wm߸qCTεkkxHTA5[/\6N7,Z uYWM- mLlf\gk1Zn\7_li]On{@WdɓgΛa7$ŤyXκlGBΚ8ChC#CO&*~xvރRogOGPzyxj@;EMMgK?HJ+O͚09p^hvUA6aNY3&F<5z?anv}ѡ OO.@$٩8t&+O)ŔGbM37yZ'<<𹷃pB"IGΟ 8ە[vy.z4oz]߅=-|*t.͋$7N` OMp՛|hY^\oZK[cB֑w JŔC: iV_SB\4lVpp3rT-)V<<_gi賆<Ano466v}b_6@|C.u]-6qNP4;)-9Z-Rj1é arx׷:-| ǭEԶm&gߺ=3NkSnd_dTOOxx'^~KK^> xdI?ȁq*.;1j/¾_/kx$1jJ3qM#gX }Q PfD `f!CΧCYk6oTd* <.fnaA^f-fM0~O?OP?y͓D8xh[;Q U,MQozd;<{+v]^Ѻ97s:um0CX"&ȓM0[>?p>||{6xOPD:Z-q7G[ZZN>]UUtҰ2 #IZ{<.y? ձh( ;IDAT'2W 8dld844$9-vlo]% uaȫk+T.ofP4̇yiZOgd~I,#=<1[eF|uLLs*Ȼ7.Cj !^3/G9P5Q S94 X&YPϐkTzrnJjpj%W:dAasl$Itv#JWa].ApZq4`[ˠ:A@#>3 l/$ItS.wMyӷ(uu?&ϛ7AQtwKQX&8ιEJ:߱S*vm`~hQx05oݒ䶾]uUaQ[~{CpZ_mnYSB.1Wu[FM0=2]VQ6Yq nO[^Hoj YVMlIJ+6ʈmoo{sQ; v6AYsU֮]vժOn΂?tÂ|}HuTZ6yޓ{*;i恹^+Cp'OK`.( NNgu|~r{8ly9Έc9.B0a9&, ʈ?pm8cU0&P"LdT$.A'ixm";_i[ϛʚK2 )J|-\֮32qyMbۓ9/ޠ7W3RNDO'-eڥɜM8>8PdFJ2h{WCT,52 J{f .Q1X 3Mov G;PQ]b*7ײR!Q~YTz MC)'S=l(&YXUas p݆sN h*Ee$k5ִn-4r 60E)|yzS}^~ wrT5f,v2TnuM |9H-~t=neKeF hG ѱQ,\4440)^9 &Z}|lp\@x6(B 3kz#6꓀hg1J36:qe9#>o.. C Gj(VlEVh\kkN#5lދ,Y+999==}PpY[EfQJŕbw! Wȕa`*0Q+FRRTe'~F~RVjuA">Jet<q[1ox䊳naxrth4^['} z&KF N_d为^18ud20fWT)J#‚Oa9fNQ*RT*JfB˲ja`0(K?x ˼.+W~@Pz ǪJp&%dggYVǓ'M˹9| .l2cI6chHjZrBܧl~_a&9 <Aa4Ϝ9iiih' qAp},s= gϞ=h4 /^ҥK/^3iii,¨rۃO\e/A: D TtHLh4J밓R.^rnիW%I8nΜ9:NFeh6*!GAt-_ځqeR TY-R**,kB- HcLAϭ +|\h  w0( B   9  ( B   9  ( #  9  ( #  9  ( # B  _{ nHIENDB`davmail-6.3.0/src/site/resources/images/osxsettings.png0100644 0000000 0000000 00000202232 12564151557 022012 0ustar000000000 0000000 PNG  IHDR%iCCPICC Profilex+qǿ3Jl5!--[/rB<,V.jvvNv43R^+/<ȣ<*/"%Jʿ@II~/ũ}~gΥsyeedڣԴ{cDAbn[X˹Q=sؚ%췩 P8.8xѵ\I3jx8`F)nj/h){O4 ĝwf7<嗯4˦Xͅnw.si8*r*|8l#|VRť3j餢^ ^:y۞C5S ܗޢgH~f1B`h|# Z Co3qݱ22ad'.9>Fp`!TZȚsg_%pK|&}ֲҮCn2 Zk@i`p. pHYs   IDATx]E'%$Nhz ?J(MEE@Pz^^BtAZ( 5$$?M2o^Kfݝݝs̙s'GpGpGpGpGpGpGpGpG)Vg8$Gp8 ;l7 8#Ԅ@udZѯWjs0wT}%}דm_ءm='G=W3n5N#8#ym5 %v%c5J m_\ pqJXoM%e;k+?]r)>+mSIds*d:n9y8#isFyt_%2VrsrS-5JmsGpGW*Kј_]^r6Ebz\Q@hYq][~U{7q?}?w+TdSks`!JcZ\׾cz\G.EktGp@B,בKъwEyAL(U˕/_sۏmURJe?~\?35;+џ[znRw+eiL >ZnyL{ꖆ|IW*yڱKfs:SmlH*0)[r<[ITJSy'eTzCm?|s=IO~_k2r*yO--.WRG&7U{cz9SyWTIҺ<R;b˱reE<ƍK9z,ܼc.zLkZ'enVmemVNUNeny*c""Q$S(¨9~ PtM)=[Þg܏ɵ^TY[kEd 3f,kEe<-O<2A1P,lLOG"@9RϟtpnJU׭RO1z2O2#rZfxpJS6UV_i6eVLJ_T6|N<<LN##W.YW+t>$N6edm}F5}]wKcߟ9c" 涬4SĬ<.>-/4t@'AxhӨTS-N,q,]`h]:},gC=t-bߵkEaxrGpbw߃g}U:`[GNjr*(+_B+"A+*+qYLDO?|?ҥ'ԩ`pGp!о}{|7/tMs9Ogm>>8 |B u-rKԛZ"%tNک:*cZʫQϵlu6x:玀#8#PO6\IyPA!@Z~VM&U&uMQTWr-rLڮC<}Y05ydWIl|dޅ ?O>Tg^{%+nqX_+rL>v_{2߂ Hʹo'_~|2rLf,ۏe6χ~@JڳS2_eʔ)'#󏾐I#i>sAq5g#Ԇny'D#%hCG*T6HyAH:VCseR\=,^r,֣"[R{.ӦN7V^y  Do{P޺"Yjdv4 ?pнs 2Y/Ѧẽ/ F\u'?+cu  Wf2cRgN '|Rиsβ@Y[dEd,2Vozw^eYF Ԥ#F/,j 3Qygd%\2뮻%\"-XBz:{90s#e]Vʜ!#El/p {=Ckc84ǙP'> >t>JˊM<|SSM:%ځUFf*5gr*Ө+=QydX{7Y3sJ2U#){Gbѧo2< _vQKGWYi@{.ҭX6vTQ{~ \ݩ<4y32O ,rC!wPYaIe|2aLvL>^/K_^6*.;hy@~y;6nuq=z|G#~';Cmh[.bYc5On5\#Æ O߄Z*\~;w뭷+"gyu=N0AFe8Ӄ>(뮻nQws jc7NkYuPE:I&iReWTQO}+݂eyZ:%~7׳,- SIW_v㾒Ι3eWB?vclv2WWԫt2J&x6aGmK6QxhЦI6SH.dm^}>gSߓ>&Nq>n};=v.Kh{"s뭷|ҡCv ίlz_lъ?N Q'':RM,,rvHfPgCt׳N|#s.sR0kSo^-"}eNImvS;ЋǫzH}28} 2h~2}cOoofie,*ӽ \FaatgdM[n%ٿtEY$nlzӟ4c=V~_%: sa*p{1fm>Z17.G򗿔ZJvmK(vm2dȐ`tb9 ;9{RaG^͜{w_Ys5e̘1rˋ/,VZ)8L묳NɁ /0+&t_=[oInϜ?vp7~;MLjy˝DChwO˱r-e=O8ᄐzꩡp\ ma^wygdW ӟ+ 6u wB;x_}T1o,yrZ+Nu:6Z~lj6]J\i'_?*uBx(M|H wy1 t(}v^N쎶K^)w]-ݲzݥo@N3k;#]tsuNY3 ^&lߎ 7u4wv=艮2}zfNMnw/{3qSY43yd[p,qXsg % /P0?`pzdQ^8=t`{cf6c`h#tnmUY7d FvMp7*CBgq]w^/<ӡS+81Xnh aUWcv:[V[mR]8/!y<0f :{x!a}gor8D_I)!^ԕ3Dą(sK+R6pp\veaHz^1ǶZ;eњ۲!KR{N^yl^\Ck4 HӦ잒PtҳW.r2C.3٭WYEval]{:z*,C3XKo,?pXr!A9CfKTD2;8tf 7s@wELֹqtzLPO1ae`=HN p1m9Ddgq +OhFs1èF#*B`I\#$%WrQ+gKSDT#H24Q9T ȵl$*vξ?L:e3.d'z´B.0BŲ. o{ΓE)D:ݤ}&]3U)4U:d xc&U]s/(_t9tYtgcL񓿑'Jɓdbvz$?kSny960D1jCSq۷o0B mV\qg!} ,gF YDQ"9᎛gl1ӾTֶl e$uPc5WyK6J-S/L:%tIҺX99ИPO/-zg {X&Kd"JlSaHgvɤ,2ᨏ׊+.4N;,YYK!9$L= 8%Fv$BQd)8ij}.7`<zT޵3CG8oڴPMfzKYsM Ls#ȓ*<Q#68,S(x;dh C?N:4S4FhSY*c<ni`',$:> 5`~Ј ww`С%c@=`O΃ "ògF6t<#,AWhG] d߇Ώe\Nne8/ns<6a{1!F+ 0)L:%:CҲ斦eU0+P\vf֑1]QtYla4E^:医ܫn)oyQ2d>!9$nul=ؓ/f2(p[f}NQʈ'gGC|NYॳthM6DNmtʎ"(C*&՝Ӛ5)`F?aŠa l1ѻ`.;{7ƒͲ^ [BӲM<}~kyX!mjw|B8#I,sSx\`1I"+8'0#B'4q)*!68W,x G&XIա38#yBĈt8L,#qyO.҇'GPKNeu#MgJƎ mb y5N*M:*O9Ufl/L.lcl*5;iQNIvњԭ0s [ mfJKU+MΝmEKܽ ֗^H^}mYY߅gg0#L8U {Z_Q*2д,M:DGG;ԋL`" w~z0T@o~6D;2(\@Cqh2ř>ZSRn dsC[ 0O0'tN1ּ#EIJ{ O y=_p:#»Up@tjp:aO(Ǚc 8>8` 8)ӇィXv~S6Hǐ#0$6a,~0 ǣ:J6h?BR)+c>8ggN!A$ay@fD[ PYl~b$R cٙ4L%<.S&C=CK}68Gʷ0/7lJ. 2c{Fdlvq( +|oΖm:dƃ @:>'|}Nt_|ҧͳcFOwTh6}*n% -2Ov7Etc7d䨯d%w3jGǂ% FqeYB wQpbؐg&1 SHc  ><3^Mw15g9!Ǿ,a] HPBgnAY!Ggs׈k"[.26O%gǃ u p= YQ^3etiO}0ş>hD\H̃:q^1/މB8p`y4'G%ny=|28V IDATS-ֳbWK ns[Ɓ ALu*Ά-CeGhyzl .:ݲ+,. zfoz]w=|ң}fLOޓze)د:䎋ɒk _>{!Oze,$]n2oe72S8͋[n䨶_[u aUwۗK (mmB.MX^%xo1xܸos̐O=5±GDLJ%!65M`FRgW;͍~w6;KeTt+/)9(eSW'm1=su2,R?F)]%_Zd u;dpg!;^7J%>«msOjslWYmЬMqVGOzjyydˍk˵AEƽy?ԣ%zqU3~9BLDM!ĻL@q:ƒ4PSOn5|4x$[:)ke^+qJJYIkzL21im W9Nbށ/:(U.>@[D$rn&R8p`xFR, qmf9vGC/:Iʧ hx\F*(tJJ;-]+ܖU.kIY^SB#R[o+}¹@B@}-Y=NH[;hsjkHu0QCˠmNȒT>.f_NIܖH2:|XZ^YmOގ_78#8 ChX::em]vy璖{oph ]JYs Jdm2NICUvM77A ^zlEMfohVbmZ1kI+Gq,e]-k=8s5K,!W_}{/M(*%PUS3dĉ!2B,C@*6W͕2tF3![߄>RlMʪ\bJ.F=򔮹w^j>\rKyeȑ%9!LMҶW\qExĘ;GϗxGy\yM/[/8 SsRաH_igEg8j_E 8gmQfQZ$@R:rvbЭ,Ͷr !@ o39nW.#ꪫdy V{-=viX}MZ^{92O:Ys5Fcǎ Fس;dȐ0mJ):ȔS׊3}^~ays饗KNX8nq^ka{ƍdभ:ξ'z_};/.]nEL{)O=nc9ov^ZszMq.aԾPײSGZ\h;,rܱr<mʑ۱mo<0\lHr?tȞ!*|ͳaZm2,諮+~X1F/2#Af@_+U8otCj>\<Fm.oC=4q<BԀ~8M`PsO9蠃䨣 u?%ZMY~|S\,\p}ygK[wuSN /c_ |~1:?{^gs?餓da<HqhÇ2rټZqyB?p9RgS8Q "O9> #8zRgӊ+Yk^txE.:{LTHɛo6ӗqء Vn,aWS۫2\4^۪|\WLyjOIōguTe`i= z"‡ J^RxwB#Ic8 cx, (1LV>tPVF,T^zcI*2 ",,Mw*ۣGM _(?4.jmwlWRylu'$ԕ_j4`1d_틨 of5QRX*c7*Ou,+l8D6 qiM׫Wxñ""RžR=ɛwqTyW{/,C1NDDYSӲu/U?::y>gf#WG=&Sj;qݶ mW4dXjO#,/RAO86qAr9MyN A%[6m$f?=nxJgo Or~wq|,7x%'ǓwİXk 7x%YXl@⃧&?r8p4C6(knR\S GE-4kYersE2F8%Va[fиZ-NJbY7~!i&`[GpZrvUjNX^MZM)W:ZW28#8@"lEwN*t-å}LIzpGp*A~+OoVL%cU-rJT;@[mYMkGpGyH<[@ۧxRNI5 ko+_^XNsGp7nM--L_uS+YO*o2|-ƱS|9#8@\zQJLT7VaU$ى<ꖯ}ؼVcDMzpGhUۦʳWi*סh*_q^O*hAum#8#4쯵)fVF5MѴʔqJv>C* hr#8#P([]XMthSi2`,SҦ?/:#8@cPlu~7vԬzUN$ŃFRE<+WSצ/g}&. 80"n^j9#8mUjuJ1Q5$7Rb,<|+ODT&=ZvuW9co 'ir}9R>rbwGpZj`Tp*MstmΧ8%RR(`P^뚫q]E\^{){"%;o0`33h ݤWGpY@vo(-~S|%Rbd35W崞꫈WC3f\{raIСue; -\S?3zޘ~(p'yׄGp9] }l{jjvfq"RC=x孷ޒSʪQ , DT\rI9# /.(8O= 0@>h'|,"'N~8DTNiرchnM_~0lޘ8?'xyҥK++˛sGpvM>FO,q):<:N U!nʏ+✃' R߾}cL8Q:u$۷m٦_s5KQ=zHΝËg RУ>*W\q5JV[m59}*l@a|xs-w}781 K,٭[7qÒN N!/5 #8w\[:y,cy5kuJPeMjr5MFlP%JBtH*a{OpPpT8㌔h-B!?ꨣdС3m',,K1DAHc=榛n N]<9#8U"Pdce+W劰emc,5\"F3pR @4A饗 dܸqAfM7 eȐ!_m6ȔsWe]V9昰Ɠ#8#P%E[yjkYQ74O9%ⶬhRMC[?駟ld U|ʒo.8kvX9蠃]%,<#M׮]A_8/rmF}|BʍMTj IDATI;%|^T=9#8D eluj\mUDK-T@jVټ2OU3 B/"͵{.r%k8)aO&'|2ljo QMDGpbll5D8;<pGk>'rJrk`X孳eZNuoۧuXR^m 밨 ƉsԚƜYn64iRInI{R5\#~ƅkrM"駟*0G.,s=-ꫯ뮻ʟJD[L|njS8?yW|GD=M!B{|[/K+9"^AMpl.\h^-<~E][4ˏN8%VaU$ى<ꖯ}ؼz?a@߾}ϗmVF4áj?:*8/Ju& 䮼J+qzd9K~3jԨmꪫġ6=Pk&J40#eYFބw>&*hמ[\-ed0h^lg=j*_\\|y=NUXLTQ˃f6*}rGʡ*jxGi֓{4gy&~XZ!br 7/._}%Ƥ]v٥o,guVC}vLK,Dp ՛/ܠARoyȟ&@*D &oL=fޤ9h^NY0~9kms~3%+SLѴʔqJv>C* hr$W_}ukt"m]pTz-Y_ /O[o->liw>(ieʔ)ry t%{Q$x}lr7d ?,-W=:D xzpvV[m0O;;찃,rRk2{ <3e-, ~'K/tpxo= ǂG\pA?Nhj+;k ћX@\rIa9JӓO>[[l&N⨁{pWYeٳg tC/r '9oZJ_~yaYFl/?:ouh\ /"D4?pxqpjVoq.7/`qXwuK}G?xU+s~MhZi9똩sM"?Oewy7IEik߼!e+vJt"M1eVY P5 Q^SO'u| ŗ_~)G :묣G%4n8!2`&"oFX"b.];ac=6N+=rwA]8 a&1tF/+c0/B0H^x? W_g_~9Dh?H-"7Vk΅obiD4 g\"FoNE,K,eEU=N+裏mFG FGwj) qN888|yʄ=qj~OmAᤓNC1/B.袒uձ0;WԄĆQ.T$ˣVVZ EFc…';t0S[np g,O(Th>˕c<+iy sơ8]uUr6^oB$Cΐ_y1`HEo=DV\Oû=ҤexDH|exݽ{wm%\pLY1q//>?>Y%zL4$)7grOaLU ݅"(O5j n'*VHy+Oz 2Arx|GF( DEHY ˢ"<sg>,[!4A/f.o۰|@'N4G_cY-&"1&Y#Mz48(?vb'JM҂MA'[[b 'N1 b]+Q<;b+WijrEe"rqyjOKQ{SF1%GY#?X;/Dp"9WsJbΩ^_}p,Uў+K|oRR㧰4k{췪ǹ7z-NIrZ\zJ"^Ji-k.—0 #$l(N ;*B$8qW ظCř^W% wk|Xg-iY 9O%/LS'g \ǎ(9`ȸHzdo„ ~wul6V'%?;&7,k1j;%g9&xy+EOq w 8%"qXqѦ/YK"^J>E0pʽG>$݋Ad T3s$*AHRپ+)a](%˧fSǽ|('/9],c۫u~WmWSۙa uDKɛ8 e&Nƌ͑;D+<ug 0Tc䉢:\rz%`x% F+sƇ1 }3_"8l`$ȱ/Bv xL1u.1nږŝ|1ቁZ)h>T7ra>Jٷò.I)tWsT#<.Ta#TD| 6}%9Xد^88+I,sMV0:98?蓥NW|8(IW%y΋96<'f{%nH`&e7~po\Gfߩ)]q3Zf e!X"d|,"RSP!q֝D 9F/tK'k16w\kc=mh5j}axlb ^{meK7*Ȝ͟\9ciBO?) 7 .2EX:yqH,i֚D_8qb,/-Wu=fҗǵĜ+979f;Qd3dal爞=a(e96^clJ;-m >2Q)R\S 'ޤ rX"^,Y_̂lfjzXO .D<ǾX0lָq=!$tUҦeRR4α9#:$TɋxV2Q Mx)ڜyɎ'S k;V5"ȓ9,VZbΕw;JulJƏjP]U:o2WSVjQFۤ&W#y{:,H"g \ҽ*rx>\xf3F#!]"Ϫ>p"lEwN*Wt>2mhcy;m A9TtStMRE[yjkYS74O9%(PϠ:ۇ-R4xsGhpacf#0#P1JjھfSNI5 ko+_^XNsVwcyS$G|W8S+\*o -r{>w#Bxo'G58\RJLTVaU$ى<ꖯ}ؼzpGp#cBy*M:M+qJ:`Z4[;#8@!PZۜhfeTM۫Lټl3`Vi.8#8!`o^ՕDF;%:& 2U+m#8#4^wcGz) Nr̃FRy2{rGpHXiZGuQ^Cz)RL<"^,uG8+wt(y}N99ԛ U | jN>6@l{NV]d}nZ"%Fp\GT'i) #0"0iҤ[),[ rlNk׮S2s R\+Vލ dв:q]Sz^q{{897| >\V[mUlrM$gy͆E㔬X^K) 2urd/#0`l#+} /mݶI\Wk/2s=eСs12rHٳgCRDeذar衇J޽_/>kFƎ+;ssM&Gro̳ߵ:%\ v2LǴrX@@sΑ^Ut>Xb #`Y3fL7N;?_.B+e,+88 SL:zA" ,S|08n8']w]C5MMDZ[l)?bYe=X 8W_}l&5B~+OoVLrJPAdTT)ڏ@E`7N8!]UW]SO=Uy`N^xW\Qs^%f,{2h ](D~|O޻Jƙg)Dveɥ,)a+o-/L!8 xGȋ/8XNp)gSS)^EFjH *WTѣC呕VZI;NcXxQ6LY!;r-',~7]oMt"m]Xa?F*i)K^ztIa)?@K.DpD^zi9믿^]w]BWguVpT<3Ֆ[.S( %Я_?90{ڦ} mkMKKĦK/Cڵo=$`{iT8 ?;p!#Ѧ&2j]"3V@Em[4ˏNJ; kf'[ar|+eGȲɒK.dg{#s裏'\RKfmJe uXJw!{oxԕX",eY&KT%fT`'DĄh6᠆v뭷C9+oK%0ͧSO;M:v(Ǐ22&DW:/2޽{&Z{<9[ugT.COT*hAum#l+2<"p'J8lX RK ,"`& de駟1Tzs8@۷;!ÛOI:w[uJT \?uJ$O) u^/ }(ulV mprftdڤhͽ|&Xҹq#PYrhҥxj{9erB7=a6 2~aYG;M>Wd)CQ?pJx Vib#/>l%|d[s ѶW^y/>M%!/8kQle&EShvJ)LJ4 '8  nqƅ0;K` {>V]BH{챰/a E ?\1b_ $e);k63tаTTCX̝6aî6Rœ'? Q"6l V:9JkvJ#K[l&GHٓCw ?Gm"vkh,3gbu")N@ehWVˎ@q IDATx}`&S1X c; 0$i# {)p>/{6.8ve0>Iy$h-5}!&L/.r8md}V[M?Ɇna*\)JD|~DsipMK/^>N $(swixh4W{<͕א<N)]qNwQ:u-s5RJ˗. frӛoL=ps9cFGb1|s5W |A-FovLvX=*^i cԚc ?%ulpZƨR~8oxHâ} cΓφu,ƊyD8 /W_ ?o/2kهG&U Qer-CIt-+=3R!}wۢ9NMV5Wٸt"#PD{O%ۮц>G|dbzQ,unؓŲRH?G$'4OlE[mem)Gi]sUN~x)y9@/w#! +߈J=DžGmɱjUL綫)0b::IӬTLɗ^pb~ h 0DX+(5DP8-@l:9)'ʡU1nʏ+sGh\wTuFptԒ2ZrlkG esSV9E2ʍpJ¶q]t[.Ų^wV@s9 z2Vq5NKN h 5ס~k<ʵ:%(W2&5&Gk򍴳둝e*1[~̡*W-ӆ1-?#8##Pd7eUx)D˒ae7E玀#8#8R[k(T@jVټ2O4GpGkVUN9%ԭVY-rj>w#8#T@ͥ[4ˏN8%VaU$ى<ꖯ}ؼzpGp#cBy*M:M+k}:`Z4[;#P5wի{<#w:S8967"<&EeT67)4b`JG{pp,|ed|Gק`MZUZ^=娤JF;%N)h']R #TB -$.t֭&mB믿~ؓ#]6=eVNUt"c4ϓAߓ#̆L4I~߄e ~(;K^aߵk)͓ͮ# l4W{[Deא(`,i[+Ozpfnf>|ڪY嚢Is+U(vU8%RR(`P^뚫q]E<+eGPoF~'d^Pޙ#,X[dup+TnMzGNgc9ki=W/%9{GMUW]f뮻:#GuTr̻[X`t{ٳIzHF){G:>b-_~Mxw}W\Q]t&2reɞ{)C-Tc W#RDeذar衇J޽_;S~6ӾrbM7Ai@l{NV]}n(L)O9mEs F5Mn:`lb(G}%2ƛ6W^yLYZk-janʔ)Bdoo|0s&pI9M*c{8fǏW<o'VZI @E qi5nSbֲ*)-+?nt6[nwutС C7p,r 0No\|3τUW]4[cK/)ٜR3w~Lˇ~G̞i߮}hCZG^*ǧݓO>)]ts?!C tG Pή*_s;eeTV$\%Jjm_.3#p'Vl頃zJ8 yׂ< @^xʪ)_s57` QQ;,5Ƃ}TT5Ɩ1bÂ-P,;ł  ʼݻ{s/>Ϲ;3;=ޙ3;;ӏ9y饗'vͭZu7֓ԩS6tS!թ1c19)9ڵ?"BL]r&$7dM6/utڷo~Ѧwqf̘ rh*\pA?cg(< K/tT~9ܧO &@ y(S"e7یa|H *oODxE=kw$bh{=7qDr|3 V]u!C8 OW)o~#F$n-DDRcرnfO:vP1"&DGY+ #dmu#Fɛ<LлsIgz+DJLÇN:ՙg-jବQl!ӶK‘YZӧ\rbtD.m @ߘF Tތ(/FC>6^D>}&r҆' `Pʭ J52?srµؿ>S_`%g#D9>D#)nݺ~za8 Xb%|'"6]E< 0lH=_IJL4lD^I~ה=Xﰲ}^3g7ߊ!L4[ۢrbJ-6^+f񱵌fA@ εx׽ <1?|qtL y%",(Dlp&j`lWgZѣGw9pLx3BނD/G]8ieLSSBԈ_^D=ET.|dg<믿 6_}R>L.]ီchh5-\UX$TV^++mҎF3 s"Hn _І' ǠcI$><ث{> dyFxrjQtIO&L)`MtqӦH%8CdРA]v\&O\:4NA#\ _ npF/#8R"EҸqr=_OW@ ilRcSheLHʇFv}wo 7t*兔+$ ,x!25jYfPpI)zȑHZ8V f@hWh"h"֋ hBvX@gDC9K-I?6O/&o4Ch<-pɊ!Wnߕ%Sӗ:<*(M0 C0j@h>+5S(6mn!`!`G fsc,˒rv-n`؏m2ъf񴜵 C0 C<~K:ѼBNIL< ϳ!`@,tQwQDo'ތne|Hi?!`!`A ~ OoVL*] Fj՛bh7!`ns{v /pBBܢ6ed\tBMRSEBHȣ2񵬵 C 0{lw)c }]Z9%<ٕY1j@hWh"h".ZaY0FE5x C#p뭷g}ֽnmɅFs?dK[־`67iQ4F"S&RRvyZQQ0F;9s|e6r[wqr3uO?sBo?g0*F@ߴլ%sU^k1TGi^~w:.6h#wQGEi8q{G2,uC_|:'|cwwo_w `.>9/bn5p+knРA:s12e09 "裏C=-u}np3fp;S߫?=rzrCu;wN`7.Xwu}mu 懀emc;) lvȃFi2e[in 7c<7 쳏/o^{5/z'З ,mUI`<ܬYS2ydW_y>'\|k*^z%8}#d sV` ݻ{ӖyxᇽӅsr7ڶm6$DZV\qEu 03v۹믿m~;1>cCDLR-_wP3M +@3@ fc&kَvLDFx5uJ¡Y;}'Ƴ?p@ xG_~ˎ=:yɁp:ڵ㽴b4Cb6VhRжV+\9$O[\o\Z.H/~+GH!z5\sM'o&A>FODr˄Gawt&!0|Rb;|I7mڴDdN)7ߌNW^yK%I)18"={tg}{'M76xcpxpYV ~ (3ϸmڿ}o)‹y\,m6h0hᘋ'!:"h/JC ,+@+@@eo"Bk=o"NIC9K-I?`/&oVA w#C§s,_||.9z0^ve /ѥK?1N(ze]9Eτc}tMDG cƌqlw8JÊw#p}yy#uwəܐM6mVQ4}mx.}^k;w#K.~(cÓR(ux߹~;eʔz򻣏zwcC906!0m]v2>u\$u2f)W[If=z/r```{=(=gUWM&2d#A1y#%L@0a];qd}u{ر>Dځ9Jr9bDLrX L '|AGHر;ɟ&ϔr't!zCA( nݺ_?56m"nqd-rXQ IF-1M$z ,]KW_Mi䖔$rۈD?m"kޓd:Fkb—Z-}PF :%1( (:>& VFov3g!x'Zk-!E5]ӧ{ĺwx󐧼[>׀aPa[y 'Zq;\8 M% 1YX>*2ThGPa#% 9}TIBQiHmK(\py0 QZ|Q0^x/XCC cV &@ y({rYft1i\[ \rI09g$_r握jbxE8G!> !iC#_}Ge-UF'}>1_x]w/B^~剡/ULwݑC?ƚKYU8lRx FML{! ЗSB1p{<~#DtIh8ܜ!1F !cm!y'G#1Ƥd#<8gZrXiYicq)O877''Hמ:MIMMXC _%RB[sJ/ /m<<+@Yvd>NJWq8Wjb7 G<&ҳ ece^_G VB$J*21cc|MKk3Wp~)I.kgC^f3FBhkW[Iiq3Xk0j@e!k+4.8%ZaQ$鍄k~CcIn<,",#[h!XoKx M>Ms8%ZaY0FE5x C"sA2+JS*uFptxCt|SF7Wcmkx_mc2"ZW㔤N0mbkrdVq Nc,N e!&M+vY -mLsTbr NI9c M'Y0 <-Mmxؾڦw͕w/}Y0R!Ed Ńo0 C0!BZ쵬"#:%Y fP 7 eo!`XIliG̓,Q08Eٰ/pM!`!`4 .goY];(Bz?u5 ]<ԢcKfbF3 C0 m]*2>u\HId*R.&!`!`4 ,`oPXmn!`8",|OKsWO?ޞ`D fscS,C^jzv-n@E5]Cx C"k;^| 8%| /JUv!Pή _jQCC+.ꔠ\edLls6` CXn\޽75$4;Ƿ[1j@ y(S"e7یa|H *o-ٳgSN9[E~G/B-)ɮ͊!PClP%2?KU֒Zqݖb4x2jChzguofmrdm%-kƛ/o)(c\Xbʦ/m|l- sm|풷[ԉ}L k;ng߻~~nϔ7!`T`oiimJڏ9%ZylHc1Z8={v~nE.6h#wQGEƍ;C}np3fp;Sp֬Y{uO=j:GDgn֘A 梑mUj(FB}͗9t]eꫯ;Sի:u3foMrp >]|ީaq$l,̝;ct=oq~at1m۶4&IHˊ+18%c=2,n;w׻7@B Z;i+4 c4]WheMdsϹs=7F6s'pu]hNɨQJ+Я‘깥nʜRD/?bZ XG2SBG}LSoY~p@ xG(?OKXo։SRn|`4 _mc] #=n+"+\Up(1%=3na5K^Ka%tn۴E?gB$QDxQ_|q<#RAhzhe-+11ף))4 2+]oFh+üpc/z:Z~Ĉ" of}l_]}S;pn0:_gRW_Ơ}nv馛,'B#-C(t6m;<$B;w}z빡CK΄l&>Bƥ۷wh? .}^zz\s5\pA? cÓRG =DV(DW9CKT5J^~^wwW hFbSN2dHHbxc#'\/rc]wI"6- (FZG#+hR!V;v?~ϻA W$bcEd\ ,Z=<| J8#bv[c'yБ ;&RBG`}3:-> gR%GW2g-`ryta1"IIqۭ.x= &@ MjעvLDFx5uJ¡Y:A>`p@9#ݻgXx+8 $ Rn.kHt Q!p$PywSmEZGJ:}ā BQiH̐ ̗Q.T#:!vj1<-G^AhWRtw2>u\$u2f)W[%"{Bgt~K+5G+|"*8ȑ#(D\EnXp !G/X̋\ﴲ ޓ{̋yV)/\HuDȋq GDԵ1|)88D.%ZIŹCn{/Xm43BN?$o=614K;qfZЖWR;|CNd)dW)3??7*d?2G#@?tV#sϵPrcǎp„E3 s"V*+6H$l;X&?x-ܖX3.Oir9LߵbIM߃-uMHujיzM0;E5@hMmt;㼖xs"`!Kh &lCJNj Ή݆tݖy≌- ǶƧ_)jC%k6G<&ҳ e?˼N /|!Om肃Ud]O.7>knrvURbOh^vQ(#cb+dIn46.UnAq)V8{6lk&k-yoY6^!o""'8&+2%ZDJ͂a_6* eo4s m‡o[~i~_>Sޘ!P1~K:ѼBN QF6Wh6u!p; dui.n6rGuTt,}~_+UVY-ѹxV[m\r:22[l1kVXLS\uUn=t Tcq|СCMr)8 "裏C=-݃>#2`[VZ)Ә5k{SO=~_E筼kot; 7ܰxM,tQwя~\z3ƇprP?s=MjY:+ݤI]w}ԓ?#<z:NK}+[oK|cu;묳|GӢ:!04[RxhHI% IMk3_ZF3+Pb]tQ>  \|>#|ͨGDhpcÊW\qw}َh({eYGqgymS2}oiGVn۴E?E \8&y knO9báYq {^|dkM?*oiimZ9%P+6|ic| t6m{{Mʁs9Ǒ BfbP˄ 5}9R08b"&D#aL‘lnĈJs I;A!y`I>t oQp!ӶJ֤51>}O%Xǎ$ ɱ뮻rI'e];16EC#cȅ}1箫qJ²`&j4ݗV}& O"i#0$b($ d4p*EasBH Q>8&֭[7K'XC"_!ēO)n8%!N ɼ8]\58@0C9}a19sɄF 8J/N%#0%bեK{ch67[CFx-ԺoX+V:u7h9Z> uaiȂqm%8LGv;SGރ7-JƦawJpJH%*ċh;'D08G1"%"'9Rƍ I> 3ɭY,+Nc!69M5ZVhicbt=>ƯGSRNi e*V.Vɭ>ՒJ!E / #!|O޽6a|rj];yd^{A0aVQ>&y$TgJɡE G$ NђA4YX>˻ロl08DBE"6$ نvJxSxN/R Q'הx>rxtJV ^CRNIleCl@ddynp%p'kSq4x/4)g`z?rL@^4>Ss|N2Nx9rHmntȃz1I%Q"!Bȁ/̜V f@ Mjײ%դ ȄЄ.ƙF-mm罄N__jսKgƥn0`G&?PYi}Q4Jv͢Or&Oa_pd#Ι@9-<o፿8bƑAdkw5qU6炨C@䃱V Cmb+ULƧ+┤NaQ٤4c ! M]FhؑSSٗaPBvs U-CIb"G_Ն!  U?.k:#8:6Mt e)OD}~*+UVY-⹧e]Fm:cL0 Ch7>;FFW)Aq0D($ru[xפ>w}Zk-{I'oa!`M͍)rbd4yڵpJºa_tⅲ7l3w'&cZ7j(שS'7lذn C0 C!Pή _jٺoS2W]$bQ@6Pt|5 nr]tQ2~>rҳgO&'|2ᅍnVs ^wgqFSO=]|ŞsϹ]wձF~c:c!`,tQwH(ތn3!-?O}\^<6ldR#ͷ!`@Dt6flu xŜJ-6^+f2i圐p_~y_;%9fiS.WNuJƏH={i /:t\$#FH#tl;1#*T25 C0 8_̕6>\'sJR 0ِ6|iǦcp&bWBYn|͕Avڏ)SܓѣG[nŝs9{zk7fh{"'~A¶0 C%Y6u4?lӯMtea(FB}͗9t]e {7yd^{G}u .$j2k,7szK޽?y}GAH%D3H!Z$ΏI%DŽ;w쐳b!`4쯶1ZZFԌdȔ`VVZ w}"#o%Yr%qwqGҦqWߞ!<]~xp;Gz*tAm!`m殕f-+m:Z;%):J7v}WƒפkNx+pj3!`F@첶1]s=9A0}H"2 {y?xZɷE^[1 C01+4^/2«I]m$K,2ᆲxlsGh!`@kA fc&5X9Oꪱ+)I[\o"HisTY0 C0"rB/u\$u2f)W[0 C0}l0] D+,mQ8 ~B jC0 C(@f9Y2%Z8%Zfd(i9k!`@yUK-3>u(yEry g 1 C0 8Y7~N(OT݆Ө,i-C0 Cȃ@ߘ6^0[dEw@/~ 6SR_ǝ~Cq WW9%(Ji㵲im&I,` Chڎׯ~+hKqJ~G /4mM;C mCIoiimJڏ9%ZylHc1 C "S{^x&]q;gF,vWhW]qJ¢HH y5_u9!`4~_Z9%7+@3G z;Wh"h".ZaY0FE5x C ܏kނ} PjeMƋLٺ`w>3j9s yKyVOg5MSC.M0A@ߴyjeUGjoL4#`(Sie pwo6u3Æ sڵKWe]Fm:\C+5i ƍ=ssMhhvaÇw<;ܾW^n-t?|,=:i~>RO=Tw{J QO?ԭoGG@ԌChT]βߢThzސErҗZ~L,^Lh>ȝwyk׮s۷w/%\]ve Rr^uu1Ѹ뽣a\j܅^XpħUW]A[l17i$N8!=ayǘ1cl#sMƈ#?8шghaq5\A'> NV[my~9C~;>}a8<)K=)Sd!`4핾b+FƧ+┤Na,bjzkmLd6mܐ!CFzum۶~Y$vi>ű*thgq0N{&NiӦ˛oœ$wxcDL:?gw]t YKdӰ#Z$h)vǘ n!'}7~䖄 +2y7C}h0]mN ʡ((ʧ\ҏpЭ6^zMcOaJ]tEf 1\pAXN0TGɷcǎu8F2Z8%ZafѰ/jnfBYbcF?r-sI!駟rI,Z6tS]5'֭J^:gfU=m<v-$2'GO8%DHz^}U7`?+X`v=o 𥖁bOh^v㛘ry g ip$@޽?*h)*9)5k ddg}W%"Z:7 k/RJy֒5a׷o_Dtbx*OFRGBkV2 | .@Ȳ!O~uJD,ft1i\[16 <;\ tB'$nI3BE|dC 5$^~厨Bp969rd=[K,r߻KPguVZZ9sI'%8%8@ܦ")Y'+'0 jȲ"Sc&g~:uئ!{XC _A5~9޻,xfZxb(<`wWSE"@"%7kpHPP$y<Jੴ-x\-&ᖧrL±LY!O=֐5ck OY]r%>g箻CRMXC _%RBK,g6^u\HId*R.&!`!`4 ,`oPXmn!`4?x"$oRܕ?OohDܘȉ=Βe-zBx݌32,n;'|k@Xx M>MsE]Y@+, hA}o!PS( W3^z5ʭJOd@YgWXawGaÆmgl3@:t8/D C '쯶12OBMN0mbV~z6d't)zꪫܹ~{'M7??2,S=FNdەW^N NV[m~>Ʊ OJeRЃSLՆ!8]:fkMNVd#C4OA.J+FO݄ c''|iӦh9'}YFmN;4I''ܹs4djhY撒~ON#bW_%Q }Gjw8jk"gD2dӧ3DJVhuh)v#:C߿2?9 "1[nqrۯڷ۵kWgoЬc5A fc&kYPEFx5)A,x2V˄ⅲo8CGjJġM|niC:eWN18G}_rcǎ2^dcscn .L:uXb 4 N%M`ޏ;J`Yq1Q"4E s{' Dnݺe]O) "DDOWdMclФfp?Hd'ubyE&X_e)Bx[!;v8w| +Eb^&kp+" |A47Kp.G=zzf=r駟UZΎX0_y Ȍ'Ch,ͲߢZ )37Z+@ q!qo085D$Z0k,7s\t=wb% \qDrCq\A'hI̹"A2^_z%+YKdIwH۷w8~! VGsp8S~D npv˗Q!:єChTB+}~WOW)IL1B>Yl;7`qBV\qE #">YOyxV {,s n[n IDATn%YgXmq\C_+tnpcfȑ.YB9j8xE snoFC 9W qk _OnEjChpBQwlbhBvX@ӵ9-vr }dUJV%bORy1Db\5[i|ɭ rҞU:$⨴$K4BR*|1Q#<r߳B ɰY{pƞ"\r#䮻 GG\2^p>s,Vְ>ўVЋ0ǧi|B;G4/AJҋk}$wy M״ymhWiHmha_<.MmG,X p3ZܦU8*'k,HqƳtZK")ڙX |(wK- 4 rvURxҧe4PSrE1ڀ 2Z ktڵm#G[1 f@ y(S"e;z3ƇprP@FX@@ ~ OoVLsJPEfD|12Ն! 9'ˍi[Ⱦ!PMձ%d|sJ*Q HxlZ2!`4AOoKqJؗ7 rhbc|MKk3Wp~)I.kgC^fMKmlWk+4.\-Z2GH y5_u9!`!`G zȅ}1箫qJ²`&j4ݗV!`@!PjheDMƋLٺ`w>3 C0 bh6CluPkD6RgAPb|4 C0 " vY٪uJ('QD~ rYԅу8%iMR^i9B C"k;^{-) /DQ7 !rb7edC#M4ԢcdbF3 &ݻ&NTblhWnߕ SNaQ٤4c !д/Zhyfh7,"&j]YH+ mq8¾(&pB0& ▼} o֦DNqLVd4/K^E۵pJ͂a_6* eL3gNEmVOgϮ6!`-rvUR˾~K:ѼB7(WD\ ؠr/]׮]]n܀ܢ..6h#wQGea7y7(240; 7ܰΊ~܌3N;Yg:|@dߐbFJD,tft1i\ Xs1S{>l7yFҢy/'8 pS+ דO>gHb-ܭޚ@ﻍ7;$,n?a5A ~ OoVLM 'EJPEfd|12M{HIΝhDJyFVZi%w'nDcuÇwgu +>h7l0׶m[785[n{e`+aYb+ҝxn5 "5s=vuW?7~x wM7<̧i`/2-;8wzZ8Yx镶}Aiy >z뭽s/{M͢oՆ@M7kZZ1$TV^++mҎFkdyZ; ΒK.Yψj: bI&ߝp >r\p7Z]x Ĉ8뮻ν[ F}y|ϵo߾X:\|Ŏn3mܹslz?x?ױcG?=znСv G.믿ꫝDppp2P3M}0NV[mEl{g9plÆSR)Sd!`T@evk+4.8%ZaQ$鍄>ODΪA"tE[nŝr)^_ڵ3b5E zri+4 c4]rJ ˘Ms91$\cʧ>ŜJH[#s@cr`D4>ycBʞ{v>+G(Y;f\;SE93=<gGW_+n7V C&h6e-+11:+WǦG+xLA||CH(NV>#Dxwaq34y y")֬Yn̙1:4>|J'!^z'^P%zȘXMW-2r?3Ἥu6Y pfw~mݼFrbӴ^Yxwmy?!XGq×Q%fNVD.!PK.kߵ\USfB"2d2{}<[#M) <;1p4C>V8!wQ5a3rH{$*#4p=G/w\W-7?dȫa?hv}w3A V "cedָB+k^+jh "LDgL NI߾}}& -#0F fc&kYLEFx52!4K;qfQK~y/ӗ6GE—ZhiuR㙥q|"̋a\?O?4u1j*\I  J(~E%hkT6ԉJDrY旈NLKGib2Eq):B#ԛTniX/-ij&LԦӺ}q UJ -_+B8L-2'G_҆KzXD1})SıS'}E6 := :YΈص\8i c*#c%k4gDISEq):5C1y /Y3! y3ChͲ߲ZS:щKPNRrҏ͓ŋ)ȍNl!tmb+݁OW)IL1B>I5,i5 B+!`"B"˹熯N !ʤE1 jCh,^ʢy8` uTgȾ0c4/b67{%yXMծSmvt/!`4s\oKqJؗD65 J(gW/-[ԡjuJP22&BA!;qZjDܖζ}eߐb[rYcft1i\ C0 C ,-<1[-2٫ƜQm7F'eՆ!`!P;b[, ksJ*Q pxlZ2!`!`G@p7״6sUmcNId5}VV[Gf!`Ȳ"|ma~եh+ kE7k̡r|-[Y1 C0 zX O_\؇|D+, hA}_アb!`(gmo&DFx@ʈlj]S:i(׵/ C0 69 ZVhicbKh))tLAD ityM0 Chq`Ӿyf.kRmD+J!Ed ŃKǎ_Wϝ˷'[1 C0Zsq~VPb6VhRic"2«I]S<|-n(.b5kS5 C0 V6[ءCJvBB.k #Y4 C0 @ a%~/P ((ʧe9 n7-k[P_cۍ~cAۍ~htym|@ˋ kv-nhE5]CEx)S;w;v{ٳ]sg?\-nsm۶m%Wɯa] Ze'~1|@]ԢoS2WХ9|i8DսMvfo" =z6wdowUv bXUT5ѧ(E1""ֈP|(, OP7Lkk_zo陾s7m[U_}u95=sf7qk ~mswgv_׺:==qP7u\OfnoL ٍ \~Q?~(c Lt e[qT0I t"(G[(r%}h 7O}jwmG,trСCW}ow_{s]ab$r=%[;ͣ[苒S췬(QD %U|\QTD 0qbĥ īX+%}2bӂzgw/{˺}|wep폽/ytEнt+uys09h*Wdk3wyf%*FTq9V+_)@M)R (GJW"L'XE]4&7:C{vGOc-Sr37v"}$2PL͋y!;8PɦI2ʼnts񎗾O3bs9t_<UqӸB2J·WX?wg\:ww%3sׂ>w><}{ww|2}}S(v 't7э{^<2ucu/}K]\?ccJn\+[s sԱn%>aM$b#ч~r߹ PH|s y1;[)LXͣ:N;wٕ,\¤E7|6=og} _tw'ֶ+_'=IO1yLwI'u/|CAwMpݨ]d_4+T[ه׽u]zv.q[xGm,'TVKqv-&m eNQրmŗ<`>'<޸ rᲗ\I/k,\!93Oꪋ읒\/FŔי/acxȕog?})YNy'լc;Y^!}1[ zJ[sWM_6na{&__gojk8i2,rmufl'O:_>;,7 䨣CG__Xhpx'gSw9Wn~w/zы6]Rwӛ޴{Ӟ6A['~c֜\f;. Οַ~_w'+^_ᶨmɝ_kw=&&uٹZ1Nز N^} {Uraf8'vk]{ֳս/uӟ_Wu7o;[n7q{g?{5+^~[שìG]ߧVƕfVvBO.jAE IDATrI1+k~ceZ@ ³EQrG>{3 hPvi+sډt5Vkȷ-r7c1yΉ;4ܲAxf ThQA&E݁= &liӟt7i^͟o~~;_s0 ǧOC vXc?$OH~^Z>Ů?eCcCCް9ax-G&_+zcry3{C ɭ/۪O\Qd?8D|l5V$oÑOrJQw"[>`w3!Ґ<ʛ6ޘ!4ވ7 O=7aݳ_> ~з^u}cG<3)K5;ةMER?j+6f\xx,zS^G0l呫SMk8 lZ/ry[57O(4h(txe <~kǜ#,orklwنȓ-ɶй:曓JMOH~'Djm&-%7aqm$r ƏFO@~c>>m⃏+,|<bH/x@+ǯ?=Umb㳟l_ri |}aG~{gwt+>/qW/{5ךwkșo}[sՅb[cwUc ĵW;fܴn69℣M2A  8 &$n,rzԣ"zx|?tÃl'0S0Mȷn{[B$oi!͞W:vOzet]oQ/K`u>,ܟxk8\\3w%4r'|Jnoxx=yjWڼ?r7\ُo٧#~g % KBG'.g'l'z>O~}>~ɒ7J}ZcWy_ָE%>{惫$AͯҸJJ _\m}TP\ ϖlmg4CżC!aOAVr>k5er>>̕=΁ى.|w3?oonX)*)LV}SeW)bX[WxٶxVnpۈIos5o~3<C|~i|[4Nĉ'89,H?*rJڜ_{6 E 1T cM 9rQBp$V$E )\:ޫsB);zsx[|[ܞ~ir  6nK[Q)S^lmF6Ϣ]̀8_supǾlS5e;̟U>ou~ÄbKJ j!SrEn+S2-Τ]@kfJ[8}G:EI|eB/Nf`lj8ZYdciM::٫]@^_&;ӗ G8ޔGh°c.`aW T*@e`{2믯Z{%M\tb<~pecbۮ1kM9[@e2P T3Z[&+Z$ktqtc{+% A$}ǜ+de2P T*ۛ;-`~A!bOrJQ Қ&Զt2 KW@e2P T3URllZcL2}JQB`kBThpId3$%|bW T*@e` h}u)}6E?;̱E<0Q|7aj@e2P lOқt$MRcT|WvRs. xHP0]̕_I#ɖOhQ#mZ2݊%#?ڭ8mZ2݊%#?ڭ8mZ2݊%#?ڭ8mZ2݊%#?ڭ8mZ2݊%#?ڭ8mZ2݊%#?ڭ8mZ2݊˦ +V3&>!:Mrfm$(a'krlMF62n'D$q`kұ`rp2].L3ytakG(+~1ʏu%71+N3ytaѕK 1EҐQdh}Рy:|lq_o Ü #Vswdh.,*Nb/>ѵsx/v}':īt31oAoZx/f]o婅W3S _㯕~i̟rMy0xOpd2Kq%h4əJI։|u(cݏN %=+EhΜ/.&]>tZfGL+E_fGLq21k1W F̎$+dbb#}1IVĬ\aG &MXGa&[l.?}3tqO:29ӸsNV̝#tBg'T`xJ/B|7>#/ʇl4>>5ǜ+~LR,U?qi~ԾXv }4' ~.:؆[-J|hM d=! yHlj>aKfOsQp50Z8 4Ǥ#+~HOSOg#z?Nil #upcJG&ے܎fb*4Y|҅#D )vSS,_Xl`銩xebCV?.tLlHSKLlV{7>l_\׭06QWS"Oy?`4qtaOnS 7րM\>I' D/[s-"![L|aH8{뚷V|寎:c]3]ύ"MlIrȆ-md+Iel#.DZǷpwlTRйO b!UG OG>GS?LsS![f i`4fVn#8Iٲ')dœY` .Y#9cBRDžd?db?U,c9U*d`S^?~6jl4|]O0Y_}G&9f3U:n-\ݠP@G<:mgx|޼OpԼg9iLqiX0ŀ)6©Y*ǚɱcdWZvU6r{3tÇV|cuu]~S"K$.kZe!?% `.)}n8~95Kq*B2&: oxC~[&_q˸+udgjX?u&:X\גزB%棾c5A҄ͬ \>\(р@Ddlb$H ч ű4q<0mV T*̀.QpY#e F'c{sާt$McͬǞV)JVT􅞝~gYS)px_850oX,Ʊȏs3=8vnG~"?ȏvXG۹bh;7#?YcmfzG;q,Lhg1E~,Ʊȏs3=8vnG~"?ȏvXG۹bu>z\i#/*DbGqiLK% Ȃ풁|Ư'LޜdG >bAmx]ci<0qlJ_?SΘEn?uxN cݯ~!i3} d\V̉Aa. S> N#Mņ<')[} 3>aHc~Ts]]x:~٫&MrfmɏԚOp|4H]Qܘ8.\6rjQ"GLO610x4ٔ\X'pki^;6Oe2P Tv9Z$t J|mub!!}xSq0q\_(QH:;B %>58$ ]f:0ǧ&\v@e2P v|I0XhllX_잺зp$ 0IrjQA}IHGr)כ ^?["8H+ xhhglaw]e]?XvL:~g?~NӴI8$t!hJ C40U[(Q%5/I]p6M>:RWNzu/tm"sxdlG\%[xx-gP~$-^ YIEG+~GRyle@T^$[x;]-Ӆ >X/aÓu0QGbѽ#lT\9aDa0-[z+ Hq4lT<NwcTh;gW hWcdWO?qFXVi O1pp/Ź-]43kS֢.&S?; '8=4ؚc||dUƐ0q3c\ϸ1g 3ny764fE*^1>-eE {b3몉^0ѧRc)^>oaHopuaˊXIc,>/+J u$ub~xp]%74([;4OƇ# 3ƫ,VZVi寎?gsq=ο;ȷ7KzaA 6]_}-Z'?}͐ W98#mtڱebŋRIʏ͎juv]c]qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qǸ1c\qDyᨡg1'^f̖. *WJ̦SPMQ0JS<}t!]UƐ[:,F|h;7#?YcmfzG;q,Lhg1E~,Ʊȏs3=8vnG~"?ȏvXG۹bh;7#?YcmfzG;q,Lhg1E~,Ʊȏs3=8qOC>tɖ86-g/>d3lF-]P.ˏv0I4i/\xOxtEpW 9CBa9W|/ul΀:g1G흈|bw):4.e#;J]F=/ `Dt3 1t,IS0\3W|W[\Fz?ucTL&It9tlL>Mm -lHLmH嶸H|3ko_fE,*~5ZfW;71H?u՛.ْ:~dy<o&:P)R\wq?|,GcXر?ӱEL$1]RP8W&9E-,% zIynG}Q^?sY_GgtYO?u7#n38q4lI#a<:EquzzIb\W_0.YOW˿ eW[[qo2Z99A؇Sxe2P Td`OS&^@e2P T*@e2P T*@e2P T*@e2P T*@2IENDB`davmail-6.3.0/src/site/resources/images/setup1.png0100644 0000000 0000000 00000013171 12564151555 020641 0ustar000000000 0000000 PNG  IHDR& MsRGB3IDATx^iy{vfgwjٕXdVdJ (KJC T L_R|PH8dp!tEjW;Lyf{sO?SUo{M?x@-!o^3=ݒ0$k}k;87kXy$|Brj'?z0+\ ^2z^RkٕKT.WΤBI\2LrXHWZiWҦXī2ڒBr[w^Dz[Km>˹!@!psxI1K}ƒ>~!wRG= k@gh̽fgKGOJA\)#N&`$qTgT^^Rb2߆aSIK߱ c0^n?~]y=Q}p~1׫dǟ]<[}k 7V!C77~ +IAW޹/B b'=MdpEH3W\C=NHgWAeޝ]Gp1_v.{oʐtSmJ$ALX'ᓂy|G7{V -}Nil}O#n|K9lq&'ڙ5.NŇ$)OAX1mVNiO=-njJ2Ӝlɷ='֛='_2U,tձޜ-Lc9/W1K}]9ڹVI˩ݯ{ [o>ɼ;DO/ܠ0Uu%$K^vqNWx^zeWxcn*/W5MA1@Op U֋ci.Xz tEo@;޸%nTErN2V;L(wgDs(@jǒx9K7^_W?cտm~~XP17}uw#&k0@Xv@ɵ|fpn mgPr>38VPr3(9n(v[ m7\-@S$Ѵİ}4$LsENh6<3V h@K} +iuzvUKᗤpuM)1dv@~#0ɱVTulj_=sdx6kvwcܾaݵc`aWA/kAE2mRa4s1/<$\`f5{՛wٲ{go^?<19qw[GȺpwgV:(1Dkɉ +F_Fanz:qH 2~fXVȆMnwLfI𐍭j8A7,V'zMԍc'ŕۥfIIi4 &ZĢA$S,]Lpbg>9Ue AfΓs犣vrW8,ׂB̢\L .RBCLD'|[X(*v4ۼk(3=/cJtH%TX|<ݒ$p]䴢ӻ/GLmh~;}!}~|<;#d440xRt7{Y ,MI٪sVXV 2;y%}̻ I-,q~Cb a9 ֭_LO͘5מ׭stdt\BIpÎ uBeKԅӜi$:ZdV2JɶX.ʙuTR' o=p0jg_?&;!qb"4n`FX'm-N+1R~۔Ē)ɅK>ZY^U*.%+(`T_qҬ)FLcȂ_/>K[8:T>(9包~кH#ǂʤ=ӦiYVf5MfLj"Y¥cjLM% 6he [,7)0L]U]0Pyȉ80"4|UX pt+ha*A A,=K"YTUhT4mƳV4n,-a7ŭu/{Mr%9XΉR'؁Q!2,ʄTi75 $/ed RRDS)"IT+K Feoga{@}oޱ@IF0`Nְ`XSfMB371=0+̌&iTNV|i tBY a"$ Hųpĩ2"֦x5F6 O$Sk J)$h:.0)"43IdtZhS-x +A"@h8)$0@b;^%!$(8z!MGfF9sLөAJ cĴ8:!#\A9C(R,s ާ UC!v*9)EijYgLvdD56aI]N$`*?d S=.XWagcȔ!3R!-ҒZ {%0&mQ-UO2ӆp0459180|-3c8iC`r6&(:i0Xwa$MXzb&Y:%piN Kc=L 4^r]ZG%:֘(9lHPr-ō!$R(̐Jh)\KqcfH%m J13$6ZJ%Rܘ@a@-%k)n 4rjЄS,@`zJu@(4  zٺX$@`zJu@(4  zٺX$@`zJu@(4  NI薈!p$ G%8pA%i-XFuqkr޽!%cC^7՚%^sQ.[wd*woPrٸ@Qa)p%`007{\S1ў[ŮJot*Z`8\ cM$P|C[53Q>J=Y֮;^{) <7ؖBK3uV7o=fT-(ҒM>Z7/[BWVKr̭I%O742.k·; pYsņI#rcm J13$6ZJO>M716%  ' cȶLx,hJ''ZP#" rV*y9l H pIJ 1K?@X6@ɵ:fg(9?[(6@,L%gc@%蘥 l}{5äxr,@?\IENDB`davmail-6.3.0/src/site/resources/images/setup2.png0100644 0000000 0000000 00000036225 12564151555 020647 0ustar000000000 0000000 PNG  IHDRrsRGB̚zvTɓA@`r8}TƲ?zΟ^ƋqND#7,]hhO]錄c [KHװ/ux-q0!smw|IB/@Y3|Em5R::] wX]nwt׷G<*5z,=Z;^WhK ;Ϋ_\ UHF暃wu/_w]ο{/np $/^~/?v7]}ɧ?Μ?W}TfdjcnsF-OA/F-ϢZWxa-O?;=d-}3~o>o|}s?c_/?wv;~^eoUbpߑVN_I|o/}k~W=ԓ+_ߨzrmߧ^?px- ?_=rs=|/mW׿I}bek^s薟|qͳ_y[<77{~x ;sw\EOBziz1VsF}m1efk`z8Lc̙_%BcBOO_nU#{NG^𧧿wKx^⳧yO}OgO_xw_|_3zgqw(?z<_^[ o-?\q͟P6+a9s[2Wml^o{^w=o޾tko[nMjc# v{Xе<Ǹ I<-ͻbQ>.O|H @8[巶|mك~x/^s#}nx슍k6>Ǫ/_XZ>9BQ}+x2~j`?S9E@/Xk!P?> Gnb]q۷~O>td+6lw/{6{/>lT/,yp&%^]ck⑫ki޴W &@е.#9Z>{k9xܾ~?~fWqWl^q/'YEfG,23QUȫ[+ӏw~ҳIo%?o[~J+)uye96zņj?>}y}^9tϿ+mA%n^2Vɺb9|}[_~w}ݫ3'n<ٿsyc3~O^8q̎;|U0|΋ҕ6Wܭl1HoVᆴ&Kb}5r]›we|գmM^[||=Da>?S_V٣Pۤ@X;H0rHUI,ɀpeU^*qÇ7+wMws7^ya^7y|'(o[p{.wo?#ƊMc..p0-f) j^JY[-PR09 96u2e1?I2rZ^ "XbA;/ݵWi{Pygp񡯢nlNBl}$#u̵e叹s/%.Iso)Iax=.rk%uX9ƛpjΌy) g Fε0p#Sxk!;y\Pm|,/]pRfidrV萘#s5o X?D/jy)\}){%ɫbI'fpX;s\n.8#2N+3>~y]&mW=0+)/Z٤Gǘ䮕K!"1Ya[\B=z3M|3* rgfSf9';MU >SO*_좆TaydI'7~8UkOXA.N{i\U*Q, YQ^r˗e_U{q!\UgWB5F^!{+ֻI :$ŽՊM#I5%Yr܅'\\2{=@d +6{u*X#rx{jCzGpLȒ1'6S$Zd[)8?u`8z(޲4w鍍84H=&{䏏84[TGw&ۨ\ {WE}P :5ecAChM ΑJUOWƫ\Crz4mO# Д7ŋwU=z\i=?vyY=G<+,AQƃvZ֫/p /٠om HKbv,Qz UQ[OgƂb/W8Pj G 0a-\c ^56òx@{N^7 56LhV VNpʯ]D\-Е9E N vŦ!N(jg2]C}d~l+*R7)uT'PTRf[G3SU,&Y=T!%)JgYSUkǨۗڟ=!0ʷ~$*`ۧDn*KaE|ca;g\(}+ tmf%f4f@*T^}HN<yēۼ-h\8YltXEXϒ@˷9zy}!|-**x%LW$X9@)W9GʛgN,DCz!r:wyygONGK *Y7FI.@ }dՀiZU\p]s< Z] w]fK7oCe]֤t+Jj+Q;UG*z$۔V# @!<17|_.ݐj}FĖm^wo}̹§TG**}Yѓ'UsѿFLƎ4ԜSwseߺ>a@{"@3T^);0R;KP6>9 ./\Z!!O }*ޫ!-{$,&|N*UyZE{I}QSEOEz7Ӏv[Yړ^{y*5XʳTkZY(Ŋ 5} POM(}}i2V5])+jܠLP0iʳT^֗ ]]h3OW]ٚS!f.w7HWma  0nPʛ+J ӷXzqrx}^7G }f@GJIԴ< )>6ʧU\17?Vҗ+6JtW.Db!dy0ds*/V 0VPʛZj_g]_2?~4$/[BlXX,"Sy3T.) {?w5lZwg˴WadzT>k@`ik]_^Iӗm;+ʝnކA`:A t$)lʆ4zݨ_._8*B{eHO&5xv]^̾."K4}NW})}o.o8~$@@S*ߔЯY}KklVjݕ}sjuGKq߹^V5>/0 [Q`ZN6ߊ+UJwCK$!n@_ UJՇd~e'G}_v(L3@`<z$WjyI:Z KoS𥉉+I0=-$mZ^ʤKuRP%N.v7YŻE|=8 *߫֯4VGSW`BxfصJ|c[}@fwܽ5DZ_[#Ht })jO'=mgjldh3#0Z?_:zfw~ն ]]ZwٜE "廭ŵ|Q#Ef@`Vy*l;2jew>Lkyu=jLj gϨkT~}b_  ick*Hᆭ9,@`~&STMy<] bℙh}1}2͘p*;Iokw+3U[90#@{޼eSV*/ݩ ͤQ.ِic%~djkZo5x</ʫ_l=%t֮[֊0Zs}?CϠ^ꂠ ݔuQfM*-r|D"GY/@]GG3k՗xhsZWyѤԖgY\ P"3- 2*:esSL ILxⰉ!Rv˸aݹg8nSx E=R-U%۬Gvɒ^t׹>3͝)>H\e2_9GqfwvnM @e7vqCII$^U^煺3lL!skROmn6DZ{YfG*ԻۯZpbp3Z ir2o4ɚ R3GhP{;Y]mGuZU6\>Lt%O}`@QY@Pg1c\bT^LuG*_B_BmA /Bh -|-kiB+"6=$E eEz=w8vT.B6~*2~5-7\f@4c`1k BB嫏#)uW!7]o䭢OЄH&PfRBobz4~m`6+?ͮ3 RZFl{13 e !#sqLٜ'QӞ/gx2$#PBW[̷/jbh7[.}=⁜Xaj^3e LwS7P/m^݅H||rM^1`̓5BMBc-])uwd52ܥhd]Zy#縲9u ,-[%4BUB9+49m[6 z] ]au6*B*^6BJz2g *L_MvP"ɺ$ %h$T;g9)7 lyuC|9,J&{j8ײIē]B7++-'y թ_F@\Q6L^Apx཯x1Gg6ej8dBO,KNV|e[ .V~I),SSt&"+{$sK`OʝFV_nVv4t 7xf֠zsqJh/WtLB_+ڃ D*?n0=56bnu?dj<)dAZS+l  $ogr+K#^t -3srfӬn0 P͡HVS(C* 2-,MF֢eZpWCɂTbt5$.b>DYTOXt$_)k%N:u.Ny ͎][BֹWtnV,'I {_ ̀HCPox)鮭'cCt= gEcE8c0fsy|Dt7@HBOu6}հk*' 3KcS"{4HFb(KIԵg642D̨ SJ8~B&ɸǶ$L""JV̺U/*U0v焔Z+~t[ gjA-&^+=![1'BQO[b3G_QC$YܹWnwA哈1<'oZt-GIqr:xt.7َMAL;Z WX{u'&k`.Э]{{2hUZ$x!0&qFf#иG;C=Q5ʏjUB6Wn ,}ɀL!y9 5𖟑~u4ґ gڔ.Nj&UP9־ *o&$k' nUvZ[zȒ| r#KFT.›OWVYM3O+t0Ίֹ{XyCp OQOjMv O"%tllu$ x-u)e`:J9P:3)+fnzOxI:"a.C;vB62C^RvO*ϵx=Ɛ[SB[)j1cr2_ЬCuYMqR?Qb`wJy#ʏd*)W  TFCO|&)"}B]c>D*(I|GGAF272z%5 EA`WySz94e D*?Pu?+.|zn٣ޟ4E @#m֡\/ʛQ9跬} ׳{)t4H*t\; r,.?48T|F@]Pm8T^`͹Z&oyt*fJzѪX3#ϱ7B0LfGʓFnPeKk~iv"ɃLiTjԖ*?<̙T~&?ʣB-ʷ<:cF+&W 2Pyѵʏn0!ñy/P@7pm+T!A@ |?*? T~ 9:6@Σw@mKՑ!T~T%T!8 @9nQC峑LT~*D&4 *?F `dN@g2H3P<3U>|ݾ*9 PQ SyT^)YS7` <@uPHtXCT';!O*`*T[_N[|䷶ukĭ鷼TR:gLe (9AI C> [H{0$"Oz7+}S9ٖQ ̣ԋ~ub(Z\ K$$@@wQpw;VwU[w#n9 Qz[ M^'J$KUۤ fܷ{WfBzW{CS$R \ NOd#$J6'Hf PY# e.:mdD a̖@*+ov"ʊ47"ak"(ٖhZnm\R>gXݹc2sSxnv~ =4;UJU^o||1\˱68TwJ-'l՝7P"V.N6mPyg8C 6Ya7'L`*nmÁ P @+ƥYMUy[D變OU0 *% };ṑ@[Z"an]wIATٜ'|sC@SiO{|L@G*?@Lb$! $T^ @&˸@2 ~fJ7>*+)k1C s$[xY ق& h#C@`< kƔopgY/;h@w*oʴ ,Qk| @Z!Щk5euE<--T> GI[R$'@PyWcO"@+Vyga!O|&I+# h@5|qI#CNT3p mBg /G /g 0JUnn҄ʗ-|9CxQ%ߧī7d a|w;Y*g*C 0!%*R%*ݘ30*]>#J|P3M+@ʋ;6Բ>T垻; @sY*_+.jv}QrH&O"@[8*_kSqa Z%`{CH@I/bq7 }2Y| @"WX ˱U04|CSj h@DKe*GٵMIWb&E|3@*[EOr9ƍE Lfj Ǖit[,7vso'rD -Z*WA>⊕x[VcL1HBubYBVh,9tpH?@_8*ω%KRK嬎 9iLͰ@}UT>)!Y>UnXr@eWUT@Wy`X@vB l8x-: (QZʘGN'*1ʼnV  PTR.ܶ @@@@`* sAۃ kM eV  K`*/ Aoi ʋp20K hBO}aLFRaG @Z'P=/w+^- 6$UP:;C 3'0U+0͕r{Yh  VyIU<8 Bd +"jy(`]}D  F`&*o҂ H_z@ @6VlF8WdGIN@ʓ!畓,6  '0O/G9볼@v$U>)LkЌNDd'\\bH(WyQ?Ҙ|t+q%%Yh 0zPy-"bu0@`ZOK*(} =!PE qj]\!)bϲ @`|8*ϑ֔0@u}' @uE@B@ FG9%%zq @`*ϔӮeI8xȢE+i3%_< %c 0YPy3fBS/K&;ݑ̐H"-K3"Car` 0eC9Y"²yF$zs=WL6cEzۤЋN@`x^/7G- l_Gl "RB 4,e4%E-Z@D!YG[s.mAD`>zO<~ĘG  aG[?JA @@`v_Si$,@@||]@@M*?C  ' )Oyt@1@@`S] Py2GTs@L*?En  {7DBY{,]vIK@'dJT^IN wT~@`d*X4 @< ZJ1|*F (sF=g62,+6 `]|s@) Hp!~&7P0 #P 6 [\}$0*_^U(]룎 Jur+A*/& 0*-ݢl^Nx2IՑ!4DIdZNg:/(b/g .q]UʖT_X9Tf^Y=T>k` ## V3OqD bh]%dQDC-c|IV(%w+/qހ*kS3r`id4r<MSÁ`@2`BrLra-S]zݜr/X/ "s]1a]^.8V {VDžߊ| O86 L~;~u9oos?ET '=TCZ@HqMc@@T ڃ@-bRPRh -ʷ<: @J @K =L* 6(%/%  2|ˣ@@T ڃ@-bRب{A{нLiIENDB`davmail-6.3.0/src/site/resources/images/setup3.png0100644 0000000 0000000 00000042253 12564151555 020646 0ustar000000000 0000000 PNG  IHDRrsRGBDeIDATx^i\u{Y03 i"Z )IY·,*W+evle,JlW9.W!xۡ("!I HJ\ >gzzm\ŽwگOu={o9c?g*xb"!'4ǏyǮL@  :GA;W_-׵0wuo6e Dz07dqük)*J9S`_X5NDd7`ΫS1z::$ qm]_G=ӼbQ! j>(KH5jkFa BUtDK-o瘅tD 7 E4uNե u5KpC菌?^?6۸i`AH  Fwl^g>{]\](U bi4oo?9]vlʾ9vlܶ5Wކf Ǝ(vl'L= 1ʶcsG?΅^[|{奩ߜ~[8r1iZ[{d/Y~5o5KǘAsy _pr8 nh8ߌ?׽n?/q&N9l/[kw:ak~<ƻo_;uu7K{}㋛7{/(} _.nӨ/0l|U_g7v =nN*{roTn;6_ޣ5G؃dvv;4GV=bcy{=ɿW4P}n2Bn[ ּTm_X:ٔ'v#zʁa e?~sU=cVU76/}{ԥc/Lg|?{ҋ7l^O^kگ4+_dk^a)/uoW7n#vl\oPgoۣT}ϳ_ٿottc?ӽsgV_jvonjAb#vەej!gU/[[[ڥs|} N^-KBSw差׮e,k獍|q×_ch7+7wm-W7j}y&];Vt[]L7M핟6h)Qc^̺|iX. NsZiM{۶m)oRY/\v]au= {J%D/O1цK<ߚ1eDUV+wΙՋWgGk /VRݾe\ZsFB凷]kwXNWgذ{lFٚ٦|GH k]䛧Dce/"ʟ=[oN檍Zqt^].}tO掍:7\)ۃͅSɚ^=/&╫W߀%fyg뻭=h<ͳȟ*zK滿?ߘ^@)~<Tn^l#vlx/_W;/ހᄇG b,@b /wɺ?81chi}׿uOin~/G_𝿬;6wگ+҆O+.Hobço_%o_-w/AJ޻>};7o<;{3K/.$A?*Ǥ@ppY\ HYKڀs 96'/ݺuRxawOڹ￙E|ZDzJHZ+>z")0'O^cYoJaq৕]DgU,O+m:sgyx\;jqj5b؄cG//Z^4N^{y(_sO}s]~oxB,   37~#;~  &`dG@@ @@TkA@Tޝ,@@ @v@ @@TkA@Tޝ,@@ WyG`tz@b.p%_卮;W\gͲCY>r ' (^[/2zf^YFWZWAY)c)B !b`!9ZVV[\\a///7vE?ygRrRgă+>Voy<x OH1(  $䛉8;y|ib\*KB.[wڻێCCCb1x~&YoܘVB)c'6>hZ( @_` /=7;W͏[֏l?|݅'w^YY ydž rW.ܺvϮ)z @`JͶby'~[{wx۷[vzOnڼ{];o>z?}So<_2=ͶwBI<&!F7b/E>^gP* ' I $ʕ+?voyO޾=n;Z:T,=?S.6owu|ON<^%߷da wsзciC[ 5`Y}g'y릏nT=X[fXo_贚J{y)T~ﰋ/WU^yQ]@Wg^UVfmy[OWj{}ͷfWjO>[xw~) sod}qJvݻsޡub%+[Jcބ;åM|vܴQ/LV/Mp;>o)Y_MVWWVgjsު7Zfhؐv|nW:Z'*U+#֭+_8{m^?O'֯~.0 @@Ry̮ ŁrgpYtfͭ4s+r}ָ2rʥ s/̝97N?Ͼq /3'ϝ덃wVtϿb…|COK n//klCf^gZ++3W՗bJ4WWحr~jӧϟߨY||]i)T7fjlvFKR;_[sͅJivvlZKr3?[j|#ksbT 凇Ձrp\}|̀L)OQG?1|? J~Y'V8W JJnc0ZnbPXj jqXlJRɯ4 r=PT J!Wɗ|/\}1e*C@oh1La PנSgJ^IrγDe3!gYZ͂ ?اùX4/䋣23Z( Daicnudm;֏6o,oPX- JevAf7U! ; 2;^; ?Q[oJbMr,L u\]-/4ҕvqSgFiU]l-,[YZ.5Msc[;MbkʵRn?t>|w".%rzD"//];h兼P}˽%9}KF򱪇ԵY"ӗ;P])(g=1tZȫHH"h:-%gƲ[ʋ9SQ7D ˕bc0{0S\+-/V+KՕPny{or;Ɗrz?1Ǧ+ķ }6%HE Ao!Eۨ7vR<[F$ޟCQ1PZNDJ5k\,?oTBg8a^.ׅئ@X,۝uDjiR.wx(ntVW{FnڵPEk(fS>=n)`v5a@Pq b _v/_XW: 1N;1NOlۗ߰a;+rQlԋf}XY.;Lg_N*sro_ɽt17U 5wF@!?iNmZ)ܳoI ?"~'!{vZytKA 1$:T2RPR<(s)RN}v9A0.KΒYO\Ҩή";ec344o[&-jjn5 V):Bߞ|pO[;{u.7пo=tK|+56q>w!.]PAt|l&jAG(<W9B%S32l, 2 Jt R>_^՗Kl,o'{e*s9=++ ``(ئͶmsמj:P5:b9+`.70Wyk=vNlk1'%4ff[Z=v2JT* &8X^D4#f{tܻԞ[fZXu|nbϞ/}l',/;/_|쮻f;Z\[YR[Xڳ[}C3$,ydo^^^2ueq~aeeil޿wWO^O?f-|$~ffif>#p  mz;w>oٸ8xʥjسg>t>5K+ KW.O]ݺs?tp@{5|l/Fd  >22yugrf]iu:N{G>-뷱&a~yvf3ؗI=x{9.}$I| +@ vm̦M7gJS<5{evneeyTPXc&T>~@#5f @gA@ >PXc&T>~@#5f @gA@ >PXc&O+;zXcF(>t>v]OLD1|O䤪A@#Ug=|k@@ :P3T5@  |tl@zO* T>:  '} DG*[x@#-<@ @{_D GA@"@c  {P Htᡌe1XHB ' ЧBVy~{BwCT ,,+Gd7ı>VBCRH0],7~̳[GHnCw"k(Dxg]r(q{87M&7żZ|Q(# qevKDj"5Ȋ=' 5%-%*DPٓ2rQΎ"\"j砟2P>ȩ)Sc=EZV*)+ ١^;cv HwlĖ8<ʮV(k 1E* PSY'$ pٻ(Op@T pA@'\0>#ﳂ!\D* A@@`@<{c3P>+Op@@ȟc \H ydXD96iX!dN';A  `'o`(T>}|> @@ #|[nuG"t#zg @@?@^'%~XWnjeF?ϖ ;cl:_šS3}F9#}< cI_^/.2S Vѳn& у݌/꧳ Bw)10\ƐT>>"fzW'?=y'm=G0J ~GK|lBOfdܰlPg'"$ qx3_;m \,=T֏.%Jŏq#H_N% GoE|&(^T>A-(oQn@ W@H*O3{No*C1@ gzQ#y ʰ"@@ ie)/056=tR;> fftJ?7#=*X')S0J@0wAEV\Q^%@9"|7U.'/s>r_sN`FHC@Bw(7+6Pyz?D9d#8DwdIW0{ĈB*J喖ю#ӷ?%ypzʌL@#G` 6|h}DϷŏ+`ݒ>9 @ }ZSH8Iyj9g85zDw"3H&|29*yBWs%"?eG`yoVf|"vk̏."<g41RD*T\ٸP?˳mʾe;E \'}T@0P`2<;$.>R'P~Vb ˟D T>Ev Y' @ &Ow}@ @峾?@ @]_d uP nPtفdT>+T>Ev Y' @ &Ow}@ @峾?@ @]_d uP niSyOQg1'K&}r,4D$I&SL&adiV9Sk!)Ԅ1d}8g,yƜ'YCyWMbl3Ƃ@*/&ܯG:]%"·-MXyy$ӿ0"Wyevjxf_oݢqhtʯq:Ehl:sN%X:+^\7ޑs dP_ k/Zc9|2Uވ[ l:is<C߈b3Ŧ LNJȨ^/uA@3E'+<ۓ7tShUmF)Q$euS?V>N']")ի+}gCԷݮEYgų=<=׃׮@O$W{Ǥ 8啊PIY!,Nӡ=ХwHрg@*/A$B%N/G~2EW3 h_#BŋeSv0\'EQIFʞ5/W<*ŕ>"]cH쵳WsqAp)0I㡬dJYa:8Tl# [zNGMw L'P~R1qV!,[(`XJK.޾x, U@Yrz2էv* Ĥ @E”wR:E -᧏$E4Wz:DoݏWK^>Q­o C )*O@F m*l |JYd|A "Wy Ybd0ᓧfQ8E:VOS\'#޴tugXbvoʩJ7ӭ6y`D$ʂ+B@\+- ^~; [љFhiy(핒'{Ye!Vx{֮z$^'0/qN.jpUKfS`l,ݜ=~MJ7nƞԾ\[%/¥Rz) ]z'G9ҧFbON4/H~N&̲@ Pǹd.ED!z4~(J-6OToӌ4NWqjT>JNOޫ8{5/ A @H@,I\]b}{`z8ud|@Bxp'`y2SztKOR婣 #:ϔa8T^u3~ʪػXfTrue)lE,C@ax0MliFEǍNlZj8UijFz5$\嗙+j.ġtt{a1S0SdVл'?b9* ɇ;ğr^ e #.9 =";e 1Aݕ,*R+ U>`|  @elsE[.1鲹P^  N7*oYz͉WPj֓I]#+L~Ln*z>e~ PM2k@*CqB\M3b0HWN15!(!> cA Pyi㎍2D`Ky%ltWNgQ{Gѥ vW³uBR @DRn-(ȇ@Yd:@˺KˈTG,B@}D rg^\+ }dž!3^ 5tt=.Hvk"a%X a*,!q:n`H*US҃BY{Fho1X >%ʇE\4uSG:K(PCȟcSt%~@NT^r9n]zռ )7Op2o%C'}g?7z:B ,9|/)6IBqk)M>< ÀXLaf~D] 2D~Jr,Õ塄ꃒ%f9LwF,L)ɵ:)uqC0$,GNz dJ"@N{SXL)TDhf_Qr}:q6ݒ2/l@@umX:dy>0ZL Y B#@v @[{d P,T9dT>G Y B#@v @[{d P,T9dT>G Y B#@v @[{d P,T9dT>G Y B#@v @[{d P,T99_/WJz_OzHpKAX0_b~!J%1NBE/bU,]O"$OdY'(0X^=Z@ %OhaϺ>}p! eP,Ws/r;q3 P| YP̖>ģxo6 "kH |bJx{y Ń5  TJ@Y}?Go}[F6RX  fP4WTk@L*"7c @ @\] PyH3|@@*5 i&Osu@@@ i.r<T>En  4ʧ @z͓qu_cp%?Bo$. x@|*/-$aNПR:EDͼ&8:9z{h@D|SynA :H[:iA< ܎;пex|*o B4+zK/,eӯrSfЃQNl⚯1wbJ2+l8uJM$cM ""Rګgj%k7Zp#BSNMNG*/Y,AsEl>{vy^8PNbcIɃP%0 $ DRʄ)HŌBjy)~UMYNZ`A{HTO*CtaQG)<^Qr:yJ9]spmeoāBSP8QJѿrjDLEQNcr`\R$NEGiE͵8!A 5LJAVDD=޺BIӵ(N'S?bX%$rM&ZdT>`gmg4| b;>JI.HsMmB;`zҸ ƖCzH+G )Y*ϗ5lUubq@R*I5r(N[ v[v@Wg mS1A%SNRxČs=O }pqGDq|_Mq+=nA.4>D)NٛJ96sy qߘP5i &@WڋoNLZ0W XdgOA!3(`P 0@H?rӍ¯Qme XO>AH~2+C(nlbN>u 3c GvN_#$  tJY`,@@'YJ{ }4ʧ @X  fP4WTk@L*"7c @ @\] PyH3|@@ Z_bp#}UX!'п(dMΡҌ-Gc|W@ C%i\kPȕ҈XJEb55 :qBi/J:54adKäTǕ#r-Lu`l!ظ-zX߇osE>\z32)=;b nOi]}\B"ܨ|x#*T1 }ec{=(,V9s] {g[<#Ŋa(l-)p텫%8^O']󲟮VAPj()E{u4D ='א,GhI4kIC7Pt'<T\>"P // HMei_92Qe:9fǘܿhIDM,;w%!{FBʽR܏12:+W`Wc= XO |wj,MҼۉP抂mO8q$> )Uع c#%wNA"$@6/PNMA E d [Zfe"e^iNcΦs=C{';=/Xp!"'%  owv@@;6ƴ}!/'$@*T>%F &t<@ @S_b$ iPLɃT>%F &t<@ @S_b$ iPLɃT>%F &t<@ @S_b$ iPLɃT>%F &t<@ @S_b$ iPLɃT>%F &t<@ @S_b$ iPLɃT>%F &t<@ @S_b$ icH/Yҍ)ld.pWyE-|xb0'zG!xp53&ps!~4g=a AJ]yvStܕWW''xb`8? "Zd?4æn⩎B~j4S(@ H*U#GRq e@R`'R 8✇AE4 3ɶg\H@Bz;o>MD6@vmfdU^Xfd$O~!Rѫ?k6 Y#@Uy.t:]=ڞ?#*ݚpſ=BZ6|HP\ɪ'5_ySozY=@W>$1AW4= u#8yMg7Dk2blEK3*5&(ڒG7-TrE YHL@cs|ؓ>AFwsM-*o5p*o E9 +3ouq݊NؕN_ߣA {WyJ{;0\?t!MTPOC=ȍŇb#˺Y,_*e'gݸu@`ARJƼmԯdp3v{mY5%ʏ#F Xr+'+(xc"/qUzp˶ ~,0 @ 5<|jr'bcHH@ }SI_zF!Ӆ.Y9T>E^  %:4ʧ @X  fP4WTk@L*"7p0H<4q eah1%v%o_S, A355~T^|q \5.%v%OGRTCnqsոԗؕؗJ@@ @j@TR~$Ǫ!xӖ1IX 2v$[Ȯ#vg ?r߿uT8B哵M?]o X)z̬p*O;,A@%= mqNYAH1d.)*I}'f !|L%^Y[EAxH5{BL[O^VCOj vL딆.;}$3J kG >*:R8L?N]1v nf\ٓYmnJu&I*~IBQoҵ5 }H?( ìF@Ӆ4ʾš?F/Rѻu,["/zT=X)''k|pO&%秕>UC\%Rn0w* F> '#&ɬ-}vG/ߧG/^O. `&Bp  ='M #;697wcKJ $$ asLƥĮ> } j WK}] @CYip &wlk@@ |@ &Oty$A@ .b8$T>Ap  T> @ D'<@  hPD@@Ofu $@>4GNےXڏIENDB`davmail-6.3.0/src/site/resources/images/setup4.png0100644 0000000 0000000 00000034055 12564151555 020650 0ustar000000000 0000000 PNG  IHDRrsRGB7IDATx^y\}v⾸A$MoTnwjkOO|cW_]Y]T}_"ɲVP+]]3W+AjjyYjFr??#͗8NhtK*CS̝;+Sz&WȤzR˿'qxУ ;6rfm PWUYٱ3ǎ_5P@ʇcwG?^[x}#ߚz<Q}QjԿبzQm>+e}Wk VAѠ:yzS=ϻSئr+'|86(]p +Bsˋ;n-MF_8vW֑e2w/l`ݣOg}IxZFrvn>/$f僦wx' o6C<) } nmlЯ|1#!!}i].7ڱx}ׄЇM}p˕۾f;Z4[]ۙ==po6W~E$*MnQptn8_ ekRMX1wӶv7omޘ߼1;:~FU˫vT/GsXL2jy/?My}yYG XvlXUVK]zqLUs# 3+涝^֡H:U5%Z^nҨZ7C᫊zLs^vj> aP;@B@mX@YU~z&r8=SLNJ@QA槟{}e]aX0Nfk l2g?o\uIW56bs]cٚۋM.  @.#PwƖx3hfX)eBե7O~"utٙBn4]\Ο,ML,AyU/\َa$cvMqlV=3,_orK替Xh^@~+)}y^]cSyڱ|GO_VN~* ;DJ_@k F/VȺe/~bữ{趛voX֩s?ٹ=߾ kyw|Us|Uп|x׫Ϳ*rԺ6܈kbW\l$}uP܇>4G۽c5RagΜ~c/=W{EppBwh IAZn\ռagL*/Jr\6w8^|^>ݻj|ҭlw߭֯ɕ3 zkwYnenˢnakkBr] %7'̝1כTyXC}x?vP5*tI6mڶ-n/6ҍTy%;9cvl"ڱAVRFx-N.,SZ_.=zj^l;H|{\f@N= _? n# w}n h@w ;< OgD @K9 ?#Z@]|!@@hI_$yDQt4Lj:3;t@xR޸#ޅ2$CK@n«"$ Ѕ"SyKlj'GKemב&>ecD[lHqS 0] pV+J 333߹JRpޓR]!6zcÃb-8h:hєwKcQE`?h!&  !Bąxc3jե\fr5z6Ϯٴm=nf=)Co++lIfSqlO]G >{K/s׎wύݛ規l|ݙ'w^^^kc3KUhS?Fj6\OzAJ-by'{v|x۷[v,Pae!b?zu{#m} b--!/>Y}g'y릏w]_1NkjPYK}$A}ܲnﮛU)qlfypt^>[bt͍pf0A*6_y`[RQ{+o[*8=d2ؿ b⅋O]Jo_)SˍTiee,eQTWʵrV6jZMtכWT\y"FHrkFϜgO5k&ff>6' zA@s\~c/sӍR5ht]N.TfS˵ɥdryfg/=}v?v⭷/yN]g;ި+S,9?;T:-!!Qn-KbCfQ_jԧk++ӧΖ&lr67+ģpnrSΝ8y̱'}0r.sb>\vb!?W)^|\U\i)* X +aVʕUCC H>3\mn:?_[nzVUŎMm^Z6S T)StM遡U@jzy?pۡ7i3B&UHtΈT}1e,*oi}uB{eԔahY*5e߲Z@qy{@8fҫRtn8NgG2yd$feRmhn󖁭ˏͭY_6N.7<H\htѫ4t)@LfkIԸ9-^6&H# fqe%3\NsF~gg*Zq:4?z~nxq)W6lInjd7NoGUP6R#T1^3}U^*ըcNJrģҍڱW}_ꠇY5%"GCчSF"%أsYnJݖpUvOZˢҔl7Мkoo '=R@.[z(_<ݘL^, P:Τf˵5.'~PaPaHqh4)dGrijQI:2 nBICfLϣtYЕ*^׭l-H[oΊv[nHi9=[N P!(==(vrb&_zcqhscզ3Mw*(dсTfH&օׇ2'PUuGUsA%5tG߷&A=N^m?aQм=-!`! 7n8kHRWe |Ztgt+g["`1[oBETXYifF!kR]pF^2bPXp1F+̻:v < m%Q%;=D@˯]vϞmRZVF5#nVنͩTBb˩.&3#3jQb63I4jjQZՖ3^?66&6:U2]yZo#O-e Cu vˁeGCOM'o5$p޺Xb$P_eeԎ8yyN1<CCCwe|bT*TJZ%lˤg3{ucWgSS߻TSOWT:J\X\ǶU;n-̆fY_uEVZ)/Gt n],}Rupopc=w{[9ƒZO{ݰ-l'c{nŝ1ѡO-:'iyܵX/ϗJJ,~ ʦS?yhg}0rx[ЗKRi~z~ri~>皽{o L*ϴ %f͚}-/O^^_^^\)T+{v÷}tɑ#O}uQ—K B⧧ҷnY;|y E@\m۶.]8==9??X^)U*;w;^'QqfQ-L]4w¬cR{2C_=)QG.!473qm֮7)_<3RZ,5_^>8yijmqus+D+*Ͼ<@\ЯZoC}}h-;rO{ұNOM+GܵS?Ѓlq/^Wv @@]_IXD*B ԟPv?׽~G@|Nk"536mھ}+?Z끱cӾ43 @Ϝ!*>֌@P3gD@#ʷ5#Ah?T@cHOo?sF >|X3 @Ϝ!*>֌@߭ѣ!@ ~Ux#aOĄU#B@|ʳ/a,C<T9@@ce@'w>x@ >||l @P G-!t* 2 @;< T>>X y|s#:O|@|Pb@ $GxDFe?d\6A]ݺzAcli+ceh3J8,xϜ8R:U^>h=+!2@ymU_ <}ah1-pH|! w]F1h:B0:DG*19$&V\,Y1GLyoJώH"쭚&@|Dk9Zkχ8 &)U޻QrRܣFV-O|kyG*t=F]fղ'G_}ϣ/|%}n-08f;Ya=GnQ{`oq~'1DXNFw{Ս|prS⌹Fytı̙75iCzS&C{ԽRʫ,@Bd$v=k<=:N} J Gn.)i q7?=v{ĭ橌x+&'e u|)tn8Z^Q(o[ C"n}-Vyxn\ yܲڵ2o6 nc*g-Z8D{jL:ƚxA,zA~{Ny!$(&,MG,chّbQՠx:\$%f$3H;T^yb׿yزew[:\jtY+yW$"A>#?ΐVp*qL)9x_M'"g:bر/r姡KnnY-ZIy_鼣di[ap t|3. EmmZrzv+z>6lߞfmHwrhmF DjWsy0HLǶM;=P ʂIYCt ~A m2D+vLEXE0R\^Y X֕@kO7֣np;@"^>ѶҏۏHk>ݦzUM_=,Րr⭛? Ilf`)ѽ;zdN۞swZ :k"6OO@ zwLRW:h) -k~q-pC(obCGŴmbU96}mzDm_# qZnAı"=-agrPS~.( ٚt@;vlgrqcL-!n/`ؔ"\6} pP%;9gCn[w{6[bzbV0ҷ{D&NFRiyD>+91\Bf9'4DXC]I5rR(͐EK|:ѲtX奔K֟s(@Pv'ۃBWOeւWЁµoB1h wRW.$Ў}y~n{TW GÁ[_v2j0g^viYe"Ԓo -M=yz U*[w>+oK':  p VB*ޗ*8@ yP唈 \'3 $* T9@ P$g @I&'9@g@H2T>%6@%6@%6@%6@%6@%6@w[ {}8#ʎ孆+ݠZbY鉈@?tgTq-rSy*"Q-:b_,G|UQ]86!% J8TpBqow/eW>!%|@gT{۲ѻ1_z7F<@[U^|[n-u#}@q1JhPCh@,Fqb@OH|OI@=J;6=!.Tws h@w ;< OgD @K9 ?#Z@]|+ws:oUAӷP;OpK ?Vѻ]\y@>:Y'= Z*/,O-`(߆OT;6 ~ &xQNvVl]].7zWM"ݰYOD݊У/  ΦR=Q:i,+@@P*FJ6ŔT:Q9fUw8o2'G5=NyS5딄Y\msciŷfv zW.! h]*/%ގUxC- dnw=eD/X ][yM%P:8*I 1TK[GNOAWF{5-(ScЁެda&;6 n}E7TmAjt_Boo/}c-k@Vȣoqi &}MӁ;:*p$mzmޤ}^ʱJ_hn Kx)s難;*Oާݥn[Ն wuADz]5۵pp :zU|xfRyVݪo2t;R#ޯmP:฿Wk݇ A.JbQs@~sfwGwA=yjׄoLF1iOz XDHw8OzhK;D8h/~4*UGv  t0vo'mƂ :\ؿ<z- HZ*ϟ{? 821;8?tȷY?4螿IL#@RJ^$}]C[ T K &oEK*g '\@}p…*g '\@}p…*g '\@}p…*g '\@}p…@}3 @ 2=pn@Y1%>6c & U}9c@' &M:I$}Ɔ 7T>n؇ I|'36 q> N@;I!M0!t*I @ n|܄@PNgl@q@&}@$w>cC*7aC$T@P c@' >xal@{ gtY|܋p/WUvA4GTKk>XB (5Q=HAIi=Xǒj[`5 G ![ꡜ=bo JTRa܎fCUAR!8X奊ɇ^ZEcV飽ŎI%8\ ;ʂ}8ʣe @@*/F2|?<7u˚gby @ U JpG۰K˖@g t@lia3ߡ=_rx3ؖM D|%ekBY+_-j`VK/wKٱE0/ɈJ0v % X4;ѩqv>8 mb^ۂ@}N }NAwj>OtU@}Et, wPK9C}Et, wHݾu $@*-Q[''޷q|B  @7X{tϵzvy;pòn8#9Vrģ:T2*ɗ,;nPc7%]BRn""@7Xpy׻UEzTu#jiH7O5|:B be£wټW;!zb7 v=C`­#SA!&kdn7|7Ă ޛ0ʈ<Z!L{wY/Ǫn[ǡ>uL DD|a]MXmVX^vaZK)JڝqsîV粁%_Z$˷Hz ? Ǻ]- 7U= @; +T>V a|b%NJ:Lp@PXb@ NC*+^C0T `x@@cŋq@&w8 @ V|x1@P'!J/!t*0< X 8 @; +T^YG4olbЭMPZ[C?ȁQѠpm·Ű_7@XyBc@ U^FkjĄx8. b 2kpieF (Kp#ritloB6@0R:dQII1n/BAQnAs%VY  ^b\a>]ݾlw> 0Ry{9]uܓz[PؗU*M f+ˌ.+xD^/~CbϖU&  oLU^ʢ9ڞ}Fi*ݵnCX[KUdže1Pt=XBx E寲wz۫DK@O8rMb$h+{rFJKqa߯,(k҈ݮqq-=Kl:# ݎN{$o'ӗ0!G~`TkZ={uLbY첫/oIvqͪJܱ*WU*3~>$ Nx|\i ]G/X*kx{Ӫ8T+ ð͇ؗ.7G-WK>ꝓUKyLP@8B4T)ڮ,W@#j}mY՛JՏȱ,#}SWTWoߎwQť_K 8^M zA!@w {,};aB# Uo;tK?N@R I,qAh@LOrv * d|KlPy $@哜]b A a}۟&,_p=cL|} H>|5: kOSgʼnwz:7qO/T>L $^'j ոħؗ˛J "TL h@ 5|NIZHZ<2dh@@ C3gzvBx,yP Oq]Wq^ˑĩ$:T>yG@{&*`/\ZW>ex$:nPƙ!nkV:`RQu7\0:_e[8BEroT# 6}w9ߚ%1[l?D\!D)O@nWgSomOL).nG{qs x\hzKL`c0 "'G}DB˾թn?z:(znθ()ZzI\6\pG )neɻY<- ٘ZD d{գrMg@ bnn0<*/&N@? wKSO_?t(yIħؗL=5yHKL%>žPdDCK.H'O j\SK=@gp|Ϥ G!&56@@{ I@ 4T>4::B|$ !&ʇFGG@=@$" P@=$\ *!TBhyX t:B@{v-| ;O&~|IENDB`davmail-6.3.0/src/site/resources/images/setup5.png0100644 0000000 0000000 00000033375 12564151555 020655 0ustar000000000 0000000 PNG  IHDRrsRGB6IDATx^keGuy #$4Ʊ$Sq$D"**U628h C%SU"{ Jż9}O>^߮S3zZuGN>H7;ztّ Y8q{|GO>=k$@`rN:Ǐ=Ʋ?o;\z[OOiBZkRtrOMمc~ ظIǤƲZRډt =7Zof.)afܨ;,zuIBOZr@93|Em5RVZ[Ѕ`gNmw̉Wr֝< x^cmD4y.ե]k\ޗ*^v;_׼]n8<| j 8k_s͛|otn+l]O|3/pakc]SEuVJ;knVSRעQhSˋQ|Fϰgo/-o9zC'}l/Up_y+uGW|~u7I'rwvGqW_x6jRz-topvkqk~_տasԯ.~8Yqً?u3/~^r/$~aڏx/0~%3lC#`w-jjWߒydޫn_Mܼۗo}oڼ7߸nݽv$nP߯e%J2bSa_^# gU=?zg_v#g܅}^⪍m9}^T_إ1|p]^mg)e`>Mpk?x$4  ٨q@*3{/937.9}o_?sϩo;̋6ٸrg/?ӧ;Փ2?܎_~+DN!vQO_~j.7/?X^@d~뫖ů_:zꕔ7xbck?WwvwW̡7Li  ad`J֝3y5y x۝oWگ=_ys>~ﻯll~O~{O:*w~yRW}-mnj4_lh}\f]"}QC6?Kw}ם~-]?ΰ֟~/|v qՅwȽ'%*vT^u`}7"p%W%yQFZcsw_~񶟿7v n^7||э{nbnl5|.$j`/9kaO;攊+fʾKDŽfU>t@7t-7\ٽųgF̎MTŹUJ-뽖OnZ/̋?|ӟz??F|w2@@<"`<3Z@67ե9' ls@S'T_ޯRK !0M~vSυg 0ysw0$Pz{<jyjOr PS yL<'9 B`g}<&OZZ~!0k>H'@-O-?IN5jyjY$$'A̚8݃sWն ] ֆIӆ@߈1r ښ @v֤Ry;!!^{&[J0w% jj3-.ڄ#)$LX{aMjc[IV_G#30Ad%J+wxZmB-_#i'N6%Sa=8W`Pک\U5V&V僑(O;PGE_lKJ`(o#ZjyDe1H (hZSlv8wPxnX[n׆-Qj^!NSFg %x컍 kZ^>ŋ 0 t<_Db%&D;"|DglrAW|$ELP[f2UxeQ))m_i}ŝdn_MROVڮz(KJ߳*QPC%#_= XpլZr~Ե|M QފRE}ԂT]Ӧ)Ȩ_52a6$2 0JcP“dD$6Q&94`+{t)UGh׿V-h|Aa wKmL ˞05337V3k_5eՄ~%2 [yM3LȽ p=֠s4Z #Evѣ'O>~:ALnogO嵙np1ci8;kXd(0*& 胟քmm/vB|E^3Yl $ kl]L kiZ֛Mh}P&q@`s`)&v> kW(W9ʜE;y "̀@TB)jg^_K{ء &6:c)o9 :(3NC/=|_) -3SU,V,B^Vq**Uԯm^.T^}.*s7*_ɹwl̹Չ#LΕ !нʏmo*oJ-_3s,Ͱ<7޲h_n\{*@P&潩vu?|pF]I-~ڭ.^2qt^~772zJ}& wzy[V+ڋGd#2F[K@-sWG5pkڥ*n$ξ&@.wl"iXUpp]?zwʷ1(mtO̖@g*?:Dm}]eMoEۦEslI#]fCmSU P&>|_nh5f;ނD'N|,'&Rl!0A|OU!XUˊ^|PjVH[J<:w{g߹ľ)AÀ PWʮo]KѿO>_p\]^@x~i=4iPC5^jHIzyǾU-MYVCKL*/Uy%EQ+z_ i@WYkz*RS"ŵޟY(Ŏ.W;6 iW{f P?PXɺt__L" _ T^ 3L*/RyZ_.v>tۅ[ig`,ouW~Կk3Ȫb *Vy{\)Ra-V^\Dܱ߭uQo¼3+:V߇ʼ]x0V|@`.P;Nrfq|uWȮ~nˋKrQT> 0V|Xm]^m/Vre3]e{;yXįl7òa'c D@T޹ÌWQJk?w{2Z{uFUXB*5C0Mck妼S}띖jzg\T 6@;&6]h^~7jG{ίw3B57Uz-!%@Cݨ|0!pCzοˋ믿6}Se- }NW})}ߪ]Ja~b@@JT^Jr5]oOݕ+T;v/}zy_[3}! t$(UuV%m+J_)TDR- TMmta_&Gs_v(L#a @+**kd{ީ_,~޽V~M4jgfz U r-#X˛PWLտ)nw|wӂ 0NwѺN7;0Bx} k3Ƕ}6 Sˏ"j ky]ZA/_tjڵo*hQ-ߝʯbs}}WUWktuMh,BIU˷['IQg1f@`Qy]ضzD8o5}C!0Z^k}Z~"4 ={F]˷Mu咳0kZ_7vqsL‘ju/' Q?SOVb7yz|Ϛ@ӛ!|MU .^7ei_u14~lsm 196< ǃM(A&'Mzjka6:k`ϦUc|zTqX&Ng37R}N),U iU ڝSbK@sNs`*]irr@h*_ nV"$+@ T ǕL/;x'VL/!@x=xPy)$Lg': *t`m|PGf]YtL*p"]Ҧ/@`AxlP٩x'5}_̋*x#=§k̅*H/z c a@`jP(B? L*?z@`*?ِS @@f]? |zd4tK6p>@@>B2I@a|amz6p|C`:P`U 68z@"T>\2ç@+|WЗgGL*?1MuD@#` 4p*%٧(3P$wIBv$BHCS_7@'~Ni*?!z,!q@=~6pBx T~*#ˣZԷƆ5H~g]*=U&:=z^=6~=h,g.?h=ۍ6-@/>'O:m#LαT^OVU|JԪR3=Fٱ6ed/)Y騺Sf)-AX4mxS/9]91ǮQb T>h2*_ I ͎^ͺ?~MxOTrn)Ki*6/ Sb+:‚^*bS5Ά=TxaL"5y9*_9GI[lkw ՅZ^H -*Ko.=;9p ƷHNi߲F=zWy[z-(7꯫߱sb PH밀;'U{"WE*{-=o5ɿb^Y|K&s&g ]9f^ Ob ٘jrR&fI@TQ8)SҚNDz8rޫbmNT_WD!ȉ9#C;vA}]wê~Z=y5u͍pw6kyu%9gSIYv4Å_z *͜\܍h_jn886%մ]i~8}@d^3!K8T~T*H "$Ѝ7 wZYJ=qV_DA9.D tUJ|dA->fIIhR%[m3vh XcEstVwT>M!0f|مds%ʣ0C@Q~g C@Qvg!~ ʫP w;4v L^%ml$Qy %l GI8Og;뗎 JҩCTFWGӎ!]%mlj9At6M@-֜C(rᎲ;B"О2p(5FK-D 0Qôl:QVăނѢAD@C!ЍkN>\ '*D 0|Uca @*,䵇.id(#%<@T$#MKNh*ZC`PHQ|x( TMϟ[|>C<@`J|{w)QOU|C@@ʷWkK|PgbzEcha Q0h^Q@?TGq7+ $UjYr@NARRѴQw9+G0AT>@`X$*_jUqoڤ˵&UmZ:. .U>?^[.dQ " a|~rX&4|"̧ԁj H9 UU&'#*_2N hR[wzTd@C!PiEAcCYq]Y7l8'!D @*kbEoCF *D 08Ɨccȴ71AD@#`|lpe%^tEzr $|qd^ }yM}'G@*ethDJmX'*_' 0Q*_\3KoϒS>!G>@U>(sQH{tW|i)|5q P%'!ߛδg#?hD.hIۑb6&U5H|K`q |y(Cd.-i6BFC5άߛOL =oGCG3-SV^ &jِ9O@"&5AQz({ЏZЏ 0 *DIV%%IC&\&d촸*_)!0U/%j~u0erB[ӯ$aq_BNH!0ʧdU,~rV0{Eig9J ׽/& <ǭmfM@Q*%*KAfr=*g@YETR.]NY54?G&TG.l@۠O@_*_DscT;I8'87A#!FC2r]R]HH/oR*/Y(s3y%=6i]~LCT>! 0VET^|U`)7Y{o|xA _yu-26g]13CTyyrEKc[:!uTJ{N|=B`rT^\@3-!U-]Vһ^T>M 0*/__mP76DN$@J\eIXQK]Jv 3 B`*oL}/}GJ@W$*/%JRs娎2%&0&*@<"*Ԕ&|kr`a΂]VK@`UyG=$cCrcTt tJ hZYk)&9q۶f; |&c.<"ęZ&N= 4Ѡ4Xz*u8meS7z#04J|Qp {o  BA5ӅyW}Ni @}Hm0ZBHIVZ'0pO5R".P Wy>aXi@`(T /e@p@ /Q~u"8i@0ѩ|f#ܱm  $ʛS:;Ck@`f&m|ce:>-NZAMf(Př.$-SZAS&0̿"/! kϜhi @`LT.f@{B&@4QhFf+~N9 Ty-{IVҋd@=y|f,\բ\1 A Ph߈tb=#İU^kaLuz(+~9RZFO2sx>m#9 B'=ͩD9g~ 9h ( ` մ AO# DJԙ U}q@h$ʗe K=7 #PJ=ҖYV\'v"ѦH+@`*/ծRCa- i@C>gh @*/|74Q y;Nw */ "h2G:=BH @`G%#iLӜ =%CP+Gm&DQk>yqJ@jU>|˃נҎ^̋@g \(a6iV xؽEK+@`<*G@9_-m!1=z铧N)pb fKUy iеO#1 M@_V 0nǏ! @S&Oyt * 0eG @S&Oyt * 0eG  i߲-G8{,s h>f 7a$}V:$kXP&?A$?II L^Oo%3kXP&?Aʳ// *?Q#f@RvHLq?v);^Pmr6OIP4T/%gfdP!1@?q=1"]]aj.^1aV>PQO@Z/|R*蚽ZZ޼E%j۔VfPyٰcm`^}iKSA?cVGMu.uҩ< S]r 3 L*?%7@l7rՂY`7,YkWWTa7Pa7wF,ލ(ލz ݨd.6?y߱j1[Ǣu!z[Nbа/xKKK h!76/Nr嗻_@3c{!+=^F?zG*~Bc_.ƛ矊\ƾ5g/^s!|3S4Bgt )xW7ʷ;׍[G~#K 3}lœQ;̃ڕGn/Cw4t OZ͝~󵫯O˼{Bx:ǯ|ęOφ~O! !>?hr.ĿBÿ>?_]^K=s&C>JG<~Zo%pŵ+ !Z#_Lv;2o=;G7^x2O_!WB^/?;wC'ϔ G{S2/OlS({0p/z}³y?cC!uGā#^%ߡJfYWŻj(w㣌s>zG42掾xb{o}7/fkϯ3?xL>tO?O>>#{0y1͏}|%sg9}m{&eC{; O?7[*,Jt%o ~UV7[}&s0D?Uݻ.DOT=,|E >nC?8oWpI~p<~oS m   (8(8(8 (8 (8 (8 (8 PP3Yt?7?%]\Ppe]VW\{(x'}Pp*̃{J͊_3Ahꊃ3~UÌ. jݔ'p7HAdZ7wpΩuK֟|:7+F ?=L[F=Rn1\4މxIx%k]` dz%pr\pȻpv[we_Z;ݙ{ ts?HŒ Gʾ5L|&UlO+z%jsgFn[r7Tk'P͢T8T,8AOnoiL =@AyjT3';۩c-5Ր9*]}'σOl(c*fR4t׋^*٩0v%SŬbU^)juˡ{[+[ygxKٷWPrˡg^ ?Du|L]}|Zꯌt̔\L{I%N{2憊],z\kO@1N ^{OO %J&,i{(x'}Pp*̃Ʀ0~Eq ak+ dlmm9M2̃(8-0Jf{(x%I/ <+ɧqsޕZ>qN!mዀ77*ObgT>Lh<1n-|PFEF<% C''=vwSO̧ sB?M ëm`9q _[TIK.cV\OvVƗ[(TF}\w= ^{BF)1s%@h{[ =~AZ̃(8 (8(-9t~+`0(C N{mmm}i1lA; 'HӮ|]&y/P#*:6O.ug瑗}oKn$ןzP(8"{{)$ws6՗sߛMD_&w UPp<ܻ0Wo8uv7xn#!'y7;:N~ ;۩T@dv##L#';|?M G|FuK|C%Cf{KޘDv^8~b?Gn|M!3s?o[ -5;F:D[j'I&ŕL@Pp@Ppσ///;+@oD8   (8(8(8 (8 (8 (8 (8   (8(8(8 (8 (8 (8 (8   (8(8(8 (8 (8 (8 (8   (8(8(8 (8 (8 (8 (8   (8(8(8 (8 (8 (8 (8 (8   (8(8(8 (8 (8 (8 (8   (8(8(8 (8 (8 (8 (8   0-1 O7|;n^McpֆG(8vu+ -3FǕLlww8(8|`[h:Z Z2uҊFwf7@K>nCŠ&g26r{y3lOEK_x\aΥD9sUђ姷Sp8pCΝu(8C>wN@Pp9pBbd(8 (8 (8   (8(8(8 (8 (88BX^^v :w)G@1tqIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdAccount2.png0100644 0000000 0000000 00000021271 12564151525 023326 0ustar000000000 0000000 PNG  IHDR^ IDATxM$Wa',,Kc,U[ӰF3?Vsa:Ň 0,Lm1lf{sFt8ڗCך CٰYF#MrɏWUYٙY_HYY2+?_F 8yߩ(8rTY܌h-~qy%m-ħoFQR/06h4J ̔ŷrg7'לdmk/v%٭zť{qEvGx^Y%[VJ a((WElfϷ%;o/Jߋj'+++Aw^P~Hطrk\~d>?~omxEu?ȧz6W݅IE7\7{[۱4T|+Ls{0GQݽ'cny(z薷VE7x;^l_mYvG7%ߏM;ߏQ/7ʇfz!?o~YRE2<}Ag?D&X?'?DQS'n7YWy_ǣ(zEwG[2_%Gyt*~SQQ+۽c'y ?TqG%Ϳ:E7jw *䉨{fҗO[)|O*GltCŷ>bIE2P0S_dEwǭ3+3+g*I[E,nгOUi3r{{]H,~o}S_mM}Wzh|n>]^z}_C} E~c~3Wq;N}o?EoxG2=4KgHg=43_u CAbfwG^pޟ ~ Ѡ{φaݹ/~7Td >YayEW~) a8~"@EQ/ub+_oi16HH R" R"HH" R" RHH R" R"HH R" R"UY9e -/Tʡlnn6WZPZ/ RݰC'f%6L&вgN+bvvvBO4B_ @D @9}()ZqpFW̜{dGZf3u[ki@QCGLK)q,74Wc2o]XTz)3]`:M_H˦^K<%4UM9q=[3[dJ703V@~eR]kV|9Ya$/ I0$"=P8Y&Nj1_EYSJ~ފ2jybdI".43Xa+P2-?6Tԝb@e[E UVᄚȔMǎel2*U1T2MV=UTOT^mw,"Ew<(M?Y'ueڤ%mU_>LY$~Ϗ45#_"]zxcF#kd^|[d7[8jZ5nq B&@+EcIAz܋etWg"OO_T2kmR[q_|Ҋ 7s5VX`H W6}3};]_N>GW)dφ-|zڨ5í|K_by<A/@w @7x-gϜ։cHO_R" R/E"X_)f2(=sZ!φL@#D @D>Y8ĵfԃ}oּh4N˥ be'D${poEɢ ;E% ,pEKv.ό_NtBx)sW_QoLYЙcKXH3t2Uxfc WW.4__ݲ1dYlp Hf3 g)\Q.ȖZz\+|=.3!@X$ad5b~ŧlU'G)h<Ȩ;Y~رy`]y:yQw*! @7]rL8g,]teFxఒG@+Ecv Rs'2ݲΘ3V=ZX'-٫(KW,]Xn +)rf@e` ,rl茙SOl@Y" oɂ+*{YOl֖Z4rF n&Q.=)nXSr+D 7">@KH }N!x# H1(D! @&З))d}B` {f:u@S$7I R4&iH$dL_"f4#)VE"SWӓbGP_*#)VM,FSEa9m ;v3/P/$eqJCE"O@ҏ@+ ELYq9)kY\ao{7HOMu)j 5g" kSΞ9}yHB@`Q'/}))@}n4ؗD)a2={"@}b}X0[7@h:*dX HAi9M$܋ RbH$2IE2/toyɦʢқ^~f U RhHDG O. kSC -l))[E Tin o@]HzתDnV|qf( y\u' ׬͛o?Hn楳zf?RETyGaFf+(tD ZOb*9nbcSF', X8A#_hho#GI[zt;q=iZ8pˠQwkd2JQxzٍ`"EG-;TbtZIL@D @))jw)6777 YoA+)u6}))@D @D ))D @D @)G˗zy>sz{-w=ֻ#[`?~fo+^k s,g}XE{oREͽ3X}KMᚣpC;`hb{Ŀ.?yu<ѵK|vj"kofʬ(Ruۣ]n@|ۿO|pp0:壏'o ̵x lKڪ\UH ln/]K_r^sozݏŸM_h4LaH3[@H~9y וp-5 dגYl.7iلPH~ƉP|h IU2(p^yʅwgO 裖g>O-߻7Û~p5wfRUx/3 7Yxnaŵd.gVYBfK-x-֩23oU՗ʙ/H3mg*|+JL4(zˢ(.D/'Sx5̔zImg9߈/صJ’Ο!o"3+?Dw 箼릷.ǡwg [.t{x^`#g+nm?zk~~7>xo|˗._tใL=:+Cї"Pynx?O<{EQ4^薛^x_ۯ/~Yp~șb2Y\MxJK3=r]r&e. StI)<ZG^p~I+/F;FQEw=.z%'޴q/R5}n2,5ҥ0NCf4kOs4Hq5׼e/StMk1B^V?nH" R" RHH R" R"HH" R" RH" R" R\elmSвx|AExZhf[kse%eR" R"HA1#R0򟫒s&1Υ ygEz s2)j}O{r 9 zwJ7Y=r R^@/3VVX'NOXCV#?^43mb)X@aQv #L1?We~-ec2QT/<)9CM 3?u,!Rܫ@>)k\YɪF786@wZ 9v Apn51}x9[Ù/ua:]_;[?j}io|ܻ' ~ȗZ |?Õ9?=ua7-)\l2pū@͡U:R嬨1/!3W7k{Ǒ[@kd))D @O]Q[ow47 Rt{p9L&=s:CJ(U.5. +H1*A/)75Xhh4RJXԳ? g ̌._j6W+g})M I&HFc/d|2lkmt:FtL{ r[^J>6^Ù/7=&PJm }vc3HL.d8 2Ñ$a$fæCYeey"U~fO3YƖ0q/,Ȳwp#-fkҪ\-3aBwg棟$I0N5JnaÁOIW\%V )ZV ~IRtӏ=-\U;~q{J)aHtKzHf&q/B]^Chz]ʕn^?MnPΒ/E\uL?aͼ-S<Կ'z#̔s47%,rJ^ƇWᙝ^5=eLt({ȷ \$ȓee`ʢi6%4.3cn|`43`)V΂3k>s$"PVψ9Ûcjh)zWŒHNwJ!#R3hϞ9=%9*5rsg/aW Dv6wA F@An@D @)_"s aE/v4l< RD! ixX\#R9;;; _j]_*MN7^,^8rdoX&2=o[2·̘>?%'E6Gs,>P*Wf0 dS20PeQel kGʼ;9P"E',7җbΛbk Fd@SQGGVP-N)GG_g4gϜ3WtvpUj4hva0".i +aD \,p=o|" R"HH ߥs aEc?,d2Q?+ΎB6D @D (FѨSWo St:NUr@`ӗH—{ɿ\);]nib7~O"/2^~; Rt+O+d8=2n٘KzD:OdMLWp٘Ӌͯl1"ESEfp_OF%SVUתeo2e~CCO+2ul!@4-2 sQBK;čX=YX/+!ɒ}뤑F%}Ŧv6@+ErCedz* eVRsE#Ul!H&3{Dv Rt5bp,S8YY@w))EkΞ9}yHB@`Q'ӗ))D @D `]M "B" ۋ0lR" R"HH" R" RHH R" R"HH" R"H4cMN ~Ϟ9x#G3?~<\"΀+*]pi})V0W_|*^7NwjH}Nqh;qu'$N&)rr8yߩA^Ng:3|hTNL~׾CD ^d d2qdE ZuX]d['-GǖZǒy|Jеʨ"pO{%om;q=XG9*6mۍN-J\cTuW}(BԡߥKx;O{.0<FRE~7ww OF&y%=K;q,'5{c#lnnfd*ϥ7 ?c1鵤wa榊/c)̙9$SFDě9@y"_qfj"o94Gt"!;Ue>qsUڒ1Eّ8X]D+ER|@ w: i2_ɔ%,_F $.闅7| ƿ_ULIF'(Y\{ޓ)g)Uv@F˷)%/1ez|:9~NESJrQ䑟>yHRYLrL¹ ~]sIMr?56\>@7n{Xy/|O=2{AtIDAT`R"_dDTF>2+n;ʏIZGe#=~Ԕ,*r,U-@Hח/JvJJ ^Ɠ[)2&yZQQ!?Wa(IES]zCrOc2]yʼHN酗K᥊]~KMs牤"Z RTSuG!Rdƙ_@D}i&,pQ1ZÏƆ$ccfLeJễ/ /32 iBZrTߑpB < iv4n| /4*jV/UXeLMuj(>=ة hqZE~"3_RngW_{Uè } R )>HU4p(w9yߩ~x:]{jڏ5 Ouc=*&Ikd֝SŇ*?:H_ I Ѐk R" RHH R" R"HH" R" RHH R" RHEQ En,wIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdAccount3.png0100644 0000000 0000000 00000020675 12564151525 023336 0ustar000000000 0000000 PNG  IHDR^ IDATx]%Was $cvva#!N9TIaf) ۋ6ueUxjJ9_xKwf^\(X{v/c/WIU@*w\W}'NǏm@c+lNl'8ҽO!krgr_?Bx[ߓݟh^\lǾwϼM]۟/_]g f}x!˫SfD8X\{T7No_xo剛t Da}(Cd,SܕO>aV/EEq~x~qG<7£(ʍxMo`/yESE4#DFV@rDr\E.~{O}_`Q|eo}ϓ_o [?૗Ghxo&ᦷ//l&^{w7H&;_hj~}hz.4qvHN19;r؅ٰ"`Տ_G?4^al++@ћ_u{n o_ j/+R4_'N4Y\B!Eu{i)5HH R" R"HH" R" RHH R" R"HH R" R"ֺ̙:yQEhZV[rc%cR"k? b]./tawwW%t*@%0))w| DNo}=h+ESf.AjHgm=ӶuT5 o| t:-y "E7FhJG+;9JVnɜ6!Nɷ ,;sr9Co%z,yZ)U[3gSєԏrIy*ݒ9g\d廙z_mbf*[`U )*&uєmni$rcA-/rgKq;%j(J.[_D' fΖ$ESvfWX4svzɂ[݋eVIT,[ R4wzd\k M,/R6v,T記wz7[TQ=Q-fQFDvxQڒ}Pg ̛ffs"-TC0IFɮ0 {ߟ>3ik0DD 2oG10YIA|[d7{8ZֹZdD:*+AN=)W5F-5\1;^C3䏲뜫H-zwWXqlf-V,V’*tÿٌ́M=远tf]vwwٰ]8BO&7jJ')  <HrIX)hdssS% RД X @D `4z!xblvwwUBN:Dg:R" R"Őoo2\jT~7ײs?Dd:.tɷ "bՎE'D{8:${)R ;U+,YC MK~-OMNdBK.-^}Cs2[S$\ȶߩv:~lKləmen.w .4۠&fݢ)dZmT1r\/Ҥ$Vo]8H"E%2m|qz۰M=H=w*!^rLyh]2L&hJbY#tf;ՄWiURӢ3K;W;ǣJz,WPrѐ̙gYRм- +)rjfے5TmlQ235%wf%/IyInm8͢shh%F abE335U+Opz@MHAS'.c))0GlU Ki H1**cOT "쨄.hHHA%U`3 "EMqX8.UHњ"6So "TjvddN}H*Rbß$vRčw:j{8b$bD6U䆏R R O"w!\`/iN&;'tTh$X!~ÉXjKfV\OvVm{8b}%`y"Őd RM @?^9}"mnnD ?pKH ڙ"&)]EdWRɁ%zBݒ>uR\;[vvvťX8>?6H1g;$wܞM*-Hy Rh'ws5Md*rGG?"3ļ[&mpe]8KuVߞ9T} nwEMvNTz)*j4Qs3T3dT_dZ)|Q#G-&>G[cw~[<EЩYSM{f^J!E7*DZt\btZFL@D @))Rlmmn)YV"R0nR" R"HH" R" RHH R#.>C})jzw>w~Xrc?y7W^Ou5ֳq7?*ܩ9KU+Udܭ FNn +n%u/PzlR%Itfɋ6(Z\̼U=zV_Crbv*gZފ.[!ϴ X^~nw!^B8x&/}3tU [ٙ)vIfߛgn҅gL0H[=xQ|}oPK+*O ;dx^U`+gZ?WtsO=rË?z|zo~赗.^t᳇/>}?{?r0H6Ki"X%yx?O>sBn*<#=vnى3{[2[,iv-\/P6e䮡 3ZI=\ޑ.? ӗۋ/#ŎI!DxxK ^hӥiF݅Rj?]iYLnjDR)ꪗ%*,F+)@D @D ))D @D @))@D @D )@D @D +u3g5tlsss^9Й.7: J@njD @D ~cyG`?W%M)Υ*ygEr 5NEGyTs}6@| Y=r R]@.SKV[eJ6Z[n㗝99Ɇhr$Z{ PΓ=f"X Eב{Se.|JєT1rKH[ڟj̞)tߵ0^.εHɆ)XU uW\Yjdo[SDIZ 9 R[E_=f(mp:C_-ϱ>7>X]E? m\ާ2p襠gsϭsq$w1(7!%V~h~WKgH0RU6ޮޑ7BlO5gz@D @D )񫮨/[%bi߀HxwwQӧNӠbĹGGA73ےΎQs^4@2`/[K䔁dg+ZvUEk2iѫE&yIf+nR:ަ^d{s6I'ɧw#RTJEosis޷|2CtC5*@ %%763T,Fy7fbY"YSn{YҦMAʙܒJeq5fʍM;DEb*\%U0#R]wߣpIU)COvptDJ{ܷKsUb0Ɲy069)m0~!7 R" RH/Rə*aElnn}YAIU 7V4(/X,q)蝝0,s]_*MN /rttD #GU‹ţIN#R^^JttvtD GD ,d2i`y qYLX8W>ϼt]AhLW4er%;UHR Ro?˾nPlN)!xr vtV+R2^4%7gD|xJ6ZO.[O*Y)RTܡ& ,ZUֈs, 3gfrJUGgK(y/󊇩3EQ;}YY^QՑ]IY?Oܒf?ͼ-Y\:>R1}*%.N&5XԮϬ\cW^ܳz| Ϝ/4<Z~dN%i¼(CózN*5\is_aR%M <R]`1;z+|ZQ dI]Rzy[̵̹ҦvdCHH,"a,كU |bȎ"dx^:ZÙ(S_J*ZyCuɘYѷYl}./mkQ Q^`<ËE mvb8ye}cxHQq3c|LxP构/9YP 7>T5,a&ie#Ф9owي)"нqѱv h3~Eu=*)wB~.J]~ssPj V40pf&RbhԴ+Rm)vvvD M" R"0~/>V?,Pnj R0J52smK, ~q_ ['tZ.n+vtS= !yt*YqN4XN0X0sDdvmK, HѯވSos__d넼cSrg+>Y`5HH5U@EOpz@MHAS'(g, R" R.9NZ R59zLJ>Rlmmz"߽"E E7c))@D @D ))D @YhHԴ+Rm)vvvD krHID @D ))a9rظwĉO\E …ƺkgϮx tY++/> T׽++A_|\7.3) {+02=\D_._^1ZG`oW `Q`4xGzZ~E.M?qnF?MΟ_E'R-Wzu[qJr+]YT"?Y˹Z<;g(&*Zh%3c-T eOrλ+ZMLmjr3sJʳaZc=qSHmQ)ʪ%%l<]!0>.;=Xv6yJ,⨭O`'M@/;E7Ts%q zej,Ȑz)R>51F^5^\vr{|>C^4آSbG_"E_(9~ȜR`"UNNeg@{=o&UC!zDxIDATHQ53Vιr/Yp ,ږ`KU3/;=LqIE=i)T]֣inR SeJ6Ζ7.}{ԋ3?=lR[; ҫݜCaIT[rS-R%&`5;->y#7\OΟ^a@ 8}VsE('NP@w@O9z,NFӧN}{#=Sdx&)L" R" RHH R" R"HH" R" RHH R" RHZakkKEMLwMEmO>AIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdAccount4.png0100644 0000000 0000000 00000032044 12564151525 023330 0ustar000000000 0000000 PNG  IHDRWqWV IDATx}UߩI O IFyJ$(ʀ ]nX嵮k|@PD]">dE|/]5^wܽW #!!O3uSSU]}~8>uηNl(|"hIb I;غa&]N酙!1V8CSmН-CS;9?usg梮/Q@\ /]}_\O}[~8 ^zk$?ӫDd}"ry ,{Ed[r+>ڴ_~7~3/t` =t}%DX|e"3*9Z5:{ky!M愀}z^o˦/lŗ9  !=~Spd}@C[*"'/-_92%_./s[D}DdT~dΫ>."{~ɭ"("s_={^sWOVv;~g]1N?>ψ9Gy+D;~]ˮ Qr/w8!`ytw xsu@~m:QVN8墛߱<9[ߙtBW~\ۉ8GV~dKKQ` x~_;YYpsUg_yT8}J;_v BG l{u\)?ws.wIT (R[@ "G7%LsQ@\C_WNy-(yPP+P[@N^ѓ_C; Dt:>PhNryKn9u-6¦Pl+?w_Gֽ}!n/ ~iκ*̯>_w:;W"lڸhI3PAqyj9d2;~|~llСC{ݻw:9`Μ9-*?>cGGÅBwB:]>=;o.](0C/NRs=ڳougOٳg'){wXq'&tI{yEfYf5|o0cx';NL@:Nq j醜3099999$F:"v PX"J)> ĘTxޕν2?mV:zaoo@DKa>~0䃙M )0 Te׿ N='̷Rix#jZD](5wySt( +-fWfRH?8סgVWv/<_ʹ@ ԩWv+fVGspZjPVU״'-8vZ4I@Lvb:;c1]/ѣ'ο+ HZ t!ӭlDz 22b?)hԠBCC҂J P(%֚= @+h=۶Th['7(4hQJ+fV m4b\2 IN];i]s;;v=tYg^}I -}vֶvǿ}4?2+ċ<("w-"7//d{ ~IޕCC+ Ϗv2:ZSR{;N6w<܎bJ?iӷvw.:o#A/Pj=˸X6?LЏV̘5Si3xzߔ nХOs䃿{ls]uϚJo^gճHВji #3}=]""24O{uFD^xr_/@?v; NWmCBU6@S" ]:#tO2_uÇoοىweE]Rb)Z""G~@7d`x8"!tdbSc Q0 👏r)WfDdbD_A!6 ;. ;>6224׵s'"E!OUaо8?笔h:LJ+rvX.7&"Uw,mѺtG`˒{R\h{ r HrwSE[J< ]rM]>0?W_k) MT pեQMO+] V%;]>˒sD:csRò_+uE_OJ"E "DM~j;/m?QS))sw8gga;[}3>O3|x隮{*qWGl}L"2-aZ%YZ' ϰ| <údIA/?ۺ]K2׾!s_+ҥ탼6ڀo<>-} tM"`u[iu}#]u;'SOhpS]o˼m|A 4@V '9 W 8Cw7l+>7Gy}zd6(EŢ]΀R*N+=32ktuU@r ˷y3|Ejq?֚ǎ͙COhڷ.unw`:-J$_OP,;o\.3O~d|UUt Ԋ =q3Ɏn5K_(5NQ; ׾°RNK(TnWE$*%Iɾ/2/[kr\NDC[]0V1x:o_GwE=g^xQXSҪ3i čJ 8)wg]~q;ÇGe|ҁNjo?`%9 jj_7>*kT8|x4v]lݞw/\>.|{ﰈh]\ pr@=׳X{lK{A CN%QWew@h ~@9!,9zLQ}On)ZT4 @9XJDSϾlw}Ę%)g~BN]  7]0WN>IHܗ˒ELO*K ;AD E9aآmo3өRA*7(|_@5ߺҋ˻̳J࠾{U3ߥcc|^]{MwM&2ޣt 8|SotZRǿN(MOl #=7s~)ڶSRE)yE{c?s>zl+"r奩wNZDJŢd瞦D˖'{NX,bQq̓<^K%W@嗤+o2 h-[әos9֧?uΙJkRJYR,J(gŜyJ? w~Io6 R K4A@3h['\ 8 u]P)'k) LhDks}]_rT.5'R}eJ)BQoƜ{ ;E)U*f(2G 9 (p1RwW){U_J))K_(ڢI߾;kS:D>tJWޜN["Z~< ؘs[!JIbs< xAr Ap-^_ߗ: k~LJuiL_QDפ]Τ'N~[}gK=}Ш7 uˁ6=_9{Z3@&wZ3Ɋn1=TUJSʜzҤswgmy-:$%Z!W?c|Z CǪm?_cXfEr iK s.Ϙ&yo曟ZroJ}֮3'48W̙Dk}|X=月NYt-UŐĶKQ@A,l|zi֬U $+"`%“n;o)Kܺ.2;~E[N>,<{ |||Tz|䆝4;-bD4O,?Sg-UWW)D*SSBj…P9` c@CԖO@HO큔nG8947]roԚu:9u % (p:ԤJ zܼ9{Jn EX]Hd1OG"*&u[R1O z{M*\zN nWdX=bz^+׼j5r@YԾ7:8 ?F}o'L2S}KC `@N"@OT0rj39n=Ok-_Jl<+tVZQH!T^ՍRfoRTK R`Qՠ]A$u~_&]aXַ_^}EƯh=3ؑ<'&cCj2 On^{>ݽX`7&sgJ Ƴ'Fw]7JOt=ga%NAZiz$Z&ˀ36%U;a$2L XNƊrsKA'ČRToF7uu=iUuRM1N0S١_iUs 4N ];?\Gf.hR:i}=ݪy WX^ƿjO*[HZ֤) iϭYMzYF3Lm@@|xAg>6X+xZ*DB~њꓲ֥/h-{6fSzFߙsR&c<'-E֬Zuf?gٲe֬^e^p!qD NOӴ]r pR(AKܶf!$~:РDmK(6^,t_(eMXpSvu'|o5X~h01@]{Z*1μml{"Rqy}w+{@Kސ ת#+*M Pp.9PR(%BQ,g*Wh" w.\A-.{o}_XRAS 4?@9dҀ&E5{4i#^ Pk87u\֢\⠔.b}f-łEK9~xޞlVt^4Gӹh)~cT~LtQ-'~t;ď~tЏ.ֽIź7.J>'G_ԇ?lN[z_)= J$NlȬSUWX)Uo}5UN Xrh<9'({-ٮz|.z+W5UKFmD$%G:z_>Ɋ*F*pr#ԓOm?qt5?O>|u`U#6鱔왫2 >9R˲=jiҖV 9gw<'326b=< diLXHgTd,^xi@=Ľ'㱗XA JDxhuz>5sg֓UuU-d3d&Y\c?]s45^OWua NWxd{oo\揶 "ו=`~bJ,oފ?n @8eEKn~97ܸ<|kٸĥgٲe֬^e^.@"@@@@@@X9ʡg*-L[U2]SHf>drEv "r[9S^QKiZ%.A"';"xYN !qezVOT#UStxq ej9"?rܚ:W*0<>y'#kX:˭ )ĿʂSU]m&T=? 7B+2{?=/_k^9,piwkRS A3_R#R{nXJ+ )?Jի1CʬM yiU ,ʼ7,@CMR,MxJuk,9@'Fu7|4B,۔thWo܆@hO槹W*5VI# yc?s3;+jι@N}܁ YSyj2u%7>Bp[]Y\V0Jk6O=Vu-mO>|u`ZsXJ[g %՗m2 ޘ隱?>]Btqgtf_HsV*3dV$Qz@@Rrkun!x8[my OMVrq Lz'>~kȴFXA JځVS0wwk=nZ%_WLVx9@Hf;:5G#hZCՏ|\\H;U^⑅?}$BVr?*~x^WO+dOoy+*.ԖM-ۺapG֮ee—Yzyo99999999qZ944%ճx\j:L7L燽F}?ij*6N,5zVi^q&.i6A~=Vۯir*&e ?.y\OL/\51g.0lW_ TN/-|+z^c_S$V&;g! njOJȞ ZuspaDqćeRfXV:Vj̟er9U m:__=~XޚZwΪg뙔`B>)/|49rU^m^Cda|@ֹ{^Z>i!! j{P|Ɣ!׿h%>jQ59%&І} C j+zߋJr:qN:;R @\`[H^ѠO1q]E%p_GtݿdoNMksW[40+V#FH9,dw\d7/! 7|6x@ʘoީJk}cy uͷLy@^Qg0}+R@%j˦msnqy#kײq -Sx@i;/û鍯SϲeˬYʼu7 r]Ɓ\\0fIA̔ԚN;p7v`CH.9VVwq65Za  9%:yL\/9i s0$LRI⊨mx>Ds{Wҷy+Ln2oM),#ASbْo&5Tۿw8k-_pSTzV},p1!WUu "#FViG (a9  HdnPgj/ uL^ux65k9MROVZ94Tq-_uS4n'7/6}AZJ;Wu_xQObVhv| >7BxKŝu6o;w@SLuu[yǛXTm l5jcTF}ڶq۠?GS}zx KiKoXYcE+_ ߀1~@6`S[,^g"lZb<%ڲi%}[7?ln\@ڵ4ϝp1;ہc?=˖ /f*׭088u8\\@tO@Ԧ :"ؒԟBq]r B~[oJkm.zEU{K}Nf}g?kZ!L1eQL/Mo-6.ZҷuϹ ]K ;c/gٲe֬^e^ӼaӳlYez{;*IQH!WW&tw0_ҟWy;rzJx])ۊR*dw\94HmT؋m- )D+bh $Zӿ_O[xr~Y#u(ĽLx 6>/!p,sFr(ǂXvGw>pOw)Ͱ xO7)!Q/-*:w:JO7/v4Z UU5Itx@jK@PSAՆ3üc񢭫E ˩2@@QRhhtWo~m _B$k|! :WdՁ@_`_]i8%穞v+pO )!BBך+T/ p]@g(y /_ SX1@k$?Hqh*/M  @9t/ܖ.Krr@4u7Dv*99@/0۪߲ic,~Йǁ)9tϞ{/ҿh!@@ĦQ<N K_qw2T1=@ܟcH}!]3MSOrZY=0 ,EO%,hQבP"qĞ^\S:@KhhƇr@ge>Rn/H!/@sdъ6yɇPg70f*-eEKjO/?v-xi[ݰbo۹]H(YtYl`` |5WZO[\)/q>hYT`~!2@KHl*I u$Y~":ҥK8С<D r r r r r r Bɰq \.W1 XM>::pСsyEaC%&۷/p!oZp߾}{L~|9t|̴iImo۶mz__ ==x ۶Ddݻk).%tw?]wٳAhm۶AMo:>>%59`AktZo۶.,wx~ǎ̮]]Ǐbw3Ϙ16o^fiӶBd.FE6l\ /+ # .;r'D;5vQIL=NWWUWWud>uէݓӓ{'Is.* $Iv7_S"@c;ԝwm:1LI$`g&`:B`goGsGZysG^gQb!ĞE YYTɤI6_YtpK<.RYYCyV?y5_;gyJ TYzYuY4>N` {)zI<7 g~!I]>$/}sċ^w_oO߿$I^~z/Çxӟn_X$J6w$ 8gAHT扈[xdm <ݽ4C,Id,E*_r|goi"u[{[{ޓ_>- My$7?yޟ$cT$/$I*I_?ps}r G_x6ʻ>l_?},I_~"I_&IO*f>һ?'$y}8I~?_u;_$?@`REf>֝*&|"R$Qpp\E>=n@Wy" U]O>pf3/z{3#4_|ί]xϤs^~d#4_'eocc_]W?YY WOw=^uG^uG~e3ǿ(@:a !p8܅7_a ~n'G:<3A Zg?P{YuV㍷l~!prfڛ#uҥ6@$IE%l/WHq <I/w\).HH R" R"HH" R" RHH R" R"HH R"0;課MׯmTHS sw;}X @aG A%>f3г+HBOtX @D @6͐?sP R^MnYJGܞizK'>F`>GHѱӓ{ٿ̬"S*͝M,o|vYtp%C!ujo=t:'Ur# Yr+FvK.RXDZbbI"=, 4Diept1N6n:*&tjNٮ.Ώc鳈"%S؊HѶbٵjQ.udRk m\!bٵjQbSEDf42 R ãҕܝMr&²if6~H#Rz3MF)n0P|_? i`|tAd;3:Ѭo`IAdu7BGE Kљldsiewj!ffc.YT6rH=?΍ QlewZs5f6cþol0Rпɹ WIGW~tRf~6g7_%F >t-m(J''R y37>eX)he:*D ?xKHl c)/DОo)6l6S=;rY!φL@'D @D19fV4ᙹduZ~&|>_Ç+"j5'+N0-NO,:J{)r%5w6BmK~-IG!p|d*ZwA*48.R\;M | -.8tw[HkJ jV Anӹ; (]tGKd~6GvEs͡F\BCqT&ae[]gG)̈XvRNx$e[;ٱuCaxh]2L&tN:Q;KYk̩k`̅GT;Zg"=(r:$sDSh_D [)rnfD0s>V}? c))Z)& 'D$q~wO3YE69,N-_oL3L҉|>"okk6bؑt4"k LDm쓨TQ>"a_@GDiBr͎ӓCC%#{vN騈hs$Mp&z)(:̚).YK{g Rl~CC"N/)ƤU]biL@aG 7_S47N"m`D @D O| ՅLS@`lˊZ{aQ4ٴV̦s Jd՞PE:,s6OD"QU"bs윁\åXU  {/)V/:z_VZwrL:(>Nnv TؐsJQmJ8e5ؑP_ꟸf\s#P뗵 %;V4*eJ Vq 7{mPpAQ]u9Qb=ߎ%玈 0ߖWɽ?ە#K6U$;Lg'N؊>_Ze;^s}5_MUmY`c|W}0a@7F)n eӹP07QA*.2i2,6΃ATfۅZe1) э];BIM5#~7f#źEZ&H}TgIUci!:#|Y] yQMv1"Ŷ6U0#Rl{_!JE-tpp~ ~vR]j gGXԳCnlVK Rfgs<{Vˆ6_ H" RCCrxtU!ltZa_D b6) +|^,8 Bꗚeۜ8h܅uo~v~b$Ng)^&/qLm7smS|qD Kߝi!R4dc$Rd2ib-b$}Aƛ)ŗYv^bLQ5gr5v n[ħb0ls&[8wvzRnX/btqN$ٜ<+*񶈃dcwvvz)iagsvt'/zxTA.;԰bզF^c\fih/0_᳋\.\O=_t~@ot:[7VNYpw&xE/S^/&-< ?ODޒkO F6E'FX78=|O%K&bkÉZ9rsr+Vmguu}gxra uA:-sWw11O˞1[İJͦ=78*Ջ[u9yno/Ŗ ~7Ʋu}f #r`t8] z)iP\%OW3pP 򉏁7+}X׻U,<-6+&"yߛ\zowLj鹗bFKQ?2؜/yP\w>vXgw9+⦪,d -1$7; -^C;um?17~XJr-Ys%WQgVs,]xS*+u!.<(V1VmjԕPΩ,ɵFWMW)2ikvHY'iRćHfm@'&Rz)ئ^G6a]<)"пã k"}oֲeU@6S{_f7$oWtvD `XmHqT\ VY =tzX)%Hʂ b%H0~))D @D `^ j/ӰRO"+4 "s||6 1c))$I&d2i RݽC'|> $K[kL"ͺ+NOJdfkNW-mRy0߰k!|X>r GV{, W- vE\>̦ÙſVɭ^ewNy"x6a.)]=pdNxwRREnx_LƲ[_.hz%Hޭ:,Gf lQU^3Е ,mWl>u2X4*XiCC(_2.SS!͚KF6Dr.ۯ(glK(m NW-읤ld Wog% UHHE@MW.߸~M9 Rt:U8c))@D @6PK@hw/H߽X @D @))@D @D ))D @D @))@D @)ns.*K.\@mӦP*!/;=?ׯ3GWm:(ԮJrHH0Hq~woD;:զ NO~⳧Nk~z_-Z6{oPKg{Y5ip m*0W+،j#}Wvsrv"piY$>ΖKNcܾ)VrV^H5;$7oyH;9l5jWԖS;C(027Uy7"HP0JfIuS՜Wb]؞`QZEԯ7 mfYvXF6pu]d@o~%*~Zlhd$ܔ.S[t:O*Vq;sJ.zN3 ?wI4nervzr~~x PilAmQUI6~>t- RS&%{R@k|kq][Rk_^\[φ"0 }8<$EV.]$7R"6I!Rc)HH R" R"HH" R" RHH R" R"HH R"V>t-Id_mL(YPIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdCalendar1.png0100644 0000000 0000000 00000011303 12564151525 023435 0ustar000000000 0000000 PNG  IHDReyIDATx]g+WihzUINRQ)oUDCnɽn:(]pn!Q)N8shIhI-ËIs3{~>ٹw3sn8xE Ja[3@+ V|q큿 ! BA‹ }7G~gz3C.Ϊ29֬8lu+빱o)z{B ʅͱackt0uQǣ `(5GNP%??~dm!wz;wvo̷n)|!ŗz_vkB-ޑs]ޫ//>ھkOâjݗPe^?ew>WWC_r`skڳ}מ,1S3_:pѕ7C{X]uSsGyK~-p'~̑2\׾@O!{>{~/>JcғwWk"߾#!<r>QSV?}Z__!oo !\cO}0:Jk|/?Bxg߻Kv|Ɏ[Bo}4WC!=s$ݷ}`m!WKkίO?XL^w;:i^6!ھx{֎/|um!'#W#)G?hwSotghzzw/ V?}HxCF ~#ċhѵ_:"L%/, 珆.qs?hdĬew~b^ww'!}ެ#;OCY?'iV~vHyKa~xf#.=k):TZ:>{>{}nAm]nxz_2U= 7cH7?guk7.m?{H>҅zO?)[{W^]]~=y˯{M=xwOHU'=Ć?G>[V{BT͔S ;?טHf4&1<|EDZ]]~ʙ5&SN`~5F3҈SԖDQ>ulJ} P+޸w Б@P(`0J#Lm)&5z"{I`ekJӶg)O!RWG).m#>˖HCG/nU`uZj(z}}#E)2j(2I Я|#3/UsfM) ӳ 2X4W Έ7R*0)`SdO!eGϤ֤vW S(+-@{)T{8))#6- ,&flJxE-EmL#IתOGQ N(@P @d! KrPADw4@ӻ0kS7y.FLSQa硺{)lySʡ1t۪vl{΃ ;ϟ=c[MsO\]]u БeK/ @Å)zӶS qˁ-@.U?6lզfwE\miHY}Y%2|F( _\[:J{fi5|FQ盲6 [m;i_ DՎQN1?KsielEzm9")SwڂCڹh;)K;"%bEhh#?Gvn$K-hu%T~#Khni~$3(ms{# wmk V_M5Ѷ呡; vk3]`3큆*u1ηC;W瀡k[[%4æ& Q@eONjы1dxN&}%,.XЩ=DEgo*"{=VMl$b􇶯uFܪ-ڶjZi5h, ݆#~tJ)īD/ι-s4z24&0ʔL)@`@P:S7"MLseFi5 IOhJ8f դ оK7ˠ1`n"ҚC.tnFn tS21fA=a @-1P @(@P @J_[c:~d}`>;ѹZ/F:$=ӛ,k7 t 陽&) M,g&koa\ WrqR)Z펤gqx 5M9hT[fʷu) S;݁x^>)d{Pݛs/.J*=*c憖sl) @=~tnŗ[yOƫˢ>Zm&`eԿ 4 V(S0ܤ:Q }5& @(@P n8xw隆]] y䔛ͧr>~qn:3oӳ 4+'#>E]S\<7i T:O,}wmS9贗yz`uYT/lmMSYM,*Phkytn]ֳgs4;4*PhWTE+y4'&Dn}}=+B|wMH)y2@T<=KO,~wTΔR4mm3qhէr>òxlZ &(5P @(~3`=Hl]sq"˼{舉CNyw-(33SMy$:(VlؿZ?/4j,NW3%ѲRZVvMY]j4dT \YY)c>dVfA&ZsYbV3Vd#FR_ҳzh,b]2 &fmv=3ٔzX\C!]q8e|E{n}>ۋ&vB(aQuHRf-O2?qE{n?WVC[r`3wڻc,1S3_:pޥG[ׅ_ś=|WC~p'O?OUCws_w~ݻCԝ?BGco__|e@TȝvyYԉsk}->p>C{>jOghv$ŷ}4pC8B翖 7\p \~cg'|/pO?Bx߿+EUo+WB{~5\{.=!ykaw?t羲sC!\Çs}āGBO~ޅ?ws#SF>h-?qikvϤētyZt7?sIh  !\p !~Ñ g$M.sOWo/F߽+{x;BYOҬ!ƍ!7a3ShՇ>uGß#3{Ϭ Y-wor쭗3wog-Gze7#?|]7P~ӧ,7G:^޽S}ؾ#z|}5wMmwoZ<#UW;c~~7> L9Y?}&&a" }imm-Sa" ,L$@%sXRէ+a"h>yF+޸w Б@P(h='f[a_|/%Yh4ʲJӶv`)Ɖ!.NR,mE|Ym˖Rk@K(;yQ̡iVcg8+!6ȂEj.‚@SY[L*Χ Z3@S4%sHa64® r ?/Jz@{)TƬ89/mʄMﰠ,)|mb̦ \RԦ/4tX9@ @(t/De !w-P6i0;i|#W)7RBkG ѧy֖C@oj ?z>@(@ @( @ صϴ&,bzl |hXbndǮgOY?=Oǧ* 梔y`eyN2jeaiU-nux)D kC ~4vHU?H\h !)u_)#7?vߖT|SWQd6]e: mڳ[=eT';ab[)maJJ>vHVϵi){`|ڏ{ocdxaRxI۫{eyiK\Vd 5}oi_J\Vh4:i;ڒV;₩CDTW9޶vzJ1$[JMN;sms,_V0=[ùgIbCKa6q&~tj:S䔥|_4I9K7ZMveU/DT'qjU/uS[V\96$`i[ S{KKҘmK4:~z=g}— $')'@GROU@P @`XO9? 2g?9@@YZ}lgzO*\[[+ Hv+g:W=tgMO.l"=3SNWVVBmiz c(Ru]Sqޚ_LmW={͛vǻŷ5OΚd }x`,RĬE.sAल;oew">?K:_jϝ"mV;ʵԩ+T,^9RnJ9EzdUSх9mйU[mD@P(S_~;Ɋ<\.j@ǎ>j 1?Eq @l4 P-P]Z[{N>mns6ѴHMYxq[ H.UtVCʹKx5hcc:eVTj!YlheS׵M#aطxcu1}j3%5MK)-66*VZ>A\yq`dJ\iixqu"4M_\>kڬ%ζ._T/T:tޔRT&9H붻QeyFbӪ*kIj4mcB5.˖Д!}jil]%B7TMsbOB'?iFA? RrYsl1`ڲi*Ҥ& О=/TJNf{EX6fzT@^1Ϙ%ƭi ϤMgn~fxtvv곏-ISGvWFB5P}Q}4NRq׌zgڷc7vmv[fly"+_LO M\}Jgu-+@a'ULlXy >? [*=\P; Y]]U @Bk@P @tɱ㬮qkkkO}@ѩS>,>ɴ5 @9{jhvG'"ʖgnAh^aIm7ѥ,t @ھF)XS4)(PIz,B4+'6Ul2gzFfUThM?fά޾s?.'Nk{R?8>ִ@'I!_{JnBH@P @P(@ @(P @(@P @(@P @P(@ @(P @(@P @(@P @P(@ @( @(@P @(@P @@P(@ @(`l+9~8x`}>Qs @P @@P xT3}瞅Y@ǎ><][S>]3]UZWWWWWTTmnFtˁB{@H.̥\w_z^!B/B^G&/~wFFɓ)zۧN~cf_n=-xDI2ޙQ&Xԛc+Xe;C&h^W-umK/@&Z̎/_{q+++~xG'Oׅ!sߋ߹˟֝~N!ʿon>B5c&g !\t7YWM-,.X|dΧ7N?vҽ~+Nlsnscaqyaqy1⏁KB[[C{X\}`&#߿dZO !#__d裗/_׿H2O !>~/>j'W#c"߾'m Y*(ϜCB}38tThx&dcx?Bd% B߷K~;Bo}"y9x5C?}HྻBf׮{'x4_?un7>|^![ pwԞ/|u]!ͧ9ľG?h{[2oB34>=èg/ ^+ ?9s˗ycÓjtZ܈=tvݗ9 I_~q¥{n矨xH˗}1̟l~{W>B/Sqiww? 'o;B39ShG>sh0>>0v`L{~㖷_=+~ɔ{o'3wopg{_ǓH}>{$݅/;t^#.G>}(E>qkH\qCW+O*=߾7݅G[6:S~8;Ψ=mfLwnsc~.&e\LD:}ڋi}}}𧜃 SN`vf$ ̨1 @Ҩ\L`3'T4lh[='@{]x(@ @zq.)?ˁاnmKƙ@kTԯ@+R 5]&i[82eTϡ.ο$ubiӭ 4\c Eommerd]DFaU̡lVCg8+!ymWQ" ]5IhLIKIeyB)UnhLTe?n=[D^5#]tz.UsէS ɏLY8Mzsic^X5hh;]&fLg6fduU<7H?8bЅP @(thqR @w7~It*@ 3=2I̥ʞ KsfUqJb#3MwN*/ZT ݯ@#{eYstKO—,Fą9ץ0)\L0]z\eo:ûh(O0w?k*|mtdO$骻eE7(.gWx4I f.9Rđ_*faKZ~+Gtf|QlHʬ81]ʾp5k/Щ.< P @(@P ~Hםj '\Z'(@ @( @(;eaqy^ ٴhf+%U;tFs7' 67mnؽU#h.O\+vWe0YÙղVg3~l3ɿQ̺ ,=e(\PVC'Ų_>.rF3YlV6f+kUTm5:FE\VLWes˼N,Rą5t]ʆ cHb.Ol|"}o['Tg^ye17t,-dZWo5:" J',{IM*(N+p)!s2ʎLS`^Rca"[f" Xu2[Ld&U*^3zOH:nZƞVU\):. 4KT>iR_c]b&P{{Uj"3zM*TlYa'["W6ffGKz67.?{ڗɘǃv@38yj}}}NC$ Ѕ...hLr `6t'[[q@H2@#0-8Tqydi0 pef+Bc.ЦW @^T.tU~ڐ݉TP6(cJ m8r1 .&O9j@P h'OifAoh[k*PvښFÚP @i^KpVa,|lmmi+~ř+WD5ipR>pmtf0툻f:=3Oءc2\ @[ +w#pt#Rؽkn6i`&/SI{# as.ea=NiaiԲrpa@;@Å#&:DBRWn"@ajf8~p (u= T߻o{s%֮=q]x @1vۉ+C?YokvwFug. ~>ct.saqy_ ޏPOա X`F+U@Тq.&@3zns#=&C/0Z1òR.< AR#  @ti,zJ+++(uK;4c@P SwI~ hkk˹^Lh~MgB|mm)'n\TM~6Yڲ.|q$#9p0[agᲥpOO7zh3SԪذ373󎅉\;CI8Y12L.=au³".w` NL *lĄ`:.I1S;޹͍K~*^'NZ__M ;]pakԡiq9; @(@P N~HJ1wh eh[U߉:7-Vq&hj[ܭ pޥVWW[:hnp3w~'n̦#n}[&xaкO}&4gn46O*2ӳli3׮}ge83Ofص}VvyZxEt&Ù1ghK?s-m5sf>]T2E] ̸A?*Б.GXft$@3lh~|ٳӲdhwЬ:\܄\P@ 4^[.$@fi%>L8~p. ƌ(u= @P(@ @( @(@P @(@P @@P(@ @( @(@P @(@P @@P(@ @( @(P @(@P @@P @ @6~p)-P7h:Ο=]'(@ @(4S1w3벲ҽ t|++@in\{!L}tl P0@5P @5XHttnsK,r2Oi P!JjQ[ P^Ŕ.eN?UXMV"@a}b€)T6B[5N5ԟeFf~t*]8Ѵ{ךh"Vf &X$gֆ>û&mgy {h0|ÀI_vk]t9TCn0K:-js0BaAv+>nRs(-G!$ёC2z u&"_4l} K0[?fdz&|JD#ϔ꧇j}[Ddgۧ{7̸}`X\ZM|wn2:3F\x#zZD~kmfvO{|%=TV޷hz i%y8|V,'V<2|'f-ylc"PU=>a"rKCE۲uNȶW"2 3n "g>4j_~n֗kE]~4m`;3n[Q!'"|RD*kDu""/-l`47L6K-AN5 tsk646ej=ڼ{.80K7,eu⧃Wtm8OeK5 lrɹʹ9k6 g5MA#t`6󳷰 dɼ%֎6[s"r R$۬!q2 kG_5+1.\=\~.Ԉ<*"mvWL\~͸d\]rFfpmꪧE}[quə$Dp5F='"owDdW7w=g~E%G~ᷞ%ͻ5^:㳷^?qu ۵45j>6ZKSr췂5n[r$s(RQ[*gcߵ)גcCnHQAOw6Į&щ7@*@7@>m@R7 /Q?6eutX Z)\O(q{b~3ro[CHx僽eSo,,)ODdT=W5KrĉO9o͋+[;{Vowh__ב[_gm7gݴ~TTYJEKt[EmԌ輧2#|XM)GWSW,?wnJiJiJ}z{tMj\[7Z>iO ;Jҝ LZ>nLh㢥XONW4m>MD4?[ {kEEE"_)9vP4WX4i+ FF45YxSQ\F>AilL>wi?'+KgȟM߽pa{{[KztOv7|W|n(Cmc}Yjt;ԐAɶa/Zik1Ʊ v\6;0aj DD)X~c5_Ey}RZ|iiqmC mYrgC7 ;YaFwLRa՝GtS:MH*m!| f9L*%{R^ts%#}Ft%v>c-pQ>6E}O7mס]n*x(V>Ι²'.X6:]΁VmD'`9~OЉ7oP{N87c򯧈7iz {8N- {0N}6dе"Z!oBk(MwxF-*VG"dסww}?wwJJF)?obdhstz}jJ_>uU %D7W \1]^4stj0-6^7r\7-E9WTnv&tF(G?r_uM׍k#5]}7_]WD׍?٩JyEť '(ͿXMΊXf(Iq#qtt\flx-C( { 7^,q,Z"f׽cJ^}6DMDDSJDyOw=]W mwsTwwOAAA֑u~uÔLy:etn Yr[FF\ 'hZ$rΧؤ?B,C:jKp'.τܿUyEԌ<;qQeQJm_)3T!kk*H ;to® }d3/e2!6Iƌ}6O;:vMk^%J5PexW*(,2.6y>mX*Q)7$sF#.x$߯\?i,ힹS EO߹֡A0''YI 7\9iZ7[MYK'?8~L?]Y=sL7%hi1WS}&"jl/S+Q"Z{CQJz-5*EtvA8$g mz^iӊˇJR7^\ss'gM^-*&}I#"S(Ϳ~^}ڢ7fz@f@XRڪgEޢm70lgDOj(ntH^&"|xY*-RU9e}y65O/qO^4J,%4?\3Ws?q3VLW,]7QGؾR;\v7-Hx⿸[Ω5Gm4z/0NKm7;n93”ʶ,â3'eSxZ} 3piJ;}qƗB|.1]k9VHAA7'7z,-7,N_~c3˽]j픈(z_\=ݻ ̝xF6lA&'DsKe7?²yE5 5%Ju+=MZ0wZaa!GR٦{ i}2lJwLNtFOǥܞL Fnd\3k?{{<+r 찍p9[Uȳfvvjě.y6CpF,xV Zuݶ @%$3Z67:@Ōḛ 2U[PCVt:M񑽿ֽnk? RQmm-LC!;v ;Lmm-[f^&--ׇz*X~66ťqұ*-C7D֙yKu~z|12Yoznl#yjf(eak2l8jg j6&uDQbUu6\΃.=Z |! [M e0 Dno*-.ZM^:b9'P,=#&u.9L?# [@e;yۡw؝KmjO~`; vSdRWN&oWu`zxP=;Pr|˸$s R-{3,a|]钺ƹsQk-M"% hm^v._4 i-M*S;vT&-.Θ%q^XxCόݽ2p;vadN= @@@1oKKE;nB+VN(P YmIFȶFku[yUA˻P ހMtٶ>M7 [: NT-R,҂H|1aAc t\7 ^IΖp-Mn2o@zCtܹ;/QtC$xx`DR? xC!oAxCj^\Z x 'OD6nHC2fZa$2XIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdCalendar5.png0100644 0000000 0000000 00000006576 12564151525 023461 0ustar000000000 0000000 PNG  IHDRey EIDATxswu9mQIIt<33uRB /1*-PXm`ۻKzmvv7]g6ݾE142X755;gNsDrCЙE;7qD4F4Fũ'L~c&@ss4fϕ;P*ܞe-.Ya?gO-yLYr.淠b3^M,?b՞6a-藟~̲Z2sEbkr}7OM!g6m@_ןJ˘ZHq+<, /N/"]M:+{ :űy|k#[<{tʒۖ#[=>̯6gOHE_̡_s;{B)67NL%/a"Q>0ѣ[9Ix+'p5{fM ,P]A@Ja"s1}7 7跀ղtH@@@@@PFrq,>{)5M@%hEUF(5m\SqqqnT?VVgZ.=@9E?>בo("U٪Z寄tGxMjk$oAldr=]^PsT h 6KF5YaOx׀9Sr=@k՗SJ)NY:Ovk~k,l;xSb93:p_ͥV)ZSx@@@@@@2|3x&RrvKе4)͚}clbnInV5r~9/vnJnfk?,]٣Woyq@e&?U/~}QIRb兝.V|>z͞QqY$KڒvPxSFrY=gcvVT?zcݞ·f^rKZ.gztu ((  Уf~ӆ@o}ݲ>G {9( @@@<7<:u\Db`k5ՆFO3ӥsN(}_\(?555U.fez.(3\zUqMKӞxCSJTzl_ӛ+w:˩\91i4҉u.6[;ܔNU ,§CΡBu~ mt.%n&dY}=OMj;C$"h,^{}츲Z2]&]3>99Ptd\YԞ{tUevJv>:SrK {+o07WYGGo@> c2[ΖffJR)NٙٹJe.ͣMBxa'^u!0df\bY6mٰiK"ErG +RT*\T\d>%&zQ>־햨׾R~c~c.K?Rrh 001op07*sJ\F FX&_=p{1/ÄPc"#av|5/sW=uj䩙'gO9q2LOV49ȧ/ǚ~ 7p 7EW]|?}4~c hrƒ3ssJ)RRtSiX=踚mJ Fμ!¶;ҏ<>,jq8Lbq⸓ƣR gб3\* F=}ޓE^ ?x?>iǚ,[?~cMVՃ7W)Dc/;$OYo}zڷJ!ڭ|,3qI h6"H_K+/otqidѡJ#c|wT/Ke{JT=u.L\:||K>{dͦYW2>inI\IZ}G0MV44.؉Af˷_g.ٸ6FO<}J(֕VU? Cs>OW~W=ąo853+;VU4 #,S7*[Žb.+##+tZq%@˽ # [?yd۵[prrߛ۷o\'''3$4"0 bQ(`~DM[g}tԂ:m 3VfnSkB?KŁ}{6lr`ߞvj::ۻzt複ծ'θzSթɿsO,g jKʲ5H n_y|^ jͺd3}`DaΐRA. Zof۹hC7ʼ~k|@h)iS_?_\ê`aG7d>*m:JZU=~։:̨֬;zrfw>JYqvܵڭS/]ݰ΅p;v*:RXW~ 쒺kKta.c@&O^ݯ^uXC@Q(Ei#GkzЧQBXqB ~*h{]w(z+~.SALMM%sG_ ;`s11@G*˥RT*Y&=ddNzmtڋ/tk'NT* 0 >򩣏|*~R6lғҊ޹71͆޹ܔ-/逸~/=rtfffnn @o|i]8~[^qæ-_-Z7R_|8 }tߎ,d3t$ /x:/Q`Ava52Qwqsӑ'ד?ZyTj,z/YK.؂W?~ĉs0! 4]).It!ժt$Kr&U%:w3@]iܜ ݻ-GY;]֢ľo"Q0958m>h0Ɂ,aZ%:0X@>o0qCa9VڮwC#?j o~[7Yo|zKל7yEY<%M4?3>@hpaa6kWeb_v"Nyi욺#k_ec?{j+v{+Ԣ/4RD7Eؖފ7XLJO*}ObU|w+::$!_./}9q˿|WV^e@=×_KUcOΏBY1fEih׾+^?DJYqsuk>j?!к;wMMM]k:߰vYcs }_u5_{O|o?έ?4aa^/=U0T##\Jx8z|\B8ס#`deukWKC;{ڇ~.ۺu9BC[2[n,A_^vٰɰh$0<ffCxÙO~{_?  kuclvV uk/w^~B'OxwTI@ԅnB5X jhrptؚQ*bE8c4éJ9㑻& ~ fe򕿻+J5ZxON?\zⵣaf0: a,cG_wRQkUo^.wϾqxleǟxF0>:XQj=>x}ןg.߼JU7Ӄ-=y<+^F 3|Ց0<Fa,ВCϼ3J{w\g֞uV߽~򛜜k&KOVN<9s|f^&s̋||?ϼ}ksJa׉K^"2q̜Wfn?羇aۿ_xl8U !s=u四B.x>t Á7nn>N|f^T*'N(ˋ-0~䩑hG"9TZԅ-az/_ 56ϻłuGᙯ޳ξ/=S+>ڳ>.g@7゙K׌,Zȑ#ffB'N|W^]xq xxזh8Ε>w2QXRÀkp9WܣOܭٞxEۮV}]}0ǽ266622Bz{\R&0ޅiֺO݋a (œok2e+ ??$h}ajCQby(\sM>7\yտzrg'z3]~ӟwn-Zs?h|7g_K8:W4gJTO-sC2, {g>~FG3Gצ8>6/|ao87ڠ tMwjCk2sE.XL\ͼVH Gn>rUWZ +W{O/g2MQHW/g7&ch>t=-m}o4E!_1l2\enaAa7bJ"qO!RZ5À: jBGѹ.{ƵguoXѶ\ f!0>% ZM E" Ga jԺD-#5Q=y ( gk3+ ؉'oKsH|:6tH&.S3dXVgC+2V2Fr.őxBAtXΤGjѸZĢ(lccOz2 םu<~Գ>GFF]+P)9Z[ue\O`==Iy h)bGt}{L'FeBz_l6ꉉuMLL ewy_o!ԝw&׮( ]ܑFI9=?>ݻw;o~[SsaA^$χz_Wb`5.>$\wRp}/k.(=O31+N%r-3v1Z?dH^ų 7f [toAz@ o2/pNƒ~&kigIWMdb@Kh: B$-aJ'eaƼ6Sh{EZQٜS?>󰒜ķғ9PJ992FcWNJ@UHI2NuCkN ]w3s|)>P" ?Y7ӿ׆nf :qU֯Hc˲<7+̡"ngₗ{zA5Q^dsBp"ZisG?&[Y.:'}R@=Hhm<mIgk*K3?s{#@}]>}n7Emlƪ;ʚ{{bi,g;Ig1৺bsWcUzi1'4ڻ*"S)ir ݛ.㥙AĪuO昺T9DY9g H|]%Z+ pWf_+Hi{8`=, hK)v) nПz'^|HΫn>У\'in^Ŏ,__5קq1 X{ŋ-^xhhT*kwy>9KY5% k͝7Mw+N<*irNyMZWWnabbbݺuCCCm_o 'v0 1M\y"4k)(3`9QmM[oIvM?ZJO0?#}9,2?(~˻&i';BH%6%v= 8̃<ὂCw&@B/\E69'Qt#D!4Ŧ3_{;6M c$mnm4o)W. '''-. ([BD!<4ĉhQ'p(ۜ9(':0HQY.Pw+(w[[ZM( t/&"2&&x`ߞxDF_wb@6,]iK\|p~w@֗?.XYEe&E,hE?^ѤQ@C;nS8ԣ=2\=鉇[{(ݰ>*Ȓr%`f~NLoP~7qO XHE#}Vu(lO1yrKF䤥C{-(.y qЇQ(d}SuK.O! ߖ N4̷D!^9Da_۰iK{z_u,- ^w㳨>&=+?+̹yo9: Vdޟ?.tR_ZR遴D%,Z)>ZX&'v̙To: nF'gR =}ig(qg&F`6y Q$Y?u3.>QLTGH+=K* 3_I~;++ͬjWc1=e'nB`! vLVyzGQeb+L=6afid|3oBDaV+3(]b<2s:k{Et՚{s7/5Ws'^Q~dHөUo=~Lj{t! ' %*>F_Ru n(Olmu=ʩ|s"`~GaŷAٔX5 sL\30sN(N_4?\zŏ2I|+=7Շ]ϕ۳~nǿOe>oQк;۱s5\311nݺ! ˢ,I?J>.SX@L;j@2瞩)D!]wߵnD![z֫wկ~|gaɒ%/.˖MXtHT*J(d>)J###/^rҥK-Z$ iիw QdɒUVwyk֬4gdddlllٲe` y;/>ggf͚s=0cxxxxx؏Œ 6SNKm|#A^.-Z4:::66ô/ * NUW9od?ˣ4)Da}QQ%^jX<HWȺpkךQI_9(YHA ^UX[ov̙T4 Ӄg/DGjk.! ۙՁc+s:q-o_Ka.j2sJ/;=< з<Պg/w3+9$$8%o"@?(طgݎ ;vk&&&֭[711<0E}M2]_G莲E(@ BB9ٱsCնkZ0Q899iP:70Q(} BD!Q@Wpæ-a3@oIDAT \nش?Kť2?5́}{,./=(O0U1{Pr`ߞ(,XsԔ0Qx׮u0Qx{[yg}Gyg=ZT,>/ꫯ~'p mҥKGGGGFFJRT`Ea{cccW!LOOY^}nav:x≉etttcccCCC9 D.[[ǰ(gyuFʧccc֭k\FFFƖ-[ Zphhhtttxxxp^F |tC#RixxxxxH! DF(FFFFGY?>>މ(LXQS~)CCCr *"@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ Ba`+on9]UI {Ei)@`?b!qGEؽ{d~`1Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!"@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(@ BD!Q(`(طgkY ;wMMM) ':G&''۲w8q{۵[-\Ac1Q@pæ-x'T=_5/í|ط'M/ຏ厾 K:.[(>;]~TTxsKK >]k 8HO|@8Pn~r^L"M$]}S *]u翰/~n+z[۷oO(%̟ZR| #3_giM/tfbL/YgFpI/k6hhMJΨX)QT9g+`o[몺}Č꾑@`u9Z},Z3RY} <;x3nm|ٵ6e[o#I 4RȯySyJkMȔ[yיX ET/tүQ&uT/lz.B=;w70\ɷc箩)XɘY7nNM[sh2)0O| @!dl(]qvMGlIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdCarddav2.png0100644 0000000 0000000 00000006675 12564151555 023314 0ustar000000000 0000000 PNG  IHDR/ IDATx}pu2g֖ΠNQIBbE 8 ʃCTQQbG#:BH` ԢHU @͉A >LCidž/t{{wwOc~Ύv[8OD 9FD'O<}jHً"DDDD$:KO+=^ܽa˘eÖ,bݞkT63o{´evGi-3nGduGlϰa ׌5cwA$iZm@z~ҙu{-?yoyf64Elf~o=}o|k$FO}[%"/vo?M\v}4ՇC&qm/>>gS}8/7ȄÖSDl~ GAQ7縪.7~" VK'k_Ukg?5k"!KD̑]a~BD]ǿ~a]W.7sܭ"ʆ;Dև]m;*"T5N^ЬM4Mg/ç$WAQ\qoS "rQʋD?-"k.)|jGj9{^D.WX("?JUgJS%KEo>f̺b+F(LDD0,ف4<^Y0VD>}s|")SW8hlt@D_=hAWwyGZfLj(^D>U!"4UuS("wYf;q|^mBˬQ??-"Һ}[|_}Oߥgָ9/UD^mS_+PSo'j̚TkRnU_&"Mue"2uQE-d|dm}[bj3+RzRz[g2'--4_ZG8CfȰ;gw^iۺqfIf6N3ϼ]vlsDJ-K\yv}[zr._iG'}JZF]u+ˇy/R/x-KD:^_X4h\}FǯVi$۷Ѹ9/nvoR.) KDvN cf\q˶.CRcVS W?ЪŰ;e–Z!%亲~8US j#Х=^8к{_c.>KY6ͽf_ջڳW#e G8HZ)7#j"E!ED4W׺8eMZQm`.y{s3?+?z97[к~ kS厗.y}~ûLVStZ4sah/,>y_b[7M?Rs{K>i_pi!_q7? @zzy9 (~o @tW[5lS @lb - [@l {^~@pDQ?X,[Z4mmm@x%Qgi2b -[ڰOD% Ȭ#;ĖΎze[[Xf KjsE\fZ.k3 5,`00U[ KP{Z2}aYs_ e.wrLix%t4K 5˺,h ՙ6#4ti%B$#G`aGe!Ν;α}u Y3Ė5vC ߛPW-g]i&,vW H(w[Fb4M[Fyb+L\Fb -1*5aTja¨BQ b Ė"6m:{|yΛ52LP:PV'ió汸 Fz}.$"=Wy8H7svP]2$û!3Ĕ_vaa( vp/g|$usب/{C޷I\ȩ B[)EGvlRwt=o^n(!R aTj Fr}[- @lb - [@lb -[@l b @nI~潭qF  (%"Xu_-ikk{*uVAQIgG{:_ Kb+ЧM}@lLkuUT*LM9MΎvm]eGVJj%2\lYvB}6%J5G!b+NdH%C|$W[zK2M EPmyjwl1D3@Vtv'qkhֲF;/ܚӃR 潭X,j+&o 6.P%Rp b - [@lb q jsg9y_X5GZZZ^Ba},chB6˂Oqo [|i| - zۍv:` wHfV/GDϚ2T2< 5e0pob NK- I\)-&8LUjT[@>"5!:;d<8b aNۉGdwd|5 dOEdyYm "6o8L2;еYD4MD4O[!snmÚ7{xeCG9 eGFEK5tCba{+\MK\I ۊV>Z1iixe8qzmk6odk2BnKɺ-3+ȥ/C' v{ֹm lN/?7U"N?ٶmF~wk n[z>v3BND}mgvHE'Dd_Z٬iNn'9J''[L\B$9W;X-imMWܻ|af](g)3?k~7y*Zqg[ɺ-&'+n$ْ;Dr9EL'' o*Xi’M5m5UlX"f-Q8q]pE]mwqGE[7髟wW\ƟQ5ti ̸mnKKHJ#wPDN"E;Ϟ|{3?㢒z[OG| ꒆonxc[}/ȑן8:x05Yj>Zc} r5nsKhP2Q[*ߵָ)SCnHQ!Hw6į2щ7@*@7@>-@R7 /Y?6ewTZ!,[vuOY߿an֭ ].JF@[{gwZͺܳW>=6p[+rILmXe7lwWꗯ۳K7elnM돂:K)hn9c}*!?VK1o)ڿ\y54]_>ޯI{FKIm-EVx8PUpDe ~+`ٵ w|p2d:F{-{rrG_}Y/_4do.[]H__y\D6_nތUы:MQIX_G#1vf 7H'0m?lꔅ%? G Zd]Aq,O˗qGdod^n py3O'Fw!Cɖ(`Zii1Ʊ d?bĦ}-#:N5pVOlp;'#[`0RZFZhp'kfs$vƼF|vM;/u&{'O6]Dt5m"L//Nmul&C# /\{:y%[c^h%v=+|E>6S1m߱}z'hݞxG.z缦832hYk:MLs Uo0O҉'YOlbq՝7i| GN-x0NN+󟿧˥e- E7MJ&>Mecaɹ>'GWD5=)hY1E#vH=yE/*O䓫oQ?{=/l.L%adO 20I}ڢ7Mz`f@XR}7Z*y޼m70,gDߟ&ܸ10z՛ܾ`6O@&0OU7ݮe}Wvǝ:OI7 rƒ_=gq>q@ԭ]4+=]ΦuC,_D)t®7O_ prR s;47)(;9WXD3{ԆK3כ58iSDo7vY8~SωT|؄c.g=PqDUEg[jє] tw?SM-J\br2zoܹ@Z;P˧{^60T)QJu]\?r.x6,AO‰=o_?PE&j/h[ה(r8_7cٹ@~Ke!3\M  2RF 2~{1,xKEUUU{ 2 ud6>{ooq۞Xb`b~1R];ޢVSSæ, 767`,1c9{|23t ~o!#*\fU`|\ ֽ{׎@*=o 277777@sH~*g6./Ș%_XxxWSS{'e=v >{ xxx0fJ$\Zqtn ٝQv3o@b&4ۈ4xVg.t2n 9ϖ 5dynɗ3DzQ Hr'cK)md$ϰ1l:.XU~By\c gI:'gif7 =O:( C!pr@@0& )@!TVV7 @!޵\Z x -"4 h7n7abIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdDirectory1.png0100644 0000000 0000000 00000013131 12564151555 023674 0ustar000000000 0000000 PNG  IHDR IDATxmUsr|.tU>̐d&4Fς b  ͆0 DH0 B4 cV&@Lb\/*CWUWU?'빧[ukSkfHOh4Dd`] 54wj""58'7W'nv͋F4n_g>k5"7?cV-7μ&ŕKw{Ew/;d$7om*]&"|K A6a _ϟ{?M/vjuWD~ʍ YNdm۾ tA/mCW"EW~]oiy}zkEw/^}D俦6ȱ;=y^{X"."ID~k?^|[T" "gDθU`֩ϺMDY]D'ny5o6Ȟ "]f|Ed#D}?'"/u"2o>·}[+ܥos0NDj"ׯVOؽ"^Om")}_D~yE..@Dv~jʳخWOE+Kϻj&7(T{Pÿ=FC\3?+~E'_w Otޚj%֤ז\5gѲOɫ|C|p;u'.\ >Z–^vۯȅ?wFyϻjc_Dov8u1Ԧ&{uo;xW۸ w0:YV9GG[~^< pD1']P;S@]~+D^oه+lP-ZȂ \l6U_"p.dR? ȹ nU9)p2MlvГqzjRTÎC7FFIU9*w`ox4zmO4Yd Ti/*\HE _UaMPo*Ac#]4hLЪ}?B#-G@'71ŻkmGZG)dϢA[ ߜJAKj fZf-Ιƽ9iv:வ2RGYj|#YQ>lR9d{fcVfYW}pc_ |η էg^׋s م*Ko_ |@_ |/ tc8u~MJ"V_ E&6j /eR8@g·P.o8 @"9p(MNOMNOMzx {#ZXűVEC8I"Ta z8p\=yp9tA)T@T=Bx:Mdƴ5H"Vs@ۙoJ6L,H)~ANӘPKQփطV4_ A gvANCMEB $J@@w{0mE: |7j^  / #c8u. D ז 5MlԼ)_ |ȡ{nҕ1/|'nUgEp=@v/"(ljUFha;7VM`4^oDĂ4NBg Z[MYVh F Z5b%zƊ1AXԊNq4m;@V gik^msQ.|uh_Kjh\3.*h1߶av2f2:28RQJ4tQKߔI=ot:@@w' a@"Wz5/||q @O@ethhhZ-|E j\͡ !|lrP`-|@O|(7t͉izW)aٔbN.*N Ub֊R~!ܲ(uFd0$4R:tjR+R ];z޴ ^Z1?9.^vAc| ŧ7 BXű1h'XxoWE H2|gq䔣LǡثUԽbmF޼|衏E,Y< x>ƛYxcޑ/gEgvV$Vs+ocr-Xcvp֛٫_A+AiﻝlvTm&u#k4z>&m,ѣSW͌Nb%pv:X(2naU{j40,)^W∹r;:6mF R{ͲzᩏAc$š( kN]3;{HP=ܳ8&'Zon@٣/ql']2o-]Wc|`ijW$+ƀ}>Wce/-~;잝-6Aٛ\Rl% rpW3El$F7/Hw@ Hm6q"_ |G(ȥzN3_tV _tfS v/N.|{.-Pw#݌;5Eo垍Ndo qާѩݎ{}1k/ o!(zgvS! ]/xrW@TFb'=mՆDvÎFXqoq,Y ]&[ݚѢrXlOLC| Ƶګp/x*z)VŨ7 ogAC@ڙ8zbM6 |]&sL"jmt h/:_@Fh ҁ& M _dh۔E:ہ& 7E ;XbMSuOU䤰#+- ;j8T|6=5 /(|JOn(ǸL v^S _uRlV)q?4fk4ҟ ЕK|߭Xf75G8hc~/@ M|4t=}AS cԆIdOZ'YBnjǫ?xLZo)g)Έg&X)֭vtqN/r>&oj_JR# m1J9ejLכ+ʷ^xv,ڹZHf$.iyU y R_ |/_ /@-Jo4whhyol /@ |38@-_b{AO@ethh(M_fe(d{ζsG( 6_ |ЖA@Nq BQK÷*'Ԥ=4TL^4j%.=&2ʚ\.)w'@7~E9 ÚDů&ʖaiAM Ƴ/@kV?~"@:S56Ҹ4c<Pq/h;>i_,Yoq _ |/_ /_@vfH@@j ,(@QYk;TIENDB`davmail-6.3.0/src/site/resources/images/thunderbirdDirectory2.png0100644 0000000 0000000 00000042773 12564151555 023713 0ustar000000000 0000000 PNG  IHDRmQ IDATxw`})R[%ٖi[-o'^iIG4M&NiV}&MVn'jk穕D^(p$z sq^]~τB )doWr} !<93:!eiӿ#M :9&9ks?sՌaAG5$͜oi5Q͜GuF1.ϒ=y7AG%Ŗ˖[0;b-і;,\{/4bwF'/.UV}E[n}vGUxpl/%vzXQ~f+CpJ!DZ R?"w_ż*'o~}͂o!.$E{ ꋾzݵO;w>/ !w|7}?|?:6,*K0aS|ᒕC;^u."_jKOJw/-c?4iW&/Jw/* oQ&nN\FCzYGxt!D )s[/~&tՐ?3/gGWU_I]Ζv;{ /tCXe@:=WW̻U[ !ײߡ/^,_xƧ']ɋHmHx  7X`sj#?˨HZ*xPl ߺ0\*[?8P=B0>|sdFR3N$DVoj -ZcY+}܄JzfVuRRK9#uwF}q,wKX4K|s_=fK'2˭F-‹}FJ1^^8s*Y)*)U?VQJ<ܪtY`E\: D PFl#㰼S5FxiNL._|_QeYbжAQ7ݶ󧄔"KwE/Z.]~ٛ~ !|zς_|mGkb&S/jZni=EzkoJԅ :[k;Zzl.sӕz xG7+S9/)nk(+npyjC3} p=-7hHB,9wGԴ"leg}@ լK=4-wp-r=~_/to^yq{ۦ$,8?ݏUUW?z&S4]uDs(ꖱų?H)|kSK~_mJчo)K Uh]z(Li,œ={zۉS?ivhU05I֜7[mO;.lP7V܆tˊ.4znʔ)ܿBH!|^PT?k4Sώ]SpMSJ M #!Bd7J.Hj]x~^]}hҥoc@8(aݞ n9sV:k{Z'B*Jԭo̰ ,]ɓ'_jeK3S)ήv)eS&T$\Wq|vY zy.]iwDL#)Z4-lK-:}֭[*}>ܹ>>쯟yc{{^;۫j;;;t8'M={NmMEO'ܳw{.t/Tb{4 :e4&="•JFL4M9{xWt4O _~%3gxv%.c7nXu7|M`C1R|~v޵`{뭭-BhSf͜lr޶wfΘO~ǷӉ ,5R^RJ*!)R.+ p+Cl?Xx+j2zVO=|cX*\(0[J%oH-WF°Wyrݑ}[:W!qZgo_~ꫮmx28n#-;vΝ{Ge= Sgߑ뢱x{WC*|H4ڬiSG[B4O?s_L_m}_t)cBڪ5MWJυh Kfc r0EEXT*0 e:-3LC 7ۦM=r4P*CKU~Mֿ۩Wʲ^wŒFZOu{VJ RȺ?=E0“i)2.E4^"4͎uLJj~[nv=<'ܞp69ٳiӦE\.MӶl|*<+Od޼꺻NY $gDa&>O85-+zB']N˕0 !D߫Ux2LS d6-#&p9ݑhX)u55NڼiOϔfY%~Q[yuv TnM8MPfʈx̊GX؊D,fc&|Qf\QOXBh)Q6B(˲;u֚{g8wϦ}nWyjߏԏ}p&[SY)Aad9N7yZ'eT>UT fmߦ~3u$^e8}\?ygJY։s,iﻮ\9{?vwmMڵO^{u?& Ϝ=8ltq0W-W3&QWܵoB~yg{ꘪ*3"|y}7kj${Ʌf8@FR*\d6M3$ҝNiBӧ>rHwJYf*?»+\aE#*̰K#,ɍZ1/} ĉP8K'LpSOQW7?ᥗ]j)_{3YiU=V]eӖ#-;*׺Ϟ5GӵX4BpbVUU=;k-d%=iſ/EɪbTbޜYBR*YUp_qr=pLi5MK0ME".iCIKJS.J,ȰR!%4aVoV$Q)3TPY!N7;=5%b$3gܝORfě:=gm̸V̼D[v)MQB)){o_Ft}\ianق7&syN涔y%rЅj\?Ϩh\(N7.W>%3zYa* l}JX6O?G/YdZ3>y -!=ginosӲR[}YӴN0NR2 njM%fYJ QYQeM^x喠3/g$b0QdUm54LSn>᭷6I)g_&f7R}[zin}SISȸԢq!w[zy;0RS\JZEUé꒿6L4 4M#76@#CKJJqp$WxK!|3gJyak_6>"m`HO6%¥0wZ5ٍ*}gϝ0lu9w|/OupJ<h;V뱮w:Q{gv!bfBJy+vJrcw{ͳл#w9ord[nq-Pn6B1GO晀K,pʊx"6yrC`41=b+e +!Mхs*n|K=޻v vr<ϼ; Ü1sZ݃/1QJ0'~#BF~!5iH/v]*?*BOnhiBʚMC 뺦Id6$G,r>fwXtջ'kA.&֨)֒QrۄPJM t}‹aH!4))doh&w,ˈEś߮^Йqh5xJIp%D&6*yt?ӿrNJ^;bT)k>淂Gu5f><~D3M"^ػ8rJN?<,L&'eÇ#JU{]b|p?:W}ĉ#g❡O,رd˼%]//h̝;o=AT~k8UxNk):p9]j,ysԕP.+UUZ'+^pGzש:{(kzrtvvneK'M$ҟzUx ?Ui%3,UvR<ioOWUnVwN}27Di`uAz_f qC'&=B[umg͜}.å`]կC$imm\~rÎVsM)btyŊSg>kJr9#h$be,".÷njMMw7RN,9Օ55PaK7vYjΥKN64c'~[_HԔ_>f (v]WJ]rRMCL-OCT%б5վ cӃJwHx[ ɢ-y#\?Y )E_ + -kRYWᦑJNwZnY*hVxҝ_S_cg{5B /a++oﷴ-e&Ϡ`T0sISH4ݝ<%RDVڕRx݈==A6Ws/xzӛ%Z[SmmsϛT?آVuACd5~Ɔ;'vof^2=WVhzu=vp,s+x7T]uU6G_Ě}e{(bsfKѐ>^E!oXu_|T9T HW_yV<.a_薾.ԤX董oiJYMM/]V %Ru HáH*Sꕕӧϛm IDAT0DV̿B}24-!֐nZB){֯A *J)ݭxYll&M4NYUʪ½^ӥkPYYmu7:ˌbj \vW_4xdKYVSuSoƗ^|yڴ?>ڞUvi?O7,4ښ:,> n:rFt̎!T8Nw-⫮'sCڵ /~aow u/Iӥi"t+.]K/IM~_hjNn6xIűrϴ}mKz{d O:RYYykj?`)DccޣiҲ_[nŴQ/jCzrY3g6Fx_R*O|ᮿSG[8gyM=2TnWJ:~*T!g N|g\h)m Ϟmnoh6-3Zn^MRZSd$&v/~w,YzH,8eJݤuzjwџGϿD-ػoٳ3g~S&r-Ϳh]g[n!dMMmSӔ _TYYzOpuZ"d{SċҐ^*oTxGEEe2]MVBʦ&OENOeԳ&ٻ5?TwzRz{7,|='-77'~2x'Bɓ']MJjlCp8. .RK6JiXM$/Z'Km{CwSߊzɧy]-]w***Nm<5.tM}.< }n'7TVVuGa%,4l?|c{{Ku˖] ߿'.o?|7쮵>O+%{puĶ)S,_q޼fϱL4M)Rn0b&ݻw Շ }'$ 飣d?OSL΅Ϳ)eK[sI?gtTJ}Hѯ[X3%+Cͯ=K^>mWH99m)pvvvwjmiljj9cƯn[K|kdCfΔΎKTOؐO@-q~_4ӰR KFS~vVJ +Ww8 C8c 7 C)˴L҄5tKʪtǯzޫ[OꩵÝ}O] G;BϚ9- BBΎ7__tŻ "\)eD6{#{A;옼2*ߛ)rF W̻ةzR+(KgG5IMjuzK_ۿϟGBܮq*,S PKjMR(jhUҿo8iuMRZ+rǛNzfBJqT*| /2\UuC£v:p,K)iYN MXO|力okۚCl{X]u?5{o ^mλ_߻owUe-7ߢp.e&bJ{y94z Q KjpYH$iڵk麮IMj>[wxw\{{NW+9іi} &32cVT{=MjB4F«,!4[ɓ'}6lP˩-%>4PCƢm`R,'aXX[[Y%7x|{[vkߢѪ*4vǼO{=y۱{ihnXu}UU& 7\:QpLӌǭCB摜ɖR:ݮP$,S%oZPJ; :stDq 5M;vjŊ[lB\7xl{V|Ubh1T<0K.p!{ot{wz4h8.#gNe&^uM㩪…R*N!.GZ1Mw MRg;[^Hx}Kk2-wu-[{w"BB¦kuqXy'~::: V CC-[l]0s24M4ik[5{eydBJMgٳZbK&iךgݺJ(TYޛZ2HFmkQN1_Ӄ`UUgS/\%0J^-*5=FqӌENcgNݽ'@y+NSTTQLcӡ ioR-R.s[[.2UOw2E$Թk.(e;v )ԔѶO Qڑ ,־D*WMc#AM#6|h&}-i/NM6-׿XIJ:rϙ-[RJȶ6U[xM5uBRAݲ ee(ˊ+s1G?Qk%tHMCj9|_2Y|xFevgN֤aCtBgb M*4]yG?ی2gV%U٨zMM/`Dq:+++^ihHx-+ObɝW>*ԝ2پZӮm y3~ls5]hRwR겷ֿ2(0/h8xf4]ogI{4;R9ɿTf~s|B.90v??&4 uڬl)5't cKkE߰Qso-Qi" hKxN/z-$3dx jF@R&|K7-_ϺRa˨6ao峽;FadKgA hNf-Z#oӻkd -_zٟ9ToɎ]r~(W)isi=][kFB2QzHaGc.,|z9e4JC ٫˝7/Xb[>(='ԓ9sx[LmVqQ֮[qFn:Aq-01c`׳?\K|=ʲخXS [F80n"VϾ'z#fe쩣ʟ,D8  p&`uv*X|ƹ}}JV뮻oذ (I[;38ird[0N"|"ܖ 9}OӞSCG>{o ‡0Rw~JT fgmͮ-{K"|X`FZv}mzǜM%]\DxqJ ˸1' 0>#|ᒕc^~'k{TȰsff@}ᒕXJ'{NlFetaoNαy&9D]>=w:h)g .=w^tg9Pȷd5{իwիWeg〢h* (s>`yUvaf|*;1^tEb쨴%#6E_szIqK]@􂲑|{23%B:<_mH,^I6_k׭/^c\nƍ<Рٸq# D8  K'yhl< @eMvHD hX*v7 h$_c79y>>P G 4xf|<nb ,yفF;ׇ:[ 'X@rqHעu/ x9wy{]XR<#D>fNl0w!by<g$+0P\E3NrUxZ=篒 AzJu!;0G>ڐ>Ri "/|_ץ.h-є'60جR42-Ƙvȩ䗳ڴ;V@6A͏pˍaӕҍj{@^/p%tu^AVTWub49?gY92ML oyP!̾XFBܾyy?O(cr.[c(41׮[q5?4p6n`+FN201&EvwgD8  p&]uPv.ظqcz'906.ذa@*]=[f?7%1𜤔JQNzD @yErTrS[5;ySC}Ts*;C4a]=vQsJyhWOwV<雝#)sϠr|MCEy ?D%1{xe@]X$E7g-CjT>pMْ].<SIX1‡QAmذ`HT1wיcD8J?O :(>^)AOƪDŽD L vp-c"t( dVFUp)eLJR,|,9˿M%‹U^q̷ {G&xKE?I` Z'S|=jKqxGU jQwn̓YOxJT_!m٧29Of|$46`AC{Lb! pJ8dvuE9<wظ 5@(9kq -k~hoxjHkd= <:gǁz5Ϙ86zb0 a?uLVּaTG( #p]a]GчYCAװ0Zj3Pe= 1 pp0sE:7~eeF pp@""B1'e`ZzuJNegƍ`YCTafPTOw׋>D8ô`Bz{KŏBdmP?WL@jHs&Ͼ%+wnߜwe4NY4BRJTߢv$}¥.YbJч9XpTm7oGmI-qБa *{N ;Fx~Nf蘚56>Ӈ1sT 9j/{4 yfKjA"12NdBKs ̳ :ZXޒ6U_3$ߦsɿgth/p CnP>R.k V `>sr/fg~p0L?AG(|>q9Q)eb]~ƍ<(R`%5?4h> `իW{Ǘb-)| cvC GkEHHƄ+R+#,Jp"5?x[lD8>þDC@4fD8 p@@"D8  pp@"D8D8 p@""D8  p@@"D8D8 pp@""D8 p@@"D8  pp@"D8D8 p@""D8  p@@"D8D8 pp@""D8 p@@"D8  pp@"D8D8 p@""D8  p@`oBzZn=s EUM/< rùpp@""D8 p@@"D8  pp@""D8`8p_gSufJWZbp6l0n"veLu!Fi  pJhᒕ\((vnߜv#O MBʢl7xFI=} 2@uUOˮ;Xg rɼ<]ؖ<|![" h\8k׭g&Yj+D8[CLDlD8D8 p@""&dF`/c.`;+V9IENDB`davmail-6.3.0/src/site/resources/images/thunderbirdSmtp.png0100644 0000000 0000000 00000011206 12564151555 022573 0ustar000000000 0000000 PNG  IHDRg%JMIDATx˓UߏrFE$f A$# qǂ" A,`";RΠ%L,$7RE q9ss>}T=ݧO_ίvMN\0v3'"[9e6\K'8"\>~*"DWV5/Y)%-9k`_J-7΍y+򵋦$L6q %c  ߾aSKKK}0vSG7gC=vDi}"J ?V\iA7d4¶"eF&{!+"+\08t'O&KOȧ@YC>Nd=d<."=f9urmam3J59}ݪdo},GD/ȕs>cTD6/=*"g\s~ysʵ<(",\~g{2W8y~ݓwN ^׷vd?x~\v×o͗syvl+x8k D8%kyxO6m;w_y&J2JNJƛ/js-U;fN_[y$寭ˇ,}t}لW8,=7ʲ =)k K&oP_v & 4w B2W8z.W17@BP#"~욻oWL&޸=+nvm5uڡܐ jXrV3v@U zjauP @52!^`ը*ˑC-A-jHL&nb[Ն!wz>d#\L]GhdPAVqY__T#|# {.wlhTf2:Ow]OeDޭkzW,* aE5zǭ-ٜ\|-Z;Y__B ٘❣Q<YGFk*lSG hr1H|DoqGGTLTi+CdTj&&iK7;ݹ b2R.ؑ.-'\̢JFGPAQj:=RO8ʩ)aN[g-]\ڢh[UmTdO梎5YlA,; 8rh {T#tA@5" !k ך55xk_^@5T`h$R͸tJhckP TlBW R˫hlE?5Yӏի6 ֻbQQ\X:ُp$˛J0RGQ^86_Ztw }n?ȿԝQ\:REqJM[ID+x!*pf7ժ1[Ҡ0X|kVB-\A0j Pd(㵐%LMT`hF>oѱ CTCxjAC^P @5;_k,PJ{-QvB‡]pՀso]tu6qՀ2@ P ՀIC^43f]P2ru՝D;MO7i:V~ulAsBF7hc1p7ϗV+ubpԜb{*E RdXuaMS"irsjx}[sʽ~(D}ZO>b%_RmLHc>'O8ܼ 4׀꒡%AuQ%jpo[~3^T\-U w4+*"Gxs*\5%|^.pU CZ>eJ^c ϫX@& 5VG k0 4c00=uOy, xq028@PTP @5`=CDP Y8jjjjj$ boTCmOհlޚ՚JsI\Zs[A㡗qqm]w'] M6mb]ޱ-lnݡz6܄uu0w[l*' t:pk.vlc5]VQYof wltV]87ddž!r#GPTtgNaHڤC\L q&5W#kMM4y T2<횗ߩx`33[&񨢢*2xWV:6u1|:z"F}U(5f8[jP9A4(G7'P^A(Z&;+++15ڽ Ő}jq$g(Оjsرt+4?02@%l?*)]:f2z3jIwh\|KU}#?46vKuO-; q \f ymN=-5ə420r󚢊H>ͱ.n݅# ` 7s"0$hz>/au{t0O^g+! le.aud)|rc :Fn&ܨޣhbG8Eb-6p*:w!W*H,r^üi<2@xX@Uc$]$ǬI;d1|Z5kՀP)ZD.k\(\ \Dqg(;UGwQmPjui-v:=~_0b0fmBP %^ZnCd]&B*b3[k:6w#7(H==zqQIt]*jfQx]TP'܅H;Tލ9 hj`ҖLpԦ-kVU9Zju)wSnvQJx/ԱT'a~EZ/bs+Ey2tQv<Uq<Ɤf^ʥzl$^%!Jͭ0!I 荋|hߣxkAG4'SdyTٖy RճYYe_3m($Z(l4I,_ ܻ Wc2R1mhvx!IM*ivҞCBB˄UbpǦ{8'y1 lZ2j('uC鼜2(:ǽW.$veP*tH9%G qх$dNxvc@/f#נި;(@(A(.J.J.F ʀvP @5;(A9pQ5(A,(.JGGo5TP .6]47 ;j0a pPW+i&՜(*m YUUȅHݒ4Z.uZ,jJV sY%HX[u QѸQYzQQQ|ﺁIa^!$GjtrTC#)U!j$gCm8$pn2:Hrê, k9}줸h˴utA5"8D5HT r\l(jj!̉l6@@ ;vp VdB3IENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdAccount1.png0100644 0000000 0000000 00000077547 14575630005 025657 0ustar000000000 0000000 PNG  IHDRH'Y.IDATx^ yyaL" =#X'mq&B#3c&: 8vb ,FƃFA##b@2B @-@t@Koiު:V:U}o{H{9uߍ`D=U$ D@ B$ D@ B$ D@ B$ D@ B$ D@ B$ D@ B$ D@ B$Mae&c&e]0*H.yo:\&O,aG}AfbrvϹ1Wj{\9{(U^_/'L1/uȶeRHkAupX/'33n(smWeLwE2$,*dǔZnm۲X),8P9x2;eKb~5j 9 B)O~lxūJE(]Xptrϖw ZSԧ">}N-.Kx|+SNw,S~մ. _Ev5T*9 y)AQ3H3dJ,^O,S~մ. jhPCgO'%mO$:"YF" [r P.gUG5 B4r|ed9*n|.tIΑzLo ?Hu\a桼)ZQ+t>#7\)qLy7#Gb_lM׊9_{;f?=M^O@~`_C#upWHAйXqx_%TY@*'?xwe20V_~A:$g}4x+x+EG隌,wz?~P0Ք7MrG߿ISgwrW Uo y>K9Fy,J9AX>}Rƽcu{[&d/K=t+Kr鞺N}v~G?2!uŅrle_'k#t9V̼K^*Wcga>G}m}&L39euo UA@ zܒYl\(}rL>BaZ}-+)8qw*G]ȥfv@,9ntyrV8 9stx^!ъM%OحGȷs 8X+psï-Hஐa /v|wsm$U\V~wzbDr SV*rL>_5]Ͳa<֌o}v Hg9ƫxsWއuO #8E~ߥWؒ~Q? ߫ݲ;i3Xzeˋϛ e'gz?@O'/WZ7"3 g\^)13z3ߗ(k`)r *t}g\&sWl(zyM2C[u͹x9{Q*~Zxp^i2yܔޫz=eXkg{^kwdag#c>_+0U<3ɤZqve8n^wI]%GN\X6A@¹rюJ w-9=X[.ߚ6EN\A@8WϷ;]! _vBҀ),isXe#4&+׏E?}ޡԀr)$;*x?*lާ'N)^%T!hV?=\9rE B|f]8~%%tdr5H=,}H~{)?o/ĵ-I^p~%OԲy|AoߍᷟuH] ˎpP,* HK1L[e^&TNEn?myrkz V\8ws [Lxc^`DeN 8]qh9eueS؂l79Zg$+ב.pIrw(5 Mvt,)x{ҁ_ ^p Q@*Hp_NAGx՞I}RFOS3Bx\ZcݮKRy.}n/l9_>T>d,\k m9+59lt/J y$dz>d6@vkSg9y_2]>传P|Ptse\'Lt7ܽSAO-9ܛuy 컪H!+7)hk{J*D+V1_\*KEr[ZkkoP`y4-DZ+zMϯ.vƖ+S/>W>柜]r]X}9^:Gd8rw|wc2V,?@7sTm;/rt^h|g}t'>)?ˮ0}W G?#󖮕 o>.v|]aK':~$sgnZ-s<~9Ks/~ 43r;T/͓o(c͈' )ѿ+԰}3e߬|\6>_C iASKuN(WO?H?t\q^r<$LQ*\qBzY9u<$sPi\qGa H2a'=>' G_?Gr망C-f:R-R0iKt:Шa.,m\4 -S#Ulm *ݴ9j8*iVʝyUu\]BOajPfWuM\l5`WAQӎY(L\+96~;!`tc{8l>CB i]9c%G:Ρu˝[$\-$y$6foochrgݤ3>"@$yhEotL:ze/_LŮ,>i^Gڰb\qt|tD@ 4}V0"e UڎIi_Ln|cMPy;u[s.驰UVeAj%abBSdq7ʦ7~ϣ:H|SX tUyo0ͫ=欤*)}o;/Q>;"Gߐl!s-|ûn5YX0BWuMR:)?X6ȁ/~[YC}W ;K~_ [ߖs/?[lK#9 ]QʌV9)֮ ߐϡu˟&Ycn>ֶ찃3~'s!rL|n~?1Sirf ϣFmgHHWO34E/by'zOyN2P^A:I.>Xz)*/6$g}p\\2GL ]W)Q8<.GHmU: OO 䏗]IK=V\ib+Z㴺%*i9CBqS}\?q7]9<-k*H|>AҺ`TH=A'ږ9`H5[y4D Ɂz)2OKӿ_Gh r1g^)w. GG \+y8lL:lfPm$ꥰu̽ÎbXc!H" @!H" @!H" @!Fbi0YO:eQn[7X,;OY:RA1Fe]j彾7h6Urɓ ͯˣ94[实Sn[7R| H(uvծZI) ChSn[7R־ HuvծZICR{[V%{}%XGcƍKt{I?ά ~Hܿ~pn5MM;k aEG鵯mqXn7ZHb[t|n#7'>kjKs6HU:ວ]X~/4?nƵOl~MNΟ|S?{Y˹Њ:n<5Y K1w#MUҴw˜}krf0ޞ' uM:kygʶY69c:m6|Vjs6fg5KۆH9'Mv2kݬu~Y=:\wfZZE^ޮrM׿ 3F*'*:eyޖk{z={^ciM9֫|ui뤱K;{mٯVgKֺYٯ/k0d/5zK0$m_]kb!:NqsqmߵnMK;{rۯvێmn~=>?ޝ-m-ױ˥m^~ܟ3-ڻcKֺy!:gWU+9iۯ]ӖIv3JOir;-m^g5/uK1ۈȽFϒ\t׼cKۆԟiY=/k?{Y@+s@ H`/Y3mڼcOZ f9ۈF8׹k]{mٯm^7ʽ%r^Ϟ}ӖIP7OGm˚Wni<9'&b幢c.vr\Z?sv{[YesMK;{mٯnڵwmFںJ? yY=}.\RkЊ 瞤s|*2}/Pq$ D@ B$ ԀXF+ܺ:ӳf9}FUvY5^US>K',v j\cG\-שuǩf9i" NP:iƗZ-e4f+foS#UrTr M+h:ղx,x_U(/J״Fe?ltſ̣mujJe[I+W+h:ղx,ףYqf,͸q} nd=/em֪7lm+ڲ؇n+'̒v\}<.u :-v3"qK,=xWwrgb14ܸ8u\~Z״ضϓx~Vؒ4vE\iݪޯ\y'q練lco+XWj+]C_9s?sK粒e5e;a_YRn}+wE'=u~^?{ٌ1s<*~;?h. H/Ye/oN[oD:n<5ٖ TxqYk)8.s[ɧ,uXOmx[*m50_f~l} 륽]KE#hŪ$Tx}VyXf)<,>Suc˦U{!.׹f}ψ=5d٬cum'uJnuu/+*ڎCSk{뗵|m+yGR/zͳ/iLKk٬iȗ~yxsm΋N|mo'~yiֱo]? i_iG?O6{riJk~9Tn3i7+4k^ڴ4Yʚ6-k=勤:-fΚgekz4{~vӦgOϳLcK[5=kY/k=͞5%kyfZBɮ'-Jnڴ/@ײfm*fv]W<睵rZ>udC%ۋo[jY|t`Hiݖe喵~-Ҥ-c2׹yY&^-q3皶o{iJ;fu]Qvfͳc_ʾjY4RXYkvb/h{4!k%{=}mQYlgd?itz_Z/5z5/k*NiͳnT|;~vӷ]Qvخkەv۲?dة1 Kuø8T>(w% a܉xS\Y! @!H" @!H" @!H" @!H" @!H" @!H" @!H" @!H" @!H" @!H" @!H" @!H" @!H&ˌǧϒ' ɲ7K=/fM8UnF:nfI{qzF :ݞB@P?҈Պ֣ @H~+M["-<~K\,0vNe*h=2 Y$N1Wn0_^ }:sQ75V? aFt i3˕{{{ 1"@DZЊ۰sfWQ@2A!aQ|;f\^!|ixm[Z= Ŏ?:D:k5Кj H%^%&-d#vҶy2rw_׀nu@1 X]̬ykmryXϹ |=n5-HfG;%U`" @!H" @(W@g].s[S}KdgP\IyfݻW( BGOw/u# B4S%~E( BiOw Q( e  Po$ Bl! ꍀDP(Q)O=\.Hu! -d~瀜W\-]}GzP^-o-dݲg8.# MnΛ;]^IǐtCrɪ<d OGzd_n;䮷FRCQ.svQ^΀X&L#eq̘pԡu?Z?k04L{]$BP9{*WA@pQ~Ϛf%}׽CX8oy_z?YFÅVrYDԬt MA t~jh2MfvsyÑAtƀNonrw7Z7";uG.zf_7O짭Ms[Nm[4a=2>ʳ; EW>iIҰ[{P<^H[S-fhv EJ1@OY:u0m E)}RH Yyf;n4P F'.i 0tY~g=:wǖƐ|{U۞0% ~GvЩ- `> .2p"{׺c™y~bG! Ah+srG0HM4 7Wv+;`p;W#loGC6pi>hg7;5܇T H~v]s{PںY!(kLhw:4i #m-q譾ݲ}hO_- L^:GK.};944RٝxO-@&m\7]<8[t}{kt4:m1-F`!&o+Q5 J%>ޱK`5u¡@i8{WH{YVI R#wAR9cw.vn}a kTb0bW%ӍOSҰǥ#uL7w[E4yk>Z3 iS@D{ h}{'Ӛ-\cPU H9uy䏽 ]nGzG~$ԕ#mъҘV4z ڂeZNLƲ%Һ٭?VCєzKޱCڻz$ԕ G:ci6?֢](0tFCZ7e[vHigv/ЩIC{W149:]鱙C뱏Uw;my{tA:o\|)Wwpʠ}C@@]Dі GF4$}5lѐ47h7Ȳ*/ڵQ_mde?9\配9>91GOwaFsaYIj~[}3r-I_|ڢRZ3 n}Ⅹ[kqe~`tM/)F>'B0:~_Q2TBGӖ|Gm2H}sEڊto Dϗҡ>>J$ ~ ]tHvyr BPƺ~/~O]FG+Vkeup 󜤱Ai9pAO1"=&^Pxt /Ȃww&BM{| HY$pDP(f*O=ew=kV}G VL7{U0! =L7#H[ E9dyguJ$ӝBP(f+;0: "t j]lo]j7f}Dz" 91WB[xNR:BPZ]4<UMh!ڱ|$3ZXj][.|8j25;BPZ-#2ުHBP(eu ;"]@艭;ea0tmeʭbxعg|dDG3="fח^/ EV]&[Gneh)vI1(M,NӐd' Bdf^Pv%)]^[Hhue΄#m% t1Z{E?K{:$ ʮ ts}H9ܷ IsIw¤HS_.h־Ѽ1 Y!rWvi &\nii~L"nV{U"?r۞gZ4/%/2bOou^;_8OpLfRhKnq_Þ`#ωBEr:3 ]/o! i1^(mQ$n7$(nZQ>V[Yx5i.uiW7;HM[4,i(Җ`^fxK6·G=z.yiNؾS߱3}]߮d+.ltz:צ``8=mzuDPŒ5]=Hb}c`CxHuҎDJBo0X$HogW›# Y#[k$W@A*h .7#K#eM[̲I1).*v^/ϼw{3$hߟ/3:;Zs_[N!8^r\Z T2>' $~o";eM@2!=AH$R+<Ʉz%}=6W@Rui$m9/~zB.wt ‘v/dYݾE H^)hW0rps^Y V%=6tb,kf:J/b'k{Awg/sP(jٺuޅeCtJ  mk,v@2s4$>֓+ B; @\=>ho$ ~C{o0O Niӟ쓡C!)MJl8hSc{p Bi|У-C}NA:]Wjt9 2w=,WVHrR4$F$3`@j[. =tSO.7shpd[m%;$Kixz=c8t|3_@J>RYi@@P(-zoP#J]k=uyhl9X Iؓ8ZEɣ1Jxi3ѐʶ]rAwF߃E$^Ï-+_^ޣ{ێzߘYGulOǾn)ѕReg@2]= BiB@B+с4;h I:Z}՚Y)-:[}h y^َ(f37kг~#ӥN"M4(4Ĕ"AE|- Q( 2څV1XtԹJZxW{c04Ci4(yO}ޒHT ]TڣHi]qi8Mct{f[_;4"$ޮtpЮvj˒&EP4(=ΰu.$ Bl! U]#DrlO$ Ou E7!aO27y!T_ڪdWt-/:B{m*y $tݫF É5C G6]o}p8@@P(J ZrT#<-lڭ.!賒ԵD=5\`kk]aOCkk+a_lhK.-ξnH8Rud#-OcAtsM}ko% BPƬ~?43OuzÐ߯O/("}It3DG֣<]jA:Z5[^і5fW)C._}f?d}<uC$ B4E#^'fA:<7av_(Gb%=|v2eFJt:v#WkV^f8&ׯZÑǢ9pApQpqWs配_KHRg30V~?4 m1-7sOw'w/\kyQt ;\}`j )!L7;-1ؠj G=#{4zÑ1!P6 )ѿЙX#^"ٙul{p:peZ|o]p\f{Yh:ZѶ+0D `FӐfC6B26t9smz0de!b]P gȖ+ r $y?r p[^&}Q&({eF]=fնBw2WȇQtn3:rtp9GrrBӗ]E$zQUdpSOzoEwS JH_~:cTfg * {>ȶc~o~ղ^9b(ۢ8@,GzkD QG.& K/͍?<I-xeCc_{^^k-7yޫVsߑ>7٫ `C z!O@:Qm=2*M$Csuj HM]|!1o@ڒUHzѠlg J[ttz=UzX- A=BM_"٦o)_]x=`dG~;x]ySA=?y{ѻ#mV_|`ӭzAmH p!hӂ#eKC@-_җk֜]4@r=#onNk֣C ?@TxgF:qGr2uVY}mIFÊ(Aж?Qg~]yi}v$AEGL#u|AY>rb3)++9.K@ ң1^9[L +b`!?D6?l*vv8Rw3hw<}Gߜw*25G;dF?QGx0 d $Ҡjp}/<.= IznWz+y[sL@<'rt>u;5 Asa*tmQ==g(!u]}y/T,V3+>zݽogKh>bGC@hk!BCP4~TnPT0 AIޛÀTk}oK˻e%_oKGo>b]CDD徕E#]Cr죽_Hg }A@]$qDBeȃ˷򑹽Svm=|~Z-ZX+{>HV[sh9~/~&7pH0h0:qI`,ٜ|=@W Jv׺9臣R zuCp׈}ڴ&}7W =d;^[qڠW\=CIl& =34H〆ޑnn AHZ`Hv,u0'^8!4 =y@{5@@''/I6oൡ14;7ȱ{ewGwOtJD(,& sRZ/{/rboZH-N+'-C٭G^9[嬧s0:E"vAf HW ZHC@hqZז>gW]uCrx1~ Dfq7L+; YGw(jsT=i0-[! 8]p?V(Vfw`-E5Zӟ+o"i8ZSn[m_+'-O${nx1(8ʯ>I庵 989bi0Y/:Un갗iVzt V~i-{"-v&W }G{c}/=53 >,Nw^-qޛߓp,&}M?Y8RT䛥#\3" ʹPl-/X(;۪TZ@>Ԛ@bM]ؓW ۫U񠼪Ru3kcG0pװܲn0j9n]~w5*HfXmrPD[;O:PH@=u HmwmeM'vG:nf{H7?{S鳤Zvƍ7f1xyK}үe~5*]5쀔uT+V$ y|uLOY%!pOv r|ul{< _PU.vgER43N> 5 U E~23J@ɇ:\Ґ?VOg(; Z׹hAs>L#.<҄#yhgJX~@{nQA@r0│Kƴ0ly붛V|'GS,٭_㋶jW> };{b]ZрJ-'+$t}/N\,׸gRkD>󂀔': /PZp]ifo`m/tHEv@ؽ9Pk 6tҊz4 it9.-8ûVZÑА5h8G \U=յmVjx`.v`3d(! 5ݻjI'}xj=' d˛#Us(0Q a ܬVP{@p,i3-HnwaqMSv_YҎ-i~G"g<ts+*n̺u { 35!?(~zs}^Rzp̈z>Z;dqr$43n{{ޝٕY :z;׽ZjEъxm=ʢipWȦtzߏFÑ8qL{?OW JT2:u4(i΁}6KV! pT-ܣfe ٵ.ڽNc}oBa$ˌ'$qUAOꍅѐ]A)>h~3{;}Ryhw#C@@ ЮWZpװ(蒥fLTȳ(wo%__9skChuՏ>V[`m=۷'֭ cGk+823j) Gm|0AT;`-4 wߕNs `1H}BQ/)4pdF]I˥# Hس.9w-w)>%~VwgOSvjJH2U %*;YǯQ_%y $;_B<\+ Bu#^'; hfzx / ݾ!^Yv}q/[MPN H_~:H=zϑ2=%}l/N̳l垅 G* _G BiKdgj;?h99aٶ2_NVn< I^HTǚfOk4ݧ5nsaXewxoq/=ٟx}5~oGSZ@HVVZ8RcUvgP( ي~?Y@3Җ" ;o+_}75 .VSmHCݱ~[}{F51#96CGi`ёeI3o*$‘}cuQTQl${YTbfC@P(JZA4^$T !pdʶ]crc^#;vqhha^s~(J~sVӽ޴Grᨫ%% Q( e  N+lxX8$ 8y#m %9o ˟<ڛXf, 7G[\t.҇HE4‘" Q( e  N[4ٕcuk~@5X^iWjZmoi%8/<5ؾi5w;mv1r@C}]ࡾJM~`{StH7n;j8R$ Biz['*$43vLTunK绞L-Z!!!-mD]V[S랶D[d~ưL}Gɟd_FcP&GHss=yZ-)BPF ɣ.7g+߻*?͒z^VU;6Ŗ G0 BP( /JAHќ9?u| EJ  ,m$}Үs,ݒm؉'uV<4Agwȱ{`#WyFFtoۢDcC)?_Z= !s{ǐܱ~Hu|ÛwƓ=W;nGV#]ٸowkpH Bih?.\And޼Ft\E_߭+؆L'iQ_ywݺIJQSVdDV}Zs3藿ן+?{Vү[}fO\#Sn9}Aiߴ+>Zv˯xDřOc0tc}_μȵ g4sQBP( +[nÑv;W_]_]Mol<ǟ!I[HhfZU$n]{FC㱗oH5l:ʢ]M8z7m%:hkaZ=Wy Ei9 CZ̠ vrmry㑆M>Z-f=]ъADXȒ5[=luq3dy\4* )}P^O= 6o~O4^Z^y衇1:wBN1#ԙA7[E4`Ѯp:os?k{`Z#UɳCkRjT+U#:^{lCy/[HLۺukbVWǀ%wBNki֭IJ  N[z>}D%Rzv%iNڽGJT~{Z6\3 kxQ <̷W_}UyYbw6&( BI~Ŵ$ۿS5V`kxg g&]>]thjÑzNz>-;ڭ޶M[Zeh@g-~4WC=L֋lzO`7( ҲV4}d ˶%[ /~᠜:zdo7MSF$uܣAWӟO𭗼ሀDP(JZy.vʲM[22D_?Cvﭬ%~ u;Wu+U}@lEnu]Ův׽ZH_cpt;{DP(-$n$b޳g*/ܵ۩y'*Gy`,KX)/[=Z Hml@Rѡ~$ -/.&ء(-( BiB@B+m#he[ y^נ ZJԅ=3w9-:n)mvҖ*{k`i^HMNx?RBqŚr"wșgC}>wHڴis")}VG@P(JZQPvKԬ_n;7>tAՄr2{ e_JmUCܻ }4 IAws F̶\4gB4HV͊DP(-$w]L7Qm Gk+oe5k KۨThw{.Il.~.Nbv3K܏bBƍexxJg#]."W@sݲw^{BP(1+OwЬCt! 咕U7$QNpWǽ@W7{CutV>C^SeG$3pnrv8}y<.YΈ~'~#[p۷uO_얛^n!W@z3 I BiGOwЌLPd8h'ݠI}Ft<].H.,#KQ/uڝGd 4+Zݹ'Y!mkwKʩ{NaAAF8Rg?/􎚇g6[WUǞglBpeխ#~Hc cz e ݞoegĚ|g(QҰKr ʂ޿cȯ_i1QR4 i@}0W}Jh`|`z}|Z~rhBڭA "x#}nڒf/kd]VD@Bٕ4s7 ;v$*sXs UX`рtĶ+:٢ǡއ' ) }Mg^Ҽensz=:ͱi‘ H^FvY: PhK7] -xO\׸.m]ήO=T`^'!r\da&]!=^ [J5)ja躷Mh׶)y6iMID#.2sYkfݲ~^kr `OGVFxl( cz r,M=S9`3Lh HoRh{-"P(F챢iz&$QȸŴ~tjI.|t Li҉5U#^ByuiUE[4# =Zdk!EP H_<;;oF4Rݔ77KJXǖDۀ$ntFgMUCʿ%Ms#G߫A,~-]]PM )DHj4-ul4">:$=;dE\{iƇ H2)sW޿>^OΦߙ^0w&$I(rMJ%c `LtFNVsAApg{)`0 5 d!ΟiȘHBj?r4" L@ࡕo<kM~^M WnMCI(qlN7c0 5tI~={H_xts}WopHҨN۠Boí(Uaj HrsLvFtε̲+;*v!{O==_N>PF/}=ORwJTW)4=l۹vuއ4B XȖ6 bG;/iw3({r}t:ۿ[ާfm帮L{eϱQ&!ɖ0Y\I~gG]/GBtλՐv3nѩިF X]$ޭC+{}ܮCr}_6|=LnA"Ä" ;6ӨV@)[,J_xr4$s;U# } P5u4꣰wFBa=Q&{v**}ޗ H*O+ v1UŮG@jt4$Gʖn:rdi9.ޑ<ۑ~xR0& t;FO#`EK:E@rbuReHB|dPY0tNt6JTEٿ<U M躯|{AF4씽lu2 \{S7ZG>idg-HigT/ ~?wAQ?ע67e*4uT u酷uT.݃׶]/d冦uM!OGKXI#Ǎ9U˅umWNF4NHR4k쑖춝acWKhGnu5I.C)vz^HS=(U=[F4bVAZ)}?jKի} k E>J} )z9[l|$4H @zȆ#m{>[^_`imɂۿp[rMoYϙӴm{v_e[ܜʳ#bySv$7gtni[]+ps {ͶHўf M'Ud.^Ul[Ie&>9IŽ"Տ.~OgGW [9YGVFq@ sGR(}iy^(L 402/qv]Omjlӵlܻ?zt?6dZ@$-`;PҒᶾq" y!ݓ /^Xcȶjجs+ձڱq@ sGRN;h(J>wQFi7RS|_y_a'k}FJ5?9J?k)΅͵yŮ #gҀ+W1=Q@Rq" y!ݓF"ZNQlgsHR]yRZf'd nLUӮU@C{=Qt8ȇΩE}Զ~@S~վXy^uS9ujy~ \3 SyPQJ^0bS% 5bFZޛ}f٭\|uHX`mju@CR蹣6LBԪαGPF!`-?n/Qmfjܜׯ8.2%;{#ǣAQ=K鈓'.m=qs}KGkD {Ӕ9Zr\xxͧirY5Ejq>6*Cly}Cw !a.#;[ +WxУLGnGۭV'MI]vWܑEKu}T;Ns6<~RPt1?¹ :xR0;[ ݓ_.$v+ߣѤQF»4oBtփ/+4js:FAaePHWN9hҷ_Wmt:; Fk;ew\x_ꇤ/쉇$pvpǍ$u*Ƈt9u5rd;Mi՟7i ;a~$6 9zm۠6Tj! 7V:jd ouO&/^L]til\~q%]Bעkr3M;ƥ,y & E z lnfӥ2 ?~|r˯DF_JGtP gbvs4 |Bߧοn?rbzFWlp4j^+Aey0t#JzkW07P/ujr ` .),}݀r`l*ۆi%?,idIg¥Jx oP[cGazֹP 8\8PXM=Sp~t*N|'gV9M􌔽}-O/=;悑 [E`^$un(j"mh$F'/P*{P40j={1zh K;dum' X' CQ&QpRtNս&41whW `vӃg&NSm;XHC@XGIk&ΨͳHk 4L:fo#FӇ0#ھ ӏ0\`rמ} Dk  v#}$B P~Z/aޏrGUjʖgÍe9H<ݻ7yАMg43w,&omFCj7mS" (Q~:mkso;h  @FlZuCh6HJ4MvќѶe;h϶-mA@/۶A@PB@il @ m @$%n˶-mA@/۶A@PB@ilF〴W tսK4\U׽r3.lOoHrn;/ -%;/*y>lFvб޶!RZ捋~}&0AHO&7]1|sCt̨t,ڑ_%.9+'K4@t1Wd6uӀ}}0A H &dvFm=ldcm_9|m`H:7?yS{@H]p1~/ |pmMtz!;F _l@:r-5Q2q71t/8fɇKeuU~ Z?L8 1ѥ#!SɁ|:+ϩ}Kc9/gf6 H.<;ׄR)R݀dZ?G\H1*piϷـuFJӭOݜvӰF.:_w(}GVٱ# Hih]YyWU>}pB(JRx^hcśg Hm3+[{mhTuܫӹx@*Y aE%Rp#HK#_^@ gVHtedI2 Y~j_hҠs3T$Vܶ:af4d۶Q; Nf- U? e˅VlRuyf34p) @cR|ԩVyK@*2}Խٶ)=U}R"؅ʈ$[νG݀TXu/>+p@rѫR<}vGzSĆ ;uc<){' +n۴ uǶ-m4Ht0;U H" f#HRfWܗe[kz+ˋ`X3tC!$UL@Fb!Q[^b>S R0Sw_3Pޱc6)Y $IEy+GM7Ws߅wolIsfჁ 7. H{M:86v=ٶ)HKh"FliF5 Զ1~ T==(A@/۶1 A@/۶A@PB@il @ m @$%n˶-mݻ79x`Ï~jG۶oxGsjG۶A@P I-g>S;ڶ  7ibhƍ6Q瞑vn#@H# @9H# @9H# @9H# @9H# @9H# @9H# @9H# @U@ۘ\@q]cϮdndm5e~ӸOuǶk* e|oہdC65v_(ʴbuĶk@XtΌ"#c65v_(ʴbuĶk@X뀔"m-YHG6&s sI87yd(8PWm#xN~m۶ # Rp,>m3]kƠt~y;ɏۛlkmP{r2oޏ7tm\uUe: *;f9:Kei6o|li_ ~o`ie-x;@#ηPgNUy=ǔC&sN OvAm~]Ϧͽ{Ե/PvT}/5\w1)v#kk`{|/&buWVADTb͠Qzfĺ+]sl_V[)_?X HR;dWCbyewy*:^Wx9k-wv띟ۜxo.P^oSߋ:RY^=ѶM{y/:~H}=~q>.ʌmWl-Vq`. CN Y>⸪p[vʋ.T!p;Zf>bS|/n?e)M \CLm{ M}rC6`=˶<2ce?}Bۀ~:/HgjNqzSbزc}=՚ӿrv3nnΟp= ߋ=4Xl] n:;ܱ O'S^Buh?Ů.SЮH9zU}6qk6Wt;(O7ZG;%Yŝa["S@~[v;|l!K:1)Wvd1v=Cezcev_~vj\Ov|@{VWsZ@9)-'vMcd]`87Öe?뉖}˖Wyo.z̓~Wn{U`=2 aAaTg,[$ԧa-U@HM#::jq3.$-H# @9H# @9H# @9H# @_?p\IVIENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdAccount2.png0100644 0000000 0000000 00000052654 14575630005 025650 0ustar000000000 0000000 PNG  IHDR0f]:UsIDATx^_t}w.Y($ҍ${S^R"C0̟Řk ^@$n|m LY CB1(i2/:@ؠ/Mi7TU3[sNU:uNwgZ{WtB @'*tB @'*tB @'*tB @'CZ?oB9|kjºo~Ż׷[gP)KʧCkP@};a rIt`h}F🞸ΛI9 kk|J IE#g'.Q(Wat U+~{'.Q(Wa TPBNU:!TG~?Z^=Q/|DWi3D[I>o9G4v޶CY]R?X_o'j*xX(ok#k}S޷y'B5y (JuucįI.[7kkn)t=WY.O|_e\8y]s8(>v>&'<>ϊ)mv>=Zuc¢BUz}ض _xMoXP:֛Aq'>v\]>6k'\sߚo9ykw_|Dq\kR{OlP}m]ۭ:_k6u8ijG/ RxwԚ uyKǕ^2B ްYk궵y}OߥJN?i]OPߥVjcJusݶҘ޷VmvS6߯U?jۻszڿf~bէ:.ޔ`85\%Q۩24﯒?/9nMէj[k\Wj@ҡmԾmcjcz_oky[kTZJ? JҾ<+ U`?YE}_tQWjm7oUz#kJSmZ]^~KmQWkZm*H[l^ۧju־ƪ6߯z,2T?Pz.M->_XuްjYh_Fy5C|~њkr\Y霭ΏzViݯ85i.y%)a=eL?qSIm,[ϣt>FV:vپk:ןfPz0q$Kߏmӏ6Q"`:QA_js *=暋JSJǷ^N]BUZ˩*>i= RCL3ow'jm?ѵ摷vsiG}6\ZγV37׏hNs(}(Q*Ό~,99"SeKA`Wn*#/9{?%,;FRtB @'*.Tow"8oʧل~guB8o'3no_{ӯ~O(O)gX/]C[g 8W!rIE[^[_o/|eKgJR)O)gX/BU"X>bkQR)5TEGk_YpCIT, @'*tB @'*tB @'*tB @'*tB @'*trPҭ^}j͏;k9~7vӈs>Ew+T>;o# 校}3.? )ʟronUmgGI>6术?yum}B 4 KpP_)C7?ps:n[m>ڼ"T>mSB5Ryϵ4Ѿ` UD'k׃pJcy?kq)s.(}2rݥ98T:m 3aY~P仆pf6y.svR{Ϝvnx 燵?AKXylyҧZ.s־R:Gm]OӮ CUvXj?.y\!8S-JS4m"žMnZ8S9,t.y>9S(%_}uQZk뼭tN3\t U?{`$:(PBNU:!TPBNU:!TPBNU:!TBO?ƠuPv.?1.9Ppҹ?1> '_CI*&pPzgv37Q]WB;sSG>8fn:v|қ'ƎkWpG0M[Տ:,7+\Ax5N>TT9KDhy V ǝ6TK}~_CI շzko_/Jaŧ|RE]'Y]sOi+By\:9`Z堛b Rji|'BSJ81FW$;4kss=T[P?C-$>E]+#`H o1Zef'K}5Q>yf=T"JZ!lO~Xoo|O59m6*O&!2?>S>b71=@ksPqksI59\B?9Ƹzks۹=Q1^/ `*3s UΚgVo*`1ަjcٳ~D?`nnjSo!TS8];>ggvgu}CUJ}k9" Vݣ>.u{6}Pp~6?s1Q'v{ޏy>}'4Sj|>9j9z__?~?<ӛ6 jaaf|9@}m]!^|Ŵoק˨P}K~Bg>pmy)Hd}[Vpӧ#=4# W:G|s ?M}*BFPC5>?tRoy4*j#JmZoߪr.ӄQPm?9p*S9TqPv%͡ZWkPmRM?dRg.#TV'4*U"8@CٶP0B PPFB#Ty!T^xWXƣ537B("}饗 V`py:.P*_}`L񭒯ϬUbxfF37BYP,gVo*`1PFR(**00BBW!Tʼ PPUU``*2B#T)yBPҭjTr1m)z1)(j%j1PPUJy=;O>q[ulj6Fn+y>_K0}C{஻>z\_j/lyٛރڏǏ6?>J~}K̹A/_~ UHFPF_?Lj'B1V:.{<7; f VDEk;~>;%O̹~[*򶷗׎~}oS΁y;jut_+1V[x?JB[!T-JnǾ׶ާO1Fek𾘗}C˶v}juim~iR}L̹ʡK}Tx_? 3oc ؎Z(1V[ԕʶ(9BB^lM5Sc=TSk-([q>a TԺZmk۾ܹ_|Z1)B4^׿Q/ Ĩp_&T}>Cy'TUZWEu Uֹ>%W ` e.e ljR(1 PPUU``*2B#T)yBJ̫U e^Pz _ eJ{o+2xZ՚u\ \f_cZ՚u\ X ϬUbxfF37BYP,gVo*`1^ỦgVo\&Wr.z}CUGWoJME<'?q]M=m 9\C5Bw}.Uk*,#4=8[mQOW+B83!B}'xjC?O+bP-8Km擨B3j.'TmPO [ x2TQ3T[m;+**3!BCu*TQf@U;$Bs۹jm-:Pt=TsQۮXIa_9\C6>,E*$K] ېnu,BKZ?Syf6dʶﲪ_Uu@U?3s U`dHe[J?gVo*PPi~Rm+5{{gVo*Pp뛐Ч/l{{gVo*`1⧥Үdjg'TnjSoY|7j'X}mue0nItmQ[w.6uqO_sj駿v5N:.s(=wsQ_ +_~Dգ>.u{6}eez瀊|>># q~@_ (?fyZ[99c[!HP!PUi68qmǹBڼ~xSٲ~m+`}z.]C54 ըv-TK4*b~HAzo[>NmS>yy_:|R~K.]CU"P%}j{xIU9BmEP(~E@E(ExxyuKK[Co?'T%yNrF[+Tmxo#T1+ ԥ|+BXUF| Y/׼5*0/*00BB PP ^_z0UY_%Y@K/LkqgVo*Pk%co|xfF37BYP,gVo*`10>?7`V `\ZK}ʗ?v}3nq ~=ޡ|}z۶P>WNlEwq{=f{ަ~6Ή6BG._~&m~m}>B;||^;G>V~bܼ/ >>裏o{绋wMok!T_rkQxڏme?O9b_lj_cf[vSY|\>׎uz[8ߟ2Vv UaO`+.\k-S}GfI?ͯ4'sBu^~? SѶOPr{!^k}o9L=&JjRҾ~-J}[u#5TT"$Nۧ TZ1ޯu q1~øsl_cQ&PeѡZ Q]}RuZu\nj }$[:okyN3Nkֽ*@T_$crDD \[-Ty~ޯZy U=T_T?7ö3'̿;cҷ_:~k+c`PR䀈RHL U-5T/>ڸMk~>40~Ҹ超EP (`U``*0/*00BBBHU``*0/*00BB /|{} xVf}xfFZ/2 .U_%Y@E)U[ X ϬUbxfF37BYP,gVo*`1O^M SJx'xߖs;>8N}.#s*]+ƴK]>R*Z_)sDVGv}::C4b}q}Ѯm߯EֱסzcC__!T/&kжFx1y"Xm㢿6ҵbLDQh-?jutέku_Zޖy7TvֱT'jutǶNXQJZV:ۢŏR( zl^}e]-Juy'1/4c[mL9owME'_nt.R'{JE >׮'}?*Ͽ@RR)}CUo !Ἧv~K_6iB5.oVGV[.8QW\V I5]9W(Zu*luM?>J~+%]V?usek9a\ֶZ|?BԸ<"͡usP/Uѱ~M~/}}~e* !RnSڶ _&TwƵowi$[sPR{;\mk;c*GWU`PE+ԙYC/e~P55TGJrP]./DK.*0C_ݮVGBs!TAM U 2N!TA PPWU`P|o[ 2`Z՚9-`NnZxfv.zo! ƥ_KϬ%TEh>΃^'E۹*g37BYP,gVo*`1u뮏חy gy͏:c:i_R(s.r˗)H׏1b?ƉPcƶ7M`|B.*Gx>~Qڎ㽟}sS(s."Jamc_ks`|jގZJmL?uy{::ޏRPVU R[/pjA1/eP]E2Zmj۾__j_/S(s.rR1׏+ۘ}C5.oVG* 8gmL?u8 ePP([S/>ص}Z ~kn~ƷOokC5>VGڶo;w.V}L eP׷oԋ1#a UPi UֿUQ]G}CUusDBKY|# eB#T)yBJ̫U e^PFR(**00BBW!Ti޸q-Bh{&J ^FVf}xfFׯYشVf}xfF37BYP,gVo*`11 Uy ^}{}::Wܖ}}[AmPŜxfv!xG;>g*z5T#C>~g738n-T{!T1'Y {7t\=Szo:4]C5ju \rZW[7IY UAa}KA[UPU(׶ο0ZvgEPxf6DzQuڽWPZju NOۊ!Ϭ5T3o+,hWPO*Iuj`judjPŜxfvZ RTqzfG*OB'yf6dz*#dWbs [**pgVoCl׿~.z/z/ Q^_%)e[Syfvn lPl Q  ,!T 37B(XJ4g?t_6\TY@BUSUPŜxfFK UQBbN}r?mS<~k7_1>bJ{7@AP-}O \\=cb]gZz@x]yx=bJ[GcvsS=5^~dj*uk`U˟f#c_xvCS_:m}?i,:T H(=1^ 6Kt{[ԕRjε|=Pն~FPm.Q۵Ou>̧\nT:7ŢCU򃺤Ծ?6?cvlIɿvZt.jv U=Sm ]B5]>/0wۄhۧZ|O`Z{+Zm>~뷍7u-Qת6^=׾"5T#@׻P:mBt֎6B@]W-TPl7 ^j~[CB#Ty!TU`^U``/իN,\Z՚u\ h+0V}xfFۯV0VogVo*`15N#ޯc<>w{mB `!8>і^+# y5i[t1|}h6oH=TrVh;b?aۦjg~vI7Ĺ_9K}0S_:m}?i,>T!ZV{[>kմiE]oiߏkmw}oRVH' 2AQ̓&Α ~.iƶqףsG[Wۥcc~Ǹ>0mMP|}_bCm7emmQ'}cy{Xm}Վ)ohP]jR]Ҹ<޿6:%߇Z}hJs9!T~c0m{TU_!66ZmD[_a1+-q[mۢԷU7]C5I%B"}PmBy 9?O5n#^=X:ǶU:PiU'\ Zǵ|@kMu־4_oݛ*_DH@:?&IHJAHP͵5ڢ>>Ky|ʯ˰PC./M3}s[m?l8Sϡqbs9.}Kn/~> Uk,Ih+Pվb]C5"ԿVK SWh/mѡ n[^PFB#Ty!T-!TPFB#Ty!T·W^;pGkUkqgVo*PEK/Zu\ ToZ [%_5YP,gVo*`1뮏z52L!T+|⩛~[<8؎~V:ΩtPkZ+|=!:}UӟR\>Ejut\1i\s)]۾_mcͯC>(>JB^*M׶=mcE(bJEmNkŸ U=tV^ўl[[.~Uo9D_[y?wޏzCZݯ=U)ulnӶeAu+r)}D:|- O(c}?J5Nx_؏m [ǵVuEחTQBR9ؼ^_˺ZOcx_˾c[mL9owME'_nt.R'{JE >׮'}?*Ͽ@RR)}CUo !Ἧv~K_6۾QTW~-R}k۫~. +MTל~R}k}o:?eqZ׋TQŇj|Bu.ppP9Ղ0}BUmk[S|Lm{{kK[~jm{XNкVߏ9Dcyߗ[X&>JP`C))jmQ/vO c'TUp@EI|9D[=Z|.QZsw UCs+*0]B!HT2B#9TVG%BؔP|rPnW#k̹*BU e^PFR(**00-7nP(UBs}c$X)֪֨֬ϬU7T֪֬ϬUbxfF37BYP,gVo*`1i,ϻ/BΘ6a9yhU8cHNMA_w*L>pɟࢿ:/Oι~ۼڦ3./nӏ,p_G~#/c;Gh;[Oyot?FҘ9%Bΐ C"ڏ1sX̏_|+KۚkctU8C0Q9"<_vPJ-t<"P+h_+pm?u^ qksi+95BHZ}*7sPh -ڏP q'6PkZ2DfYEPR:Y<tB @'*tB @'*tB @'*tB @'*tB @'*tB @']Ch/;}{ k{?~;}{SP՛W^YV6vmeo@BUmNGO-02M]|BCm/BU_c}{ ǔP̔ǔP̔ǔP̔ǔP̔ǔP̔ǔP̔ǔP̔d)kK.}?j=LYXHrNצV[Ly2e{0ҔP-c>!eod2]~lݿVj4,,`$Zu |wz=C/חKJ;*T%=Sj~Y-) ɡ־h[hP}:mV[S־!BN_׻C~Y{Bcy^ٷm1Srqvj7OKV[MV?>cyNmc Ջ+V؏'rk]ǵԿ[~k>n;|,y^hvϽoΗ6KXZc{4 NJso;g__=湔-|Z}z|.sYkU#+E_C9՗9sjךպ:8ǹj#ި7\x"oGHDc^Kc;=]1m״km{>~9oǩik[.~~=vOztn1~Qz+]gRx׽O٥~?^ϹjmxC ˿9Ƌ}7yms/ƍ},]bZs>Fޓ9j˕8>:\~OR~9Զ|\O)U6ufqLK~>|_۵_0 }j7ǵΝ<|^>y_"V~ߌ:Z}{Rۏb||\J)kmg=Wh>֮Zr}??>9OOS\/~ҼZsV>FV;S,S1F0/^ibbU o#Tqj*PBNU:!TPBNU:!TPBNU:!TPBNU:!TPBNU:!TPBNU:!TPBN'ןo{{r^=Q3e)}sֶ{u]6Zi5C5;̓}瘩u]Oq1]:ki*>i>sT|@:ޮ8ĘvZi54wLu&7>j[?Q7kz7?Xs~;5@>o7>/yOn>k :vtv(]k/Ƣx47\rD},|~5|=Ƿγm|v]Ε_m׮z[iU>um$T%>opmǛon+=D<^,¨9uL,XKxŜ3mKuv>oХ{>ߺӾ'jnm~{\kehg:{V7ï+-Ӛs+c9,T #[{{[(Y:>e:8v'sioܻOT}uc=-s<@k&˵ΙqyKmats4c{[(Yz.OV{`y,TҘkT8v6dqi|<}^xcEsvmsocb.s._~ꁓ.'kSO?5.yJ[Mi~\Ky Ox|/j-Gǵyu~5!o\>^k_۵.sd~ktoM- 1c1~&c|s/"־?Ou9km |tq%G*ǩ>NmSYn~mv[ضmk<<}sc4T,z;{|V94BF 3qguPWӽuƟ?YvEh7[v2ZO.sH BPVۦoO|Z63?s }7YX,P& uDƿBG?}ݚUi$pw㿯,H/U,-7w>buw>̐#p}ߊt8Ưji7I;#rgmoYN5\{둏C擟jufW/pk2+7z}ۯ׬rl6ݵnqϹy=iim=pw_W+Z:v:{+Ο4{'[8G}En)'k_*;6O]mQo>Wv훯w?vz{cbDzޏw/׿׽w/f?F'?{x{?[/wͽս~"ouк}ׇ7y?~{Q~oܽ',c1~gp48}n="(n P7կOw!/!NsX"mĆ`ovwC=ܒ0}ޱe`g71v սu'Խݽj|0 b'/ڸh;voǠ䱓.oL¿l[_xgphm-ps )Ц_[Q7!-><ҽv?/x77ۏ}N.eJۋ?xג:9+}w/''|LGP~ƶ^^'eV^f?gphm%pNv폝(s w3/N=.ڌOHV/W<6=:/9BOƻOR|2w08_geoOk m)>Xtz79>1<?v/gY /uKsڟf1814?338]F[v һ('dG7p˯`O~ɋϺސvs(ɒ8:Ok[d]lOq'˂r7yx??>k<~[xTlw8~.|_26ε? S;ʯw{Q?=?>Obd<;0r?''r<}owqDhsc'~?_)=o%Qhm,pڞg)xG9ӿ0~Tt+y{>AO|{5w^ wg;op468?>&?q`3eOhcsA:l‡W[,ci.Խȭnw_~Vjtƿ .pxb[BۡGuim4pƿ37"pF@B߈HhCh8!78g>Ztj wp*Bl[ g!p8 @g3Ѐh@ 4 p8 @g3Ѐh@ 4 p8 +ίv{uO= pBlb\{S`hݾ}8z! 1n-x8h&ĸ!78H\;NAu5g3Ѐh@ 4 p8 @g3Ѐh{\'1_yEql@ׅ>yg8utg)'38{;99wA]ӥuIw{z\wuvm }cMwxA9ʹb}O,IZ`&vk KI`qEeW맔t~lXW?p.6` jlh;g1p8css LAr ’1|4HԀ.[] <ƶ|Rf$c*}7|1G5j1eweG 14=-,Ծ6*h[fɚG6({ . 8[.8o˿WA[f_F?FpkUY㑴zp9D [xxd륗iZ&i("p6˰j`\q2vz&V9MQyT#{Џ ; jmn!p);tN:hly/Z0_h=-<(3j9ce<6Ҽ2O$iy`|1F8caS|~8o]ygzG5;NJyŹcΧv`@ 4 p8 @g3Ѐh@ 4 p8 @g3Ѐh@ 4 p8 @o^r-#ӊ{su٣E:._uF]α߫7[7k+wX;>%p.Pp:p~0e0pOvׯJݴ4pN떁䘖mmı\MFs'd^ҰSRK1wc9vLG:O_~obݸus"kA^${ke 4p߆J-pAX8by8"hZG_6$LNIt~ Dz:L5+P/|/v= ^Sؤl/Řv3pN`i@<]7QyCKh,nӲ-V#rA]&CkIl"Lu-s rF;Elר'-6j2e7 偳5'r`;fm'+~ly04݆pnԗe*{XdvAhص%_<+;9O1Y~:uoAnv%o4vY=wLi;4@U8'\H`Y1xmXc/gX+;pL~mۿcu> diVã5ZWk]8ƻVY3ُ2Y1 AUynA z{&˯8_no1sYΣ:ocSvy07f]&m/S\}vjV'?σ25˜c(#vkُ =ǝ[^~^䧿hc^J Z;S]8ؚ@mw2C`+> K3{s_jOǛߥ4 WX9q0>LNם/6߼~JϹFlG/N~80a3&g`3ǃآ#c>3ǁh@ 4 p8 @g3Ѐh@ 4 p8 /G+tg뷴̩,LN휦KXu:E+Wot4ofDXNHhCycڬ[=}oĘ6{ݿx_=tUCp޿q󥳏M=ͺmwMimݾ{]g}Xp}wO8p^,]yR6أ;;]'~cDc!?4u)6Is/˻)F14sk֭|QmwzA0뭛+;o^n:e9kOyNU92=?嘋׍/}ܘUyo1}{%eiu-l\s}\GSK2sj96;sT}*gSgʶ^սb=\SuVsϥxœNfKt{znmɉI7Ag7frr''%p֍S!zSW^ yu1wسکGfqSquQoV{s[Թƪusku5{˵BorT^)h_WWmojl=\YF_f[IOxfgW>rNZ':)LSr{49^.쩉>t]ϥ~R'o|Ys+X966gjU&֙G>:z_+/Oӧ%YlK;fM9sڲ윶9{ƫӒ k}qm^T_[ǫySckŴUrzZ_6ozʺOUYe4++'Y*ήXe>?YoKߢF-KiOף嵠mqZisԱWWb7.=r z}o% p˴Q!b;>֯ĭvƤ}]𮯯ߎ=es-_iޜ|X[[7U+kU-oޡ jXuW;-}hqk߯ؼkҺN-osiY5Wstmcy V:>7=C残ߞ}Nmt]ϙ~R'o|Ys  BPKi-9y!z<'K8y;-_;iԚsЯ紣ҶB]]-z<+kҼt,g]F/ߛF c)n\i*cYy^9'= B@sv.Y|yjsyi9[sڦOvjyiڜs6urKuuk9y Skzm?Wg$1?bC xiϘfo|-Tjy^Z-o\=SKf̳v|5/yctXwgFZE^-O[+mkj ֯k^4K^ϐ4ߎ(F:sɞ9ukuLY~#yqCݹ8}TY6}Z%h:&6g[zsuꜴu}YiuaϚS[iZx|<Srrsf,uv> ]׮=М= iq뱏73rޚF7(݉u\4üj9]^3]xqV;3_mgθ / ypI\Ok 08ŝ67& $˹:$a"p>"ُͲ'bӆ8;Wbm&g3Ѐh@ 4 p8 @g3Ѐh@ 4 p8 68?׺_N pBb]فk#qgۆ7ĺF 48pBl[ g!p8 @gJ3GSl'p6'C$ ĺF3Ѐh@ 4 p8 @g3Ѐh@ 4{\'rq>;r`8A0L߽׼83N8T-p1H5/\K t8/nZw;1wHL,'ic=~{4cΝ.ӳ`}9ű7P;lu, cӶvH/ǃP?Fh?2eg;XE;\%p6XJx^鍷_3ʁanE@(_c‰UNg`Z^L+LӖ}%iq| z+U>noˣF[ uKH3 Kl"3d+ Ќrip7zPe0kiz<_* 8'q#$q͋o~gyVkYVz\/pвm[(H߆F_/U.O+#~i@9cNf p g`}@g3Ѐh@ 4 p8 @g3Ѐh@ 4 p8 @g3Ѐh@ 48֍{+W27?;;7[ﮜ=Zr:? Zwn pezy>p>Ҽq@80p_2u #p\ W?ydwM.KnOivFQJk޾Etn:w/|B@- 1.s79i_qx4W+֍Z0w-6ad%Av^ѮQvμ@g+m*`s)n^c*ze;1`L!HJq]OkN7 *{,k]Ӊ2< +blדk8u1MBi\hgz^0$Fģu3G14p1-A`5X1ۋ ge;V$h,t]'2w/gSxz+2_m'kZ&}P]8[sҾk ,8fc&?vi[  cJAm'fA}Y& 5Hn]X±U/bWSvfQFksǔcMtPus  %-׆52Z-pʈ<tW-G;&˯:_n쳟{O 89 |@vf=< PcuOەy-k^c n9ie0H)^Tܘ\^?_݀0׿gs;5<6. 1eW3p^|jf@eц>p(k1%uѧo/mz#<,_812*iph `asIyWE~ˁ:10冀;Řs` 4p,Fzg(3i\Q Ҽ=8AEllot]J#0p5%qyxy:mo{mv^8yr4p3F :q a"pN8p<-Z>Q<~18p@g3Ѐh@ 4 p8 @g3ЀRx;rOwv~K˜2iž_}_\rFwKjNĉ^΋t6}9T=ͺmwMimݾ{]C Nw1_5ޮ8_:ycڬ[=}oĘ6{ݿxvG}E wxB.ޥ'e=zi=՜z^rgY.=1,Ot|>sJ1y}^r:k99;R~nnL/:gݝmys޺Y[6XT/s_xݘyǍ^Xuw*f]ZCWWb[f]ײ_5Ou4^$o:FzCo:7oNס1|rx=lkzU+Wx=\n1\:ω'dƸOVٖx~y ?qc&''ߺ~rB[g8>ٜ.^gI;|iWYcoyqǍ=xT~n<5?GZqjk빱[/;g^n=eټM{mZ<[[Zޜ\+q&OZί앢Qiu~Ɩs͕etkuNtkvvl-uס3\=տ*0GrΞCe\Z'u7?5.9׾e3mcsN:1گScVWΩ_w5yy+׫מ(W'Uk.u9jp}5~&V9V95_|5>Gwޖ={[.i/A y. 1|@ mchCys|l8 o9ƣܔ \עuG\śnCu 2.^,5,vyه׮=|:^'TSW8Qiu-_ȯZ:Zkvϩn)?_oN콩z{[LUL+JmaoG-/هU^jsrIFmωv%\Ӵڅo_8._fuڎuێxk~)M `p7'i<~ݶ\ƚ_6x}8 @g3Ѐh@w_w1?2ˠvZ]MЌ_#tܾ̘p8ܦYxG1yvGvO]gSƇb!p޹]]G1yvGvO]g}:$/ ^LL?8wjypahec/=:כKvþ~R)?*4cV.Gʟtyk*csܷW{;avkߌ~53d^>W_3ƥ}'poayZ\в kHp1^s݋S@iteTk*c8P9UiֺyHۚ_>>sVU9RYF3٫ٺYv9^9Ϸ֩9y׈cs4ޙCeY'u7?5.9);Y/r /Ϫs4/OcwcOi:zN;*m+ղZʳ[*K2p~fetXm2ϕY2Vsғ-4go,2ڬwN6ZV˛Ӟλ:mli9gS^]-Wˋi޸8]'8[H+vwn)>Oi{Zޱ7ٹ}h1^rNH_?4l7-;Ske奷_Q5wM~nKjJ,V<zsv8tsRIist_i~f_掿u\Z^m]V?74oθ8]'8[/^+=0h~B}+Ok4/Oc^cͳԴU[|cĝO[t5_g}mU;׺S:j^syL~S#v-ߞ>iiFA۩wNBuNZf+Jk;4m]jyNXjű{Ҷ@iڱEMqy !Kr}h0J_ZmXgϔG9>؝GeeL]/xIhjls|5W=']I_g/Nmїf\f_Ij;UΙUg8_8%'8o6Rgcp^p߅q-/{cY謿K\ϐAM~=S+筩adߎ۝XE@3̫uйi5u]S:UM8h{eּtcL/iciSZO3V25/魧׷*i9vkz8>qZI0aCxc@Ibm&#,q"6mXkqOs.a"p8 @g3Ѐh@ 4 p8 @g3`s}{,ĸ!78>'xmqCo4;pB!.Ķ9X)p.g3Ѐh@ 4 p8 @Ο]yoӚi3U7]5SmK:C#NC^[5M{f9SwE7?]ϕۮ8SNc68?=t=ÅM-/tN]6܄t\:99/cY uNU _z5Xt̷jw*6&8 SZi۰N?lMHuccs{*29q)XgN]Ů8o,^:ZN;iom7[܉gqYO:ܼ6ݾNGl7+uG:k\}5?,\Q#3N?.]|L:7 O_1:^Y4h8NMx%߶~T{ScwdOe{oŽVgWۏKmoG.l;;'H\*11yγ?t=_CnɼI_ғ:Hǧe+{&˵}ጣm~ )ҽ1tuzW_X3ϭOq,/Y_ͫ_^_澾k'6㼽I; 'ǵzwzoXqV2I dYVu+2˗Qyg7ƺ\K-_T;X琭ah#YkwbRYq U.iy=w׾c7g5 ^+ZF~۝n\S\ #a뚦[[c|έVZֽ\85:;:빻7ܽW0Gunq[9[9~bچy6hsm44kl-%+uk:x$ٯ=4ޕyMsX֛*޺L%8ƶ<:z_+kW+SҼڱ{CiYMOӬKnmW6g{9yFW*݇4FH{G1ּ<Ϳo#{]\<=3òT_^~2o Bz'Zr \cfxֺ֞q~+2|vs+롯ɖ:9,,m޼T~u3:o}H6λ{Z0Y"NxwU˧e= ;6_;Fx׻>q[Ɠyz[u2Q8z·}mr׮UP\KN` 7;.6d̏&n̬-frV/^6/_γ~imduo"֚yk:rFxeO\oP8|X#]osjy`:v4/ضNGyxFv\ 9-ZvJ=l.p;^~Z5ߝ9/=i[UfmxykbZm>^ZrXFkoXeZ^ּV}ǚyycRGjڱŴu*WJ[[ZoiT{:VэZQklXZXՂU4ʷMYxe[jy!Mz8yڢejǚҟul-p'+gqnڱk^T݉yyU?ƔXz~yچg`w}-2_1,4uc{3orX۶:A˲ƜړSm#?qWmv<< a}^䟐myN}"I_MR>pR8'f?[O?,(eP-mYi10uԭ%?5]-^@ZKӼJ:jZ^Lƥ8%8Zy+~9Np~KpJ$pր3 ZZqxx̣e,Ӽq1N΋gk@ic Xy `+V;>7:}Cgeqfc8]@g3Ѐh@ 4 p8 @g3Ѐh@ 4 p8 @g3Ѐh@ 4 p8 @g3Ѐh@ x/~__sΩV?闺w}9-&8g!zꩧ_x> 16gg,ޝ -A4oFXG]u8gGt4s{X3E_"p`O~ڮkkoG :"p>]kΫQpO~ڮkk|.mSE|Kv]8Ǿ=Wonm*E_:ǿf&:kW=9Sv=ݵe?ο}o.ovIοz[to}~\|c#]uD?k#"}Ӷmֶͨ8,ݏG8t?^Yrݯ!}(3Jv]{]F6Qg[m]wpXV?7]v@9kt^z|X8w߾8ݯvv˚~Xtm׵9fLH{[w]k.g_bA[8C?|b"p`BSO<3~1_XG]u8p}S=ϭBǝՄuF8 @g3Ѐh@ 4 p8 Paκ$=FIENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdAccount4.png0100644 0000000 0000000 00000016630 14575630005 025644 0ustar000000000 0000000 PNG  IHDR{._IDATx^y֬d;pA@̻Ab@m -%L1"p \$ Y($"`ˤP U6Vꕪ霙{g33w^{?|d9gۜ{ٹs|!I (@BP A!B$H  !(@BP A!B$H  !(@BP A!B$H  !(@BP A!0Xe d xRYv^L {6[߭s&c|yW5*t^sI?e꼘7\%GǏyp]/zDONI2gr+ {,([:-Vʉ+?;#mr7wt:N]#f¶(?L8A!cϜ?ķ-9*IgMdny|YA9dA@:wϺp> 5_| xPґY@~ˋ;"_TcI=(__tl? h Z1 (lkj7Р?x;˫u'n:_fqÎ+a(5'Ag2\rYZ:F ǜ$tAkhϛ2cP&A\`͘s˾UzޒF+^^Xc[O_mWUfoe\^Kn.|Τߒ}9_0u꽧dӅwuy>tu\5vlz}[0 ݕA4>œ;a/trjuD.YTr2ԧ,?+ۮ&T'!_Y)ozD~r4=t~.]A^_.Kθ^=s@o'} yuBmˤW_ _}^n?$9+=I 'mΛΒ%'\&?>VoЦ#/mSn~A6x?W3qR]},a:ʹ[Va1e2z:v3<< -~s[͏AnBn>,ٜNM>F6'R|)9=vK+{zcW"k0ב;.GdώkcJ&Q]RHOz>m;fVh0| ]0#,"_Zv쭜:eIo_I)=X)W0\s^92jXZ~^1w*d/u;՗ ,.Y\>?y6hT> P*'bN{ʼIi#C5r?L,}9X5M_K hw m`F, O~jeu3^GiPNwί/xXl=}7LՍ# d <ȝ,vYvW ʎ': A,1ʾyI5hafRa8\#)Sc.}BǠI{}97n[:GG*1/d?5TeNsJ`W<6zx-WT8gQoQ]N}>L12+bG+ڜ3=Ki,O)>RZ_ rq5+ kЦ) NN 8!qȮkd{w6sξG:F kιU_6&uݯ ,-AwZṍZe:Y+? 0Z]/.u_Tn~bQP-v>\ ͝h+fܷV6| F=yu;K AW垃~j#jf䞍rjvS9cˌ`0F;kPOXAלswwuݏ;[@*[P\ue(?y񭿖V!_.͍l5~!7mk?]R3 n`839޷=3 ,|^rrj7?ImL5:rs2ae(Ƽ=/!y{z ٘ϓe#e{04V3k9+|cM}{Cv r}U_ske, ʗ~շ+vp@uXkͱѦWo|l!5+AÙT|~Hf{_C9 NL=cyRXw ifSؗ@k@iLnV_0 8i'ؘ:GߑgRNMõ)A(k9kFcd>oket͖`nMlM8{'. Y gCW+ AO{,nI{ KtƉ2~rґO $m]ublzӠFdAa;.65`P~3ϰɷrc^W~Ă3wOZmgU?́v`H QP^՟icfaHMbRNnh+G8(tv5=`S6=}l crIy騹o۠s;%W=YG1~l:O [mƕsc~}nC?%RU&~cLO'mG- 8 OݰkqV]?ɪg7(tWcZ])LME~NYǚo[mf|sǩ;{:ZQJk:NZ:OA^0(,rO Y;ܷuPXV| {̹d}?P]|(YJ {?Ӳ\Vf~'?^^bt\J푕 w8OYe}fCAކS+yAdzo]v/XtI e ;d[ՉsR4{B4 %O-_=)O?)DO ',[Fٷ[/<5!wm,}Vu'HjJz;r㞀򢼪Xle_UxĈr&ۂ@L*=#Ù URhZAa1/_+w=YzGыwW'AaN}&t)5Q;? v ?V[~1ɲ􏆇y>(-GǹY/E`ZE }^x*)C瘺g5YOC🿚?x|xNnrѪ޳o;9Xyr N2{7O?յU B3ݳmO>(=33ӹޞ=c8݀S13.-ƑK|o}m1{SC=hP+6 OP}1*i7gyקnֲr|+bg΍+W}v QyݳqU=/y[h8BS|=|8e|1BxV| խ8qq,Hqss9nSGV>ǙG7y|ܹ7[z( (A!B$H  !(@BP A!B$H c+䑏tz7oT't:s6f:3in< O}㣲C-GFy} lYקC#ŋ ki=35vfo ̖Ge-21]5'\u}z k+mfL D_P.H,]%ty+#IAouMJѢ @AUT~VUw}5k*6zǪizut\FMj;DQW.ϟlTWx-zi#2 $?ɬߢN.Mߥ59iP9u^7GNtw29YmgqܕU6Mh^_/?V,Oitbm[2:imt/%$-l, 0,fv?~$Nz[W򏤪?Tj=]nyk?kv>|Yfڶt۾[n^׿~&-V_ݶ*ӚYW7 Il]ffA&i y޷c''?VO7w?2OW=Uƽl~ֶ*cec:*wL]zy~u~X۶XetZ64+*WfP&ia1AaqR)x+^+|7M':tvΫnǑdX_'%𕶦c~k7(>ytu?{FӃ+&*=n-VVwzH~?4FU^0f=(t7{v꿍Xd]M֡tޮ.}j{q+vbx7;NⱶbPzF*4.=/޶*vcZWUýROh|aPA! @P A!B$H  YAa/9Dž1br9mkj2,saY_BZ_9_z3tXڴ_M˅tf+H\q?> N=\ tB|6fn!鰎i \\7 1 }Duz{&j KW ]^vY~w?=zWk^0Z7VWj'J̋wr5s饺_H_mPoMُ2l;vuuzN4T.pE7S>ͯJ_?c{4:wj-X!Vg>v?6q>\/z5X)YY}/LֻK/OjtGOM5?^W&Xg۾7Xg>9^{͵3ݏ0Ck_;6~t}k|uq(d؁U:$n1?^:$t_YT^BWw ~_F͋/J9|W鹴T `+[B\zAt:}lX}߷J㨅'~l]8v_{9܏j:ngpTnUlc]~{h}V8NKlk Xmd}fs5JNcQ|']gl;7FAaR,-wB~P9wXYV_N+K\ ymUeȸijZoiY8TE祛-*W_|KYvzCeu{us崙t_mX}Zqb %Nx۱v^/dg_ \>^ӯvg_/[B+͟}.zyHףtޮi"6~Uvbun\&7?~(=vǸoUk߯s0ﭡ:f.D&xaZsި+3 U<58_ba"(lma<,9Vek ̅Z./pœ K#0v0"(A!  !(@BP A!B$H  !(@BP A!B$H  !(@w_gIENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdCalendar1.png0100644 0000000 0000000 00000016163 14575630005 025757 0ustar000000000 0000000 PNG  IHDRp:IDATx^O$}7?w i'y/u}<㋍1   i,11J,td 1&QUYU]>LgVFdddu+k:RJrRJ).RJ)RJ)&O>>}}7Y6WJ)ԙ_>tWWWmRJ)u? 2RJ)TRN~(W*=4K[|}{$k횇gi >ҽ8=S)ZZ)K5ħU3q0 ۭ/' v݋2?Tw M'O1ݩu?XNݟRJCԵusL0t͕bdu`ڶ6XWwkz˩SJ)uh}NL>[S˓|ֵk,Ϟ=gu}ۏe׉>Xn}>RJ?i}W/zkǵ^;{tLm^<۵˰͓/M?J)N_}p%S5w25&{7! я Ci2ۦ<}봸]uO׻=Zoe;wxv5/RJY<WE8 4+u@6~W@_o׷+mtWk,qm~=0OR'{~HMp-+7X*c~}n Fo?qK98}*:inۇquo-Oxwwa+qS} :*t>˫z?[ŭgj5u58mS)ԩj*U3qgøRrkwuX ru eYvz}ZUUgWfEAUkU;qc,B_/onĶpJ)NRT@6Kշŝ>}.W+R 5}/!RJWJ)eWJ)WJ)WJ)WJ)WJ)WJ)WJ)WJ)՛7o:  pH@@8$  pH@@:(oVWW7ju3tr]Sq͉:nE=Q}bw:T ͉^u7uחr"N8urq}m{}}샱ca '9u>KC9}>KƎc?*yj}}խnWWnh׫mʾGgzѯۿ(3Ov]6ϟIv|cX6_e<3sp̭}N̾x&9>/gثێy9~4m\YM\r<3ck^\yܵ}|}y%77G1{sc}N碵:ڶusxL$l'Be99)i\7wy̭c̵ܾs>pfycjhosr_e?Ku& 7hx>Z~xҒnov>kNNN$7P'Kc+}ߨ5xurE %,xkoM6o>)>+co>s0-].Tl_r|li? Kݝ!7~sMOqܭ[%sϣr>΅s45Gwn,9o__8AX'Kx}zTvlfZcXWZBn}[=G~糲n}k>k'}wXgk}c=6Ѯ2qBMl ~>[돕ە[4hj+{G5[~[q{)&F=~z/R[uڎ7nӏspg>Knju徦g}>'sb}ض^^۷>rr_eSS1Oֱr v1Qhq^{ar@cvp?5ǎwp,9i}OַƼ7xQ5X' 7 )nM-V'Ki3Q} Lzv`>˾K /q|py}re_%1.|p vs33rZ;녟\_i52WߔN򿓛q;ٟsx4`~ }T+ jY8c k}MO>yʜ=ܵ)#C4X23;>^fcTsr{o߾qLbw zxX]Bg8Y qy_c.x߭>1WH|scū^]c_7uypvrxs<|1Nq{7͕z9@/[WGVb93mϓq:x۵v%{7勋:7_{ rJ.mGi|nOsπ-o[+@Z~?7PM˷}Bj\\+C+ ߄3nFOju="a:0c\\woX[ZMj[ }8m6(@K}}W9|yk9r}}Omn0v.cn6~pq]+-ISZ׷kAU}da"|مv}w<8bQ?/,cM=0\j'[>ͱkn|li?c݀yrq~[3± r~ ݖޅ]J:ƍe[.wgs?ߛTnY{ಯb}yۺ||}5cwo9EG8/"دYU^n\\%^T.֧+_ ۥ+)oMMqjyMffz}Mlrxr?@o^w౸O՟R6z^ pbNtwq|F>p2xҿwW?^K_6߉Bdx%P+i}]~~ls/<]IoD7ۤ6}lz>VMe,meˇڶ)?vtIK9sqaa-]m*OmR۲]4:{P۰z>:o{g\kwߦ6}HެEx%߿HoY}sy c|..˯]Wm Wʼ-/߶+}x1ux}>'^=ތw0EDp>oWWør>|~b_O %m*7|v_׏%~~c8 [~^a~KM˷w}.Qk:W8\\Mlo*ķ4]?~dQS]q3nU^:_[_ ??O#K%o[^ mr=-oxXvX͝gO\7|.2J5>sp>3ExD2s~>Dx89x+ {8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$  pH@@8$ ?~B4?圵||}_"Mrޖ[)~O>~鋔ҼY)^|ٽ~OHs!.'S9wtu)9JsU`+&.4Oܕ-2KsU`K/#OKI/#OKI/#OKI/#OK~'w:;~Q9Y#"""3+'H(kg}<}6?EDDdO?mo5l9mZe]X"""ROɟmҼ}]z~h?y|1Ryܤ}yYy~;ޗIeм<\fr<$p{ MVe;Yr=喦=ym.oyڤNQ""2i&-]W>޲,uY-h3Ȇߦ[~;q}=JO+eշ/q =߷MpY7ۻVa=l ]Dz]yؔϲl gVu]f}Mq:C?<:ࣶ)""Se婖!ζ ׶w}(]6N)/doG/K횩~6V rW/__<˿`6r""2IvӼPZs]!wE9YDDD&L7=9}:e-"""EDDGY e-""i?6'R_(d,e}IIQȘHQvXH餋e-""DY_C/@Y!9CY5Us{oQ-gyP(!ṅgl6۹~L0ȣjYtźc>4Ϯ|=͢obe}ocY;^U__.K\DDF'@Y7WǦ2q꼹֛ϯη_y8v~n4fw~-wuwuzY|,]׭{*l޳t7[+m6w̩W?J;uf Bo߻1y#9>m};olQ}cǞ˗u*mV׋eVez]?-lvN6fk8yY ~{޶0Z6+>n*J}1Pf7?ەUuhvcƨͲy+ >91cz}7,r=E:}f-E}ޕDQ雗%ߺ;.qi9cjNuWLwr^>E}ejwՕ}~1c:=.zY;ccb-_a`u~7+\5}wemڲoq\.e[Hi<R<׿;/_WPSawo k:T,#ʺo?.<뽨c|۵ǽZN_.Z?oQ""2/Ro]2>җ_~< I}z쒱5 8e )kNY@pS>GEjϛo@/Ro]2>B:_C/Ro[R:6o&D?NCY!}:JI?NCYahCގfrtG)c(#(+ZDe}f튲sDY~EpY5Us{_N?fv<{((/o˞iڗ|Sm'f7M눗fK0]Y9︲.畯C\?Te=4V:E,:yݷ_啵#Bó溼nM{{ST3V^eór:ϚP/ofaC}ye-"Hܲ^>^=rLw;n6߭ǯM˶ٻrռŴEYzԚgpuغn(|RRt:V_*luwżTr}\NumSzYnaXӷ|ڦȩW%-WE-Ϊ|r弾~Y_ z6o6?gis]z~;괲T^g:)j=۬<c,33v+k9Gb4ŸZ,]ֈzv0\eJn%:kgZ6޲2oXq|6X,}+k9GޞnMOwߏWwݲŲM)JYk?+>Ry|˱jiuy)R[^Y9"<Mwgv;cyme?NMl|$qytY=1.b-=f~nFZDΑeyT-Bo*KgWfξx f=\>{YJck^-{sLE/mRjvUf_in^ѳ]ǘ^NڍUkwgSe,Z 3MsDYZNe-"爲>3evEY9,OȾH1W͟?4*lL7R2>GQ:ROH1 O/``#Dc:Q5 8e )kNY@pSyxxh~4/^8HZ'[z"tvo:ir<PIw&[z"SQ9UYgluuf>jn|u\gJ1t[]6gvzFۄDNU;|})j>޶Ͻ^\1EYODYN5n lOYW8fcց7.=&<,{^|ط|}֣zڴ1Y/w;oqu{;rr޼=1R;rU3_Uwc5V~w^k}Zyjo>e=˔₴KbM;7jE[VCc;f;smƸM2vl/zٗXy}=s>uXwNkTͧ'r{^+-mQY^+Lez6/xu.Tn|ozewmW9Wm 5}cCz{o>e=e^uS{,X^JrQoMOwi}0r;C,+rTn|oze^wmۭ.3r[{zzS^Iu8űrǒt6}0v;Cct_9<._^׷Y,.kyr=uʱaz{m/mÛIYO$lYY^njG ty3d_=qcbS~kzvz}:;|!nSN9vuvLz"/kЀLYO?5'dZQ5 8e )kNY@pSDhI1Ev9l(뉔|r<P)wn~KYO,!/E~e}7of}}msysՔbk]9צ'RR>eYy7Wya25 zcYYA/^nyI':^ Q) ONwz\YyWk,i뉤;PNt'o*;鲨Ӵyx[V*THw^^ow[חzĽv|,+ۼۍ~B7ܟj1ogwžyDrԣ˺zqc9+żn)V۟[C?oʼN黳z"e]=貮ne9 x]K]/C9n޷^6r+_ٔD zTYO;뾟וrj]v =!UGYHYea~O=*O'|]nSov>t k?aͦ'R:κ}]뾟+Gw>lseX3_;R)Pxonx)<*y"sBx)kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@pS5 8e )kNY@p?n>?1t^)Y?5~_q\s^9^v}CYÉ^j>>K:?c.`4|{7.u:c {}C9e '>Ix K'ܕ]>tӹ/"k!j.[/׼,s*0Spb ʋwfO;ˍq>c.^zoi^ݵ}(SWw^iaP0Spb'u!^g㍹x*uGXSWw^Qh 0Spb_j O=B̦W|:1zeO_ۧGew̫鿫\;_no_se?jC|7mݏq^{{/j67U(L~*gw/< V"/s޻1eΪʲnvevJ1/]Gzz7m~|R`: ?-q.V֣?=!3}x_^ZFYã0,;m޵zzA;1e=eם.]qg*M*nU,r߾memݭqG3v!7fzmYX~)k8/`U%+n]=];{c+TYuӲm~͑7fvVwǐHYu{alYWwƚƘ{NYÉMNwG;Oc,eycϷwoyR]hm۫mupܿQlKwul{\6x{,oI.` Mq`}杧Gw\S֟%_(eoz/q}u.\c֣ڝ}:)Qoߏ}`k}e;q [fk\Ys -И{NYÉRL\611eݗr95Spb.`㌹x)kNCYOk=\sR֗5Spb~a駟vO:O+}o~[$V:ܗ%qƾsN?n^z"#t~y*]Osy:G{}C9e gbOmrJcYN/1E>5 8e )kNY@pS5 |˟ IENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdCalendar3.png0100644 0000000 0000000 00000016524 14575630005 025762 0ustar000000000 0000000 PNG  IHDRw IDATx^i\uK*,a Y,c` $&P.SE2Նa0fE*0@1H,b@ĢH{]{N_]ι۷[={h~ r6:L|Z(>ZﰓYuScdjjWS3`3;  0 C`0X `94;  0 C`0X `94; `/ɱQf0!: 6GtuxzoW/%!^QP.mvtoڸR߫+Xek\l.qӦeSekkd::F'gNŝѸ.5._jWO_.ctK%p$X\'jՋ{x=~&F5u\V/?VK]iŝv\JBb׵Z=ӗ˸~=ҬEh]]Uqnkb$dqNL৉ F]ӿ^67JJo1U-יF;]N])N q=Wh~k7揄NGgt؀U_~3bLJ7MhN|]3:ק߷B >giذ6%INwC5byQ3&XR!e1#aw y[gV.0D'wSҶl[ 2M,VO"kwmqUFe\{/]Ϗړj}Z}k 40LkBs kwH;2i5wkG Os7Q%Nu*gXCXbiiY/>F9׵_ucʼи"OƓ ņX[ƍL`7Uƺl7ڝn<0tXbe1^y|8!v\Ew~]2/4[eѻR{rذ5ts;?/.[^Q<2z͕WԶMO[meqͷi7k,wcq:^{e]o~\pZ9kBņD<wIًPԪoCnɲŧ]E-j?a$W;kCCxߩZelļEuRG㭋tq./~mmMN5ގи:/4*?d㠲amg4.VFyTaya0, # 0,AGAa0Xv`0X `94;  0 C`0X `94;  0 CrrrrrrrrrrrrH}A%C⪗v/>ˀ(PY^@2MWVn~XLPK>_n*p]سC<>Dh6qŋ s&~a.1w.]bĶzMiGe,O\Rz`P @D}nigw6HP]bP,@᷇ɿ6x^iK9Y,Ϙ+הFyTMܯ_0$O[wVH~.v1vGmkJ<*Ceκw~'Cy{`4Sq!*a@ۭ_{ ^GD[eCPY҇G)^v"fq.9aHiMG-^BАQ. T|/K/r<5{G?!汝1/O{=Z _|S S[M0ڨI/{~H|$'Wv_8f~= [)Av0ڨZ'=#悹юDHࠑϡ >Ϳa;:bzK0Z{vHȎK>qݛVVyo:ݩݜM^xU.6 "OϊϿ+_gWtwzZ}4JC_%A.Jetq:.Udw.>QMMGҷgkUDž'rdL^vig/=+!?<_g[t]V/ŹzB;qށ d#m>0~댧iႮ !ݫ.(6աVtXx4Me:ėw xGa,SnK7KHB'u"VK;;VX NoB=~8Ǯc[+sd86|/w̻n9eH; 31~\P{.uls0&ǧs28Du坱Gfq?U%[[pQ8!(6ե޴j:?a 4[+:(S^ʧqvkÎY"Qk5☒p*f->̼[G{r!~{yXi?Yl!1VCGb׍Y}!ŸMV,3qgO+b3km'O?_۝Yb4隿ш4_?<ݧ5ikI!lU\oy+Ns,'޴\X)یtxߦm% =)YOGhAH?vz)n? ڇZvTMvhBYә(.o,}jkqw<+M#O˔}r+s/TFy<8%6u8~qԯ%GOqCqzZnܙrZ+? S[SnYn?!)ob}ˇUBV(+V˓4_tXtӝ&_BAߕmnSRp$?1u]WtY}~&f|9J7/.=TdMfq>w8+|O3GG3ӛŤNmVW ONzQ~kh勉`qex;+y߇db~DyQn,xycmn-UO,1~l^UcyW*T\\~̽1N%r+[ydwbYYPX!vݦaqA#/.hXBy~E1)3/xwV ;moc74iƵX<%ډثC~A|AkCqzo!(գNm;׭v*]RSn4"qT%;1 |oʲX'<>dXm5vQl=vuG2 B}n0@uR9q8[JILo {6EwB?&vjR+kꓫdlG|ouOތ-\00Z܉EbX$k[A,vؠ_ K)`lo'6jyooOEofl|yVqc@R']׽J;/CYl≧g{t .O)2zA4M#ޗ-;\b F+uw☒~۶C:K?dCuR~)ŢF3uwBybߟ={M/V;6Շ4ʣ2Tp_D]a7uw߼/?$c"_:qEUH޽,A) FgyN1(NO,E{}[7o43T|(qW\b]x2uľ7lQ](ni+HTcHKS]|)NyG]=AiwdYTq C C C C C C C C C mjHH@@@@ŁWYj$Au.afq;+4 {.I0exk0r x}R{^NݛQfONl~|Ջn1H=Mq\JˊC _gʍD|;;}y]w?~=m :i>ݾ %5Ҏ7]w?~=m t&3u.씶vg<k^Y9^)eQ^DuXvՍP?vZnǘ_FrB?(u GtG X8|bw+y/:\lZ'_s{7.vZt@$뜽..w)vX&!VR)N:I͇jOgޠJ[|˾Ҭc}}ϑpxezFC+k͵1hkZ~}>ҚzO5x9{]Ľ6nŦr J+ Bgj1+K_Wy~jw.xGcT/Mu=|XyZSyk/aoO_ZKt@pg6;Ӊ6*ͱ mQߎori ./d=܆&b>r)U&)#+/:U^'y|ND: XswY6ډo;"hb,8\%;Mfo= [ncaeoAY=~T{芝}qByJ;t\ ]ڢ;a'xd Xg31?1ƍ /Vz(]++-Vee8xș#M91?S+Tk> |TMeoƄ{OWZO>w9&q:+hchb^?F8Ofرvm @@@@@@@@@@@@@P#W~;5qOĽ@h0t@ qOĽ@h0t@ rq/ V_$zgbmzThGZq-&eL2b1FLk@iKaŻ"_hϞ,Ɣ}t3m~P %H{,b늸YKvֈ{c7@hKZ&zYvVq b:Oט>A;0^1gkcQ~wڒS={dɴLS"L5N":vSyNT@[RqOs/RYlLvpݶ. k>Ʈ]'}; e=0h-3wClH|; u!12CUQNi/woP:B܃2t;mGKŝ`s7w{![!-wc& ivu8i -q@q/w =q@q/w ^23{f&? dDHhgJG%+HhWJ&w!w!w!w!w!w!w!w!w!w!w!w!Љ$XIENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdCalendar4.png0100644 0000000 0000000 00000006430 14575630005 025756 0ustar000000000 0000000 PNG  IHDRby[ IDATx^흽#uhS+?,ڼEl`&c0DN00`&q8Ev71Ęq`8젬ϪKV%<>z_WIw7oߪbDy]pH& !BY F!2Be&!L7B!0oB(3a!Pf4fzU7oިϟ?!Jy?>>/_dn#BUм9ǂB!O~IuC^˰3ږ|+ݩaq($S:BXisɋ: vЈ vMn21TXC;ԹBhWfqk5byw\(wUX̶qvN{0K72N阳ф9;Kk^ei?voNuEۿgvue ټ!ҫ1][+FQ6{ naRUh;}^:٬tսn58S=kgc{sXH#B%AͻٕA<1Y;L3,ͩ)[v;0;zs/9'И!(g;_:*72%iRM0]qm[޶뙥>0yys41B%ˬ]e>5fWf]e`OͯakѭјQi>>$:܅|p ?j^\<}Qc"JILvЈӚcM+tl[:Iow ㈺UTc*apU;exkdvyec!1B%߆Y6!k|2ׯׯ_e1B!jЙF!AF!i F!2Be&!L7B!0oB(3a!Pf¼B̄y#Bi 0o2  30o2  30o2  3FJLrm֙קƱ;8 K/gBk3K5mڟ1u8mFw^NdTkGO~N^㥎3Z>}w;ƾgoeݩO~N^㥎3Z>}w;ƾ]5Z1Vq^8kv*c~qc~gş.]r]̼6ˢi\ZBcŴÝ9lUt'6VfgCc79ϳN򵱞̌x1q/u~v]|;Wʵ86oAlolo)Fة_L~Ս7lo0ͺ5r{mƯsj֪Sw+S\8F@wknT^;bNm^z.wGN|g\8W,{U]Vq1dn)idlQ'8r \mEW˧}1oޜ\9<.*@Nu7c ֍۞m잜FbZkm,溌gur_Oy3_̦o>EќSˑG?u1gHvݰD*7nu}115?O7wb31qA삻ݰ_g&M^@_oc=N:Yx'ɀeH}Be/2oY'O Fe17^ Oh-΁Ùws;1suȣ^ " suׅ}xr]L᜚u5e&[y7ÂQWEa'r|dkm.279csq{_k+csw3F교m΃sG$?ڼ[Gs~15ʛB-CNQ&[fܭ{?{փz8yz]&7=Ϙ ̷YUo#KZ<΃ 03wGw0@s%@ 0o2  30o2  30o2nnnǏ=?=O9`p߫Gl=?=C8 GAHݸ<|ɝ3zr RqP͓ٯ+@~`8y1ne<;G1oiȻ"@~`8Iǽ?7)E~d;8TŪ.f[ޫvMͲhOk1vS,1mކa_'_eҮﹿy~`UQ.7wM4nǿ^jCv8cޛ빚hcbe2Wכjnj-MR]^!j_}k:]^?,uۘ2oǼGG+mPa[ҰQc=4cN17卡mכ\/mUe !ٚw,2^,#-Po,khZ'N2ޘGO/.;ov[u[cc1oGLȋ8ރ޼李7KP8yٛ7͍z||9+ 7u+ 7 mhzG=C  30o2  30o2}IENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdCarddav1.png0100644 0000000 0000000 00000011402 14577576165 025623 0ustar000000000 0000000 PNG  IHDRq#9IDATx^oEGd-7@@HE,G2 < ̋J({x@ Gkeu$E z6qbjH`B8$!\ηVK{hfW]U]U]ÏhttWaat{'OҼk41;s歷ަ_"b($lh7ݻo|^zh˖1"jDKHRoUJ8>>Az'WA a>$D[hU I<@< MMKxW|F9ǷJ6mR;uPo/T"!Bƃl7tSE Jxw,w-Xҹ@]ކPח+`SO=2"oJ%g{o gI/QFh.^F]}rBc$>>#N> !E￟JZbC>m]8J84ԣ˞!g1iYBdիG+>p-['W0V7{C(V&(XZ$7X /oU# Bo*W|EDlJdiJ10j.!ꩱeCF6A ]Qd@]JsF j[(Eٵ)W!+<Zo#$uK.qK/TV%=R"]wC/_֙PRFri>$2){1W&\~z_UF/hII*2gQ߹|V%PeD]|eVm:cQұ͗2_#h7ܥyHB044Dݴgi_~*FB| /5uʏR+utFj3U>,:4z1 ϗh[{~[7y:1|>!Od'$ʖe͛ 4!ӱdmd żx\e$)RS${v -M'nAel%LnoL,Exݥ^PS}сHkz/T}COSQA r'PO.W_^I8MJ] 5Bْ˕T2%X!kVyIż?LWX&xsuO{x{T9>_{v-`XZ9N ѤЗXv:yOmPBgBbI$&Y<F$55Y}Ж>B1FDY@2e/G?%C8 g01OH>pӦoWK;S_xE~"~ܷq ]$55y3^=YIdD#KB>N45lZ$$w_UfcxBԗdQ?%?ƸYUfgB6&SXԆy ҪࡇRnݻXq,A!'Yfp ģ/G dPd\W]2mtԵ Jȗ sτ$xҪg|XBԸ7x*3d)?j^qY(0s?l1i-F@L{I jm.x[z4bY;A OzcgkH΂BUX(#<~dD3簄 WB( EFt:|;wgm/T$aŽS488&KN|޲eK+tX., O:-,Q֯ߠX Ԕj/.9p.ԿHNޟ8qDW_}-,{nmݺ>Ɯ__eE֭ [|)ÏBpwWπ=8r䨰D?z߷̴}ܘq-9͢o*Ξ=GΝoLd* ?W__?E//IDtM?I,g-M]ܗHdXU ae9=}F ]"ΟV 8D;v^y 7 0K\Sp 5dE.b Dݻ6iffFYR"#kghjVC 2"=b 01)ei o B5#bYdC%!֭ &&ܽ۴m65NMB{kȆ?I ?I EBAh3NCP $#" t P:H(F$S ǩM]qG n0Vw !+hxVi؅ IljXo%!+޵ƬzЮ px b/nJ?H_y<#4PLx?l( Ւ-3)\ YE\n6h8ɀ*# tƢ\JWۯ2mm}w0*'a3j"*Y ,y!&d:l.6YC15WA,I5I`/E%&Vή фkflIr* }א5`X$bP,n~2>%t=HdkMkֳbr(%OPwQ53hOq !RQ gLOrU[e6  Y֒S_EfqWն ٘LbQ}P6ՕpO{/!zv{7%)Dxc}pW>;2HN1}ʼnaTDBAXaDBA0" tP:H(F$# B),'СCtAAZ!Ua 1oTqXHBސ % B~f_" $ܳg/>BG a>~f_" W$8M]rM4uy10IkzR}&:_wSI6~Uwcp:Xep#*{p%8  >Ͳ5s\BxqQ\y' '|LEceQqhkvu_pr=*$<:Xzք$I&㧣+5Bg6W6c#ޞ]eVՎEm8 ܯJH;2K[*ZB1:ZI'px'ghdܮ~ԦPb KXWA]\ _P/P K$6 pDBAh3/Pڈ=J(P/s%LD+#PA$# B ÈaDBA00 0aDBA0pM]qd]+hCPW7pGv8ʄ[7xViՒVR/$N/V*+޵ƬzЮ/*%!&0P鋵Plg;P;X~PFբB6h8*[lHkWhO,w] o?v}eƢfN.Zݴ,'sY*a2\!1Mw:ՑИdUHc'*g-\ۏXUmqT Ǭ2X}u`)=^;Bx|y&Z2AMP裕rS؂$Nh?B1>~#.72Wژؾ⁓* |" Grc͵vBDY@2e/G?%l ا_7Ր"k /WZc:|B.P;ȋe}eVz&qǢ6 N\$"K&>ymظnۙ 7?^f*31}ʼnD%$ŌH(F$# B @#G) ѣStHS \{7ر/Og޽ת,Bߣǿӧܹ0W|"3g翥 ̜ ǒ,/EXoa[p hS HXAp.) xϤPIB؉4j"# 0;܂cpM_JGSa*6._*2jo(.NR|{7,s.~I#V]ytͽ+wŊ%o_Y|toZ~ ܁C|'[pg (VIENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdCarddav2.png0100644 0000000 0000000 00000015017 14577576165 025632 0ustar000000000 0000000 PNG  IHDR9IDATx^=$g`2; !$!a l֬&!&`12rB0lvY V0:TwuWٳ53o_SU]߭}yO~Rt믿^{Q?RJ)}Ar&V6?ǼteRJUȩD*tΝw-ÇYp]"D&lY"ԃN#TLEo`l(U"DvUȩQU'~b%m%KtGWO`Df&L*D:::*s.]%2Ld4ϯb/Xx`WDv Y&2MdGU/RqGU.&Ld6eȉtbx֭[&2Ld4mʐϮ^vRd2i"۬B~r&LdUȉ?!ex 9w`'E,#Yr, 9@tfi`ˍnqA(yüYo.Fhjj<~zNpg];=uk6tmص[~L<!90Ya%MJqFC8uƾogkP~> {ng{=Ʈ˵άٴ7]}VjXǭn͑Ft+DfV{u-ieX|fqt8rbƎ{lyyύ7)ΌEB8Fݰ&x1,+jddQأtdq ucak_iƎ{lyyuiy_L 1ycWn :VQ5zcz$R{gc[A3 /jl ǔ6ca, qwmoq-~?9^O-hokg&s[^;qOgBLnX i#- g6jfphqt82:o#}5RRv\7xc{Ej=ZCwrZA.֭k0<9{dI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KBxq+~/7RJ 'EqS{YB"lH.zaĹ9[ y{漡B.' 9[` lΞ(l9o(9{漡B.' 9[` }8zFqtYO?.,L\qk}Ü7tᲮ%l<=SsD!g yC.zλ'7CqN{L`3~7A5QA&G=}ԗW|1εm mo 94BA֣#eC881kS,ޮ`n:#/Sa, |\U˟78=}1?=sP;3\4t_nҐ3C麡M4ݴ:j^N=tzhvy}P6! VkzC鲾yuep:t=?0'N! 筫tkN/F%lkhz蘦vC2]>t}clyߵY(mr+uOa\>ߙƨUmTg<4␳xG@ ^׵,Wn1tLcyS~ZV5h;ռc}#9+ehw{V`oE^=q.BxqyS#0RJ)o=0zaĹ9@ KB%!g Y;,>(K)Ê0z\k7 7y+RPU8WrYָwN?)u6KF/qB5U`E/qB5ys漙B5f/ 9lΛ nξ(\9o&9s漙B5f/Qy8zFqtο^of~:\Է`[L8\e}]9t>tb;E3VG9S':?SVղk׳}qs̡ͦItz\[69{,mOsg}R|'$yxVr&icPI;Ԝw.+HIPs6n 9%!`yZ |\K}XL5J8Pc$gxQvhjB 6k134jwFxu]f@}c3uc6Iژ7rݟv,+kpr޷P:U|+tGCbrTjGacƾq8_(cYY!*TvV9]jeϊur[UY$F`yjBPGHL7Z,䴎oz6M7P -ڣ@E)#MƼqB„囄 9UU#;OPcƾqGG-GZ5-jIژ7e 9ռ1QXx\u|3՘o\PNNQjzZ P}k#|FCﱬM2Vt-lrW4CPcG1icHU#+`Ųu Y31T^6I[?[lS`µ|a^z)j`Ʊ}RM/}|1icpIUAQHNYNlaf5z9Y`YWcƮ5!`yJGoJ?O5&mj]srXژ|5&mj]srXژ|5&mj]srXژ|5&mj]srXژ|5&mj]srXژ|5&mj]srاn՜ՓW\1VsWe.B{Wo5hụGZ ^}T^9{.y*㔀SnDgQq 8A$Yr, 9@ KB%!R+kszqvv"D,9/*>LZ]"T!'~^/^|OZ]"DL 9JqttTܺu|u]%Kd2i"۔!W_-^zų>[|/~t['2Kd0e"Dy*^҉sN9ϲoC=`EF%Kd2i"۔!z/'wI_jb's =p"D&l%Jd.a"Dl 91'HYַʕ" l RJ)uTd$M"DV%2L,LSjr'>(6|\|K_*/uMRJ+*DL$2Jd,]"DL٦ 9UЉWUЉ4>rlf׾5RJ+ E"D6Y%2Kp"TO!tb'kE2]o㥞ذRJ)UT?"D&l%JdzizЩщwbSHiI)R:*Hd&Q"TN+tHEr$PTA(RJ]eU9$2Id(]ᦪΐUPzFRJ)qyN_.cD׈p/`e#.79OZB/2u)㲺\˳\!'9 T3>qyN_.y׬lr##yB92R/7IVX?.eD,GH&B)w& E6TaW;:GIRڎmVm*֓2 ^/🺤vgyiqsiRqchQw3ZW2EǛCܟP;|u`#2=ѓIf~y]] m~̟.|2}9h#14=w*;EhuA(6}mm oG84kD]nc`1Ɍ0 ]`5 *` B`J!`0X%`0AH`0 V $0 d U;w ,@% $*!P  J@HTB@% $*!YqRxՔ8bޝ{778J<;tLH0).XG|W⸛].$m-N}kı7O@PWh<.q]{ıϙm{7$vMg4CyyyH^/!-1/-68X$hPY꠺x:GBr#S⣿68h[="=w8?>6 }8J怜v 7y> @w7xw6ٗ=+(P^*롺y{ڄOD oohsy\r}H >t72LP7ա]\ijI澔O4-$, _jwBuP]zBLTgwYWR~jZ.!w^E>7Aujo'PYH|ǔP+n\D;w?3|o3:SX* =Ono);Z+1WOʿxʹx]ʃOW=4-q>+:T9n꧒t{S#G]H9~>q脘b*CuTɛ+NPZH^[)g }Oiw(E 1uG\=JsMcZqSr1?Wi:]\D,? >*Fڼ@)-$~J{$ސgmJ]ܱn է.\%W?UY].Nڢ=ܵ~x}gn+4m+,Өl4!#Y~ts*=x I)!IqtH+J ɩcb{Rn{x\?}3F>.V:qo"B_<+ȼ= K!$NJ bUS);W?oĻuVqg=#g-+`v3 R[OP4EchX6lF׮~Uc|T wv/:t/tzTJH)9+gݹO.*r*Enc."n򻠺 E#&a $>K_aa(*3>Z]â47$*YfYio#hsN^&F/h G ѴڑıQ_>wr1v4o̶);9.%T='^GxsPwT'w;Lxږmk<8*뽮Ce\+>ͧ)c^x_. gOzBPTڢǿ[#Yǟ]y~23ۦh{.;w/)c;ͧ5vpzm+xx[k3/5<\E~QJHtxwH+_tյ?i xWDm1Ҿj97[0OcޜoGnW?x[/XܗzR=IxKjWO(-66c+&^q qs`Nd=-]#3޸]ӊKl ǻޕ2 Z+ɔ\/_eeG+7)@m㏙rá4Wqt7g29$F%>os::pNj;,hGix}~B޶=&c}ڤxw@ {ۡQ׈k7TfAȟ6GspQJH>`8?k~\=o<%^J`թ꧶i}grá4֞8 @O-OT8nmBZ?I;tՇ"uf[pߤu7/W#_>sD\>5e'kCh!|c7O=rH'^G \h}(UOk׎9HO'Bs?_x)%$n"z햼;-[_m2T'M&ڢ⩍޸j9`Z8o+7ndɉ=8^w<ȫ$XﯷNc; g__ ׾NAurTFm;c`u^ȃeXyzM/ͫRZH?=qH x[p]ѭ_~qiZ9?JwAkMOɺU}>swYP?_/\]]ל`zui1iC/"^e9|#~4r@甫 ~* Bo+ߕri+?B~HR;_uJ&N6?^[.%yӢ"ݙ߹wxOvyZʒ|STm<* q oG 8Gʗ2jމoC{eNƑtZ7 ɛ.ݙBc]iN_+NuJxR|i~LqܱGː2xʺZe @{MHwG 9-šTʒRTIuh? v&뿶AF ~:~'FH h^(P^*}!DKBB'KoZ_q E;S~R ā.#(P^*Jv!T9"$oy^|T g?!x h*K>?}ͽvt _l\|ʫX#^?-x4ʣD ޡB Ay˼H TK蘐(nzQS|BP}52/~@% $*!P  J@HTB@% $*!aǎb||\,YZhk` $9>`~4ZhE@J `nz"@Hr`A0I`A1I`A1I`AIS4x^\bl`'p[*F k9`ʘ@P 9!̎cdt$ba0؀MNdtJ=;#1z@HpvLh&yGpz|M\1%~Fi?4KiSnG>n!a<ژIYzki hӘig/XPnv$LPH?T,=q[gJӏѬ1pO&U&7߸4O>6l!q,|<(N+VrG|>0Oӎ:(W :0G}\뀐$*Q ;ILGXôQuJA(!$v+$"Lf,H|劤]G8)e~zڏӜ36~256ޑh7>`3:"$.*ϏZ>nF*|!ڂLLӎx/bf ֮eq^\h]瑑u?Ye! !I QL\됐 ~!q03%tڳ_`< xV k $h +c6 VuV?l B&h`V0 ?lFS0 ?fv!Zhk` $*!P  J@HrXf˞NZhEA>{ŁۃozWFL $HipO1ǿ1`}a:G{|-Bԙ"h=! }0 6<! !`d6!`d6!`djA῞X  $됐d1.S= Bb{rm`A I{5Iq1:78*~wa>kkL풆AHT[ r q!mi MT Ѥ!B'NSex^ZDHz !!_Ab%v+@\"JhW1Taڽ:ccM/$B=r !!,"-Iz#Џx*Ց HOS `lڍ /;rHhxLamkY= `jzhqܕ,8 q,W=/a0B2x@H`0  @H`0  @H`0  `0ؠ~تMva0 ~j,[M3 .)@?AsѺ< $9РB~7Zʈ!P  J@HTBψCΜ^VAe,3I]L?@HZCp0ӁS@HkUu_>52 Tw"E}I` EX]=pMW\>"k q/ON)Lp<<@HZڅnv%$$v5o4ohxTÃHoEtQ w \D(ni_kq߮wtӇn6cUGevz]ʟF Bv-'U]gjcg.>p1w+@ݣ,Gv_l|BknU˧׽{@HZ$O0\Ej 2Q mԕGug;'/ibjܸ[5ftڟ/ġϷ}NVs]>ֵoe|̶8__;yϼB"\ދ"$Sqñ Iae0e%7c1?ɰrfK_Wyv {-x=:{*\:|XiZ i8r18==] $-…A ny^hM9&:RnNSN`qQRzDhcFOڐް,G@P9|"uu⣟\eBi0Os5ΙtOtIpabz/RLHYmȰð'/"0˘v.w̶:Pk7qyxV>.R>ߵBc_.P >k](-i1kEoڇ}vyE0 gb3emmqP+c OhiEOM ֯a&ayz/yϙH9$}wt> ՝#(}BMyg\M s]>]qi?O 9% $-…U?01$̡w~B"@"LBR7d#v#3I@HTB@% $*!P  J@HTB@% $(g޴U|xqO 3˗/7xXx1p@cCcǭ(zZ$8IqOur\h| -cccbժUb QY1Ѓ7D$ ;=mCD1W =8 _4+>~EЃ@H! }zG@H! }zGt]HSB6iϊ1b$.eZtWHyP¬yb],sfyKx|5 $])"Pdbb r]%ĬH<.2!=!Ec/.֋)E΄e/ue'莐;CD:Cׄ  IdYsٶ]k]+xEs#d77M5oV<*K*^ S IlΥtMH | "% e<@];&ߥt IΎ$ ЅD_ϧw8W=@H#&$-#_̻3tEHޑ@y #U :8GYom!Y8ڢ4u%|@ C$ p7ĤkBBc|\1Ȏ$ l ]BWG@H! }zG@H! }~j7nv3μi8'!&h\h|hq/_. &hlhhB@B$=q 0q)"" Z in MY! $*!P  J@HTB@% $*!P  J@HTB#HIENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdCarddav4.png0100644 0000000 0000000 00000017704 14577576165 025641 0ustar000000000 0000000 PNG  IHDR9XIDATx^ϋ-y'pYnzlN5`mXK0rղ$Kd`FɢaLf@hE q@VY"Y`4!q.N9Uo<wգ{ߪ<7|s]oF~(RJjyUL:#nbzkjYRJ)n$I|N+4Ml\,~yJ)R]C9% ;S/T W^).>O>)>}Zܕ"I"DFif0͠ 9u9==-S{';)2Jd,]AgrWTu`EfR3opb{^9cY"D,S9NNNʅ `_Dv Y&2:XK/'>]"DLU/\;,}%2Ld4mʐÇ˯Md2i"۔!']/0e"DY~?/{)2Ld4 `5CNdg:|r&dE$Yr, 9@ك޳y`M8y~qtv. !pQݿl'%HWM^jpk'dW^sx=8IIu-lߐ{?fտ3Z\#l4[i[ ɣdrZǪ պG=(O߀{?fU3{6/5!fiti{$^h4t0VsꜪUcx"&u& 3Uیtѻ}jpZ>p/WzT_}CҐlly>78TBhX(E;$f7Zj7*rЫ8i:݀R `61=u/W羟?Z<4# 9}촟far`vj6VxI`] 4~>:-NZLwhBƟ._ `݆O9oytFf○{x^44#iF&$!fWy_c4n@cз}.U5ME+/ tBN23t)9&7uS{ksn-om^%cuV݄Z}5G֍2ܜʙz,Ρq* tfo꼧]W6{R̬S͛ZǝZ[iXE݄H㛍)voAkˆ]ZisJEcs CAjsywSE~^ON7C󻺿3YOO-o\Ou'2!f6Sdzw4C;889 }]6(i={1:sMN'%sƖ'S_ar, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!g'O˯RJ`E^=q)BYCWJ)=q#ܱHP_9uO?KA0zb%9w,kWC0zb%9wB[a[/ 9wlɇ nɾ(ܱ%& tNZ/ 9wlɇ C`_,;Ä!B/B[a!KE!Fur>(ΞMr}1/N3$oɇqSQqtـ utv5 9X/ 9wlɇqSs>9{p|Otp2=*: %nƿM8;7Sm^ 2il`WFԹֶ2 k،tkMQٮh^7if9 \k `&u>:i&/~ 9s_DX?kyͦnkYv֝:km0+GA:kc52jYـUg_>Eq~~3?=kzߡ4\rOc-}}B/i;r 1J0M:/n;tyNcǭ5sN7t{b~s}m76.W6]kJr}1/NSO/~%&7=sgL6t9-ksCfm![9ہ&cK714&#LowN]fqG:k+Нn|k8 ϭ@b9]k:?ugNޏO8CNX5Falj^y_154s0kQtzetr.;0toVVIed~>>:3i8 :7{}->IacÌ57/50sҀ*n}qڭN3C3av aY7r9=4/p!skfBUݖ싹}q!-0`-;}d_rؒݒ}Qȹc} UEpPFO޸!=?_ : 'Fo\sebSJ)=1z3RkvRJC 8A$Yr, 9;>+~ӿ*?+SJ)F/!gC,>]c+'FO\" 8"BX>[' 9;` lɞ(%(%{|ϖBX>[' 9;` lɞx@!qq<=8ٓt]is6u=髊\X[Cn:*]οWV'{7y=q!g{cד.Kwx`Bt!ك2]o;\gG0ӳQ:DϲN`^OgBqп|xf_6ֿ6Uoyu{s*Azxy۶l5ESf~v>ROIaحc\^wz~?Bֱb%jzt;jz<;r97@ٴEgǍqzbF{ۜSt?]?VHr:o.]{iלNtBNVoVzFkuG6'γ#!o~9-6ơ&. /^ּLMkycǯ !CL[Vϛ:4y(Mo@١k;mdշWojm7ӡuTmby/=tYWi:AdlD| g9]vPI7Wb8ZT6e˚@sz^*= ;oYǖmjސ:MX[4vlHY5*7IX 5ƶM]߼wgs7oNog7ҏYnc7GnJ}y=q;9W)S:_;=j5uu{qkMu݉ถ >{N;~_ӹGs톜dĨ(:vyn9gگY^7aɞx!/f%h!'KGX'jȡߒܐwkɞ(%(%{|ϖBX>[' 9;Oӧl8( '.E?_|+z`Krvg}V>H1LRJZE^=q)B%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Y'^Z>kze$Č.Qu.}[U;n{Tz_i [99ӭs,s; 9e^S5jF4fm6fyy U 9#۬xuzm85]}[.osKFP1qc7vϷ6tVn?䔍ٸBM<4 9ctsռFs֚vSVT8m6wLܣα\su!aS&y=:06S y~8=t̞3:{n=V!fjzq:G?~}3xV!gl\n5v̞\7mӫ:/ o侔mz[IZ=GݐͿסn|__l G!gt(#}#QXfsꛛfnSmwOI락q=ylF1 VCN#ZYUi7_7B@ݦn㷚ytk)X7xg}!<ΫWX]Nzy˓멯|Q`[ 9E$Yr, 9@ KB%!ȒdI$Y[Ndp 9}a;!كF(/zWAei2#(Ύnz>bZTV!/}3/abl~3h˛Ԝu4 9͠Uw8CNIp2ij U!tÙr014H#!'^O}ӷn:epX 9skL[79orrV:OtQ Z|ސx=U%sp>? JA'm<}#Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!ȒdI$Yr, 9@ KB%!}?/y5+cϹ>Q|G_q~,I8`ѐF_sN4ѫ :B3s3u!Y-WS6!Y-WSƮ6!Y-WSƮ6!Y-WSƮ6!Y-WSƮ6!Y-WSƮ6!Y-WSƮ6!y/>->+gՔ}G?{xnϲ-k)BKwqzo.yBNR?)^{g.!]6+; M=)icRb7\BNI8`ic޾V#86oCsXZYdt53}ߨO74GƯe~MIyC#vIژr7Գ*çVoA>wBIO~2T/W˫Q%^MIUAzuRުIx^,-Ro_QztW5]$LIUYi꯫V6dM̐Sظ&'YhO!]6+Wn6K3Rusuv_]y%U_G=#9e% 3B$mj6v9,mV:zV!ՔM-E8`icVՔM-E8`icVՔM-E8`icVՔM-E8`icVՔM-E8`欮_q_|/:]}Tޗ9[_q_|駝>*R و2qNEC7K Yr, 9@ KB%!Ȓdrxuy7|xiΊ&L+?';+Kd:s||\ K/T|;+Kd2i!^+NNN~m%Kd2i"۔!_/^~_,{;N{9Y"D,&3N+RĻ~POldDEQ"Df&Ld6eȩˉoeҗT\Aܥ"I"DF%Kd2i"۬CN D/}׿rHFַen RJ)]Td$M"DV%2L,LSzr'VT;X| _(>zRJ)ԭT?"D&l%Jd.a"DlS::DaR9v}W_RJ)ԭVd"I"DF8e7O :1"HIQOTX)R6E"D6Y%2K3tBN3ć;a)V$^RJ)uY$2Id(Uop'E+IENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdDirectory1.png0100644 0000000 0000000 00000011375 14577576165 026234 0ustar000000000 0000000 PNG  IHDRv(-4IDATx^oE `+\@ R$pA= ̋ID#JNHq39/?l'81DrNH 6 㐄KVϏǞ]>ڙꚙN̮Džӧ'@__&|׷ >imvشi3N & s߄~!8pwaxͿ[LCPx| #GѣǦG૯;w)t 6"yc7±ce¡C(1OUxキ{1馛+TaÿsXx}p-K˯}/=B0C_\a\l9X^x> ؎vGfbj}`KOP=TPLP`(6hn6nfKhؗLz{DE<3*QJPL4sϽpBgCރB 1K`?1)|, FcS.^ {:,#uqp}W\ ݎq;…nhʹAA? :\ֵA0 ^WNxK`:ʟٳ8ޣи$ɿ/-K8{QCw–-[a^𚚚l(;~.>Q_Bh36+mm~&f:]zVuV^H˞UER{ _ >[qT(߇Oxk׮.-X@rl8"Qyz>}}}j;+XwQF xx3޺u2~>_Td ʿ+}+>/eI?[JUQSO9ΒUm-qIo06-6_]%1i}r! ikkZطo܆˗^zS~eX^>~}tu7+]*8M}!_ӟG7㿭-^z/^d iyBM>%P}bےRsf3ClXJ}ٜ . F^f1BmM𐧟~:%8[=Eef.qǝӛ`,n Z .r {?obS"c(RETxW]uL' m"jʭ>٦TRAT&I ._@K}ً5N_?.^\lOvkFxȃI ej{/iЎwujEQ_1i$ )&&\Œ)S2c/eRJt­ުo]}FHx<^. 7\3%1^! &tbMhCYe0Rb66 %H nxk|d-0ݔ#+<䡇RYoҥ04ϲcyDeg *I-ÙeU:^KJRbbf*0\O5R3"-5#̉=aozyh!If(p }e6@@>qxÇ; =.:"<% ޳LLx(&r33ØuKώMd믿1 vBP)CP|?0<#Qv\/q/43{J^Į]ܬbF$oݺU򲺑? T /֭[v.?EG_wPa%Q1@NA'Z _=&''A1>>CCbbe> dg׷C3{> d3x*9Ex1Xv=Q |}}n۷o;v\`Dx1)}͠/jDz"LgCO+7&ϖ%h}eb*\x lP389_+$.Kg2^$Xab*^x=(`n/ }8|,! /+ GVp,gKah2|qfdmح ql\شdt~[ YP= K*j!kKxtbO^Zlk&3z1ūmgY Po6=ND0}*Xx0w B!Dx"x|g)ي}T˄fk^lk$£W`'#2 )-K8Kgb>/E? t|eG7N2v?~=9Y,LLlYBǡS! C o&LwOdDnQ9g#K$ h|8)ož:-3ulifѲ3NzEW_#<,yL/E+xDv_8T~\dey]mo=\ܶNQ g &m1imrlt$9?,!}Bq 'M7|S RTa.! B!Dx Lz(:5gϞ BOo˧y maj^h;4tvN8 OOsmэAV̙ щ!c? Bz{ս>͌O2=э.>ajD{:,/1ӡ\%f,<oٳP(M_|qc_=o}:6jbe%]O<W[Ƥmӵpss4$+w=mj.ܘҗb|*5+.2%K.m۞>x>+âZIۍ^\Vn, ~/m}cEq_oj]cmx82ߢ7Nw6tbï Pp\tvFg-Y`^ nϳ ZYkhnhxۙ}7|up~8_~XӠ|E̱КpM˦pMoxqN!~7n:FfH7fHpiDuΚ-[… U6}/^ *$ AG'9 ?.HIENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdDirectory2.png0100644 0000000 0000000 00000024770 14577576165 026240 0ustar000000000 0000000 PNG  IHDRr)IDATx^$}wflrw7]ȍ^<?f,<#KkD!4JV$VtR hFmn68F#0M-?̹}[眪~uթ_}|>o};1}6EQEQ P*w=\oQEQY$S/;{g3i{rmoqsv7r{G)aq!nߺ=7Q?]cە.hC]8Vзiw @7?!@F~2Bd #?!@F~2Bd #?!@F~2Bd #I|>Ͼ?`D } )O?`D } )O?`D } wR?2׮|<Wɹ)7c3-9W=j`?|T?y۳aj_3a27Ӊzz84;Yz 0%TC߬GeU;LzcDEߐ{1\oM+a7wC+ko#m6 x2խm|nɋjZ~zVHG՝]+{ʻLW>kh,߻|97a`-P~{݂֫zpt^Itm[ݎӭbWfriHjv۽_.KNVivO=O^~Lq<؟ag:t׷V'W.:B!C֟QX.OޯOժ\u{m]}&u>`~PMכWkn_Uϓ}ϻkϱӺm|*:[Y}3k-|`~z֞J_]#vY<:ZmӡZwI?IRyWJm̽{@'RH">@'RHIͷ?`EQEEj[~?!@F~2Bd #?!@F~$w+/j^?E71!`o|\\\& /J $H $ȭU EM $0"UM $0"UM $0"UM $0"UM $0"UM $0"UM $0"UMM"Ü^92W'Me۱60"׹NELYgf_җV/j2{>V}Os3%#&0 {5q3J]vL6gvݫFĂC:N|'u̪"#ewEYEl{ 7H,r0uX7a} e;(, ۶b_ oZ־^}D-ke^D7H/`cAbӺMC>t\-{@ =BغA :M`@ ~{'mzشvnmpuC׮PӺMO7r_i7H4yN[yhlM6Z:!V^e6[~9q[#7g௮:jץ>t\}ί5?']#m]/N"׹ov`jdz*;ܦJ|* ՟So2}Q e&0?r mZ=G$G o$ \N7&돮0Mr~$obl~$obl~$obl~$ᕗ_5z6pP'ocB# okn|G2/J $*}+IcE# >HƈG*"&ƆG\*&ƆG\*&ƆG\*&ƆG\*&ƆG\*&ƆG\*&ƆG 7c3-mq}a(M`8 6]6ubصn}I6$ԭo1W597Ufg+gfVjzQ'7ju, -|m;fn=4.Td:_lwK}wn}A1= @eZۖig.h"O[mYul2诎[DOs3ƿc7~1&0 s5T+uV46A[/\mp}v^[B켶}#e&0 o@ԃtu}>]^u:Mt\gJ-1&0 ~oCEvnYiM3v6;o_tp (QU]+-ȴ 04hǧǦ׃6z>HO/wok!7T/eu խ]W%ls}Ǫ66?p ߮߱ޗk_tp$+RE &WWV°1"UM`T716?T716?T716?T716?˯ =8(71!۷57oC#OJƄG#s=P˒C>H·|H}k*HZRDߌ:uI`pEq~ o"WGNj\*f/`pEq~ o"ʱz>wm~5/hRO\_vA2rɹi60ҏREߌu߼y h$ %Π7; .x\"Og2Id:wm ؗJ?J}3niceO-s3qĶց̺in+0N>2 @mB>Ĺ;S;Aԟn\~>%؂Oѡ__;3 ۲wv]P}+Εb<'v\)Մ>or*} =k|=S*lkUJ/%eZq׳aN~g0r]Vϗ'rB/ t\}sOη|nBǦ^XŮuGW6}/Wv=V,]:uUݼRӃ{5L޿KР]݆u6mpuw^(0t:C .uGw'I3e|˖'[<_6>k7pu{}yYUV|mm}P|"@^oߠX]۫՘ Gsꇅ ؗup-stN{l#_~]ckv7s5<$U;XnA\]mu[wz߾eÁ^࿬>kҸ+z_bMEmۺ7s4Wt\un.]Jok?"VW5B\wλ6v)]{K/j@@.y.7ӵC@+REߌ#E H}30"U8?^?˯ =8(7v=sFQ|>!۷57oC#OJD܇~HC>yIxA9ՕZCE7'&Wr[J>C_d #?!$?ZF# 9gj@~$ǘ_/ޚW4@~$AnAN7??/́<H!+gGկ\3J#́<H!/%?GRV'H!= ek Gn735{vyҦG3&Mm~ o0WʹC-ie|]?D_B\]e3M0!Tt^;;qԾLVTߡV@ uHK 1 ǾCcp.[bލTypbm#sj}vS}ں!Cߜ]--yȽ{]j+`ط;XOveWU4ruk\Brk]!Й-'}aԯd@pUmt~s,ԏ+>6q{CP[w>\߽:ɬNy_%8$sBzKpߤMO6=OWmB4Y|Ζhy%8 N͋oKǶ׵MO6}RuP! ~GyWr 3=J ([B$}m@]sX`wmӺ΋kCP[ߙo|~ueky.NWr_;iy>nhx*a:i]{줯#߉|$M[;~7WV5Xմsv2=WaYa.Ozyqj;Yro_iooJݴk/D#ڃ_*o!V?N~ J@u ~);@WI?@u~~ZRZNJF# PR?7I Ey#Bh?Ḱ<H+/j...:%0o5+?kGn~ܼN/˒+} 7g-9Hƒ PM3Z>s!@F~2B# |\{.E%POJƄjc)eMcBJاfHE7cAJ}FMX88{kHcCX2'Ɔ1"eO c`E?16?)bl~+RF o+Gtw!i#%}֫0гd٢"M}'02Vާoe&禹ضǮ][stzÁP;!:; m_p~w'Yж>v5n;mnW^XfA۶|=[/Y?&A5΁஝te<ǥN :t% W߷ J'|WѺ-݇ ꢘ{1gۋboᄊېd_o>lӡeY-mCcv6ѧCdc [:+3cXs@Wp9g`(k 7$,7$ܐmks}题7}|w޷;mM{]wwY۶[m3'4Bko}'0 *~?<+f">3ҥ(X7?;}]մu0!ۖ[/6BغrߟKoo6ѧCP;!Zqͽ"Zݎ^fn݆MXCabvZO\]v]n+Z /ym} |mZ dZOw7ܓ}MէCf7ZO wP$PcHv6}QU0tP88V!qp HcCX2'ƆbP_ 8(7cA஽yzjdH_>)}S(0?^WT2ՕJQ,oJƂGd`*{@Q.' } @F~2Bd #?!@F~2Bd #?!@F~2Bd #?!@F;w7U I"%߿gud]M/W̺G^92 =FQ|>ܜb^ۖ;^iwTHξxZWN ڄndE1Ws^͹db^ksm *m6Lr%b|m wu6;6w?k){Ŭ85َz[VQۄ>>KU?>ڢh}bېqmHcǪ#-O=_ߪvkK[>NdצC]MUW]z ^m6Ko;V=oi繯bӶ.ypgɉv>~gZJUUwGGy2VlZl}tm>mt}훶"~5nCG!b'ap~xsޢXtu6=m{y!e}c;X+Ԧmqjz>cm__ \bnCud}3{E1/}!uӽƎɝqPmz{5.v(캱6Z}m/$dm b7݆L6|Giv[ߢmkWlo6~cmw,=Iood;w=6weв~(/˽H"wң|.#HE-/D @F~2Bd #?!@F~2Bdx~濜|P%,3wo{K><ԁ:r:? u{hÕs@PU$qٿ_ѷu;l!۸mZ+Կ`~?`:@ZmtQ@P;j]BjaGk[~C6:um tFm!`t谣ֵ-? o?F=sFQ˶0OF={У+?m!` $8x/%- 9a/~2Bd #?!HVڵrŅH ~`?ӫwvaInK~׭rrb_nqs-M(moqgyG/"kmoqsh?'4=l7xCo$FZr[[r\\r6O=Ty@| _(oƸ =ϒӒגےߒ׾᳟ly فpGrXXrYYrZZr[[r} ~- g k@yF/}ܘE9(XÒǒ˒ϒӒ6g.gr!B>P~< %;((jeWrXXrYYrZ /eWAٸrP,((IKK.K>KNuKEߖ{ gQ9HɿLQEQfs,m cy(IENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdDirectory3.png0100644 0000000 0000000 00000015323 14577576165 026233 0ustar000000000 0000000 PNG  IHDRfo'IDATx^yt\W}矞R da5aQa)ܤ%m]@u 6ICB(8 N%$'S"›IޢͲȒd_{7޷4zϻy3;wX )266&288(rq9zÇO:$#݊.B!1h_p(| 9rD;&'N!Q)RF%$$H)/yںJ Nؑع(`?j֦ #sŁc|ErA-c`0 8s֫1m TP ^wV_b砘 #swܩ3kp5XB3`pn[[Nog26al`0 8wog= ,q4`0uVٳg \\/~XJS ^[l]v1\Čfm `0P((F&i7oV_}f3G21B,9V^PXXo\:(F]ҋ*朻H8ZŁ%R:j"~0~BWpnkkرC-bK㘹 }UX(n%R_"aԋِqxlcH8\xE7,`N 8,I6mRWf/ R%JZ[ {s$?wq#jn{gb"pƍՕ sIK͏8.Q+gSn,&Qo^m5[A!)+GwڲAsboз2OgSWZsm_$a9q(x;jb0 -J1[26$-P+"S(C4+Lߊs69{Sa.OOܬkΜV5x!v7]}s ؽηڱb)8_Ӑ(T gX;/r\3%e9GyKQe幭,"Χg7M1>ubsDՅ̷tbnoeX/lWbB'_D 箢%b| ],yดSȜk*fA`<<2;NT]|qXY@86U0:QZ9VxB7 1_U#.wl~pmg QG88FxDo3ur;YSDƭv,cv#NquQQc1۫^Srł\EV~aMe`3?F-Q}Uq:/퍲DT G_bsDi-}r.s.NCQC13SEd F (fFA13Ibf3$(fYP  #gA13 F΂bf0`09 `0r3`,yxxBH P̄3(fB3! BrL!9b&A1BHΠ !$gP̄3(fB3! BrƜ1A[Qn[7! _;m2ԡ ں !d.[1oonObR|tU"BNļ{TnY=!dMeB~}&r#GG+ke~I. ~qZj=-:OˆӲw22(Cڠ\=p% 1*h'-%A_7X'2MZܴ2ܼ_>t̿c\Ymm,Ar  ()gV{T u{ApVy==rٲ6P6h>Myc!<(- RMzc|6%%~ mh>_Fcmm!$d"cS>W?;)<)c7߹O>ծ9K12=A9BEb>ptDjS|uM*qn8V}U? 9c`,syBHV./PyR~lDnrƘf -yBHV*]''|nX孔!g\U'e^ç屝+Nڛ 7ˬ~h`Nx`\I'ȥXu&W-?%:I<ŭ&C!ͺO>U3!$&u'&|n]ĽVt g :t̺_qL5crEI~}x\]grR4<ȣXpjݣV_fBH&?Ud\1ʏ?./}ctquݦ~cV+ b.fB-ym稼>-'ԗ=j׹wy}!UofVCO򘠟6b>ngB%1?yL./IOb爒uZaaG}w(vqrsj嘫;BIT|S˘?>jא?bq׶)!l%elwm\yO\ϯ !ْWe}6V ?n1~9km}qYfBN_>nF[,銹Y )I6<&$9=d[3;[cT-@/Yz,PE/ÃOs;}\0nֹO$TgxL \{o nyD)%Z"fWQBLJ@%tJ] 5wpXM<uTy*l=kk߶_.}CkʓؔM݁a`l\r՝2'Vx[[ \`l44lJaڦ<uM!hhsj\rr>wv͕}ꓟ`F#X655~ R }ι+>&G;IEKiiTRlhʓ ?58q`l\770d/ SdvCl'j96Ω3i 2#8f91ߊ>K9 }v>*<ɜV=?kH1$#*?RĘa;pnR{=%iz_A<)%tW{Ávq|[c.Vݷ;OFIc`'PXvc6 }usxqZҴWu)0]gt<ܛU:\ /jՌ'.GHO}l}3psݤ"~C1TR<)Qrt@}kVs\+?qO'*7^zoĝg -q,sE &fN0R9eOsǥ|`OsM̑/I8f>nT|r)޽qE<)~K^(.fo~*0s1뮼#0d='ZV'S|$w?Br kӝ[$PCIh\ 37J-jN&̜U2uhh9;o̶2ƈ#b+#yݹ&u )_m3j/O lEcw<2HNz"Ԭ;43nhwΗ(Gǝoϒ_&^׷"|u7g.)d8_Ef<9t[]a 7f>QcFo>HEUA.)O)9+3+eInq`,?U ̝Tuv8_%51_z[\*.lWK$tW~n} 061ݺ50o2 Rѯ֒B13>"QO,nUǡU=(0:ioc7-YR$51?v\PZ$Bp݇{3\߉rc~]ltUӎ@}ȍ10ֽvunٵBH*fH_ϫ- QIdԯ»Ym9[oa;:R{)0_BɂT [m>4s[icU7OY3Jc`,U7lQsrI!YWP -FoZ:$o_9{6L{8귩E1m^hO7N ړ˻WKk7{z|K˸\Zn7h>zcvSznaBrF&b.%WVozpb'r1ē~{F/6f@ܲ_Pc-j ̋B&31,+"?(?08Cjhj5"rcaL·B@bzG^-j\ymV'e`E!mm}\o( WqPʄu?:4_qm\t?%%sKs>^2ԡ ښ}VW^%c O!y"b}\οa/sK~m sj9t>~b ܈Ygz[_}kw7eCSj^U2!d.;1k , ~)GnŬTjᮦPU[qB\!b& BrL!9b&A1BHΠ !$gP̄3(fB3! Br"\/)39㡘A1(dP̵b&$9sm bN\[(fBb17\/!ɲCOZ盂lżB+HPfBYh3[,yp[>3(fBb02./ki7L+ʼ,dz LH\X- ||%ԡ I""kzCʍs͐QWnKgd"fZ^ Kr -Ke.\[go/νr=.LH^̠W xl1\V]Ȯ^?_mlMgd&ɦ@qRZ֓-jkC1:#2U'`C(;\ɚ_anxd&)V̞t*)S8*Z6Wn@1ìjXd)bْ,T!\b&$y"H"Y7_>'1WġWeNou(&sVFT9LH\e}]Y:~6Lf/-IVT_q+̨{sTg 3!1A__L1sr:/Zsm !1=(B1OKi)B51?JHB q$jIHP̄3(fBSy3!+W|ABRݰal۶M9b& !$gĊ{̄>{̼*B*رc3!dWj[3 )fBI8UĻCpqNUH1BHz7o;w޽{>,ݪb&sl"v}IWWN8!Gm L!R9ErappPk)fBI8رroohD!$="pIP(39ƞ.2{ ؠƷTY~[N֮]K!$83N8.ݺu+~b-e|WRX5k9րqlp!4-lB!AHKKURrpaddDj6Js@_3@FBp !8RCRx `Rh)cK-) hWh@2 zΦFrBīep% w¡p)p+Wʐ2 cccb+gTBIHZ0>"+L-cNիdSppX,Jճ+h^KZBHI8t µp. E͐3.3 ƷHEM!2K2jJ &gX4خ !D}iN5 ½p+S2T8IENDB`davmail-6.3.0/src/site/resources/images/thunderbird/thunderbirdDirectory4.png0100644 0000000 0000000 00000037123 14577576165 026236 0ustar000000000 0000000 PNG  IHDR6g>IDATx^%u}P-bw4*EF$fQ7$XMpInqn4 bV LI*M)/~9>K[?~^5tyO?]yDC9`l XCcb:o~[7q~晪~gq>oϢ 0tM4>wp` ˱NI `5wNg``B1Љ"v~& 6&l n$@g``↫I ~& 6&l n$@g``↫I ~& 6&l n$QƟ''Zgo}ohqhg``b~0n*#ULlL؈`CCvG$'xJs%~&ܰz]qHg``Žbgֿw{ᗛr7B!ILlLر`CC{Cc OW[_}֗p7I ;lB]~|` 6cm{M}L>hAƥ83I0`jX%C.Iݗn?˳6~&w2xɿFDDDDDĶtl 5^ӗ 5 5"ZZiv6k]3I0am΄=~_p*Js})ra ~]-dtϯP?lO>S^'?yGwF%Da@$tIq[/LoA8@)w$`B/+7ڄ!$L\$`B^q}^B `ׯ~& 6&%x{,M?3Mق ;cw&_LlLXK׽a|χ^yAj\eb7g``Z 2,ܰKP3S?l $ W?67\LlL @p3I0`q$ W?67\LlL @p3I0`q$ W?3T3-DFgr7'٫UQ>?+l|Gg&[؍&כp]>kVQ 6oqh;gr__?YoܬMcGoVQ 6Ba9&@\9[)؄`㕯xugLZ`6V"n;KOr'x~_3/ѣǢƧ>u縟y?1l>xS9gݴ~9ďa{_$q9?2n?t񸧞~׸ƶE_=S5ہ5u0t6{Nb#<,Cs^[~/ 6lr/ Jf7.;&dX/>|oco'ƶ3Q,_>6^\wx_ߋ/7[2Unlbl ؝.OC/h׼E3lXB 6y̸wD\r\uSߌgK ,sCcw ;@<o&)|a{]?ذq>G\m,H>w/=kp4gbFM;Ž\8=v3}Su( إ)|#ln&jAWT.yɋj~.CQ,dg?զhlr.,!X }5τ{6M5Hm1O b} 8bh`dh٣F !@;e.ɰKRz v @`ö#!^1=ך{4вLJvyK !@]c!$4uV6>bl خ)B&dx쌈SOyqsO;ۤ^ Z?u^bX0m{>:v ]r{Ss 2j86^U翶u#*P`~9[=rY/އtl:tkmtӖڴ?"ߨL}[\5`رwg~ɧmluf}q?vp__^}+A'~QUc#b\`.11>v v]j)o;``Qs:k6O" QCmCgM7҄xͷΌ dg||>w=>Xۮr9:k 6~W[_tѾС~Ṵul] Ftܲӓ&0@L >>Qo]"$hB~ojN$)ڂN+'2cNgBlxq+pc|HQB1sF6uۏ+2fdݩ3Sq9Һ:rcǥ:;lq6>+ 56aZMx`c۱ [~@b l"P Wj?ٰpzg|Fz]/Wp/o_k~뾔S ˞~*YzN1̻9t m J~OX2J_',k9ϓjj|Y+W(oZIX{( 1}>uvK׋[ ؤ ۿ6a U5 Fl2&$U~=OԴ^*Rߏ@icj4^N=~*>ث|<˼G?noM{zE_6K h[i:#OZ)蘱)m m7X=v' ij2AЉ6-mCm7rhS}rmڶQr:mo9rc:\Uq9e}oqrUڧT->5F~X]@r}n;Z:mm'En<-@7l ؝&!kg #:)P}[X=qyr@}BRmi=ږ+cN/Zͷ~бyc}>+:nXN}rC9F_([{tu\[NC]=X`b؁u4ޣIG۴mN=~-Uж\YRu1[rUPcoErU5chTy_OѶ_ V--k]=F_n<-@7l ؝B @KR0MdNm<:)BܶOEre;EHE*J>m͡}RޓZN-kYZ]>rcmm>6{N&wU5:veA?)eɜ=׮}ҦF3˱rn?mkS.x}-ُ\CkM+T>'w]smq]9W}}.m[`լ<ذ`3_Zocv=ul] vv"7Vʃ&ںvag}r  +`լ<8S:SC Â[38p1ahPQ_qSU#]x[vujc|7ZaghD`7|C`IrmPԾN^FU5aネ??m}zZ?FËx}].'ɥmUը764^}m:t_Ԇ|\_e (_ }X1Ba|޺`Shzk4Higi%(v* ;s"|cs~mkl?mʁܶ ët\{}, } }zŏg7s~ho`"Bm=1;|: (]q}v),{hhauOm9$cP%" 'LmlEݞX@SUMo3 7辖[mc[?]l/Ɣ}{8uM]p4H۸ȸ5#v_eX8c~uj:X!G niy Mm [{fV5U5X0ذ"\vsl.=P?n&i T믽~= m>豏wy? @]S 0bX&0|.kP`PTt`A/j??۵q4Ia>r>6'Uh.F36J_v@=|9PMs6[RPثmhVoo_Enu/\YLMW+_Pfl$~'k[.}'QO+'Oljm׷:/]m)6{lhPF6I{Uf@MrUe# ;"ȵ(Tn~5q9/:cR21rZ"/Pjϕ͏j]ח( ""Pl3-R[<7^о2xRk9ԕsmEl~HAcFyaIVh\g4:_6_BѶT`}JبѸ?ð7XOjVۜwX]Aact AGװzp ؗj(Cܗ/۲#5]+ۺ ""61HJq-s@h[~lNmKccc!)bˌmm)lR>6'VAv&]frW'>p[~mf6/ʠ$fu -۲DDzrhӃܸa4 ""66 11C?ľw}[ :1t_._ R b5Z?m)lX qig{7_siغ6bڮ9a3aE[m݌ T&9{g؍A b<=5vEh\m< oۼR%ٷ &4Wqۮo/n:n dj,C:XWCDvc=j_ۼR%ذӎ9SC؜#ⶰVj$-E*:pjEDDm&C:m)l}2|@1ZԾ6tjLd9m)l!X:޿z/š T ""m3d8y?XSw|֙/RX}޺_Ou]}pb] *qնr 2ۼRtl,bcY޷ĤzS@k\]qѣ3_@hv|QcabWKΝɱ0ib^`#vyz/EACg-'Z;3OM8-YK^Yogư:k 6™:Йkg~Xڎ vF[m[P1/Y[`l XCcb:=6cǎՇ{1DDD,hߙݹ =6 ;0;rH}fw}wl X,Niߝ(=6 ;V}. b͂`q1 6*lI8P` @DD\L ā5?Ϲsiغ DD$@]H N`{Xyƹ {f>WGDD܍l ԮѰb^v;m3N?Cj}%@]AEɳnU(][߇xbaυȍmWەs\Ur+۲kiضBcr quFqxnS]To;V5#P>Z6r7`#v)l}uv5bZ5Tkal3*ڎa!k}^/nٿ9J,/2"&z]Pt)pN>Ԧ$@]C .jXh[ @TըQ'*vpgįo?!=LB{(zڦe?qu²ɜ>غ?:-+?W(Z6KmٲGT{2eC} Uj%Pz1RsIJ+y}HQ 6L˶34>,ۿ˜Qox?QK9lX3%RcCACLo:VJc? qSG>O=ԸΖ׽M$@]S 0bhlTǖ. _ε:\UeOj[: h#,iWbm~?=--k]/WhfYږ hOj[ISn*ۍco3Rh\ُ3-Hq7o9 6l\ou|{j B-6V\#V0Z7xԮԶ:6c!"n6i˱rl ԮѠBÍ}5WXj-ڔRT9urh;_ʹJViWJuRm-k4bmjUmaT..e42o{X趴O'V[G>m˕~R k\z +[YkؤZUߦc{-kӮ}>Ngqڎɾ󪫛@ôem/I8PF nsߌWmxA^Uh9rUeT_lnWیy˶^8%>5g)Wjm[I r25"n`qv&$a챺0Y NB96y3K\m]ǯ&lRFif|Ӯy_Ҷs}u=-]]/Wν.e%7W]BSߗRKgr Tըu9y>)J^R%mB[ $>fu}nL+07ymuVU/׮}zIL^ڌ%@]Aż$&9CFnc[)0g㮙C>Q ā5'v&hu*ЩaMuv_Tr6=|q|FNc}u}DD(@Bᆭcj$-I@YMl T,6`qfA6 DD$@Y>|>z"""N]  9rpiߝ(=6;0:)׾3 5  0t6{,!@C`   0t6{,!@C`   sرc=Kjߩݺ =9R=zYFDDTnE!@-W%B DDj߭(=NՃ1DDD\^]  B 6*t ""z$@-`q@l ""G ā &ظ/gqn}žY(@nilq9wU:t_Vc}u}DD!J8P_*/46FUvw-sWV;>(mԾNֽU`1` ۷ങ #1{GfWaiR{_ݭ q$@;U5^i,Xt"۝wXvyY=*}rW[j_'oNG)0m|x߿={~F 6R,Wj_m*c!"b\ ād" +tE,:]^ֽu tɺ۲SHq9/of2M/x_xm81KשgSwq!"nwAh}L ā&vpXl뛺p`nKETtU5t_BE]]? e~vfal:^[~sjk۵"TU5usF!Z>y}t_J^ou- OUe7^5Ⱦ(KQLecoΔkl1LZke _2rXǏK/6﫶ء-7D]wA}҉D ;S>`qvVU#ɂI ?}}9ÏJʺMt=JA_R>OFnR?Ub{]KY?_~|`ky}Q 6Lvևew36lmklƱipQje_L=zU5zM=m"PG>O=ԸΖ׿M$@;AkHڔ86S6.WֶT] ֖hhC_Ѹ:_m˕?%rhݲ"OX6㗫j4.: 55!<_k7rkӺTQU-y}~lc`CNm 6'VlnSR뤴~A TbcM?_-I8Pw;N|Ԫ²ڦoMcDUh\g_buWRǡc8~:NXDўcM|sh٣m>~)ʼa9>ο_sDU=G BXǯe-Ƕ7O{}iK)KQͥ'>ذ/lFerltRnT'%^%"-׿M{o"P|UW7i^`qvWU:mOAU߷86#޼˕-ԥHu@.jz-:\Uqٰ h;qѶ\YR,/۞#/Uoڬ/Wh\u~FraB#\_6rSMRݶl92-ĸ{e>Wic\8escmm%7ծaqZHal ԝުj4.MRW':k}[j&KlZW_#CmYNj-t}ŞD[G%Zh[8Zu ]'7JZj'LS5|&B߹i縴Ky Qo~ԯ}X]8cMێ7 cuRhSoiaCq}CDvl ԝ꼩 lj4.[[pkˡ-5Q&6oC/o3SϛOFM[j֍mO6a#]T=7VN'kvH훯Tccrkj,ڿlr=Fny%G)KQJZ_#Mc+?xp8Ms&~\ |^W}ضCmdz}rxm I8P?؁oUvwbD ~; 1TcA8D 6*ѿf(FUm%`&ظ/i}8D 6*!zH``q@l ""G ā B 6*t ""z$@-`q@>|>z""".}wl X;:r""⊴TnE!@=veUSfq9;uP @C`   0t6{,!@C`   0t?}qIENDB`davmail-6.3.0/src/site/resources/images/ubuntutray.png0100644 0000000 0000000 00000036234 12564151555 021647 0ustar000000000 0000000 PNG  IHDR/Wz IDATx]w|UE?%$4iRTlȺHH[QD(6, "6DQ]Q]џ!JAb^{ޙ{^b!~3g)S/2}>|5>|KC̀7>C8 48۲u+k݂Azv`r>OZ58a-[#3pG E K p8O$&j*!!z^]]s1rРAE7t^tYf-+7y5cpE\\\T~c}b5!"YW/>'Kr /![߿| (nK#=8 Wh(_jiƳ b[ ܹ1p(D" Ř;a[#pƙ=4@uu]عk׎;i_|ݨi&XKJq偸<޿ozg5k o߾e˖-[l۶m۶m1fз>5~۲uD,U(.,j us/M(U7JN8 m &@!@r\e̓5 wm۶ݻƼ5ڷDD^A2 v!P-aCgaMu]DX{_|El6v솏totD%o;K/8???gdd79Afú*ap8\ZZVVV(ᨩN!Тj±O=.SzFؖz%'$4@` PuuuUUU$uvXz64ZS\W\з(bO U(>8OQ_}i9<z`ݟ s~w @Lyz<ҰL%D a\8aT]!"0SCLdy0@<2N2ZA…3+ dDA0; f9P._;< 0Z-xMُ""0,>s<@ClL@k߉2-xP`(cL1FYWTj4ވpC^ 0f)o LL2Rq +UYh 3Dy-Щh%\3fʴSc5 N.TSZX "7Y&h7z@`,B¾cm`hR>mMBNkCq%6u7&3MK [ 襤4 VLHwLH oVnzLJY4Dei%gkU$:2#՚+m Je!#D^E"2OD&DJSqؖg R<-2s<ЇCB€4nq'FMv (C&$\4 (Юh-!*<9DzTwH qpMb=>RpF5^f•epyLG`v5/FSj`Y*FO ~_Z̉X&c=H[3D!jv&DJruNUxR\d#zd>JR ̑QQc4HAH .>5-et2ꈠϥ  0 rcW\XXV-fNG<lܸ!CPQ䅧ib]v=PFI2۵( cE1tpJHh+!0!(7՜$F!h@7'G ,oߎ}XVnA`a> `휠Aݱ R-fLՉ,:RFcET-U:i7 J咩uzH1Oz6AfpUYw۵l ydևuſ]wYM&Q2bV '7{*"Jɤu/>80148,T\@ `mƇ#r?!d]A/ o}`l߰jËe`:}?tfG(5`I&ݬymV‡ǜR'l$,85S'4o>wF~g-6M3* c 侯H9[m'j}8B \P_JyMopV`DdAeթFxKN}8LySRe Sx*T,ܻ4Kj\k*>|БR{/qovRH%dks0OKIMBקn^ybMNćzjt'8r#~.nOԔ'Fݺd*U[[Oڜ> >I̔|W@:Am<e_2%0ݥ!7mE_"c؄2 X|B gA'gA:>ajG>)*zoѢ:uj=f̌TTTŔ;x]> {ܥpBaV'#p3lc 0} a>z{%NHz"L(*Dma,"y` ]{'OhWwx5gΛqq9͛_0v$'{޽ gρ> T_rIg}"sϽDuv12_QmndBB߮]/{JD#}f͞c }۴1sVcш~3Ljٯ1Z1S=ڸqG\\NZڠJ+L(ӶXrubvGQ$QHvمP-ݱL[ 'dmugEY+]^V|WEIJvQQk,U_bY٢?7ѦMS/w8y%VssCm4zr-kf͚f͏D"S^S5=~c'q˖yVZ7iz\TW 2ٳ[o++׊niu{ϝkY{LԨ,Ct @@K&C$dSv]Ӓ?@hW?b_*?_Hm5V*-[]œS/ڵ]bb¥>ƍ -/ƍ@رȑ9O>M;|򝫯>u %-# `ed4h3'xn7p!{m\PCd\`RQN?k{a01;n}߂I1}(Ν$Xgii`7_ 'OZ.o׬ٴvm^NNoOIMzqYYENp8r-) Q۶m[qQ;vG_ݤɹuk>dgwk OYBS˫>+WKLL>;SO=&;ۚ5Ҋw;tU6pp[GF><#-aqŀ)SR1QPe$eصϾӾ__r}VGI`)Qz[#FL_rܹUU-./_ _?n-)=Сgo߾ܢEփrov[e[3Z+cKO 9AϞ'͘v܀qF3^+((ĤQݷ^Y^^5a°ZAtd /84,2M,%8a֊i[߭VKe{~^]͒}K?l?ׯߩw11HKKhѦMkZn-= [:k?WcRtSwpҤ'bߨQ29?~(LtQQiii 0z5`_sK^3ȝF9/ݺu?/l"}Ȝ:HwMV:VĐdˆX3l ]Z ۷oӮm+6X@NZڠsιҔ?)N=ض99?Ν[Xqq{-׿jc{P]7dΜ/ϴJ4nK'}I~sV֐V.3Ma, ÇJLL蝗ɓGUU|]7$!<6 gLG:ٚVv!y'޸8)n߽Fθ"Ƹ;6nѥ%]OD"dd_UU}1# f=\Ls/+j:Z=/6|CT~U; ڲm)^x~aذ;׬TSڼy5q<ʡcw@ر|Q1tzHҤ#AcdQ 괵1=эW `M1u_ ᇭII y{;C͔Gm߾ӻN~射Pt,*Ԉ-T""_ٯ?~38R\B?5|xCͅlyPp؃ 2:#v[9mʸYQ@FH>$ Q>|8ϖ4:FP5%?֘u2$Cby: Ⳋdsg#J72*6MȰLJ#d*P_M[JUÇncբcbN7QZ< CTrlrYQH%`C Ҟ G 3Rc|82 ~yP£rJsUL"#uˀ2 GZx| /zJ!ȩ=Su]VG:|"M2!L_ɢ7־*S] 1Xoqgh#`]Vt_7@N]n'y>m-W>JUgϯ5ujʔg Lkiq]DŽׇꝣ_!?Unw:KW[ۀؔ?q>-NQ'ɑz)i\%0BUƖF"\^^uclɯ=w\ܾg))u#bĈ55O>]Y^92g[6 Sƍ&'7ٿGƆ+FFN-G rw88%))G;v`==xԁwS~~aaaIF%YYC''9̙[QUcHI߼>lFu,r˳CyWII9t8X^yeu~GQso|"ھ}o˖O(yBBvF>{shywrk)EeeUW=6(-mеήIt3i߾E\\ #a-#zodf6~-YM]@Izmpo4ʱ@;(7wu=x&\w{}m'LxiԡC{>"O{E}4I .˿e8P2dY"N-~nⲭ[]ŠkQkWWߤ'?jοm /:HyԋH.zeiiQ3f闗|bţ_SZo?{N(n]܍_}/ĞgpU} w=&W'epS{%*KPN':aݟ=e^] l%pMM(%e@u%dyyU۶# ցl47.. ;uxGڴɴH=ogarFy0lz؊v6m٩1RЮEcgρN2?k |K/7|K.髜J)0Qzoڴ3;{† IN>gM74ziVF`b#-mPMM1@,%֪Յ˖ԩ5lذw;v,IQTTC6lH:i.Sm覛***]W8yNWP2qP:`S2rB2g @m.WIDATNIoNmt9jO`egѕ61c[K֯l+`vOHm}{6o~ n_|=̝ 7S<(Oz]wi^摊([ӗ,YսmڌJ,F-HNn n%FgρZZGrϞ'ڸq{rg>(6N ~ǎKK+~zR,Q< 8]OM=Qk==~ާXÆs监' .|䑷G޺4zBB.; )'QFVVqD?^Z;v,c'аaR-,X^ZZ{_top:=/owVV]>,oX| }`|szݘqH3(˟3DC4pE}qeD:.}φ ۫Cv&F 1"g' -?1XЫ /۳@8ٹsm=i)a_'i V2@`ݨG`uIk1+kWl a͚.Ihp@>z:Dq.7ћn{BnԼqW$i38ny䩧^+LGz{/_S Gٱ_SԩX0h{kJJɓ~թp+1{2##Gw8u댻wyo|r챗&&si(**?گ7szuh)j"sKg C\"iuO)~6pO5*V␗ 峆Q$ 3#l2C@xS t-\-1asছ:ך!a<^^ޮ#FՇ;Ԡ8H|Jý׈TG`T&|PG. ą** jqL=y䋤#hD GN*qu!0Dm'V|f ;I@b Y4g Mö8"$AZB0`R9=v8۪ɓnܦMr˳bߜsMII5;o̘T~Wxl]~SRS8pc2 ۿ[PQO$V= F7$3\^Ze<YMp}ˍ75n Mv=ܹ͝;<3{iNX0Ͽ[ІUHy F1[5w@z1{׳ĮSݨg/8@q6Gse-[{ؗ^Zd= 8-%%1#_ryc{gj.|؏M\{/M4km(Qk9wҤt1_浅[& >]e(8@FqO>;CUbwֽM{zo6^l$q6|uݽ{gbO?MOзKKf̘G{gㅂ-[Xeuo-7w\`>b[,pQ=lba8e4d۾IPzQ7<pg4ky>'qc<,K`ڴKzhO_qqyqqOC͛6Z˼pARi2T XNӊѳ:/o~dff?ݨYk9G;]/;쓮r|Ҥ'mkkY5z=IIzשS{Pm1O~yzz#k?nϞ'F OѥQ.eˡ-[]Y_p[>m~27E.1 tWsvmpi/+f9Q3*Q-c zP{L?cj&~nldFBz.|S |鏇_7"T],2 ޵!|i 7v}2Ƥz}{ɍJ+ORkqL0҇0x"@t|Ї6Mḻ45( }%"918+85jҋezq1{ã%byp+W [5o PBhr/ͣ# a0> TIDsh A'.@Lw@s>ܰ٣9q\ "f2u$ {1u}"09G0HscãBuZQIgpu,KgA:*Go}Zyy6B쭕 >j#yEMШhYڑd T1c&\(6+Ĕ!($B.U- )8`fhW N^# '`"{Һf%c#p3 a); 6K3~pJ9LWc+X2RQ^gR%rP#"]goַtEϜE-2Xu:e|%5-<*EORDYc=.Ygdt)ٻ`PjοKR-24RU61[4ťSD"G"-60+cD:_+RqH%[!bS -eCwH5E p'4>^VT{ڌsm8+%J;eڞˆGEz:b) _C9w)g5Tk\җ[Ֆ%)܈8IFƨV4xfJ@IαN9)s M4Y@AX7@|ETlH]&⦾,SU kPxU6xI0^ HBcJIM4%k,伂%XZB@ʣ{ɘߨo%69\Q!TRѱw SR:}0Μ"^$:\Nҝڥtx!u CTz9v1\mu )iO#)/C"XtUZk>ENҶQZTRR! E.+2E;- (5 s7p3pmdC],c%ɿoqɨ8OԹ(e#4g]@y|@I֜ԔSgϊgª}8CVA2&d2`$jubbNp;ˇ{Q I> S.VI4#9EZWz@f T:QU(\b^C/Z!zNTNqHyև^ d1qoT(<2*w)DP 3ELDT<>RYx[A+I$.`4Q8.IjQ;31/6nD1?EMD]ùRBRǤ ݚFsiA)JaIH[D C8dtl^+@:00P͇Œ $5EcwAQ'#ّ0q$ 5K.IPt4O`nqF`cQkv^O,9kZ3F:VIƔNԝPOi~*ZMLF#@7.RUJ~\z@Q9%3űY#6gBz`s2E)@WFJH C(!U^Fqd4yEn(lZ~.\iR{ m^dTK=#Fv`AQW:m/!W$opGɟtcZbXõ!eN--CCPk16&`.v]pTEN-ZJ iItwjN|~72I3XEDh!)~gW!y&TDޙ AwTq"Hԡ,fSWjYErlSA r쨜sI)Dy'M5ITQ tḄ[%Zwީyx?Zv)uUKboJpIi(\#H)j2y4{ԼGu'}Mݹv #Zt~԰d?-wTI\mg?\I%kVe /z&l!/J*0z۶T[-a(]M:[Go.hL'Cj[*$! 9SmSӠZc $oTF6Grڎ*p,gXPڳ0iH u,9sK $;޳uN&DT4ա dPP{FA?ZNXPR0㬢 AIhbH *D o@:@9U3z_LMӤσ!kbɓf3$ͤho& 1kIV;H ņ:tywR&\!H#+K$^zԮDi$Fp>N=18XxrذaʅHHj5/yxC&sW.ٳ%o=戈m: >fqýƸWclkG_gC1U׭N) 0GPV䒘Tر'زextcV0M0M#4y]p|4Cb)v8@仦٬0:flVWϓ  bu B?JP2j 1Ʀi `8.*8R!632Х&ee!J0& ` !!ׯ=rriq2ȣS,C>}4@ |zo~1_WON/mZZ# q@^_TQnDTTv4)_|Xg9`h?JJmRA%d@0+K-_l߷lX*8zhAArssݻwފfgYYqqq>,6\Uܴ%6k\PiSƍ!G'ڽ{ᢟ,iŸ~q}%QP\:#'+JΞt *}ёFyaq8u  *" ߫EE<'#錈 @,#9 `4l# p[d Cwذam[ٝg~%eXIK0:uqxP-(,<< !G=_M<.+MN7ᾃZqɸ إk/Sp `fdw J>,zYQBJ9O:ڴtpN_ڸisBRuS?=ws )}WU]sI:D䙕KB½a а؍+~1@9MqVw#8{d;Ql"Cukbo8d4jРazzfZzfZZFjZJwm O- {ӧ2÷돿~1W_JyVZo}o+V?*ٱuώ.yߛ>[Ƭmҟl{Ɠ&=|ߛsq Z#""J֭+k N/y0~V Ze5oռy&M3g7lU/QujvYInWZ=狯^0u.?H24n=i ޟqιjp΍IIN~VZ͢v޳h/h\HqO?w굻Wi,_1nӆdv2=:rFZ`Y@ii)}Hr(AUĴeMs}sSZH m%9( Jibhy.D@Dl2@8F~.1wZmeUUUyyyYYYeee0 Bp8gKoVX|cn>9=))?s>;囯=/8I$MErRK,lv;yŗ^>p?`{_y_}c;jNll,ZٱٙgkЄvٱC{rݡ};wV46G}zCnϟ?v dgGa`i)@8b`ii86 È%!iJIII'ONJJLJqqq RRSH2dE)-Poz~ E{<e,( Tgۮ=;wfgg>| 86v͚[ogy:33^z&ni$O?{G32ۼy X'>[n{<]׃yKIMIIKM_|5'x,33#!'֪~YYyYٙg3xr^:^(/ 99:ys0tl͛}=:My͛77C H_ tp=ŭT섪 * 7̛/>*[P&P#+5RIgFv]GFVqII]iAWV"H.իܲ߃ p("JKKsab|_iެ) 2GyТ&Y GdTlllyy9YrسckYY>#xI{g~㯻DmF z50KzA=z ի #N;jڴN4LO׮],O wOTTdjZ]wT$Ga(:zEgǔ< m0`;$fu9].W})b èغ5tfȣӎv =B_`AIl))%:vN'zڟ3tv=o/T *odg=_;/ωE_ J&=PT,/^= /~jjO]sÏ>6jpo/=˴gL[h. 'aC&?S'czfʈ.5g&??7ޚP=͛7sg{/[}Yf|&wѴiwl<4$x˯|"cbpAAԩqfEGG'vӧWΝ Ю]̨Q-ZDGGcN((@11PQ!G#$G`coHߨa{ݓwojZɊ93*,\}G` tyTCp./E {"!6\vWw5c͗_cUP(4qÆaD"pTyoK2cm]{ØC7o6˔0K;=p߽O#0˒[횵vlyUW%\{UWEraG3ᾝv%&$kD»t<+KJJu[oHٳ ZN4)...⬳*6 cFSOgώ_**ztiGر/lyf+3~  [m ^ă};}ʐדA}e(g"uJӚ}W:vY7mުwDڽ !Ԣy[5t]w:4bڛK[o@(z[!(..nݺU͹7^\jB ;obf+{wd0M3--ccSSڞZR=:5hon.=.\ɍ`(++jԨ}#Zsҥ/{4=zry`fiiYYYYdTdB݄`5ylIIߖd -Ws|i/Xm2`L p8<dXh߾?]yYMjX(7Cp<[QVDIcӱP[*h3xHpOb }c2rإkĒ A~şLH@x|0;SEיULp^-5qu$ C;W\.ViQ D-&IDR*%c29.B&\]XwMx k VhZ%ĮY ^DY`!LaABTth FH`W-$1泃Ab Mge/>m8ޘBh-@A )M [65%ʅ"UɄ HlNQ|FJC.=HMz5DHk)0pKVS*| [)V3,H PVYZaP Y>rƬVRmcJM҂0-.k&moXHML5ƕ;V(%BX1KM[ asX+PGDSbi1F(Bc)'UA!D?qO'iGS%)LVurooR) 4*KٺboMczTS%H%[:YpIX'&#3f@դg-ZwZ80– E 8*(bCU=?miXXDvq[(qgħ$[XSEb^; XRњx>I1ءfQtxsRcf ܌,IS ?ѩXdB,RA$Ĉ ,TX+5+ZAC:D%0 hltSX2:&!WBd۴|kD# 5>thA/R8|m:H׾ @*zKĦ-mS jA7y$j!Dy瀬b:=J\@lU7yT<#p q s#]E1=YY!-CEXMO峮֔E&-b]NЈ3ݐ ^e O9X]W3`*|*"TV;IL0ipr0gÈ"ԽT JlCc > */-%J{l{Ry a )9 o]OI.jckP,&T5K6#@Ta9'ZHbNj[V.-J %:,:5]qg^SF@BB{pnSyAP9$5clXf@ApܚN ExBC 8eڳ& Q:[&5 eJ=hR`FFhJ Jw\ƜlP:\0V8GAظj1I7+olP-/c'"At S?[2n~DfO6yJau#זv1%}\oOi a !8ؘa )F"$i$[V9(1 $CH+L$MhA>4|9m3OIsnH\ZWI50;C 6%h%x6%Dh;K. c,r!8^F9ju/!vpcϩXtaq\tU@oHխjY eB` u>5D.8AɔvfťK]&ޫeՈ2?5+!VMVQ:_G4q U2Sbg>{3F>dau m8Db^ j);^g EYτ6j}\ǵYmGZԁʸPYXa6= IUœ| v2>z$,t Syar8`EkD";]*:d m g2!5o4cأ&SR6%ՕZskZ!{ l ^- "CSl ԃ]H@`qH46}N p6CaS`޼7FrN8@HJEm*q{O;+djP}lurʲjqV ct, FwwS9bݝZ@r()Xu}BH,V"O@hW{ ^ " Wll2\iGla+ާD9Ef?*Rv+@ .$K,$ 60'CE##(jL'p#-\^(rNP` oyHD+HaSy0Xr[XO^Mthh+G:k`/Wl&=BNiP7*06**l#A-UL xLz&?XVF-u#X*i"ծ̳ ޢ WC|_ sZhbq03]ZKkG%- )퇧,f$ %F<5kK.4/$<]-ģW}Lrq逗 w>lT|p%JwOp97I}0^qfe!"Gy 9]B-0Y\YgN|,Ԋ`SZ@cyv"nIR osWN"SGĦ;"8Z$R`   q|(h*[Y ,5*Q͡= Lk(P!$<$!$ /Gz=Ue]Z/DlݝM3y #iGFwi %ȎOLN<} @"t\H;=Ό P]0]Sc~lqD Eh`~-AM؂H-oQؠ%3Ax D. &ȦH1^lH jюi{YJ={(C?X#[ZSkq3ˀx\q\܆b*Dzi`{[Sw cq<쪍rBY,ytJ]  {-0I` 9Z`Y}!M*L9ŹbA\"&-ȳVSdی* peJI5Q릁a UR՜f$KV]s;ѹ.vm]淧 W^>㝄,"vX 8^ǥ+ NŹ8,Mp'lvWve)LQN3"1!A&]wYZȩr`%W]ڗ1ˮݨ[ =gp1ʊ3)*ZRtVNYZj![n$c%*H0;SXׂTJi+v"`ak2Ig݁փMhS_*3=NDKlӛqE#nI,)B*6VhurYX0ZHoB9qR%^ qRl҈&'V/El#1>?W FV$+s[fEEpgMBɯoJZM VyuS2T[YTq#ou)_) "mk#qՙWF)30;9&sg=4|AF7drfʔ) % yM4)-VD5\Q}}W>K-Q'$kqj }<ǵrY>m۬,k&@>z#Kwu oPV Ba 8Y9KV{DLLN0B{#jat L$‚2nՐHj솁+L3Yyxx+Cֻ uJXeDr, RNRgT7#Dž+Qƴ$PrJӗ(5mE/}IPV׋K+<5RH50'Js*f^h5%r@rIu\ cCOrTXdbziQppD$_ʁai dXV{ݥu#gDI!aadMUNuqZckE[٥6 !BkK:РmbM*ˊU-zqRɫͣZ``EQZzl722DB dz"P*q'VV{ElIb e$N{>Lͯ|}oWT-Wz\Jr+Ƚ+qRw2iH!g0 NtX=@k).DdҭJD[V^,;fI+c8``IG{v+1-6 @bM"-|ӄq5D {w@8c,r~k#.[pŘ#Z\^Ie叻yE /Me HX,9oo:o+n%Y.Zzpլajr±O2._2ΦP'92n7~LDŖxk ڴJ+#BR.;z{#$FǞ)#k{lUǩ<>8o j'/?@;NVћFYN$i. gki0MoV i"$Ii%A3 }ka]Ș"L9H8Ibb+$a7ͤsB2mMae>^#8] * ϯqV%Ɔ*Z˸t&#>V$wY>H+*13])z;4=#+{ w6%T8t7d]AR X s+Eee8bM]3Rh] YQ Uo_V?&ED#<6eU_|?.:bX$!⸔f8q}D RS.-ؖE.J-M-X`;'smb|lج( Wi#<E#_yxU=Su&t[ЪO7^j jT )'hA\Vʑ"sٕfbVU4+<ȣzۍa찎Ǘ[,?.9c%^U=SA:Luǫ?$N(,pCW )HFP@83'Y`˹ .p #+7_pm[ԙú-ޞmC_nFy L* Ht8gJt L7>vC|>bqgK&D.s5|'SK%jmoEpMgi{G'fY;יC3 qfBF bتt٬r>ee@¹&ڲh mGUy",ɭ2(6Cf PU䎣C&sZV.ٵ7ڦU}LԢf7=_\<:v8l:s 1Y|EG@y Uk;:s İmY.[XVy wEep V* K+q1Mf>ݪpxO~vE3{8m6` U%ܒKKv.f%}IRi寝Ϻ+[`#!\jj#7IN'=O 3 M`LbO?ԦPlg=j0CAV73$ɫ;cQČƕL5qRxuۏp6P*SŽ2~/iR+!bF@V`3$r3+c3.— Y{>8aMS?/FtM9)w_俟s;ҋmhJVf(s7_z3߉;9EI.ⴜ*L욢d~U/˯/hef(Ky7\|'N}ÑAPh+{u~{V e>yvKOtFwl4C48}{ry^sՁ$1ab2Z#zٗfy_I#@Uef(q؅ۈnnOɏ1~|t2\f4M8CEB*8>l#(i>0ʘis¥(v/XVlaaf>T $6 r# pL~_R)JwiM2HIKsj.u{A&Q;Ln8.iNZ  n뛚f |>ôxuM 쪧2 8tXZ8r?/䷗r{D[2`8PTl;)/:KGqWtoaa~-2XحI9gޒC jЪxl3}zٯt՟exgL(}gnzy4HtO0N܆wN8_lg!Gٽ= !%YǩQ*& n qUVzH[B 7bܪ*+ʥ32ˡj;ĴeMs}sSZH ܍"ʔ" B}U;o|'jKTĽU6&y.- "c5ۼnŞ];z4g fF>ad7'FR[j9[UB~Hn߭-w_||NȸT<8#ẽe3}3#"!>اe|BtBUڽe`ޟfGpD̒蝌9}v8.ڿ}׬ZPy|-PAiU9B`.ʪBʭ6 *Dq\exhK㸠,c 6Wa3al WAz)fL+[KK-3";@dBŁz`y1z"z<3yG`jnyFy3qɯL{&D|xB(d#eptZu9wHb}qk]~Ɍ#n/]B4ڞ_|h7/=nқ_R$9*P|(:1aw.c#gj;A@tRё%mib>}m'UYtL;=`HC.mPfjp# _nwmc%rstg8_K҂WkqX͇ t|qS _ N(\ c=H`IZ  PyʼqObꣲ ?@a`BYY=%GዌMk/۹Q?4v$quGc@W^V`E _dQzɱR[^Q +9::R~gNB*W"}Ғfr3w \iqc͗yFˎ=/'TYUl08QHp`M.p}bBB&y$}rU$Og}-[ee4ah {b-q0P|kC;;qC6m yy<ǏmSσ-ORnPГA?cӲ$#P CA`Ue|mSP`;K@޹b{3>Md֏3s~魙%sy0|;`kȦɒ"6>n_a8YRgR:.Hs{ᩆ*/۷/<3% W*:芁o}f$w/wB޲_G ,{H 8C\_?T߷߉#M7:{oo0۵٩SMy[EI]\wvwN'nWx gƨr<e W.˓ :%ȉC>o(J#COf Mc"X_̘8@F_iFY)Qkrڻ[T/8R q@1fe T[xeK&Eɮ~f܊&h060Nᇐ=61_˭Upn_%pN8NAYe2@Q5l'bXZP!!*$Yd ]!ҫ:xb\Ԛ?wcK`EEf #0 ~Bp3i NtJ,0 .h;#Gip @C'V0Pe`F@ӔH0D1ʅ̅,6Mb4ˌD:#)v ~=Yj$26 `m>"xg}~i ̚vL"*^ϦIlg IDAT~_Qy  FF{xZ!akio#q)0{f>^OY# Fʻ m" SG,31 i  XΜeUsB}?˿AqU&l\h|E=Ҝ8mi@+u+7p\@b g1 up>201a*d%Gg%G ݾP87'OݏmE)q9qi'L|Btǹq`Tj0>9y!˃e-N OAgE!ԷS/&ӫşiFTT<~Un6g*cϾ^SQRFblٍ~ߙѧĉ ~߽}uy~6/7`vx8Zkc=o|*6Ss[_9\(W,5]H;z(Lv{Aiia@&NHH696ZGH%FTVW8+^F54} >@n8WlrS'rк[߶t[- 6oBczpJGǗ23N?ZurS(v}5)vsKBVʸ% ' mtcmk`]=ʊb<#Zzp}+1YXބʛ \vfNd2a~]ݿGy%O w8kjIzif~KpD"+-OL_rqGՅi2yw \pDpeܠux`X[t)މ1ZxGOB9!,׭VV(BS7)\0zHA#n/&Gy&v}SUsSQ˶ }_rw=NY¢x&g[Gyq&}Qix-qq"$eI`$C fW7%IV_;,Usrrf̘f4[lyUWs9DlA<VKwVpWtSU}uPxpS\,MP&p\b[cͽ{ի7uv4wAK/oU)1)B*v{1 @ Y\)HoC)lXg"]FcIVm52|cǎm׮4idҤI$j njj*RRR O=԰anփ1cKp |޵kט1ck֬;v]ԍ7?~ذa$vzܹW\qȑ#O‹!C Çg2xiDNV܉ᬙElQOB&c¡\]&L^kKABT՝!y5dZt)5[?.f̘t'|2''g̙УGXr%l۶-//oܹk׮%v}[@vv!`[l5k$"]f;;eee~)caÆ;sȑZ<"'T*:85P;zw+EQ[Tס`_5iq9m&1  2͛7|m… k׮zjիל9sVXqe-Z(55ȑ#Ͽ袋VXqWj9̙W0`-[.2{Y/u]Nԁ:rN0vFGKZȣ "H SOm\eW`Hp2=Kf;,VYb?1r)aJ"{DFFB`0H@\۸q믿!Z*** /JJJSN>oӦM`pѢE=ĉ꫁nݺ@sƍ5km6m۶'N2eŊ6lxa ta„}2'K<:faʨ}ei"mAv꒻c;coAP_-[ԩ,S^1cFTT1_ 4rHӻwǟlq(TD]`vv6 GA/2e ɹE&m~R B>Rk,?'Oׯ_=uN&B[1Uz.Cq`J,nK^$͟w=+)77wܸqf=:n8%(]/_N>%s:0& .,,, B˖-;I]cu{ؖ-[7nr*ӽ{g/ZhʕWjEtqMj'J8!k(,4"Y5p\ vvn/wsd/?[nILLLNN3fLEEŬY~  oC^{"~'m)rm_jZZv#=ܹs@nݪ'^e˖1b<Jߒ%K xs=k=r kuyy__^^ƍիX"0,^oիСCgufOY\\}ywO<;wիD*#{2V5\ӣG[ouǎ,͛ojs&ǝŨ/pje jFm[˟g_J...;T˗0+ ر#Yw@?}#tٲemڴ4hPjj ȇjES^T-}'Y^uˌBK,y~QF$Ю/t y;tdɒK/00a?ޕW^ of߾}/_. ͛4io6e)iӮe˖n;SDhOF>?r1c̜9G7pCNn՚*zt6ʸqfʪ`qq;'Q#!M?ŢmPqU-dRYY!rə9996l{ XreEEEyyy H>+_~2?>=YYYSSSW^?6M^^BU7 :Fh"أG3g\/&ͻɧV]AcЮ]3gv911C6l>l`ժU;wß~iĈ'ZlՖ èF-Ys '_#|XW\q3JKKl kѢEHEEEvZy{ッ{\-W\qٳǍ駟Ÿ&5QMuA}"S9Kor=;/ 7"u&S8C%DP;Vt-ңFs1215/\_~@,?O~GӦMO3زe s_9Et`^z4-:]B222SիE3´iӮ$%%^w?~|˖-͛'rRTT=IѣGZ=H#G\paAAyk N&r"b2.\_܌5DbZيc0m`0ȣV9ET (]}111ӧO/(((((6mZLL̵^Kb;JII y'w.))i׮lڴ)!!I&~gaÆkqk:uj^^|׊MСCre}Jŋׯ_„ e T+p^^^^,Y2c,^8;>EB?c֭M(22rذaw}ajQ\TiHj@Ԙq\K_C|Q x5< O jԨѫ|_jFHlZZZzzzNqƙ $3:GrJh~{aq{K/_7x+ҰtRe2f̘^|*++| &#hР;v\s5W]uSo^5jT.]>noa'ѣنDMrRM'y.ʸNö6F[Z9˵*=,:[Q7{Uɢ}:偱ݺusMO8c5ڐS/_?9DIlGΔƒw:}K2ؑD3kɗ:j{>G%k=if׊f8ȣFdΝ;E$\:+++}>_}ѓ-D΄Kd{瞠b"^Qk}%C%4 @\|]5Չj{ԐaCN.9:t5+!@DM{ո}ϸJb375x,C9GyYS˸Y\N_M伽/tpB:s S)j4K~GSaa5J""+6# bQAz$aЊU5UVv?-#jL::))КG5"lZmR~ kEB⠱ \@\Pk"br^BQ-Ӿ=bT헎~N&h|Thqwѵm ^C-2Z՝<#ٗqejbR UQSO=ÝI&O 4gt=$K/L%-47kDiu7DbI+WѭhiinިǮ*eĨQ&!7oG?^{36lX`<,\pÆ %+@V#9-<[dm2 }{V}dʥ]-hsE{{YgϞojjKjkku,ԮmhhPgbȐ!ZD=vU ,_AQ 8qMMݻ8Qoǖ>뮻뚛=-2>p@$qt*L).jZ"]e]cx$-m { &L8qMMM2|'MOH'so߾}ƌ!;::}QHbx8o۷ϝ; XyDcڵ*\ܐ!Cp&Ex x8U*-aѓ9nR0J㊝@n';v,,[ d 3w ^[[ۯ_kQ]Ul 6&.Hax>P >E@cw|:"MϸdHo2xmw$-IhHte;$+Vݽ{7Nb7l0k֬m۶ 7BBjBCڶg$p"j^,-7ӛ]րg% ֊F( Oe3q=l޼y%zijwqgO/g?ՇQFj$däGŅP8$Vc,У,0pʕ+~i e%ظq*{rz`7ސv uQ %D:.7̙Ns^Xj2AM-N3YkT$\JSGI\E>ZZZ?sL9rdCC3f޽{۷O6m̙3vQF&˨?F 'xiT@l޼yC BSN5kԩScUsr)W^yUW]{7SF6='GEsf-Y09r;f:J 0z15ޡ Ǘ[#T$ B"D:wv-_{ "?dHQ і0ZeN]"v:ۗ'= <*JvyT4vLOK{TtӚ\MXNkwr sw/ҥK[F> IDATVp ǣ $R(ԉD>tٔQtqa/U`0*c045{oɡӛ"BP&5!DYx:SHeGڀ`t dG)fעyRH"E c0 pcF9@%8,$qv/&X VhKzdVPL|`뛡X@Ewp1AlM@t Wr٬}ZĦ6ϱI>Bi` t˸vyT2KGNIr=zl:[ipY\ѹ/&Ga0%"i 8 gtn\G\ q/~%*1 FπN._Mu2O_zrȏ<G  -ё:@`0EzaR,uЄ-TI\-H8Bh`0Ec_3x/ċx=O.9)ݪF݃,{7o޼UV3׿~ij˪[o\;⬞阌\,w*'p8FOSZ8J _ު'HVi#PF#J 2[?{ァvkpBK,o[H/~mll/YFGW͛wꩧ"wr)PsGGǯSȟ(:wP`<"Gޚr@.a,2D宎v"v$ a&;zT"͛cA~*SNYlIo;3KP(\|0 P4w7)!YH@/輴[t;<8qU}w'x"W,83r /p'#F\q)[`sF~I֨b\$n %b 4 GJ!D…(:T,`IO>LL8o+_zwtM2DMMMuuŋ'1Q[[pºo,0l0IvcwH%P?r;3s;C[g[.]*/5w0ƸY(-bԙrmҼT 5όYgCǍwEe, >駟a\UUU]tۛ9#8"\Ֆ7'OtE:6zWv؈\o}3fGC|3?я @sXuӹijt pA%϶:ڸj{^T.>15~aIJHǮ}wwydC=T7^4G1K6\PG5HSVl5g|wlٲy0w;s9=HǮŷ~ɓ=P֞={~^}ycdL1y egC,,⭱2zͨwDt- qMMMccvacƌ1 ̚5]HǮ>>DžBOC ,zlN.wmT^BCД)qI|jPbT "m\~Di-2%[8qG:ft B"c%Rvcd|HK HeH:d҈77ƏTKZňSuF9f0e`sox\%LhSJNKx%NGKvb _7G%HiJ`0{{T 3?y3/[I,I'il-]p09"f01ZGK wYm'T)=D怡`G:fA0/tܾ*PxpUW칕\•(l}3#I|ƸVd8|N(--^]1j(WnR,f0uJx398"kf<'ÃQqQm=*j}UX45]E83 FI} 2jmg\KAm$[[2K{>/BglB*,`0e0?F'FŮd *IsBEx&ݖrW QXclB/ `ZC :":;_\h-ؓ_~'oWUUU!}ͤN*)ZM`-*R,"SxZ(VXaÆo}[*e޽ӧO;vΝ;=P$  Aꪶ|#Î|uׯ7nO~>PHnj 6m[lk׮ɓ'Hnj &"|ZkT*O6 nwpo2*?2(Š+`Сd=S,,C7n>|8D:>?N:__U?1`ENa$% s/UtJ nx9Έ܃ ׽/e [ tw*q׮]TQD#TFKX"58c o۶Nu?lٲ??T'1C3S f-2]sJlS ILܕEuu]wuWnhhxٲe---?'QU3<gyfXpDj>snݺs\ӡvU+1 FgS*N^Nȑ(F9Ψ08GmmmSN}! 4#bd؅W^yeΜ9GLdfN]7|$'ĂA,w M`JG[Y`{p1vm;v~0rEaZ$%P6doyСg>#3JL6#\(F0`un/_|3|^"_qЃ0zSGv#qp8E'zҷ I}`w;Sc„ &LD .@!  *guM7n|wSg͚U_____?{lf۶m̘1cTp7x%裏. rm^~׿GydÆ \skѪfP&f~x޽7?x8cnfOJ%K\r%#GT]..ZYo'W 6L4N DMBsIaSì@))q2sB f;ID^.3?I]N(k׾W_}uMMͯ~+p}4'x 2X,˭+W2eJPxZ[[7m䚥\hQ~vءy"(ƱG+!/\Z u~ȫɴi zqƭZ*Pm@9 ĺIϺnJe2XpyZ|ظq# Vv[[[qB0bĈ9s 0`Сg}믿>o޼CW\k׮z DͥG),ҚTKB&'|rSSS}}}VZ: 3z',Lrx> Io&.?\ZeDP/r9"{ja+W| /UtRY`ȑd}կ~%2#ꨣ_|ȿ˫xYwQ]M×%ظqJ14%ҤCf2[;2z?xn<6sop-Zry-X`ʕ3Na3g#Gu&ÇO>c7o|iytӧo9s~RE,Xyй:uYNҒ)?On営OR R1cݻ{޾}dyHg=-رc7pC'ax!"p/֪wpahS?B* |5ԡhFqTԛ\sOEU{Sm`h<_w]oz(d[9?HCFD!UʠeiY%Ьa bȕ$lw$9;ղuow h NhuΩl(%nI ѓt"JQ$1v/3kFЄF\ā1$-zȉbg0]rʨ>xҡNɜTKx͜"&xVyt] 3: d$\ 6GT ׈=m~$µ@/+[t$)#wτOa0]'II2u>w 뫷E T|7&&)H8(N1K\KC7*Nf9]kBocֽe #BZ. L:E\)Hİa'*@_a0eFm4M\ZfH@{A[m'RPD&؉`0*-8 Lf!senuD逈0J"q-$Ґg%+ÈLF`0&qfyIDž)@2xʐY+ <&6`0@ $nGֽN V NLYbZz'As8 4|SF1zg+&!"#-zX,}ƍGf9$`0#0tu PޯJW-H'l %c{֭*0MOQ\32YY"(O<[`A$czBT/C=Y {$s=w@{{YgϞ555*\ҥK̙suxׯW16l0iҤ:k޽ӧO;v^SS{2)%K.䒑#GmO2墋.{UyR a%^wMlfLm𐽺PB(M 4:::}Q.۷ˠMMM=؄ &Nx⦦&0a?Yfܹsk֬k>lشilٲs֝w޹qƇzO?mݶur?w={ȾH/_?rḤcIA$-^>E)/dlwdY3RġW4kkkWWWw5רċ/7_|9';vluui&Nxvawu| _?u=܍7~_ըF9D$~Сn:G3pWʃKN<dDC9$Sr-@KsKy'4M{&\A(R.rg뮯oЧOy{nypǏ=zGꪫ  vW8ꨣ_$OCpYg~(ӧ%[&q)0ХԐ@V0KG:v%aƾ)an(^b=$ 9s&9̙3|SO=Ə?cƌٳgO2e XnM7䒶cǎp E-XԩSg͚5uԎ4D1cƼk?OF D`0`:+:N]N>|wF$ql{\"pkBթ$lDA%U<;;iTuٺ \7n4iҙg9}JW^yeg}~օ@хh/Svn ߾ʓH>qB[GiQn[`(&!1q:aOZ".Bsss߾}'`ȑ}gN4a0zY[ĉTĠؤ-qׇP.@M*6{キ[7xV(ĥ˘tR) IDATN@v ڇ: a9 Hc)"˙ NNl" +V!s5^΂-1N‰,jBml3ȃ;Cr.ܧD(H$Y6X⥿s_%ma_ۯ'|,\^ xHU*+MNrj6j0 F~fx%ީ5-q_Q@T莬`T "81/* .lV9fu uNlI Ҝ/!R( )6eŕք!DWlJ~cފ([7}i[zdRϋQ /_,M=6Jαv"ńXxCʩ U](v̼qפ+~{m2VT @&QF)sDwE˹aqQR|rpCdzקU`|re;9|)v9)>)LQ*)8T,(d %K\r%#G|뭷pzmmmCCڵkq˗744{>}z]]رcwj"ӟ{/g͚U_____?{vhlly'eKΙ3뮫m_~ܸqJB2zkrQf5}iYMє9mh׻ܹsmo߾}ƌ~7o߾}ܹ槟~nۺu]-l߾]0jjjz&L0qŋ755#yg}vȐ!Go444߿ѢE~w5yٳg(93g#G6449s~ꩧg̘1{)S 8p֭馛/{Q~h. a0_;`%-7U?#U2wv1-9Ӣ{tSwŪgJqI&yӧO8/~y~ߪpŪ!4RfHv 'UL4] ܇GwR 8o%=F۷2{YgrlhF6i,q˘odjf֤z'3%B 9֞TkV4D?XX{yqȀF#q/XuRBiDJ˲VeM:nw?`iOl$pV43rTq2b7 Li bIR*8 R2H̯k$^5K4;QO FB4m$nֹCj ːEHCǫ FnٺU` X#w_Jwăf5m(5HǙI23n=O-#'U!f KS(\eѧWg}`0JBΫ)=,_J!Iv'ei.Y%`a F Ҕd[unӖ vPS=5QMӷ `0΂◜$Ήrj3@wQVcf0A1m6e#BHܖ\\(#+vҙ< )' oh}> (jbxG7N[`01%ub건YMB.S\5:}v*)'=! 9R ߹cZF)hiinݺ0= LPKb \$+zH}(&}1dسg;ְ 6L4MEj444PA_!3~xI\+N 'q# ~W8 elˉ\Ak:)gB:::dhcBP;sƍ=` ,ՐY^|Egfr]"A7`RH䦦}w} OX䪪38mgq oR4tN)UJUB6Fgozq EmTWW_uUUbŊ#Fy*L&I*㴑m[rx\ؼ9a$A{'݂nhhرcGGGo܄?,t8p30tˌ`tB[-EZB;1O qH<=JnJP+D" Vci%%n2{#kf^ޛ!ğd Wƫ>k:b kjQ( -ǮYD-"6. JE . (T-gyȅV%(-0sA|=l}O B^ `CQo=vsXv1Tcb 3R)yR\}xHH|< +Q ytjY^`,Xaַm㔌Vg0C; hJd;u)E[p\g-Q"b0QR:.E ?l/#<&_|ד`0!SYMiSƹ(qVhB72>VrW2$| ?Q9ٖ ՅVZ K-D `0ˆ62Nw5Q2W\'\bv։j`f0]$Ee|P8jSù33 $ލqjh]GL Q Lm1g|BWb;^ip4dA$V6!_\hdR; V9Cb F ! gT ] Y曷o>w\Bb(*0Osl LikQR#[)>z,7ˤ Lxè82İahB`pcF@Rs`k"\J q"Qf*&\(:`t1TjA"*qJƇ6p 2!Kr3阡xgTN eDVH;c|kַ[WXdOp iJOnl"?\Ȍܷo߮ԇA8rSE eQ߶V=QɪUxp3L[Dct%2!/]k4a0:ӗʄԟb)P@AcggS+8Qoc2=: {QN{x^xU״Rtַt:5gge_d0$n4GɮTnHdTc}[N$#?81#h~ \}? R!) B F zˤL^MxNvk3c@ 9#/x5!C"i ٮYfY2ṑt ND>l"ĚkF: Qi4)MC%b[ E?b<j9 " 3 Ҵ% c Ëh&%k\(_[(u"$5oe (;ZkR i-t0 Fa3]p*?R_JQ/C9)6Ul9f%SFPH騪A} { >M}”AcT 0 F% YfR|+8;{ߎ:BJ0ɌN6l4iR]]NܻwƎ+łgt0v'JPHdvW)%RHZ2ʅsl;ܸqC=C_677?ӷv֭[ϟ+43<( h9!G#9TVv 3}w>̱*hll|U+`С"c81Ӱt۵S,L/v8Փ Z\՝H]!.r;FKKo~ɓ')UbsktI%960mڴ^zܸqVvZnj Ia5]6yóib:-P:} {*'T__o߾7lٲ\=b0b{})AjM(޷nvz%9;w1ت*@lLFKW(qD6xSh;(݌#GΜ9s|;v={60#F ]|ŇvĉO;4./d d9f0z0B|ala@y9-K o~BЂQ^N%*1'!31 kVs$+?L+s=ITAؓ.2i=qף0.K6-Bї 'g#q ۵Ocjl 4;q^hBO/& \ ٔfGQMiCFY,{ZJU]D2FAfqF>pcF(FVJvdb O"t%m'&G6UYIGa0" })r|L9ff(I䠥oA쁼8ہQfS@ }(H*T57h wBᖻFHI-}+p bs:p+%Yf81 Cͽh ^sG$[c/_᭷鵵 k׮d`b;f۶m1c|Ayoȍj^؝ݽ{)S.;йLWRe䅴a{ieM$ ( iSF׋ x7 >o۷ϝ;WXg̘!vT{͚5ꫯK, /\vgϟK/]W\qE9.-eSiY @Q߷.Y,7ngJ 6l$V#qILp&eիWʕ+<]vIr_z駟Yo޼Cʡ b:::r_&Ãi%kytfpAQoRQqqsN=@ycK/!{ dt,]Tj;rHXdza@v̙y&Q>+=$%f]$TmE'v>ӷ 9s&1`3f̘={)ST n#sͳg2dѣeʴifΜ<|k׎5aǎ>vwtt!O>c7oެ"1nܸ-[̙3ꫯկ~k`3XY;Us:+ZV.^B|#suG)tӑBJaȋaJ֑gxSsdS6l^Au*__?=kʧN:餫93*[.3k׬ikk<1cq?_v$>7b< g,:$oS}[H IEs=Yi1Xޞ}֘+|7eʍ6nkgiN y;onͱWva_'p͛7?0̳*B z2:I5\VvmŔIMwiDM뱦7\7* Qv%7^q4?L( G7L6|U_l۶7>O7^?a?񱣎ꖎ榽|0??q'}MRKvѱbճ>20X3u#%٭K|f# 4H0|)BȐXtDB5 hmr{~ LvS+V=zfܦmlֶhϵEk׬=}dy?޺eU ?3>β}]?Ń{G̛Ђeqd=w8G7/R(-^S&û{BWљ7%"w0\1oy[LwŹ88xwZ;N: ^Xc՟=c,'NukWUeÖ g}*WW|>&_?SU$X6:}YvwȆGОdyȌܣg"p&J})Y+R|ՄfWtv.'ـA$KyHȑ+5nzEJy]m?z7.NN:lg񳟞:txG$:##wZ(KGNqO~j.2 tO_Fyiem?33@Q'6SﶊޚūQE񦳉3W\3ޱg3'"|wk׮N=G( g{Ǣ6ґnֵw;g=5_czV{gck(K5Ix/Dqe{/"[eU0}R$7$Sɼe\:BmE'3s5#c>3!i# YD錫['^]>llwEu W#z 0><ȴ%T+&EA3٬Mܝ.V"md@)V|gVt5at2B T:DzOP4ph$}c˹  &.Ȩ{tѕ]נ8_2=% @TEԥ k>սpǼ55·^FàHpMu Wx'-m7b/T_ Fz<0F|F/raK[tm˝@ngH&¤6jopvZʕˑ7\s3׬25at9JԓuOBdN;R} H"X٭h=ylb`0ɖ$Od[ +2] !ta2(WkDzP˽5a- ]޹.\|soBMX+JAIiudKR9K:/؝I3RGySOL }/H4Z]Z+ 0]aP"܂JEY}Oq}kW?LkK pdwQ?Tsciy V1Lk9A䞦~3j(ˑb8iuJq8Q*mXN"hlM {5hÐVv(EsLi?!zDyusOMK(0EUQPȨMI+X.D̢|{X=LmX}`4v!U҇ |)ϝꭟ-@u1 .G'HpLI4(֏҂t&EK\S;(@vKw)EA:mA ( Q)l"@tĘIQ C7f_bmEQ *b,P5ҼnJ`.ip/4ĕ3c@foc/ꎓB"f~u띴9'<&ۿU }%i te4n;̹ yi ( /h0Qwjt;S}}Q0ݶ*5C7ɺe*b^RUTIUBQ엾1,y U#Bz`BuT^rR=з oQvrmE5|#<DSU IGќGvyIgy9]s8RʀL] g_+Y8". *!s %f+PUu'!"H\"- RQ" %tHX-a> Q;.!"Z3R*i⅜ы I+x؈/EߪW׾[riGMh'+,ڈI`]*mFf+C6YSin9x:"}ӂzԤ @U_HX6$˧g7 %6;2rIDUyvK j/tR$8~Y;t )W䛊pdMהx{oL.+_/3K27>.}_2N/Ŧqu&'1'6!T5ۘXH@U?QO&6.3iI /6IRd t4/ i2l} VR`$n-6[0'WqL̫m Ya*7hyjfS8y<Ńg(t%~."Eߊ!QQUh mG1BLv2Nh.bCe+Ts+Ձ,$e\_GcY%D憪M$Ҫ& ۍ|qFG,M˨Q-i=;MH59.]'Zd 6蜼c]ȪSH$ e(cD`iA.2E^Q\%e02I01o @gBeA(PUSFǭ{&U/k20cd/WVFѯ?ZdѷK!($/z9, [*Հ6ۦ" htGJqr)=Ev.Vhϸ}$3ªTfDG(V%7wj' /NiRy@_bDFzaJb*W#T{Hޙ,ڦd݊aX-9PIz0d_Pq@e Wqx˨Rʹ<ԡ f9>pkw?7rsӉy2hұqh#< m؟6A*ͺ%OW^RӔt#;I:fX {/p]C!҆I]k˼ji&ZRַ6(i5DɌXK8`sCuf#ae'Ӫ t,Lat.2:I~-/L yP_eI5%4r4& f69H3K?BBjU#BL(D0@&;LWSv 9?L=rD UVĶŷdjo Ba\d(s 9}:wi5gs;;ܹێg!78ɦ$kJ%Uh_jFdP,)g;,6:j5rRmLEh{zQ(b(m8}0''gF_dBz4 IJF(7bc EFBNC6!1nd%`!Jc *#%O^afCG("}la}JR5$1FP&'%n֕}%BzaᗈF#ji}'q@.n& KU@Z"+֣u?eD⏼yԢOXH0-i}ҽvOad;.ETp=APSpt*-(la'97TT76$/WTƨ|w$N4uXr2)鰷R6pD!LSp}nNFozJjmL}g֭ynp#* (^?76~ MJJSl~\v1B5gݙY G)Cn|c IDAT@!N0äWWAR,JGƗeRW/ɴVwS7.X?a"'ǒ̅U}ECATmJDhBi:%"z~7a j N魤0Dڿ0kܭnjU6mQ$lCjЏ;r˥36UYr_5b R|UEidJF ۘuWӥ]HAVՉS#Q7BRNfzOFXJTWVNlzbH (E~۱sͅQCX+ߪkNj*Byd+;q|G;Y@t'Yo ~ 꼚lM|ڊ4UMS!"P屈3#,GE*rbӕ ӤtKkCȤc"}\I)JU dۧb2qAPvm-|%7JM -$}4Am$ޠE4k=peSQ^H8"p~u+0NЧZTQ :YAlt-$A< i,iImJҤG䢠Q#F\ nB]e|.Baᩭ؋UO˕ Ÿ14bVEgX'h}~Ī@4q NUf:{t,`o@+he Ѕ F|]'yG2| ϢJ?}oءٛKWcZ>U#}DJ]{pK&VKDBǫf,3ĉ1g_47߳`zs>hjVJ,pgۭvbG< #(vMD|6dszƜ͖ ˈ$62Kide>1KJa 'x|k.໧K粝 l^#@?j9Ɖ XDDŲ{AnfZaXCgj0G܊Փm*; Mt \F&LQ)Gc sO%= b`H#eZĊbjP85 0!RJ)4u*/uFc(F +aJݨHi[~vf!uFK@~Lr40t>H`2ˌ3mTVhT8uク-RO20:X0^rǞaFjnܿCu|is6'h%^1mJn2?KQ9q>8gcfܸ·?NJU,!`?L5ux\LˢD'#ɍȈMښ&j=ٴD1ڐ6םnunlb>N-PވzmTa2 |93m1’a;+eqC%N@vMӵjvrFb-1QJ{+[G.Q Ccn=p7H]'H aַ?Wgt;3MM1gG[#%kOz?>bʠ9Ϗ3[c*u-P daU cA?XA(񥧔QCsyLfZ!ՑP^cIceG3a:n#ަqS F%s!> &3 h}Ͻ 8Ay:w(5v9LɃs59o ,gVw2`gO1яmD#%?NZ /IENDB`davmail-6.3.0/src/site/resources/setup.html0100644 0000000 0000000 00000000527 13454122540 017463 0ustar000000000 0000000 Setup DavMail Redirecting to ... davmail-6.3.0/src/site/site.xml0100644 0000000 0000000 00000007704 14575630005 015122 0ustar000000000 0000000 false true DavMail images/davmailLogo.png http://davmail.sourceforge.net # # # org.apache.maven.skins maven-fluido-skin 1.7 ]]>

davmail-6.3.0/src/site/xdoc/advanced.xml0100644 0000000 0000000 00000030400 13645663670 016660 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Advanced settings Mickael Guessant

In addition to basic settings described in Getting started DavMail also supports the following settings:

Parameter Description Sample value
Default domain Default windows domain name DOMAIN
Display startup banner Whether to show the initial startup notification window or not true
Disable balloon notifications Disable all graphical notifications false
Disable update check Disable DavMail check for new version false
Folder size limit Message count limit on folder retrieval 100
Parameter Description Sample value
No proxy for comma separated list of hosts accessible without a proxy davmail.sourceforge.net
Allow remote connections Allow remote connections to the gateway (server mode) false
Bind Address Bind only to the specified network address, leave empty to listen on all network interfaces 10.0.1.2
Client connection timeout Client connection timeout in seconds, 0 to disable timeout, empty for 5 minutes 300
Enable KeepAlive Send KeepAlive character during large folder and messages download false
Parameter Description Sample value
Server certificate hash Manually accepted server certificate hash, contains the SHA1 hash of a manually accepted certificate (invalid or self signed) 9F:CC:59:82:1F:C:CD:29:7C:70:F0:D8:37:B1:77:3F:48:84:AE:C4
Key store type To encrypt communication between client and DavMail, create a server certificate, choose key store type and set key store path JKS
Key store SSL certificate key store file path path/to/keystore
Key store password Key store password password
Key password SSL key password inside key store password
Client key store type When the Exchange server requires mutual authentication, choose client certificate key store type, PKCS11 for smartcard, PKCS12 or JKS for certificate file. MSCAPI is also available on windows for native smartcard access. PKCS11
Client key store SSL client certificate key store file path path/to/keystore
Client key store password Client key store password, leave empty for runtime prompt password
PKCS11 library PKCS11 (smartcard) library path (.so or .dll) softokn3.dll
PKCS11 config Optional additional PKCS11 settings (slot, nssArgs, ...) slot=2
Parameter Description Sample value
Keep Delay (POP) Number of days to keep messages in Exchange trash folder before actual deletion, only for POP service 30
Sent Keep Delay (POP) Number of days to keep sent messages in Exchange sent folder, only for POP service 90
POP mark read Mark messages read on server immediately after retrieval true
Parameter Description Sample value
Calendar past events (Caldav) Get events in the past not older than specified days count, leave empty for no limits 90
Edit Caldav notifications Enable interactive Caldav edit notification window false
Force Active Sync update Use double event update to trigger ActiveSync mobile phones sync, only in WebDav mode false
Caldav alarm sound Convert Caldav alarm to sound alarm supported by iCal, e.g. Basso. Leave empty for no conversion Basso
Parameter Description Sample value
IDLE folder monitor delay (IMAP): IMAP folder idle monitor delay in minutes, leave empty to disable IDLE support 1
IMAP auto expunge Delete messages immediately on the server over IMAP, i.e. expunge message on \Deleted flag set true
Parameter Description Sample value
SMTP save in sent: Save messages sent over SMTP in server Sent folder true
Parameter Description Sample value
Logging levels Default, DavMail and HttpClient logging levels, see Log4J documentation for more details WARN
Log file Path DavMail log file path (default is davmail.log in working directory on Unix and Windows, ~/Library/Logs/DavMail/davmail.log on OSX) davmail.log
Log file Size Maximum log file size, use Log4J syntax, see RollingFileAppender . Set to 0 to use an external rotation mechanism, e.g. logrotate. 1MB
davmail-6.3.0/src/site/xdoc/androiddavdroidsetup.xml0100644 0000000 0000000 00000004145 13410710541 021314 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Android DavDroid setup Mickael Guessant

Note: you can't install DavMail directly on an phone, you need a separate DavMail server, see Android setup.

The easiest way to sync your Exchange calendar and contacts on Android is to rely on DavDroid. DavDroid is available on Google play store and F-Droid.

DavDroid team checked compatibility with DavMail, see: https://www.davdroid.com/tested-with/davmail-gateway/

Open DavDroid and add a new account. Choose Login with URL and user name.

On next screen, enter a name and choose Groups are separate VCards.

davmail-6.3.0/src/site/xdoc/androidmailsetup.xml0100644 0000000 0000000 00000005757 13410710541 020454 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Android Mail setup Mickael Guessant

Note: you can't install DavMail directly on an phone, you need a separate DavMail server, see Android setup.

Use the standard Android Email application to create an IMAP/SMTP account to connect to your DavMail server. Under manage accounts choose Add account and enter your email address and password, then select Manual Setup:

Choose IMAP ACCOUNT:

Confirm your email address, enter you login (can be different from email address when windows credentials are used to connect to Exchange/Office365). The IMAP server is your DavMail server, choose SSL (Accept all certificates) and enter DavMail IMAP port:

Next screen is dedicated to outgoing SMTP configuration. The SMTP server is your DavMail server, choose SSL (Accept all certificates) and enter DavMail SMTP port:

Adjust synchronisation settings to your needs and choose Next:

Enter an account name and set sender name and finish account creation:

Proceed to Davdroid setup

davmail-6.3.0/src/site/xdoc/androidsetup.xml0100644 0000000 0000000 00000002641 13410710541 017576 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Android setup Mickael Guessant

In order to use DavMail on Android, you need to install DavMail in server mode. This server must be available directly on the internet or through a Wifi connection. See Server setup for more information.

As mail data between your phone and DavMail travels on the internet, you probably want to switch DavMail to encrypted mode, see SSL setup

Once you have a working DavMail server, proceed to: Android Mail setup

Then sync your Exchange calendar and contacts: Davdroid setup

davmail-6.3.0/src/site/xdoc/build.xml0100644 0000000 0000000 00000010537 14757042647 016223 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Frequently asked questions Mickael Guessant

Building DavMail is quite simple:

  • Make sure you have Java 6 or 7 installed and set as current version by checking JAVA_HOME:
    • Unix/OSX: echo $JAVA_HOME
    • Windows: echo %JAVA_HOME%
  • Check if you already have Apache Ant installed :
    ant -version
    If you don't, download and unzip ant from ant.apache.org, add ant/bin full path to the PATH environment variable.
  • Get DavMail source package from sourceforge and uncompress it: tar xvzf davmail-src-*.tgz
    or checkout trunk: svn co https://svn.code.sf.net/p/davmail/code/trunk
    or get and uncompress tarball from https://sourceforge.net/p/davmail/code/HEAD/tree/trunk
  • Additional steps on Windows:
  • Go into davmail directory root directory (which contains the build.xml file) and type: ant

Packages are then available under dist

The source for the DavMail website is in the same version control system as the Davmail source.

To generate the HTML, have maven and the maven site plugin installed.

  • on .deb systems: sudo apt install maven libmaven-site-plugin-java
  • on .rpm systems: sudo yum install maven libmaven-site-plugin-java
  • on other systems: Install maven and maven-site-plugin

Generating the actual HTML is done by these commands:

mvn site

ant fix-site

The HTML files are then available under target/site/

davmail-6.3.0/src/site/xdoc/download.xml0100644 0000000 0000000 00000013100 13263220043 016673 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Download Mickael Guessant

The right DavMail package choice depends on your operating system and deployment (server or workstation).

Please consider making a donation to help this project at SourceForge Donation page

Download source tarball davmail-src-version.tgz
and follow instructions at Building DavMail from source

davmail-6.3.0/src/site/xdoc/faq.xml0100644 0000000 0000000 00000055162 14754153500 015662 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Frequently asked questions Mickael Guessant

Frequently asked questions on DavMail forums, mailing list or direct email.

How do I create a WIRE debug log ?

In DavMail trackers and forums, I often ask for a WIRE debug log. To create this log file, you will need to change DavMail settings under the Logging tab. Set the WIRE logging category to DEBUG level.

You can then reproduce your issue and send the log file to mguessan@free.fr

The davmail.log file is available in DavMail working directory on Unix and Windows, ~/Library/Logs/DavMail/davmail.log on OSX. This default path can be customized with the Log File Path setting.

Note: on OSX Lion the Library folder is hidden, a simple way to access it is to launch Console (Finder, Go to Utilities), right click on davmail.log and choose Reveal in Finder.

Office 365

Office 365 EWS endpoint is now standard for all customers:

https://outlook.office365.com/EWS/Exchange.asmx

Also make sure you set mode to EWS in settings

Is Office 365 modern authentication / MFA supported ?

Office 365 modern authentication is available with the following modes:

  • O365Interactive: will open an authentication window to let you enter your credentials and go through MFA check and consent.
  • O365Modern: same logic as O365Interactive, but use client provided credentials for Oauth negotiation, trigger PhoneApp MFA check transparently

Additional notes:

  • You will have to give your consent to DavMail access on first call, easiest way to authenticate in interactive mode with O365Interactive or O365Manual, alternative is to get actual url from davmail log file with O365Modern
    Example url, adjust client_id and redirect_uri to your configuration: https://login.microsoftonline.com/common/oauth2/authorize?client_id=facd6cff-a294-4415-b59f-c5b01937d7bd&response_type=code&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient&response_mode=query&resource=https%3A%2F%2Foutlook.office365.com&prompt=consent
  • You can use your own application client id instead of DavMail provided value, just create your application at https://apps.dev.microsoft.com/ [Update: portal no longer available] or directly on Azure AD if you have the rights, and add in davmail.properties:
    davmail.oauth.clientId=yourappid davmail.oauth.redirectUri=https://login.microsoftonline.com/common/oauth2/nativeclient
  • Default tenant id is common, set tenantId to force company tenant:
    davmail.oauth.tenantId=yourtenantid

In Azure you have to open Entra ID section then app registration, use https://login.microsoftonline.com/common/oauth2/nativeclient as redirect uri value. It is no longer possible to add EWS scope under API permissions but a simple workaround is to do it through manifest editor:

The required scopes are:

"requiredResourceAccess": [ { "resourceAppId": "00000002-0000-0ff1-ce00-000000000000", "resourceAccess": [ { "id": "3b5f3d61-589b-4a3c-a359-5dd4b5ee5bd5", "type": "Scope" } ] }, { "resourceAppId": "00000002-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "311a71cc-e848-46a1-bdf8-97ff7156d8e6", "type": "Scope" } ] } ]

In both cases (O365Interactive and O365Modern), once initial authentication succeeds DavMail keeps the refresh token and should automatically renew access token on expiration.

EWS endpoint not available

Unfortunately, this may mean your Exchange administrators blocked EWS access.

To check this, try to connect to https://mail.company.com/ews/exchange.asmx in your favorite web browser: you should get an authentication popup. On authentication success, you should get the EWS wsdl definition. If you don't, please contact the Exchange administrators to let them fix the broken Exchange server setup.

Another way to get EWS endpoint is to use Microsoft provided test page at:

https://testconnectivity.microsoft.com

Choose Outlook discover section, on test success expand details until you find POST response with EwsUrl value (internal and external).

Once you have this url, set it as OWA address in DavMail and force EWS mode

Note: Microsoft Outlook 2011 on OSX and native OSX applications also rely on EWS to connect to Exchange. Mobile devices (Android phones, iPhones, Windows mobile) use ActiveSync on a different endpoint.

Authentication fails with invalid user or password message

Authentication fails with the following message: Authentication failed: invalid user or password, retry with domain\user

Exchange before 2007 expects domain qualified user name, you may not have to provide the domain name on the logon form if javascript is used to add it, but DavMail can not execute javascript. Thus you need to prefix your user name with the Active Directory domain followed by \

Note to Mac users: OSX applications do not like username with backslash, you have to set windows domain name in DavMail advanced settings and use the simple username in client application.

Authentication fails with error in parsing the status line

Authentication fails with the following message: error in parsing the status line from the response: unable to find line starting with "HTTP"

Your Exchange server expects HTTPS (secured) connections, use https instead of http in OWA url.

Exchange RSA two factor authentication form

Exchange now supports two factor authentication for RSA tokens. This requires two potentially different user names in fields userid and username. Use a pipe in client to provide both values: userid|username. In some cases you will need to also provide domain name: userid|domain\username, do not set default windows domain name.

Where can I find DavMail settings file ?

The default location for DavMail settings is a file named .davmail.properties in user home folder. This file is hidden under Linux and OSX. On windows, the user home folder is under Document and Settings

How to run multiple instances of DavMail ?

Just create multiple configuration files and provide them as a command line option, see previous question:

davmail server1.properties davmail server2.properties

What are the prerequisites on Exchange server side ?

With Exchange 2003, you only need to have access to OWA (Outlook Web Access), Webdav, Address Book and public folders are always available. Unfortunately, this is not the case with Exchange 2007. You must make sure Webdav support is enabled on your server. You can test this by accessing https://mail.company.com/exchange, which should redirect to /owa. Another important service is the galfind (address book) access at /public/?Cmd=galfind

Additional information for Exchange administrators to enable WebDav:

After running through the pre-requisite checker for each server (Front End CAS server and Back End Mailbox server) and adding the appropriate roles and features, add the following via the ServerManager:

  • Select the IIS role, then add Role Services
  • Add WebDav Publishing (both Cas server and Mailbox Server)
  • On the Mailbox server, add the ISAPI extensions Role Service to the IIS role
  • On the Default Web Site (each server), enable WebDav
  • Should not have to enable any additional WebDav rules
  • Install the server roles
  • Create a test mailbox (see Exchange Docs)

To Test:

  • Ensure that Outlook Web Access works by using the https://exchangeServer/owa URL
  • Try using the pass through legacy URL: https://exchangeServer/exchange, if you receive an error 500 “Internal Server Error”, then WebDav is not working.

Is Exchange 2010 supported ?

As Microsoft decided to drop WebDav support in Exchange 2010, I had to implement a new backend from scratch to support the new Exchange Web Services interface. This support is still experimental, but is working quite well. However, you still need to enable it manually in .davmail.properties with the following line:
davmail.mode=EWS

Is DavMail based on Outlook protocol ?

Outlook anywhere uses MAPI RPC over HTTPS to access company LAN through the firewall. DavMail does not use MAPI at all but relies on WebDav (Exchange 2003/2007) or EWS (Exchange 2007/2010) to access Exchange. This means you need direct access over HTTPS to either the OWA WebDav url (/exchange/mail@company.com) or EWS (/ews/exchange.asmx) to access Exchange with DavMail.

How do I make DavMail start automatically ?

Add DavMail.app to "Login Items", see Opening items automatically when you log in

Why do I get black on black notifications on Ubuntu ?

This is an SWT bug, upgrade to SWT 3.6, see On Ubuntu, notify text conflicts with default theme. http://users.ox.ac.uk/~richardc/guides/LinuxNexus.html

DavMail hangs on 64-bit Linux

Disable use system proxies option in DavMail settings

How do I secure DavMail connections ?

Communication between DavMail and your Exchange server is secured by default as long as you access OWA over HTTPS.

Communication between the messaging client and DavMail is not secured by default. This is not an issue in standalone mode as all communication is local, but you may want to improve this in server (shared) mode.

This is quite simple: you just need to get a server certificate in PKCS12 or JKS format and add it in the key store section in DavMail settings, see SSL Setup.

Are my credentials safe ?

DavMail does not store Exchange username or password, they are provided by the messaging client over IMAP, HTTP, POP, SMTP or LDAP

How do I detect errors in Thunderbird/Lightning calendar ?

Unfortunately, Lightning does not provide much feedback of what is going on. To detect errors at this level, you may activate calendar log settings under Tools/Options/Advanced:

Invalid notifications

Lightning 0.9 mail notifications are broken, activate Caldav notifications to outbox instead:

Check the following parameter in Thunderbird, it should be set to true

calendar.caldav.sched.enabled=true

Public calendars

To access public folders in Lightning, the URL scheme is:

http://localhost:1080/public/path/to/calendar

To access public folders in iCal, the URL scheme is:

http://localhost:1080/principals/public/path/to/calendar

Note: iCal does not support folder names with spaces or special characters

Shared calendars

To access a shared calendar in Lightning, the URL scheme is:

http://localhost:1080/users/user@company.com

To access a shared calendar in iCal, the URL scheme is:

http://localhost:1080/principals/users/user@company.com

Note that you need to have access to parent calendar if the target calendar is a child calendar.

Timeout errors during IMAP sync (broken pipe)

If you Exchange server is too slow or you don't have enough network bandwidth or too many messages in a single folder, you may get timeout errors during message fetch.

A workaround on DavMail side is to limit folder message count retrieval by setting davmail.folderSizeLimit. Use this for shared servers with mobile clients to get fast sync and limit bandwidth usage.

To fix the problem in OSX Mail, go to your account setup under preferences. On the IMAP account having difficulty, go to the advanced tab. Where it says "keep copies for offline viewing", change it to "only messages I've read" or don't keep copies at all.

Under Thunderbird, you can try to change IMAP timeout setting mailnews.tcptimeout) or avoid full mailbox sync: disable global search and indexer under advanced options and change Synchronization & Storage options under Account Settings.

Client disconnects from DavMail server after a few minutes

The server sets a timeout on the socket which listens for client connections, controlled by the property davmail.clientSoTimeout. If there is no activity before the timeout period elapses, the connection will be closed. Setting this to 0 will disable the socket timeout.

If you have enabled the IDLE extension in DavMail, check your client is checking for new mail more frequently than the timeout you have set.

Message deleted over IMAP still visible through OWA

Delete action is not immediate with IMAP: you need to EXPUNGE the folder to actually delete a message.

A workaround is to set davmail.imapAutoExpunge=true in DavMail to force immediate message expunge. Note that this makes DavMail non compliant to IMAP RFC.

A workaround with Thunderbird is to set the property mail.imap.expunge_after_delete=true

Note that you will also encounter this issue with clients missing IMAP MOVE extension support. As message move does not exist in basic IMAP, a move is a copy followed by a delete.

Duplicate messages in Sent folder

Messages sent through DavMail appear twice in Sent folder when the IMAP client is setup to store sent messages on the server as Exchange already saves sent messages in this folder. Change IMAP client settings or change Save in Sent option in DavMail settings to avoid this issue.

Sent messages encoding issue with Thunderbird

If special characters appear replaced with ? in sent messages, set mail.strictly_mime advanced option. Go to Tools/Options/Advanced/General/Config Editor and look for a preference with namemail.strictly_mime, set value to true to send messages as quoted-printable.

Access another user mailbox

Either set base IMAP path in client settings to /users/otheruser@company.com or use the following username: domain\user\otheruser@company.com where otheruser@company.com it target mailbox name.

How to build DavMail ?

See Building DavMail from source

davmail-6.3.0/src/site/xdoc/gettingstarted.xml0100644 0000000 0000000 00000011631 13645663670 020150 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Getting started Mickael Guessant

In order to change DavMail settings, double click on the tray icon or right click on it and choose Settings...

The following table describes the main options :

Parameter Description Sample value
Exchange protocol Exchange/Office 365 connection mode:
  • O365Modern Office 365 modern authentication (Oauth2)
  • O365Interactive Office 365 with interactive browser window, not available in headless mode (OpenJFX required)
  • O365Manual Office 365 with interactive dialog, not available in headless mode
  • O365 Office 365 EWS mode
  • EWS Exchange 2007 and later
  • WebDav Exchange 2007 and earliear WebDav mode
  • Auto WebDav mode with EWS failover
OWA url Outlook Web Access URL to access the exchange server, i.e. the base webmail URL
The path depends on Exchange version and configuration, with or without a reverse proxy. DavMail must be able to find the authentication form at the provided URL.
Usual paths for different Exchange versions:
  • Exchange 2003: https://mail.company.com/exchange/
  • Exchange 2007 Webdav mode: https://mail.company.com/owa/
  • Exchange 2007 EWS mode: https://mail.company.com/owa/
  • Exchange 2010 EWS mode: https://mail.company.com/owa/
  • Exchange 2010 EWS mode with unsupported authentication form e.g. Windows Live login: https://mail.company.com/ews/exchange.asmx
https://exchangeServer/owa/
Local POP port Local POP server port to configure in POP client 110
Local IMAP port Local IMAP server port to configure in IMAP client 143
Local SMTP port Local SMTP server port to configure in SMTP client 25
Local Caldav/Carddav HTTP port Local Caldav/Carddav server port to configure in Caldav (calendar) or Carddav (address book) client 80
Local LDAP port Local LDAP server port to configure in directory (address book) client 389

Uncheck a port to disable matching service.

Activate panel under Proxy tab to set an HTTP proxy and associated credentials if needed

If you need to adjust other advanced settings, check Advanced settings

Proceed to Thunderbird mail setup or OSX iCal setup

davmail-6.3.0/src/site/xdoc/index.xml0100644 0000000 0000000 00000013277 13543217166 016227 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway Mickael Guessant

Ever wanted to get rid of Outlook ? DavMail is a POP/IMAP/SMTP/Caldav/Carddav/LDAP exchange gateway allowing users to use any mail/calendar client (e.g. Thunderbird with Lightning or Apple iCal) with an Exchange server, even from the internet or behind a firewall through Outlook Web Access. DavMail now includes an LDAP gateway to Exchange global address book and user personal contacts to allow recipient address completion in mail compose window and full calendar support with attendees free/busy display.

DavMail is developed with JetBrains IntelliJ IDEA. YourKit also supports open source projects, including DavMail, with its full-featured YourKit Java Profiler.

DavMail Architecture

The main goal of DavMail is to provide standard compliant protocols in front of proprietary Exchange. This means LDAP for global address book, SMTP to send messages, IMAP to browse messages on the server in any folder, POP to retrieve inbox messages only, Caldav for calendar support and Carddav for personal contacts sync. Thus any standard compliant client can be used with Microsoft Exchange.

DavMail gateway is implemented in java and should run on any platform. Releases are tested on Windows, Linux (Ubuntu) and Mac OSX. Tested successfully with the Iphone (gateway running on a server).

DavMail CardDav implementation was sponsored by French Defense / DGA through project Trustedbird

davmail-6.3.0/src/site/xdoc/iphonecaldavsetup.xml0100644 0000000 0000000 00000005360 12564151557 020633 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - iPhone Caldav setup Mickael Guessant

Note: you can't install DavMail directly on an iPhone, you need a separate DavMail server, see iPhone setup.

Open iPhone Settings application and choose Mail, Contacts, Calendar:

Then select Add Account...:

DavMail is not an Exchange ActiveSync server, press Other:

Choose Add CalDAV Account:

Enter your DavMail server hostname in the Server field, append ':' and port if DavMail HTTP (Caldav and Carddav) port is not 80, provide your username and password then press Next:

On the account page, open Advanced Settings:

Enable SSL and check port, make sure Account URL is https://davmailhost:1080/principals/users/username@company.com:

davmail-6.3.0/src/site/xdoc/iphonecarddavsetup.xml0100644 0000000 0000000 00000005434 12564151557 021007 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - iPhone Carddav setup Mickael Guessant

Note: you can't install DavMail directly on an iPhone, you need a separate DavMail server, see iPhone setup.

Open iPhone Settings application and choose Mail, Contacts, Calendar:

Then select Add Account...:

DavMail is not an Exchange ActiveSync server, press Other:

Choose Add CardDAV Account:

Enter your DavMail server hostname in the Server field, append ':' and port if DavMail HTTP (Caldav and Carddav) port is not 80, provide your username and password then press Next:

On the account page, open Advanced Settings:

Enable SSL and check port:

Contact setup is complete, proceed to iPhone Caldav setup

davmail-6.3.0/src/site/xdoc/iphonemailsetup.xml0100644 0000000 0000000 00000014005 12564151557 020317 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - iPhone Mail setup Mickael Guessant

Note: you can't install DavMail directly on an iPhone, you need a separate DavMail server, see iPhone setup.

Open iPhone Settings application and choose Mail, Contacts, Calendar:

Then select Add Account...:

DavMail is not an Exchange ActiveSync server, press Other:

Choose Add Mail Account:

Enter your name, email address and password, then press Next:

Select IMAP account type:

In Incoming Mail Server section, enter your DavMail server hostname, append ':' and port if DavMail IMAP port is not 143:

In Outgoing Mail Server section, enter your DavMail server hostname, do not append port, this is not supported by current iOS version, then press Next:

Wait until your iPhone has finished verifying all possible port/protocol combination:

If you get the Cannot Connect Using SSL message, just select Yes, you will just need to adjust account settings later.

Save the account:

Confirm:

Back to account settings page, still need to fix SMTP port if DavMail is not listening on default port 25, open account settings:

Open Account Info:

Open SMTP page:

Choose primary server:

Adjust SMTP port:

Back to Account Info, open Advanced settings:

Back to Account Info, open Advanced settings:

Enable SSL on IMAP port:

Mail setup is complete, proceed to iPhone Carddav setup

davmail-6.3.0/src/site/xdoc/iphonesetup.xml0100644 0000000 0000000 00000003034 13410710541 017435 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - iPhone setup Mickael Guessant

In order to use DavMail with an iPhone, you need to install DavMail in server mode. This server must be available directly on the internet or through a Wifi connection. See Server setup for more information.

As mail data between your iPhone and DavMail travels on the internet, you probably want to switch DavMail to encrypted mode, see SSL setup

Once you have a working DavMail server, proceed to: iPhone Mail setup

Then sync your Exchange contacts: iPhone Carddav setup

And add your calendar: iPhone Caldav setup

davmail-6.3.0/src/site/xdoc/kerberos.xml0100644 0000000 0000000 00000007260 12564151557 016732 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Kerberos Mickael Guessant

DavMail now includes Windows authentication support, aka Kerberos. A new option is available in DavMail settings to rely on Kerberos token for Exchange authentication.

On windows, you have a valid Kerberos ticket on any workstation using your Active Directory logon. However, on recent Windows versions the TGT is not readable from Java. The workaround is to change the following registry key:

More details at: JGSS Troubleshooting

Windows kerberos token is not available on a default Linux workstation setup. You will need to configure /etc/krb5.conf with Active directory domain name. You may also need to provide a kdc (Active Directory Domain controller):

Then create Kerberos ticket: kinit username.

Check ticket withklist

In Kerberos mode, password provided by clients (IMAP, SMTP, POP, HTTP, LDAP) is ignored, thus you must make sure external connections to DavMail are disabled.

There is no way in current implementation to define a local password to secure client to DavMail communication.

DavMail needs direct access to Kerberos ticket, which means Kerberos will not work in server mode.

davmail-6.3.0/src/site/xdoc/linuxsetup.xml0100644 0000000 0000000 00000013244 14603561352 017327 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Linux setup Mickael Guessant

Prerequisite: Latest OpenJDK with OpenJFX support for best O365 support. Download of latest Azul FX now included in latest davmail script. If SWT is available it provides an improved tray icon (incompatible with O365Interactive mode). If you do not want any tray icon run DavMail with the -notray option.

Download the the platform independent package from Sourceforge and uncompress it with your favorite tool. If you want improved SWT tray icon add the appropriate SWT library in lib folder from http://www.eclipse.org/swt/, e.g. swt-4.9-gtk-linux-x86_64.jar

unzip davmail-version.zip

Run ./davmail azul once to fetch latest Azul JRE FX.

Just run ./davmail to launch DavMail. You should now see the DavMail gateway icon in the tray :

This page describes DavMail setup as a graphical application, if you don't want or need a user interface you can run DavMail in server mode

Download current debian package from Sourceforge, double click on it to launch package installer.

Select Install Package, installer will automatically download and install Java and the appropriate SWT package. After installation, DavMail is available in the Applications menu.

In order to run DavMail with systray on Ubuntu 18, you need:

  • Top icons and appindicator:sudo apt-get install gnome-shell-extension-top-icons gnome-shell-extension-appindicator gnome-tweak-tool
  • Enable both in Tweaks
  • Then run DavMail: XDG_CURRENT_DESKTOP= && davmail

Update for Ubuntu Unity users, you can install Indicator SystemtrayUnity: http://www.webupd8.org/2015/05/on-demand-system-tray-for-ubuntu.html

Note to Ubuntu 14 users, you can restore systray by following instructions at: How to whitelist all systray apps in Ubuntu 14.04 or 14.10 (with Unity)

Note to Ubuntu 13 users, you will need to apply the following patch to fix missing whitelist regression: Unity Desktop with Systray Whitelisting Support

Note to Ubuntu 12 Natty users: they eventually fixed Oneiric issue, use gsettings command below

Note to Ubuntu 11.10 Oneiric users: Unity does not support system tray defined by FreeDesktop, you will need to switch to standard Gnome Panel to use DavMail (and any other application using system tray)

Note to Ubuntu 10.04 users: all tray icons are hidden by default, use the following command to restore normal mode:

gsettings set com.canonical.Unity.Panel systray-whitelist "['all']"

If it still does not work, launch DavMail with notray option:

davmail -notray

Latest released package is available on build.opensuse.org and Fedora COPR

On Fedora or Centos, enable COPR repository and install DavMail package: dnf copr enable mguessan/davmail dnf install davmail

Tray icon support is not available by default on Fedora with Gnome desktop. You can run DavMail in window mode or install AppIndicator and KStatusNotifierItem Support

Adjust DavMail settings : Getting started

davmail-6.3.0/src/site/xdoc/macosxsetup.xml0100644 0000000 0000000 00000006227 14503245215 017461 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Mac OS X setup Mickael Guessant

Either setup Java 7/8 from Oracle Java page or use Apple provided Java 6 at Java for OS X 2014-001, then download DavMail-MacOSX-version.app.zip

Note to OSX Mountain Lion users: you need to disable Gatekeeper (at least temporarily) to avoid the warning or DavMail is damaged and can’t be opened message with Java 6 package.

Older OSX releases include Java 5, this version does not support Tray icon, and DavMail uses a dedicated frame instead. An upgrade to Java 6 will enable tray icon. Recent OSX versions either include Java 6 or can install it automatically on first Java application launch. Note that Java 7 is only available from Oracle and will not be provided by Apple.

Download DavMail Mac OSX package from Sourceforge:

OSX Download

Safari should automatically extract application from archive. If not, just double click on the zip file to trigger decompression. DavMail.app directory is then recognised as a valid OSX application, except on Mountain Lion as application downloaded through Safari are marked as invalid.

On OSX Mountain Lion, open System Preferences and choose Security and Privacy, then unlock panel with lock icon and choose Anywhere:

OSX Gatekeeper

Launch DavMail application once (double click on the application icon).

You can then go back to System Preferences/Security and Privacy and restore original setting.

On first start the application displays the Settings (Preferences) frame.

OSX Desktop

Growl is no longer supported.

Adjust DavMail settings: Getting started

davmail-6.3.0/src/site/xdoc/osxaddressbooksetup.xml0100644 0000000 0000000 00000002053 12564151557 021224 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - OSX Address Book setup Mickael Guessant

Launch OSX Address Book and create a new Carddav directory.

Enter your credentials and localhost:1080 as server location (Snow Leopard) or http://localhost:1080 (OSX Lion) to sync with the default personal address book.

Note: uncheck SSL mode if DavMail is in cleartext (default) mode.

davmail-6.3.0/src/site/xdoc/osxdirectorysetup.xml0100644 0000000 0000000 00000007450 12564151557 020736 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - OSX directory setup Mickael Guessant

DavMail Directory support is now available to access Exchange address book through LDAP. A special OpenDirectory naming context was implemented to enable iCal attendee completion.

In OSX Finder, go to Utilities and launch Directory Utility. Under OSX 10.6 Snow Leopard, Directory Utility is tucked away in /System/Library/CoreServices.

Leopard only: choose Show Advanced Settings, switch to Services tab

Select LDAPv3 and click the pencil icon (you may need to unlock settings with your admin password first):

Click New...:

Enter DavMail server name (localhost) and click Manual:

Enter Configuration Name and choose OpenDirectory in LDAP Mappings:

Enter o=od as Search Base Suffix and click Ok:

Now click Edit...:

If DavMail LDAP listen port is not 389, check Use custom port and enter actual port (default is 1389):

Then activate authentication under the Security tab and enter your credentials, then press OK twice to close the settings:

Under the Search Policy tab, choose Contacts, set Search to Custom Path and click the + to add /LDAPV3/localhost to the list of Directory Domains:

Proceed to OSX IMAP Mail setup

davmail-6.3.0/src/site/xdoc/osxicalsetup.xml0100644 0000000 0000000 00000006720 12564151557 017641 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - OSX iCal setup Mickael Guessant

DavMail Calendar support is now available, tested with Thunderbird/Lightning and Apple iCal. This should also work with other Caldav clients.

On OSX Mavericks: Launch iCal and open Preferences in Calendar menu, then choose Accounts and click the plus sign to open account creation dialog:

Choose Add other Account, then Add a Caldav account:

Choose advanced account type, enter username and password, server address is DavMail machine (localhost in workstation mode), leave / in server path and enter DavMail Caldav port (default is 1080). Do not enable SSL unless you setup DavMail with a server certificate.

On previous OSX versions, open iCal Preferences, go to the Accounts tab and click the plus button:

On Snow Leopard, choose CalDAV as account type, enter you Exchange username and password and server address without path:

http://localhost:1080

On 10.5 choose a name, enter you Exchange username and password. Open the server options section to define the calendar URL (adjust port to your settings):

http://localhost:1080/

Note that iCal will build the full principal path automatically.

Click Add, choose Connect Anyway in warning dialog:

Proceed to OSX directory setup to enable attendee completion.

davmail-6.3.0/src/site/xdoc/osximapmailsetup.xml0100644 0000000 0000000 00000016266 12564151557 020530 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - OSX IMAP Mail setup Mickael Guessant

There are two ways to access Exchange emails through DavMail Gateway: the good old and efficient POP protocol, limited to Inbox access and the IMAP protocol that enables full message folder tree access. IMAP support in DavMail is more recent and less optimised than POP. This page describes OSX IMAP Mail setup.

Note: see section below to setup an account on older OSX versions

Launch Apple Mail and choose Add Other Mail Account in add account dialog

Provide Full Name, Email address and password and click Create

Confirm "Account must be manually configured" by clicking Next

Account type is IMAP, mail server is DavMail host (localhost for workstation mode)

Enter username (can be email or windows login), click next

Confirm "Additional account information required" by clicking Next

Leave path prefix empty (except for shared mailbox access), enter DavMail IMAP port, authentication is password, click next

SMTP server is DavMail host again, click Create

Confirm "Additional account information required" by clicking Next

Enter DavMail SMTP port, authentication is password, then click Create

Launch Apple Mail, open Preferences and click the plus button to create a new account. Enter you full name, email address and password:

Choose IMAP account type, enter description, DavMail gateway address (localhost). Check username and password:

Click continue, if DavMail is not listening on the default IMAP port (143), you will get the following error message, click Continue again to proceed:

Leave SSL unchecked and click Continue:

Enter Outgoing Mail Server (SMTP) description and DavMail gateway address (localhost). Check Use Authentication and enter your Exchange username and password:

Click continue, if DavMail is not listening on the default SMTP port (25), you will get the following error message, click Continue again to proceed:

Leave SSL unchecked and click Continue:

Check summary and click Create:

Open the Mailbox Behaviors tab and uncheck Store sent messages on server, as Exchange already stores each sent message in this folder:

Under the advanced tab, enter actual DavMail IMAP port:

Under the Account Information tab, choose Edit Server List in Outgoing Mail Server (SMTP) field:

Open the advanced tab, check use custom port and enter actual DavMail SMTP port:

You may also want to set the Add invitations to iCal parameter to Never:

Proceed to OSX Address Book setup

davmail-6.3.0/src/site/xdoc/reviews.xml0100644 0000000 0000000 00000007667 12564151557 016615 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Reviews Mickael Guessant

In this page you find some independent reviews of DavMail and additional documentation on DavMail setup.

davmail-6.3.0/src/site/xdoc/roadmap.xml0100644 0000000 0000000 00000004765 14602052450 016533 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - RoadMap Mickael Guessant

DavMail features are now almost complete, yet there remains a lot of place for improvement. The following section lists the expected new features and enhancements in next DavMail versions.

Next minor release

  • Bugfix release, fix as many reported bugs as possible

Next major release

  • Implement a new Graph API backend. EWS is deprecated and will eventually be removed by Microsoft making this new backend mandatory

Features that may be implemented, but are not yet planned

  • Implement new OWA REST endpoint
  • Implement split authentication
  • Implement Caldav attachments
  • Implement IMAP subscribe/unsubscribe

Features that will not be implemented for various reasons, from limited resources to impossible to implement

  • Implement ActiveSync backend
  • Implement EWS frontend for Exchange 2003 backend and Outlook 2011
  • Implement instant messaging (chat)
davmail-6.3.0/src/site/xdoc/serversetup.xml0100644 0000000 0000000 00000026610 14754417473 017512 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Server setup Mickael Guessant

Prerequisite : Sun (Oracle) JRE or OpenJDK 8 or later.

Davmail Gateway can run in server mode as a gateway between the mail client and Exchange server through Outlook Web Access and/or EWS. In server mode Davmail can run on any Java supported platform. This mode was tested successfully with Iphone and Android phones and should work with any equipment with POP/IMAP/SMTP/LDAP/Caldav/Carddav client. In this mode many users can share the same DavMail instance.

The following documentation describes how to run DavMail as a non root user. The DavMail Debian package and DavMail RPM package include init scripts to run DavMail as a service.

Download the noinstall package for Windows or platform independent DavMail package from Sourceforge and uncompress it with your favorite tool, e.g. on Linux: unzip davmail-*.zip.

Prepare a davmail.properties file according to your local needs (the most current version can be found here) :

See Getting started for more information on the options. Make sure davmail.server is set to true (no icon tray) and allow remote connections: davmail.allowRemote=true.

To disable a listener, set an empty port value.

Launch Davmail with the following command: nohup davmail davmail.properties &.

Then check messages: tail -f nohup.out

A new WinRun4J davmailservice.exe wrapper is available in the windows package. Preferred package is the standalone windows package that comes with Zulu JDK.

To register DavMail as a windows service, use: davmailservice64 --WinRun4J:RegisterService or sc create DavMail binPath= \path\to\davmailservice64.exe type= own start= auto

If you get [err] Could not access service manager: 5 message make sure you open command line in administrator mode first and run command again. On first start service will create a default davmail.properties file in DavMail directory, note that this is different from user mode where .davmail.properties is located in user home directory. Adjust this configuration to your requirements and restart DavMail.

To launch DavMail on OSX with LaunchDaemon, you may try the following user provided script:

Label davmail RunAtLoad ProgramArguments /usr/libexec/davmail/davmail /usr/libexec/davmail/davmail.properties ]]>

Prerequisites : Oracle JRE 8 or later or OpenJDK 8 or later and any JEE compliant web container

Davmail Gateway can now be deployed in any JEE application server using the war package. In this mode, DavMail listener threads run inside the application server and follow the web application lifecycle (start, stop, deploy, undeploy). The following items describe Tomcat deployment, details will vary according to the specific application server available.

Download the war DavMail package from Sourceforgedavmail-*.war, and deploy it inside the application server. In Tomcat, this means copy the war file to the webapps directory. If Tomcat is started and automatic deployment enabled (this is the default configuration), the package is automatically uncompressed and started.

The davmail.properties configuration file is then available under davmail-*/WEB-INF/classes.

Note: DavMail does not use the standard Tomcat HTTP connector and uses the same listeners in war and server modes. This means the HTTP port for Caldav url is specified in davmail.properties

See above and Getting started for more information on the options. Make sure davmail.server is set to true (no icon tray) and allow remote connections: davmail.allowRemote=true.

davmail-6.3.0/src/site/xdoc/sslsetup.xml0100644 0000000 0000000 00000017137 13060561046 016772 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - SSL setup Mickael Guessant

SSL is not necessary when DavMail is used in workstation mode, as communication between clients and DavMail remain local. However, in server (shared) mode e.g. with a smartphone connecting to DavMail over the internet, you should make sure encryption is enabled.

The simplest way to secure communication between mail/calendar clients and DavMail is to create a self signed certificate:

keytool -genkey -keyalg rsa -keysize 2048 -storepass password -keystore davmail.p12 -storetype pkcs12 -validity 3650 -dname cn=davmailhostname.company.com,ou=davmail,o=sf,o=net

Note to iPhone users: iOS does not support the default DSA algorithm, make sure you use an RSA key pair

Another note : do not use blank passwords, both keystore and key passwords must be set

If you have an official certificate in PEM form, convert it to PKCS12 with the following command:

openssl pkcs12 -export -in cert-davmail.pem -inkey privatekey-davmail.key -certfile chain-davmail.pem -out davmail.p12

Then add this keystore to DavMail settings:

If your already have your keystore in JKS format, just set keystoreType to JKS in DavMail settings. keystorePass is the password used to open the KeyStore, keyPass protects the private key inside the KeyStore. With PKCS12, keyPass and keystorePass are often identical.

Restart DavMail, all DavMail listeners will switch to secure mode: POP3S/IMAPS/SMTPS/HTTPS/LDAPS. You will also need to enable SSL in client applications and manually accept the certificate as it's not signed by a trusted Certification Authority.

Improving DavMail TLS listener security level

In order to improve TLS security, DavMail internally forces the following parameters:

jdk.tls.rejectClientInitiatedRenegotiation=true jdk.tls.ephemeralDHKeySize=2048

As DavMail is a java application, you can further improve security level means by java security properties. Edit jre/lib/security/java.security and adjust the following line to your requirements:

jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768, EC keySize < 224

Alternative: create a custom java.security file with the above line and tell DavMail to use it:

-Djava.security.properties=/path/to/java.security

Custom certificate authority

Most users rely on the interactive accept certificate dialog to handle non public certificate authorities. However, this will not work with an Exchange server cluster with a different certificate on each server. In this case, you need to update global Java truststore with the custom certificate authority:

keytool -import -alias root -keystore /path/to/jre/lib/security/cacerts -trustcacerts -file rootca.crt -storepass changeit -noprompt

Client certificate

In most cases, using https in OWA url is enough to secure communication between DavMail and Exchange. However, with Exchange servers setup to require mutual authentication, you will have to register your client certificate in DavMail settings, either through PKCS11 (smartcard) or file certificate.

To use a client certificate provided as a PKCS12 file, set the following keys in DavMail:

For a smartcard, first make sure you PKCS11 module is correctly installed by testing mutual authentication through a browser. Then set the following properties in DavMail:

PKCS11 library is the full path to the PKCS11 module (.so on Unix, .dll on windows) or simple library name if PATH (Windows) or LD_LIBRARY_PATH (Unix) already contains the full path. Add any additional PKCS11 parameter in PKCS11 Config parameter, e.g. slot = 2.

To adjust your settings, you can try to access the smartcard with java keytool. First create a file named pkcs11.config with the following lines:

and list certificates with keytool:

keytool -keystore NONE -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg pkcs11.config -list -v

Sample pkcs11.config for NSS Soft token (Thunderbird/Firefox):

Another one for Coolkey (see Coolkey for Debian and United States Department of Defense Common Access Cards):

Note that spaces in library path may break Sun PKCS11, use C:\Progra~2\ActivIdentity\ActivClient\acpkcs211.dll instead of C:\Program Files (x86)\ActivIdentity\ActivClient\acpkcs211.dll

More details on java PKCS11 setup in Sun PKCS11 guide

davmail-6.3.0/src/site/xdoc/thunderbirdcalendarsetup.xml0100644 0000000 0000000 00000005507 14577242212 022200 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Thunderbird calendar setup Mickael Guessant

DavMail Calendar support is now available, tested with Thunderbird/Lightning and Apple iCal. This should also work with other Caldav clients.

Thunderbird Lightning extension is now integrated in default configuration. Click new calendar (bottom left button on calendar window) and choose network calendar:

Specify username and location (adjust port to your settings): using auto-detection: http://localhost:1080 or full path: http://localhost:1080/users/mail@company.com/calendar

Replace mail@company.com with actual user email address.

Provide your password, same password used for email configuration:

Pick calendar to synchronize and optionally adjust properties:

With modern Exchange and O365 events are managed automatically on the server. Default Thunderbird settings should work fine.

Previously we had to make sure calendar.caldav.sched.enabled is true in Thunderbird advanced settings.

Proceed to Thunderbird directory setup

davmail-6.3.0/src/site/xdoc/thunderbirdcarddavsetup.xml0100644 0000000 0000000 00000004237 14577242212 022032 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Thunderbird Carddav setup Mickael Guessant

Thunderbird now supports Carddav natively, no need to install older SOGO extension.

Switch to adress book tab, click New Address Book / Add CardDAV Address Book:

Enter username and location (adjust port to your settings): http://localhost:1080 or point to a specific contact folder: http://localhost:1080/users/mail@company.com/contacts

Enter password, for older Exchange servers you may have to adjust username to your windows account name, i.e. domain\account:

Select the contact folder(s) you want to synchronize and click Continue

Synchronization should start automatically.

davmail-6.3.0/src/site/xdoc/thunderbirddirectorysetup.xml0100644 0000000 0000000 00000004435 14577242212 022432 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Thunderbird directory setup Mickael Guessant

DavMail Directory support is now available to access Exchange address book through LDAP.

Switch to adress book tab, click New Address Book / Add LDAP Address Book:

Choose a name, host is DavMail host (usually localhost), Base DN is ou=people, adjust port to your settings and set user to email address or Active Directory account name for older Exchange servers. Leave other options to default values.

You may have to use uid= prefix as username to make it look like a valid dn: uid=account

Note that password will be requested on first search:

You may also want to use this directory for mail completion in compose window. Check Directory Server and choose directory:

Proceed to Thunderbird Carddav setup

davmail-6.3.0/src/site/xdoc/thunderbirdimapmailsetup.xml0100644 0000000 0000000 00000001270 14575630005 022210 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Thunderbird mail setup Mickael Guessant

See Thunderbird mail setup

davmail-6.3.0/src/site/xdoc/thunderbirdmailsetup.xml0100644 0000000 0000000 00000013233 14577242212 021344 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Thunderbird mail setup Mickael Guessant

DavMail supports both IMAP and POP protocols. Most users choose IMAP to have full mailbox access as POP is limited to inbox folder only.

POP protocol is designed to retrieve messages from server and let the client manage storage/folder organization locally. All POP delete orders will move messages to server trash folder. In order to avoid quota issues on server, DavMail can automatically purge oldest messages from trash and sent folders.

DavMail can be used with any IMAP/SMTP client by adjusting the following description designed for Thunderbird. DavMail IMAP support is tested with Thunderbird, Outlook and Apple Mail.

For a new Thunderbird instance, new account wizard opens on first launch. If you already have existing accounts open Tools/Account settings then Account Actions/Add Mail Account...

Enter name, email address and password and click configure manually:

Incoming server type is IMAP, server hostname is localhost, default port is 1143, no SSL and normal password authentication. Outgoing server is localhost, default port is 1025, no SSL and normal password authentication. Set your username (windows account name or email address) and click Re-test to validate account settings, then Done:

By default local communication between Thunderbird and DavMail is not encrypted, and you get the following warning, check I understand the risks and confirm account creation:

Proceed with authentication in DavMail dialog if you have interactive mode enabled. Initial mail configuration is then complete.

Proceed to Thunderbird calendar setup

In Thunderbird email messages can be organized with message tags. Outlook provides similar functionality with categories. DavMail's IMAP gateway can transparently translate tags to categories (and vice versa). For custom defined tags it may be necessary to tell DavMail how to convert tags to categories.

Thunderbird stores tags on the server using IMAP keywords. But internally Thunderbird uses a mapping between the user visible tag names and the keywords actually used. For instance, the To Do tag is represented by the $label4 keyword. Assuming you want the Outlook categories to have the same names as the Thunderbird tags, DavMail must know which keywords Thunderbird uses for each tag.

The keywords used by Thunderbird can be found through Preferences -> Advanced -> Config Editor, and searching for mailnews.tags.*.tag, which will show them as mailnews.tags.keyword.tag settings with their corresponding tag user visible value.

Some default tags are defined in Thunderbird, for which DavMail uses a default mapping to categories:

These mappings can be overridden and extended by manually adding properties to the DavMail settings file (.davmail.properties) as davmail.imapFlags.keyword=category, like this:

davmail-6.3.0/src/site/xdoc/windowssetup.xml0100644 0000000 0000000 00000004226 13647357321 017670 0ustar000000000 0000000 DavMail POP/IMAP/SMTP/Caldav/Carddav/LDAP Exchange Gateway - Windows setup Mickael Guessant

Prerequisite : OpenJDK 8 or later. On windows, Zulu JRE FX is a good option to have OpenJFX available for O365Interactive.

If Java is not available, DavMail Jsmooth launcher will trigger java download and setup.

DavMail setup is straightforward, just follow the setup wizard.

Choose language:

Click Next:

Accept GPL licence:

Choose path:

Launch installation and start gateway:

Adjust DavMail settings : Getting started

davmail-6.3.0/src/test/davmail/AbstractDavMailTestCase.java0100644 0000000 0000000 00000012134 13645663670 022370 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail; import davmail.exchange.ExchangeSession; import davmail.http.DavGatewaySSLProtocolSocketFactory; import junit.framework.TestCase; import org.apache.log4j.Level; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * DavMail generic test case. * Loads DavMail test settings from test.properties */ public abstract class AbstractDavMailTestCase extends TestCase { protected static boolean loaded; protected static String url; protected static String certificateHash; protected static String username; protected static String password; protected static ExchangeSession session; @Override public void setUp() throws IOException { if (!loaded) { loaded = true; if (url == null) { // load test settings from a separate file File testFile = new File("test.properties"); if (!testFile.exists()) { throw new IOException("Please create a test.properties file with davmail.username and davmail.password"); } Settings.setDefaultSettings(); Settings.setProperty("davmail.server", "true"); try (FileInputStream fis = new FileInputStream(testFile)) { Settings.load(fis); } Settings.updateLoggingConfig(); if (Settings.getProperty("davmail.username") != null) { username = Settings.getProperty("davmail.username"); } if (Settings.getProperty("davmail.password") != null) { password = Settings.getProperty("davmail.password"); } } else { Settings.setDefaultSettings(); Settings.setProperty("davmail.url", url); Settings.setProperty("davmail.server.certificate.hash", certificateHash); Settings.setProperty("davmail.username", username); Settings.setProperty("davmail.password", password); } if (Settings.getBooleanProperty("davmail.enableKerberos", false)) { System.setProperty("java.security.krb5.realm", Settings.getProperty("java.security.krb5.realm")); System.setProperty("java.security.krb5.kdc", Settings.getProperty("java.security.krb5.kdc")); } DavGatewaySSLProtocolSocketFactory.register(); // force server mode Settings.setProperty("davmail.server", "true"); } } /** * Create MIME message with default recipient * @return mime message * @throws MessagingException on error */ protected MimeMessage createMimeMessage() throws MessagingException { return createMimeMessage("test@test.local"); } /** * Create test MIME message * @param recipient to recipient * @return mime message * @throws MessagingException on error */ protected MimeMessage createMimeMessage(@SuppressWarnings("SameParameterValue") String recipient) throws MessagingException { MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("To", recipient); mimeMessage.setText("Test message\n"); mimeMessage.setSubject("Test subject"); return mimeMessage; } /** * Convert MIME message to byte array. * @param mimeMessage mime message * @return content * @throws IOException on error * @throws MessagingException on error */ @SuppressWarnings("unused") protected byte[] getMimeBody(MimeMessage mimeMessage) throws IOException, MessagingException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); return baos.toByteArray(); } /** * enable wire debug logging (for Http Client 4) */ protected void enableWireDebugLogging() { Settings.setLoggingLevel("org.apache.http.wire", Level.DEBUG); Settings.setLoggingLevel("org.apache.http", Level.DEBUG); } } davmail-6.3.0/src/test/davmail/AbstractExchange2007TestCase.java0100644 0000000 0000000 00000003475 13645663670 023116 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail; import java.io.IOException; /** * Abstract test case to check Exchange 2007 access. * Required to check Dav and EWS access to Exchange */ public class AbstractExchange2007TestCase extends AbstractDavMailTestCase { protected String domain; protected String email; protected String server; @Override public void setUp() throws IOException { super.setUp(); // set Exchange 2007 server info from test.properties Settings.setProperty("davmail.server.certificate.hash", Settings.getProperty("davmail.exchange2007.server.certificate.hash")); server = Settings.getProperty("davmail.exchange2007.server"); domain = Settings.getProperty("davmail.exchange2007.domain"); username = Settings.getProperty("davmail.exchange2007.username"); email = Settings.getProperty("davmail.exchange2007.email"); password = Settings.getProperty("davmail.exchange2007.password"); } } davmail-6.3.0/src/test/davmail/TestDavGateway.java0100644 0000000 0000000 00000004313 13645663670 020627 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail; import davmail.http.HttpClientAdapter; import davmail.http.request.GetRequest; import davmail.ui.tray.DavGatewayTray; import java.io.IOException; public class TestDavGateway extends AbstractDavMailTestCase { /** * Loop on getReleasedVersion. * As the method closes HttpClient instance, this will create and close 100 connections */ public void testGetReleasedVersion() { int count = 0; while (count++ < 100) { DavGateway.getReleasedVersion(); } } /** * Loop on getReleasedVersion. * Use a single HttpClient instance to reuse connections */ public void testLoopGetReleasedVersion() { String versionUrl = "http://davmail.sourceforge.net/version.txt"; try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(versionUrl)) { int count = 0; while (count++ < 100) { GetRequest getRequest = new GetRequest(versionUrl); getRequest = httpClientAdapter.executeFollowRedirect(getRequest); String version = getRequest.getResponseBodyAsString(); System.out.println("DavMail released version: " + version); } } catch (IOException e) { DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_GET_RELEASED_VERSION")); } } } davmail-6.3.0/src/test/davmail/caldav/TestCaldav.java0100644 0000000 0000000 00000051454 13443231572 021213 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.caldav; import davmail.AbstractDavMailTestCase; import davmail.DavGateway; import davmail.Settings; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.http.URIUtil; import davmail.util.StringUtil; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.RequestEntity; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.jackrabbit.webdav.DavConstants; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.client.methods.DavMethodBase; import org.apache.jackrabbit.webdav.client.methods.MoveMethod; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; import org.apache.jackrabbit.webdav.property.DavPropertyName; import org.apache.jackrabbit.webdav.property.DavPropertyNameSet; import org.apache.jackrabbit.webdav.xml.Namespace; import org.apache.log4j.Level; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; /** * Test Caldav listener. */ public class TestCaldav extends AbstractDavMailTestCase { class SearchReportMethod extends DavMethodBase { SearchReportMethod(String path, String stringContent) throws UnsupportedEncodingException { this(path, stringContent.getBytes("UTF-8")); } SearchReportMethod(String path, final byte[] content) { super(path); setRequestEntity(new RequestEntity() { public boolean isRepeatable() { return true; } public void writeRequest(OutputStream outputStream) throws IOException { outputStream.write(content); } public long getContentLength() { return content.length; } public String getContentType() { return "text/xml;charset=UTF-8"; } }); } @Override public String getName() { return "REPORT"; } @Override protected boolean isSuccess(int statusCode) { return statusCode == HttpStatus.SC_MULTI_STATUS; } } HttpClient httpClient; @Override public void setUp() throws IOException { super.setUp(); if (httpClient == null) { // start gateway DavGateway.start(); httpClient = new HttpClient(); HostConfiguration hostConfig = httpClient.getHostConfiguration(); URI httpURI = new URI("http://localhost:" + Settings.getProperty("davmail.caldavPort"), true); hostConfig.setHost(httpURI); AuthScope authScope = new AuthScope(null, -1); httpClient.getState().setCredentials(authScope, new NTCredentials(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.password"), "", "")); } if (session == null) { session = ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.password")); } } public void testGetRoot() throws IOException { GetMethod method = new GetMethod("/"); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_OK, method.getStatusCode()); } public void testGetUserRoot() throws IOException { GetMethod method = new GetMethod("/users/" + session.getEmail() + '/'); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_OK, method.getStatusCode()); } public void testGetCalendar() throws IOException { GetMethod method = new GetMethod("/users/" + session.getEmail() + "/calendar/"); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_OK, method.getStatusCode()); } public void testGetInbox() throws IOException { GetMethod method = new GetMethod("/users/" + session.getEmail() + "/inbox/"); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_OK, method.getStatusCode()); } public void testGetContacts() throws IOException { GetMethod method = new GetMethod("/users/" + session.getEmail() + "/contacts/"); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_OK, method.getStatusCode()); } public void testPropfindCalendar() throws IOException { Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); PropFindMethod method = new PropFindMethod("/users/" + session.getEmail() + "/calendar/", null, 1); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); } public void testGetOtherUserCalendar() throws IOException { Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); PropFindMethod method = new PropFindMethod("/principals/users/" + Settings.getProperty("davmail.usera")); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); } public void testReportCalendar() throws IOException, DavException { SimpleDateFormat formatter = ExchangeSession.getZuluDateFormat(); Calendar cal = Calendar.getInstance(); Date end = cal.getTime(); cal.add(Calendar.MONTH, -1); Date start = cal.getTime(); StringBuilder buffer = new StringBuilder(); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); //buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); SearchReportMethod method = new SearchReportMethod("/users/" + session.getEmail() + "/calendar/", buffer.toString()); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); MultiStatus multiStatus = method.getResponseBodyAsMultiStatus(); MultiStatusResponse[] responses = multiStatus.getResponses(); ExchangeSession.Condition dateCondition = session.and( session.gt("dtstart", session.formatSearchDate(start)), session.lt("dtend", session.formatSearchDate(end)) ); List events = session.searchEvents("/users/" + session.getEmail() + "/calendar/", session.or(session.isEqualTo("instancetype", 1), session.and(session.isEqualTo("instancetype", 0), dateCondition)) ); assertEquals(events.size(), responses.length); } public void testReportInbox() throws IOException, DavException { StringBuilder buffer = new StringBuilder(); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); SearchReportMethod method = new SearchReportMethod("/users/" + session.getEmail() + "/inbox/", buffer.toString()); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); MultiStatus multiStatus = method.getResponseBodyAsMultiStatus(); MultiStatusResponse[] responses = multiStatus.getResponses(); /*List events = session.searchEvents("/users/" + session.getEmail() + "/calendar/", session.or(session.isEqualTo("instancetype", 1), session.and(session.isEqualTo("instancetype", 0), dateCondition)) );*/ //assertEquals(events.size(), responses.length); } public void testReportTasks() throws IOException, DavException { StringBuilder buffer = new StringBuilder(); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); SearchReportMethod method = new SearchReportMethod("/users/" + session.getEmail() + "/calendar/", buffer.toString()); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); MultiStatus multiStatus = method.getResponseBodyAsMultiStatus(); MultiStatusResponse[] responses = multiStatus.getResponses(); } public void testReportEventsOnly() throws IOException, DavException { StringBuilder buffer = new StringBuilder(); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); buffer.append(""); SearchReportMethod method = new SearchReportMethod("/users/" + session.getEmail() + "/calendar/", buffer.toString()); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); MultiStatus multiStatus = method.getResponseBodyAsMultiStatus(); MultiStatusResponse[] responses = multiStatus.getResponses(); } public void testCreateCalendar() throws IOException { String folderName = "test & accentué"; String encodedFolderpath = URIUtil.encodePath("/users/" + session.getEmail() + "/calendar/" + folderName + '/'); // first delete calendar session.deleteFolder("calendar/" + folderName); String body = "\n" + " \n" + " \n" + " \n" + " " + StringUtil.xmlEncode(folderName) + "\n" + " Calendar description\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " "; SearchReportMethod method = new SearchReportMethod(encodedFolderpath, body) { @Override public String getName() { return "MKCALENDAR"; } }; httpClient.executeMethod(method); assertEquals(HttpStatus.SC_CREATED, method.getStatusCode()); GetMethod getMethod = new GetMethod(encodedFolderpath); httpClient.executeMethod(getMethod); assertEquals(HttpStatus.SC_OK, getMethod.getStatusCode()); } public void testPropfindPrincipal() throws IOException, DavException { //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("calendar-home-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("calendar-user-address-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-inbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-outbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); PropFindMethod method = new PropFindMethod("/principals/users/" + session.getEmail() + "/", davPropertyNameSet, 0); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); MultiStatus multiStatus = method.getResponseBodyAsMultiStatus(); MultiStatusResponse[] responses = multiStatus.getResponses(); assertEquals(1, responses.length); } public void testRenameCalendar() throws IOException { String folderName = "testcalendarfolder"; String encodedFolderpath = URIUtil.encodePath("/users/" + session.getEmail() + "/calendar/" + folderName + '/'); // first delete calendar session.deleteFolder("calendar/" + folderName); String body = "\n" + " \n" + " \n" + " \n" + " " + StringUtil.xmlEncode(folderName) + "\n" + " Calendar description\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " "; SearchReportMethod method = new SearchReportMethod(encodedFolderpath, body) { @Override public String getName() { return "MKCALENDAR"; } }; httpClient.executeMethod(method); assertEquals(HttpStatus.SC_CREATED, method.getStatusCode()); MoveMethod moveMethod = new MoveMethod(encodedFolderpath, "http://localhost:" + Settings.getProperty("davmail.caldavPort")+"/users/" + session.getEmail() + "/movedcalendarfolder", true); httpClient.executeMethod(moveMethod); } public void testRenameMainCalendar() throws IOException { MoveMethod moveMethod = new MoveMethod("/users/" + session.getEmail() + "/Calendrierzzz", "http://localhost:" + Settings.getProperty("davmail.caldavPort")+"/users/" + session.getEmail() + "/Calendrier", true); httpClient.executeMethod(moveMethod); } public void testWellKnown() throws IOException, DavException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("current-user-principal", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("principal-URL", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("resourcetype", Namespace.getNamespace("DAV:"))); PropFindMethod method = new PropFindMethod("/.well-known/caldav", davPropertyNameSet, 0); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MOVED_PERMANENTLY, method.getStatusCode()); } public void testPrincipalUrl() throws IOException, DavException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("principal-URL", Namespace.getNamespace("DAV:"))); PropFindMethod method = new PropFindMethod("/principals/users/"+session.getEmail(), davPropertyNameSet, 0); httpClient.executeMethod(method); method.getResponseBodyAsMultiStatus(); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); } public void testPropfindRoot() throws IOException, DavException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("current-user-principal", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("principal-URL", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("resourcetype", Namespace.getNamespace("DAV:"))); PropFindMethod method = new PropFindMethod("/", davPropertyNameSet, 0); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); method.getResponseBodyAsMultiStatus(); } public void testPropfindAddressBook() throws IOException, DavException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); //davPropertyNameSet.add(DavPropertyName.create("getctag", Namespace.getNamespace("http://calendarserver.org/ns/"))); davPropertyNameSet.add(DavPropertyName.create("getetag", Namespace.getNamespace("DAV:"))); PropFindMethod method = new PropFindMethod("/users/" + session.getEmail()+"/addressbook/", davPropertyNameSet, 1); httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT, "Address%20Book/883 CFNetwork/454.12.4 Darwin/10.8.0 (i386) (MacBookPro3%2C1)"); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); method.getResponseBodyAsMultiStatus(); } public void testPropfindPublicPrincipal() throws IOException, DavException { //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("calendar-home-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("calendar-user-address-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-inbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-outbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); PropFindMethod method = new PropFindMethod("/principals/public/testcalendar/", davPropertyNameSet, 0); httpClient.executeMethod(method); assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode()); MultiStatus multiStatus = method.getResponseBodyAsMultiStatus(); MultiStatusResponse[] responses = multiStatus.getResponses(); assertEquals(1, responses.length); } } davmail-6.3.0/src/test/davmail/caldav/TestCaldavHttpClient4.java0100644 0000000 0000000 00000042750 13575531320 023275 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.caldav; import davmail.AbstractDavMailTestCase; import davmail.DavGateway; import davmail.Settings; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.http.HttpClientAdapter; import davmail.util.StringUtil; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.jackrabbit.webdav.DavConstants; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavMethods; import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.client.methods.BaseDavRequest; import org.apache.jackrabbit.webdav.client.methods.HttpPropfind; import org.apache.jackrabbit.webdav.client.methods.HttpProppatch; import org.apache.jackrabbit.webdav.property.DavPropertyName; import org.apache.jackrabbit.webdav.property.DavPropertyNameSet; import org.apache.jackrabbit.webdav.property.DavPropertySet; import org.apache.jackrabbit.webdav.property.DefaultDavProperty; import org.apache.jackrabbit.webdav.xml.Namespace; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; public class TestCaldavHttpClient4 extends AbstractDavMailTestCase { HttpClientAdapter httpClient; @Override public void setUp() throws IOException { super.setUp(); if (httpClient == null) { // start gateway DavGateway.start(); httpClient = new HttpClientAdapter("http://localhost:" + Settings.getProperty("davmail.caldavPort"), username, password); } if (session == null) { session = ExchangeSessionFactory.getInstance(username, password); } } public void testGetRoot() throws IOException { HttpGet method = new HttpGet("/"); try (CloseableHttpResponse response = httpClient.execute(method)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); } } public void testGetUserRoot() throws IOException { HttpGet method = new HttpGet("/users/" + session.getEmail() + '/'); try (CloseableHttpResponse response = httpClient.execute(method)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); } } public void testGetCalendar() throws IOException { HttpGet method = new HttpGet("/users/" + session.getEmail() + "/calendar/"); try (CloseableHttpResponse response = httpClient.execute(method)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); } } public void testGetInbox() throws IOException { HttpGet method = new HttpGet("/users/" + session.getEmail() + "/inbox/"); try (CloseableHttpResponse response = httpClient.execute(method)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); } } public void testGetContacts() throws IOException { HttpGet method = new HttpGet("/users/" + session.getEmail() + "/contacts/"); try (CloseableHttpResponse response = httpClient.execute(method)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); } } public void testPropfindCalendar() throws IOException { HttpPropfind method = new HttpPropfind("/users/" + session.getEmail() + "/calendar/", null, 1); try (CloseableHttpResponse response = httpClient.execute(method)) { assertEquals(HttpStatus.SC_MULTI_STATUS, response.getStatusLine().getStatusCode()); } } public void testGetOtherUserCalendar() throws IOException { HttpPropfind method = new HttpPropfind("/principals/users/" + Settings.getProperty("davmail.usera"), DavConstants.PROPFIND_ALL_PROP, new DavPropertyNameSet(), DavConstants.DEPTH_INFINITY); try (CloseableHttpResponse response = httpClient.execute(method)) { assertEquals(HttpStatus.SC_MULTI_STATUS, response.getStatusLine().getStatusCode()); } } public void testReportCalendar() throws IOException { SimpleDateFormat formatter = ExchangeSession.getZuluDateFormat(); Calendar cal = Calendar.getInstance(); Date end = cal.getTime(); cal.add(Calendar.MONTH, -1); Date start = cal.getTime(); BaseDavRequest method = new BaseDavRequest(URI.create("/users/" + session.getEmail() + "/calendar/")) { @Override public String getMethod() { return DavMethods.METHOD_REPORT; } }; String buffer = "" + "" + "" + "" + "" + "" + "" + "" + //"" + "" + "" + "" + "" + ""; method.setEntity(new StringEntity(buffer, ContentType.create("text/xml", "UTF-8"))); MultiStatus multiStatus = httpClient.executeDavRequest(method); MultiStatusResponse[] responses = multiStatus.getResponses(); List events = session.searchEvents("/users/" + session.getEmail() + "/calendar/", ExchangeSession.getZuluDateFormat().format(start), ExchangeSession.getZuluDateFormat().format(end) ); assertEquals(events.size(), responses.length); } public void testReportInbox() throws IOException { String buffer = "" + "" + "" + "" + "" + "" + "" + ""; BaseDavRequest method = new BaseDavRequest(URI.create("/users/" + session.getEmail() + "/inbox/")) { @Override public String getMethod() { return DavMethods.METHOD_REPORT; } }; method.setEntity(new StringEntity(buffer, ContentType.create("text/xml", "UTF-8"))); httpClient.executeDavRequest(method); } public void testReportTasks() throws IOException { String buffer = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; BaseDavRequest method = new BaseDavRequest(URI.create("/users/" + session.getEmail() + "/calendar/")) { @Override public String getMethod() { return DavMethods.METHOD_REPORT; } }; method.setEntity(new StringEntity(buffer, ContentType.create("text/xml", "UTF-8"))); httpClient.executeDavRequest(method); } public void testReportEventsOnly() throws IOException { String buffer = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; BaseDavRequest method = new BaseDavRequest(URI.create("/users/" + session.getEmail() + "/calendar/")) { @Override public String getMethod() { return DavMethods.METHOD_REPORT; } }; method.setEntity(new StringEntity(buffer, ContentType.create("text/xml", "UTF-8"))); httpClient.executeDavRequest(method); } public void testCreateCalendar() throws IOException, URISyntaxException { String folderName = "test & accentué"; //String folderName = "justatest"; URI uri = new URIBuilder().setPath("/users/" + session.getEmail() + "/calendar/" + folderName + '/').build(); // first delete calendar session.deleteFolder("calendar/" + folderName); String body = "\n" + " \n" + " \n" + " \n" + " " + StringUtil.xmlEncode(folderName) + "\n" + " Calendar description\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " "; BaseDavRequest method = new BaseDavRequest(uri) { @Override public String getMethod() { return "MKCALENDAR"; } public boolean succeeded(HttpResponse response) { int status = response.getStatusLine().getStatusCode(); return status == HttpStatus.SC_CREATED; } }; method.setEntity(new StringEntity(body, ContentType.create("text/xml", "UTF-8"))); httpClient.executeDavRequest(method); HttpGet getRequest = new HttpGet(uri); CloseableHttpResponse getResponse = httpClient.execute(getRequest); assertEquals(org.apache.commons.httpclient.HttpStatus.SC_OK, getResponse.getStatusLine().getStatusCode()); } public void testPropfindPrincipal() throws IOException { //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("calendar-home-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("calendar-user-address-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-inbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-outbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); HttpPropfind method = new HttpPropfind("/principals/users/" + session.getEmail() + "/", davPropertyNameSet, 0); MultiStatus multiStatus = httpClient.executeDavRequest(method); MultiStatusResponse[] responses = multiStatus.getResponses(); assertEquals(1, responses.length); } public void testRenameCalendar() throws IOException, URISyntaxException { String folderName = "testcalendarfolder"; String renamedFolderName = "renamedcalendarfolder"; URI uri = new URIBuilder().setPath("/users/" + session.getEmail() + "/calendar/" + folderName + '/').build(); // first delete calendar session.deleteFolder("calendar/" + folderName); session.deleteFolder("calendar/" + renamedFolderName); session.createCalendarFolder("calendar/" + folderName, null); DavPropertySet davPropertySet = new DavPropertySet(); davPropertySet.add(new DefaultDavProperty<>(DavPropertyName.create("displayname", Namespace.getNamespace("DAV:")), renamedFolderName)); HttpProppatch propPatchMethod = new HttpProppatch(uri, davPropertySet, new DavPropertyNameSet()); httpClient.executeDavRequest(propPatchMethod); ExchangeSession.Folder renamedFolder = session.getFolder("calendar/" + renamedFolderName); assertNotNull(renamedFolder); } public void testWellKnown() throws IOException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("current-user-principal", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("principal-URL", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("resourcetype", Namespace.getNamespace("DAV:"))); HttpPropfind method = new HttpPropfind("/.well-known/caldav", davPropertyNameSet, 0) { @Override public boolean succeeded(HttpResponse response) { return response.getStatusLine().getStatusCode() == DavServletResponse.SC_MOVED_PERMANENTLY; } }; httpClient.executeDavRequest(method); } public void testPrincipalUrl() throws IOException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("principal-URL", Namespace.getNamespace("DAV:"))); HttpPropfind method = new HttpPropfind("/principals/users/" + session.getEmail(), davPropertyNameSet, 0); httpClient.executeDavRequest(method); } public void testPropfindRoot() throws IOException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("current-user-principal", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("principal-URL", Namespace.getNamespace("DAV:"))); davPropertyNameSet.add(DavPropertyName.create("resourcetype", Namespace.getNamespace("DAV:"))); HttpPropfind method = new HttpPropfind("/", davPropertyNameSet, 0); httpClient.executeDavRequest(method); } public void testPropfindPublicPrincipal() throws IOException { DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); davPropertyNameSet.add(DavPropertyName.create("calendar-home-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("calendar-user-address-set", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-inbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); davPropertyNameSet.add(DavPropertyName.create("schedule-outbox-URL", Namespace.getNamespace("urn:ietf:params:xml:ns:caldav"))); HttpPropfind method = new HttpPropfind("/principals/public/testcalendar/", davPropertyNameSet, 0); MultiStatus multiStatus = httpClient.executeDavRequest(method); MultiStatusResponse[] responses = multiStatus.getResponses(); assertEquals(1, responses.length); } public void testInvalidDavRequest() { BaseDavRequest method = new BaseDavRequest(URI.create("/users/" + session.getEmail() + "/calendar/")) { @Override public String getMethod() { return DavMethods.METHOD_REPORT; } }; method.setEntity(new StringEntity("invalid", ContentType.create("text/xml", "UTF-8"))); try { httpClient.executeDavRequest(method); fail("Should fail"); } catch (IOException e) { assertNotNull(e.getMessage()); assertEquals(503, ((DavException)e.getCause()).getErrorCode()); } } } davmail-6.3.0/src/test/davmail/caldav/TestCaldavMeetings.java0100644 0000000 0000000 00000021430 13214050650 022666 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.caldav; import davmail.AbstractDavMailTestCase; import davmail.Settings; import davmail.exchange.*; import davmail.exchange.ews.EwsExchangeSession; import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Properties; import java.util.UUID; public class TestCaldavMeetings extends AbstractDavMailTestCase { ExchangeSession sessiona; ExchangeSession sessionb; String usera; String userb; @Override public void setUp() throws IOException { super.setUp(); // load testuser credentials Properties testProperties = new Properties(); testProperties.load(new FileInputStream("test.properties")); if (testProperties.getProperty("davmail.url") != null) { Settings.setProperty("davmail.url", testProperties.getProperty("davmail.url")); } usera = testProperties.getProperty("davmail.usera"); userb = testProperties.getProperty("davmail.userb"); if (sessiona == null) { sessiona = ExchangeSessionFactory.getInstance( usera, testProperties.getProperty("davmail.passworda")); } if (sessionb == null) { sessionb = ExchangeSessionFactory.getInstance( userb, testProperties.getProperty("davmail.passwordb")); } } public void testOpenSession() { // just test settings } public void dumpCalendar(ExchangeSession session) throws IOException { List events = session.getAllEvents("/users/"+session.getEmail()+"/calendar"); for (ExchangeSession.Event event: events) { System.out.println(event.getName()); VCalendar vCalendar = new VCalendar(event.getBody(), null, null); dumpEvent(vCalendar); } } public void dumpEvent(VCalendar vCalendar) { VObject vEvent = vCalendar.getFirstVevent(); System.out.println("**********"); System.out.println("Summary: "+vEvent.getPropertyValue("SUMMARY")); System.out.println("Organizer: "+vEvent.getPropertyValue("ORGANIZER")); System.out.println("Start: "+vEvent.getPropertyValue("DTSTART")); System.out.println("End: "+vEvent.getPropertyValue("DTEND")); List attendees = vEvent.getProperties("ATTENDEE"); if (attendees != null) { for (VProperty attendee: attendees) { System.out.println(attendee.getValue() +" "+attendee.getParamValue("PARTSTAT") +" "+attendee.getParamValue("ROLE")); } } System.out.println("**********"); } public void dumpEvent(ExchangeSession session, String itemName) throws IOException { ExchangeSession.Item item = session.getItem("calendar", itemName); VCalendar event = new VCalendar(item.getBody(), session.getEmail(), session.getVTimezone()); dumpEvent(event); } public void testGetCalendarA() throws IOException { dumpCalendar(sessiona); } public void testGetCalendarB() throws IOException { dumpCalendar(sessionb); } public String getFormattedDateTime(Date date, int hour) { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); return formatter.format(date)+"T"+hour+"0000"; } public VCalendar buildEvent(VObject timeZone, int startHour, int endHour) { VCalendar vCalendar = new VCalendar(); vCalendar.setTimezone(timeZone); VObject vEvent = new VObject(); vEvent.setType("VEVENT"); vEvent.addPropertyValue("UID", UUID.randomUUID().toString()); vEvent.addPropertyValue("SUMMARY", "Unit test event"); vEvent.addPropertyValue("LOCATION", "Location1"); Date now = new Date(); VProperty dtStart = new VProperty("DTSTART", getFormattedDateTime(new Date(), startHour)); dtStart.addParam("TZID", timeZone.getPropertyValue("TZID")); vEvent.addProperty(dtStart); VProperty dtEnd = new VProperty("DTEND", getFormattedDateTime(new Date(), endHour)); dtEnd.addParam("TZID", timeZone.getPropertyValue("TZID")); vEvent.addProperty(dtEnd); vCalendar.addVObject(vEvent); return vCalendar; } public void testCreateUpdateEvent() throws IOException { VCalendar vEvent = buildEvent(sessiona.getVTimezone(), 10, 11); dumpEvent(vEvent); String itemName = vEvent.getFirstVeventPropertyValue("UID")+".EML"; ExchangeSession.ItemResult itemResult = sessiona.createOrUpdateItem("calendar", itemName, vEvent.toString(),null, null); assertEquals(201, itemResult.status); ExchangeSession.Item item = sessiona.getItem("calendar", itemName); VCalendar createdEvent = new VCalendar(item.getBody(), sessiona.getEmail(), sessiona.getVTimezone()); dumpEvent(createdEvent); assertEquals( vEvent.getFirstVeventPropertyValue("DTSTART"), createdEvent.getFirstVeventPropertyValue("DTSTART") ); assertEquals( vEvent.getFirstVeventPropertyValue("DTEND"), createdEvent.getFirstVeventPropertyValue("DTEND") ); assertEquals( vEvent.getFirstVeventPropertyValue("LOCATION"), createdEvent.getFirstVeventPropertyValue("LOCATION") ); createdEvent.setFirstVeventPropertyValue("DTEND", getFormattedDateTime(new Date(), 12)); createdEvent.setFirstVeventPropertyValue("LOCATION", "Location updated"); sessiona.createOrUpdateItem("calendar", itemName, createdEvent.toString(), null, null); ExchangeSession.Item updatedItem = sessiona.getItem("calendar", itemName); VCalendar updatedEvent = new VCalendar(updatedItem.getBody(), sessiona.getEmail(), sessiona.getVTimezone()); dumpEvent(updatedEvent); assertEquals( createdEvent.getFirstVeventPropertyValue("DTEND"), updatedEvent.getFirstVeventPropertyValue("DTEND") ); assertEquals( createdEvent.getFirstVeventPropertyValue("LOCATION"), updatedEvent.getFirstVeventPropertyValue("LOCATION") ); sessiona.deleteItem("calendar", itemName); } public void testCreateMeeting() throws IOException { VCalendar vMeeting = buildEvent(sessiona.getVTimezone(), 10, 11); dumpEvent(vMeeting); String itemName = vMeeting.getFirstVeventPropertyValue("UID")+".EML"; ExchangeSession.ItemResult itemResult = sessiona.createOrUpdateItem("calendar", itemName, vMeeting.toString(),null, null); assertEquals(201, itemResult.status); ExchangeSession.Item item = sessiona.getItem("calendar", itemName); VCalendar createdEvent = new VCalendar(item.getBody(), sessiona.getEmail(), sessiona.getVTimezone()); dumpEvent(createdEvent); VProperty attendee = new VProperty("ATTENDEE", "mailto:"+sessionb.getEmail()); attendee.addParam("PARTSTAT", "NEEDS-ACTION"); attendee.addParam("ROLE", "REQ-PARTICIPANT"); createdEvent.addFirstVeventProperty(attendee); sessiona.createOrUpdateItem("calendar", itemName, createdEvent.toString(), null, null); ExchangeSession.Item updatedItem = sessiona.getItem("calendar", itemName); VCalendar updatedEvent = new VCalendar(updatedItem.getBody(), sessiona.getEmail(), sessiona.getVTimezone()); dumpEvent(updatedEvent); assertEquals( createdEvent.getFirstVeventPropertyValue("ATTENDEE"), updatedEvent.getFirstVeventPropertyValue("ATTENDEE") ); } } davmail-6.3.0/src/test/davmail/caldav/TestCaldavRecurringEvent.java0100644 0000000 0000000 00000017265 13674211425 024101 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.caldav; import davmail.AbstractDavMailTestCase; import davmail.Settings; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.VCalendar; import davmail.exchange.VObject; import davmail.exchange.VProperty; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.ResourceBundle; import java.util.TimeZone; import java.util.UUID; public class TestCaldavRecurringEvent extends AbstractDavMailTestCase { @Override public void setUp() throws IOException { super.setUp(); if (session == null) { session = ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.password")); } } public String getFormattedDateTime(Date date, int hour) { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); return formatter.format(date)+"T"+hour+"0000"; } public String getZuluFormattedDateTime(Calendar cal) { SimpleDateFormat utcFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'"); utcFormat.setTimeZone(TimeZone.getTimeZone("UTC")); return utcFormat.format(cal.getTime()); } public VCalendar buildEvent(VObject timeZone, int startHour, int endHour) { VCalendar vCalendar = new VCalendar(); vCalendar.setTimezone(timeZone); VObject vEvent = new VObject(); vEvent.setType("VEVENT"); vEvent.addPropertyValue("UID", UUID.randomUUID().toString()); vEvent.addPropertyValue("SUMMARY", "Unit test event"); vEvent.addPropertyValue("LOCATION", "Location"); VProperty dtStart = new VProperty("DTSTART", getFormattedDateTime(new Date(), startHour)); dtStart.addParam("TZID", timeZone.getPropertyValue("TZID")); vEvent.addProperty(dtStart); VProperty dtEnd = new VProperty("DTEND", getFormattedDateTime(new Date(), endHour)); dtEnd.addParam("TZID", timeZone.getPropertyValue("TZID")); vEvent.addProperty(dtEnd); vCalendar.addVObject(vEvent); return vCalendar; } public void dumpEvent(VCalendar vCalendar) { VObject vEvent = vCalendar.getFirstVevent(); System.out.println("**********"); System.out.println("Summary: "+vEvent.getPropertyValue("SUMMARY")); String organizer = vEvent.getPropertyValue("ORGANIZER"); if (organizer != null) { System.out.println("Organizer: " +organizer); } System.out.println("Start: "+vEvent.getPropertyValue("DTSTART")); System.out.println("End: "+vEvent.getPropertyValue("DTEND")); System.out.println("**********"); } public void testCreateUpdateRecurringEvent() throws IOException { VCalendar vEvent = buildEvent(session.getVTimezone(), 10, 11); // set weekly recurrence vEvent.setFirstVeventPropertyValue("RRULE", "FREQ=WEEKLY"); dumpEvent(vEvent); String itemName = vEvent.getFirstVeventPropertyValue("UID")+".EML"; ExchangeSession.ItemResult itemResult = session.createOrUpdateItem("calendar", itemName, vEvent.toString(),null, null); assertEquals(201, itemResult.status); ExchangeSession.Item item = session.getItem("calendar", itemName); VCalendar createdEvent = new VCalendar(item.getBody(), session.getEmail(), session.getVTimezone()); dumpEvent(createdEvent); assertEquals( vEvent.getFirstVeventPropertyValue("DTSTART"), createdEvent.getFirstVeventPropertyValue("DTSTART") ); assertEquals( vEvent.getFirstVeventPropertyValue("DTEND"), createdEvent.getFirstVeventPropertyValue("DTEND") ); assertEquals( vEvent.getFirstVeventPropertyValue("LOCATION"), createdEvent.getFirstVeventPropertyValue("LOCATION") ); createdEvent.setFirstVeventPropertyValue("DTEND", getFormattedDateTime(new Date(), 12)); createdEvent.setFirstVeventPropertyValue("LOCATION", "Location updated"); session.createOrUpdateItem("calendar", itemName, createdEvent.toString(), null, null); ExchangeSession.Item updatedItem = session.getItem("calendar", itemName); VCalendar updatedEvent = new VCalendar(updatedItem.getBody(), session.getEmail(), session.getVTimezone()); dumpEvent(updatedEvent); assertEquals( createdEvent.getFirstVeventPropertyValue("DTEND"), updatedEvent.getFirstVeventPropertyValue("DTEND") ); assertEquals( createdEvent.getFirstVeventPropertyValue("LOCATION"), updatedEvent.getFirstVeventPropertyValue("LOCATION") ); session.deleteItem("calendar", itemName); } public void testExclusion() throws IOException { VCalendar vEvent = buildEvent(session.getVTimezone(), 10, 11); // set dayly recurrence vEvent.setFirstVeventPropertyValue("RRULE", "FREQ=WEEKLY"); dumpEvent(vEvent); String itemName = vEvent.getFirstVeventPropertyValue("UID")+".EML"; ExchangeSession.ItemResult itemResult = session.createOrUpdateItem("calendar", itemName, vEvent.toString(),null, null); assertEquals(201, itemResult.status); ExchangeSession.Item item = session.getItem("calendar", itemName); VCalendar createdEvent = new VCalendar(item.getBody(), session.getEmail(), session.getVTimezone()); dumpEvent(createdEvent); // need to find current session timezone String tzid = session.getVTimezone().getPropertyValue("TZID"); System.out.println(tzid); // convert to standard timezone ResourceBundle tzBundle = ResourceBundle.getBundle("stdtimezones"); String stdtzid = tzBundle.getString(tzid); TimeZone javaTimezone = TimeZone.getTimeZone(stdtzid); Calendar nextWeek = Calendar.getInstance(); nextWeek.setTimeZone(javaTimezone); nextWeek.set(Calendar.HOUR, 10); nextWeek.set(Calendar.MINUTE, 0); nextWeek.set(Calendar.SECOND, 0); nextWeek.add(Calendar.DAY_OF_MONTH, 7); createdEvent.setFirstVeventPropertyValue("EXDATE", getZuluFormattedDateTime(nextWeek)); session.createOrUpdateItem("calendar", itemName, createdEvent.toString(), null, null); ExchangeSession.Item updatedItem = session.getItem("calendar", itemName); VCalendar updatedEvent = new VCalendar(updatedItem.getBody(), session.getEmail(), session.getVTimezone()); dumpEvent(updatedEvent); session.deleteItem("calendar", itemName); } } davmail-6.3.0/src/test/davmail/exchange/AbstractExchangeSessionTestCase.java0100644 0000000 0000000 00000003502 13375213061 025703 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.AbstractDavMailTestCase; import davmail.Settings; import davmail.exchange.dav.DavExchangeSession; import davmail.exchange.ews.EwsExchangeSession; import java.io.IOException; /** * Exchange session test case. * Open a session to default DavMail server as found in user davmail.properties, * except if url is not null */ public class AbstractExchangeSessionTestCase extends AbstractDavMailTestCase { @Override public void setUp() throws IOException { super.setUp(); if (session == null) { // open session, get username and password from davmail.properties // Note: those properties should *not* exist in normal production mode, // they are not used by DavMail, just by this test case session = ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.url"), Settings.getProperty("davmail.username"), Settings.getProperty("davmail.password")); } } } davmail-6.3.0/src/test/davmail/exchange/TestAuthenticators.java0100644 0000000 0000000 00000005722 13430367740 023346 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.AbstractDavMailTestCase; import davmail.Settings; import java.io.IOException; public class TestAuthenticators extends AbstractDavMailTestCase { public void testEWSAuthenticator() throws IOException { Settings.setProperty("davmail.mode", Settings.EWS); ExchangeSessionFactory.checkConfig(); // try application password for MFA enabledusers ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.app.password")); } public void testO365Authenticator() throws IOException { Settings.setProperty("davmail.mode", Settings.O365); ExchangeSessionFactory.checkConfig(); // try application password for MFA enabledusers ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.app.password")); } public void testO365ModernAuthenticator() throws IOException { Settings.setProperty("davmail.mode", Settings.O365_MODERN); ExchangeSessionFactory.checkConfig(); // use normal user password ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.password")); } public void testO365InteractiveAuthenticator() throws IOException { Settings.setProperty("davmail.mode", Settings.O365_INTERACTIVE); ExchangeSessionFactory.checkConfig(); // password entered by end user ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), "unused"); } public void testO365StoredAuthenticator() throws IOException { Settings.setConfigFilePath("davmail.properties"); Settings.load(); Settings.setProperty("davmail.authenticator", "davmail.exchange.auth.O365StoredTokenAuthenticator"); ExchangeSessionFactory.checkConfig(); // password entered by end user ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), "unused"); } } davmail-6.3.0/src/test/davmail/exchange/TestDoubleDotInputStream.java0100644 0000000 0000000 00000010075 12564151512 024416 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import junit.framework.TestCase; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * Test double dot input stream. */ public class TestDoubleDotInputStream extends TestCase { static final String END_OF_STREAM = "\r\n.\r\n"; protected String doubleDotRead(String value) throws IOException { DoubleDotInputStream doubleDotInputStream = new DoubleDotInputStream(new ByteArrayInputStream(value.getBytes())); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b; while ((b = doubleDotInputStream.read()) != -1) { baos.write(b); } return new String(baos.toByteArray()); } protected String doubleDotWrite(String value) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DoubleDotOutputStream doubleDotOutputStream = new DoubleDotOutputStream(baos); doubleDotOutputStream.write(value.getBytes()); doubleDotOutputStream.close(); return new String(baos.toByteArray()); } public void testSimple() throws IOException { String value = "simple test"; assertEquals(value, doubleDotRead(value + END_OF_STREAM)); } public void testNoEof() throws IOException { String value = "simple test"; assertEquals(value, doubleDotRead(value)); } public void testMultiLine() throws IOException { String value = "simple test\r\nsecond line"; assertEquals(value, doubleDotRead(value+END_OF_STREAM)); } public void testDoubleDot() throws IOException { String value = "simple test\r\n..\r\nsecond line"; assertEquals(value.replaceAll("\\.\\.", "."), doubleDotRead(value+END_OF_STREAM)); } public void testDoubleDotEnd() throws IOException { String value = "simple test\r\n.."; assertEquals(value.replaceAll("\\.\\.", "."), doubleDotRead(value+END_OF_STREAM)); assertEquals("..", doubleDotRead(".."+END_OF_STREAM)); } public void testWriteCRLF() throws IOException { String value = "simple test\r\n.\r\nsecond line"; assertEquals(value.replaceAll("\\.", "..")+END_OF_STREAM, doubleDotWrite(value)); } public void testEndsWithCRLF() throws IOException { String value = "simple test\r\n"; assertEquals("simple test"+END_OF_STREAM, doubleDotWrite(value)); } public void testEndsWithLF() throws IOException { String value = "simple test\n"; assertEquals("simple test\n"+END_OF_STREAM, doubleDotWrite(value)); } public void testWriteOSXCR() throws IOException { String value = "simple test\r.\rsecond line"; assertEquals(value.replaceAll("\\.", "..")+END_OF_STREAM, doubleDotWrite(value)); } public void testWriteUnixLF() throws IOException { String value = "simple test\n.\nsecond line"; assertEquals(value.replaceAll("\\.", "..")+END_OF_STREAM, doubleDotWrite(value)); } public void testAnotherTest() throws IOException { String value = "foo\r\n..bar"; assertEquals(value.replaceAll("\\.\\.", "."), doubleDotRead(value)); } } davmail-6.3.0/src/test/davmail/exchange/TestExchange2003ActiveSyncBug.java0100644 0000000 0000000 00000005653 13027251270 025022 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import junit.framework.TestCase; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import javax.mail.util.SharedByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; /** * Test Exchange 2003 ActiveSync bug. */ public class TestExchange2003ActiveSyncBug extends TestCase { public byte[] buildContent() throws MessagingException, IOException { MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", "testto <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.addHeader("cc", "testcc <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.setText("Test message "); mimeMessage.setSubject("Test subject "); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); byte[] content = baos.toByteArray(); return content; } public void testMailFrom() throws IOException, MessagingException { byte[] mimeBody = buildContent(); mimeBody = ("MAIL FROM: test \r\n\r\n"+new String(mimeBody)).getBytes("UTF-8"); System.out.println(new String(mimeBody)); System.out.println("******************************"); System.out.println("length: " + mimeBody.length); MimeMessage mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(mimeBody)); // workaround for Exchange 2003 ActiveSync bug if (mimeMessage.getHeader("MAIL FROM") != null) { byte[] mimeBodyCopy = new byte[((SharedByteArrayInputStream) mimeMessage.getRawInputStream()).available()]; int offset = mimeBody.length - mimeBodyCopy.length; System.arraycopy(mimeBody, offset, mimeBodyCopy, 0, mimeBodyCopy.length); mimeBody = mimeBodyCopy; mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(mimeBody)); System.out.println(new String(mimeBody)); } } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeAdapter.java0100644 0000000 0000000 00000013144 13445460612 023367 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import davmail.exchange.auth.ExchangeFormAuthenticator; import davmail.exchange.dav.DavExchangeSession; import davmail.exchange.ews.EwsExchangeSession; import davmail.http.DavGatewaySSLProtocolSocketFactory; import junit.framework.TestCase; import org.apache.log4j.Level; import java.io.IOException; import java.net.URI; import java.util.List; /** * Test Exchange adapter methods. */ public class TestExchangeAdapter extends TestCase { ExchangeSession davSession; ExchangeSession ewsSession; @Override public void setUp() throws IOException { if (davSession == null) { Settings.setConfigFilePath("davmail.properties"); Settings.load(); DavGatewaySSLProtocolSocketFactory.register(); ExchangeFormAuthenticator exchangeFormAuthenticator = new ExchangeFormAuthenticator(); exchangeFormAuthenticator.setUsername(Settings.getProperty("davmail.username")); exchangeFormAuthenticator.setPassword(Settings.getProperty("davmail.password")); exchangeFormAuthenticator.setUrl(Settings.getProperty("davmail.url")); exchangeFormAuthenticator.authenticate(); davSession = new DavExchangeSession(exchangeFormAuthenticator.getHttpClient(), exchangeFormAuthenticator.getExchangeUri(), exchangeFormAuthenticator.getUsername()); ewsSession = new EwsExchangeSession(exchangeFormAuthenticator.getHttpClient(), exchangeFormAuthenticator.getExchangeUri(), exchangeFormAuthenticator.getUsername()); Settings.setLoggingLevel("httpclient.wire", Level.INFO); } } public void assertEquals(ExchangeSession.Folder davFolder, ExchangeSession.Folder ewsFolder) { assertNotNull(ewsFolder); assertEquals(davFolder.folderPath, ewsFolder.folderPath); assertEquals(davFolder.folderClass, ewsFolder.folderClass); assertEquals(davFolder.hasChildren, ewsFolder.hasChildren); assertEquals(davFolder.unreadCount, ewsFolder.unreadCount); assertEquals(davFolder.isCalendar(), false); assertEquals(ewsFolder.isCalendar(), false); assertEquals(davFolder.isContact(), false); assertEquals(ewsFolder.isContact(), false); assertEquals(davFolder.noInferiors, false); assertEquals(ewsFolder.noInferiors, false); assertEquals(davFolder.getFlags(), ewsFolder.getFlags()); assertEquals(davFolder.etag.substring(0, ewsFolder.ctag.length()-1)+ 'Z', ewsFolder.etag); assertNotNull(davFolder.ctag); assertNotNull(ewsFolder.ctag); // dav and ews ctags are still different: dav contentag has milliseconds info assertEquals(davFolder.ctag.substring(0, ewsFolder.ctag.length()-1)+ 'Z', ewsFolder.ctag); } public void testGetInbox() throws IOException { ExchangeSession.Folder davFolder = davSession.getFolder("INBOX"); ExchangeSession.Folder ewsFolder = ewsSession.getFolder("INBOX"); assertEquals(davFolder, ewsFolder); } public void testGetSubFolder() throws IOException { ExchangeSession.Folder ewsFolder = ewsSession.getFolder("INBOX/bbbb"); } public void testFindFolder() throws IOException { List davFolders = davSession.getSubFolders("", false, false); Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); List ewsFolders = ewsSession.getSubFolders("", false, false); assertEquals(davFolders.size(), ewsFolders.size()); } public void testFindPublicFolder() throws IOException { List davFolders = davSession.getSubFolders("/public", false, false); Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); List ewsFolders = ewsSession.getSubFolders("/public", false, false); assertEquals(davFolders.size(), ewsFolders.size()); } public void testFindFolders() throws IOException { List davFolders = davSession.getSubFolders("/public", null, true); System.out.println(davFolders); } public void testSearchMessages() throws IOException { ExchangeSession.MessageList messages = davSession.searchMessages("INBOX"); for (ExchangeSession.Message message:messages) { System.out.println(message); } } public void testSearchEvents() throws IOException { List events = davSession.getAllEvents("calendar"); for (ExchangeSession.Event event:events) { System.out.println(event); } } } davmail-6.3.0/src/test/davmail/exchange/TestExchangePropfindMethod.java0100644 0000000 0000000 00000005162 13452623366 024737 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2011 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.exchange.dav.DavExchangeSession; import davmail.exchange.dav.ExchangePropFindMethod; import davmail.http.URIUtil; import org.apache.commons.httpclient.HttpStatus; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.property.DavPropertyNameSet; import org.apache.jackrabbit.webdav.property.DavPropertySet; import java.io.IOException; /** * Test custom Propfind method. */ public class TestExchangePropfindMethod extends AbstractExchangeSessionTestCase { public void testGetFolder() throws IOException { ExchangeSession.Folder folder = session.getFolder("INBOX"); assertNotNull(folder); DavPropertyNameSet davPropertyNameSet = new DavPropertyNameSet(); // davPropertyNameSet.add(Field.getPropertyName("displayname")); //PropFindMethod propFindMethod = new PropFindMethod(URIUtil.encodePath(((DavExchangeSession)session).getFolderPath(folder.folderPath))); //session.httpClient.executeMethod(propFindMethod); //propFindMethod.getResponseBodyAsMultiStatus(); ExchangePropFindMethod exchangePropFindMethod = new ExchangePropFindMethod(URIUtil.encodePath(((DavExchangeSession)session).getFolderPath(folder.folderPath)), davPropertyNameSet, 0); //PropFindMethod propFindMethod = new PropFindMethod(URIUtil.encodePath(((DavExchangeSession)session).getFolderPath(folder.folderPath))); session.httpClient.executeMethod(exchangePropFindMethod); MultiStatusResponse response = exchangePropFindMethod.getResponse(); DavPropertySet properties = response.getProperties(HttpStatus.SC_OK); System.out.println(properties); } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSession.java0100644 0000000 0000000 00000002037 12564151512 023426 0ustar000000000 0000000 package davmail.exchange; import davmail.Settings; import davmail.http.DavGatewaySSLProtocolSocketFactory; /** * Test Exchange session */ public class TestExchangeSession { private TestExchangeSession() { } /** * main method * @param argv command line arg */ public static void main(String[] argv) { // register custom SSL Socket factory int currentArg = 0; Settings.setConfigFilePath(argv[currentArg++]); Settings.load(); DavGatewaySSLProtocolSocketFactory.register(); ExchangeSession session; // test auth try { ExchangeSessionFactory.checkConfig(); session = ExchangeSessionFactory.getInstance(argv[currentArg++], argv[currentArg]); ExchangeSession.Folder folder = session.getFolder("INBOX"); folder.loadMessages(); //session.purgeOldestTrashAndSentMessages(); } catch (Exception e) { e.printStackTrace(); } } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSessionCalendar.java0100644 0000000 0000000 00000063643 13417332467 025102 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import davmail.exchange.ews.EwsExchangeSession; import davmail.exchange.ews.FolderQueryTraversal; import org.apache.log4j.Level; import javax.mail.MessagingException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; /** * Test Exchange session calendar features . */ @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class TestExchangeSessionCalendar extends AbstractExchangeSessionTestCase { public void testGetVtimezone() { VObject timezone = session.getVTimezone(); assertNotNull(timezone); assertNotNull(timezone.getPropertyValue("TZID")); } public void testDumpVtimezones() throws IOException { Properties properties = new Properties() { @Override public synchronized Enumeration keys() { Enumeration keysEnumeration = super.keys(); TreeSet sortedKeySet = new TreeSet(); while (keysEnumeration.hasMoreElements()) { sortedKeySet.add((String) keysEnumeration.nextElement()); } final Iterator sortedKeysIterator = sortedKeySet.iterator(); return new Enumeration() { public boolean hasMoreElements() { return sortedKeysIterator.hasNext(); } public Object nextElement() { return sortedKeysIterator.next(); } }; } }; @SuppressWarnings("Since15") Set tzReference = ResourceBundle.getBundle("tzreference").keySet(); Set timezoneids = ResourceBundle.getBundle("timezoneids").keySet(); Map timezoneIndexToIdMap = new HashMap(); for (String timezoneid:timezoneids) { timezoneIndexToIdMap.put(ResourceBundle.getBundle("timezoneids").getString(timezoneid), timezoneid); } for (int i = 1; i < 120; i++) { Settings.setProperty("davmail.timezoneId", String.valueOf(i)); VObject timezone = session.getVTimezone(); if (timezone != null && timezone.getProperty("TZID") != null) { String value = timezone.getPropertyValue("TZID").replaceAll("\\\\", ""); properties.put(value, String.valueOf(i)); if (timezoneIndexToIdMap.get(String.valueOf(i)) != null) { //properties.put(timezoneIndexToIdMap.get(String.valueOf(i)), ResourceBundle.getBundle("timezones").getString(value)); System.out.println(timezoneIndexToIdMap.get(String.valueOf(i)).replaceAll(" ", "\\\\ ") + '=' + ResourceBundle.getBundle("timezones").getString(value)); } else { System.out.println("Missing timezone id: "+i+" "+value); } //noinspection Since15 if (!ResourceBundle.getBundle("timezones").keySet().contains(value)) { System.out.println("Missing timezone: "+value.replaceAll(" ", "\\\\ ")); } } session.vTimezone = null; } FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream("timezoneids.properties"); properties.store(fileOutputStream, "Timezone ids"); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { // ignore } } } } public void testSearchCalendar() throws IOException { List events = null; try { events = session.getAllEvents("/users/" + session.getEmail() + "/calendar"); for (ExchangeSession.Event event : events) { System.out.println(event.getBody()); } } catch (IOException e) { System.out.println(e.getMessage()); throw e; } } public void testReportCalendar() throws IOException { List events = null; try { events = session.getAllEvents("/users/" + session.getEmail() + "/calendar"); for (ExchangeSession.Event event : events) { System.out.println(event.subject); ExchangeSession.Item item = session.getItem("/users/" + session.getEmail() + "/calendar", event.itemName); System.out.println(item.getBody()); } } catch (IOException e) { System.out.println(e.getMessage()); throw e; } } public void testGetFreeBusyData() throws IOException, MessagingException { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.set(Calendar.MONTH, 7); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); Date startDate = cal.getTime(); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); Date endDate = cal.getTime(); SimpleDateFormat formatter = ExchangeSession.getExchangeZuluDateFormat(); // personal fbdata String fbdata = session.getFreeBusyData(session.getEmail(), formatter.format(startDate), formatter.format(endDate), 60); assertNotNull(fbdata); // other user data fbdata = session.getFreeBusyData(Settings.getProperty("davmail.to"), formatter.format(startDate), formatter.format(endDate), 60); assertNotNull(fbdata); // unknown user data fbdata = session.getFreeBusyData("unknown@company.org", formatter.format(startDate), formatter.format(endDate), 60); assertNull(fbdata); } public void testCreateEvent() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" + "VERSION:2.0\n" + "METHOD:PUBLISH\n" + "BEGIN:VTIMEZONE\n" + "TZID:W. Europe Standard Time\n" + "BEGIN:STANDARD\n" + "DTSTART:16010101T030000\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010101T020000\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "CREATED:20120611T113748Z\n" + "LAST-MODIFIED:20120611T113823Z\n" + "DTSTAMP:20120611T113823Z\n" + "UID:040000008200E00074C5B7101A82E0080000000020EA852CF458CC0100000000000000001\n" + " 000000011278A1693B8494C8592446E6E249BCF\n" + "DTSTART;TZID=W. Europe Standard Time:20120926T100000\n" + "DTEND;TZID=W. Europe Standard Time:20120926T120000\n" + "END:VEVENT\n" + "END:VCALENDAR\n"; String itemName = "test ok"/*UUID.randomUUID().toString()*/ + ".EML"; session.createOrUpdateItem("calendar", itemName, itemBody, null, null); } public void testGetEvent() throws IOException { ExchangeSession.Item item = session.getItem("calendar", "19083675-f8ce-4d81-8ac8-096fa0bd0e13.EML"); item.getBody(); } public void testGetInbox() throws IOException { List items = session.getEventMessages("INBOX"); for (ExchangeSession.Item item : items) { System.out.println(item.getBody()); } } public void testSearchEventCount() throws IOException { Set properties = session.getItemProperties(); properties.add("recurringappointment"); properties.add("isrecurring"); properties.add("recurrencestart"); properties.add("recurrencetype"); Settings.setLoggingLevel("davmail", Level.WARN); Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); System.out.println("Item count: " + session.searchEvents("calendar", properties, null).size()); Settings.setLoggingLevel("httpclient.wire", Level.INFO); System.out.println("InstanceType null: " + session.searchEvents("calendar", session.isNull("instancetype")).size()); System.out.println("InstanceType not null: " + session.searchEvents("calendar", session.not(session.isNull("instancetype"))).size()); System.out.println("InstanceType 0: " + session.searchEvents("calendar", session.isEqualTo("instancetype", 0)).size()); System.out.println("InstanceType 1: " + session.searchEvents("calendar", session.isEqualTo("instancetype", 1)).size()); System.out.println("InstanceType 2: " + session.searchEvents("calendar", session.isEqualTo("instancetype", 2)).size()); System.out.println("InstanceType 3: " + session.searchEvents("calendar", session.isEqualTo("instancetype", 3)).size()); if (session instanceof EwsExchangeSession) { System.out.println("Recurring: " + session.searchEvents("calendar", session.isTrue("isrecurring")).size()); System.out.println("Non recurring: " + session.searchEvents("calendar", session.isFalse("isrecurring")).size()); System.out.println("Null recurring: " + session.searchEvents("calendar", session.isNull("isrecurring")).size()); System.out.println("recurringappointment master: " + session.searchEvents("calendar", session.exists("recurringappointment")).size()); System.out.println("recurrencestart master: " + session.searchEvents("calendar", session.exists("recurrencestart")).size()); //System.out.println("recurring master: " + session.searchEvents("calendar", session.isTrue("recurring")).size()); System.out.println("recurrencetype 2: " + session.searchEvents("calendar", session.isEqualTo("recurrencetype", 2)).size()); System.out.println("recurrencetype 0: " + session.searchEvents("calendar", session.isEqualTo("recurrencetype", 0)).size()); } } public void testCreateEventTZ() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//iCal4OL2.11.20\n" + "VERSION:2.0\n" + "X-WR-TIMEZONE:Europe/Berlin\n" + "CALSCALE:GREGORIAN\n" + "BEGIN:VTIMEZONE\n" + "TZID:Europe/Berlin\n" + "X-LIC-LOCATION:Europe/Berlin\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:20100328T010000\n" + "TZOFFSETTO:+0200\n" + "TZOFFSETFROM:+0100\n" + "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\n" + "END:DAYLIGHT\n" + "BEGIN:STANDARD\n" + "DTSTART:20101031T030000\n" + "TZOFFSETTO:+0100\n" + "TZOFFSETFROM:+0200\n" + "RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\n" + "END:STANDARD\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "UID:1BDEA2053DF34221AAD74B15755B6B89\n" + "LAST-MODIFIED:20111205T102048Z\n" + "SUMMARY:Roland Test\n" + "DESCRIPTION:\n" + "CLASS:PUBLIC\n" + "DTSTART;TZID=Europe/Berlin:20120205T113000\n" + "DTEND;TZID=Europe/Berlin:20120205T120000\n" + "DTSTAMP:20111205T102305Z\n" + "TRANSP:OPAQUE\n" + "STATUS:CONFIRMED\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "END:VEVENT\n" + "END:VCALENDAR"; String itemName = UUID.randomUUID().toString() + ".EML"; session.createOrUpdateItem("calendar", itemName, itemBody, null, null); } public void testCreateEventBrokenTZ() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "CALSCALE:GREGORIAN\n" + "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" + "VERSION:2.0\n" + "METHOD:PUBLISH\n" + "BEGIN:VTIMEZONE\n" + "TZID:Asia/Jerusalem\n" + "X-LIC-LOCATION:Asia/Jerusalem\n" + "BEGIN:STANDARD\n" + "DTSTART:19700923T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=-2SU;BYMONTH=9\n" + "TZOFFSETFROM:+0300\n" + "TZOFFSETTO:+0200\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:19700330T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1FR;BYMONTH=3\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0300\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "UID:20120920T061713Z-6599-1001-1-2\n" + "DTSTAMP:20120920T061713Z\n" + "DTSTART;TZID=\"Asia/Jerusalem\":2012092\n" + " 0T093000\n" + "DTEND;TZID=\"Asia/Jerusalem\":20120920T\n" + " 103000\n" + "TRANSP:OPAQUE\n" + "SEQUENCE:3\n" + "SUMMARY:test\n" + "CLASS:PUBLIC\n" + "DESCRIPTION:tEin Test!\n" + "CREATED:20120920T062017Z\n" + "LAST-MODIFIED:20120920T062017Z\n" + "ORGANIZER:MAILTO:shai.berger@healarium.com\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "END:VEVENT\n" + "END:VCALENDAR"; String itemName = UUID.randomUUID().toString() + ".EML"; session.createOrUpdateItem("calendar", itemName, itemBody, null, null); } public void testCreateEventDuplicateTZ() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//K Desktop Environment//NONSGML libkcal 4.3//EN\n" + "VERSION:2.0\n" + "X-KDE-ICAL-IMPLEMENTATION-VERSION:1.0\n" + "METHOD:PUBLISH\n" + "BEGIN:VTIMEZONE\n" + "TZID:Central Europe Standard Time\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:CEST\n" + "TZOFFSETFROM:+0000\n" + "TZOFFSETTO:+0200\n" + "DTSTART:19800405T230000\n" + "RDATE:19800405T230000\n" + "END:DAYLIGHT\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19810927T030000\n" + "RRULE:FREQ=YEARLY;UNTIL=19961027T030000;COUNT=15;BYDAY=-1SU;BYMONTH=9\n" + "END:STANDARD\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19971026T030000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" + "END:STANDARD\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19800928T000000\n" + "RDATE:19800928T000000\n" + "RDATE:19950924T030000\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:CEST\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "DTSTART:19810329T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VTIMEZONE\n" + "TZID:Central Europe Standard Time\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19971026T030000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:CEST\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "DTSTART:19810329T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "DTSTAMP:20180726T130457Z\n" + "CREATED:20180726T130457Z\n" + "UID:0b930f17-1d52-47ac-a9cd-d123dfb5cf0b\n" + "LAST-MODIFIED:20180726T130457Z\n" + "SUMMARY:tesssssss\n" + "DTSTART;TZID=Central Europe Standard Time:20180726T161500\n" + "DTEND;TZID=Central Europe Standard Time:20180726T173000\n" + "TRANSP:OPAQUE\n" + "ORGANIZER:MAILTO:P20315@xxx.yyy.zz\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "BEGIN:VALARM\n" + "DESCRIPTION:\n" + "ACTION:DISPLAY\n" + "TRIGGER:-PT15M\n" + "X-KDE-KCALCORE-ENABLED:TRUE\n" + "END:VALARM\n" + "END:VEVENT\n" + "END:VCALENDAR\n"; String itemName = UUID.randomUUID().toString() + ".EML"; session.createOrUpdateItem("calendar", itemName, itemBody, null, null); } public void testCreateEventInvalidRRule() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//K Desktop Environment//NONSGML libkcal 4.3//EN\n" + "VERSION:2.0\n" + "X-KDE-ICAL-IMPLEMENTATION-VERSION:1.0\n" + "METHOD:PUBLISH\n" + "BEGIN:VTIMEZONE\n" + "TZID:Central Europe Standard Time\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:CEST\n" + "TZOFFSETFROM:+0000\n" + "TZOFFSETTO:+0200\n" + "DTSTART:19800405T230000\n" + "RDATE:19800405T230000\n" + "END:DAYLIGHT\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19810927T030000\n" + "RRULE:FREQ=YEARLY;UNTIL=19961027T030000;COUNT=15;BYDAY=-1SU;BYMONTH=9\n" + "END:STANDARD\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "DTSTAMP:20180726T130457Z\n" + "CREATED:20180726T130457Z\n" + "UID:0b930f17-1d52-47ac-a9cd-d123dfb5cf0b\n" + "LAST-MODIFIED:20180726T130457Z\n" + "SUMMARY:tesssssss\n" + "DTSTART;TZID=Central Europe Standard Time:20180726T161500\n" + "DTEND;TZID=Central Europe Standard Time:20180726T173000\n" + "TRANSP:OPAQUE\n" + "ORGANIZER:MAILTO:P20315@xxx.yyy.zz\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "BEGIN:VALARM\n" + "DESCRIPTION:\n" + "ACTION:DISPLAY\n" + "TRIGGER:-PT15M\n" + "X-KDE-KCALCORE-ENABLED:TRUE\n" + "END:VALARM\n" + "END:VEVENT\n" + "END:VCALENDAR\n"; String itemName = UUID.randomUUID().toString() + ".EML"; session.createOrUpdateItem("calendar", itemName, itemBody, null, null); } public void testMissingTimeZone() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" + "VERSION:2.0\n" + "METHOD:PUBLISH\n" + "BEGIN:VTIMEZONE\n" + "TZID:Missing timezone id\n" + "BEGIN:STANDARD\n" + "DTSTART:16010101T030000\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010101T020000\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "CREATED:20120611T113748Z\n" + "LAST-MODIFIED:20120611T113823Z\n" + "DTSTAMP:20120611T113823Z\n" + "UID:040000008200E00074C5B7101A82E0080000000020EA852CF458CC0100000000000000001\n" + " 000000011278A1693B8494C8592446E6E249BCF\n" + "DTSTART;TZID=Missing timezone id:20120926T100000\n" + "DTEND;TZID=Missing timezone id:20120926T120000\n" + "END:VEVENT\n" + "END:VCALENDAR\n"; VCalendar vCalendar = new VCalendar(itemBody, session.getEmail(), session.getVTimezone()); vCalendar.convertCalendarDateToExchangeZulu("20120926T100000", "Missing timezone id"); } public void testSearchTasks() throws IOException { List events = null; try { events = session.searchTasksOnly("/users/" + session.getEmail() + "/tasks"); for (ExchangeSession.Event event : events) { System.out.println(event.getBody()); } } catch (IOException e) { System.out.println(e.getMessage()); throw e; } } public void testGetVTimezone() throws IOException { // first create an invalid temp folder session.createMessageFolder("davmailtemp"); assertNotNull(session.getVTimezone()); } public void testInvalidRrule() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" + "VERSION:2.0\n" + "METHOD:PUBLISH\n" + "BEGIN:VTIMEZONE\n" + "TZID:Romance Standard Time\n" + "BEGIN:DAYLIGHT\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "TZNAME:CEST\n" + "DTSTART:19700329T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "BEGIN:STANDARD\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "TZNAME:CET\n" + "DTSTART:19701025T030000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" + "END:STANDARD\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "LAST-MODIFIED:20190109T121039Z\n" + "DTSTAMP:20190109T121039Z\n" + "UID:ba509d7e-31d4-4a6e-a32f-bf9859e56710\n" + "SUMMARY:test rrule\n" + "PRIORITY:5\n" + "STATUS:CONFIRMED\n" + "DTSTART;TZID=Romance Standard Time:20190126T140000\n" + "DTEND;TZID=Romance Standard Time:20190126T150000\n" + "CLASS:PUBLIC\n" + "TRANSP:OPAQUE\n" + "SEQUENCE:1\n" + "X-MICROSOFT-CDO-APPT-SEQUENCE:0\n" + "X-MICROSOFT-CDO-OWNERAPPTID:2117160174\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n" + "X-MICROSOFT-CDO-IMPORTANCE:1\n" + "X-MICROSOFT-CDO-INSTTYPE:0\n" + "X-MICROSOFT-DISALLOW-COUNTER:FALSE\n" + "X-MOZ-GENERATION:1\n" + "ORGANIZER:MAILTO:"+session.getEmail()+"\n" + "END:VEVENT\n" + "END:VCALENDAR"; String itemName = UUID.randomUUID().toString() + ".EML"; session.createOrUpdateItem("calendar", itemName, itemBody, null, null); VCalendar vCalendar = new VCalendar(itemBody, session.getEmail(), session.getVTimezone()); vCalendar.getFirstVevent().setPropertyValue("RRULE","FREQ=MONTHLY"); session.createOrUpdateItem("calendar", itemName, vCalendar.toString(), null, null); } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSessionContact.java0100644 0000000 0000000 00000070252 13343551734 024754 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import davmail.util.IOUtil; import org.apache.commons.codec.binary.Base64; import java.io.*; import java.util.List; import java.util.UUID; /** * Test ExchangeSession contact features. */ @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class TestExchangeSessionContact extends AbstractExchangeSessionTestCase { static String itemName; protected ExchangeSession.Contact getCurrentContact() throws IOException { if (itemName != null) { return (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); } else { List contacts = session.searchContacts("testcontactfolder", ExchangeSession.CONTACT_ATTRIBUTES, null, 0); itemName = contacts.get(0).itemName; return contacts.get(0); } } public void testCreateFolder() throws IOException { // recreate empty folder session.deleteFolder("testcontactfolder"); session.createContactFolder("testcontactfolder", null); } public void testCreateContact() throws IOException { itemName = UUID.randomUUID().toString() + ".vcf"; VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("N", "sn", "givenName", "middlename", "personaltitle", "namesuffix"); vCardWriter.appendProperty("FN", "common name"); vCardWriter.appendProperty("NICKNAME", "nickname"); vCardWriter.appendProperty("TEL;TYPE=cell", "mobile"); vCardWriter.appendProperty("TEL;TYPE=work", "telephoneNumber"); vCardWriter.appendProperty("TEL;TYPE=home,voice", "homePhone"); vCardWriter.appendProperty("TEL;TYPE=fax", "facsimiletelephonenumber"); vCardWriter.appendProperty("TEL;TYPE=pager", "pager"); vCardWriter.appendProperty("ADR;TYPE=home", "homepostofficebox", null, "homeStreet", "homeCity", "homeState", "homePostalCode", "homeCountry"); vCardWriter.appendProperty("ADR;TYPE=work", "postofficebox", "roomnumber", "street", "l", "st", "postalcode", "co"); vCardWriter.appendProperty("ADR;TYPE=other", "otherpostofficebox", null, "otherstreet", "othercity", "otherstate", "otherpostalcode", "othercountry"); vCardWriter.appendProperty("EMAIL;TYPE=work", "email1@local.net"); vCardWriter.appendProperty("EMAIL;TYPE=home", "email2@local.net"); vCardWriter.appendProperty("EMAIL;TYPE=other", "email3@local.net"); vCardWriter.appendProperty("ORG", "o", "department"); vCardWriter.appendProperty("URL;TYPE=work", "http://local.net"); vCardWriter.appendProperty("TITLE", "title"); vCardWriter.appendProperty("NOTE", "description"); vCardWriter.appendProperty("CUSTOM1", "extensionattribute1"); vCardWriter.appendProperty("CUSTOM2", "extensionattribute2"); vCardWriter.appendProperty("CUSTOM3", "extensionattribute3"); vCardWriter.appendProperty("CUSTOM4", "extensionattribute4"); vCardWriter.appendProperty("ROLE", "profession"); vCardWriter.appendProperty("X-AIM", "im"); vCardWriter.appendProperty("BDAY", "2000-01-02T00:00:00Z"); vCardWriter.appendProperty("CATEGORIES", "keyword1,keyword2"); vCardWriter.appendProperty("FBURL", "http://fburl"); vCardWriter.appendProperty("X-ASSISTANT", "secretarycn"); vCardWriter.appendProperty("X-MANAGER", "manager"); vCardWriter.appendProperty("X-SPOUSE", "spousecn"); vCardWriter.appendProperty("CLASS", "PRIVATE"); // add photo ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream fileInputStream = new FileInputStream("src/data/anonymous.jpg"); IOUtil.write(fileInputStream, baos); vCardWriter.appendProperty("PHOTO;ENCODING=b;TYPE=JPEG", new String(Base64.encodeBase64(baos.toByteArray()))); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), null, null); assertEquals(201, result.status); } public void testGetContact() throws IOException { ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); assertEquals("common name", contact.get("cn")); assertEquals("sn", contact.get("sn")); assertEquals("givenName", contact.get("givenName")); assertEquals("middlename", contact.get("middlename")); assertEquals("personaltitle", contact.get("personaltitle")); assertEquals("namesuffix", contact.get("namesuffix")); assertNotNull(contact.get("lastmodified")); assertEquals("nickname", contact.get("nickname")); assertEquals("mobile", contact.get("mobile")); assertEquals("telephoneNumber", contact.get("telephoneNumber")); assertEquals("homePhone", contact.get("homePhone")); assertEquals("facsimiletelephonenumber", contact.get("facsimiletelephonenumber")); assertEquals("pager", contact.get("pager")); assertEquals("homepostofficebox", contact.get("homepostofficebox")); assertEquals("homeStreet", contact.get("homeStreet")); assertEquals("homeCity", contact.get("homeCity")); assertEquals("homeState", contact.get("homeState")); assertEquals("homePostalCode", contact.get("homePostalCode")); assertEquals("homeCountry", contact.get("homeCountry")); assertEquals("postofficebox", contact.get("postofficebox")); assertEquals("roomnumber", contact.get("roomnumber")); assertEquals("street", contact.get("street")); assertEquals("l", contact.get("l")); assertEquals("st", contact.get("st")); assertEquals("postalcode", contact.get("postalcode")); assertEquals("co", contact.get("co")); assertEquals("email1@local.net", contact.get("smtpemail1")); assertEquals("email2@local.net", contact.get("smtpemail2")); assertEquals("email3@local.net", contact.get("smtpemail3")); assertEquals("o", contact.get("o")); assertEquals("department", contact.get("department")); assertEquals("http://local.net", contact.get("businesshomepage")); assertEquals("title", contact.get("title")); assertEquals("description", contact.get("description")); assertEquals("extensionattribute1", contact.get("extensionattribute1")); assertEquals("extensionattribute2", contact.get("extensionattribute2")); assertEquals("extensionattribute3", contact.get("extensionattribute3")); assertEquals("extensionattribute4", contact.get("extensionattribute4")); assertEquals("profession", contact.get("profession")); assertEquals("im", contact.get("im")); assertEquals("20000102T000000Z", contact.get("bday")); assertEquals("otherpostofficebox", contact.get("otherpostofficebox")); assertEquals("otherstreet", contact.get("otherstreet")); assertEquals("othercity", contact.get("othercity")); assertEquals("otherstate", contact.get("otherstate")); assertEquals("otherpostalcode", contact.get("otherpostalcode")); assertEquals("othercountry", contact.get("othercountry")); assertEquals("secretarycn", contact.get("secretarycn")); assertEquals("manager", contact.get("manager")); assertEquals("spousecn", contact.get("spousecn")); assertEquals("keyword1,keyword2", contact.get("keywords")); assertEquals("true", contact.get("private")); assertEquals("http://fburl", contact.get("fburl")); assertEquals("true", contact.get("haspicture")); if (!Settings.getBooleanProperty("davmail.enableEws") || "Exchange2010".equals(session.getServerVersion())) { assertNotNull(session.getContactPhoto(contact)); } } public void testUpdateContact() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertNull(contact.get("cn")); assertNull(contact.get("sn")); assertNull(contact.get("givenName")); assertNull(contact.get("middlename")); assertNull(contact.get("personaltitle")); assertNull(contact.get("namesuffix")); assertNotNull(contact.get("lastmodified")); assertNull(contact.get("nickname")); assertNull(contact.get("mobile")); assertNull(contact.get("telephoneNumber")); assertNull(contact.get("homePhone")); assertNull(contact.get("facsimiletelephonenumber")); assertNull(contact.get("pager")); assertNull(contact.get("homepostofficebox")); assertNull(contact.get("homeStreet")); assertNull(contact.get("homeCity")); assertNull(contact.get("homeState")); assertNull(contact.get("homePostalCode")); assertNull(contact.get("homeCountry")); assertNull(contact.get("postofficebox")); assertNull(contact.get("roomnumber")); assertNull(contact.get("street")); assertNull(contact.get("l")); assertNull(contact.get("st")); assertNull(contact.get("postalcode")); assertNull(contact.get("co")); assertNull(contact.get("email1")); assertNull(contact.get("email2")); assertNull(contact.get("email3")); assertNull(contact.get("o")); assertNull(contact.get("department")); assertNull(contact.get("businesshomepage")); assertNull(contact.get("title")); assertNull(contact.get("description")); assertNull(contact.get("extensionattribute1")); assertNull(contact.get("extensionattribute2")); assertNull(contact.get("extensionattribute3")); assertNull(contact.get("extensionattribute4")); assertNull(contact.get("profession")); assertNull(contact.get("im")); assertNull(contact.get("bday")); assertNull(contact.get("otherpostofficebox")); assertNull(contact.get("otherstreet")); assertNull(contact.get("othercity")); assertNull(contact.get("otherstate")); assertNull(contact.get("otherpostalcode")); assertNull(contact.get("othercountry")); assertNull(contact.get("secretarycn")); assertNull(contact.get("manager")); assertNull(contact.get("spousecn")); assertNull(contact.get("keywords")); assertNull(contact.get("private")); assertTrue(contact.get("haspicture") == null || "false".equals(contact.get("haspicture"))); assertNull(session.getContactPhoto(contact)); } public void testUpdateEmail() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("EMAIL;TYPE=work", "email1.test@local.net"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertEquals("email1.test@local.net", contact.get("smtpemail1")); } public void testUpperCaseParamName() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("TEL;TYPE=CELL", "mobile"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertEquals("mobile", contact.get("mobile")); } public void testMultipleTypesParamName() throws IOException { ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("TEL;TYPE=CELL;TYPE=pref", "another mobile"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); assertEquals("another mobile", contact.get("mobile")); } public void testLowerCaseTypesParamName() throws IOException { ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("TEL;type=HOME;type=pref", "5 68 99 3"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); assertEquals("5 68 99 3", contact.get("homePhone")); } public void testKeyPrefix() throws IOException { ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("ITEM1.TEL;TYPE=CELL;TYPE=pref", "mobile with prefix"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); assertEquals("mobile with prefix", contact.get("mobile")); } public void testIphonePersonalHomePage() throws IOException { ExchangeSession.Contact contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("ITEM1.URL", "http://www.myhomepage.org"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = (ExchangeSession.Contact) session.getItem("testcontactfolder", itemName); assertEquals("http://www.myhomepage.org", contact.get("personalHomePage")); } public void testIphoneEncodedCategories() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("CATEGORIES", "rouge,vert"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertEquals("rouge,vert", contact.get("keywords")); } public void testSemiColonInCompoundValue() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); String itemBody = "BEGIN:VCARD\n" + "VERSION:3.0\n" + "item1.ADR;type=WORK;type=pref:;;line1\\nline 2 \\; with semicolon;;;;\n" + "END:VCARD"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, itemBody, contact.etag, null); assertEquals(200, result.status); } public void testIphoneEncodedComma() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("ITEM1.TEL;TYPE=CELL;TYPE=pref", "mobile\\, with comma"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertEquals("mobile, with comma", contact.get("mobile")); } public void testAmpersAndValue() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("FN", "common & name"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertEquals("common & name", contact.get("cn")); } public void testDateValue() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("BDAY", "2000-01-02"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertEquals("20000102T000000Z", contact.get("bday")); System.out.println(contact.getBody()); } public void testAnniversary() throws IOException { ExchangeSession.Contact contact = getCurrentContact(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("X-ANNIVERSARY", "2000-01-02"); vCardWriter.endCard(); ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), contact.etag, null); assertEquals(200, result.status); contact = getCurrentContact(); assertEquals("20000102T000000Z", contact.get("anniversary")); System.out.println(contact.getBody()); } public void testSpecialUrlCharacters() throws IOException { testCreateFolder(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("N", "sn", "givenName", "middlename", "personaltitle", "namesuffix"); vCardWriter.appendProperty("FN", "common name"); vCardWriter.endCard(); itemName = "test {<:&'>} \"accentué.vcf"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), null, null); assertEquals(201, result.status); ExchangeSession.Contact contact = getCurrentContact(); assertEquals("common name", contact.get("cn")); } public void testSpecialUrlCharacters3F() throws IOException { testCreateFolder(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("N", "sn", "givenName", "middlename", "personaltitle", "namesuffix"); vCardWriter.appendProperty("FN", "common name"); vCardWriter.endCard(); itemName = "test ?.vcf"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), null, null); assertEquals(201, result.status); ExchangeSession.Contact contact = getCurrentContact(); assertEquals("common name", contact.get("cn")); } public void testPagingSearchContacts() throws IOException { int maxCount = 0; List contacts = session.searchContacts(ExchangeSession.CONTACTS, ExchangeSession.CONTACT_ATTRIBUTES, null, maxCount); int folderSize = contacts.size(); assertEquals(50, session.searchContacts(ExchangeSession.CONTACTS, ExchangeSession.CONTACT_ATTRIBUTES, null, 50).size()); assertEquals(folderSize, session.searchContacts(ExchangeSession.CONTACTS, ExchangeSession.CONTACT_ATTRIBUTES, null, folderSize+1).size()); } public void testHashInName() throws IOException { testCreateFolder(); VCardWriter vCardWriter = new VCardWriter(); vCardWriter.startCard(); vCardWriter.appendProperty("N", "sn", "givenName", "middlename", "personaltitle", "namesuffix"); vCardWriter.appendProperty("FN", "common name"); vCardWriter.endCard(); itemName = "Capital 7654#.vcf"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, vCardWriter.toString(), null, null); assertEquals(201, result.status); ExchangeSession.Contact contact = getCurrentContact(); assertEquals("common name", contact.get("cn")); } public void testEmptyEmail() throws IOException { testCreateFolder(); String itemBody = "BEGIN:VCARD\n" + "VERSION:3.0\n" + "UID:8b75b1a40f2c4e3a8cbdc86f26d4a497\n" + "N:name;common;;;\n" + "FN:common name\n" + "EMAIL;TYPE=WORK:\n" + "EMAIL;TYPE=HOME:email@company.com\n" + "END:VCARD"; itemName = UUID.randomUUID().toString() + ".vcf"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, itemBody, null, null); assertEquals(201, result.status); ExchangeSession.Contact contact = getCurrentContact(); assertNull(contact.get("smtpemail1")); result = session.createOrUpdateContact("testcontactfolder", itemName, itemBody, null, null); assertEquals(201, result.status); contact = getCurrentContact(); assertNull(contact.get("smtpemail1")); } public void testRemoveEmail() throws IOException { testCreateContact(); ExchangeSession.Contact contact = getCurrentContact(); assertNotNull(contact.get("smtpemail1")); assertNotNull(contact.get("smtpemail2")); String itemBody = "BEGIN:VCARD\n" + "VERSION:3.0\n" + "UID:8b75b1a40f2c4e3a8cbdc86f26d4a497\n" + "N:name;common;;;\n" + "FN:common name\n" + "END:VCARD"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, itemBody, null, null); assertEquals(201, result.status); contact = getCurrentContact(); assertNull(contact.get("smtpemail1")); assertNull(contact.get("smtpemail2")); } public void testProtectedComma() throws IOException { String itemBody = "BEGIN:VCARD\n" + "ADR;TYPE=WORK:;;via 25 aprile\\, 25;Lallio;BG;24048;Italia\n" + "END:VCARD"; VObject vcard = new VObject(new ICSBufferedReader(new StringReader(itemBody))); System.out.println(vcard.toString()); VProperty property = new VProperty("ADR;TYPE=WORK:;;via 25 aprile\\, 25;Lallio;BG;24048;Italia"); assertEquals("via 25 aprile, 25", property.getValues().get(2)); } /* Huge contact folder creation public void testJohnDoes() throws IOException { testCreateFolder(); for (int i = 0;i<10000;i++) { String itemBody = "BEGIN:VCARD\n" + "VERSION:4.0\n" + "EMAIL:john.doe"+i+"@acme.com\n" + "FN:John Doe"+i+"\n" + "N:Doe"+i+";John;;;\n" + "TEL;TYPE=HOME:+1-234-56789\n" + "UID:5516ecf5-6ee0-4d60-b5e8-a654c7447f0a\n" + "END:VCARD"; itemName = UUID.randomUUID().toString() + ".vcf"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, itemBody, null, null); assertEquals(201, result.status); } //result = session.createOrUpdateContact("testcontactfolder", itemName, itemBody, null, null); //assertEquals(201, result.status); }*/ /** */ public void testEmptyEmail2() throws IOException { testCreateFolder(); String itemBody = "BEGIN:VCARD\n" + "VERSION:3.0\n" + "UID:sd9327nnob97w02a36zoo9adf9vt692pr1hq\n" + "FN:First Last\n" + "N:Last;First;;;\n" + "REV:20161222T092209Z\n" + "TEL;TYPE=cell:+47 00000000\n" + "END:VCARD"; itemName = UUID.randomUUID().toString() + ".vcf"; ExchangeSession.ItemResult result = session.createOrUpdateContact("testcontactfolder", itemName, itemBody, null, null); assertEquals(201, result.status); } public void testGetAllContacts() throws IOException { //session.getAllContacts("contacts"); List contacts = session.searchContacts("contacts", ExchangeSession.CONTACT_ATTRIBUTES, session.isEqualTo("outlookmessageclass", "IPM.Contact"), 0); //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); for (ExchangeSession.Contact contact: contacts) { ExchangeSession.Item item = session.getItem("contacts", contact.getName()); System.out.println((item).getBody()); } } public void testGetAllDistributionLists() throws IOException { List contacts = session.searchContacts("contacts", ExchangeSession.CONTACT_ATTRIBUTES, session.isEqualTo("outlookmessageclass", "IPM.DistList"), 0); //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); for (ExchangeSession.Contact contact: contacts) { ExchangeSession.Item item = session.getItem("contacts", contact.getName()); System.out.println((item).getBody()); } } public void testMultilineProperty() { VCardWriter vCardWriter = new VCardWriter(); vCardWriter.appendProperty("NOTE", "multi line \r\n with crlf"); // should drop CR and convert LF to \\n assertEquals("NOTE:multi line \\n with crlf\r\n", vCardWriter.toString()); } public void testMultiValueMultilineProperty() { VCardWriter vCardWriter = new VCardWriter(); vCardWriter.appendProperty("ADR", "value","multi line \r\n with crlf"); // should drop CR and convert LF to \\n assertEquals("ADR:value;multi line \\n with crlf\r\n", vCardWriter.toString()); } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSessionEvent.java0100644 0000000 0000000 00000067254 12564151512 024444 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.BundleMessage; import junit.framework.TestCase; import java.io.IOException; import java.io.StringReader; /** * Test ExchangeSession event conversion. */ @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class TestExchangeSessionEvent extends TestCase { static String email = "user@company.com"; static VObject vTimeZone; static { try { vTimeZone = new VObject(new ICSBufferedReader(new StringReader("BEGIN:VTIMEZONE\n" + "TZID:(GMT+01.00) Paris/Madrid/Brussels/Copenhagen\n" + "X-MICROSOFT-CDO-TZID:3\n" + "BEGIN:STANDARD\n" + "DTSTART:16010101T030000\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010101T020000\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE"))); } catch (IOException e) { e.printStackTrace(); } } protected String fixICS(String icsBody, boolean fromServer) throws IOException { VCalendar vCalendar = new VCalendar(icsBody, email, vTimeZone); vCalendar.fixVCalendar(fromServer); return vCalendar.toString(); } public void testNoClass() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); String toClient = fixICS(itemBody, true); System.out.println(toServer); System.out.println(toClient); assertTrue(toServer.indexOf("CLASS") < 0); assertTrue(toClient.indexOf("CLASS") < 0); assertTrue(toClient.indexOf("X-CALENDARSERVER-ACCESS") < 0); } public void testPublicClass() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "CLASS:PUBLIC\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); String toClient = fixICS(itemBody, true); System.out.println(toServer); System.out.println(toClient); assertTrue(toServer.indexOf("CLASS:PUBLIC") >= 0); assertTrue(toClient.indexOf("CLASS:PUBLIC") >= 0); assertTrue(toClient.indexOf("X-CALENDARSERVER-ACCESS:PUBLIC") >= 0); } public void testPrivateClass() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "CLASS:PRIVATE\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); String toClient = fixICS(itemBody, true); System.out.println(toServer); System.out.println(toClient); assertTrue(toServer.indexOf("CLASS:PRIVATE") >= 0); assertTrue(toClient.indexOf("CLASS:PRIVATE") >= 0); assertTrue(toClient.indexOf("X-CALENDARSERVER-ACCESS:CONFIDENTIAL") >= 0); } public void testConfidentialClass() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "CLASS:CONFIDENTIAL\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); String toClient = fixICS(itemBody, true); System.out.println(toServer); System.out.println(toClient); assertTrue(toServer.indexOf("CLASS:CONFIDENTIAL") >= 0); assertTrue(toClient.indexOf("CLASS:CONFIDENTIAL") >= 0); assertTrue(toClient.indexOf("X-CALENDARSERVER-ACCESS:PRIVATE") >= 0); } public void testCalendarServerAccessPrivate() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Apple Inc.//iCal 4.0.3//EN\n" + "BEGIN:VEVENT\n" + "X-CALENDARSERVER-ACCESS:PRIVATE\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); assertTrue(toServer.indexOf("CLASS:CONFIDENTIAL") >= 0); } public void testCalendarServerAccessConfidential() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Apple Inc.//iCal 4.0.3//EN\n" + "BEGIN:VEVENT\n" + "X-CALENDARSERVER-ACCESS:CONFIDENTIAL\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); assertTrue(toServer.indexOf("CLASS:PRIVATE") >= 0); } public void testCalendarServerAccessPublic() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Apple Inc.//iCal 4.0.3//EN\n" + "BEGIN:VEVENT\n" + "X-CALENDARSERVER-ACCESS:PUBLIC\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); assertTrue(toServer.indexOf("CLASS:PUBLIC") >= 0); } public void testCalendarServerAccessNone() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Apple Inc.//iCal 4.0.3//EN\n" + "BEGIN:VEVENT\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); assertFalse(toServer.contains("CLASS")); } public void testNoOrganizer() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); assertTrue(toServer.contains("ORGANIZER")); } public void testValarm() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "BEGIN:VALARM\n" + "TRIGGER:-PT15M\n" + "ATTACH;VALUE=URI:Basso\n" + "ACTION:AUDIO\n" + "END:VALARM\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); assertTrue(toServer.contains("ACTION:DISPLAY")); } public void testReceiveAllDay() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + vTimeZone + "BEGIN:VEVENT\n" + "DTSTART;TZID=\"(GMT+01.00) Paris/Madrid/Brussels/Copenhagen\":20100615T000000\n" + "DTEND;TZID=\"(GMT+01.00) Paris/Madrid/Brussels/Copenhagen\":20100616T000000\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:TRUE\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toClient = fixICS(itemBody, true); System.out.println(toClient); // OWA created allday events have the X-MICROSOFT-CDO-ALLDAYEVENT set to true and always 000000 in event time // just remove the TZID, add VALUE=DATE param and set a date only value assertTrue(toClient.contains("DTSTART;VALUE=DATE:20100615")); assertTrue(toClient.contains("DTEND;VALUE=DATE:20100616")); } public void testSendAllDay() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "DTSTART;VALUE=DATE:20100615\n" + "DTEND;VALUE=DATE:20100616\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); // Client created allday event have no timezone and no time information in date values // first set the X-MICROSOFT-CDO-ALLDAYEVENT flag for OWA assertTrue(toServer.contains("X-MICROSOFT-CDO-ALLDAYEVENT:TRUE")); // then patch TZID for Outlook (need to retrieve OWA TZID assertTrue(toServer.contains("BEGIN:VTIMEZONE")); assertTrue(toServer.contains("TZID:" + vTimeZone.getPropertyValue("TZID"))); assertTrue(toServer.contains("DTSTART;TZID=\"" + vTimeZone.getPropertyValue("TZID") + "\":20100615T000000")); assertTrue(toServer.contains("DTEND;TZID=\"" + vTimeZone.getPropertyValue("TZID") + "\":20100616T000000")); } public void testRsvp() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "ATTENDEE;PARTSTAT=ACCEPTED;RSVP=TRUE:MAILTO:" + email + "\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toClient = fixICS(itemBody, true); System.out.println(toClient); assertTrue(toClient.contains("ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:" + email)); } public void testExdate() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "EXDATE;TZID=\"Europe/Paris\":20100809T150000,20100823T150000\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toClient = fixICS(itemBody, true); System.out.println(toClient); assertTrue(toClient.contains("EXDATE;TZID=\"Europe/Paris\":20100823T150000")); } public void testEmptyLine() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toClient = fixICS(itemBody, true); System.out.println(toClient); } public void testAttendeeStatus() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "ATTENDEE;PARTSTAT=ACCEPTED;RSVP=FALSE:MAILTO:" + email + "\n" + "END:VEVENT\n" + "END:VCALENDAR"; VCalendar vCalendar = new VCalendar(itemBody, email, vTimeZone); vCalendar.fixVCalendar(false); String status = vCalendar.getAttendeeStatus(); assertEquals("ACCEPTED", status); System.out.println("'" + BundleMessage.format(status) + "'"); } public void testMissingTzid() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "DTSTART:20100101T000000\n" + "DTEND:20100102T000000\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, false); System.out.println(toServer); assertTrue(toServer.contains("DTSTART;TZID=")); assertTrue(toServer.contains("DTEND;TZID=")); } public void testBroken() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" + "VERSION:2.0\n" + "BEGIN:VEVENT\n" + "CREATED:20100916T115132Z\n" + "LAST-MODIFIED:20100916T115138Z\n" + "DTSTAMP:20100916T115138Z\n" + "UID:d72ff8cc-f3ee-4fbc-b44d-1aaf78d92847\n" + "SUMMARY:New Event\n" + "DTSTART;VALUE=DATE:20100929\n" + "DTEND;VALUE=DATE:20100930\n" + "TRANSP:TRANSPARENT\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, true); System.out.println(toServer); } public void testFloatingTimezone() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "PRODID:Microsoft CDO for Microsoft Exchange\n" + "VERSION:2.0\n" + "BEGIN:VTIMEZONE\n" + "TZID:Pacific Time (US & Canada)\\; Tijuana\n" + "BEGIN:STANDARD\n" + "DTSTART:16010101T030000\n" + "TZOFFSETFROM:-0700\n" + "TZOFFSETTO:-0800\n" + "RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=11;BYDAY=1SU\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010101T010000\n" + "TZOFFSETFROM:-0800\n" + "TZOFFSETTO:-0700\n" + "RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE" + "BEGIN:VEVENT\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(itemBody, true); System.out.println(toServer); } public void testAnotherBroken() throws IOException { String icsBody = "BEGIN:VCALENDAR\n" + "METHOD:PUBLISH\n" + "PRODID:Microsoft Exchange Server 2010\n" + "VERSION:2.0\n" + "BEGIN:VTIMEZONE\n" + "TZID:GMT -0800 (Standard) / GMT -0700 (Daylight)\\n\n" + "BEGIN:STANDARD\n" + "DTSTART:16010101T020000\n" + "TZOFFSETFROM:-0700\n" + "TZOFFSETTO:-0800\n" + "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010101T020000\n" + "TZOFFSETFROM:-0800\n" + "TZOFFSETTO:-0700\n" + "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "ORGANIZER;CN=John Doe:MAILTO:aTargetAddress@dummy.com\n" + "DESCRIPTION;LANGUAGE=en-US:Look over broken timezone.\\n\n" + "SUMMARY;LANGUAGE=en-US:meeting\n" + "DTSTART;TZID=GMT -0800 (Standard) / GMT -0700 (Daylight)\n" + ":20060210T130000\n" + "DTEND;TZID=GMT -0800 (Standard) / GMT -0700 (Daylight)\n" + ":20060210T143000\n" + "UID:040000008200E00074C5B7101A82E00800000000D01FF309972CC601000000000000000\n" + " 010000000B389A3C5092D7640A06D2EF5A2125577\n" + "CLASS:PUBLIC\n" + "PRIORITY:5\n" + "DTSTAMP:20060208T180425Z\n" + "TRANSP:OPAQUE\n" + "STATUS:CONFIRMED\n" + "SEQUENCE:0\n" + "LOCATION;LANGUAGE=en-US:not sure\n" + "X-MICROSOFT-CDO-APPT-SEQUENCE:0\n" + "X-MICROSOFT-CDO-OWNERAPPTID:1602758614\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n" + "X-MICROSOFT-CDO-IMPORTANCE:1\n" + "X-MICROSOFT-CDO-INSTTYPE:0\n" + "X-MICROSOFT-DISALLOW-COUNTER:FALSE\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toClient = fixICS(icsBody, true); System.out.println(toClient); } public void testInvalidTimezone() throws IOException { String icsBody = "BEGIN:VCALENDAR\n" + "PRODID:-//K Desktop Environment//NONSGML libkcal 4.3//EN\n" + "VERSION:2.0\n" + "METHOD:PUBLISH\n" + "BEGIN:VTIMEZONE\n" + "TZID:Europe/Amsterdam\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:NST\n" + "TZOFFSETFROM:+001932\n" + "TZOFFSETTO:+011932\n" + "DTSTART:19160501T234028\n" + "RDATE;VALUE=DATE-TIME:19160501T234028\n" + "RDATE;VALUE=DATE-TIME:19170417T014028\n" + "RDATE;VALUE=DATE-TIME:19180402T014028\n" + "RDATE;VALUE=DATE-TIME:19190408T014028\n" + "RDATE;VALUE=DATE-TIME:19200406T014028\n" + "RDATE;VALUE=DATE-TIME:19210405T014028\n" + "RDATE;VALUE=DATE-TIME:19220327T014028\n" + "RDATE;VALUE=DATE-TIME:19230602T014028\n" + "RDATE;VALUE=DATE-TIME:19240331T014028\n" + "RDATE;VALUE=DATE-TIME:19250606T014028\n" + "RDATE;VALUE=DATE-TIME:19260516T014028\n" + "RDATE;VALUE=DATE-TIME:19270516T014028\n" + "RDATE;VALUE=DATE-TIME:19280516T014028\n" + "RDATE;VALUE=DATE-TIME:19290516T014028\n" + "RDATE;VALUE=DATE-TIME:19300516T014028\n" + "RDATE;VALUE=DATE-TIME:19310516T014028\n" + "RDATE;VALUE=DATE-TIME:19320523T014028\n" + "RDATE;VALUE=DATE-TIME:19330516T014028\n" + "RDATE;VALUE=DATE-TIME:19340516T014028\n" + "RDATE;VALUE=DATE-TIME:19350516T014028\n" + "RDATE;VALUE=DATE-TIME:19360516T014028\n" + "RDATE;VALUE=DATE-TIME:19370523T014028\n" + "END:DAYLIGHT\n" + "BEGIN:STANDARD\n" + "TZNAME:AMT\n" + "TZOFFSETFROM:+011932\n" + "TZOFFSETTO:+001932\n" + "DTSTART:19161001T224028\n" + "RDATE;VALUE=DATE-TIME:19161001T224028\n" + "RDATE;VALUE=DATE-TIME:19170918T024028\n" + "RDATE;VALUE=DATE-TIME:19181001T024028\n" + "RDATE;VALUE=DATE-TIME:19190930T024028\n" + "RDATE;VALUE=DATE-TIME:19200928T024028\n" + "RDATE;VALUE=DATE-TIME:19210927T024028\n" + "RDATE;VALUE=DATE-TIME:19221009T024028\n" + "RDATE;VALUE=DATE-TIME:19231008T024028\n" + "RDATE;VALUE=DATE-TIME:19241006T024028\n" + "RDATE;VALUE=DATE-TIME:19251005T024028\n" + "RDATE;VALUE=DATE-TIME:19261004T024028\n" + "RDATE;VALUE=DATE-TIME:19271003T024028\n" + "RDATE;VALUE=DATE-TIME:19281008T024028\n" + "RDATE;VALUE=DATE-TIME:19291007T024028\n" + "RDATE;VALUE=DATE-TIME:19301006T024028\n" + "RDATE;VALUE=DATE-TIME:19311005T024028\n" + "RDATE;VALUE=DATE-TIME:19321003T024028\n" + "RDATE;VALUE=DATE-TIME:19331009T024028\n" + "RDATE;VALUE=DATE-TIME:19341008T024028\n" + "RDATE;VALUE=DATE-TIME:19351007T024028\n" + "RDATE;VALUE=DATE-TIME:19361005T024028\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:NEST\n" + "TZOFFSETFROM:+011932\n" + "TZOFFSETTO:+0120\n" + "DTSTART:19370701T224028\n" + "RDATE;VALUE=DATE-TIME:19370701T224028\n" + "END:DAYLIGHT\n" + "BEGIN:STANDARD\n" + "TZNAME:NET\n" + "TZOFFSETFROM:+0120\n" + "TZOFFSETTO:+0020\n" + "DTSTART:19371004T024028\n" + "RDATE;VALUE=DATE-TIME:19371004T024028\n" + "RDATE;VALUE=DATE-TIME:19381003T024000\n" + "RDATE;VALUE=DATE-TIME:19391009T024000\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:NEST\n" + "TZOFFSETFROM:+0020\n" + "TZOFFSETTO:+0120\n" + "DTSTART:19380516T014000\n" + "RDATE;VALUE=DATE-TIME:19380516T014000\n" + "RDATE;VALUE=DATE-TIME:19390516T014000\n" + "END:DAYLIGHT\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:CEST\n" + "TZOFFSETFROM:+0020\n" + "TZOFFSETTO:+0200\n" + "DTSTART:19400516T234000\n" + "RDATE;VALUE=DATE-TIME:19400516T234000\n" + "END:DAYLIGHT\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19790930T030000\n" + "RRULE:FREQ=YEARLY;COUNT=17;BYDAY=-1SU;BYMONTH=9\n" + "END:STANDARD\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19961027T030000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" + "END:STANDARD\n" + "BEGIN:STANDARD\n" + "TZNAME:CET\n" + "TZOFFSETFROM:+0200\n" + "TZOFFSETTO:+0100\n" + "DTSTART:19421103T024000\n" + "RDATE;VALUE=DATE-TIME:19421103T024000\n" + "RDATE;VALUE=DATE-TIME:19431004T020000\n" + "RDATE;VALUE=DATE-TIME:19441002T020000\n" + "RDATE;VALUE=DATE-TIME:19450916T020000\n" + "RDATE;VALUE=DATE-TIME:19770925T030000\n" + "RDATE;VALUE=DATE-TIME:19781001T030000\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:CEST\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "DTSTART:19810329T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "BEGIN:DAYLIGHT\n" + "TZNAME:CEST\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0200\n" + "DTSTART:19430329T010000\n" + "RDATE;VALUE=DATE-TIME:19430329T010000\n" + "RDATE;VALUE=DATE-TIME:19440403T010000\n" + "RDATE;VALUE=DATE-TIME:19450402T010000\n" + "RDATE;VALUE=DATE-TIME:19770403T020000\n" + "RDATE;VALUE=DATE-TIME:19780402T020000\n" + "RDATE;VALUE=DATE-TIME:19790401T020000\n" + "RDATE;VALUE=DATE-TIME:19800406T020000\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "DTSTAMP:20111022T175835Z\n" + "CREATED:20111022T175832Z\n" + "UID:libkcal-797112054.882\n" + "LAST-MODIFIED:20111022T175832Z\n" + "SUMMARY:Test Event 000\n" + "DTSTART;TZID=\"Europe/Amsterdam\":20111027T120000\n" + "DTEND;TZID=\"Europe/Amsterdam\":20111027T174500\n" + "TRANSP:OPAQUE\n" + "X-MICROSOFT-CDO-REPLYTIME:20111022T175835Z\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toServer = fixICS(icsBody, false); System.out.println(toServer); } public void testResourceComma() throws IOException { String icsBody = "BEGIN:VCALENDAR\n" + "PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN\n" + "VERSION:2.0\n" + "METHOD:REQUEST\n" + "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\n" + "BEGIN:VTIMEZONE\n" + "TZID:Eastern Standard Time\n" + "BEGIN:STANDARD\n" + "DTSTART:16011104T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11\n" + "TZOFFSETFROM:-0400\n" + "TZOFFSETTO:-0500\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010311T020000\n" + "RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3\n" + "TZOFFSETFROM:-0500\n" + "TZOFFSETTO:-0400\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "ATTENDEE;CN=Robert.P.Lindman@delphi.com;RSVP=TRUE:mailto:Robert.P.Lindman@d\n" + "\telphi.com\n" + "ATTENDEE;CN=\"CRUSINKOK, CTC4B\";CUTYPE=RESOURCE;ROLE=NON-PARTICIPANT;RSVP=TR\n" + "\tUE:mailto:ctc4b.crusinkok@delphi.com\n" + "CLASS:PUBLIC\n" + "CREATED:20111020T134050Z\n" + "DESCRIPTION:Sample meeting with a conference room added\\n\n" + "DTEND;TZID=\"Eastern Standard Time\":20111021T060000\n" + "DTSTAMP:20111020T134035Z\n" + "DTSTART;TZID=\"Eastern Standard Time\":20111021T053000\n" + "LAST-MODIFIED:20111020T134050Z\n" + "LOCATION:CRUSINKOK\\, CTC4B\n" + "ORGANIZER;CN=\"Lindman, Robert P\":mailto:Robert.P.Lindman@delphi.com\n" + "PRIORITY:5\n" + "RESOURCES:CRUSINKOK\\, CTC4A,CRUSINKOK\\, CTC4C,CRUSINKOK\\, CTC4D,CRUSINKOK\\,\n" + "\t CTC4E,CRUSINKOK\\, CTC3A,CRUSINKOK\\, CTC3B,CRUSINKOK\\, CTC3C,CRUSINKOK\\, C\n" + "\tTC3D,CRUSINKOK\\, CTC2A,CRUSINKOK\\, CTC2B,CRUSINKOK\\, CTC2C,CRUSINKOK\\, CTC\n" + "\t2D,CRUSINKOK\\, CTC1A,CRUSINKOK\\, CTC1B,CRUSINKOK\\, CTC1C,CRUSINKOK\\, CTC1D\n" + "\t,CRUSINKOK\\, CTC1E1\n" + "SEQUENCE:1\n" + "SUMMARY;LANGUAGE=en-us:Sample Meeting\n" + "TRANSP:OPAQUE\n" + "UID:040000008200E00074C5B7101A82E0080000000090B4D422078FCC01000000000000000\n" + "\t0100000000AFB9CCA2DE4D54794C2D688292D570B\n" + "X-ALT-DESC;FMTTYPE=text/html:\\n\\n\\n\\n\\n\\n\\n\\n\\n

Sample meeting with a conference room added

\\n\\n\\n\n" + "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n" + "X-MICROSOFT-CDO-IMPORTANCE:1\n" + "X-MICROSOFT-DISALLOW-COUNTER:FALSE\n" + "X-MS-OLK-APPTLASTSEQUENCE:1\n" + "X-MS-OLK-APPTSEQTIME:20111020T134035Z\n" + "X-MS-OLK-AUTOFILLLOCATION:TRUE\n" + "X-MS-OLK-CONFTYPE:0\n" + "END:VEVENT\n" + "END:VCALENDAR"; String toClient = fixICS(icsBody, true); System.out.println(toClient); } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSessionFolder.java0100644 0000000 0000000 00000013121 13402010625 024545 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import javax.mail.MessagingException; import java.io.IOException; /** * Test folder methods. */ public class TestExchangeSessionFolder extends AbstractExchangeSessionTestCase { public void testCreateFolder() throws IOException { session.createMessageFolder("test"); } public void testGetFolder() throws IOException { ExchangeSession.Folder folder = session.getFolder("test"); assertNotNull(folder); assertEquals("test", folder.folderPath); assertEquals("test", folder.displayName); assertEquals("IPF.Note", folder.folderClass); assertEquals(0, folder.unreadCount); assertFalse(folder.hasChildren); assertFalse(folder.noInferiors); assertNotNull(folder.ctag); assertNotNull(folder.etag); } public void testSubFolder() throws IOException { session.createMessageFolder("test/subfolder"); ExchangeSession.Folder folder = session.getFolder("test/subfolder"); assertNotNull(folder); assertEquals("test/subfolder", folder.folderPath); assertEquals("subfolder", folder.displayName); session.deleteFolder("test/subfolder"); } public void testUpdateFolder() throws IOException { // TODO: implement } public void testMoveFolder() throws IOException { session.deleteFolder("target"); session.deleteFolder("tomove"); session.createMessageFolder("tomove"); session.createMessageFolder("target"); session.moveFolder("tomove", "target/moved"); session.deleteFolder("target"); } public void testDeleteFolder() throws IOException { session.deleteFolder("test"); } public void testCalendarFolder() throws IOException { String folderName = "testcalendar"; session.deleteFolder(folderName); session.createCalendarFolder(folderName, null); ExchangeSession.Folder folder = session.getFolder(folderName); assertNotNull(folder); assertEquals("IPF.Appointment", folder.folderClass); session.deleteFolder(folderName); } public void testContactFolder() throws IOException { String folderName = "testcontact"; session.deleteFolder(folderName); session.createContactFolder(folderName, null); ExchangeSession.Folder folder = session.getFolder(folderName); assertNotNull(folder); assertEquals("IPF.Contact", folder.folderClass); session.deleteFolder(folderName); } public void testFolderAccent() throws IOException { String folderName = "testé"; session.deleteFolder(folderName); session.createMessageFolder(folderName); ExchangeSession.Folder folder = session.getFolder(folderName); assertNotNull(folder); assertEquals(folderName, folder.displayName); assertEquals(folderName, folder.folderPath); session.deleteFolder(folderName); } public void testFolderSpace() throws IOException { String folderName = "test space"; session.deleteFolder(folderName); session.createMessageFolder(folderName); ExchangeSession.Folder folder = session.getFolder(folderName); assertNotNull(folder); assertEquals(folderName, folder.displayName); assertEquals(folderName, folder.folderPath); session.deleteFolder(folderName); } public void testSpecialFolderCharacter() throws IOException { String folderName = "Special & accenté"; session.deleteFolder(folderName); session.createMessageFolder(folderName); ExchangeSession.Folder folder = session.getFolder(folderName); assertNotNull(folder); assertEquals(folderName, folder.displayName); assertEquals(folderName, folder.folderPath); session.deleteFolder(folderName); } public void testGetSharedFolder() throws IOException, MessagingException { ExchangeSession.Folder folder = session.getFolder("/users/"+ Settings.getProperty("davmail.to")+"/inbox"); ExchangeSession.MessageList messages = session.searchMessages("/users/"+ Settings.getProperty("davmail.to")+"/inbox"); for (ExchangeSession.Message message:messages) { System.out.println(message.getMimeMessage()); } assertNotNull(folder); } public void testCreateSlashFolder() throws IOException { String folderName = "test_xF8FF_slash"; session.deleteFolder(folderName); session.createMessageFolder(folderName); ExchangeSession.Folder folder = session.getFolder(folderName); assertEquals(folderName, folder.displayName); } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSessionMessage.java0100644 0000000 0000000 00000015605 12564151512 024740 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import javax.mail.util.SharedByteArrayInputStream; import java.io.IOException; import java.util.HashMap; import java.util.UUID; /** * Test message handling features. */ public class TestExchangeSessionMessage extends AbstractExchangeSessionTestCase { static ExchangeSession.Message message; static String messageName; public void testCreateMessage() throws IOException, MessagingException { session.deleteFolder("testfolder"); session.createMessageFolder("testfolder"); MimeMessage mimeMessage = createMimeMessage(); messageName = UUID.randomUUID().toString()+".EML"; HashMap properties = new HashMap(); properties.put("draft", "0"); session.createMessage("testfolder", messageName, properties, mimeMessage); } public void testSearchInbox() throws IOException, MessagingException { ExchangeSession.MessageList messageList = session.searchMessages("INBOX"); assertNotNull(messageList); } public void testSearchTrash() throws IOException, MessagingException { ExchangeSession.MessageList messageList = session.searchMessages("Trash"); assertNotNull(messageList); } public void testSearchMessage() throws IOException, MessagingException { ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); assertEquals(1, messageList.size()); message = messageList.get(0); assertFalse(message.answered); assertFalse(message.forwarded); assertFalse(message.flagged); assertFalse(message.draft); assertTrue(message.size > 0); assertFalse(message.deleted); assertFalse(message.read); assertNotNull(message.date); } public void testFlagMessage() throws IOException, MessagingException { ExchangeSession.Folder testFolder = session.getFolder("testfolder"); testFolder.loadMessages(); HashMap properties = new HashMap(); properties.put("flagged", "2"); session.updateMessage(message, properties); // refresh folder testFolder.loadMessages(); assertNotNull(testFolder.get(0)); assertTrue(testFolder.get(0).flagged); assertEquals(message.getImapUid(), testFolder.get(0).getImapUid()); } public void testGetContent() throws IOException, MessagingException { byte[] content = session.getContent(message); assertNotNull(content); MimeMessage mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(content)); assertTrue(mimeMessage.getHeader("To")[0].indexOf("test@test.local") >= 0); assertEquals("Test subject", mimeMessage.getSubject()); assertEquals("Test message\n", mimeMessage.getContent()); } public void testProcessMessage() throws IOException, MessagingException { session.processItem("testfolder", messageName); } public void testFolderUidNext() throws IOException, MessagingException { ExchangeSession.Folder folder = session.getFolder("testfolder"); assertTrue(folder.uidNext > 0); } public void testDeleteMessage() throws IOException { session.deleteMessage(message); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); assertEquals(0, messageList.size()); } public void testSpecialMessageCharacter() throws IOException, MessagingException { session.deleteFolder("testfolder"); session.createMessageFolder("testfolder"); MimeMessage mimeMessage = createMimeMessage(); messageName = "Special & accenté.EML"; HashMap properties = new HashMap(); properties.put("draft", "0"); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder", session.isEqualTo("urlcompname", messageName)); assertNotNull(messageList); assertEquals(1, messageList.size()); } public void testSlashMessageName() throws IOException, MessagingException { session.deleteFolder("testfolder"); session.createMessageFolder("testfolder"); MimeMessage mimeMessage = createMimeMessage(); messageName = "test _xF8FF_ slash.EML"; HashMap properties = new HashMap(); properties.put("draft", "0"); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder", session.isEqualTo("urlcompname", messageName)); assertNotNull(messageList); assertEquals(1, messageList.size()); } public void testPlusMessageName() throws IOException, MessagingException { // fails on Exchange 2003 session.deleteFolder("testfolder"); session.createMessageFolder("testfolder"); MimeMessage mimeMessage = createMimeMessage(); messageName = "test + plus.EML"; HashMap properties = new HashMap(); properties.put("draft", "0"); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder", session.isEqualTo("urlcompname", messageName)); assertNotNull(messageList); assertEquals(1, messageList.size()); } /** * Cleanup */ public void testDeleteFolder() throws IOException { session.deleteFolder("testfolder"); } public void testSearchAaa() throws IOException, MessagingException { ExchangeSession.MessageList messageList = session.searchMessages("aabb"); assertNotNull(messageList); } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSessionMessageFlags.java0100644 0000000 0000000 00000012215 12564151512 025707 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import org.apache.log4j.Level; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.UUID; /** * Test message flag update */ public class TestExchangeSessionMessageFlags extends AbstractExchangeSessionTestCase { @Override public void setUp() throws IOException { super.setUp(); // recreate empty folder session.deleteFolder("testfolder"); session.createMessageFolder("testfolder"); } public void testCreateDraftMessage() throws MessagingException, IOException { MimeMessage mimeMessage = createMimeMessage(); String messageName = UUID.randomUUID().toString()+".EML"; HashMap properties = new HashMap(); properties.put("draft", "9"); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); assertEquals(1, messageList.size()); assertTrue(messageList.get(0).draft); } public void testCreateDraftReadMessage() throws MessagingException, IOException { MimeMessage mimeMessage = createMimeMessage(); String messageName = UUID.randomUUID().toString(); HashMap properties = new HashMap(); properties.put("draft", "9"); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); assertEquals(1, messageList.size()); assertTrue(messageList.get(0).draft); assertTrue(messageList.get(0).read); } public void testCreateReadMessage() throws MessagingException, IOException { MimeMessage mimeMessage = createMimeMessage(); String messageName = UUID.randomUUID().toString(); HashMap properties = new HashMap(); properties.put("draft", "1"); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); assertEquals(1, messageList.size()); assertFalse(messageList.get(0).draft); assertTrue(messageList.get(0).read); } public void testCreateBccMessage() throws MessagingException, IOException { Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); MimeMessage mimeMessage = createMimeMessage(); String messageName = UUID.randomUUID().toString(); HashMap properties = new HashMap(); properties.put("draft", "8"); properties.put("bcc", "testbcc@test.local"); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); assertEquals(1, messageList.size()); } public void testCreateDateReceivedMessage() throws MessagingException, IOException { MimeMessage mimeMessage = createMimeMessage(); String messageName = UUID.randomUUID().toString(); HashMap properties = new HashMap(); SimpleDateFormat dateFormatter = ExchangeSession.getExchangeZuluDateFormat(); dateFormatter.setTimeZone(ExchangeSession.GMT_TIMEZONE); Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, -1); properties.put("datereceived", dateFormatter.format(cal.getTime())); session.createMessage("testfolder", messageName, properties, mimeMessage); ExchangeSession.MessageList messageList = session.searchMessages("testfolder"); assertNotNull(messageList); assertEquals(1, messageList.size()); assertNotNull(messageList); // TODO: use same format for date read/write assertEquals(ExchangeSession.getZuluDateFormat().format(cal.getTime()), messageList.get(0).date); } } davmail-6.3.0/src/test/davmail/exchange/TestExchangeSessionSearchContact.java0100644 0000000 0000000 00000011750 12564151512 026072 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.Settings; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Test contact search. */ @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class TestExchangeSessionSearchContact extends AbstractExchangeSessionTestCase { public void testSearchPublicContacts() throws IOException { String folderPath = Settings.getProperty("davmail.publicContactFolder"); List contacts = session.searchContacts(folderPath, ExchangeSession.CONTACT_ATTRIBUTES, null, 0); int count = 0; for (ExchangeSession.Contact contact : contacts) { System.out.println("Contact " + (++count) + '/' + contacts.size() + session.getItem(folderPath, contact.getName())); } } public void testSearchPublicContactsRange() throws IOException { String folderPath = Settings.getProperty("davmail.publicContactFolder"); List contacts = session.searchContacts(folderPath, ExchangeSession.CONTACT_ATTRIBUTES, null, 10); assertEquals(10, contacts.size()); } public void testSearchPublicContactsWithPicture() throws IOException { String folderPath = Settings.getProperty("davmail.publicContactFolder"); List contacts = session.searchContacts(folderPath, ExchangeSession.CONTACT_ATTRIBUTES, session.isTrue("haspicture"), 0); int count = 0; for (ExchangeSession.Contact contact : contacts) { System.out.println("Contact " + (++count) + '/' + contacts.size() + contact.getBody()); assertNotNull(session.getContactPhoto(contact)); } } public void testSearchContacts() throws IOException { List contacts = session.searchContacts(ExchangeSession.CONTACTS, ExchangeSession.CONTACT_ATTRIBUTES, null, 0); for (ExchangeSession.Contact contact : contacts) { System.out.println(session.getItem(ExchangeSession.CONTACTS, contact.getName())); } } public void testSearchContactsUidOnly() throws IOException { Set attributes = new HashSet(); attributes.add("uid"); List contacts = session.searchContacts(ExchangeSession.CONTACTS, attributes, null, 0); for (ExchangeSession.Contact contact : contacts) { System.out.println(contact); } } public void testSearchContactsByUid() throws IOException { Set attributes = new HashSet(); attributes.add("uid"); List contacts = session.searchContacts(ExchangeSession.CONTACTS, attributes, null, 0); for (ExchangeSession.Contact contact : contacts) { System.out.println(session.searchContacts(ExchangeSession.CONTACTS, attributes, session.isEqualTo("uid", contact.get("uid")), 0)); } } public void testGalFind() throws IOException { // find a set of contacts Map contacts = session.galFind(session.startsWith("cn", "a"), null, 100); for (ExchangeSession.Contact contact : contacts.values()) { System.out.println(contact); } if (!contacts.isEmpty()) { ExchangeSession.Contact testContact = contacts.values().iterator().next(); contacts = session.galFind(session.isEqualTo("cn", testContact.get("cn")), null, 100); assertEquals(1, contacts.size()); contacts = session.galFind(session.isEqualTo("smtpemail1", testContact.get("smtpemail1")), null, 100); assertEquals(1, contacts.size()); contacts = session.galFind(session.startsWith("smtpemail1", testContact.get("smtpemail1")), null, 100); assertEquals(1, contacts.size()); contacts = session.galFind(session.and(session.isEqualTo("cn", testContact.get("cn")), session.startsWith("smtpemail1", testContact.get("smtpemail1"))), null, 100); assertEquals(1, contacts.size()); } } } davmail-6.3.0/src/test/davmail/exchange/TestICSBufferedReader.java0100644 0000000 0000000 00000015451 13233056167 023554 0ustar000000000 0000000 package davmail.exchange; import junit.framework.TestCase; import java.io.StringReader; import java.io.IOException; /** * Test ICSBufferedReader */ public class TestICSBufferedReader extends TestCase { public void testSimpleRead() throws IOException { String value = "test\nmultiline\nstring"; ICSBufferedReader reader = new ICSBufferedReader(new StringReader(value)); assertEquals("test", reader.readLine()); assertEquals("multiline", reader.readLine()); assertEquals("string", reader.readLine()); assertNull(reader.readLine()); } public void testContinuationRead() throws IOException { String value = "test\nmultiline\n string"; ICSBufferedReader reader = new ICSBufferedReader(new StringReader(value)); assertEquals("test", reader.readLine()); assertEquals("multilinestring", reader.readLine()); assertNull(reader.readLine()); } public void testEventWithEmptyLine() throws IOException { String value = "BEGIN:VCALENDAR\n" + "CALSCALE:GREGORIAN\n" + "METHOD:REQUEST\n" + "PRODID:Microsoft CDO for Microsoft Exchange\n" + "VERSION:2.0\n" + "BEGIN:VTIMEZONE\n" + "TZID:Africa/Lagos\n" + "X-MICROSOFT-CDO-TZID:69\n" + "BEGIN:STANDARD\n" + "DTSTART:16010101T000000\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0100\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010101T000000\n" + "TZOFFSETFROM:+0100\n" + "TZOFFSETTO:+0100\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VEVENT\n" + "DTSTART;TZID=\"Africa/Lagos\":20070326T070000\n" + "DTEND;TZID=\"Africa/Lagos\":20070326T083000\n" + "DTSTAMP:20070217T231150Z\n" + "SUMMARY:My meeting\n" + "CATEGORIES:Groupcal,iCal:user\n" + "UID:com.apple.syncservices:5C1BCD60-8C8E-4FCE-B2CA-C99DE0BE81EB\n" + "RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,FR\n" + "ORGANIZER:MAILTO:user@domain\n" + "\n" + "X-GROUPCAL-ALARM:PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0\n" + "NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOI\n" + "iAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CjxwbGlz\n" + "dCB2ZXJzaW9uPSIxLjAiPgo8YXJyYXkvPgo8L3BsaXN0Pgo=\n" + "CLASS:\n" + "STATUS:TENTATIVE\n" + "TRANSP:OPAQUE\n" + "X-MICROSOFT-CDO-BUSYSTATUS:OOF\n" + "X-MICROSOFT-CDO-INSTTYPE:1\n" + "X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY\n" + "X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n" + "X-MICROSOFT-CDO-IMPORTANCE:1\n" + "X-MICROSOFT-CDO-OWNERAPPTID:-1\n" + "END:VEVENT\n" + "END:VCALENDAR"; ICSBufferedReader reader = new ICSBufferedReader(new StringReader(value)); String line; String lastLine = null; while ((line =reader.readLine())!= null) { lastLine = line; } assertEquals("END:VCALENDAR", lastLine); } public void testBrokenAttendee() throws IOException { String itemBody = "BEGIN:VCALENDAR\n" + "BEGIN:VEVENT\n" + "ATTENDEE;CN=\"Daniel " + "William Doe\";PARTSTAT=ACCEPTED;RSVP=TRUE:MAILTO:email@company.com\n" + "END:VEVENT\n" + "END:VCALENDAR"; VObject vcalendar = new VCalendar(new ICSBufferedReader(new StringReader(itemBody)), "email@company.com", null); System.out.println(vcalendar); } public void testBrokenTask() throws IOException { String value = "BEGIN:VCALENDAR\n" + "BEGIN:VTIMEZONE\n" + "TZID:Central Standard Time\n" + "BEGIN:STANDARD\n" + "DTSTART:16010101T020000\n" + "TZOFFSETFROM:-0500\n" + "TZOFFSETTO:-0600\n" + "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11\n" + "END:STANDARD\n" + "BEGIN:DAYLIGHT\n" + "DTSTART:16010101T020000\n" + "TZOFFSETFROM:-0600\n" + "TZOFFSETTO:-0500\n" + "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3\n" + "END:DAYLIGHT\n" + "END:VTIMEZONE\n" + "BEGIN:VTODO\n" + "LAST-MODIFIED:20110606T080802Z\n" + "CREATED:20110527T085302Z\n" + "UID:AAMkADQwOGRjMjIyLTQwNDUtNDE5OS05YWExLWZlOTM5Yjc2NTg0YgBGAAAAAAAi3Ph1JgynT\n" + " ILoGH8BTtfjBwAzPlOmuBONTIJTcNQH4CUkAAAAAACEAABeoDOEjEPERLNIwtCsV4KdAAABv75hA\n" + " AA=\n" + "SUMMARY:Get everyone view the videos\n" + "DESCRIPTION:They are on local dev server. Update on-boarding correspondingly\n" + " \\n\n" + "PERCENT-COMPLETE:100\n" + "STATUS:COMPLETED\n" + "DUE;VALUE=DATE:20110527\n" + "DTSTART;VALUE=DATE:20110527\n" + "COMPLETED;VALUE=DATE:20110605\n" + "END:VTODO\n" + "END:VCALENDAR"; ICSBufferedReader reader = new ICSBufferedReader(new StringReader(value)); String line; String lastLine = null; while ((line =reader.readLine())!= null) { System.out.println(line); lastLine = line; } assertEquals("END:VCALENDAR", lastLine); new VCalendar(value, null, null); } public void testVCard() throws IOException { String itemBody = "BEGIN:VCARD\n" + "VERSION:3.0\n" + "PRODID:-//Inverse inc.//SOGo Connector 1.0//EN\n" + "UID:C54E78FE-98B0-0001-2339-1D761540DA50\n" + "N:bb;aa\n" + "FN:aa bb\n" + "X-MOZILLA-HTML:FALSE\n" + "REV:20120713T130308Z\n" + "END:VCARD\n" + "\n"; VObject vcard = new VObject(new ICSBufferedReader(new StringReader(itemBody))); } public void testMultiline() { VProperty vProperty = new VProperty("DESCRIPTION", "1\r\n2\r\n3\r\n4\r\n5\r\n"); ICSBufferedWriter icsBufferedWriter = new ICSBufferedWriter(); icsBufferedWriter.writeLine(vProperty.toString()); System.out.println(icsBufferedWriter.buffer); } } davmail-6.3.0/src/test/davmail/exchange/TestICSCalendarValidator.java0100644 0000000 0000000 00000010470 14754417473 024274 0ustar000000000 0000000 // auto generated testcases based on code // class under test is davmail/src/java/davmail/exchange/ICSCalendarValidator.java package davmail.exchange; import junit.framework.TestCase; public class TestICSCalendarValidator extends TestCase { // Test data constants private static final String VALID_TEXT = "Hello World!"; private static final String TEXT_WITH_NULLS = "Hello\u0000World"; private static final String TEXT_WITH_INVALID_CHARS = "Hello\u007FWorld"; private static final String MIXED_TEXT = "Hello\u0000\u0080World\u007F"; public void testIsValidICSContent_Null() { assertFalse(ICSCalendarValidator.isValidICSContent(null)); } public void testIsValidICSContent_Empty() { assertTrue(ICSCalendarValidator.isValidICSContent("")); } public void testIsValidICSContent_Valid() { assertTrue(ICSCalendarValidator.isValidICSContent(VALID_TEXT)); } public void testIsValidICSContent_WithNullBytes() { assertFalse(ICSCalendarValidator.isValidICSContent(TEXT_WITH_NULLS)); } public void testIsValidICSContent_WithInvalidChars() { assertFalse(ICSCalendarValidator.isValidICSContent(TEXT_WITH_INVALID_CHARS)); } public void testIsValidICSContent_MixedInvalid() { assertFalse(ICSCalendarValidator.isValidICSContent(MIXED_TEXT)); } public void testValidateWithDetails_Null() { ICSCalendarValidator.ValidationResult result = ICSCalendarValidator.validateWithDetails(null); assertFalse(result.isValid()); assertEquals("Content is null", result.showReason()); } public void testValidateWithDetails_Valid() { ICSCalendarValidator.ValidationResult result = ICSCalendarValidator.validateWithDetails(VALID_TEXT); assertTrue(result.isValid()); assertEquals("", result.showReason()); } public void testValidateWithDetails_NullBytes() { ICSCalendarValidator.ValidationResult result = ICSCalendarValidator.validateWithDetails(TEXT_WITH_NULLS); assertFalse(result.isValid()); String reason = result.showReason(); assertTrue(reason.contains("null byte(s)")); } public void testValidateWithDetails_InvalidChars() { ICSCalendarValidator.ValidationResult result = ICSCalendarValidator.validateWithDetails(TEXT_WITH_INVALID_CHARS); assertFalse(result.isValid()); String reason = result.showReason(); assertTrue(reason.contains("Invalid character(s)")); } public void testRepairICSContent_Null() { assertNull(ICSCalendarValidator.repairICSContent(null)); } public void testRepairICSContent_Empty() { assertEquals("", ICSCalendarValidator.repairICSContent("")); } public void testRepairICSContent_Unchanged() { String original = VALID_TEXT; String repaired = ICSCalendarValidator.repairICSContent(original); assertEquals(original, repaired); } public void testRepairICSContent_WithNullBytes() { String original = TEXT_WITH_NULLS; String repaired = ICSCalendarValidator.repairICSContent(original); assertEquals("Hello World", repaired); } public void testRepairICSContent_WithInvalidChars() { String original = TEXT_WITH_INVALID_CHARS; String repaired = ICSCalendarValidator.repairICSContent(original); assertEquals("Hello World", repaired); } public void testRepairICSContent_MultipleInvalid() { String original = MIXED_TEXT; String repaired = ICSCalendarValidator.repairICSContent(original); assertEquals("Hello World", repaired); } public void testIsValidChar_BasicValid() { assertTrue(ICSCalendarValidator.isValidChar('A')); assertTrue(ICSCalendarValidator.isValidChar('Z')); assertTrue(ICSCalendarValidator.isValidChar('a')); assertTrue(ICSCalendarValidator.isValidChar('z')); assertTrue(ICSCalendarValidator.isValidChar(' ')); } public void testIsValidChar_BasicInvalid() { assertFalse(ICSCalendarValidator.isValidChar('\u0000')); // null byte assertFalse(ICSCalendarValidator.isValidChar('\u007F')); // delete char assertFalse(ICSCalendarValidator.isValidChar('\u0080')); // invalid Unicode } } davmail-6.3.0/src/test/davmail/exchange/TestO365Authenticator.java0100644 0000000 0000000 00000006057 13445460612 023540 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange; import davmail.AbstractDavMailTestCase; import davmail.exception.DavMailAuthenticationException; import davmail.exchange.auth.O365Authenticator; import davmail.exchange.ews.BaseShape; import davmail.exchange.ews.DistinguishedFolderId; import davmail.exchange.ews.GetFolderMethod; import davmail.http.DavGatewayHttpClientFacade; import org.apache.commons.httpclient.HttpClient; import java.io.IOException; public class TestO365Authenticator extends AbstractDavMailTestCase { public void testO365Authenticator() throws IOException, InterruptedException { davmail.exchange.auth.O365Authenticator authenticator = new O365Authenticator(); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.authenticate(); // switch to EWS url HttpClient httpClient = DavGatewayHttpClientFacade.getInstance(authenticator.getExchangeUri().toString()); DavGatewayHttpClientFacade.createMultiThreadedHttpConnectionManager(httpClient); int i = 0; while (i++ < 12 * 60 * 2) { GetFolderMethod checkMethod = new GetFolderMethod(BaseShape.ID_ONLY, DistinguishedFolderId.getInstance(null, DistinguishedFolderId.Name.root), null); checkMethod.setRequestHeader("Authorization", "Bearer " + authenticator.getToken().getAccessToken()); try { //checkMethod.setServerVersion(serverVersion); httpClient.executeMethod(checkMethod); checkMethod.checkSuccess(); } finally { checkMethod.releaseConnection(); } System.out.println("Retrieved folder id " + checkMethod.getResponseItem().get("FolderId")); Thread.sleep(5000); } } public void testInvalidPassword() throws IOException { try { davmail.exchange.auth.O365Authenticator authenticator = new O365Authenticator(); authenticator.setUsername(username); authenticator.setPassword("invalid"); authenticator.authenticate(); fail("Should fail"); } catch (DavMailAuthenticationException e) { // OK } } } davmail-6.3.0/src/test/davmail/exchange/TestVProperty.java0100644 0000000 0000000 00000003301 12564151512 022305 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2011 Mickael Guessant * * 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. */ package davmail.exchange; import junit.framework.TestCase; /** * Test VProperty. */ public class TestVProperty extends TestCase { public void testMultivaluedParam() { String line = "TEL;TYPE=home,voice:homePhone"; VProperty vProperty = new VProperty(line); assertNotNull(vProperty); assertEquals(line, vProperty.toString()); } public void testQuoteCn() { String line = "ATTENDEE;CN=\"test\":MAILTO:test@company.com"; VProperty vProperty = new VProperty(line); assertNotNull(vProperty); assertEquals(line, vProperty.toString()); } public void testBackslash() { String line = "SUMMARY:Electric Meter change 08:30\\"; VProperty vProperty = new VProperty(line); assertNotNull(vProperty); assertEquals(line, vProperty.toString()); } } davmail-6.3.0/src/test/davmail/exchange/dav/AbstractDavExchangeSessionTestCase.java0100644 0000000 0000000 00000003531 13645663670 027131 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import davmail.AbstractExchange2007TestCase; import davmail.Settings; import davmail.exchange.ExchangeSessionFactory; import java.io.IOException; /** * Parent DavExchangeSession Test case. */ public abstract class AbstractDavExchangeSessionTestCase extends AbstractExchange2007TestCase { HC4DavExchangeSession davSession; /** * @inheritDoc */ @Override public void setUp() throws IOException { super.setUp(); // force mode to HttpClient 4 Dav Settings.setProperty("davmail.mode", "HC4WebDav"); String url = "https://" + server + "/owa"; if (session == null) { session = ExchangeSessionFactory.getInstance(url, username, password); } davSession = (HC4DavExchangeSession) session; assertEquals(username, davSession.getAlias()); assertEquals(email, davSession.getEmail()); assertEquals("/exchange/" + email + "/", davSession.getFolderPath("")); } } davmail-6.3.0/src/test/davmail/exchange/dav/TestDavExchangeSessionMessage.java0100644 0000000 0000000 00000003634 13645663670 026162 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import davmail.exchange.ExchangeSession; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.IOException; import java.util.HashMap; public class TestDavExchangeSessionMessage extends AbstractDavExchangeSessionTestCase { public void testMessage() throws IOException, MessagingException { davSession.deleteFolder("testfolder"); davSession.createMessageFolder("testfolder"); MimeMessage mimeMessage = createMimeMessage(); String itemName = "space star*dash-ampersand&.EML"; HashMap properties = new HashMap<>(); davSession.createMessage("testfolder", itemName, properties, mimeMessage); ExchangeSession.Folder folder = davSession.getFolder("testfolder"); folder.loadMessages(); assertEquals(1, folder.count()); System.out.println(folder.get(0).permanentUrl+" "+folder.get(0).messageUrl); ExchangeSession.Item item = davSession.getItem("testfolder", itemName); assertNotNull(item); } } davmail-6.3.0/src/test/davmail/exchange/dav/TestDavExchangeSessionOther.java0100644 0000000 0000000 00000013200 13645663670 025645 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import org.apache.commons.codec.binary.Base64; import org.apache.commons.httpclient.HttpStatus; import org.apache.jackrabbit.webdav.MultiStatusResponse; import org.apache.jackrabbit.webdav.property.DavProperty; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Set; public class TestDavExchangeSessionOther extends AbstractDavExchangeSessionTestCase { /** * Get main category list * * @throws IOException on error */ public void testGetCategoryList() throws IOException { Set attributes = new HashSet<>(); attributes.add("permanenturl"); attributes.add("roamingxmlstream"); MultiStatusResponse[] responses = davSession.searchItems("/users/" + davSession.getEmail() + "/calendar", attributes, davSession.and(davSession.isFalse("isfolder"), davSession.isEqualTo("messageclass", "IPM.Configuration.CategoryList")), HC4DavExchangeSession.FolderQueryTraversal.Shallow, 0); String value = (String) responses[0].getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("roamingxmlstream")).getValue(); String propertyList = new String(Base64.decodeBase64(value.getBytes()), StandardCharsets.UTF_8); System.out.println(propertyList); } /** * Retrieve all hidden items * * @throws IOException on error */ public void testAllHidden() throws IOException { Set attributes = new HashSet<>(); attributes.add("messageclass"); attributes.add("permanenturl"); attributes.add("roamingxmlstream"); attributes.add("displayname"); MultiStatusResponse[] responses = davSession.searchItems("/users/" + davSession.getEmail() + '/', attributes, davSession.and(davSession.isTrue("ishidden")), HC4DavExchangeSession.FolderQueryTraversal.Deep, 0); for (MultiStatusResponse response : responses) { System.out.println(response.getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("messageclass")).getValue() + ": " + response.getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("displayname")).getValue()); DavProperty roamingxmlstreamProperty = response.getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("roamingxmlstream")); if (roamingxmlstreamProperty != null) { System.out.println(new String(Base64.decodeBase64(((String) roamingxmlstreamProperty.getValue()).getBytes()), StandardCharsets.UTF_8)); } } } /** * Search in non ipm subtree * * @throws IOException on error */ public void testNonIpmSubtree() throws IOException { Set attributes = new HashSet<>(); attributes.add("messageclass"); attributes.add("permanenturl"); attributes.add("roamingxmlstream"); attributes.add("roamingdictionary"); attributes.add("displayname"); MultiStatusResponse[] responses = davSession.searchItems("/users/" + davSession.getEmail() + "/non_ipm_subtree", attributes, davSession.and(davSession.isTrue("ishidden")), HC4DavExchangeSession.FolderQueryTraversal.Deep, 0); for (MultiStatusResponse response : responses) { System.out.println(response.getHref() + ' ' + response.getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("messageclass")).getValue() + ": " + response.getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("displayname")).getValue()); DavProperty roamingxmlstreamProperty = response.getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("roamingxmlstream")); if (roamingxmlstreamProperty != null) { System.out.println("roamingxmlstream: " + new String(Base64.decodeBase64(((String) roamingxmlstreamProperty.getValue()).getBytes()), StandardCharsets.UTF_8)); } DavProperty roamingdictionaryProperty = response.getProperties(HttpStatus.SC_OK).get(Field.getPropertyName("roamingdictionary")); if (roamingdictionaryProperty != null) { System.out.println("roamingdictionary: " + new String(Base64.decodeBase64(((String) roamingdictionaryProperty.getValue()).getBytes()), StandardCharsets.UTF_8)); } } } public void testTimezone() { davSession.getVTimezone(); } public void testEncodeAndFixUrl() throws IOException { String testUrl = "https://invalid.server.name/space plus+star*dash-slash/ampersand&"; ((HC4DavExchangeSession)session).restoreHostName = true; assertEquals("https://"+server+"/space%20plus%2Bstar*dash-slash/ampersand&", ((HC4DavExchangeSession)session).encodeAndFixUrl(testUrl)); } } davmail-6.3.0/src/test/davmail/exchange/dav/TestDavSessionExchange2007.java0100644 0000000 0000000 00000020162 13645663670 025161 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import davmail.AbstractExchange2007TestCase; import davmail.Settings; import davmail.exception.DavMailAuthenticationException; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.auth.ExchangeFormAuthenticator; import davmail.exchange.auth.HC4ExchangeFormAuthenticator; import java.io.IOException; import java.util.List; /** * Test cases for on premise Exchange 2007 in DAV mode. * Get connection info from test.properties */ public class TestDavSessionExchange2007 extends AbstractExchange2007TestCase { public void testSimpleUsernameOWAFormAuthenticator() throws IOException { String url = "https://" + server + "/owa"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.authenticate(); assertEquals("https://" + server + "/owa/", authenticator.getExchangeUri().toString()); // create session DavExchangeSession session = new DavExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); assertEquals("/exchange/" + email + "/", session.getFolderPath("")); } public void testSimpleUsernameOWAFormAuthenticatorInvalid() throws IOException { String url = "https://" + server + "/owa"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username); authenticator.setPassword("invalid"); try { authenticator.authenticate(); fail("Should fail"); } catch (DavMailAuthenticationException e) { assertEquals("Authentication failed: invalid user or password, retry with domain\\user or use default domain setting", e.getMessage()); } } public void testDomainUsernameOWAFormAuthenticator() throws IOException { String url = "https://" + server + "/owa"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(domain + "\\" + username); authenticator.setPassword(password); authenticator.authenticate(); // create session DavExchangeSession session = new DavExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); assertEquals("/exchange/" + email + "/", session.getFolderPath("")); } public void testSimpleUsernameExchangeFormAuthenticator() throws IOException { String url = "https://" + server + "/exchange"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.authenticate(); // create session DavExchangeSession session = new DavExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); assertEquals("/exchange/" + email + "/", session.getFolderPath("")); } public void testDomainUsernameExchangeFormAuthenticator() throws IOException { String url = "https://" + server + "/exchange"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(domain + "\\" + username); authenticator.setPassword(password); authenticator.authenticate(); // create session DavExchangeSession session = new DavExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); assertEquals("/exchange/" + email + "/", session.getFolderPath("")); } /** * Check old preauth authentication process. * Format is preauthusername"username * * @throws IOException on error */ public void testPreauthUsernameExchangeFormAuthenticator() throws IOException { String url = "https://" + server + "/exchange"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username + "\"" + domain + "\\" + username); authenticator.setPassword(password); authenticator.authenticate(); // create session DavExchangeSession session = new DavExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); assertEquals("/exchange/" + email + "/", session.getFolderPath("")); } public void testCreateSession() throws IOException { Settings.setProperty("davmail.url", "https://" + server + "/owa"); Settings.setProperty("davmail.defaultDomain", domain); ExchangeSessionFactory.getInstance(username, password); } public void testHC4OWAFormAuthenticator() throws IOException { String url = "https://" + server + "/owa"; HC4ExchangeFormAuthenticator authenticator = new HC4ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username); authenticator.setPassword(password); //Settings.setLoggingLevel("org.apache.http.wire", Level.DEBUG); //Settings.setLoggingLevel("org.apache.http", Level.DEBUG); authenticator.authenticate(); assertEquals("https://" + server + "/owa/", authenticator.getExchangeUri().toString()); //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); // create session DavExchangeSession session = new DavExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); assertEquals("/exchange/" + email + "/", session.getFolderPath("")); } // TODO: check public void testPublicFolder() throws IOException { //String url = "https://" + server + "/EWS/Exchange.asmx"; String url = "https://" + server + "/owa"; Settings.setProperty("davmail.mode", "WebDav"); ExchangeSession session = ExchangeSessionFactory.getInstance(url, username, password); List folders = session.getSubFolders("/public", true, false); assertTrue(folders.size() > 0); for (ExchangeSession.Folder folder:folders) { System.out.println(folder.folderPath); } } } davmail-6.3.0/src/test/davmail/exchange/dav/TestExchange2007Folders.java0100644 0000000 0000000 00000014335 13645663670 024506 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import davmail.exchange.ExchangeSession; import java.io.IOException; public class TestExchange2007Folders extends AbstractDavExchangeSessionTestCase { /** * Test exchange folder path mapping */ public void testGetFolderPath() { String mailPath = davSession.getFolderPath(""); String rootPath = davSession.getFolderPath("/users/"); assertEquals(mailPath + davSession.inboxName, davSession.getFolderPath("INBOX")); assertEquals(mailPath + davSession.deleteditemsName, davSession.getFolderPath("Trash")); assertEquals(mailPath + davSession.sentitemsName, davSession.getFolderPath("Sent")); assertEquals(mailPath + davSession.draftsName, davSession.getFolderPath("Drafts")); assertEquals(mailPath + davSession.contactsName, davSession.getFolderPath("contacts")); assertEquals(mailPath + davSession.calendarName, davSession.getFolderPath("calendar")); assertEquals(mailPath + davSession.inboxName + "/test", davSession.getFolderPath("INBOX/test")); assertEquals(mailPath + davSession.deleteditemsName + "/test", davSession.getFolderPath("Trash/test")); assertEquals(mailPath + davSession.sentitemsName + "/test", davSession.getFolderPath("Sent/test")); assertEquals(mailPath + davSession.draftsName + "/test", davSession.getFolderPath("Drafts/test")); // TODO: may be wrong, should return full url, public folders may be located on another server assertEquals("/public", davSession.getFolderPath("/public")); assertEquals("/public/test", davSession.getFolderPath("/public/test")); // caldav folder paths assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getEmail())); assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getEmail() + '/')); assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getAlias())); assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getAlias() + '/')); assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getEmail().toUpperCase())); assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getEmail().toLowerCase())); assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getAlias().toUpperCase())); assertEquals(mailPath, davSession.getFolderPath("/users/" + davSession.getAlias().toLowerCase())); assertEquals(mailPath + "subfolder", davSession.getFolderPath("/users/" + davSession.getAlias() + "/subfolder")); assertEquals(mailPath + "subfolder/", davSession.getFolderPath("/users/" + davSession.getAlias() + "/subfolder/")); assertEquals(rootPath + "anotheruser/", davSession.getFolderPath("/users/anotheruser")); assertEquals(rootPath + "anotheruser/subfolder", davSession.getFolderPath("/users/anotheruser/subfolder")); assertEquals(mailPath + davSession.inboxName, davSession.getFolderPath("/users/" + davSession.getEmail() + "/inbox")); assertEquals(mailPath + davSession.inboxName + "/subfolder", davSession.getFolderPath("/users/" + davSession.getEmail() + "/inbox/subfolder")); assertEquals(mailPath + davSession.calendarName, davSession.getFolderPath("/users/" + davSession.getEmail() + "/calendar")); assertEquals(mailPath + davSession.contactsName, davSession.getFolderPath("/users/" + davSession.getEmail() + "/contacts")); assertEquals(mailPath + davSession.contactsName, davSession.getFolderPath("/users/" + davSession.getEmail() + "/addressbook")); assertEquals(rootPath + "anotherUser/" + davSession.inboxName, davSession.getFolderPath("/users/anotherUser/inbox")); assertEquals(rootPath + "anotherUser/" + davSession.calendarName, davSession.getFolderPath("/users/anotherUser/calendar")); assertEquals(rootPath + "anotherUser/" + davSession.contactsName, davSession.getFolderPath("/users/anotherUser/contacts")); // do not replace i18n names //assertEquals(mailPath + "Inbox", davSession.getFolderPath("/users/" + davSession.getEmail() + "/Inbox")); //assertEquals(mailPath + "Calendar", davSession.getFolderPath("/users/" + davSession.getEmail() + "/Calendar")); //assertEquals(mailPath + "Contacts", davSession.getFolderPath("/users/" + davSession.getEmail() + "/Contacts")); } public void testGetFolder() throws IOException { ExchangeSession.Folder folder = davSession.getFolder("INBOX"); assertNotNull(folder); folder.loadMessages(); } public void testCreateMessageFolder() throws IOException { davSession.createMessageFolder("testfolder"); davSession.createMessageFolder("testfolder"); } public void testDeleteFolder() throws IOException { davSession.createMessageFolder("testfolder"); davSession.deleteFolder("testfolder"); davSession.deleteFolder("testfolder"); } public void testCreateFolderEncoding() throws IOException { session.createMessageFolder("testfolder with space"); session.deleteFolder("testfolder with space"); } public void testMoveFolder() throws IOException { session.createMessageFolder("testfolder"); session.moveFolder("testfolder", "testfolder2"); session.deleteFolder("testfolder2"); } } davmail-6.3.0/src/test/davmail/exchange/dav/TestHC4DavExchangeSession.java0100644 0000000 0000000 00000005420 13645663670 025147 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.dav; import davmail.AbstractExchange2007TestCase; import davmail.exchange.auth.HC4ExchangeFormAuthenticator; import org.apache.http.client.utils.URIUtils; import java.io.IOException; /** * Test cases for new HttpClient 4 DavExchangeSession implementation */ public class TestHC4DavExchangeSession extends AbstractExchange2007TestCase { HC4ExchangeFormAuthenticator authenticator = null; @Override public void setUp() throws IOException { super.setUp(); //Settings.setLoggingLevel("org.apache.http.wire", Level.DEBUG); url = "https://" + server + "/owa"; if (authenticator == null) { authenticator = new HC4ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.authenticate(); } } public void testOpenSession() throws IOException { assertEquals("https://" + server + "/owa/", authenticator.getExchangeUri().toString()); assertNotNull(authenticator.getHttpClientAdapter()); initSession(); assertEquals(email, session.getEmail()); assertEquals(username, session.getAlias()); assertEquals(URIUtils.resolve(authenticator.getExchangeUri(), "/public/").toString(), ((HC4DavExchangeSession) session).getCmdBasePath()); assertNotNull(((HC4DavExchangeSession) session).getFolderPath("/users/" + email + "/inbox")); assertNotNull(((HC4DavExchangeSession) session).getFolderPath("/users/" + email + "/calendar")); } private void initSession() throws IOException { if (session == null) { session = new HC4DavExchangeSession( authenticator.getHttpClientAdapter(), authenticator.getExchangeUri(), authenticator.getUsername()); } } } davmail-6.3.0/src/test/davmail/exchange/ews/TestBackOffMilliseconds.java0100644 0000000 0000000 00000014305 14503245213 024775 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.AbstractDavMailTestCase; import davmail.exchange.XMLStreamUtil; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; public class TestBackOffMilliseconds extends AbstractDavMailTestCase { @Override public void setUp() throws IOException { super.setUp(); } String errorDescription; String errorValue; String errorDetail; long backOffMilliseconds; protected String handleTag(XMLStreamReader reader, String localName) throws XMLStreamException { StringBuilder result = null; int event = reader.getEventType(); if (event == XMLStreamConstants.START_ELEMENT && localName.equals(reader.getLocalName())) { result = new StringBuilder(); while (reader.hasNext() && !((event == XMLStreamConstants.END_ELEMENT && localName.equals(reader.getLocalName())))) { event = reader.next(); if (event == XMLStreamConstants.CHARACTERS) { result.append(reader.getText()); } else if ("MessageXml".equals(localName) && event == XMLStreamConstants.START_ELEMENT) { String attributeValue = null; for (int i = 0; i < reader.getAttributeCount(); i++) { if (result.length() > 0) { result.append(", "); } attributeValue = reader.getAttributeValue(i); result.append(reader.getAttributeLocalName(i)).append(": ").append(reader.getAttributeValue(i)); } // catch BackOffMilliseconds value if ("BackOffMilliseconds".equals(attributeValue)) { try { backOffMilliseconds = Long.parseLong(reader.getElementText()); } catch (NumberFormatException e) { //LOGGER.error(e, e.getMessage()); } } } } } if (result != null && result.length() > 0) { return result.toString(); } else { return null; } } protected void handleErrors(XMLStreamReader reader) throws XMLStreamException { String result = handleTag(reader, "ResponseCode"); // store error description; String messageText = handleTag(reader, "MessageText"); if (messageText != null) { errorDescription = messageText; } String messageXml = handleTag(reader, "MessageXml"); if (messageXml != null) { // contains BackOffMilliseconds on ErrorServerBusy errorValue = messageXml; } if (errorDetail == null && result != null && !"NoError".equals(result) && !"ErrorNameResolutionMultipleResults".equals(result) && !"ErrorNameResolutionNoResults".equals(result) && !"ErrorFolderExists".equals(result) ) { errorDetail = result; } if (XMLStreamUtil.isStartTag(reader, "faultstring")) { errorDetail = XMLStreamUtil.getElementText(reader); } } public void testBackOffMillisecondsParsing() throws XMLStreamException { String content = "\n" + " \n" + " \n" + " a:ErrorServerBusy\n" + " The server cannot service this request right now. Try again later.\n" + " \n" + " ErrorServerBusy\n" + " The server cannot service this request right now. Try again later.\n" + " \n" + " 297749\n" + " \n" + " \n" + " \n" + " \n" + ""; InputStream inputStream = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)); XMLStreamReader reader; try { reader = XMLStreamUtil.createXMLStreamReader(inputStream); while (reader.hasNext()) { reader.next(); handleErrors(reader); } } catch (XMLStreamException e) { throw e; } assertEquals(backOffMilliseconds, 297749); } } davmail-6.3.0/src/test/davmail/exchange/ews/TestEwsExchangeSession.java0100644 0000000 0000000 00000006506 12564151512 024710 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.exchange.AbstractExchangeSessionTestCase; import davmail.exchange.ExchangeSession; import java.io.IOException; import java.util.List; import java.util.Map; /** * Webdav specific unit tests */ @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class TestEwsExchangeSession extends AbstractExchangeSessionTestCase { EwsExchangeSession ewsSession; public void setUp() throws IOException { super.setUp(); ewsSession = ((EwsExchangeSession) session); } public void testResolveNames() throws IOException { ResolveNamesMethod resolveNamesMethod = new ResolveNamesMethod("smtp:g"); ewsSession.executeMethod(resolveNamesMethod); List items = resolveNamesMethod.getResponseItems(); for (EWSMethod.Item item : items) { System.out.println(item); } } public void testGalFind() throws IOException { // find a set of contacts Map contacts = ewsSession.galFind(ewsSession.startsWith("cn", "a"), null, 100); for (ExchangeSession.Contact contact : contacts.values()) { System.out.println(contact); } if (!contacts.isEmpty()) { ExchangeSession.Contact testContact = contacts.values().iterator().next(); contacts = ewsSession.galFind(ewsSession.isEqualTo("cn", testContact.get("cn")), null, 100); assertEquals(1, contacts.size()); contacts = ewsSession.galFind(ewsSession.isEqualTo("email1", testContact.get("email1")), null, 100); assertEquals(1, contacts.size()); contacts = ewsSession.galFind(ewsSession.startsWith("email1", testContact.get("email1")), null, 100); assertEquals(1, contacts.size()); contacts = ewsSession.galFind(ewsSession.and(ewsSession.isEqualTo("cn", testContact.get("cn")), ewsSession.startsWith("email1", testContact.get("email1"))), null, 100); assertEquals(1, contacts.size()); } } public void testGetUserConfiguration() throws IOException { GetUserConfigurationMethod getUserConfigurationMethod = new GetUserConfigurationMethod(); ewsSession.executeMethod(getUserConfigurationMethod); EWSMethod.Item item = getUserConfigurationMethod.getResponseItem(); assertNotNull(item); } public void testTimezone() { ewsSession.loadVtimezone(); } } davmail-6.3.0/src/test/davmail/exchange/ews/TestExchange2007EWS.java0100644 0000000 0000000 00000006617 13524353417 023565 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.ews; import davmail.AbstractExchange2007TestCase; import davmail.Settings; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import davmail.exchange.auth.ExchangeFormAuthenticator; import org.apache.log4j.Level; import java.io.IOException; public class TestExchange2007EWS extends AbstractExchange2007TestCase { public void testSimpleUsernameOWAFormAuthenticator() throws IOException { Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); String url = "https://" + server + "/owa"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.authenticate(); assertEquals("https://" + server + "/owa/", authenticator.getExchangeUri().toString()); // create session EwsExchangeSession session = new EwsExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); session.getFolder(""); } public void testSimpleUsernameEWSFormAuthenticator() throws IOException { String url = "https://" + server + "/EWS/Exchange.asmx"; ExchangeFormAuthenticator authenticator = new ExchangeFormAuthenticator(); authenticator.setUrl(url); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.authenticate(); assertEquals("/EWS/Services.wsdl", authenticator.getExchangeUri().toString()); //Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); // create session EwsExchangeSession session = new EwsExchangeSession(authenticator.getHttpClient(), authenticator.getExchangeUri(), authenticator.getUsername()); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); } public void testDirectEWSAuthentication() throws IOException { //Settings.setProperty("davmail.enableKerberos", "true"); Settings.setLoggingLevel("httpclient.wire", Level.DEBUG); String url = "https://" + server + "/EWS/Exchange.asmx"; ExchangeSession session = ExchangeSessionFactory.getInstance(url, username, password); assertEquals(username, session.getAlias()); assertEquals(email, session.getEmail()); } } davmail-6.3.0/src/test/davmail/exchange/graph/TestGraphExchangeSessionFolders.java0100644 0000000 0000000 00000007117 14754153477 027053 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.exchange.graph; import davmail.Settings; import davmail.exception.HttpNotFoundException; import davmail.exchange.AbstractExchangeSessionTestCase; import davmail.exchange.ExchangeSession; import davmail.exchange.auth.O365Authenticator; import davmail.http.HttpClientAdapter; import java.io.IOException; public class TestGraphExchangeSessionFolders extends AbstractExchangeSessionTestCase { davmail.exchange.auth.O365Authenticator authenticator = null; GraphExchangeSession graphExchangeSession = null; @Override public void setUp() throws IOException { if (!loaded) { super.setUp(); // custom app Settings.setProperty("davmail.oauth.clientId", "fcd7ee35-332e-48b6-85ba-1b6de796ded7"); Settings.setProperty("davmail.oauth.redirectUri", "https://login.microsoftonline.com/common/oauth2/nativeclient"); Settings.setProperty("davmail.enableGraph", "true"); authenticator = new O365Authenticator(); authenticator.setUsername(username); authenticator.setPassword(password); authenticator.authenticate(); HttpClientAdapter httpClientAdapter = new HttpClientAdapter(Settings.getO365Url(), true); graphExchangeSession = new GraphExchangeSession(httpClientAdapter, authenticator.getToken(), username); } } public void testGetInbox() throws IOException { ExchangeSession.Folder folder = graphExchangeSession.internalGetFolder("inbox"); assertNotNull(folder); assertNotNull(graphExchangeSession.internalGetFolder("/users/" + username + "/inbox")); } public void testInvalidFolder() throws IOException { try { graphExchangeSession.internalGetFolder("invalid"); assertFalse("Should not get there", true); } catch (HttpNotFoundException e) { // ok } } public void testGetWellknown() throws IOException { assertNotNull(graphExchangeSession.internalGetFolder("/users/" + username + "/Drafts")); assertNotNull(graphExchangeSession.internalGetFolder("/users/" + username + "/Sent")); assertNotNull(graphExchangeSession.internalGetFolder("/users/" + username + "/Trash")); assertNotNull(graphExchangeSession.internalGetFolder("/users/" + username + "/Junk")); assertNotNull(graphExchangeSession.internalGetFolder("/users/" + username + "/Unsent Messages")); // TODO calendars and task are not normal folders over graph //assertNotNull(graphExchangeSession.internalGetFolder("/users/"+username+"/calendar")); //assertNotNull(graphExchangeSession.internalGetFolder("/users/"+username+"/tasks")); } } davmail-6.3.0/src/test/davmail/http/TestGetRequest.java0100644 0000000 0000000 00000007715 13645663670 021653 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import davmail.AbstractDavMailTestCase; import davmail.Settings; import davmail.http.request.GetRequest; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; import java.io.IOException; public class TestGetRequest extends AbstractDavMailTestCase { private static final String DAVMAIL_VERSION_URL = "http://davmail.sourceforge.net/version.txt"; public void testSuccess() throws IOException { try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(DAVMAIL_VERSION_URL)) { GetRequest request = new GetRequest(DAVMAIL_VERSION_URL); String responseString = httpClientAdapter.executeGetRequest(request); assertEquals(HttpStatus.SC_OK, request.getStatusCode()); assertEquals("OK", request.getReasonPhrase()); assertNotNull(responseString); } } public void testRedirect() throws IOException { // execute get request, do not follow redirect final String outlookUrl = "https://outlook.office365.com"; try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(outlookUrl)) { GetRequest request = new GetRequest(outlookUrl); String responseString = httpClientAdapter.executeGetRequest(request); assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, request.getStatusCode()); assertEquals("Moved Temporarily", request.getReasonPhrase()); assertNull(responseString); } } public void testNotFound() throws IOException { try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(DAVMAIL_VERSION_URL)) { GetRequest request = new GetRequest("/notfound.txt"); try { httpClientAdapter.executeGetRequest(request); fail("Should fail"); } catch (HttpResponseException e) { assertEquals(HttpStatus.SC_NOT_FOUND, e.getStatusCode()); } } } public void testAuthorizationRequired() throws IOException { // create httpClientAdapter without credentials try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(Settings.O365_URL)) { GetRequest request = new GetRequest(Settings.O365_URL); httpClientAdapter.executeGetRequest(request); fail("Should fail"); } catch (HttpResponseException e) { assertEquals(HttpStatus.SC_UNAUTHORIZED, e.getStatusCode()); assertEquals("Unauthorized", e.getMessage()); } } public void testAuthentication() throws IOException { // create httpClientAdapter with credentials try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(Settings.O365_URL, username, password)) { GetRequest request = new GetRequest(Settings.O365_URL); String responseBody = httpClientAdapter.executeGetRequest(request); assertEquals(HttpStatus.SC_OK, request.getStatusCode()); assertEquals("OK", request.getReasonPhrase()); assertNotNull(responseBody); } } } davmail-6.3.0/src/test/davmail/http/TestHttpClient4.java0100644 0000000 0000000 00000043342 13574116520 021705 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import davmail.AbstractDavMailTestCase; import davmail.Settings; import davmail.exchange.ews.AutoDiscoverMethod; import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.HttpStatus; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIUtils; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.config.SocketConfig; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.BasicResponseHandler; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.IdleConnectionEvictor; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.log4j.Level; import java.io.IOException; import java.net.URI; import java.util.concurrent.TimeUnit; public class TestHttpClient4 extends AbstractDavMailTestCase { public void testBasicGetRequest() throws IOException { HttpClientBuilder clientBuilder = HttpClientBuilder.create(); try (CloseableHttpClient httpClient = clientBuilder.build()) { HttpGet httpget = new HttpGet("http://davmail.sourceforge.net/version.txt"); try (CloseableHttpResponse response = httpClient.execute(httpget)) { String responseString = new BasicResponseHandler().handleResponse(response); System.out.println(responseString); } } } public void testConnectionPooling() throws IOException { PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(); poolingHttpClientConnectionManager.setDefaultMaxPerRoute(5); poolingHttpClientConnectionManager.setMaxTotal(5); poolingHttpClientConnectionManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(1000 * 60).build()); HttpClientBuilder clientBuilder = HttpClientBuilder.create() .setConnectionManager(poolingHttpClientConnectionManager); try (CloseableHttpClient httpClient = clientBuilder.build()) { for (int i = 0; i < 10; i++) { HttpGet httpget = new HttpGet("http://davmail.sourceforge.net/version.txt"); try (CloseableHttpResponse response = httpClient.execute(httpget)) { System.out.println("Pool stats after execute: " + poolingHttpClientConnectionManager.getTotalStats()); assertEquals(1, poolingHttpClientConnectionManager.getTotalStats().getLeased()); assertEquals(0, poolingHttpClientConnectionManager.getTotalStats().getAvailable()); String responseString = new BasicResponseHandler().handleResponse(response); System.out.println(responseString); System.out.println("Pool stats after response: " + poolingHttpClientConnectionManager.getTotalStats()); } System.out.println("Pool stats after close response: " + poolingHttpClientConnectionManager.getTotalStats()); assertEquals(0, poolingHttpClientConnectionManager.getTotalStats().getLeased()); assertEquals(1, poolingHttpClientConnectionManager.getTotalStats().getAvailable()); } } System.out.println("Pool stats after close httpClient: " + poolingHttpClientConnectionManager.getTotalStats()); assertEquals(0, poolingHttpClientConnectionManager.getTotalStats().getLeased()); assertEquals(0, poolingHttpClientConnectionManager.getTotalStats().getAvailable()); } public void testSSL() throws IOException { RegistryBuilder schemeRegistry = RegistryBuilder.create(); schemeRegistry.register("https", new SSLConnectionSocketFactory(new DavGatewaySSLSocketFactory(), SSLConnectionSocketFactory.getDefaultHostnameVerifier())); PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(schemeRegistry.build()); HttpClientBuilder clientBuilder = HttpClientBuilder.create() .disableRedirectHandling() .setConnectionManager(poolingHttpClientConnectionManager); try (CloseableHttpClient httpClient = clientBuilder.build()) { HttpGet httpget = new HttpGet("https://outlook.office365.com"); try (CloseableHttpResponse response = httpClient.execute(httpget)) { assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, response.getStatusLine().getStatusCode()); } } } public void testBasicAuthentication() throws IOException { Settings.setLoggingLevel("org.apache.http", Level.DEBUG); RegistryBuilder schemeRegistry = RegistryBuilder.create(); schemeRegistry.register("https", new SSLConnectionSocketFactory(new DavGatewaySSLSocketFactory(), SSLConnectionSocketFactory.getDefaultHostnameVerifier())); CredentialsProvider provider = new BasicCredentialsProvider(); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(username, password); provider.setCredentials(AuthScope.ANY, credentials); PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(schemeRegistry.build()); HttpClientBuilder clientBuilder = HttpClientBuilder.create() .disableRedirectHandling() .setDefaultCredentialsProvider(provider) .setConnectionManager(poolingHttpClientConnectionManager); try (CloseableHttpClient httpClient = clientBuilder.build()) { HttpGet httpget = new HttpGet("https://outlook.office365.com/EWS/Exchange.asmx"); try (CloseableHttpResponse response = httpClient.execute(httpget)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); String responseString = new BasicResponseHandler().handleResponse(response); System.out.println(responseString); } } } public void testHttpProxy() throws IOException { Settings.setLoggingLevel("org.apache.http.wire", Level.DEBUG); Settings.setLoggingLevel("org.apache.http", Level.DEBUG); String proxyHost = Settings.getProperty("davmail.proxyHost"); int proxyPort = Settings.getIntProperty("davmail.proxyPort"); HttpHost proxy = new HttpHost(proxyHost, proxyPort); HttpClientBuilder clientBuilder = HttpClientBuilder.create(); clientBuilder.setProxy(proxy).setUserAgent(DavGatewayHttpClientFacade.IE_USER_AGENT); clientBuilder.setDefaultCredentialsProvider(getProxyCredentialProvider()); try (CloseableHttpClient httpClient = clientBuilder.build()) { HttpGet httpget = new HttpGet("http://davmail.sourceforge.net/version.txt"); try (CloseableHttpResponse response = httpClient.execute(httpget)) { String responseString = new BasicResponseHandler().handleResponse(response); System.out.println(responseString); } } } private CredentialsProvider getProxyCredentialProvider() { String proxyHost = Settings.getProperty("davmail.proxyHost"); int proxyPort = Settings.getIntProperty("davmail.proxyPort"); // proxy authentication String proxyUser = Settings.getProperty("davmail.proxyUser"); String proxyPassword = Settings.getProperty("davmail.proxyPassword"); BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); AuthScope authScope = new AuthScope(proxyHost, proxyPort, AuthScope.ANY_REALM); credentialsProvider.setCredentials(authScope, new UsernamePasswordCredentials(proxyUser, proxyPassword)); return credentialsProvider; } public void testGetPath() throws IOException { Settings.setLoggingLevel("org.apache.http.wire", Level.DEBUG); Settings.setLoggingLevel("org.apache.http", Level.DEBUG); HttpClientBuilder clientBuilder = HttpClientBuilder.create(); try (CloseableHttpClient httpClient = clientBuilder.build()) { String url = "http://davmail.sourceforge.net"; // get with host HttpGet httpget = new HttpGet(url); try (CloseableHttpResponse response = httpClient.execute(httpget)) { new BasicResponseHandler().handleResponse(response); } // get with path only httpget = new HttpGet(URIUtils.resolve(httpget.getURI(), "/version.txt")); try (CloseableHttpResponse response2 = httpClient.execute(httpget)) { String responseString = new BasicResponseHandler().handleResponse(response2); System.out.println(responseString); } } } public void testFollowRedirects() throws IOException { Settings.setLoggingLevel("org.apache.http.wire", Level.DEBUG); Settings.setLoggingLevel("org.apache.http", Level.DEBUG); HttpClientBuilder clientBuilder = HttpClientBuilder.create().disableRedirectHandling(); try (CloseableHttpClient httpClient = clientBuilder.build()) { HttpGet httpget = new HttpGet("https://outlook.office365.com/owa/"); Header location; try (CloseableHttpResponse response = httpClient.execute(httpget)) { assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, response.getStatusLine().getStatusCode()); location = response.getFirstHeader("Location"); } assertNotNull(location); URI targetUri = URIUtils.resolve(httpget.getURI(), location.getValue()); httpget = new HttpGet(targetUri); try (CloseableHttpResponse response2 = httpClient.execute(httpget)) { assertEquals(HttpStatus.SC_OK, response2.getStatusLine().getStatusCode()); String responseString = new BasicResponseHandler().handleResponse(response2); System.out.println(responseString); } } } public void testTimeouts() throws IOException, InterruptedException { Settings.setLoggingLevel("org.apache.http", Level.DEBUG); Settings.setLoggingLevel("org.apache.http.impl.conn", Level.DEBUG); RegistryBuilder schemeRegistry = RegistryBuilder.create(); schemeRegistry.register("http", new PlainConnectionSocketFactory()); schemeRegistry.register("https", new SSLConnectionSocketFactory(new DavGatewaySSLSocketFactory(), SSLConnectionSocketFactory.getDefaultHostnameVerifier())); Registry registry = schemeRegistry.build(); RequestConfig config = RequestConfig.custom() // time to get request from the pool .setConnectionRequestTimeout(5000) // socket connect timeout .setConnectTimeout(5000) // inactivity timeout .setSocketTimeout(5000) // disable redirect .setRedirectsEnabled(false) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); HttpClientBuilder clientBuilder = HttpClientBuilder.create() .disableRedirectHandling() .setDefaultRequestConfig(config) .setConnectionManager(connectionManager); IdleConnectionEvictor evictor = new IdleConnectionEvictor(connectionManager, 1, TimeUnit.MINUTES); evictor.start(); try (CloseableHttpClient httpClient = clientBuilder.build()) { HttpGet httpget = new HttpGet("http://davmail.sourceforge.net/version.txt"); try (CloseableHttpResponse response = httpClient.execute(httpget)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); String responseString = new BasicResponseHandler().handleResponse(response); System.out.println(responseString); } while (connectionManager.getTotalStats().getAvailable() > 0) { Thread.sleep(5000); System.out.println("Pool: " + connectionManager.getTotalStats()); } } finally { evictor.shutdown(); } } public void testTimeoutsWithProxy() throws IOException, InterruptedException { Settings.setLoggingLevel("org.apache.http", Level.DEBUG); Settings.setLoggingLevel("org.apache.http.impl.conn", Level.DEBUG); RegistryBuilder schemeRegistry = RegistryBuilder.create(); schemeRegistry.register("http", new PlainConnectionSocketFactory()); schemeRegistry.register("https", new SSLConnectionSocketFactory(new DavGatewaySSLSocketFactory(), SSLConnectionSocketFactory.getDefaultHostnameVerifier())); Registry registry = schemeRegistry.build(); RequestConfig config = RequestConfig.custom() // time to get request from the pool .setConnectionRequestTimeout(5000) // socket connect timeout .setConnectTimeout(5000) // inactivity timeout .setSocketTimeout(5000) // disable redirect .setRedirectsEnabled(false) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); HttpClientBuilder clientBuilder = HttpClientBuilder.create() .disableRedirectHandling() .setDefaultRequestConfig(config) .setConnectionManager(connectionManager); String proxyHost = Settings.getProperty("davmail.proxyHost"); int proxyPort = Settings.getIntProperty("davmail.proxyPort"); HttpHost proxy = new HttpHost(proxyHost, proxyPort); clientBuilder.setProxy(proxy); clientBuilder.setDefaultCredentialsProvider(getProxyCredentialProvider()); IdleConnectionEvictor evictor = new IdleConnectionEvictor(connectionManager, 1, TimeUnit.MINUTES); evictor.start(); try (CloseableHttpClient httpClient = clientBuilder.build()) { HttpGet httpget = new HttpGet("http://davmail.sourceforge.net/version.txt"); try (CloseableHttpResponse response = httpClient.execute(httpget)) { assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); String responseString = new BasicResponseHandler().handleResponse(response); System.out.println(responseString); } while (connectionManager.getTotalStats().getAvailable() > 0) { Thread.sleep(5000); System.out.println("Pool: " + connectionManager.getTotalStats()); } } finally { evictor.shutdown(); } } public void testAutoDiscover() throws IOException { Settings.setLoggingLevel("org.apache.http", Level.DEBUG); //Settings.setLoggingLevel("org.apache.http.impl.conn", Level.DEBUG); String userid; String userEmail; int pipeIndex = username.indexOf("|"); if (pipeIndex >= 0) { userid = username.substring(0, pipeIndex); userEmail = username.substring(pipeIndex + 1); } else { userid = username; userEmail = username; } String suffix = userEmail.substring(userEmail.indexOf("@") + 1); String autodiscoverHost = "autodiscover." + suffix; url = "http://" + autodiscoverHost + "/autodiscover/autodiscover.xml"; String ewsUrl; try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(url, userid, password)) { AutoDiscoverMethod autoDiscoverRequest = new AutoDiscoverMethod(url, userEmail); try (CloseableHttpResponse httpResponse = httpClientAdapter.executeFollowRedirects(autoDiscoverRequest)) { ewsUrl = (String) autoDiscoverRequest.handleResponse(httpResponse); } } System.out.println(ewsUrl); assertNotNull(ewsUrl); } } davmail-6.3.0/src/test/davmail/http/TestHttpClientAdapter.java0100644 0000000 0000000 00000021504 13645663670 023132 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import davmail.AbstractDavMailTestCase; import davmail.Settings; import davmail.http.request.GetRequest; import davmail.http.request.PostRequest; import davmail.http.request.RestRequest; import org.apache.http.Consts; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.BasicResponseHandler; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestHttpClientAdapter extends AbstractDavMailTestCase { public void testBasicGetRequest() throws IOException { try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter("http://davmail.sourceforge.net/version.txt")) { HttpGet httpget = new HttpGet("http://davmail.sourceforge.net/version.txt"); try (CloseableHttpResponse response = httpClientAdapter.execute(httpget)) { String responseString = new BasicResponseHandler().handleResponse(response); assertNotNull(responseString); System.out.println(responseString); } // alternative with GetRequest GetRequest getRequest = new GetRequest("http://davmail.sourceforge.net/version.txt"); String responseString = httpClientAdapter.executeGetRequest(getRequest); assertNotNull(responseString); } } public void testEWSAuthentication() throws IOException { String url = Settings.getProperty("davmail.url"); try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(url, username, password, true)) { GetRequest getRequest = new GetRequest(url); String responseString = httpClientAdapter.executeGetRequest(getRequest); assertEquals(HttpStatus.SC_OK, getRequest.getStatusCode()); assertNotNull(responseString); } } public void testGetMicrosoftOnline() throws URISyntaxException, IOException, JSONException { // common DavMail client id String clientId = Settings.getProperty("davmail.oauth.clientId", "facd6cff-a294-4415-b59f-c5b01937d7bd"); // standard native app redirectUri String redirectUri = Settings.getProperty("davmail.oauth.redirectUri", "https://login.microsoftonline.com/common/oauth2/nativeclient"); URI uri = new URIBuilder() .setScheme("https") .setHost("login.microsoftonline.com") .setPath("/common/oauth2/authorize") .addParameter("client_id", clientId) .addParameter("response_type", "code") .addParameter("redirect_uri", redirectUri) .addParameter("response_mode", "query") .addParameter("resource", "https://outlook.office365.com") .addParameter("login_hint", username) // force consent //.addParameter("prompt", "consent") .build(); try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(uri.toString())) { JSONObject config; GetRequest getRequest = new GetRequest(uri); String responseBody = httpClientAdapter.executeGetRequest(getRequest); assertEquals(HttpStatus.SC_OK, getRequest.getStatusCode()); System.out.println(extract("Config=([^\n]+);", responseBody)); config = new JSONObject(extract("Config=([^\n]+);", responseBody)); assertNotNull(config.getString("sCtx")); String context = config.getString("sCtx"); // csts request String apiCanary = config.getString("apiCanary"); // canary for API calls String clientRequestId = config.getString("correlationId"); String hpgact = config.getString("hpgact"); String hpgid = config.getString("hpgid"); String flowToken = config.getString("sFT"); String canary = config.getString("canary"); String sessionId = config.getString("sessionId"); String referer = getRequest.getURI().toString(); RestRequest getCredentialRequest = new RestRequest("https://login.microsoftonline.com/common/GetCredentialType"); getCredentialRequest.setHeader("Accept", "application/json"); getCredentialRequest.setHeader("canary", apiCanary); getCredentialRequest.setHeader("client-request-id", clientRequestId); getCredentialRequest.setHeader("hpgact", hpgact); getCredentialRequest.setHeader("hpgid", hpgid); getCredentialRequest.setHeader("hpgrequestid", sessionId); getCredentialRequest.setHeader("Referer", referer); final JSONObject jsonObject = new JSONObject(); jsonObject.put("username", username); jsonObject.put("isOtherIdpSupported", true); jsonObject.put("checkPhones", false); jsonObject.put("isRemoteNGCSupported", false); jsonObject.put("isCookieBannerShown", false); jsonObject.put("isFidoSupported", false); jsonObject.put("flowToken", flowToken); jsonObject.put("originalRequest", context); getCredentialRequest.setJsonBody(jsonObject); JSONObject credentialType = httpClientAdapter.executeRestRequest(getCredentialRequest); System.out.println("CredentialType=" + credentialType); JSONObject credentials = credentialType.getJSONObject("Credentials"); String federationRedirectUrl = credentials.optString("FederationRedirectUrl"); System.out.println("federationRedirectUrl=" + federationRedirectUrl); if (federationRedirectUrl == null || federationRedirectUrl.isEmpty()) { PostRequest logonMethod = new PostRequest(URI.create("https://login.microsoftonline.com/common/login")); logonMethod.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); logonMethod.setHeader("Content-Type", "application/x-www-form-urlencoded"); logonMethod.setHeader("Referer", referer); logonMethod.setParameter("canary", canary); logonMethod.setParameter("ctx", context); logonMethod.setParameter("flowToken", flowToken); logonMethod.setParameter("hpgrequestid", sessionId); logonMethod.setParameter("login", username); logonMethod.setParameter("loginfmt", username); logonMethod.setParameter("passwd", password); responseBody = httpClientAdapter.executePostRequest(logonMethod); URI location = logonMethod.getRedirectLocation(); System.out.println(location); if (location == null) { System.out.println(extract(responseBody, "Config=([^\n]+);")); } assertNotNull(location); System.out.println(location.getQuery()); List responseParams = URLEncodedUtils.parse(location, Consts.UTF_8); assertNotNull(responseParams.get(0)); assertEquals("code", responseParams.get(0).getName()); } } } public String extract(String pattern, String content) throws IOException { String value; Matcher matcher = Pattern.compile(pattern).matcher(content); if (matcher.find()) { value = matcher.group(1); } else { throw new IOException("pattern not found"); } return value; } } davmail-6.3.0/src/test/davmail/http/TestPostRequest.java0100644 0000000 0000000 00000010034 13645663670 022045 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import davmail.AbstractDavMailTestCase; import davmail.Settings; import davmail.http.request.PostRequest; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; import java.io.IOException; public class TestPostRequest extends AbstractDavMailTestCase { private static final String DAVMAIL_VERSION_URL = "http://davmail.sourceforge.net/version.txt"; public void testSuccess() throws IOException { try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(DAVMAIL_VERSION_URL)) { PostRequest request = new PostRequest(DAVMAIL_VERSION_URL); String responseString = httpClientAdapter.executePostRequest(request); assertEquals(HttpStatus.SC_OK, request.getStatusCode()); assertEquals("OK", request.getReasonPhrase()); assertNotNull(responseString); } } public void testRedirect() throws IOException { // execute get request, do not follow redirect final String outlookUrl = "https://outlook.office365.com"; try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(outlookUrl)) { PostRequest request = new PostRequest(outlookUrl); String responseString = httpClientAdapter.executePostRequest(request); assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, request.getStatusCode()); assertEquals("Moved Temporarily", request.getReasonPhrase()); assertNull(responseString); } } public void testAuthorizationRequired() throws IOException { // create httpClientAdapter without credentials try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(Settings.O365_URL)) { PostRequest request = new PostRequest(Settings.O365_URL); httpClientAdapter.executePostRequest(request); fail("Should fail"); } catch (HttpResponseException e) { assertEquals(HttpStatus.SC_UNAUTHORIZED, e.getStatusCode()); assertEquals("Unauthorized", e.getMessage()); } } public void testAuthentication() throws IOException { // create httpClientAdapter with credentials, empty POST should fail try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(Settings.O365_URL, username, password)) { PostRequest request = new PostRequest(Settings.O365_URL); httpClientAdapter.executePostRequest(request); fail("Should fail"); } catch (HttpResponseException e) { assertEquals(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getStatusCode()); assertEquals("Internal Server Error", e.getMessage()); } } public void testNotFound() throws IOException { try (HttpClientAdapter httpClientAdapter = new HttpClientAdapter(DAVMAIL_VERSION_URL)) { PostRequest request = new PostRequest("/notfound.txt"); try { httpClientAdapter.executePostRequest(request); fail("Should fail"); } catch (HttpResponseException e) { assertEquals(HttpStatus.SC_NOT_FOUND, e.getStatusCode()); } } } } davmail-6.3.0/src/test/davmail/http/TestURIBuilder.java0100644 0000000 0000000 00000011122 13574116520 021500 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.http; import junit.framework.TestCase; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.net.URLCodec; import org.apache.http.Consts; import org.apache.http.client.utils.URIBuilder; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.BitSet; /** * A few URIBuilder test cases to replace URIUtil */ public class TestURIBuilder extends TestCase { public void testEncodeParams() throws URISyntaxException { String clientId = "facd6cff-a294-4415-b59f-c5b01937d7bd"; String redirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"; String resource = "https://outlook.office365.com"; String username = "domain\\userid|user@company.com"; String url = "https://login.microsoftonline.com/common/oauth2/authorize" + "?client_id=" + clientId + "&response_type=code" + "&redirect_uri=" + URIUtil.encodeWithinQuery(redirectUri) + "&response_mode=query" + "&resource=" + URIUtil.encodeWithinQuery(resource) + "&login_hint=" + URIUtil.encodeWithinQuery(username); URI uri = new URIBuilder() .setScheme("https") .setHost("login.microsoftonline.com") .setPath("/common/oauth2/authorize") .addParameter("client_id", clientId) .addParameter("response_type", "code") .addParameter("redirect_uri", redirectUri) .addParameter("response_mode", "query") .addParameter("resource", resource) .addParameter("login_hint", username) .build(); System.out.println(url); assertEquals(uri.toString(), url); } public void testEncodePath() throws URISyntaxException { String url = "https://host"+URIUtil.encodePath("/path with space"); URI uri = new URIBuilder() .setScheme("https") .setHost("host") .setPath("/path with space") .build(); System.out.println(url); assertEquals(uri.toString(), url); } public void testDecodePlus() throws IOException, URISyntaxException, DecoderException { URI uri = new URI("https://host/encoded+plus"); System.out.println(uri.getPath()); System.out.println(URIUtil.decode(uri.getPath())); String decoded = new String(URLCodec.decodeUrl(uri.getPath().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); assertEquals(decoded, URIUtil.decode(uri.getPath())); } public void testDecodeSpecial() throws IOException, URISyntaxException, DecoderException { URI uri = new URI("https://host/@"); System.out.println(uri.getPath()); System.out.println(URIUtil.decode(uri.getPath())); String decoded = new String(URLCodec.decodeUrl(uri.getPath().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); assertEquals(decoded, URIUtil.decode(uri.getPath())); } public void testEncodeSpecial() { BitSet ical_allowed_abs_path = new BitSet(256); ical_allowed_abs_path.or(org.apache.commons.httpclient.URI.allowed_abs_path); ical_allowed_abs_path.clear('@'); String path = "user@company.com"; String encoded = URIUtil.encode(path, ical_allowed_abs_path); System.out.println(encoded); String newEncoded = new String(URLCodec.encodeUrl(ical_allowed_abs_path, path.getBytes(Consts.UTF_8)), Consts.UTF_8); System.out.println(newEncoded); assertEquals(newEncoded, encoded); } } davmail-6.3.0/src/test/davmail/imap/AbstractImapTestCase.java0100644 0000000 0000000 00000013160 13233056167 022655 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2011 Mickael Guessant * * 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. */ package davmail.imap; import davmail.AbstractDavMailTestCase; import davmail.DavGateway; import davmail.Settings; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import java.io.*; import java.net.Socket; /** * Abstract IMAP test case. */ public class AbstractImapTestCase extends AbstractDavMailTestCase { static Socket clientSocket; static BufferedWriter socketWriter; static BufferedReader socketReader; static String messageUid; protected void write(String line) throws IOException { socketWriter.write(line); socketWriter.flush(); } protected void writeLine(String line) throws IOException { socketWriter.write(line); socketWriter.newLine(); socketWriter.flush(); } protected String readLine() throws IOException { return socketReader.readLine(); } protected String readFullAnswer(String prefix) throws IOException { String line = socketReader.readLine(); while (!line.startsWith(prefix)) { line = socketReader.readLine(); } return line; } @Override public void setUp() throws IOException { boolean needStart = !loaded; super.setUp(); // set custom flag to check flag to category conversion Settings.setProperty("davmail.imapFlags.some_tag", "Some Category"); if (needStart) { // start gateway DavGateway.start(); } if (clientSocket == null) { clientSocket = new Socket("localhost", Settings.getIntProperty("davmail.imapPort")); socketWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String banner = socketReader.readLine(); assertNotNull(banner); writeLine(". LOGIN " + username.replaceAll("\\\\", "\\\\\\\\") + ' ' + password); assertEquals(". OK Authenticated", socketReader.readLine()); } } public void resetTestFolder() throws IOException { writeLine(". DELETE testfolder"); readFullAnswer("."); writeLine(". CREATE testfolder"); assertEquals(". OK folder created", readFullAnswer(".")); writeLine(". SELECT testfolder"); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); } public void appendMessage() throws IOException { try { MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", "testto <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.addHeader("cc", "testcc <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.setText("Test message "); mimeMessage.setSubject("Test subject "); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); byte[] content = baos.toByteArray(); writeLine(". APPEND testfolder (\\Seen \\Draft) {" + content.length + '}'); assertEquals("+ send literal data", readLine()); writeLine(new String(content)); assertEquals(". OK APPEND completed", readFullAnswer(".")); writeLine(". NOOP"); assertEquals(". OK NOOP completed", readFullAnswer(".")); // fetch message uid writeLine(". UID FETCH 1:* (FLAGS)"); String messageLine = readLine(); int uidIndex = messageLine.indexOf("UID ") + 4; messageUid = messageLine.substring(uidIndex, messageLine.indexOf(' ', uidIndex)); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); assertNotNull(messageUid); } catch (MessagingException e) { throw new IOException(e); } } public void appendHundredMessages() throws IOException, MessagingException { for (int i = 0; i < 100; i++) { MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", "testto <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.setText("Test message " + i); mimeMessage.setSubject("Test subject " + i); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); byte[] content = baos.toByteArray(); writeLine(". APPEND testfolder (\\Seen \\Draft) {" + content.length + '}'); assertEquals("+ send literal data", readLine()); writeLine(new String(content)); assertEquals(". OK APPEND completed", readFullAnswer(".")); } } } davmail-6.3.0/src/test/davmail/imap/TestImap.java0100644 0000000 0000000 00000075524 13576753242 020421 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.imap; import davmail.Settings; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import javax.mail.util.SharedByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; /** * IMAP tests, an instance of DavMail Gateway must be available */ @SuppressWarnings({"UseOfSystemOutOrSystemErr"}) public class TestImap extends AbstractImapTestCase { protected String getLastMonth() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, -1); SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH); formatter.setTimeZone(ExchangeSession.GMT_TIMEZONE); return formatter.format(calendar.getTime()); } public void testCreateFolder() throws IOException { resetTestFolder(); } public void testCreateMessage() throws IOException { resetTestFolder(); appendMessage(); } public void testSelectFolder() throws IOException { writeLine(". SELECT testfolder"); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); } public void testFetchFlags() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (FLAGS)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidSearchUnDeleted() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH UNDELETED"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); writeLine(". UID SEARCH NOT DELETED"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testUidSearchdeleted() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH DELETED"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testStoreUndelete() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID STORE 1 -FLAGS (\\Deleted)"); readFullAnswer("."); } public void testUidStoreDeletedFlag() throws IOException { // restore standard IMAP behaviour Settings.setProperty("davmail.imapAutoExpunge", "false"); resetTestFolder(); appendMessage(); // test deleted flag writeLine(". UID STORE " + messageUid + " +FLAGS (\\Deleted)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Deleted \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // remove deleted flag writeLine(". UID STORE " + messageUid + " -FLAGS (\\Deleted)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidRemoveSeenFlag() throws IOException { resetTestFolder(); appendMessage(); // remove seen flag writeLine(". UID STORE " + messageUid + " FLAGS (\\Draft)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidStoreForwardedFlag() throws IOException { resetTestFolder(); appendMessage(); // Get current flags writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // add forwarded flag writeLine(". UID STORE " + messageUid + " +FLAGS ($Forwarded)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft $Forwarded))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // remove forwarded flag writeLine(". UID STORE " + messageUid + " -FLAGS ($Forwarded)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidStoreAnsweredFlag() throws IOException { resetTestFolder(); appendMessage(); // add answered flag writeLine(". UID STORE " + messageUid + " +FLAGS (\\Answered)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft \\Answered))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // remove answered flag writeLine(". UID STORE " + messageUid + " -FLAGS (\\Answered)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidStoreJunkFlag() throws IOException { resetTestFolder(); appendMessage(); // add Junk flag writeLine(". UID STORE " + messageUid + " +FLAGS (Junk)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen Junk \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // remove Junk flag writeLine(". UID STORE " + messageUid + " -FLAGS (Junk)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidStoreSeenFlag() throws IOException { resetTestFolder(); appendMessage(); // add Seen flag writeLine(". UID STORE " + messageUid + " +FLAGS (\\Seen)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // remove Seen flag writeLine(". UID STORE " + messageUid + " -FLAGS (\\Seen)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidStoreStandardKeywordFlag() throws IOException { resetTestFolder(); appendMessage(); // add predefined keyword flag writeLine(". UID STORE " + messageUid + " +FLAGS ($label4)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft $label4))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // check server side categories ExchangeSession session = ExchangeSessionFactory.getInstance(username,password); ExchangeSession.Folder folder = session.getFolder("testfolder"); folder.loadMessages(); assertEquals("To Do", folder.get(0).keywords); // remove keyword flag writeLine(". UID STORE " + messageUid + " -FLAGS ($label4)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidStoreCustomKeywordFlags() throws IOException { resetTestFolder(); appendMessage(); // add custom keyword flag writeLine(". UID STORE " + messageUid + " +FLAGS (some_tag)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft some_tag))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // check server side categories ExchangeSession session = ExchangeSessionFactory.getInstance(username, password); ExchangeSession.Folder folder = session.getFolder("testfolder"); folder.loadMessages(); assertEquals("Some Category", folder.get(0).keywords); // remove keyword flag writeLine(". UID STORE " + messageUid + " -FLAGS (some_tag)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testUidStoreCaseInsensitiveKeywordFlags() throws IOException { resetTestFolder(); appendMessage(); // add predefined and custom keyword flags writeLine(". UID STORE " + messageUid + " +FLAGS ($LaBeL4 SoMe_TaG)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft $label4 some_tag))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); // remove keyword flags writeLine(". UID STORE " + messageUid + " -FLAGS (sOmE_tAg $lAbEl4)"); assertEquals(". OK STORE completed", readFullAnswer(".")); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testAppendWithKeywordFlags() throws IOException, MessagingException { resetTestFolder(); MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", "testto <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.addHeader("cc", "testcc <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.setText("Test message "); mimeMessage.setSubject("Test subject "); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); byte[] content = baos.toByteArray(); writeLine(". APPEND testfolder (\\Seen some_tag \\Draft $Label4) {" + content.length + '}'); assertEquals("+ send literal data", readLine()); writeLine(new String(content)); assertEquals(". OK APPEND completed", readFullAnswer(".")); writeLine(". NOOP"); assertEquals(". OK NOOP completed", readFullAnswer(".")); // fetch message uid writeLine(". UID FETCH 1:* (FLAGS)"); String messageLine = readLine(); int uidIndex = messageLine.indexOf("UID ") + 4; messageUid = messageLine.substring(uidIndex, messageLine.indexOf(' ', uidIndex)); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); assertNotNull(messageUid); writeLine(". UID FETCH " + messageUid + " (FLAGS)"); assertEquals("* 1 FETCH (UID " + messageUid + " FLAGS (\\Seen \\Draft $label4 some_tag))", readLine()); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testPartialFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH " + messageUid + " (BODY.PEEK[1.MIME])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testHeaderFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH " + messageUid + " (BODY[HEADER.FIELDS (DATE SUBJECT FROM CONTENT-TYPE TO CC BCC MESSAGE-ID IN-REPLY-TO REFERENCES)])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testHeaderBodyFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH " + messageUid + " (UID BODY.PEEK[HEADER.FIELDS (Content-Type Content-Transfer-Encoding)] BODY.PEEK[TEXT]<0.2048>)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testBodyFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH " + messageUid + " (UID BODY[])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testRfc822Fetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH " + messageUid + " (UID RFC822)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testFetchInternalDate() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH " + messageUid + " (INTERNALDATE)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testFetchEnvelope() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (ENVELOPE)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testFetchBodyStructure() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (BODYSTRUCTURE)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testFetchRfc822Header() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (UID RFC822.HEADER RFC822.SIZE FLAGS)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testThunderbirdHeaderFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (UID RFC822.SIZE FLAGS BODY.PEEK[HEADER.FIELDS (From To Cc Bcc Subject Date Message-ID Priority X-Priority References Newsgroups In-Reply-To Content-Type)])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testIcedoveHeaderFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (RFC822.SIZE RFC822.HEADER FLAGS)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testSearchHeader() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH HEADER X-TUID testvalue"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); writeLine(". UID SEARCH HEADER X-OfflineIMAP \"testvalue\""); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchUndraft() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH UNDRAFT"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); writeLine(". UID SEARCH DRAFT"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testConditionalSearch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH UNDELETED (OR (OR (OR FROM \"test\" OR TO \"test\" HEADER CC \"test\") SUBJECT test) BODY \"test\")"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testMultipleConditionSearch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH NOT (ANSWERED) NOT (DELETED) NOT (SEEN) NOT (KEYWORD spring-integration-mail-adapter) ALL"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchCharset() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH CHARSET UTF-8 (HEADER SUBJECT testé)"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchCharsetAscii() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH CHARSET us-ascii (HEADER SUBJECT test)"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testWanderLust() throws IOException { resetTestFolder(); appendMessage(); writeLine(". uid fetch 1:* (body.peek[header.fields (Subject From To Cc Date Message-Id References In-Reply-To Delivered-To)] rfc822.size flags)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testSearchSince() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH SINCE 1-Jan-2012 UNDELETED"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchSinceOn() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH OR SINCE 1-Jan-2012 ON 1-Jan-2012 ALL"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchText() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH TEXT test"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchKeyword() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH (KEYWORD to-encrypt) (NOT KEYWORD reencrypted) (NOT KEYWORD encrypted) (NOT KEYWORD reencrypt-skip) (NOT KEYWORD no-reencrypt) (NOT DELETED)"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchTo() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH TO testto"); assertEquals("* SEARCH 1", readLine()); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchCc() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH CC testcc"); assertEquals("* SEARCH 1", readLine()); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testSearchKeywords() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (FLAGS KEYWORD)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); writeLine(". UID SEARCH KEYWORD $label1"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } public void testDraftMessageMessageId() throws IOException, MessagingException { resetTestFolder(); appendMessage(); MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", "testto <" + Settings.getProperty("davmail.to") + ">"); mimeMessage.setText("Test message"); mimeMessage.setSubject("Test subject"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); byte[] content = baos.toByteArray(); writeLine(". APPEND testfolder (\\Seen \\Draft) {" + content.length + '}'); assertEquals("+ send literal data", readLine()); writeLine(new String(content)); assertEquals(". OK APPEND completed", readFullAnswer(".")); writeLine(". UID SEARCH UNDELETED (HEADER Message-ID " + mimeMessage.getMessageID().substring(1, mimeMessage.getMessageID().length() - 1) + ")"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); writeLine(". UID SEARCH (HEADER To " + Settings.getProperty("davmail.to") + ")"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); writeLine(". UID SEARCH (HEADER To testto)"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); //testDeleteFolder(); } public void testFetchOSX() throws IOException { resetTestFolder(); appendMessage(); writeLine(". FETCH 1:* (FLAGS UID BODY.PEEK[HEADER.FIELDS (content-class)])"); assertEquals(". OK FETCH completed", readFullAnswer(".")); } public void testFetchHeadersThunderbird() throws IOException { resetTestFolder(); appendMessage(); writeLine(". FETCH 1:* (UID RFC822.SIZE FLAGS BODY.PEEK[HEADER.FIELDS (From To Cc Bcc Subject Date Message-ID Priority X-Priority References Newsgroups In-Reply-To Content-Type)])"); assertEquals(". OK FETCH completed", readFullAnswer(".")); } public void testInvalidMime() throws MessagingException, IOException { resetTestFolder(); MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", Settings.getProperty("davmail.to")); mimeMessage.addHeader("bcc", Settings.getProperty("davmail.bcc")); mimeMessage.setText("test"); mimeMessage.setSubject("subject"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); byte[] content = baos.toByteArray(); String invalidMessageContent = "MAIL FROM: " + Settings.getProperty("davmail.bcc") + "\n" + "RCPT TO: " + Settings.getProperty("davmail.to") + "\n\n" + new String(content, StandardCharsets.UTF_8); mimeMessage = new MimeMessage(null, new SharedByteArrayInputStream(invalidMessageContent.getBytes(StandardCharsets.UTF_8))); baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); content = baos.toByteArray(); writeLine(". APPEND testfolder (\\Seen \\Draft) {" + content.length + '}'); assertEquals("+ send literal data", readLine()); writeLine(new String(content)); assertEquals(". OK APPEND completed", readFullAnswer(".")); writeLine(". NOOP"); assertEquals(". OK NOOP completed", readFullAnswer(".")); // fetch message uid writeLine(". UID FETCH 1:* (FLAGS BODYSTRUCTURE)"); String messageLine = readLine(); int uidIndex = messageLine.indexOf("UID ") + 4; messageUid = messageLine.substring(uidIndex, messageLine.indexOf(' ', uidIndex)); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); assertNotNull(messageUid); } public void testFetchHeadersSentThunderbird() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH (SINCE \"01-Jun-2012\")"); assertEquals(". OK SEARCH completed", readFullAnswer(".")); writeLine(". UID FETCH 6071:* (UID RFC822.SIZE FLAGS BODY.PEEK[HEADER.FIELDS (From To Cc Bcc Subject Date Message-ID Priority X-Priority References Newsgroups In-Reply-To Content-Type)])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testFetchHeadersInboxMutt() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH (SINCE \"" + getLastMonth() + "\")"); String messageLine = readLine(); int uidIndex = messageLine.indexOf(" ", "* SEARCH".length()) + 1; messageUid = messageLine.substring(uidIndex, Math.max(messageLine.length(), messageLine.indexOf(' ', uidIndex))); assertEquals(". OK SEARCH completed", readFullAnswer(".")); System.out.println(messageUid); writeLine(". UID FETCH " + messageUid + ":* (UID FLAGS INTERNALDATE RFC822.SIZE BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT TO CC MESSAGE-ID REFERENCES CONTENT-TYPE CONTENT-DESCRIPTION IN-REPLY-TO REPLY-TO LINES LIST-POST X-LABEL)])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testFetchHeadersInboxOSX() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH (SINCE \"" + getLastMonth() + "\")"); String messageLine = readLine(); int uidIndex = messageLine.indexOf(" ", "* SEARCH".length()) + 1; messageUid = messageLine.substring(uidIndex, Math.max(messageLine.length(), messageLine.indexOf(' ', uidIndex))); assertEquals(". OK SEARCH completed", readFullAnswer(".")); System.out.println(messageUid); writeLine(". UID FETCH " + messageUid + ":* (INTERNALDATE UID RFC822.SIZE FLAGS BODY.PEEK[HEADER.FIELDS (date subject from to cc message-id in-reply-to references x-priority x-uniform-type-identifier x-universally-unique-identifier received-spf x-spam-status x-spam-flag)])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testAnotherFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (BODY.PEEK [HEADER.FIELDS (References X-Ref X-Priority X-MSMail-Priority Importance X-MSOESRec Newsgroups)] ENVELOPE RFC822.SIZE UID FLAGS INTERNALDATE)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testDoubleHeaderFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* RFC822.HEADER"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testDoubleHeaderBodyFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 51241 BODY.PEEK[TEXT]"); String line = socketReader.readLine(); int size = 0; while (!line.startsWith(".")) { line = socketReader.readLine(); size += line.length() + 2; } System.out.println("actual size " + size); } public void testBodyHeaderFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* BODY[HEADER]"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testBodyTextFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (BODY[HEADER] BODY.PEEK[TEXT])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testBodyPartFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (RFC822.SIZE BODY[1])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testOutlookHeaderFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (UID FLAGS RFC822.SIZE BODY.PEEK[HEADER] INTERNALDATE)"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testFullHeaderFetch() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* RFC822.HEADER"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testCopyMessage() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (FLAGS)"); String messageLine = readLine(); int uidIndex = messageLine.indexOf("UID ") + 4; messageUid = messageLine.substring(uidIndex, messageLine.indexOf(' ', uidIndex)); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); writeLine(". UID COPY " + messageUid + " Trash"); assertEquals(". OK COPY completed", readFullAnswer(".")); writeLine(". COPY 1 Trash"); assertEquals(". OK COPY completed", readFullAnswer(".")); } public void testCopyMessageMissingFolder() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID FETCH 1:* (FLAGS)"); String messageLine = readLine(); int uidIndex = messageLine.indexOf("UID ") + 4; messageUid = messageLine.substring(uidIndex, messageLine.indexOf(' ', uidIndex)); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); writeLine(". UID COPY " + messageUid + " Missing"); assertEquals(". NO [TRYCREATE] Folder 'Missing' not found", readFullAnswer(".")); } public void testSearchNotUid() throws IOException { resetTestFolder(); appendMessage(); writeLine(". UID SEARCH NOT UID 1"); assertEquals("* SEARCH", readLine()); assertEquals(". OK SEARCH completed", readFullAnswer(".")); } } davmail-6.3.0/src/test/davmail/imap/TestImapErrorHandling.java0100644 0000000 0000000 00000010434 13576753242 023065 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.imap; import davmail.Settings; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Random; /** * IMAP error handling tests. */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestImapErrorHandling extends AbstractImapTestCase { public void testSelectInbox() throws IOException { writeLine(". SELECT INBOX"); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); } public void testCreateFolder() throws IOException { writeLine(". DELETE testfolder"); readFullAnswer("."); writeLine(". CREATE testfolder"); assertEquals(". OK folder created", readFullAnswer(".")); writeLine(". SELECT testfolder"); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); } /*public void testBrokenPipe() throws IOException, InterruptedException { testSelectInbox(); writeLine(". UID FETCH 1:* (RFC822.SIZE BODY.TEXT)"); socketReader.readLine(); // force close connection clientSocket.close(); Thread.sleep(5000); }*/ public void testFetchBigMessage() throws IOException, MessagingException { testCreateFolder(); // create 10MB message MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", Settings.getProperty("davmail.to")); mimeMessage.addHeader("bcc", Settings.getProperty("davmail.bcc")); Random random = new Random(); StringBuilder randomText = new StringBuilder(); for (int i = 0; i < 10 * 1024 * 1024; i++) { randomText.append((char) ('a' + random.nextInt(26))); } mimeMessage.setText(randomText.toString()); mimeMessage.setSubject("Big subject"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); mimeMessage.writeTo(baos); byte[] content = baos.toByteArray(); long start = System.currentTimeMillis(); writeLine(". APPEND testfolder (\\Seen \\Draft) {" + content.length + '}'); assertEquals("+ send literal data", readLine()); writeLine(new String(content)); assertEquals(". OK APPEND completed", readFullAnswer(".")); System.out.println("Create time: " + (System.currentTimeMillis() - start) + " ms"); writeLine(". NOOP"); assertEquals(". OK NOOP completed", readFullAnswer(".")); start = System.currentTimeMillis(); writeLine(". UID FETCH 1:* (RFC822.SIZE BODY.TEXT)"); readFullAnswer("."); System.out.println("Fetch time: " + (System.currentTimeMillis() - start) + " ms"); } /*public void testSelectInboxTimeout() throws IOException { writeLine(". SELECT INBOX"); // simulate client timeout try { Thread.sleep(5000); } catch (InterruptedException e) { // ignore } socketWriter.close(); //System.in.read(); }*/ public void test_ZZ_Logout() throws IOException { writeLine(". LOGOUT"); assertEquals("* BYE Closing connection", socketReader.readLine()); assertEquals(". OK LOGOUT completed", socketReader.readLine()); clientSocket = null; } } davmail-6.3.0/src/test/davmail/imap/TestImapFolders.java0100644 0000000 0000000 00000006102 13560360637 021715 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.imap; import javax.mail.MessagingException; import java.io.IOException; /** * Test folder requests. */ public class TestImapFolders extends AbstractImapTestCase { public void testListFolders() throws IOException { writeLine(". LSUB \"\" \"*\""); assertEquals(". OK LSUB completed", readFullAnswer(".")); } public void testListAllSubFolders() throws IOException { writeLine(". LIST \"\" \"%/%\""); assertEquals(". OK LIST completed", readFullAnswer(".")); } public void testListSubFolders() throws IOException { writeLine(". LIST \"\" \"INBOX*\""); assertEquals(". OK LIST completed", readFullAnswer(".")); } public void testSelectInbox() throws IOException { writeLine(". SELECT INBOX"); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); } public void testSelectRoot() throws IOException { writeLine(". SELECT \"\""); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); } public void testEwsPaging() throws IOException, MessagingException { resetTestFolder(); appendHundredMessages(); writeLine(". SELECT testfolder"); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); writeLine(". UID FETCH 1:* (BODY[HEADER.FIELDS (DATE SUBJECT MESSAGE-ID )])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } public void testListWildcard() throws IOException { writeLine(". LIST \"\" \"testfo%\""); assertEquals("* LIST (\\HasNoChildren) \"/\" \"testfolder\"", readLine()); assertEquals(". OK LIST completed", readFullAnswer(".")); } public void testListInboxDash() throws IOException { writeLine(". LIST \"\" \"%/%\""); assertEquals(". OK LIST completed", readFullAnswer(".")); writeLine(". SELECT \"Inbox-2019\""); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); } public void testListSpecialUse() throws IOException { writeLine(". LIST \"\" \"%\" RETURN (SPECIAL-USE)"); assertEquals(". OK LIST completed", readFullAnswer(".")); } } davmail-6.3.0/src/test/davmail/imap/TestImapFullSync.java0100644 0000000 0000000 00000002652 12564151512 022055 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2011 Mickael Guessant * * 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. */ package davmail.imap; import java.io.IOException; /** * Test IMAP full sync. */ public class TestImapFullSync extends AbstractImapTestCase { public void testSelectTrash() throws IOException { writeLine(". SELECT Trash"); assertEquals(". OK [READ-WRITE] SELECT completed", readFullAnswer(".")); writeLine(". UID FETCH 1:* (UID RFC822.SIZE FLAGS BODY.PEEK[HEADER.FIELDS (From To Cc Bcc Subject Date Message-ID Priority X-Priority References Newsgroups In-Reply-To Content-Type)])"); assertEquals(". OK UID FETCH completed", readFullAnswer(".")); } } davmail-6.3.0/src/test/davmail/imap/TestImapQuotedFolder.java0100644 0000000 0000000 00000003536 12564151512 022715 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2015 Mickael Guessant * * 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. */ package davmail.imap; import java.io.IOException; /** * Test folders with quotes. */ public class TestImapQuotedFolder extends AbstractImapTestCase { public void testListFolders() throws IOException { writeLine(". LIST \"\" \"%/%\""); assertEquals(". OK LIST completed", readFullAnswer(".")); } public void testCreateQuotedFolder() throws IOException { writeLine(". CREATE \"test \\\"quoted\\\" folder\""); assertEquals(". OK folder created", readFullAnswer(".")); } public void testListQuotedFolder() throws IOException { writeLine(". LIST \"test \\\"quoted\\\" folder\" \"\""); assertEquals("* LIST (\\HasNoChildren) \"/\" \"test \\\"quoted\\\" folder\"", readLine()); assertEquals(". OK LIST completed", readFullAnswer(".")); } public void testDeleteQuotedFolder() throws IOException { writeLine(". DELETE \"test \\\"quoted\\\" folder\""); assertEquals(". OK folder deleted", readFullAnswer(".")); } } davmail-6.3.0/src/test/davmail/imap/TestImapTokenizer.java0100644 0000000 0000000 00000010621 13576753242 022277 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2015 Mickael Guessant * * 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. */ package davmail.imap; import junit.framework.TestCase; /** * Test IMAPTokenizer */ public class TestImapTokenizer extends TestCase { public void testCreateFolder() { ImapConnection.ImapTokenizer imapTokenizer = new ImapConnection.ImapTokenizer(". CREATE testfolder"); assertEquals(".", imapTokenizer.nextQuotedToken()); assertEquals("CREATE", imapTokenizer.nextQuotedToken()); assertEquals("testfolder", imapTokenizer.nextQuotedToken()); assertFalse(imapTokenizer.hasMoreTokens()); } public void testStoreFlags() { ImapConnection.ImapTokenizer imapTokenizer = new ImapConnection.ImapTokenizer(". UID STORE 10 -FLAGS (\\Deleted)"); assertEquals(".", imapTokenizer.nextQuotedToken()); assertEquals("UID", imapTokenizer.nextQuotedToken()); assertEquals("STORE", imapTokenizer.nextQuotedToken()); assertEquals("10", imapTokenizer.nextQuotedToken()); assertEquals("-FLAGS", imapTokenizer.nextQuotedToken()); assertEquals("(\\Deleted)", imapTokenizer.nextQuotedToken()); assertFalse(imapTokenizer.hasMoreTokens()); } public void testSearchHeader() { ImapConnection.ImapTokenizer imapTokenizer = new ImapConnection.ImapTokenizer(". UID SEARCH HEADER X-OfflineIMAP \"testvalue\""); assertEquals(".", imapTokenizer.nextQuotedToken()); assertEquals("UID", imapTokenizer.nextQuotedToken()); assertEquals("SEARCH", imapTokenizer.nextQuotedToken()); assertEquals("HEADER", imapTokenizer.nextQuotedToken()); assertEquals("X-OfflineIMAP", imapTokenizer.nextQuotedToken()); assertEquals("\"testvalue\"", imapTokenizer.nextQuotedToken()); assertFalse(imapTokenizer.hasMoreTokens()); } public void testCreateQuotedFolder() { ImapConnection.ImapTokenizer imapTokenizer = new ImapConnection.ImapTokenizer(". CREATE \"test \\\"quoted\\\" folder\""); assertEquals(".", imapTokenizer.nextQuotedToken()); assertEquals("CREATE", imapTokenizer.nextQuotedToken()); assertEquals("\"test \\\"quoted\\\" folder\"", imapTokenizer.nextQuotedToken()); assertFalse(imapTokenizer.hasMoreTokens()); } public void testComplexSearch() { ImapConnection.ImapTokenizer imapTokenizer = new ImapConnection.ImapTokenizer(". UID SEARCH UNDELETED (OR (OR (OR FROM \"test\" OR TO \"test\" HEADER CC \"test\") SUBJECT test) BODY \"test\")"); assertEquals(".", imapTokenizer.nextQuotedToken()); assertEquals("UID", imapTokenizer.nextQuotedToken()); assertEquals("SEARCH", imapTokenizer.nextQuotedToken()); assertEquals("UNDELETED", imapTokenizer.nextQuotedToken()); assertEquals("(OR (OR (OR FROM \"test\" OR TO \"test\" HEADER CC \"test\") SUBJECT test) BODY \"test\")", imapTokenizer.nextQuotedToken()); assertFalse(imapTokenizer.hasMoreTokens()); } public void testAppend() { ImapConnection.ImapTokenizer imapTokenizer = new ImapConnection.ImapTokenizer("2 append \"INBOX\" (\\Seen) \"01-Mar-2015 20:43:04 +0100\" {4608}"); assertEquals("2", imapTokenizer.nextQuotedToken()); assertEquals("append", imapTokenizer.nextQuotedToken()); assertEquals("\"INBOX\"", imapTokenizer.nextQuotedToken()); assertEquals("(\\Seen)", imapTokenizer.nextQuotedToken()); assertEquals("\"01-Mar-2015 20:43:04 +0100\"", imapTokenizer.nextQuotedToken()); assertEquals("{4608}", imapTokenizer.nextQuotedToken()); assertFalse(imapTokenizer.hasMoreTokens()); } } davmail-6.3.0/src/test/davmail/ldap/TestLdap.java0100644 0000000 0000000 00000034572 13576355760 020406 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.ldap; import davmail.AbstractDavMailTestCase; import davmail.DavGateway; import davmail.Settings; import davmail.exchange.ExchangeSessionFactory; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.Rdn; import java.io.IOException; import java.util.Hashtable; /** * Test LDAP. */ public class TestLdap extends AbstractDavMailTestCase { InitialLdapContext ldapContext; @Override public void setUp() throws IOException { boolean needStart = !loaded; super.setUp(); if (needStart) { // start gateway DavGateway.start(); } if (ldapContext == null) { Hashtable env = new Hashtable<>(); //env.put("java.naming.security.authentication", "CRAM-MD5"); env.put("java.naming.security.authentication", "simple"); env.put("java.naming.security.principal", Settings.getProperty("davmail.username")); env.put("java.naming.security.credentials", Settings.getProperty("davmail.password")); env.put("com.sun.jndi.ldap.connect.pool", "true"); env.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); env.put("java.naming.provider.url", "ldap://127.0.0.1:" + Settings.getIntProperty("davmail.ldapPort")); env.put("java.naming.referral", "follow"); try { ldapContext = new InitialLdapContext(env, null); } catch (NamingException e) { throw new IOException(e); } } if (session == null) { session = ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.password")); } } public void testSearchOneLevel() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration searchResults = ldapContext.search("ou=people", "(objectclass=*)", searchControls); searchResults.close(); } public void testSearchMail() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"mail"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(objectclass=*)", searchControls); searchResults.close(); } public void testMozillaSearchAttributes() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"custom1", "mozillausehtmlmail", "postalcode", "custom2", "custom3", "custom4", "street", "surname", "telephonenumber", "mozillahomelocalityname", "orgunit", "mozillaworkstreet2", "xmozillanickname", "mozillahomestreet", "description", "cellphone", "homeurl", "mozillahomepostalcode", "departmentnumber", "postofficebox", "st", "objectclass", "sn", "ou", "fax", "mozillahomeurl", "mozillahomecountryname", "streetaddress", "cn", "company", "mozillaworkurl", "mobile", "region", "birthmonth", "birthday", "labeleduri", "carphone", "department", "xmozillausehtmlmail", "givenname", "nsaimid", "workurl", "facsimiletelephonenumber", "mozillanickname", "title", "nscpaimscreenname", "xmozillasecondemail", "mozillacustom3", "countryname", "mozillacustom4", "mozillacustom1", "mozillacustom2", "homephone", "mozillasecondemail", "pager", "zip", "mail", "c", "mozillahomestate", "o", "l", "birthyear", "modifytimestamp", "locality", "commonname", "notes", "pagerphone", "mozillahomestreet2"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(objectclass=*)", searchControls); searchResults.close(); } public void testGalfind() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration searchResults = ldapContext.search("ou=people", "(uid="+session.getAlias()+ ')', searchControls); assertTrue(searchResults.hasMore()); SearchResult searchResult = searchResults.next(); Attributes attributes = searchResult.getAttributes(); Attribute attribute = attributes.get("uid"); assertEquals(session.getAlias(), attribute.get()); // given name not available on Exchange 2007 over Dav (no gallookup) //assertNotNull(attributes.get("givenName")); searchResults.close(); } public void testOSXSearch() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"uid", "jpegphoto", "postalcode", "mail", "sn", "apple-emailcontacts", "c", "street", "givenname", "l", "apple-user-picture", "telephonenumber", "cn", "st", "apple-imhandle"}); NamingEnumeration searchResults = ldapContext.search("cn=users, o=od", "(&(objectclass=inetOrgPerson)(|(givenname=Test*)(|(uid=te*)(cn=te*))(sn=te*))(objectclass=shadowAccount)(objectclass=extensibleObject)(objectclass=posixAccount)(objectclass=apple-user))", searchControls); assertTrue(searchResults.hasMore()); searchResults.close(); } public void testOSXICalSearch() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"uid", "mail", "sn", "cn", "description", "apple-generateduid", "givenname", "apple-serviceslocator", "uidnumber"}); NamingEnumeration searchResults = ldapContext.search("cn=users, o=od", "(&(objectclass=inetOrgPerson)(objectclass=extensibleObject)(objectclass=apple-user)(|(|(uid=fair*)(cn=fair*))(givenname=fair*)(sn=fair*)(cn=fair*)(mail=fair*))(objectclass=posixAccount)(objectclass=shadowAccount))", searchControls); searchResults.close(); } public void testSearchByGivenNameWithoutReturningAttributes() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"uid"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(givenName=mic*)", searchControls); searchResults.close(); } public void testSearchByGalfindUnsupportedAttribute() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration searchResults = ldapContext.search("ou=people", "(postalcode=N18 1ZF)", searchControls); searchResults.close(); } public void testSearchByCnReturnSn() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"sn"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(cn=*)", searchControls); searchResults.close(); } public void testSearchByCnReturnGivenName() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"givenName"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(cn=*a*)", searchControls); searchResults.close(); } public void testSearchIPad() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"postalcode", "labeleduri", "street", "givenname", "telephonenumber", "facsimiletelephonenumber", "title", "imhandle", "homepostaladdress", "st", "homephone", "applefloor", "jpegphoto", "pager", "mail", "sn", "buildingname", "ou", "destinationindicator", "c", "o", "l", "co", "postaladdress", "cn", "mobile"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(|(mail=Test*)(cn=Test*)(givenname=Test*)(sn=Test*))", searchControls); searchResults.close(); } public void testThunderbird() throws NamingException { String filter = "(|(sn=*stocker*)(givenname=*stocker*)(mail=*stocker*)(cn=*stocker*))"; String[] returningAttributes = new String[]{"custom1", "mozillausehtmlmail", "postalcode", "custom2", "custom3", "custom4", "street", "surname", "telephonenumber", "mozillahomelocalityname", "orgunit", "mozillaworkstreet2", "xmozillanickname", "mozillahomestreet", "description", "cellphone", "homeurl", "mozillahomepostalcode", "departmentnumber", "postofficebox", "st", "objectclass", "sn", "ou", "fax", "mozillahomeurl", "mozillahomecountryname", "streetaddress", "cn", "company", "mozillaworkurl", "mobile", "region", "birthmonth", "birthday", "labeleduri", "carphone", "department", "xmozillausehtmlmail", "givenname", "nsaimid", "workurl", "facsimiletelephonenumber", "mozillanickname", "title", "nscpaimscreenname", "xmozillasecondemail", "mozillacustom3", "countryname", "mozillacustom4", "mozillacustom1", "mozillacustom2", "homephone", "mozillasecondemail", "pager", "zip", "mail", "c", "mozillahomestate", "o", "l", "birthyear", "modifytimestamp", "locality", "commonname", "notes", "pagerphone", "mozillahomestreet2"}; SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(returningAttributes); NamingEnumeration searchResults = ldapContext.search("ou=people", filter, searchControls); searchResults.close(); } public void testSearchNotFilter() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"mail"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(!(objectclass=test))", searchControls); searchResults.close(); } public void testEmailSearch() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"uid", "mail", "sn", "cn", "description", "apple-generateduid", "givenname", "apple-serviceslocator", "uidnumber"}); NamingEnumeration searchResults = ldapContext.search("cn=users, o=od", "(mail="+"CHARLEPG@intersmtp.com"+")", searchControls); searchResults.close(); } public void testIcalLionInitialSearch() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"gidnumber", "altsecurityidentities", "uid", "mail", "cn", "apple-generateduid", "givenname", "apple-serviceslocator", "objectclass", "uidnumber"}); NamingEnumeration searchResults = ldapContext.search("cn=users, ou=people", "(&(|(mail=702820784)(uid=702820784)(cn=702820784)(altsecurityidentities=702820784))(&(objectclass=extensibleObject)(objectclass=posixAccount)(objectclass=shadowAccount)(objectclass=inetOrgPerson)(objectclass=apple-user)))", searchControls); searchResults.close(); } public void testTBGalSearch() throws NamingException { SearchControls searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.ONELEVEL_SCOPE); searchControls.setReturningAttributes(new String[]{"mail", "cn"}); NamingEnumeration searchResults = ldapContext.search("ou=people", "(|(sn=mich*)(mail=mich*)(cn=mich*))", searchControls); searchResults.close(); } public void testLdapDnAuthentication() throws NamingException { String dn = new Rdn("uid", Settings.getProperty("davmail.username"))+",ou=people"; Hashtable env = new Hashtable<>(); //env.put("java.naming.security.authentication", "CRAM-MD5"); env.put("java.naming.security.authentication", "simple"); env.put("java.naming.security.principal", dn); env.put("java.naming.security.credentials", Settings.getProperty("davmail.password")); env.put("com.sun.jndi.ldap.connect.pool", "true"); env.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); env.put("java.naming.provider.url", "ldap://127.0.0.1:" + Settings.getIntProperty("davmail.ldapPort")); env.put("java.naming.referral", "follow"); new InitialLdapContext(env, null); } } davmail-6.3.0/src/test/davmail/smtp/TestSmtp.java0100644 0000000 0000000 00000027250 13576355760 020507 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.smtp; import davmail.AbstractDavMailTestCase; import davmail.DavGateway; import davmail.Settings; import davmail.exchange.DoubleDotOutputStream; import davmail.exchange.ExchangeSession; import davmail.exchange.ExchangeSessionFactory; import org.apache.commons.codec.binary.Base64; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.Socket; import java.nio.charset.StandardCharsets; /** * Test smtp send message. */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestSmtp extends AbstractDavMailTestCase { static Socket clientSocket; static BufferedOutputStream socketOutputStream; static BufferedInputStream socketInputStream; enum State { CHAR, CR, CRLF } protected void write(String line) throws IOException { socketOutputStream.write(line.getBytes(StandardCharsets.US_ASCII)); socketOutputStream.flush(); } protected void writeLine(String line) throws IOException { write(line); socketOutputStream.write(13); socketOutputStream.write(10); socketOutputStream.flush(); } protected String readLine() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); State state = State.CHAR; while (!(state == State.CRLF)) { int character = socketInputStream.read(); if (state == State.CHAR) { if (character == 13) { state = State.CR; } } else { if (character == 10) { state = State.CRLF; } else { state = State.CHAR; } } if (state == State.CHAR) { baos.write(character); } } return new String(baos.toByteArray(), StandardCharsets.US_ASCII); } @Override public void setUp() throws IOException { super.setUp(); if (clientSocket == null) { // start gateway DavGateway.start(); clientSocket = new Socket("localhost", Settings.getIntProperty("davmail.smtpPort")); socketOutputStream = new BufferedOutputStream(clientSocket.getOutputStream()); socketInputStream = new BufferedInputStream(clientSocket.getInputStream()); String banner = readLine(); assertNotNull(banner); //String credentials = (char) 0 + Settings.getProperty("davmail.username") + (char) 0 + Settings.getProperty("davmail.password"); String credentials = Settings.getProperty("davmail.username") + (char) 0 + Settings.getProperty("davmail.username") + (char) 0 + Settings.getProperty("davmail.password"); writeLine("AUTH PLAIN " + new String(new Base64().encode(credentials.getBytes()))); assertEquals("235 OK Authenticated", readLine()); } if (session == null) { session = ExchangeSessionFactory.getInstance(Settings.getProperty("davmail.username"), Settings.getProperty("davmail.password")); } } public void sendAndCheckMessage(MimeMessage mimeMessage) throws IOException, MessagingException, InterruptedException { sendAndCheckMessage(mimeMessage, null); } public void sendAndCheckMessage(MimeMessage mimeMessage, String bcc) throws IOException, MessagingException, InterruptedException { sendAndCheckMessage(mimeMessage, null, bcc); } public void sendAndCheckMessage(MimeMessage mimeMessage, String from, String bcc) throws IOException, MessagingException, InterruptedException { sendMessage(mimeMessage, from, bcc); assertEquals("250 Queued mail for delivery", readLine()); ExchangeSession.Message sentMessage = getSentMessage(mimeMessage.getMessageID()); assertEquals(mimeMessage.getDataHandler().getContent(), sentMessage.getMimeMessage().getDataHandler().getContent()); } private ExchangeSession.Message getSentMessage(String messageId) throws IOException, MessagingException, InterruptedException { // wait for asynchronous message send ExchangeSession.MessageList messages = null; for (int i = 0; i < 5; i++) { messages = session.searchMessages("Sent", session.headerIsEqualTo("references", messageId)); if (messages.size() > 0) { break; } Thread.sleep(1000); } assertEquals(1, messages.size()); ExchangeSession.Message sentMessage = messages.get(0); sentMessage.getMimeMessage().writeTo(System.out); return sentMessage; } public void sendMessage(MimeMessage mimeMessage) throws IOException, MessagingException { sendMessage(mimeMessage, null, null); } public void sendMessage(MimeMessage mimeMessage, String from, String bcc) throws IOException, MessagingException { // generate message id mimeMessage.saveChanges(); // mimeMessage.writeTo(System.out); // copy Message-id to references header mimeMessage.addHeader("references", mimeMessage.getHeader("message-id")[0]); if (from != null) { writeLine("MAIL FROM:" + from); } else { writeLine("MAIL FROM:" + session.getEmail()); } readLine(); if (bcc != null) { writeLine("RCPT TO:" + bcc); readLine(); } writeLine("RCPT TO:" + Settings.getProperty("davmail.to")); readLine(); writeLine("DATA"); assertEquals("354 Start mail input; end with .", readLine()); mimeMessage.writeTo(new DoubleDotOutputStream(socketOutputStream)); writeLine(""); writeLine("."); } public void testSendSimpleMessage() throws IOException, MessagingException, InterruptedException { String body = "Test message\r\n"; MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("From", session.getEmail()); mimeMessage.addHeader("To", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test subject"); mimeMessage.setText(body); sendAndCheckMessage(mimeMessage); } public void testInvalidFrom() throws IOException, MessagingException { String body = "Test message"; MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("From", "guessant@loca.net"); mimeMessage.addHeader("To", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test subject"); mimeMessage.setText(body); sendMessage(mimeMessage, "guessant@loca.net", null); assertEquals("451", readLine().substring(0, 3)); } public void testSendMessage() throws IOException, MessagingException, InterruptedException { String body = "Test message\r\n" + "Special characters: éèçà\r\n" + "Chinese: " + ((char) 0x604F) + ((char) 0x7D59); MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("To", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test subject"); mimeMessage.setText(body, "UTF-8"); sendAndCheckMessage(mimeMessage); } public void testBccMessage() throws IOException, MessagingException, InterruptedException { MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test subject dav"); mimeMessage.setText("Test message\r\n"); sendAndCheckMessage(mimeMessage, Settings.getProperty("davmail.bcc")); } public void testDotMessage() throws IOException, MessagingException, InterruptedException { String body = "First line\r\n.\r\nSecond line\r\n"; MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test subject"); mimeMessage.setText(body); sendAndCheckMessage(mimeMessage); } public void testSendMessageTwice() throws IOException, MessagingException, InterruptedException { Settings.setProperty("davmail.smtpCheckDuplicates", "true"); String body = "First line\r\n.\r\nSecond line\r\n"; MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("to", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test subject"); mimeMessage.setText(body); sendAndCheckMessage(mimeMessage); sendAndCheckMessage(mimeMessage); } public void testComplexToMessage() throws IOException, MessagingException, InterruptedException { String body = "Test message\r\n"; MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("To", "nickname <" + Settings.getProperty("davmail.to") + '>'); mimeMessage.setSubject("Test subject"); mimeMessage.setText(body); sendAndCheckMessage(mimeMessage); } public void testSendPlainTextMessage() throws IOException, MessagingException, InterruptedException { String body = "Test plain text message\r\n"; MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("To", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test text/plain message"); mimeMessage.setText(body); sendAndCheckMessage(mimeMessage); } public void testSendHtmlMessage() throws IOException, MessagingException, InterruptedException { String body = "Test html message red\r\n"; MimeMessage mimeMessage = new MimeMessage((Session) null); mimeMessage.addHeader("To", Settings.getProperty("davmail.to")); mimeMessage.setSubject("Test html message"); mimeMessage.setContent(body, "text/html"); sendMessage(mimeMessage); assertEquals("250 Queued mail for delivery", readLine()); ExchangeSession.Message sentMessage = getSentMessage(mimeMessage.getMessageID()); // Office 365 adds html prefix assertEquals(""+mimeMessage.getDataHandler().getContent(), sentMessage.getMimeMessage().getDataHandler().getContent()); } public void test_ZZ_Quit() throws IOException { writeLine("QUIT"); assertEquals("221 Closing connection", readLine()); } } davmail-6.3.0/src/test/davmail/ui/TestNotificationDialog.java0100644 0000000 0000000 00000003655 13645663667 022774 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.ui; import junit.framework.TestCase; import javax.swing.*; /** * Test Notification Frame */ public class TestNotificationDialog extends TestCase { public void testCreateNotificationFrame() throws ClassNotFoundException, UnsupportedLookAndFeelException, IllegalAccessException, InstantiationException { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); NotificationDialog notificationDialog = new NotificationDialog("to", "cc", "subject", "description"); notificationDialog.setVisible(true); System.out.println(notificationDialog.getSendNotification()); } public void testCreateNotificationFromEWSFrame() throws ClassNotFoundException, UnsupportedLookAndFeelException, IllegalAccessException, InstantiationException { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); NotificationDialog notificationDialog = new NotificationDialog("subject", "description"); notificationDialog.setVisible(true); System.out.println(notificationDialog.getSendNotification()); } } davmail-6.3.0/src/test/davmail/util/ClientCertificateTest.java0100644 0000000 0000000 00000033341 13645663670 023134 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.util; import davmail.Settings; import davmail.http.DavGatewaySSLProtocolSocketFactory; import davmail.http.DavGatewayX509TrustManager; import davmail.http.DavMailX509KeyManager; import davmail.http.SunPKCS11ProviderHandler; import davmail.ui.PasswordPromptDialog; import junit.framework.TestCase; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.URI; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.protocol.Protocol; import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.KeyStoreBuilderParameters; import javax.net.ssl.ManagerFactoryParameters; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509KeyManager; import javax.security.auth.callback.PasswordCallback; import java.io.File; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.Provider; import java.security.UnrecoverableKeyException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; //import javax.smartcardio.*; /** * Test HTTPS mutual authentication */ public class ClientCertificateTest extends TestCase { HttpClient httpClient; @Override public void setUp() throws IOException { if (httpClient == null) { System.setProperty("javax.net.ssl.trustStore", "cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStoreType", "JKS"); System.setProperty("javax.net.debug", "ssl,handshake"); httpClient = new HttpClient(); HostConfiguration hostConfig = httpClient.getHostConfiguration(); URI httpURI = new URI("https://localhost", true); hostConfig.setHost(httpURI); Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory) new DavGatewaySSLProtocolSocketFactory(), 443)); } } public void testGetRoot() throws IOException { GetMethod getMethod = new GetMethod("/"); httpClient.executeMethod(getMethod); } public void testConnect() throws IOException { GetMethod getMethod = new GetMethod("/testdir"); httpClient.executeMethod(getMethod); assertEquals(HttpStatus.SC_OK, getMethod.getStatusCode()); System.out.println(getMethod.getResponseBodyAsString()); } /* public void testCardReaders() throws CardException { for (CardTerminal terminal : TerminalFactory.getDefault().terminals().list()) { System.out.println("Card terminal: " + terminal.getName() + " " + (terminal.isCardPresent() ? "Card present" : "No card")); terminal.waitForCardPresent(10); if (terminal.isCardPresent()) { Card c = null; try { c = terminal.connect("T=0"); } catch (Exception e) { // failover c = terminal.connect("T=1"); } ATR atr = c.getATR(); byte[] bytes = atr.getBytes(); System.out.print("card:"); for (byte b : bytes) { System.out.print(" " + Integer.toHexString(b & 0xff)); } System.out.println(); } } } */ public void testWindowsSmartCard() { try { KeyStore ks = KeyStore.getInstance("Windows-MY"); ks.load(null, null); java.util.Enumeration en = ks.aliases(); while (en.hasMoreElements()) { String aliasKey = en.nextElement(); X509Certificate c = (X509Certificate) ks.getCertificate(aliasKey); System.out.println("---> alias : " + aliasKey + " " + c.getSubjectDN()); //PrivateKey key = (PrivateKey) ks.getKey(aliasKey, "Passw0rd".toCharArray()); Certificate[] chain = ks.getCertificateChain(aliasKey); System.out.println(Arrays.asList(chain)); } } catch (Exception ioe) { System.err.println(ioe.getMessage()); } } public void testClientSocket() throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, KeyManagementException, UnrecoverableKeyException, InstantiationException, ClassNotFoundException, IllegalAccessException { //System.setProperty("javax.net.ssl.trustStoreProvider", "SunMSCAPI"); //System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT"); System.setProperty("javax.net.ssl.trustStore", "cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStoreType", "JKS"); String algorithm = KeyManagerFactory.getDefaultAlgorithm(); if ("SunX509".equals(algorithm)) { algorithm = "NewSunX509"; } else if ("IbmX509".equals(algorithm)) { algorithm = "NewIbmX509"; } Provider sunMSCAPI = (Provider) Class.forName("sun.security.mscapi.SunMSCAPI").newInstance(); //Security.insertProviderAt(sunMSCAPI, 1); KeyStore keyStore = KeyStore.getInstance("Windows-MY",sunMSCAPI); keyStore.load(null, null); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm); keyManagerFactory.init(keyStore, null); // Get a list of key managers KeyManager[] keyManagers = keyManagerFactory.getKeyManagers(); // Walk through the key managers and replace all X509 Key Managers with // a specialized wrapped DavMail X509 Key Manager for (int i = 0; i < keyManagers.length; i++) { KeyManager keyManager = keyManagers[i]; if (keyManager instanceof X509KeyManager) { keyManagers[i] = new DavMailX509KeyManager((X509KeyManager) keyManager); } } SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyManagers, null, null); SSLSocketFactory sockFactory = sslContext.getSocketFactory(); SSLSocket sslSock = (SSLSocket)sockFactory.createSocket("localhost", 443); sslSock.startHandshake(); } private SSLContext createSSLContext() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, KeyManagementException, KeyStoreException, IOException, CertificateException, InstantiationException, ClassNotFoundException, IllegalAccessException { // PKCS11 client certificate settings String pkcs11Library = Settings.getProperty("davmail.ssl.pkcs11Library"); String clientKeystoreType = Settings.getProperty("davmail.ssl.clientKeystoreType"); // set default keystore type if (clientKeystoreType == null || clientKeystoreType.length() == 0) { clientKeystoreType = "PKCS11"; } if (pkcs11Library != null && pkcs11Library.length() > 0 && "PKCS11".equals(clientKeystoreType)) { StringBuilder pkcs11Buffer = new StringBuilder(); pkcs11Buffer.append("name=DavMail\n"); pkcs11Buffer.append("library=").append(pkcs11Library).append('\n'); String pkcs11Config = Settings.getProperty("davmail.ssl.pkcs11Config"); if (pkcs11Config != null && pkcs11Config.length() > 0) { pkcs11Buffer.append(pkcs11Config).append('\n'); } SunPKCS11ProviderHandler.registerProvider(pkcs11Buffer.toString()); } String algorithm = KeyManagerFactory.getDefaultAlgorithm(); if ("SunX509".equals(algorithm)) { algorithm = "NewSunX509"; } else if ("IbmX509".equals(algorithm)) { algorithm = "NewIbmX509"; } KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm); ArrayList keyStoreBuilders = new ArrayList<>(); // PKCS11 (smartcard) keystore with password callback KeyStore.Builder scBuilder = KeyStore.Builder.newInstance("PKCS11", null, getProtectionParameter(null)); System.out.println(scBuilder); //keyStoreBuilders.add(scBuilder); String clientKeystoreFile = Settings.getProperty("davmail.ssl.clientKeystoreFile"); String clientKeystorePass = Settings.getProperty("davmail.ssl.clientKeystorePass"); if (clientKeystoreFile != null && clientKeystoreFile.length() > 0 && ("PKCS12".equals(clientKeystoreType) || "JKS".equals(clientKeystoreType))) { // PKCS12 file based keystore KeyStore.Builder fsBuilder = KeyStore.Builder.newInstance(clientKeystoreType, null, new File(clientKeystoreFile), getProtectionParameter(clientKeystorePass)); keyStoreBuilders.add(fsBuilder); } System.setProperty("javax.net.debug", "ssl,handshake"); //try { //Provider sunMSCAPI = new sun.security.mscapi.SunMSCAPI(); Provider sunMSCAPI = (Provider) Class.forName("sun.security.mscapi.SunMSCAPI").newInstance(); //Security.insertProviderAt(sunMSCAPI, 1); KeyStore keyStore = KeyStore.getInstance("Windows-MY", sunMSCAPI); keyStore.load(null, null); keyStoreBuilders.add(KeyStore.Builder.newInstance(keyStore, new KeyStore.PasswordProtection(null))); /*} catch (IOException e) { e.printStackTrace(); } catch (CertificateException e) { e.printStackTrace(); }*/ ManagerFactoryParameters keyStoreBuilderParameters = new KeyStoreBuilderParameters(keyStoreBuilders); keyManagerFactory.init(keyStoreBuilderParameters); //keyManagerFactory.init(keyStore, null); // Get a list of key managers KeyManager[] keyManagers = keyManagerFactory.getKeyManagers(); // Walk through the key managers and replace all X509 Key Managers with // a specialized wrapped DavMail X509 Key Manager for (int i = 0; i < keyManagers.length; i++) { KeyManager keyManager = keyManagers[i]; if (keyManager instanceof X509KeyManager) { keyManagers[i] = new DavMailX509KeyManager((X509KeyManager) keyManager); } } //keyManagers = new KeyManager[]{new DavMailX509KeyManager(new X509KeyManagerImpl())} SSLContext context = SSLContext.getInstance("TLS"); context.init(keyManagers, new TrustManager[]{new DavGatewayX509TrustManager()}, null); return context; } protected KeyStore.ProtectionParameter getProtectionParameter(String password) { if (password != null && password.length() > 0) { // password provided: create a PasswordProtection return new KeyStore.PasswordProtection(password.toCharArray()); } else { // request password at runtime through a callback return new KeyStore.CallbackHandlerProtection(callbacks -> { if (callbacks.length > 0 && callbacks[0] instanceof PasswordCallback) { PasswordPromptDialog passwordPromptDialog = new PasswordPromptDialog(((PasswordCallback) callbacks[0]).getPrompt()); ((PasswordCallback) callbacks[0]).setPassword(passwordPromptDialog.getPassword()); } }); } } public void testClientSocketFactory() throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, KeyManagementException, InvalidAlgorithmParameterException, InstantiationException, ClassNotFoundException, IllegalAccessException { //System.setProperty("javax.net.ssl.trustStoreProvider", "SunMSCAPI"); //System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT"); System.setProperty("javax.net.ssl.trustStore", "cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStoreType", "JKS"); //SSLSocket sslSock = (SSLSocket)new DavGatewaySSLProtocolSocketFactory().createSocket("localhost", 443); SSLSocket sslSock = (SSLSocket) createSSLContext().getSocketFactory().createSocket("localhost", 443); sslSock.startHandshake(); } } davmail-6.3.0/src/test/davmail/util/ServerSocketRunner.java0100644 0000000 0000000 00000007753 13576355760 022535 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.util; import javax.net.ServerSocketFactory; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.TrustManagerFactory; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; /** * Create a server socket listener */ public class ServerSocketRunner { public static void main(String[] argv) throws NoSuchAlgorithmException, KeyManagementException, IOException, KeyStoreException, CertificateException, UnrecoverableKeyException { // SSL debug levels //System.setProperty("javax.net.debug", "ssl,handshake"); System.setProperty("javax.net.debug", "all"); // local truststore System.setProperty("javax.net.ssl.trustStore", "cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStoreType", "JKS"); // access windows client certificates //System.setProperty("javax.net.ssl.trustStoreProvider", "SunMSCAPI"); //System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT"); // load default trustmanager factory TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); System.out.println(trustManagerFactory.getProvider()); // load server keystore KeyStore keystore = KeyStore.getInstance("PKCS12"); try(FileInputStream keyStoreInputStream = new FileInputStream("davmail.p12")) { keystore.load(keyStoreInputStream, "password".toCharArray()); } // KeyManagerFactory to create key managers KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); // initialize KMF to work with keystore kmf.init(keystore, "password".toCharArray()); // SSLContext is environment for implementing JSSE... // create ServerSocketFactory SSLContext sslContext = SSLContext.getInstance("TLS"); // initialize sslContext to work with key managers and default trust manager sslContext.init(kmf.getKeyManagers(), null, null); // create ServerSocketFactory from sslContext ServerSocketFactory serverSocketFactory = sslContext.getServerSocketFactory(); SSLServerSocket serverSocket = (SSLServerSocket) serverSocketFactory.createServerSocket(443); serverSocket.setNeedClientAuth(true); int count = 100; while (count-- > 0) { SSLSocket socket = (SSLSocket) serverSocket.accept(); SSLSession session = socket.getSession(); System.out.println("SubjectDN " + ((X509Certificate) session.getPeerCertificates()[0]).getSubjectDN()); } } } davmail-6.3.0/src/test/davmail/util/StringEncryptorTest.java0100644 0000000 0000000 00000002701 13543217170 022706 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2010 Mickael Guessant * * 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. */ package davmail.util; import junit.framework.TestCase; import java.io.IOException; public class StringEncryptorTest extends TestCase { public void testEncrypt() throws IOException { String password = "P@ssw0rd"; String value = "MyVeryLongToken"; StringEncryptor encryptor = new StringEncryptor(password); String encrypted = encryptor.encryptString(value); System.out.println("Encrypted: "+encrypted); encryptor = new StringEncryptor(password); String decrypted = encryptor.decryptString(encrypted); assertEquals(decrypted, value); } } davmail-6.3.0/src/test/davmail/util/StringUtilTest.java0100644 0000000 0000000 00000013420 14754153500 021637 0ustar000000000 0000000 /* * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway * Copyright (C) 2009 Mickael Guessant * * 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. */ package davmail.util; import davmail.http.URIUtil; import junit.framework.TestCase; import java.text.ParseException; import static org.junit.Assert.assertThrows; /** * Test StringUtil. */ public class StringUtilTest extends TestCase { /** * Test get token */ public void testGetToken() { assertNull(StringUtil.getToken(null, null, null)); assertNull(StringUtil.getToken(null, "'", "'")); assertNull(StringUtil.getToken("'test", "'", "'")); assertEquals("test", StringUtil.getToken("'test'", "'", "'")); assertEquals("test", StringUtil.getToken("value=\"test\"", "value=\"", "\"")); } /** * Test replace token */ public void testReplaceToken() { assertNull(StringUtil.replaceToken(null, null, null, null)); assertNull(StringUtil.replaceToken(null, null, null, "new")); assertEquals("'new'", StringUtil.replaceToken("'old'", "'", "'", "new")); assertEquals("value=\"new\"", StringUtil.replaceToken("value=\"old\"", "value=\"", "\"", "new")); } /** * Test Xml Encode */ public void testXmlEncode() { assertEquals("&", StringUtil.xmlEncode("&")); assertEquals("<", StringUtil.xmlEncode("<")); assertEquals(">", StringUtil.xmlEncode(">")); assertEquals("&", StringUtil.xmlDecode("&")); assertEquals("<", StringUtil.xmlDecode("<")); assertEquals(">", StringUtil.xmlDecode(">")); assertEquals("<test>", StringUtil.xmlEncode("")); } public void testPerf() { String value = "dqsdqs+dsqds+dsqdqs"; for (int j = 0; j < 5; j++) { long startTime = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { //String result = StringUtil.encodePlusSign(value); //String result = value.replaceAll("\\+", "%2B"); int length = value.length(); @SuppressWarnings("MismatchedQueryAndUpdateOfStringBuilder") StringBuilder buffer = new StringBuilder(length); /*int startIndex = 0; int endIndex = value.indexOf('+'); while (endIndex >= 0) { buffer.append(value.substring(startIndex, endIndex)); buffer.append("%2B"); startIndex = endIndex + 1; endIndex = value.indexOf('+', startIndex); } buffer.append(value.substring(startIndex));*/ for (int k = 0; k < length; k++) { char c = value.charAt(k); if (c == '+') { buffer.append("%2B"); } else { buffer.append(c); } } //String result = buffer.toString(); //String result = value.replaceAll("\\+", "%2B"); } System.out.println("Elapsed: " + (System.currentTimeMillis() - startTime) + " ms"); } } public void testParseQuotedImapString() throws ParseException { assertEquals("", StringUtil.parseQuotedImapString("\"\"")); assertEquals("*", StringUtil.parseQuotedImapString("\"*\"")); assertThrows(ParseException.class, () -> StringUtil.parseQuotedImapString("")); assertThrows(ParseException.class, () -> StringUtil.parseQuotedImapString("test")); assertEquals("test", StringUtil.parseQuotedImapString("\"test\"")); assertThrows(ParseException.class, () -> StringUtil.parseQuotedImapString("\"test")); assertThrows(ParseException.class, () -> StringUtil.parseQuotedImapString("test\"")); assertThrows(ParseException.class, () -> StringUtil.parseQuotedImapString("\"\\test\"")); assertThrows(ParseException.class, () -> StringUtil.parseQuotedImapString("\"test\\\"")); assertEquals("foo\\bar", StringUtil.parseQuotedImapString("\"foo\\\\bar\"")); assertEquals("\\bar", StringUtil.parseQuotedImapString("\"\\\\bar\"")); assertEquals("foo\\", StringUtil.parseQuotedImapString("\"foo\\\\\"")); assertEquals("\\", StringUtil.parseQuotedImapString("\"\\\\\"")); } public void testRemoveQuotes() { assertEquals("test", StringUtil.removeQuotes("test")); assertEquals("test", StringUtil.removeQuotes("\"test\"")); } public void testEncodePipe() { assertEquals("test %7C", StringUtil.encodeUrlcompname("test |")); assertEquals("test |", StringUtil.decodeUrlcompname("test %7C")); } public void testEncodeQuestion() { URIUtil.encodeWithinQuery("test ?"); assertEquals("test %3F", StringUtil.encodeUrlcompname("test ?")); assertEquals("test ?", StringUtil.decodeUrlcompname("test %3F")); } public void testEncodeUrlCompname() { assertEquals("test %7E", StringUtil.encodeUrlcompname("test ~")); assertEquals("test ~", StringUtil.decodeUrlcompname("test %7E")); } }