pax_global_header00006660000000000000000000000064146546722170014530gustar00rootroot0000000000000052 comment=325c52fd23e99ba3b9795341f927516a5be83a2f PhotoCollage-1.4.8/000077500000000000000000000000001465467221700141225ustar00rootroot00000000000000PhotoCollage-1.4.8/.github/000077500000000000000000000000001465467221700154625ustar00rootroot00000000000000PhotoCollage-1.4.8/.github/workflows/000077500000000000000000000000001465467221700175175ustar00rootroot00000000000000PhotoCollage-1.4.8/.github/workflows/tests.yaml000066400000000000000000000006431465467221700215500ustar00rootroot00000000000000--- name: Tests on: push: pull_request: branches: - master permissions: contents: read jobs: lint: name: Tests runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 - run: pip install flake8 flake8-import-order - run: flake8 . - run: python -m unittest discover tests PhotoCollage-1.4.8/.gitignore000066400000000000000000000000351465467221700161100ustar00rootroot00000000000000*.py[co] MANIFEST dist build PhotoCollage-1.4.8/LICENSE000066400000000000000000000431521465467221700151340ustar00rootroot00000000000000GNU 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. {description} Copyright (C) {year} {fullname} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public 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. {signature of Ty Coon}, 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. PhotoCollage-1.4.8/MANIFEST.in000066400000000000000000000004111465467221700156540ustar00rootroot00000000000000include LICENSE README.rst include bin/photocollage recursive-include photocollage *.py include data/photocollage.desktop include data/photocollage.appdata.xml recursive-include data/icons/hicolor * include po/POTFILES.in recursive-include po *.po include setup.py PhotoCollage-1.4.8/README.rst000066400000000000000000000052221465467221700156120ustar00rootroot00000000000000PhotoCollage ============ .. image:: https://travis-ci.org/adrienverge/PhotoCollage.svg?branch=master :target: https://travis-ci.org/adrienverge/PhotoCollage :alt: CI tests status *Graphical tool to make photo collage posters* PhotoCollage allows you to create photo collage posters. It assembles the input photographs it is given to generate a big poster. Photos are automatically arranged to fill the whole poster, then you can change the final layout, dimensions, border or swap photos in the generated grid. Eventually the final poster image can be saved in any size. The algorithm generates random layouts that place photos while taking advantage of all free space. It tries to fill all space while keeping each photo as large as possible. PhotoCollage does more or less the same as many commercial websites do, but for free and with open-source code. .. image:: screenshots/photocollage-1.4-preview.png :alt: screenshot It provides a library to create photo layouts and posters, and a GTK graphical user interface. PhotoCollage is written in Python (compatible with versions 2 and 3) and requires the Python Imaging Library (PIL). Features: * generate random new layouts until one suits the user * choose border color and width * possible to swap photos in the generated grid * save high-resolution image * works even with a large number of photos (> 100) * integrates into the GNOME environment * available in English, French, German, Czech, Italian, Bulgarian, Dutch, Russian, Spanish, Polish and Ukrainian Installation ------------ * Fedora 19+: .. code:: bash sudo dnf install photocollage * Debian 9+ / Ubuntu 16.10+: .. code:: bash sudo apt-get install photocollage * Using pip, the Python package manager: .. code:: bash sudo pip3 install photocollage Usage ----- After install a launcher for PhotoCollage will appear in your desktop menu. If it doesn't, just run the command: .. code:: bash photocollage Hacking ------- * If you changed the source and want to test your modifications, run: .. code:: bash PYTHONPATH=. bin/photocollage or: .. code:: bash python3 -c 'from photocollage import gtkgui; gtkgui.main()' * If you need to build a package from source and install it: .. code:: bash # Install dependencies sudo dnf install python3-pillow python3-gobject sudo apt-get install python3-pil python3-gi sudo pacman -S python-pillow python-gobject # Install PhotoCollage python3 setup.py sdist pip3 install --user --upgrade dist/photocollage-*.tar.gz * If you wish to contribute, please lint your code and pass tests: .. code:: bash flake8 . python3 -m unittest tests/test_*.py PhotoCollage-1.4.8/bin/000077500000000000000000000000001465467221700146725ustar00rootroot00000000000000PhotoCollage-1.4.8/bin/photocollage000077500000000000000000000016441465467221700173050ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2013 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import signal from photocollage import gtkgui if __name__ == '__main__': signal.signal(signal.SIGINT, signal.SIG_DFL) gtkgui.main() PhotoCollage-1.4.8/data/000077500000000000000000000000001465467221700150335ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/000077500000000000000000000000001465467221700161465ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/Makefile000066400000000000000000000014601465467221700176070ustar00rootroot00000000000000# Original workspace files in the 'src' dir (not in the git repo) # Inkscape fails to convert SVG to small PNG (it omits parts of the image). # For this reason, we create a big PNG, then convert it to smaller ones. SRC = hicolor/scalable/apps/photocollage.svg BIG = hicolor/256x256/apps/photocollage.png SMALL := $(shell for s in 16 22 24 32 48 64 128; do \ echo hicolor/$${s}x$${s}/apps/photocollage.png; done) all: $(BIG) $(SMALL) $(BIG): $(SRC) $(eval SIZE := $(shell echo $@ | cut -d/ -f2)) @echo " SVG -> PNG $(SIZE)" @mkdir -p $(shell dirname $@) @inkscape -z -e $@ -w 256 -h 256 $< >/dev/null $(SMALL): $(BIG) $(eval SIZE := $(shell echo $@ | cut -d/ -f2)) @echo " PNG -> PNG $(SIZE)" @mkdir -p $(shell dirname $@) @convert $< -resize $(SIZE) $@ .PHONY: clean clean: rm -f $(BIG) $(SMALL) PhotoCollage-1.4.8/data/icons/hicolor/000077500000000000000000000000001465467221700176055ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/128x128/000077500000000000000000000000001465467221700205425ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/128x128/apps/000077500000000000000000000000001465467221700215055ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/128x128/apps/photocollage.png000066400000000000000000000340511465467221700246760ustar00rootroot00000000000000PNG  IHDR>agAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(x6IDATxy-u;Uw̛yq[")ڒHlˊXr,0A8(0,Dil$REQg83͛7o~w륪G}է9u:U%a%4[o@]R"Y"~8/:WZ, < >"/jV~ѕ'>J u ƠÀk<7>7>>yO ǖ{E.4c?SgɥP"x7%R` V6,[߿5"p\&0'֠6>3?h}#lgۋh A,S { w8xo 1>Rpi|RerO劇J{~} ;G<]<(<@ J{zT\*0۩`DeO5m^xy{ 4ZNK|8+#Aȅ}h03n=۝;֖QJM^*K4E cYv)El=F *(44BÑ,4;uR7N뷱2&8Dp#I҃`toK04DaPsf7,$@RN03{6RpKq`Dh@tŷڜo.M0$<`FRܯ*H"s)bGc8&0q;qBtq6Qؤ (n9.FEZ`q(@CH[P橄ӔIuԸ#` GϸƔU}6!K9Ƥam<_eVDqgA]Qt-Ɣ+$L {Ag .ϴr'!ȼ樀QB3\WJvzoQU,yzҧ<, Al@&|Il&>igq6<#,#1 E2l:$TIl `Elǻ", "с30XDYAA E$<%Y3m0aIR*g#j xkI=OQ2?<\" ʠ%\ǹDi.&wUtƷKq=a :GvʙjYsЌ pHNa5A)\X$hDSl6e]xKCiZo16 i[Q(+xĦNTf.{*i u6% 搃)=>R r$Ok^&"IDR&lQ_~+eR eihXne3e [N% U@34#7rkWpCUtPPZflҙzTQ?u!6l\9e+gsu`eT"b)\vjsGF$@}*/~3J4ll| U^DL]xdkL(SxR"*AЦ2MKY7v .D\J4P 0Ϟn 804y?M[~0k=~&IK&=5P82-=1 fdl )FPZn=uɟt`İ@tvٽ"_qjFō|^j ʤ0|Ƴ_]n2OxRQ֊.ſ,W_bg_RQPHR?qg\həd !F6@w5Upr&^@uTh:pBJ-ϓ}Dfq!?scDzKnW)PG"n{8/t*"9cYqѿGlf|Z4rGf@;;KŢb:׻qn/]ҵQpn#1)UdDxӢI_ʾ=8Zra 0 1A˜Ϗa`kRRզYJ?;/3P;RxP9'H[J+$N>q w,+a9*:zۇ?"!xm |b_ϰ2m:)t ̜ ms B"Bo`ɐ024[!ZD98e0HqIyz08+ N~.?A*9X8Oc풼1YVR]N`9[ thslxGx$ ZE344WB$ )Ib˭4$J[.!]cPRqo%"،ыw+qyȬ%0vFrquV+-go8O #*o ^3b\(<{B0dgvliP UE 9Wr}G5o2b?e`; К+-\Yn9wu=!n`H ͐v3sK͈0 <cotHH{~s㡇Dv7F;*hE\nDb1nȵ]v{Rl"xJ;a0[66j`bfPuR4oBȰXh0`fܽ="2][$q?!gDafwAAN3$9hse~]oC~"|G]h_~^(ESEj,4#N3lfqiEf ѤJ(ahA/Rlm4'I%t1<3+x8ePwm/O9+ojm/~E᧾b-$aT$L0^BWu'hXA͙ S|M:꽓3YDMlc?W[:d?trQ(^xig4tӣ'̙ϱA e@`蠼#wLQ3Ay|KmOgx@wo5 W g &!d 0mGFraKL&^]z^v:ҧ_)>{%NOF lrZ[D̶ITn9i%ߊ}PAhSV3JqOnaek(R ℐYl{J^|[qV,{ U!{Zx c{Z7hM~f@k5ޓ96n[;t` C,/jnLH()SF]:VS'޹JkAd0}ȁL{LPaBra ݯ/<|O=8]~>O_yaEn|_gw]&J[,. aC \?p8I2$Ycbd 8EFs(j1Qy6_+юuUIi$JG0gKxbڵ7,Aloҽs|( mh!q2["I }~٫Q4XsF0&{FhDD46a0 Jw8HɌF+}UWU }u.^V4@(]lfIS;rG. *Un`)#Ş~\oD8`+e.*uyY fĮFLPʓA:Iߡ|eN;@jƫŝe.fODyݍ͍2, i߱ 뢼C'p)Rs9K`^djkXam5dY^ p1DIn;~wnqgg<B#DaHrZ~\j1d{;cu5$ al 2hYl+ K4(U1մ㵂ɊE? =囼lH26b~zo|y=hWBw@cj&'5+o_>SMg p3reH?z+6h &0y\9 (ol#k _H#r4"Ch7Ȳ Iu-w:;͝ApZvSp>@IfJ㏮rcEL#ݏG9_-W^ WGA^|?>?yWl!Ũ^X[ǧ >2hy8gطsalRﱮ#$B 1hBg{h4ÏhaJ^IҘaC&ܸɲEns*e{ަ -d{PL)|,xɗ}ہTN& ?&v)*LON3aYc--l߶'xèdpνk1_?U:R90ms|qu/ O>_0AŸT<sY/O^G\Z0RuȸXAaIn2AjӇ. O&U\:aԒ rۚV!b$TrpipsT;_BԌh%'i %%&PD0B.#oΒ x<ѻ< 2Ha3y`3^Lu> w^;z9=*#4(` je0%i`D4!a#\EL2"{/! Pv27Փ; \i:gu/zgw7|( 6yfxvhX@+5a#'zn_oVoL 2:.oΠaO䯞w.%0:_b}. 4}߰ 9ԥJymdPNJ Fi 9g}BK4b]vw A]l1oKķ hҍҮq8q\>h/{D{Li/6oYK$\EEHH+fc<3.cok^WXo#I! C1h8ƻ|\~L2 YS## ƛ*Z#YYv77vv:lnΝ[ti#O&6 | 7n__ |;{c/jRH2BTbȪUxZoC*gDhW, ^{yn߼FY1 T$2uI~>q1{HVlMS߸7W'ۮ<ʥsh4\] 4LtY\+YxJoD(e&:v+)Q9S蠔me&h"*s&>W F>2`wO)lQ?Ϛ"Iyf$y1SN09*|CkZ=pl`-6PVԍ):i  :P\GR S)au@.[‰)@R$5JhRk2#[ȓ9Ds'9sD` DMQkp~E(؇͠L?+x*`ъaXԴiJ$?hTV I~/d? +l"Gb  jњ{_̴5QJGv%(疅VCpjvR.r66GW DA<<6f2pc3fx?ZI#UA~bBy1:{tf$Pc%,TȞ ,4 ГRhHQ0Qp"1a.(֖lnw,/a0T9{< "fȠ:ltg &ɟB@ ^:ǥ1*N,[oDZsz/ {JѶu Š>s. I:J~ɍVCrx_V,/vTxynu+#Yp%2d0VqYK=D<}K* ?z҂/COhAI3 zKwh9z~n 0@FOA;7#޳XQↈO(g/O߈I@qR5Hkw$-Ԕ,Qxw"TVőaH፻4A3ڒx͡tVtyp g7 ޒGl.f*1O32|5bPd@})"RҡAucol-@4olTT4>:G[^}R{Z1Ȟmq9e%%C?Sqrʩ_t@tJM:{=[H6r{lrG'(]@8z'3 ٸ!K'fC|~OͺU/oprJpy{2;ȏf\g>AwTjpOùS@O> Z@W[:vyL2 +WM~h{uLȜf*3XBwOy8ټ'ekαen%f̍ F^&=9XL]?U,$5䓣T-:AH&w/|~8>qX|azoF917q"8AlIRGy#I'd7q>W ̗{G8t3~Ef=qlRM_I OOP/~{h*δ'}^N܌'qbmׁgy{'g 0>S@c?C_?Y~T?qƌ%tEXtdate:create2014-03-05T13:56:33-05:00Ȝ%tEXtdate:modify2014-03-05T13:56:33-05:00p tEXtSoftwarewww.inkscape.org<IENDB`PhotoCollage-1.4.8/data/icons/hicolor/16x16/000077500000000000000000000000001465467221700203725ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/16x16/apps/000077500000000000000000000000001465467221700213355ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/16x16/apps/photocollage.png000066400000000000000000000026561465467221700245340ustar00rootroot00000000000000PNG  IHDR(-SgAMA asRGB cHRMz&u0`:pQ<PLTEMJ= p09 k-8 g+7 c)}6 _'y4 \%v3 X#r2 T!n0 Pj/ Lg. Hc- D_+ A\* =V% =}D66yC9 N@ e*7@9a'5A8^&}4?7[$z3 : 5W"w2 z9 z2T!t1 v7 v1Qp/s8r0Nl. n6m.Kj- g3 i,Hf, b1e+Dc+ ^0c+A`* Y-^)>[( Z';T#_. V%9՜A֜@ל@םA֛A֜AםBwCsE&tE%xDW[[YQBXsLtJqJrL\gJɰOγTЮXP`doЈs~?ϵKϵMêMN[8-f_aZueVy,20.yEj+8?":]5(LNSQcD,n4B!A E"gF5}˚oR:a6{E#zD"I$dM:psT:UxwxZ`kpidC(Yփ|~OdpnWpL JYq#v{ӿuywN,8;>TZJ\`M_c?@ABCDEFGHIJKLMNOPQRSTUVWXUYZ[\]^|kOpr%tEXtdate:create2014-03-05T13:56:33-05:00Ȝ%tEXtdate:modify2014-03-05T13:56:33-05:00p tEXtSoftwarewww.inkscape.org<IENDB`PhotoCollage-1.4.8/data/icons/hicolor/22x22/000077500000000000000000000000001465467221700203645ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/22x22/apps/000077500000000000000000000000001465467221700213275ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/22x22/apps/photocollage.png000066400000000000000000000025671465467221700245270ustar00rootroot00000000000000PNG  IHDRĴl;gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(xGIDAT8}[Tu?9g{5dwedVJݐ^詠נ $B@LDQkֽM23;3θWѽ ~m^@𙠸ڋt \#C߽XRX[߃kHE4u.5t'@V8c>nOm@!D^9;#DV4Z(rEvUgX^T p0X6KS PXy+IE{ӿ$ A mljb -h'U#4h:9-Rq`>ooOJɖdx% P828AZK)* ԑpW|Pd]{TvݘVUk:Umu}w ;FU9 40%tEXtdate:create2014-03-05T13:56:33-05:00Ȝ%tEXtdate:modify2014-03-05T13:56:33-05:00p tEXtSoftwarewww.inkscape.org<IENDB`PhotoCollage-1.4.8/data/icons/hicolor/24x24/000077500000000000000000000000001465467221700203705ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/24x24/apps/000077500000000000000000000000001465467221700213335ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/24x24/apps/photocollage.png000066400000000000000000000030301465467221700245150ustar00rootroot00000000000000PNG  IHDRw=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(xIDATH}K]YM4c7ݢ_Bz sg=hZp@Dā!FE;i&it*UscʽUp8k-yN>#_uΤLp`=bamms߾2?DɈLrsuzTEP1tyn;׶[gy$UV{͢5ASU3v8(KQyHP?mZ(A̝_o65FB^(?|mF~0)AU&<0:-]al ΨnG#b}g>s=Z\ʇX7@#Cg#R2BPl nKC z4^OlKT@=dAUc=d@ʍ׿{.sksIj@% ۂp X P@s5- h?1"QN/Xnm7O6\c$B QMBe IQy#K se%uxs(3/ўT:LlQU0FDp-8Ii({T pHuԜyX.24bK)v=asc9EZO8,c U6>rdРx*yヌ3BQllnb%*=4xi?'$+޼rWYsl7g8,pCd ›6'Q-!:dm+'~%=6]l:ex~۪qt!<Ռɳmhkyx'> &UV636ZFꩥ5Dσ߹pD C$*W!]!\{wpCfO^O Q`'2UAIu>,M)"S4'p WIȷo)*g:r_P!ty/=ԗ#mQ3aċt$`3ƎZR'"+Ͽ`^bs \P<"H dQĨ1,79im҃``DA J /,[Aē/;`X1BP*U$ +7òpf>zB YO)r^Bwn4A[ʋ%tEXtdate:create2014-03-05T13:56:33-05:00Ȝ%tEXtdate:modify2014-03-05T13:56:33-05:00p tEXtSoftwarewww.inkscape.org<IENDB`PhotoCollage-1.4.8/data/icons/hicolor/256x256/000077500000000000000000000000001465467221700205465ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/256x256/apps/000077500000000000000000000000001465467221700215115ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/256x256/apps/photocollage.png000066400000000000000000001016561465467221700247100ustar00rootroot00000000000000PNG  IHDR\rfsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxwm]ᤛ˩_uBBHdl̈@Ɩax16a1D2 @(VկsI;U9瞻I7[ڵ_*VuwgQ@^wpp"hGpd nxx^|5πov]u=}yxx^0mKYJΗ-`Yw;" BHBۼ2/<ӏ]ڥ?Ȳ1j*<C(@< XM[%2VFwpB#?)c!mq(mu(o\|"?m_??t0*8 2z8NLXEh wT;H4#>v,B)͈oIAHҠ*T7l\[fk|O\??`faYxx^Cু|;vڷ>c@X͂>0 ս}Fc܌-@)V ED!DuEue._g酋LYe:jҍ>|aP y1 7p$RWDbj(\ImaTFD֒0յ Օ56.zfsz^2q7vf<)-l< zidqS~BjY݋nw e!zuiۃ襀(UWy8̑nцYh&B UNL0 Y8;gX%PU;1Zl" l ba[J~!Mzh#KC.Hilԃ m;N%B%Oi<̀v[Rf+6hQg}z%p@v C!Vׄ^Ӷ"w➑*`@ Vr/BpjGfz>C( U%#NNX:b/΃hzm?  f CxW4zbWn'{uSysS*'8>3 ŶpʭK0Afgr `8c\^YV5(‘U\jP5+(׷4a2[8$`7'`^)vD F ؑ{h؃_&@5xy*蔧E*Z8l+F=GUAGh՗8]uSiXJ0hLў[0M#`i= *.nVAۙf79?{[p3ȳCU)N"nniv\oZcR:7d4C{0ڣ2뱽²$V&P!i:E4/o UL5yvy{g lx(6vf܅eva9XvE>X.ǁO'W4 ea w U:dt1|yKkOPY΂j^Fʭ(Eu"&7975TS}fM4~1ـ} 1ؖKt1 /CB Sm[ QUx=_# )4/opjl\)Jf ˈFLhh`, ۖX+L(Z#U@ݷi 8i Bq47񸾹DŽ~n}DG "v V2(MDE%[*Da>Q6q *3zZ0Ԝ̍(uH= pN{t=?F w>P;KKS BkB6{(ˁ0~p,UB8@װPAš *ge+E:(E΄D RGh ]nacз)%-ykW6K0" "bfFUifR~}-'/: (tb *q[H66Q}́it>1tHn*p =^ш׷7yaUeuFc*z`KI+"rjAHz)c4rGt"mR@)Y fd~?-%;n/teY+|ifchVcnwvZ\4z}s@i8y, ^x ٬5%`0'`'E98la$&5ضރBFc珟ffZh(W%KѴG3fZyX֊e cǑV) 2̐˻\x 0eJ_o#c$ո=B[]8gPVsţ~31Mr20CmUJ u&ԫ`9%f&cs)^xj(F9Mkݤio;[,+>/p5[[׍ /r5k+B Mrţ&%'-R#4x%\=嚬AYu'zm)3DPS IahZipFDʃP۱):Nh*[B?w-pH`mNH)t__;K . ֨VXwߏ6ZE9dw0hí `8 2öEfG~g?E~b'Nμ}C1$7#WW(: ;h?U, F5l+ {GVj7q 1 4Ä&yx7zy|=bma€7~Ʊ$N`K<2e6_o&?>UC~)m͍u]W`9%,;gFgPHeb4N!<*CC]j&":DE>;Fv3 ~9KE^R 3@t+y`>4e 3u_~B ƻlg`p `4Wf,߹@!mllaV+W:'j>i݉8IF_6ҸF:;'ڀ{i!DnUW[\0؟5co:!S{h% ԫ2sן}RO8*2֣jbFZKI+rhPa>z=F:El{ '?[[̅q2S_m =«.:kzNjҹFJ/'`b]zismrW't/ݫǸz KڼOrk߲/eGQ(F)ղ0Fk&~mL#R@LU40+6eDGGBZ_"bGJp|]KI~ DBNMIV*gs )fut߰Xb Bk*h={WڕSIz[SR($\|ؖY1jwoBN $ ](oosMZ[}|bǏ BA );KjirF$mrIPÎekTϰ1BƹL$k6*L*H0nUjZX} }[Cj- C Ϻu)0vKĘʪDs-hq8{t,BE>QJ\IV7O If aNK|.4ەVm]+1UYiw9=H }UVHϹ4Z=&z"Î|_Ž若9fB Tc>~ PoSlbޢZK䈭MrZAgcE2cN4iyFChB3 q=fgÎ[W,v%G20@;RZ/-v]'/oeho\c5,3CWA_IV׹l-k2TyZBjcZDwH-Z6(F6n$hk:;Lf$h̥ Oֻ?.dR|>$怩㗄?Q[  ѡ6Bt!>J? y: u{dY@rk ( o.nK8=)@JѸn!!0рV3M;JNh}{]BӁPCSu{ϭBCO9g;\{D9G4;AĵqKfJB` 8Fndʥf{@Kϳ$4#M;a;İc&{ARhpR[̮Dv"E+!(\ ?o_'`jZ[ɻĎMV"qLaF%x D#|!!- "d1XRW<\fsc?o~+7]B&!DЭ/$@pH7=>*ZK.BʶtmwVI!o_ISh%vsqx )֔UMm|?DafԼ9g?%F=ÒAlKb!O-^KRǓD)bH!`jns7+3KlOݼVw@̚JG|ÿůC|uW,7y3p;zI%G];~;j" ;IR!b[MI-gv,]f@o@ ]-J17}1c}sbI{-0!RBiV>x_,|3뀊@#kU!^.LQxsżQIGU RJhg~ry5E`lxaOu6A>ӭ15\eI^'HyxσB^H@HwŽ)@q:O_7^"^5)ǩ>H^њ3\5#>ʺM!Iq0$C?j@vHJQ? IDATOYLճӍ:Cɨ( #A|/IgrI4jFm>tcSW_\D&Q'CP?O}O~䅽\^O_ẅK,Xt.1ܵ6!D4vZŧ^ @Gx:Q4y`0H> C!:nڏ/}\Xǚ_uB-$MqTdI@YH3I@Bi&Y6 h6hXKہ !v,b_,bb4ՊǍ+Խ AH!5\'qDorwԇCE{[@4TRA DFafa矼PͫD 9ZeN26V2سp FՄk?-5l9{ɉpP*hhbƵ56*loVhF"t68r[+(8ْ;*^f;B#]|xgߺ~sNIl.jr}>fh6B@yFe <7OyZ*QA(uBN; {\=EG~Ëĭt^35쪓Tky(6@29@oKoa 3?=3slWVˬ hHb$$JZ4|{ ]ccd $%@C-=>| Sv" xb`Fk-Bţ8D ō:u0^rYIj^z"PHeX8 Rbާ%$ +r\r!{%d c z؟`ngt~|TνnǍ0Ӂ;pH*b?k`UyAl192USBnWY#ZB^ui@lxUe[W,soQK|Nɡ /^+xhFL{+ |zI 8L[ :@tFe$@N\qOTaYdDSh8۵rm(-N80(^I QϐkEИED>6F@d5!g ʹxY,T!-So8_ ?b*ۍrӂbKю4- юU;h~uH70AY7'4NK`iע|x}zlFx.Yl#ɨ m9 44y3XJM)d&]p~27WV(# P0>͞n~Wy$OVR;BwriRŊv$3lgRKl 83&WV&2J/nz|s&]/~K72%0=fj>WqskFĠUPp'B ˆ TOoq\N1(&לGˀ){=J?_gG,2KY0ft{h)sPbԏ2!0C$Z iQߥ4GjP~TtF*I@$`%-[~%7RI{1J`1SRͦ`irQײoqnX@%\jHഭ*xyۘ> 8GЗRcy;]$ɇh|HN6 Qj`&5_ֲE0#fJ‰ &JEc7_\r8BFXB# W%ߦGq7rݏpfh8CKu̒Ñ\s)g g<h gHKKǏ$vhʆ60dmT-r-^ya+@cq1$)+Ko$*غg&35:g%,ŖWʚ[ڲ#Ep2qEA*o,䱭lV7458;n"7k5ͦ>7s ;a '`|Ў?8NiЍD 0a'VqR7ڐ6߇JK˜>>TB!\h)My!zHSgܹ7HˬkK!v5W67 c`&fv bak^PO; VL^t,PWƃ^8,SG21k5HH|fY3+ʪWC֊U %8Fl'\ Jn=H!% %H#Zo=&P$a> !(# Y$¯D' H)FX ,& "qtriP,#MH)"eYl*E9TT"E%".nYX8%7Ǚ!7 6NVb 8D {u[ hH hXѱo d$FiJwە[Jpn~.1Yc`#ˑI<ÉB>SEgo0Q"I$RZ(PʼV1KB7i:0Di͹QrFZX(E޶[r6WkQ uQ ȮO~D\ݰl A'Si(WkRJ.nqᥫXBpv~SS.]Œ#333_Br [^4`9,nL\_/s O|G_M Dy>=wx@0EхK,nWߝYazfPQ y#wBa#C՘G%'`+wX"h1ԛG*Fx_vusSh2?R`U? SK_x}ԂzR#WcqTEEc|bzya&z#S/{O#S}G4HQ#ǒ]cV?pk[F-)9w$Tb)z[[ʴ[\~a`$6k`LzIm.DKS vTQ9c[6cfq߱)|s+x~WƏ49ĸ8WG`s졢˒ܬ>ğ]x_ZX*dugR|צz~_^[F0 _aT#J(=)"A\߇ 9 v]M1 d!( A9!4y*;ՠ_<ί}x33S9*D{frg{08%g.x$֔C${ϫsKWͧ.t!aA6 DlΪ3sTH)P-_Ȁ7FҰg'=351t{kfbiTrƥ`ʏ𽐵ljcG(_T4O'5)\195LODG|ia><6IVqGQ :ҐP7i|hs U'`} ~ۣ ݱ)j^@󹶲vss%枅i, .-Q |YuP^kˋcG',ל獯:cYͅR1e:㋗Wx5ַ,/j, 3 WR:H^8'`KIct۞ ?.l`[/-8Xn,5w㮒\ $[U˒\O'+0V, "Rbrbɹq\$. xsw_FRR]R @c3hGṈF2TPv{nt x?XPҩBFO٘`얍I0sml¶$("%A(Bq%,nlģOsvȹ>*} o.,FJA- )KWkaC7\|>E& wsuF"lVY ɜTȄ,nTXެYY1[5?ROqmc#WrW]g).)ɺ' ӎ;,z. ӈ1C'3.dshxy-.O!vȹ\ǢD[>/379Ta.=RX:s;_??oXxʙs $_llVDc[pm?^ ){>A B^X2#e=u.LqnaIg"Q "xy?ISc9LíЩoㄬ0Į7r@V[k1h! z{Yb\H@dꯙk a~1dhżX1o\!c3_>WÏA!\uG7oSWKkeNND*sfXmKƋy2SB|G JEBb&礏nBb۶96!qR!O КS,UkKy^}qp"c|76+x.γYyi923D)ZL9&*$6M,@SBAS@}qRX.k=xqIAts\TzXHM P0wt'2:o4L;h5غ9[DR~ǣ=:~E`ɦ o ĊBa0Vp;VCט݁:X,tssm,)x_%\[擏> Z3+X”S/s"o> ~g̕;rEYPiX "n,JN3ݢ~}/ƞ{l\kUvB0{ջhoas$%(Tgc#,Ei#^# 9bű-sqk[,f%2KSH '+$VsU⥫7s ÈϿ &ezK|~kNkҰ9M9&9T_!>W@!1].O,m[!HCG3`LPa4Wx^Ŧ85m| 0@Hk' A&7\t(^ lj6VZRM,s?up9 ³e?-G?m?? 3s&'(ކSCi.?DʻlG!eQ Pp,zb{grF;lV W&E{yFn,nWѶuld~;ob{:_fezg(֑3OMйwB -?p[BY'y.]GSX5l^,t 7md IDATU۝8 C[ u&D 5hn;xJia[.w;TB ryljjN8.RlMgckie Ils R+HLDϽm K`Y2) 5X~~ g0rlT7vTcBR/MAUv02(*VzvԷwxJSˌ'߻ؖP1_QAȖ\oWibsq!+}Hj&̧R`g88RAq|Pkl)cvVѠYԏ~;"P{ bqv9_eѭSR0s΁FTRA-Ӓ@iR')ym& #0}–"m|6aP*b.TsٰnSzh{ Oij @H9beRz>U/&GAXEC-iůģ-c!`I0YBDnEB-L*A!=&]Mvܭ>00uÏ'`'> \7c*>ϋJ6"19 Ʈ7 B3>ҮqFNH!˨߉~zv_q~~}kK]wm#m{g>BJI h]"SGz3Ikzf&+WT#גߟsN\%>;PJYnl 4sZwҝE37WptY_?@?&+I;ۋo,YøkHA [;a˄ݏؗ("{_ص_i]Hi' u^h1*>zwsp}6`7M l0q$%K| #mi~vFw'uw 8 Hà밍f}weP ^FC]o`O+0qQN׾j4h٣rK]|+oV`ss59^IBsJ._1d;@')`/BI/iH';zL5ήC)iiF!to?}{`>8"X)0ZB~~k ``]#p\b/y`A!z =>w͒D{FaT] utB6LK{=`4xB;GGӼYqY\jH K$oq& Md~т=CM>\->CSAln_-6y~srD˻%0-V[12MEX,]^N[u~_ '97;?U׻ys3`(A2%Z(Y!]9!:dk]˖XyWMKJ2ѢLIPK>fsϻ>*sȪwLtuUfVVvWwKtcj9jo@%R͌` /^2%οr}h痰 vFs=9) `M촣5+.n+k_ǟ=D LI6H@V;t0G8 vߵgך+l6.Sk^כy>N_B"EHCA=v {9K:;l]=})R*ܩs}o /J)67|rʟqr v2Rxȥ2YxDbARtłı-phxEI܌8!9w̪߇.gk G@a'O9}e}C=ل"/?g{Idu6Qvk|!™P]CP^CX>'}/7=Eeu{4V/pu-ڛl/St$Xk|KRrmMKGk6[$b25/@!tFGNiO SsF\Ƀ?`E>l~y)U7{31M T E mYTS" +5SlǶ(86 *Kk\d|ܦR,pz"Q{)\D)3D )aѴRv ,^^a:h"RonIbeq.Z@f PN/K2i[j/ ë$=l6hHa\ PԚ͎P¬uJDsgIA`St@ oض[c8ti!@JbNʁ#LO^feH٢ZZ>K~v5ŕ+M$OHbf[/Dd!?@'OxjPXeF 9s ˖=VZ}|}P|42BVlފuB2J]?J"˩?d)`iEcSP)ٔc%ЈԛUMz#oswXZ]aeYs4ibuRMltf<} " VW|nqiGs%iӝZ鞯<>VPKLf8Z' y`$~M=NK+&T"j\Zlk aI;X\uPlVM̔B)ϳR-^>{?[5ʥCEs!Ս?n֪A,Fe|f KY,lUuf1> 噌iyM4jtpd `Nw.c7]#~;WPpB-*3?m^Un(͘ nH&*P*)u-uVjgvڦV_òLϵ:S%ϏQZTQsqXhx~:wd]=t8XQh4%AH& 3zJfo"o,S`vE545wEiܖ)J@H[)V$-5+ 1Jh A}G[ٷ(;Lm\_+ - ǒׅ+.ooG&8+5Vl DeqŹsU,T8zcKf&t)$\#pyJy׮HV֪@i ZMelmblH ZHP,aF|;P˥DhDF2"gD"]:o}tוi=F<;久 Ah:<@2 & SQx.F+d!FhhhM}SŊD$}LaH ƦyK/2?^Ʋ|j5ASLMH*ezӥ`;LNhZMeël^:]e|_srG-i2-DЬ+[to4rFH}+O`QjVߵо-RBB&@!MEo6?ug|M>gt|)&.Z*(12MNtýQH 7}(O{CX>x>6usR)C'')%7)tWԛ>BN?ſE>Zbi\׭#+MN/$/̔XpÙ76i6bpz}3Ew_\cbfcɓ<_3VXYo17]d}E#x¶AJA@K "B AJ@? nLH t[S=b\+~>w^/>YfZ3֪eaz ΢,$<Ѫy0FBH#8!`y-(:̴ͱ&&,lK0;]uBf*.pm]dTlmrt~+7h>O33W`iQ39aqT5*XA`{B54hEJErYZt﮲QX$z|zb[O,؏տ!}zLӎ%ɷahl'MROXLM8lIx-ZlX/P),6(XS9Kg.o?1M5soq-nT@)i4\&XXlmZ N,\|+e5C$K:'6h5KU%MieUv泱sr\8^"3E>^Ae~_>G4`Q#K~d*v,B1D0%(5J~^㋟[K_s=?9;50; 1z- 8]`pU0t i bb̡P j hlN0VYX^m2=YZwi|.-6xzE ޼zO|qO3WW9qbY6M)e80ZXa~f?-2ljUƆW\Zf|\rP_?"?Y4 Vl ofå\rIrpwQpJ:<*oLX]mqi*%X8Nۑn((^L̥wHCƠF`gJ1ːpP'`oa|1ׁb#oorpFgyc\RBTgbҵ*R ^<5[hϟdW[\^^7q Edee91¾2i4 KժV6YZj:36ӓK E8$i6|>ߢ^=2*|XZyS>Z~ű#̶CZf$+_Ղz㓿z=zrk50ulᶗ (hF u2 RBp֚q'_Xdr-7 %`vipZ/%Z5JMP-J;rRJFƩ5ɱ&-oi[ _qCl'O+*ٿ77u=p]B7*%V O\I#s 34\q>9&|D_\og;ō>O̐g"+qY%AQ{Y~a;YUo 6yFB5ө6B@Jó\pXyuopk++G(J<<瘟)bY.J7|דZbeec5JqNQa~Nb٭8Ak-ZqHfir, 24MNAbgjd83O5OR [ ٥ķD0k>oSFS{4\ S[;mxNm8='f@hh/6Y\^, p"ҋ7xUk87ց%\Ht?ީ4q^U˒2=C_`c:-s$A* {8M:W׷A嵵 ?ȐRrq`r # Mřx& g?;Cd׍k:_euu,U|Uׂz76):tJyY/@=t- zR$a+u ޮb&02nYq&12H4}8˛5x֍6!B5syTJ6#*Nz XUkJ|WUter=L >k×.ոtQB[u#vc X@}~&<{`z2㍾lDz}m"SюН[Cx4~1B>7^[I⣾~'E79E86{; iSmU95!a v_׍A4<~r3g29|h@']P/=[._>'嗉̍ΖJtkDJsMʰP˔ډ+˜_XQ_ { 4yD8RJ>(bOzau_qdq?`tW8 4ݏb[6Z{mϘ|X]LGC|xex#BK?1<5iV,2:iGƏpPʘeu FH`0ŐWEU#qALmI Ķ$4s=\jL&NQN45j*3|N3ffETrqScKtJlU7PZ!iJ{lUt53?q7bSpj1@GK柱k+~X0?+Aab!x#DZK!T!~0 (27%с!k'ޕoS`$_s }/t~yq-Gml poX^g/]]3g\o[ݸpuwy@qؐ|Oa#XZ&MĘD+7) sFL9Yk ސ.yǣB#Ajڲ`<׾'J}7=s9KĄztd}}6;HѷԴ'ҼiӚ3gN+\|ǽ6'<Ϲ~vhXU_BbƲi)!EA1 2A.As1oi~4++sS ++[i~F~M *v~@!22`ሦ0aO{J˛ N@>PJAiidQ1;j  6=6?Ube~'@3v]Wlh6AO׊kbl,Xw?1}E 3d'OG@i0VWl%h[#IoҦ4Ѵin6O;-M%UE%ﯾ>?$2WV|S01rܼM ){[;F]1QBR;;춠 !bs\(A"$&f)'at|8ף5tւV˼}[Ef) S뿩9x>!XZ1L3R` 0V1Wg߄/BWVșΑl.t$Ɂ4B9v )Fd`m~iDl:j4O%sw9ڵcz ^4 !dMeV+qTR\o6@g_ݬ`#-'.2mO@R3k tki>[zK0azhm?":q=?cA!#v_iہu_ Tz*#wk;vb.d(2Z)]@`7t!7I)D\ 9NwKhEm xs-z>u#]^-O>Tf?lu䳉ɿ^E =p7XhQ_&H !]PӾCqT#N96F=(t#M`olT͑ROkCxI*GI{a@kXt:&KRN5}eD ;$@Һ}n/5/ H`[!ȍT' `vۇ@?z(mE[C݂;/zkS>y _2BrABMGkrqN  nU68X[e7 ~x b |O :g:ֱڄfǡ|q7X6)ptu$o'Өb44[rоmń!K;H7 ~yRH 'u޻AI/?A (VPD偯@$ |?Iܝp$/%Â-˚Rsc;Z(Y#Ei ]#$ Ÿ$;S@DI!ǵh@@T~^iA7=(Ez\V\r嚎#q'pQ&r  iNU } ɜG,cnH \ 5 ab@ RlX,:b[ׄ:@eJoF3GM/~N S>dyٓ4eMЁy#9ET2Ibrbw1rN-q,xhVBYA-ǣ{X*c,-ryz$ oAӖ?i?2D#J"A nffrDPZRsNgr/"0O8:q}#NGiq)fm iL* |ۦO $jqE.^^VL$S,M|h${(Rv 3 {n υ''8?a> y| A:ӑY^ْc1#[CXs'5LIڶ|j68ll*KQ* !ɋ"%y"G+GhL@ϝ̹?>~8핎~̧][IȐ?Їt<" ;hGx7֖yŧ9KxyY$+d >W{Op(ږz_hRƽFTEBqk# [*W.ū/>ŷ쬤CTF^K0A3z mwA\FiͱÇ{=X(-A W=_h4rp8x+S,q/#dzgrRtq?%r}Ow~嗁/S.Ï~=7]m'6fdt `-o,g_Ztٗu.,ZiTOtvB+q\&v傓MATOQhATr٪n3O3OswHxZ׸=_g¾wZbY¬7N˓s'/1IϢު@piLウcY(ixtgU4\tjWr$[RrXXK|/XZR0&o¬Vc f-xu0 nM Eh<7^LomGi~ rN f OϤ=.&:5it(}C=H{:;3 ʶ%H(נJܠʇfG=˺H#+d/JD*jaAt StdY!r:0<Hӝc ?ϙ Blϕ.Gc^Ph|%;Ҩyl,%k 5)L@^lGXOw"}*::=$fdj'2=IdB\*lQ/~HEf\xM>ZTKRPl[W--_Kヌ1(PHq6;4f1e+--3dBt߮'PO/؂g̨1RLiLrn ٍ u!>ᬻI+b%=+ ؉΋|X5))IM 2=%qxZ)i_MEVt$$|xNBait0-+LO fյi\7[]ZP $mFBRo #AYXvo)sL6)V2!" Q+O6DDn!s-Iq?O7, #Alۙ ʒefvvmʂ uYTܔh^ˤH'^b$LA_Z2>%QF5.PN $ /X?i6 "I|8t85g, {.i#($, M Dr;eX1e*vDͷ"lnR03Ѿ,+X]BS&ZuӱJܢ) `@98VBfެ#(/4Z5Xv"[1$V0fFkҀuPkG*y|τU&EhT;\e&3G@bP² aY4;kχsG{Q 9 2ӲƞO- 3mQRЉϜyU_@ESB(m"P{:R_!N!+إYbGCZ%˩`'њ ):}dlLWB䁍n.EF 4 t XA2ضIa0=5,u;v/a/oiKFrB `!DEhuid+4 0HF̀BZ:31"&BKyf;/-t^& !vāNm"~(&B˂mʲm <#:]+Y( .&+ -p2P,tr-Oc:\Z*% H Y;$3ly>ei3x#20R m*C*"D0Bvj6 QXAN&g l5L{cׇ5*F#>gB_|feQa@Ee;vrGӔ&5_(9 jX^8jMc*p;<fa|i?3kyI; L=PBjODF{_,`Cl0k#qg4g^}?p&hOE ,@&(tf2BWv Ÿh@ +h//á}-h&dj\/:N:3v+'^^dV:3m6{7|Tٸ9R+ed-f6 }@si,@jWo %Pv@eCtsM&!D!DdLtX\I[/ vH^B73!B+&$07-]#uhۑ6cx,ȕ4[WZR~M6I53PƢGKx B7 퐆-B 8uXV[;2$m:\CkDT$Bߖ/hz~vJ:oze@1MzCWzCS)S$q9 VOyQBg~>AW*PQ.B   'h -IP,œf j*Q()h4RJ`sK[ԚKkH1yFV.5dGaK88+تkP7<(5M#$R=wHp$玺g`Zf Hqh0+G-on `1%3}X\Ycy*bpt~:i lTˏ747w\#@Nҏ>K WbkpZnKBI~}|@$y_BۻcZGAAQb|\DիQչ|: 39tHKo|ZۗoЊIf)}>VjG-̂-V7CӦ7:=O/8Jx^*Aw,(8pz-˷%1p>x9m߱v4(mc@d07̒`:]#|1 \tW-q;8v!PauXYYԛ٪F ?4;)WO<-yf%9?-XZ Fxg'Dcvc^@@`ۂ1Ԅ|Oi"7kj|Y=-J"ڈQ$GAd9p1z&@?kRP)R̀^h !8qjeI&+k\_\sy=PMEZ 9Sk]RQPkycO[w0Vvʹ n0=W,6^ /]WL-8$SSS4R7e6l) :Iq?y;ԙ> f}mJ,y!9  S}ゥU͡}K7 .^ff43!,75SUy⚢2Bh[Pkh{}1^Pb۱; 19&2¿%RwJlA͛TԫGҼ>QHi;C>I9T, `"r=YXTiȞ m"=fVewiQtזK3cewYlT5%o^9q4~_) J3EEz:&@t@gWcFe ̚cjeΦ3E6+2o#= j|Y7Li_ORGm ҧ-b~mSW[ -xTZ9k`i]c'miJ17_/wJ[llifU sO)8kpn1{0y讂r  `P;j;;/aF.m'﷝){s6n?:26l΃to")Lٳ{<ʼwu떼*VDn~BНlWSN 8˷MKϔkt${2Ha;)H@rM'l|؎gސB[N&ܣ1~.F"_^Q]P0yz;NE ۹r+Gv=&4yA('Y*s/CtD}kHG7FӃ{~Fz(ݖ8 $5 DnUlh%%aNGv6~yb^B[Gz3 4EX_Q]&,Ѥ6@Mt!`7IG[٨1WFU,hqIDATjCNց_Q]& EOH ڛz>v`ipΨk̟ [!Y4;}|Uu+#Cd$¶%Rζ^ CU2YALfڶbv^I%44q=Ei4}Po,;sۨ`N#S(H,_`+.KmmIg +~) Tzm2p=Bu[+v@ <]a'OͦlHBKF?B ;) g@Ž74nN5_oT`RP G} |St}ׁ_ 8ı%%ىWHV:j31 DR FʄA O Fxe4-u~jg/wI)(l  2;X2P >Vp 2C {)l&;̾<ӆگ?kłEh#-c+@}菛D7ٸ]e["zFӧe~VgG1xP+u i _ J IENDB`PhotoCollage-1.4.8/data/icons/hicolor/32x32/000077500000000000000000000000001465467221700203665ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/32x32/apps/000077500000000000000000000000001465467221700213315ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/32x32/apps/photocollage.png000066400000000000000000000043111465467221700245160ustar00rootroot00000000000000PNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(xIDATXí[dUϥ骾Ow3= ˓hhP/j'_}P^QHM2&(̀ Cߪ.ꜳt]^]O׿GG8wv3ӷt|"N /57U~9_ 7px|ؤQ5zzF<N N9S<|>;]LPgU^[&[p,xF1"0́B#utfgk,ibyfrgqR[2g/LDP-.r-gS&FAƷv$9մF,kmj0(afrXmH n) WFap_Ь>qx14-lI V)tO@ϸ|qǽ'( PHYgY fA A|DB:yb Au`Rgu@8ebvgs<$f/#|Om= *DfRD6 N vPqc7Q_Y&;,e}$9)*`G+pbnz`@z)p*%]UA䕧Yz$[w2\h !:%R !_o1Ӣ Ta?`\%G"ϐ: n{An;r#%s9~q UCz%vi<܎̭# =J\2Wl82\B%c-_M 9k K]:v<'vPo5D~H;(>k5I'@|o q@mADx8|#O3NWЯWbumN]R! <2HtS$>3p`t(V'=pkcn6y ]dhlKwnF 1w8aߺ 0j?=~DCѶ:e9͈vOEN2,N Vsɩ =p'F ANgu<ژ'V4~^eqhB m( *eK$& RP)qW9DmG00V[ (dPF#el8bb,(du&;1EE\`p.R[T*}fTnJ$Zf&mxx*|.zS qo+OrRHAUj59w:B^o Ӿ p&Ô&^10 3;3Cad)&آB4c7v?)ʖ`ת2?YY@}sksa(!fM[mS]Uh,mv{Ty@ oX~0}U!m48*Di692)xFKa[+\nɻv`$H8o\`!/:Nr5%.I!JuW}֒9%ю]S@@ɴ 11"F*Z<ԄoTR@J\'+ XN4`ah'7Qq,n M 4$_-O^? #,3\;k֢:֪ i:뺡^]x,ڍHAпUj(v6w; |]x,KDWVɱSC ЭV/l<@s_J~<_cS;f] s,-ݠwu8718HZ 5OkF 6͞W|s-+oJ!%+<ݩ\׮dfqh2}?$Jw JzUVEj :KPQ#tHJ l.Pw dsCiVJKb֖Imd([AB r_uЂN]>q#C yo!J(h%N3a9l4eXIӀ' Tcx"Tm ҷ0&[ SeD~gchZ9φۉtXɃh@Na ߯qB>oB9by3}Ch3s(YpZm<P&x ˄!Iī IWx8A ;qe!ZW ~'0!Bjrq#U|M;/ eDLׇCYŦ!" t Cp2D?0]vyxId6wD&(9ҏ93s?d5ODlԷ)5^ޕ"SgBo -=с|oBCQ4noSYTj-o. Nä_!?B^`CKBDLf"Z JA.g(4n13k&rv6"XV_En^̽+_,siN'Z,myւV%U"f Hv"ͱ`:\ <_9˵hCW-_ezp-Z7:3]c`BY=  #a,Q(v[7VElR(A9GbOr3/3lƊv*}v=xjZ(Vܕ#p*rBG1F+f$lq#4gtveEB3Q 'H1aAW "8ps9֛!)&:xj:ʙ,m$h:EbC||/F>w>_|}#<6\a+<Ԯbn^AfxW%x '1Ge< ْ9knVׁ]^-@O{<94jRX=>oRu~qE˷VyG);C3@V'faX!h)F6IBƴ bwo(2G|_xQJi^5ə'< x `(R\ϙ\(56+ Gȕ~(f~y*5*%6Qh:3E&2.S>AahM _iPo"jN)JTK) fǑKۦZ,=y$խKTrEln?|*26sk5('W 8 BAlx1&=8ǧ>s,.mZU})K((5hŝ;:p |-HJIL|Pګ#ˍ Kj;aJ:9ƑG"Ǝ(J**rZ뎅)5uLZh 3BdL )6bZl1e:z@nT9R'ʀ%jr62LTy`rL0r\[sÉ]&$!hl#Zgy@)<&Ԫe[ 4 0UO$Yx5Se'cSB@!/Ls;ڊ K &!AcC-֊CX!$d%tj%/ '&kBfs F!ӕ'(jcpϵk[Q+Pqkմ]Mf{qd)al`~ЅvҞ <ݢ31fQ3.}Sb/%t0-&2ؗv Q1קEWz{EQz9[NDOɠT`%tEXtdate:create2014-03-05T13:56:33-05:00Ȝ%tEXtdate:modify2014-03-05T13:56:33-05:00p tEXtSoftwarewww.inkscape.org<IENDB`PhotoCollage-1.4.8/data/icons/hicolor/64x64/000077500000000000000000000000001465467221700204005ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/64x64/apps/000077500000000000000000000000001465467221700213435ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/64x64/apps/photocollage.png000066400000000000000000000125101465467221700245300ustar00rootroot00000000000000PNG  IHDR@@iqgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs B(xIDATx͛ieUoez6{q !`'B!CK(@P&$ rLg8;3=KLw~T~߭ϿNsE>ŋ+޵|g{DDmy@@@W;r9}n{ͷ. { B Oi}\;TY<';?=_ 6YɱChˬjˬ<<5i_wס'sk8*(|O6k-Z'q?S}0DZHZ{Qp})dнXh? G?잽DkX٫rN֥X;vFhyUGfiA0:J)KYG0:{X;ADQHddY7Ʃ<7G>3rIL ̆HJ}pK;?ƕ1`WEhahA:z+Eh Q9D+IFMq(o~绑7,ח,/_ |<|3GY>24֨; 0\@U{f`$Xt3SV"$#N-F %Q\kfrZDؿtX$6;vbҊkJǎ-¹z @N.7H]Zc>xƨC0:ڠ@Kz={עbZ|j9\7F"q &jW(TۜsZ)")DBh& &XSV>Ʌ'(D!zf9{nLXo2Wq^;"y>ED)2J0[)E\\D4h4;~9>t_ys-W06yG&Z@ fB1 ~w=\*6m ~MjaFȒ3!"hB<t3z+Ɣ{kj"k~(YCwuՐa.J(F!{N.f`W.W`!^FGk݌z$FvMFJpuB|wTk4>xٌJ{F8jPd8`CpoZ @·o<>J'sX"y:̒d t<&7z^;ɆNd;Z̫Þps9"pғf~+eэ-ǔE6ċ‹| "'?o}T P+wD"Tz^cJ=`@/`p enló 0SU"?~WӘ ݻ & Z+DW Q,Nd}Zt,R ָ&Uۺ(:QP*5޲$#I\=_a\!uvʵV)cbLQ.(iw|ѤfV){h4ht&Af#Wx3! EHk`PxWe@ﳵgb3v ͸~ߵͬ< "JJp()@ *e7zUb5Y意axB䒂^=` tGDaD.ĵRT]IBPH0( u8\ǟzq9~8h8SwdM[9PC8K #n< N@LJD{mD"Fowxq?{V͇,|GCI'a=`G|Xf;C 5yD+R§a'y,#_:x /Hk;GGO:R'S; 횥2%hBtogDP*/=iq& hǠ8f337dyI-M{^9 'O39@cNd&Iijev͖)b`(b`L9K} ^!"Xk./kiO"ÅL.aC y9dyg?xRWq0W ]-P % \["Ǽ9VrM\oZƔCءj>Dk{6<0l; 0 9xF} tт`~G)Tͼ,/P*WzEn94ɖ!ۨlP&}qZsH++gcgz3`ΫQ s"J{D<^!BWoR8rGDa%?U!,ɡJ38,TJl5gZLeȎ={fx^v$OΑdI~SRXQ(욫0?WCDX[oqqA١ ev8y0!4BzjeVε){s$˗єL1_Fb'6$s +JH|f<6MFp ĉTb Tr'F ZSAˍ| &ŠdC{~>y6dAϽÿ ={iڞ^yS=Mims  (bK3# 8h3#c;AP=ex仑V߹)anYw󃛶̱D ?q}%MNx"y`d`sQT#fq_P 7hW==ĉJB8SoĕV'G)ʗ2KEV_=%tEXtdate:create2014-03-05T13:56:33-05:00Ȝ%tEXtdate:modify2014-03-05T13:56:33-05:00p tEXtSoftwarewww.inkscape.org<IENDB`PhotoCollage-1.4.8/data/icons/hicolor/scalable/000077500000000000000000000000001465467221700213535ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/scalable/apps/000077500000000000000000000000001465467221700223165ustar00rootroot00000000000000PhotoCollage-1.4.8/data/icons/hicolor/scalable/apps/photocollage.svg000066400000000000000000012012741465467221700255260ustar00rootroot00000000000000 image/svg+xml PhotoCollage-1.4.8/data/photocollage.appdata.xml000066400000000000000000000260261465467221700216540ustar00rootroot00000000000000 photocollage.desktop CC-BY-3.0 GPL-2.0+ PhotoCollage Adrien Vergé photocollage.desktop Graphical tool to make photo collage posters Grafický nástroj pro vytváření koláží z fotografií Grafisches Werkzeug zum erstellen von Foto-Collagen Poster Herramienta gráfica para hacer póster de collage de fotos. Outil graphique pour fabriquer des posters en collant plusieurs photos Strumento grafico per creare collage di fotografie Grafische toepassing om fotocollageposters te maken Graficzne narzędzie do tworzenia kolaży ze zdjęć Ferramenta gráfica para fazer pôsteres de colagem de fotos Графический инструмент для создания фотоколлажей Графічний застосунок для створення фотоколажів

PhotoCollage allows you to create photo collage posters. It assembles the input photographs it is given to generate a big poster. Photos are automatically arranged to fill the whole poster, then you can change the final layout, dimensions, border or swap photos in the generated grid. Eventually the final poster image can be saved in any size.

The algorithm generates random layouts that place photos while taking advantage of all free space. It tries to fill all space while keeping each photo as large as possible.

PhotoCollage does more or less the same as many commercial websites do, but for free and with open-source code.

PhotoCollage umožnuje vytvářet koláž z obrázků. Z vybraných fotografií je vygenerována velká pohlednice. Fotografie jsou automaticky velikostně upraveny, tak aby zaplnily celou pohlednici. Výsledné uspořádání, velikost, rámeček nebo umístění fotografií lze změnit. Výslednou pohlednici lze uložit libovolné velikosti.

Algoritmus generuje náhodné rozložení, fotografie jsou rozprostřeny přes veškeré volné místo. Program se snaží umístit fotografie v co největším formátu při zaplnění veškerého volného místa.

PhotoCollage dělá více méně to samé co mnoho komerčních webových portálů, ale PhotoCollage je zdarma a open-source.

PhotoCollage erlaubt Ihnen das Erstellen von Foto-Collage Postern. Ausgewählte Fotos werden automatisch auf einer rechteckigen Posterfläche arrangiert. Es ist möglich, Anordnung sowie Abmessungen der Fotos und des Rahmens zu bearbeiten und Fotos auszutauschen. Das fertige Poster kann in beliebiger Größe gespeichert werden.

Das zugrundeligende Rechenverfahren erzeugt die Anordnung bei größtmöglicher Ausnutzung der Posterfläche in der Weise, dass jedes Foto so groß wie möglich dargestellt wird.

Der Funktionsumfang von PhotoCollage entspricht etwa dem vieler kommerzieller Webseiten. Jedoch ist es kostenlos und der Quellcode unter einer freien Lizenz erhältlich.

PhotoCollage te permite crear póster de collage de fotos. Reúne las fotografías de entrada que se le dan para generar un gran póster. Las fotos se organizan automáticamente para llenar todo el póster, luego puede cambiar el diseño final, las dimensiones, los bordes o intercambiar fotos en la cuadrícula generada. Finalmente, la imagen final del póster se puede guardar en cualquier tamaño.

El algoritmo genera diseños aleatorios que colocan fotos mientras aprovechan todo el espacio libre. Intenta llenar todo el espacio manteniendo cada foto lo más grande posible.

PhotoCollage hace más o menos lo mismo que muchos sitios web comerciales, pero de forma gratuita y con código de open source.

PhotoCollage permet de créer des posters de photo-collages. Il assemble les photos qu'on lui donne pour générer un grand poster. Les photos sont automatiquement arrangées pour remplir le poster entièrement ; vous pouvez ensuite changer la structure finale, les dimensions, les bordures ou intervertir des photos dans le maillage généré. Finalement le poster final peut être sauvegardé en n'importe quelle résolution.

L'algorithme place les photos dans un maillage généré aléatoirement, en remplissant l'espace libre. Il essaie de ne laisser aucun trou, tout en gardant chaque photo aussi grande que possible.

PhotoCollage fait plus ou moins ce que beaucoup de sites web commerciaux font, mais gratuitement et avec du code open-source.

PhotoCollage permette di creare poster da collage di fotografie. Assembla le fotografie che vengono inserite per generare un poster. Le immagini vengono posizionate automaticamente per riempire interamente il poster; in seguito è possibile modificare la struttura finale, le dimensioni, i bordi o scambiare le fotografie nella griglia generata. Il risultato finale può essere salvato in qualsiasi dimensione.

L’algoritmo posiziona le immagini in una griglia generata casualmente, riempiendo lo spazio libero. Cerca di non lasciare alcun buco, mantenendo ogni fotografia la più grande possibile.

PhotoCollage fa più o meno quello che fanno molti siti web commerciali, ma gratuitamente e con codice open source.

Met PhotoCollage kun je collageposters maken. Alle opgegeven afbeeldingen worden samengevoegd tot één grote poster: ze worden automatisch ingedeeld om de gehele poster op te vullen. Daarna kun je de indeling, afmetingen, randdikte en volgorde aanpassen en de poster opslaan in elke denkbare grootte.

Photocollage permite criar pôsteres de colagem de fotos. Ele reune fotografias de entrada para gerar um grande pôster. As As fotos são organizadas automaticamente para preencher o pôster inteiro então, você pode alterar o design final, dimensões, bordas ou trocar fotos na grade gerada.Finalmente, a imagem final do pôster pode ser salva em qualquer tamanho.

O algoritmo gera layouts aleatórios das fotos aproveitando todo o espaço livre. Ele Tenta preencher todo o espaço Mantendo cada foto o maior possível.

Photocollage faz mais ou menos o mesmo que muitos sites comerciais, porém, de graça e com código aberto.

PhotoCollage pozwala Ci stworzyć kolaż zdjęć. Składa on wprowadzone fotografie w plakat kolażu. Zdjęcia są automatycznie układane by wypełnić całą przestrzeń, wtedy możesz dostosować końcowy układ, wymiary, obranowanie lub wymienić zdjęcia w wygenerowanym projekcie. Na końcu, gotowy kolaż może być zapisany w dowolnym rozmiarze.

Algorytm generuje losowy układ, w który zdjęcia są układane w sposób wykorzystujący całą wolną przestrzeń. Próbuje on wypełnić cały obraz utrzymując każde zdjęcie tak wielkie jak to tylko możliwe.

PhotoCollage zapewnia mniej więcej to samo, co wiele komercyjnych stron, ale za darmo i z otwartym kodem.

PhotoCollage позволяет создавать фотоколлажи. Из данных ему фотографий он генерирует большой постер. Фотографии автоматически заполняют всё полотно, затем можно изменить окончательный макет, размеры, границы или поменять местами фотографии в сгенерированной сетке. Окончательное изображение можно сохранить в любом размере.

Алгоритм генерирует случайные макеты, размещающие фотографии на всём доступном пространстве. Он старается заполнить всё полотно так, чтобы у каждой фотографии был наибольший возможный размер.

PhotoCollage делает более или менее то же самое, что и многие коммерческие веб-сайты, но бесплатно и с открытым исходным кодом.

PhotoCollage дозволяє створювати фотоколажі. З отриманих світлин він генерує великий постер. Світлини автоматично заповнюють все полотно, потім можна змінити кінцевий макет, розміри, межі або поміняти місцями світлини в згенерованій сітці. Фінальне зображення можна зберегти в будь-якому розмірі.

Алгоритм генерує випадкові макети що розміщують світлини на всьому доступному просторі. Він намагається заповнити все полотно так, щоб у кожної світлини був найбільший можливий розмір.

PhotoCollage робить більш-менш те саме що комерційні сайти, але безкоштовно і з відкритим початковим кодом.

https://github.com/adrienverge/PhotoCollage/raw/v1.4.0/screenshots/photocollage-1.4-preview.png https://github.com/adrienverge/PhotoCollage https://github.com/adrienverge/PhotoCollage/issues https://github.com/adrienverge/PhotoCollage https://github.com/adrienverge/PhotoCollage/tree/master/po adrienverge_at_gmail.com
PhotoCollage-1.4.8/data/photocollage.desktop000066400000000000000000000036601465467221700211130ustar00rootroot00000000000000[Desktop Entry] Type=Application Exec=photocollage Icon=photocollage Categories=Graphics;2DGraphics;RasterGraphics;GTK; Terminal=false Name=PhotoCollage Keywords=photo;collage;image; Comment=Graphical tool to make photo collage posters from multiple images Name[de]=PhotoCollage Keywords[de]=Fotos;Bilder;Poster;Plakate;Zusammenstellung;Collage,Photo;Image; Comment[de]=Ein grafisches Werkzeug zum Erstellen von Fotocollage-Postern aus mehreren Bildern Name[es]=PhotoCollage Keywords[es]=foto;collage;carteles;imágenes;imagen;fotografía;fotografías;póster; Comment[es]=Herramienta gráfica para hacer carteles de collage de fotos a partir de múltiples imágenes. Name[fr]=PhotoCollage Keywords[fr]=photo;collage;image; Comment[fr]=Outil graphique pour fabriquer des posters en collant plusieurs photos Name[it]=PhotoCollage Keywords[it]=foto;collage;immagine;fotografia;fotografie;immagini;poster; Comment[it]=Utilità grafica per creare poster da collage di fotografie Name[nl]=PhotoCollage Keywords[nl]=foto;collage;afbeelding;fotografie;poster; Comment[nl]=Grafische toepassing om fotocollageposters samen te stellen uit meerdere afbeeldingen Name[pt-br]=PhotoCollage Keywords[pt-br]=foto;colagem;imagem; Comment[pt-br]=Ferramenta gráfica para fazer pôsteres de colagem de fotos de múltiplas imagens Name[pl]=PhotoCollage Keywords[pl]=zdjęcie;fotografia;grafika;kolaż;kolaż zdjęć;plakat; Comment[pl]=Graficzne narzęd do tworzenia kolaży z wielu zdjęć Name[ru]=PhotoCollage Keywords[ru]=фотография;коллаж;изображение; Comment[ru]=Графический инструмент для создания фотоколлажа из нескольких изображений Name[uk]=PhotoCollage Keywords[uk]=фотографія;світлина;колаж;зображення; Comment[uk]=Графічний застосунок для створення фотоколажа з кількох зображень PhotoCollage-1.4.8/photocollage/000077500000000000000000000000001465467221700166025ustar00rootroot00000000000000PhotoCollage-1.4.8/photocollage/__init__.py000066400000000000000000000016251465467221700207170ustar00rootroot00000000000000# Copyright (C) 2013 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. APP_NAME = "photocollage" APP_VERSION = "1.4.8" __author__ = "Adrien Vergé" __copyright__ = "Copyright 2013, Adrien Vergé" __license__ = "GPLv2+" __version__ = APP_VERSION PhotoCollage-1.4.8/photocollage/artwork.py000066400000000000000000000143101465467221700206440ustar00rootroot00000000000000# Copyright (C) 2014 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import base64 from io import BytesIO import cairo from gi.repository import GdkPixbuf # Generated with: # import base64 # with open("data/icons/dragndrop.png", "rb") as f: # encoded_image = base64.b64encode(f.read()) # n = 79 - 4 - 2 # for i in range(0, len(encoded_image), n): # print(' "' + encoded_image[i:i+n].decode('ascii') + '"') ICON_DRAG_AND_DROP = ( "iVBORw0KGgoAAAANSUhEUgAAAJ4AAABmCAQAAACQTeCEAAAMsElEQVR42uWdT6gdVx3HvzeZP" "J8GX0gMSsNvtFAjgULVjc5IraJQFRe+zawURJCuunlZSFaiO3Hxnis3brqQbq6L50KoWKQG6o" "y4KGLQiLR5cX4GWwrtCwmmz7w8F/fMmfN35py5k3tfbifQvNw3d/58z+/v55yZTrCwbfMTeBy" "rs+3t3pwsTLoNfBartb2WLOxU5wDg03gAANjw7HRb/va23Oe23P+293uuI230fuK7gg3lnK7f" "n8VVADiXLHawnpQ/kWcPBkBgZR9WfqI5zh33bfZc5exqrgIAkkXbeiMMK5fG8lP1wpt95hPM9" "y8yPmkHjAOPtgTx2PkzB9kLDZat+/dkDFiIdyxFPPfYusd79ukwZyXn7ZrnsQeGO6Qzv70E8f" "SR9tkJeX9LA6IYWfHUZ1nUY620XPFmt0wOyXzu4w/luhwUJCENDDZkfTdZjt31j3x4zGKHcz6" "cOE3LTRg0yp59eZEjz9iVhbu2pcS8sYbA5/pwuD91WBDJYMJW2dQVl4+deBzpdhTwOctoZ1aX" "7jQUuh1Ly/MLOG/Z0pWpOfq4c4i3+SV8OfY7Pz22oeDx61/4jysUUEesHSzeJsVLd5y3vUuX9" "p/6b3+SUSPicMv75KpRkr+facTrqxNHas9Wi5LExtC5E8YqUZIFJozVoyQLF2+VKElYkOAxxV" "sdShJbK44g3upQkqW47apQkqa3DT1jMpZwjz4l2ccUQC7ickhdcCx62+NCSXIrLdFyxXt0KMk" "ZJYY2sXeKFJn3GycWQ0lCHHJYlKUOSsIDBlpPRQVqTFF5aolkfrtCQMJgrwvwSOmAPI1YDCVx" "WW6BCgCjBJAaR0uAzcnu0ZgFsk8Y9kSncbcjTbY4StJYKzmsm8CoUQIotBUDP9z80dBLPX587" "mMvfHcvzlrJsMwmybBVTRJKFMq+Jzcz/BIrtN39zAf/+Nhh3Hc28CqA9bfP3yFsSJvbEH8IQI" "of42/4vvzdqwCwn+DrwGpxub9e+OjekJCw7snWADAFANTiZyNhrBKXOxgYTe+hcsTLCoWIdcA" "OPCR5dbjcWmAXYpbf++JT0u6zxrYHuynivd+4nH31ZwyD2Inpbd8fXM6/vSfPwoFHTFaby8VQ" "kn2U8hrqWPFWhcvdRSUliKMkrGkx6ydK5dMCOaYAatyw3XY1uNyBKCnSaEpCYBByEFLUSDGV5" "9jGNhg5SpQ2SV4lLrcmbMbsbvsoyceV7qEGtCw7FZnX6m1XjcudlvKwckUsKMkUNVLDhdlpn6" "lw+lLIlssjFXgxTrxHafUSBlGSe0qlCzAyZAAImXZNOabDJr0fldVLwyjJuhjEzHEV6re3TLd" "dLS6HgZQEVnvGUk6gApChUlw+Oa5cDnNxOb2MsYchxWUA284jsqN7n7mxCgmM3jbOvY7TRj1d" "ShgluWcVVyTTVOtxGUjKl4xFO46PiHqGjqEkLhtkB1HaEhA4aQ5JjjJ4efKxEuNir+EuSqQAa" "qRRlOS9gD7E+QRQ3RE3Fu2sPGdXcgq5EA2RlKT/nvVjCvFSaebU0wvwKAB0aA8TwuXWxF1UCq" "MMoSRnREpgsCyk2Zv9tZg3252VSsh3kZUoHo9XnLNrxVKRrA6sFqdarCMwcqkGKQWLIV4ua6n" "a6v9mNtmIVlriLsO5/dubmIpWKpaSQDZulQxmNYBSfJ6i1pRJVF822yWWf7dyTed2tKGdQsyS" "sHIQJWl9LhP/mgoNVNaYuqkKaTXTVEhXy4jIcnQqmcVopCKHLftljXHEcDkgN3wnjJLYtWEBo" "ESu2Ct3UxXSesJUZGIV7Zh0hJRY2MgcM0HEoriwJRvC5c7iG0780EdJ7jmRBYTlMoBtXPaRZN" "PwG3fV1w6lios3Tj2TrZbGTp1dsFs6sqCkWRqEcrk1x/CGURJ2DlB7DTUKkFLyJCH1jlppZw6" "YNAuweUe1798qZ1lASk4byuVIueIQSrKu8ENffUcACrM9M6ulaecFkTHr0G1plRWObelUO5kl" "qmwwl1NDSRwl6Up+uXKsXH81SGu6qayJyLClptXRWx7VmSqF4dqXUVv7tzeuOxjPxeUOHOYQQ" "knudXpIpv2siVeIG2lPkQc4njlHxrLCUoEQGcJkILFcMPeyOnY4WiiXW3NGsH5KMluTnGqpqm" "0gmuFXY20CxcpYFAVuQ57Zls4bXLi0tQh2HKGviyEvPwzlcnc7gG0XJVlXJELHT7Up3hSpLC1" "TR61F8oZZc2E9fpExdc2a7WZGuaP3jaVSm9FcXO5A3GDqHaRuxJ968KrqHzf0hMEosCVCODnm" "EcgZiH03Zyb9LtAws/jc20/HcrnTyDW7D6UkHzCyPTsXdsDVnpkWRVaWIit7kXNmVXexrnK5l" "aVw5ud6EJdb02JtOCVZ77FIOzYnOhaAFuL7Zi5gXI7LJsk7E2LWYLNcXYm4q0sfx+XY6MRDKQ" "lpEBZGbcm+F3GZwTjFNliZZCML3RQ9dRFZgqtDUqFWCqEptsAokaFCicL4TiyXU88ZR0nYOyH" "k7oCTNmC3zlOJ0bXX4FUoQSicJTH3BPcmqOc4woegryGYnX9Hae5oLi43jJK4l3T4+Lpieali" "dTtypxxTxRYqUQ2mAKbIkVkZs+jIbZW49Rq38APcl5+WRkczRSoFG8rlhlESVioKX0pkOB6Tb" "4nIjgIHSvH3zNYaSlaLT2swctnikHDAWRRpW6zZ98zRewrX8a4sj+xuggdzuQPZj1AUJbmJm3" "EU7USiovUdpZObaqfesWqrZhQagbfE7ewo7jVrnWyjPwHgZ7iM3+OaHMdUG+lG7iFc7n/KPEs" "cJYnbdt9IIK3INPCyN540rI+hLrB34QXV/FM8BuAt/BzP41N42jgzZOnCwCAudzogCTgpyd0I" "0zux+4ZnQbdvKjgXztAC0qyjcjfnXtubuA/gELfwCzyH13C+J2fGc7mQKQIHJbmzuxdne4n7w" "LNLTIUD5oZ11EHFQvdi2UMcgvECvoc3cQB0QP1YLnc3aM7XRUliNyeGzwyIVHfUQO7Gy52vmn" "0f4CIOcYj7+BdexLfxD1yEvZSRBnO50uhUQynJCOIxdpCL+ioVJ2gSQGo0KbVirWrcTFGjFrm" "xbdJr8f1/4yKA+0hwiBv4FQrUuGBgJnVZfxyXO2UUOOGUZKB4W1of2BQl7XxZLlJCI2GpJf5W" "sLaxIg1Xkix62tue2V6C1/FrfAvX8GEHeB3C5YZTkjktj0AoZDHQWBoJgSslnuVWlCKtsiLjv" "4XSYdYycSQ4xCH+id/ia3hJkY8UdhzL5eCY4w2jJCO4bW0wDleQTR1T0BScRC4otjezvutI8C" "xewm1hKaXiXvFczn6eJIySjCCeDkG7l7rMtx3hEA/wPD4CADiJb+KGkCpT7CqWy60Z5Dqckow" "iHksg7+vxslHEO4Mn8Rf8CV9FAuDQ6jMwiMupCDaOkgwUj60VG5m2LmosudTtLK7gFK6hxFew" "hz9Dn/mlwVzuwKjzwinJQPGmWtOlFwRNI5Rr0+BklBAhiKrZZwLgHK5ggpN4Bq+gxOfEgkTXz" "Ek8l9NLmnBKMlC8HDUKpe3SwSMpnIOUKNK4t38rBCwwL+87uIK3cQsZnsVVXMUzON+5bDyGy7" "0jns+JDsDJQPEypXRUY8vs36mxsEEtFdRaqpbWk4uqrhJHZeTy9zmOcITfiG88gadxFbdwRwO" "kmIvLDZJusvvyQPEqORNFAneSMYugPv3Vlqq1MlNFqJXxZ6uST+VtH+F3Uu7X8UVcwjt4Wbwi" "op1udy0pC1q9tI8/xHtgvHQKSSbhgqk2x18ZYZkcM2xtXCmM8TezdQtcn0CzmIdxgFN4C5+XD" "3qyNdEZyeXe3X0FC9m0laGkXS4LHkyAsgpF5R/mUopSEb97iYa+ukB/TLrW+poBXG5hW+ImaM" "2KuUxxv8xZJ7Upo6W+lSKG/0k1djRS5C2KYlYvLVg8FehUAoKbCaI06qQmvqVGha/bUReBY60" "gUgseNsLCw+Vyc4pXol1Ey0ZtFbrZL1gIeakCG6xYtetFcbkRYl5zGfmgy3C/UYC9RWnI41G0" "IC43p3hFr4WEgHfb3qh3ZiKcbDw8LjcyVfEXCP0ic4DAYU+WLYrLzSme/wHkrretsDHyMa868" "lklL4HLjWB57GybqfO9YV2SuF5M07/Wyl3NPVwuN1LC0CUj5/M4ZIjKlqWyN2GQJxSQN84ugs" "uN4rZm9+p/WIkcEY6df/sSRJ+r9b+QZjwuN7flseWivqWxZJUc5gMv5tQhe6pB+60U1OHsD4/" "LDRdvHUeYHN//sdEAuLS+qFNNgM0jHGGyMtJNdhd2L5PNye7R5k96Hn95dLb13SvzvPc5bvs/" "U4Z3kUZTSagAAAAASUVORK5CYII=") def load_pixbuf(encoded): loader = GdkPixbuf.PixbufLoader.new_with_type("png") loader.write(base64.b64decode(encoded)) loader.close() return loader.get_pixbuf() def load_cairo_surface(encoded): buf = BytesIO() buf.write(base64.b64decode(encoded)) buf.seek(0) surface = cairo.ImageSurface.create_from_png(buf) buf.close() return surface PhotoCollage-1.4.8/photocollage/collage.py000066400000000000000000000433471465467221700205750ustar00rootroot00000000000000# Copyright (C) 2014 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import random """ Summary of collage objects: ---------------------- | | | | | Page | The "Page" object represents the whole page that | | will give the final assembled image. | | ---------------------- ---------------------- | | | | | |Column| | | | |Column| A page is divided into columns. |Column| | | | | | | ---------------------- ---------------------- | Cell | Cell | Each column contains cells. When a |------| x--|----- CellExtent is located in several columns, | Cell |-------------| its "extended" flag is set, and a |------| Cell | | CellExtent object is added to the | Cell | | Cell | column on the right to reserve the ---------------------- place. ,------> Photo / ,---------> Photo ---------------------- | | | Each cell is associated |------| | to a photo. | |-------------| |------| | |----> Photo | | | | ---------------------- `----------> Photo The layout placing process is divided in three phases. Phase A: Fill columns with photos. Photos are added to columns, one by one, until there are no more photos. Each new photo is put in the smallest column, so as to have balanced columns. If two columns have approximately the same height, a photo can be "extended" to fit two columns. In this case, the "Cell" object is put in the first column, and the second column takes a "CellExtent" object to reserve the taken space. Phase B: Set all columns to same height. A global common height is computed for all columns, and every of them is stressed or extended to this common length. This can result in a decrease or increase in columns' width. Phase C: Adapt columns' width. Since cells in a column may have different widths, each column width is set to the smallest width amongst its images. """ class Photo: def __init__(self, filename, w, h, orientation=0): self.filename = filename self.w = w self.h = h self.orientation = orientation self.offset_w = 0.5 self.offset_h = 0.5 @property def ratio(self): return float(self.h) / float(self.w) def move(self, x, y): self.offset_w = self.calculate_new_offset(self.offset_w, x) self.offset_h = self.calculate_new_offset(self.offset_h, y) @staticmethod def calculate_new_offset(offset, value): new_offset = offset + value if new_offset < 0: new_offset = 0 elif new_offset > 1: new_offset = 1 return new_offset class Cell: """Represents a cell in a column Properties: <- x -><- w -> ---------------------- ^ | | | |y |------| | | | |-------------| v |------| Cell | | ^ | | | | |h ---------------------- v """ def __init__(self, parents, photo): self.parents = parents self.photo = photo self.extent = None self.h = self.w * self.wanted_ratio def __repr__(self): """Representation of the cell in ASCII art""" end = "]" if self.extent is not None: end = "--" return "[%d %d%s" % (self.w, self.h, end) @property def x(self): return self.parents[0].x @property def y(self): """Returns the cell's y coordinate It assumes that the cell is in a single column, so it is the previous cell's y + h. """ prev = None for c in self.parents[0].cells: if self is c: if prev: return prev.y + prev.h return 0 prev = c @property def w(self): return sum(c.w for c in self.parents) @property def ratio(self): return self.h / self.w @property def wanted_ratio(self): return self.photo.ratio def scale(self, alpha): self.h *= alpha def is_extended(self): return hasattr(self, 'extent') and self.extent is not None def is_extension(self): return isinstance(self, CellExtent) def content_coords(self): """Returns the coordinates of the contained image These are computed in order not to loose space, so the content area will always be greater than the cell itself. It is the space taken by the contained image if it wasn't cropped. """ # If the contained image is too thick to fit if self.wanted_ratio < self.ratio: h = self.h w = self.h / self.wanted_ratio y = self.y x = self.x - (w - self.w) / 2.0 # If the contained image is too tall to fit elif self.wanted_ratio > self.ratio: w = self.w h = self.w * self.wanted_ratio x = self.x y = self.y - (h - self.h) / 2.0 else: w = self.w h = self.h x = self.x y = self.y return x, y, w, h def top_neighbor(self): """Returns the cell above this one""" prev = None for c in self.parents[0].cells: if self is c: return prev prev = c def bottom_neighbor(self): """Returns the cell below this one""" prev = None for c in reversed(self.parents[0].cells): if self is c: return prev prev = c class CellExtent(Cell): def __init__(self, cell): self.origin = cell self.origin.extent = self def __repr__(self): """Representation of the cell in ASCII art""" return "------]" @property def parents(self): return (self.origin.parents[1],) @property def photo(self): return self.origin.photo @property def y(self): return self.origin.y @property def h(self): return self.origin.h def scale(self, alpha): pass class Column: """Represents a column in a page Properties: <----- x ----><-- w -> ---------------------- ^ | | | | | | | | | | | |Column| h | | | | -------| | | | | |------- v -------- """ def __init__(self, parent, w): self.parent = parent self.cells = [] self.w = w def __repr__(self): """Representation of the column in ASCII art""" return "\n".join(c.__repr__() for c in self.cells) @property def h(self): """Returns the column's total height This is not simply the sum of its cells heights, because there can be empty spaces between cells. """ if not self.cells: return 0 return self.cells[-1].y + self.cells[-1].h @property def x(self): x = 0 for c in self.parent.cols: if self is c: break x += c.w return x def scale(self, alpha): self.w *= alpha for c in self.cells: c.scale(alpha) def left_neighbor(self): """Returns the column on the left of this one""" prev = None for c in self.parent.cols: if self is c: return prev prev = c def right_neighbor(self): """Returns the column on the right of this one""" prev = None for c in reversed(self.parent.cols): if self is c: return prev prev = c def adjust_height(self, target_h): """Set the column's height to a given value by resizing cells""" # First, make groups of "movable" cells. Since cell extents are not # movable, these groups only contain pure cell objects. We only resize # those groups. class Group: def __init__(self, y): self.y = y self.h = 0 self.cells = [] groups = [] groups.append(Group(0)) for c in self.cells: # While a cell extent is not reached, keep add cells to the group if not c.is_extension(): groups[-1].cells.append(c) else: # Close current group and create a new one groups[-1].h = c.y - groups[-1].y groups.append(Group(c.y + c.h)) groups[-1].h = target_h - groups[-1].y # Adjust height for each group independently for group in groups: if not group.cells: continue alpha = group.h / sum(c.h for c in group.cells) for c in group.cells: c.h = c.h * alpha class Page: """Represents a whole page Properties: <-------- w --------> ---------------------- ^ | | | | | | Page | h | | | | | ---------------------- v """ def __init__(self, w, target_ratio, no_cols): self.target_ratio = target_ratio col_w = float(w)/no_cols self.cols = [] for i in range(no_cols): self.cols.append(Column(self, col_w)) def __repr__(self): """Representation of the page in ASCII art Returns something like: [62 52] [125 134-- ------] [62 87] [62 47] [62 66] [125 132-- [62 45] [62 46] ------] [62 49] ------] [62 78] ------] [62 49] [62 45] [125 102-- ------] [62 49] [62 65] [125 135-- [62 85] [62 53] [125 91-- [125 89-- [62 64] ------] """ lines = [] n = 0 end = False while not end: lines.append("") end = True for col in self.cols: cells = col.__repr__().split("\n") w = max(len(cell) for cell in cells) if col != self.cols[-1]: w += 1 cell = w * " " if n < len(cells): cell = cells[n] + (w - len(cells[n])) * " " if n < len(cells) - 1: end = False lines[-1] += cell n += 1 return "\n".join(lines) @property def no_cols(self): return len(self.cols) @property def w(self): return sum(c.w for c in self.cols) @property def h(self): return max(c.h for c in self.cols) @property def ratio(self): return self.h / self.w def scale(self, alpha): for c in self.cols: c.scale(alpha) def scale_to_fit(self, max_w, max_h=None): if max_h is None or self.w * max_h > self.h * max_w: self.scale(max_w / self.w) else: self.scale(max_h / self.h) def next_free_col(self): """Returns the column with lowest height""" minimum = min(c.h for c in self.cols) candidates = [] for c in self.cols: if c.h == minimum: candidates.append(c) return random.choice(candidates) def add_cell_single_col(self, col, photo): col.cells.append(Cell((col,), photo)) def add_cell_multi_col(self, col1, col2, photo): cell = Cell((col1, col2), photo) extent = CellExtent(cell) col1.cells.append(cell) col2.cells.append(extent) def add_cell(self, photo): """Add a new cell in the best computed place If possible, and if it's worth, make a "multiple-column" cell. """ col = self.next_free_col() left = col.left_neighbor() right = col.right_neighbor() if 2 * random.random() > photo.ratio: if left and abs(col.h - left.h) < 0.5 * col.w: return self.add_cell_multi_col(left, col, photo) elif right and abs(col.h - right.h) < 0.5 * col.w: return self.add_cell_multi_col(col, right, photo) self.add_cell_single_col(col, photo) def remove_empty_cols(self): i = 0 while i < len(self.cols): if len(self.cols[i].cells) == 0: self.cols.pop(i) else: i += 1 def remove_bottom_holes(self): """Remove holes created by extended cells Example (case A): The bottom-right cell should be extended to fill the hole. ---------------------- ---------------------- | | | | | | | | | |-------------| | |-------------| |------| | |------| | | |-------------- | |-------------- | | | ^ | | ^ | | --------------- hole -------- hole -------- Example (case B): The bottom cell should be moved under the other extended cell. ---------------------- ---------------------- | | | | | | | | |------|-------------| |-------------|------| | | | | | | |--------------------- ---------------------| | | <-- hole hole -> | | --------------- --------------- """ for col in self.cols: cell = col.cells[-1] if cell == col.cells[0]: continue # Case A # If cell is not extended, is below an extended cell and has no # neighbour under the latter, it should be extended. if not cell.is_extended() and not cell.is_extension(): # Case A1 if cell.top_neighbor().is_extended() \ and cell.top_neighbor().extent \ .bottom_neighbor() is None: # Extend cell to right extent = CellExtent(cell) col.right_neighbor().cells.append(extent) cell.parents = (col, col.right_neighbor()) # Case A2 elif cell.top_neighbor().is_extension() \ and cell.top_neighbor().origin \ .bottom_neighbor() is None: # Extend cell to left col.cells.remove(cell) col.left_neighbor().cells.append(cell) extent = CellExtent(cell) col.cells.append(extent) cell.parents = (col.left_neighbor(), col) # Case B # If cell is extended and one of the cells above is extended too, # the bottom cell should be placed right below the top one. elif cell.is_extended() and cell.extent.bottom_neighbor() is None: # Case B1 if cell.extent.top_neighbor().is_extended() \ and cell.extent.top_neighbor().extent \ .bottom_neighbor() is None: # Move cell to right col.cells.remove(cell) col.right_neighbor().cells.remove(cell.extent) col.right_neighbor().cells.append(cell) col.right_neighbor().right_neighbor().cells \ .append(cell.extent) cell.parents = (col.right_neighbor(), col.right_neighbor().right_neighbor()) # Case B2 elif cell.top_neighbor().is_extension() \ and cell.top_neighbor().origin \ .bottom_neighbor() is None: # Move cell to left col.cells.remove(cell) col.right_neighbor().cells.remove(cell.extent) col.left_neighbor().cells.append(cell) col.cells.append(cell.extent) cell.parents = (col.left_neighbor(), col) def adjust_cols_heights(self): """Set all columns' heights to same value by shrinking them""" target_h = self.w * self.target_ratio for c in self.cols: c.adjust_height(target_h) def adjust(self): self.remove_empty_cols() self.remove_bottom_holes() self.adjust_cols_heights() def get_cell_at_position(self, x, y): for col in self.cols: if x >= col.x and x < col.x + col.w: for cell in col.cells: if y >= cell.y and y < cell.y + cell.h: if cell.is_extension(): return cell.origin return cell return None def swap_photos(self, cell1, cell2): cell1.photo, cell2.photo = cell2.photo, cell1.photo PhotoCollage-1.4.8/photocollage/gtkgui.py000066400000000000000000000745101465467221700204550ustar00rootroot00000000000000# Copyright (C) 2013 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import copy import gettext from io import BytesIO import math import os.path import random import sys import urllib.parse import cairo import gi from photocollage import APP_NAME, artwork, collage, render from photocollage.render import PIL_SUPPORTED_EXTS as EXTS gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk, GObject, GdkPixbuf # noqa: E402, I100 gettext.textdomain(APP_NAME) _ = gettext.gettext _n = gettext.ngettext # xgettext --keyword=_n:1,2 -o po/photocollage.pot $(find . -name '*.py') # cp po/photocollage.pot po/fr.po # msgfmt -o po/fr.mo po/fr.po def pil_image_to_cairo_surface(src): # TODO: cairo.ImageSurface.create_for_data() is not yet available in # Python 3, so we use PNG as an intermediate. buf = BytesIO() src.save(buf, "png") buf.seek(0) surface = cairo.ImageSurface.create_from_png(buf) buf.close() return surface def get_all_save_image_exts(): all_types = dict(list(EXTS.RW.items()) + list(EXTS.WO.items())) all = [] for type in all_types: for ext in all_types[type]: all.append(ext) return all def set_open_image_filters(dialog): """Set our own filter because Gtk.FileFilter.add_pixbuf_formats() contains formats not supported by PIL. """ # Do not show the filter to the user, just limit selectable files imgfilter = Gtk.FileFilter() imgfilter.set_name(_("All supported image formats")) all_types = dict(list(EXTS.RW.items()) + list(EXTS.RO.items())) for type in all_types: for ext in all_types[type]: imgfilter.add_pattern("*." + ext) imgfilter.add_pattern("*." + ext.upper()) dialog.add_filter(imgfilter) dialog.set_filter(imgfilter) def set_save_image_filters(dialog): """Set our own filter because Gtk.FileFilter.add_pixbuf_formats() contains formats not supported by PIL. """ all_types = dict(list(EXTS.RW.items()) + list(EXTS.WO.items())) filters = [] filters.append(Gtk.FileFilter()) flt = filters[-1] flt.set_name(_("All supported image formats")) for ext in get_all_save_image_exts(): flt.add_pattern("*." + ext) flt.add_pattern("*." + ext.upper()) dialog.add_filter(flt) dialog.set_filter(flt) for type in all_types: filters.append(Gtk.FileFilter()) flt = filters[-1] name = _("%s image") % type name += " (." + ", .".join(all_types[type]) + ")" flt.set_name(name) for ext in all_types[type]: flt.add_pattern("*." + ext) flt.add_pattern("*." + ext.upper()) dialog.add_filter(flt) def gtk_run_in_main_thread(fn): def my_fn(*args, **kwargs): GObject.idle_add(fn, *args, **kwargs) return my_fn class UserCollage: """Represents a user-defined collage A UserCollage contains a list of photos (referenced by filenames) and a collage.Page object describing their layout in a final poster. """ def __init__(self, photolist): self.photolist = photolist def make_page(self, opts): # Define the output image height / width ratio ratio = 1.0 * opts.out_h / opts.out_w # Compute a good number of columns. It depends on the ratio, the number # of images and the average ratio of these images. According to my # calculations, the number of column should be inversely proportional # to the square root of the output image ratio, and proportional to the # square root of the average input images ratio. avg_ratio = (sum(1.0 * photo.h / photo.w for photo in self.photolist) / len(self.photolist)) # Virtual number of images: since ~ 1 image over 3 is in a multi-cell # (i.e. takes two columns), it takes the space of 4 images. # So it's equivalent to 1/3 * 4 + 2/3 = 2 times the number of images. virtual_no_imgs = 2 * len(self.photolist) no_cols = int(round(math.sqrt(avg_ratio / ratio * virtual_no_imgs))) self.page = collage.Page(1.0, ratio, no_cols) random.shuffle(self.photolist) for photo in self.photolist: self.page.add_cell(photo) self.page.adjust() def duplicate(self): return UserCollage(copy.copy(self.photolist)) class PhotoCollageWindow(Gtk.Window): TARGET_TYPE_TEXT = 1 TARGET_TYPE_URI = 2 def __init__(self): super().__init__(title=_("PhotoCollage")) self.history = [] self.history_index = 0 class Options: def __init__(self): self.border_w = 0.01 self.border_c = "black" self.out_w = 800 self.out_h = 600 self.opts = Options() self.make_window() def make_window(self): self.set_border_width(10) box_window = Gtk.Box(spacing=10, orientation=Gtk.Orientation.VERTICAL) self.add(box_window) # ----------------------- # Input and output pan # ----------------------- box = Gtk.Box(spacing=6, orientation=Gtk.Orientation.HORIZONTAL) box_window.pack_start(box, False, False, 0) self.btn_choose_images = Gtk.Button(label=_("Add images...")) self.btn_choose_images.set_image(Gtk.Image.new_from_stock( Gtk.STOCK_OPEN, Gtk.IconSize.LARGE_TOOLBAR)) self.btn_choose_images.set_always_show_image(True) self.btn_choose_images.connect("clicked", self.choose_images) box.pack_start(self.btn_choose_images, False, False, 0) self.btn_save = Gtk.Button(label=_("Save poster...")) self.btn_save.set_image(Gtk.Image.new_from_stock( Gtk.STOCK_SAVE_AS, Gtk.IconSize.LARGE_TOOLBAR)) self.btn_save.set_always_show_image(True) self.btn_save.connect("clicked", self.save_poster) box.pack_start(self.btn_save, False, False, 0) # ----------------------- # Tools pan # ----------------------- box.pack_start(Gtk.SeparatorToolItem(), True, True, 0) self.btn_undo = Gtk.Button() self.btn_undo.set_image(Gtk.Image.new_from_stock( Gtk.STOCK_UNDO, Gtk.IconSize.LARGE_TOOLBAR)) self.btn_undo.connect("clicked", self.select_prev_layout) box.pack_start(self.btn_undo, False, False, 0) self.lbl_history_index = Gtk.Label(" ") box.pack_start(self.lbl_history_index, False, False, 0) self.btn_redo = Gtk.Button() self.btn_redo.set_image(Gtk.Image.new_from_stock( Gtk.STOCK_REDO, Gtk.IconSize.LARGE_TOOLBAR)) self.btn_redo.connect("clicked", self.select_next_layout) box.pack_start(self.btn_redo, False, False, 0) self.btn_new_layout = Gtk.Button(label=_("Regenerate")) self.btn_new_layout.set_image(Gtk.Image.new_from_stock( Gtk.STOCK_REFRESH, Gtk.IconSize.LARGE_TOOLBAR)) self.btn_new_layout.set_always_show_image(True) self.btn_new_layout.connect("clicked", self.regenerate_layout) box.pack_start(self.btn_new_layout, False, False, 0) box.pack_start(Gtk.SeparatorToolItem(), True, True, 0) self.btn_settings = Gtk.Button() self.btn_settings.set_image(Gtk.Image.new_from_stock( Gtk.STOCK_PREFERENCES, Gtk.IconSize.LARGE_TOOLBAR)) self.btn_settings.set_always_show_image(True) self.btn_settings.connect("clicked", self.set_settings) box.pack_end(self.btn_settings, False, False, 0) # ------------------- # Image preview pan # ------------------- box = Gtk.Box(spacing=10) box_window.pack_start(box, True, True, 0) self.img_preview = ImagePreviewArea(self) self.img_preview.set_size_request(600, 400) self.img_preview.connect("drag-data-received", self.on_drag) self.img_preview.drag_dest_set(Gtk.DestDefaults.ALL, [], Gdk.DragAction.COPY) targets = Gtk.TargetList.new([]) targets.add_text_targets(PhotoCollageWindow.TARGET_TYPE_TEXT) targets.add_uri_targets(PhotoCollageWindow.TARGET_TYPE_URI) self.img_preview.drag_dest_set_target_list(targets) box.pack_start(self.img_preview, True, True, 0) self.btn_save.set_sensitive(False) self.btn_undo.set_sensitive(False) self.btn_redo.set_sensitive(False) self.update_photolist([]) def update_photolist(self, new_images): try: photolist = [] if self.history_index < len(self.history): photolist = copy.copy( self.history[self.history_index].photolist) photolist.extend(render.build_photolist(new_images)) if len(photolist) > 0: new_collage = UserCollage(photolist) new_collage.make_page(self.opts) self.render_from_new_collage(new_collage) else: self.update_tool_buttons() except render.BadPhoto as e: dialog = ErrorDialog( self, _("This image could not be opened:\n\"%(imgname)s\".") % {"imgname": e.photoname}) dialog.run() dialog.destroy() def choose_images(self, button): dialog = PreviewFileChooserDialog(title=_("Choose images"), parent=button.get_toplevel(), action=Gtk.FileChooserAction.OPEN, select_multiple=True, modal=True) if dialog.run() == Gtk.ResponseType.OK: files = dialog.get_filenames() dialog.destroy() self.update_photolist(files) else: dialog.destroy() def on_drag(self, widget, drag_context, x, y, data, info, time): if info == PhotoCollageWindow.TARGET_TYPE_TEXT: files = data.get_text().splitlines() elif info == PhotoCollageWindow.TARGET_TYPE_URI: # Can only handle local URIs files = [f for f in data.get_uris() if f.startswith("file://")] for i in range(len(files)): if files[i].startswith("file://"): files[i] = urllib.parse.unquote(files[i][7:]) self.update_photolist(files) def render_preview(self): collage = self.history[self.history_index] # If the desired ratio changed in the meantime (e.g. from landscape to # portrait), it needs to be re-updated collage.page.target_ratio = 1.0 * self.opts.out_h / self.opts.out_w collage.page.adjust_cols_heights() w = self.img_preview.get_allocation().width h = self.img_preview.get_allocation().height collage.page.scale_to_fit(w, h) # Display a "please wait" dialog and do the job. compdialog = ComputingDialog(self) def on_update(img, fraction_complete): self.img_preview.set_collage(img, collage) compdialog.update(fraction_complete) def on_complete(img): self.img_preview.set_collage(img, collage) compdialog.destroy() self.btn_save.set_sensitive(True) def on_fail(exception): dialog = ErrorDialog(self, "{}:\n\n{}".format( _("An error occurred while rendering image:"), exception)) compdialog.destroy() dialog.run() dialog.destroy() self.btn_save.set_sensitive(False) t = render.RenderingTask( collage.page, border_width=self.opts.border_w * max(collage.page.w, collage.page.h), border_color=self.opts.border_c, on_update=gtk_run_in_main_thread(on_update), on_complete=gtk_run_in_main_thread(on_complete), on_fail=gtk_run_in_main_thread(on_fail)) t.start() response = compdialog.run() if response == Gtk.ResponseType.CANCEL: t.abort() compdialog.destroy() def render_from_new_collage(self, collage): self.history.append(collage) self.history_index = len(self.history) - 1 self.update_tool_buttons() self.render_preview() def regenerate_layout(self, button=None): new_collage = self.history[self.history_index].duplicate() new_collage.make_page(self.opts) self.render_from_new_collage(new_collage) def select_prev_layout(self, button): self.history_index -= 1 self.update_tool_buttons() self.render_preview() def select_next_layout(self, button): self.history_index += 1 self.update_tool_buttons() self.render_preview() def set_settings(self, button): dialog = SettingsDialog(self) response = dialog.run() if response == Gtk.ResponseType.OK: dialog.apply_opts(self.opts) dialog.destroy() if self.history: self.render_preview() else: dialog.destroy() def save_poster(self, button): collage = self.history[self.history_index] enlargement = float(self.opts.out_w) / collage.page.w collage.page.scale(enlargement) dialog = Gtk.FileChooserDialog(_("Save image"), button.get_toplevel(), Gtk.FileChooserAction.SAVE) dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) dialog.set_do_overwrite_confirmation(True) set_save_image_filters(dialog) if dialog.run() != Gtk.ResponseType.OK: dialog.destroy() return savefile = dialog.get_filename() base, ext = os.path.splitext(savefile) if ext == "" or not ext[1:].lower() in get_all_save_image_exts(): savefile += ".jpg" dialog.destroy() # Display a "please wait" dialog and do the job. compdialog = ComputingDialog(self) def on_update(img, fraction_complete): compdialog.update(fraction_complete) def on_complete(img): compdialog.destroy() def on_fail(exception): dialog = ErrorDialog(self, "{}:\n\n{}".format( _("An error occurred while rendering image:"), exception)) compdialog.destroy() dialog.run() dialog.destroy() t = render.RenderingTask( collage.page, output_file=savefile, border_width=self.opts.border_w * max(collage.page.w, collage.page.h), border_color=self.opts.border_c, on_update=gtk_run_in_main_thread(on_update), on_complete=gtk_run_in_main_thread(on_complete), on_fail=gtk_run_in_main_thread(on_fail)) t.start() response = compdialog.run() if response == Gtk.ResponseType.CANCEL: t.abort() compdialog.destroy() def update_tool_buttons(self): self.btn_undo.set_sensitive(self.history_index > 0) self.btn_redo.set_sensitive(self.history_index < len(self.history) - 1) if self.history_index < len(self.history): self.lbl_history_index.set_label(str(self.history_index + 1)) else: self.lbl_history_index.set_label(" ") self.btn_save.set_sensitive( self.history_index < len(self.history)) self.btn_new_layout.set_sensitive( self.history_index < len(self.history)) class ImagePreviewArea(Gtk.DrawingArea): """Area to display the poster preview and react to user actions""" INSENSITIVE, FLYING, SWAPPING_OR_MOVING = range(3) def __init__(self, parent): super().__init__() self.parent = parent parse, color = Gdk.Color.parse("#888888") self.modify_bg(Gtk.StateType.NORMAL, color) # http://www.pygtk.org/pygtk2tutorial/sec-EventHandling.html # https://developer.gnome.org/gdk3/stable/gdk3-Events.html#GdkEventMask self.connect("draw", self.draw) self.connect("motion-notify-event", self.motion_notify_event) self.connect("leave-notify-event", self.motion_notify_event) self.connect("button-press-event", self.button_press_event) self.connect("button-release-event", self.button_release_event) self.set_events(Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK) self.image = None self.mode = self.INSENSITIVE class SwapEnd: def __init__(self, cell=None, x=0, y=0): self.cell = cell self.x = x self.y = y self.x, self.y = 0, 0 self.swap_origin = SwapEnd() self.swap_dest = SwapEnd() def set_collage(self, image, collage): self.image = pil_image_to_cairo_surface(image) # The Collage object must be deeply copied. # Otherwise, SWAPPING_OR_MOVING photos in a new page would also affect # the original page (in history). # The deep copy is done here (not in button_release_event) because # references to cells are gathered in other functions, so that making # the copy at the end would invalidate these references. self.collage = copy.deepcopy(collage) self.mode = self.FLYING self.queue_draw() def get_image_offset(self): return (round((self.get_allocation().width - self.image.get_width()) / 2.0), round((self.get_allocation().height - self.image.get_height()) / 2.0)) def get_pos_in_image(self, x, y): if self.image is not None: x0, y0 = self.get_image_offset() return (int(round(x - x0)), int(round(y - y0))) return (int(round(x)), int(round(y))) def paint_image_border(self, context, cell, dash=None): x0, y0 = self.get_image_offset() context.set_source_rgb(1.0, 1.0, 0.0) context.set_line_width(2) if dash is not None: context.set_dash(dash) context.rectangle(x0 + cell.x + 1, y0 + cell.y + 1, cell.w - 2, cell.h - 2) context.stroke() def paint_image_delete_button(self, context, cell): x0, y0 = self.get_image_offset() x = x0 + cell.x + cell.w - 12 y = y0 + cell.y + 12 context.arc(x, y, 8, 0, 6.2832) context.set_source_rgb(0.8, 0.0, 0.0) context.fill() context.arc(x, y, 8, 0, 6.2832) context.set_source_rgb(0.0, 0.0, 0.0) context.set_line_width(1) context.move_to(x - 4, y - 4) context.line_to(x + 4, y + 4) context.move_to(x - 4, y + 4) context.line_to(x + 4, y - 4) context.stroke() def draw(self, widget, context): if self.image is not None: x0, y0 = self.get_image_offset() context.set_source_surface(self.image, x0, y0) context.paint() if self.mode == self.FLYING: cell = self.collage.page.get_cell_at_position(self.x, self.y) if cell: self.paint_image_border(context, cell) self.paint_image_delete_button(context, cell) elif self.mode == self.SWAPPING_OR_MOVING: self.paint_image_border(context, self.swap_origin.cell, (3, 3)) cell = self.collage.page.get_cell_at_position(self.x, self.y) if cell and cell != self.swap_origin.cell: self.paint_image_border(context, cell, (3, 3)) else: # Display the drag & drop image dnd_image = artwork.load_cairo_surface(artwork.ICON_DRAG_AND_DROP) context.set_source_surface( dnd_image, round((self.get_allocation().width - dnd_image.get_width()) / 2.0), round((self.get_allocation().height - dnd_image.get_height()) / 2.0)) context.paint() return False def motion_notify_event(self, widget, event): self.x, self.y = self.get_pos_in_image(event.x, event.y) widget.queue_draw() def button_press_event(self, widget, event): if self.mode == self.FLYING: x, y = self.get_pos_in_image(event.x, event.y) cell = self.collage.page.get_cell_at_position(x, y) if not cell: return # Has the user clicked the delete button? dist = (cell.x + cell.w - 12 - x) ** 2 + (cell.y + 12 - y) ** 2 if dist <= 8 * 8: self.collage.photolist.remove(cell.photo) if self.collage.photolist: self.collage.make_page(self.parent.opts) self.parent.render_from_new_collage(self.collage) else: self.image = None self.mode = self.INSENSITIVE self.parent.history_index = len(self.parent.history) self.parent.update_tool_buttons() # Otherwise, the user wants to swap this image with another else: self.swap_origin.x, self.swap_origin.y = x, y self.swap_origin.cell = cell self.mode = self.SWAPPING_OR_MOVING widget.queue_draw() def button_release_event(self, widget, event): if self.mode == self.SWAPPING_OR_MOVING: self.swap_dest.x, self.swap_dest.y = \ self.get_pos_in_image(event.x, event.y) self.swap_dest.cell = self.collage.page.get_cell_at_position( self.swap_dest.x, self.swap_dest.y) if self.swap_dest.cell \ and self.swap_origin.cell != self.swap_dest.cell: # different cell: SWAPPING self.collage.page.swap_photos(self.swap_origin.cell, self.swap_dest.cell) self.parent.render_from_new_collage(self.collage) elif self.swap_dest.cell: # same cell: MOVING move_x = (self.swap_origin.x - self.x) / self.swap_dest.cell.w move_y = (self.swap_origin.y - self.y) / self.swap_dest.cell.h self.swap_dest.cell.photo.move(move_x, move_y) self.parent.render_from_new_collage(self.collage) self.mode = self.FLYING widget.queue_draw() class SettingsDialog(Gtk.Dialog): def __init__(self, parent): super().__init__( _("Settings"), parent, 0, (Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)) self.set_border_width(10) self.selected_border_color = parent.opts.border_c box = self.get_content_area() vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) box.add(vbox) label = Gtk.Label(xalign=0) label.set_markup("%s" % _("Output image size")) vbox.pack_start(label, False, False, 0) box = Gtk.Box(spacing=6) vbox.pack_start(box, False, False, 0) self.etr_outw = Gtk.Entry(text=str(parent.opts.out_w)) self.etr_outw.connect("changed", self.validate_int) self.etr_outw.last_valid_text = self.etr_outw.get_text() box.pack_start(self.etr_outw, False, False, 0) box.pack_start(Gtk.Label("×", xalign=0), False, False, 0) self.etr_outh = Gtk.Entry(text=str(parent.opts.out_h)) self.etr_outh.connect("changed", self.validate_int) self.etr_outh.last_valid_text = self.etr_outh.get_text() box.pack_start(self.etr_outh, False, False, 0) box.pack_end(Gtk.Label(_("pixels"), xalign=0), False, False, 0) templates = ( ("", None), ("800 × 600", (800, 600)), ("1600 × 1200", (1600, 1200)), ("A4 landscape (300ppi)", (3508, 2480)), ("A4 portrait (300ppi)", (2480, 3508)), ("A3 landscape (300ppi)", (4960, 3508)), ("A3 portrait (300ppi)", (3508, 4960)), ("US-Letter landscape (300ppi)", (3300, 2550)), ("US-Letter portrait (300ppi)", (2550, 3300)), ) def apply_template(combo): t = combo.get_model()[combo.get_active_iter()][1] if t: dims = dict(templates)[t] self.etr_outw.set_text(str(dims[0])) self.etr_outh.set_text(str(dims[1])) self.cmb_template.set_active(0) box = Gtk.Box(spacing=6) vbox.pack_start(box, False, False, 0) box.pack_start(Gtk.Label(_("Apply a template:"), xalign=0), True, True, 0) self.cmb_template = Gtk.ComboBoxText() for t, d in templates: self.cmb_template.append(t, t) self.cmb_template.set_active(0) self.cmb_template.connect("changed", apply_template) box.pack_start(self.cmb_template, False, False, 0) vbox.pack_start(Gtk.SeparatorToolItem(), True, True, 0) label = Gtk.Label(xalign=0) label.set_markup("%s" % _("Border")) vbox.pack_start(label, False, False, 0) box = Gtk.Box(spacing=6) vbox.pack_start(box, False, False, 0) label = Gtk.Label(_("Thickness:"), xalign=0) box.pack_start(label, False, False, 0) self.etr_border = Gtk.Entry(text=str(100.0 * parent.opts.border_w)) self.etr_border.connect("changed", self.validate_float) self.etr_border.last_valid_text = self.etr_border.get_text() self.etr_border.set_width_chars(4) self.etr_border.set_alignment(1.0) box.pack_start(self.etr_border, False, False, 0) label = Gtk.Label("%", xalign=0) box.pack_start(label, False, False, 0) label = Gtk.Label(_("Color:"), xalign=1) box.pack_start(label, True, True, 0) self.colorbutton = Gtk.ColorButton() color = Gdk.RGBA() color.parse(parent.opts.border_c) self.colorbutton.set_rgba(color) box.pack_end(self.colorbutton, False, False, 0) vbox.pack_start(Gtk.SeparatorToolItem(), True, True, 0) self.show_all() def validate_int(self, entry): entry_text = entry.get_text() or '0' try: int(entry_text) entry.last_valid_text = entry_text except ValueError: entry.set_text(entry.last_valid_text) def validate_float(self, entry): entry_text = entry.get_text() or '0' try: float(entry_text) entry.last_valid_text = entry_text except ValueError: entry.set_text(entry.last_valid_text) def apply_opts(self, opts): opts.out_w = int(self.etr_outw.get_text() or '1') opts.out_h = int(self.etr_outh.get_text() or '1') opts.border_w = float(self.etr_border.get_text() or '0') / 100.0 opts.border_c = self.colorbutton.get_rgba().to_string() class ComputingDialog(Gtk.Dialog): """Simple "please wait" dialog, with a "cancel" button""" def __init__(self, parent): super().__init__( _("Please wait"), parent, 0, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)) self.set_default_size(300, -1) self.set_border_width(10) box = self.get_content_area() vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) box.add(vbox) label = Gtk.Label(_("Performing image computation...")) vbox.pack_start(label, True, True, 0) self.progressbar = Gtk.ProgressBar() self.progressbar.set_fraction(0) vbox.pack_start(self.progressbar, True, True, 0) self.show_all() def update(self, fraction): self.progressbar.set_fraction(fraction) class ErrorDialog(Gtk.Dialog): def __init__(self, parent, message): super().__init__(_("Error"), parent, 0, (Gtk.STOCK_OK, Gtk.ResponseType.OK)) self.set_border_width(10) box = self.get_content_area() box.add(Gtk.Label(message)) self.show_all() class PreviewFileChooserDialog(Gtk.FileChooserDialog): PREVIEW_MAX_SIZE = 256 def __init__(self, **kw): super().__init__(**kw) self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) self.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) set_open_image_filters(self) self._preview = Gtk.Image() # Don't let preview size down horizontally for skinny images, cause # that looks distracting self._preview.set_size_request( PreviewFileChooserDialog.PREVIEW_MAX_SIZE, -1) self.set_preview_widget(self._preview) self.set_use_preview_label(False) self.connect("update-preview", self.update_preview_cb) def update_preview_cb(self, file_chooser): filename = self.get_preview_filename() if filename is None or os.path.isdir(filename): self.set_preview_widget_active(False) return try: pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( filename, PreviewFileChooserDialog.PREVIEW_MAX_SIZE, PreviewFileChooserDialog.PREVIEW_MAX_SIZE) self._preview.set_from_pixbuf(pixbuf) except Exception as e: print(e) self.set_preview_widget_active(False) return self.set_preview_widget_active(True) def main(): # Enable threading. Without that, threads hang! GObject.threads_init() win = PhotoCollageWindow() win.connect("delete-event", Gtk.main_quit) win.show_all() # If arguments are given, treat them as input images if len(sys.argv) > 1: win.update_photolist(sys.argv[1:]) Gtk.main() PhotoCollage-1.4.8/photocollage/render.py000066400000000000000000000237261465467221700204450ustar00rootroot00000000000000# Copyright (C) 2014 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import random from threading import Thread import time import PIL.Image import PIL.ImageDraw import PIL.ImageFile from photocollage.collage import Photo QUALITY_SKEL = 0 QUALITY_FAST = 1 QUALITY_BEST = 2 # Try to continue even if the input file is corrupted. # See issue at https://github.com/adrienverge/PhotoCollage/issues/65 PIL.ImageFile.LOAD_TRUNCATED_IMAGES = True class PIL_SUPPORTED_EXTS: """File extensions supported by PIL Compiled from: - http://pillow.readthedocs.org/en/2.3.0/handbook/image-file-formats.html - https://github.com/python-imaging/Pillow/blob/master/PIL/*ImagePlugin.py """ RW = { "BMP": ("bmp",), # "EPS": ("ps", "eps",), # doesn't seem to work "GIF": ("gif",), "IM": ("im",), "JPEG": ("jfif", "jpe", "jpg", "jpeg",), "MSP": ("msp",), "PCX": ("pcx",), "PNG": ("png",), "PPM": ("pbm", "pgm", "ppm",), "TGA": ("tga",), "TIFF": ("tif", "tiff",), "WebP": ("webp",), "XBM": ("xbm",), } RO = { "CUR": ("cur",), "DCX": ("dcx",), "FLI": ("fli", "flc",), "FPX": ("fpx",), "GBR": ("gbr",), "ICO": ("ico",), "IPTC/NAA": ("iim",), "PCD": ("pcd",), "PSD": ("psd",), "SGI": ("bw", "rgb", "rgba", "sgi",), "XPM": ("xpm",), } WO = { # "PALM": ("palm",), # doesn't seem to work # "PDF": ("pdf",), # doesn't seem to work } def random_color(): r = random.randrange(256) g = random.randrange(256) b = random.randrange(256) if r + g + b > 0.7 * 3 * 256: r -= 50 g -= 50 b -= 50 return (r, g, b) class BadPhoto(Exception): def __init__(self, photoname): self.photoname = photoname def build_photolist(filelist): ret = [] for name in filelist: try: img = PIL.Image.open(name) except OSError: raise BadPhoto(name) w, h = img.size orientation = 0 try: exif = img._getexif() if 274 in exif: # orientation tag orientation = exif[274] if orientation == 6 or orientation == 8: w, h = h, w except Exception: pass ret.append(Photo(name, w, h, orientation)) return ret cache = {} class RenderingTask(Thread): """Execution thread to do the actual poster rendering Image computation is a heavy task, that can take several seconds. During this, the program might be unresponding. To avoid this, rendering is done is a separated thread. """ def __init__(self, page, border_width=0.01, border_color=(0, 0, 0), quality=QUALITY_FAST, output_file=None, on_update=None, on_complete=None, on_fail=None): super().__init__() self.page = page self.border_width = border_width self.border_color = border_color self.quality = quality self.output_file = output_file self.on_update = on_update self.on_complete = on_complete self.on_fail = on_fail self.canceled = False def abort(self): self.canceled = True def draw_skeleton(self, canvas): for col in self.page.cols: for c in col.cells: if c.is_extension(): continue color = random_color() x, y, w, h = c.content_coords() xy = (x, y) xY = (x, y + h - 1) Xy = (x + w - 1, y) XY = (x + w - 1, y + h - 1) draw = PIL.ImageDraw.Draw(canvas) draw.line(xy + Xy, fill=color) draw.line(xy + xY, fill=color) draw.line(xY + XY, fill=color) draw.line(Xy + XY, fill=color) draw.line(xy + XY, fill=color) draw.line(xY + Xy, fill=color) return canvas def draw_borders(self, canvas): if self.border_width == 0: return W = self.page.w - 1 H = self.page.h - 1 border = self.border_width - 1 color = self.border_color draw = PIL.ImageDraw.Draw(canvas) draw.rectangle((0, 0) + (border, H), color) draw.rectangle((W - border, 0) + (W, H), color) draw.rectangle((0, 0) + (W, border), color) draw.rectangle((0, H - border) + (W, H), color) for col in self.page.cols: # Draw horizontal borders for c in col.cells[1:]: xy = (col.x, c.y - border / 2) XY = (col.x + col.w, c.y + border / 2) draw.rectangle(xy + XY, color) # Draw vertical borders if col.x > 0: for c in col.cells: if not c.is_extension(): xy = (col.x - border / 2, c.y) XY = (col.x + border / 2, c.y + c.h) draw.rectangle(xy + XY, color) return canvas def resize_photo(self, cell, use_cache=False): # If a thumbnail is already in cache, let's use it. But only if it is # bigger than what we need, because we don't want to lose quality. if (use_cache and cell.photo.filename in cache and cache[cell.photo.filename].size[0] >= int(round(cell.w)) and cache[cell.photo.filename].size[1] >= int(round(cell.h))): img = cache[cell.photo.filename].copy() else: img = PIL.Image.open(cell.photo.filename) # Rotate image is EXIF says so if cell.photo.orientation == 3: img = img.rotate(180, expand=True) elif cell.photo.orientation == 6: img = img.rotate(270, expand=True) elif cell.photo.orientation == 8: img = img.rotate(90, expand=True) if self.quality == QUALITY_FAST: method = PIL.Image.NEAREST else: method = PIL.Image.ANTIALIAS shape = img.size[0] * cell.h - img.size[1] * cell.w if shape > 0: # image is too thick img = img.resize((int(round(cell.h * img.size[0] / img.size[1])), int(round(cell.h))), method) elif shape < 0: # image is too tall img = img.resize((int(round(cell.w)), int(round(cell.w * img.size[1] / img.size[0]))), method) else: img = img.resize((int(round(cell.w)), int(round(cell.h))), method) # Save this new image to cache (if it is larger than the previous one) if (use_cache and (cell.photo.filename not in cache or cache[cell.photo.filename].size[0] < img.size[0])): cache[cell.photo.filename] = img if shape > 0: # image is too thick width_to_crop = img.size[0] - cell.w img = img.crop(( int(round(width_to_crop * cell.photo.offset_w)), 0, int(round(img.size[0] - width_to_crop * (1 - cell.photo.offset_w))), int(round(cell.h)) )) elif shape < 0: # image is too tall height_to_crop = img.size[1] - cell.h img = img.crop(( 0, int(round(height_to_crop * cell.photo.offset_h)), int(round(cell.w)), int(round(img.size[1] - height_to_crop * (1 - cell.photo.offset_h))) )) return img def paste_photo(self, canvas, cell, img): canvas.paste(img, (int(round(cell.x)), int(round(cell.y)))) return canvas def run(self): try: canvas = PIL.Image.new( "RGB", (int(self.page.w), int(self.page.h)), "white") self.draw_skeleton(canvas) self.draw_borders(canvas) if self.quality != QUALITY_SKEL: n = sum([len([cell for cell in col.cells if not cell.is_extension()]) for col in self.page.cols]) i = 0.0 if self.on_update: self.on_update(canvas, 0.0) last_update = time.time() for col in self.page.cols: for c in col.cells: if self.canceled: # someone clicked "abort" return if c.is_extension(): continue img = self.resize_photo(c, use_cache=True) self.paste_photo(canvas, c, img) # Only needed for interactive rendering if self.on_update: self.draw_borders(canvas) i += 1 now = time.time() if self.on_update and now > last_update + 0.1: self.on_update(canvas, i / n) last_update = now self.draw_borders(canvas) if self.output_file: canvas.save(self.output_file) if self.on_complete: self.on_complete(canvas) except Exception as e: if self.on_fail: self.on_fail(e) PhotoCollage-1.4.8/po/000077500000000000000000000000001465467221700145405ustar00rootroot00000000000000PhotoCollage-1.4.8/po/POTFILES.in000066400000000000000000000000271465467221700163140ustar00rootroot00000000000000photocollage/gtkgui.py PhotoCollage-1.4.8/po/bg.po000066400000000000000000000055541465467221700155010ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2014 Adrien Vergé # Copyright (C) 2015 Frank Quotschalla # Copyright (C) 2015 Vincent Bermel # This file is distributed under the same license as the PhotoCollage package. # Adrien Vergé, 2014. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.2\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2016-04-11 22:51+0200\n" "PO-Revision-Date: 2017-10-29 20:28+0200\n" "Last-Translator: Peyu Yovev \n" "Language-Team: spacy00001@gmail.com\n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Всички поддържани формати" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "%s изображение" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Добавяне на изображения" #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Запази колажа..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Регенерирай" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Изображението не може да се отвори:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Изберете изображения" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Получи се грешка по време на рендирането:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Запази изображението" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Настройки" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Размер на изходното изобранжение" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "пиксела" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Приложи шаблон" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Рамка" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Ширина:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Цвят:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Моля изчакайте" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Изпълнява се преизчисляване на изображението" #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Грешка" PhotoCollage-1.4.8/po/cs.po000066400000000000000000000050151465467221700155060ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2015 Michal Kovařík # This file is distributed under the same license as the PhotoCollage package. # Michal Kovařík , 2015. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.2\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2015-11-21 18:04+0100\n" "PO-Revision-Date: 2016-04-07 14:38+0200\n" "Last-Translator: Michal Kovařík \n" "Language-Team: none \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Poedit 1.8.5\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Všechny podporované formáty" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "%s obrázek" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Přidat obrázky..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Uložit pohlednici..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Přegenerovat" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Nelze otevřít tento obrázek:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Vyberte obrázky" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Nastala chyba při renderování obrázku:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Uložit obrázek" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Nastavení" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Výstupní velikost obrazu" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "pixelů" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Použití šablony:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Rámečku" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Šířka:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Barva:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Prosím čekejte" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Provádím výpočet obrázku..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Chyba" PhotoCollage-1.4.8/po/de.po000066400000000000000000000050551465467221700154750ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2014 Adrien Vergé # Copyright (C) 2015 Frank Quotschalla # Copyright (C) 2015 Vincent Bermel # This file is distributed under the same license as the PhotoCollage package. # Adrien Vergé, 2014. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.2\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2016-04-11 22:51+0200\n" "PO-Revision-Date: 2016-04-11 23:13+0200\n" "Last-Translator: Vincent Bermel \n" "Language-Team: none \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.7\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Alle unterstützten Bildformate" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "Bild %s" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Bilder hinzufügen" #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Poster abspeichern" #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Neue Anordnung" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Dieses Bild kann nicht geöffnet werden:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Bilder auswählen" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Beim Berechnen des Posters ist ein Fehler aufgetreten:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Poster speichern" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Einstellungen" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Ausgabebildgröße" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "Pixel" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Formatvorlage:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Rahmen" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Breite:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Farbe:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Bitte warten" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Poster wird berechnet..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Fehler" PhotoCollage-1.4.8/po/es.po000066400000000000000000000047731465467221700155220ustar00rootroot00000000000000# PhotoCollage translation file # This file is distributed under the same license as the PhotoCollage package. # Leonardo J. Caballero G. , 2019. # Andrey Novikov , 2021. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.4\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2014-01-18 02:46-0500\n" "PO-Revision-Date: 2021-07-05 13:10+0500\n" "Last-Translator: Leonardo J. Caballero G. \n" "Language-Team: ES \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.1\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Todos los formatos de imágenes soportados" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "%s imagen" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Añadir imágenes..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Guardar póster..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Regenerar" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Esta imagen no pudo ser abierta:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Elegir imágenes" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Un error ocurrió al renderizar la imagen:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Guardar imagen" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Configuración" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Tamaño de salida de la imagen" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "píxeles" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Aplicar una plantilla:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Borde" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Espesor:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Color:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Por favor, aguarde" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Realizando el cálculo de la imagen..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Error" PhotoCollage-1.4.8/po/fr.po000066400000000000000000000046471465467221700155220ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2014 Adrien Vergé # This file is distributed under the same license as the PhotoCollage package. # Adrien Vergé, 2014. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.2\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2014-01-18 02:46-0500\n" "PO-Revision-Date: 2016-04-07 12:31+0200\n" "Last-Translator: Adrien Vergé \n" "Language-Team: none \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n>1;\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Tous les formats d'image supportés" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "Image %s" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Ajouter des images..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Enregistrer le poster..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Regénérer" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Cette image n'a pas pu être ouverte :\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Choisir les images" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Une erreur est survenue pendant la composition de l'image :" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Enregistrer l'image" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Réglages" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Taille de l'image en sortie" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "pixels" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Appliquer un modèle :" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Bordure" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Épaisseur :" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Couleur :" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Veuillez patienter" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Calcul de l'image en cours..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Erreur" PhotoCollage-1.4.8/po/it.po000066400000000000000000000047031465467221700155200ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2016 Lorenzo Bicci # Copyright (C) 2016 Adrien Vergé # This file is distributed under the same license as the PhotoCollage package. # Adrien Vergé, 2016. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.2\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2014-01-18 02:46-0500\n" "PO-Revision-Date: 2016-04-09 16:20+0200\n" "Last-Translator: Lorenzo Bicci \n" "Language-Team: none \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n!=1;\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Tutti i formati d’immagine supportati" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "Immagine %s" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Aggiungi immagini..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Salva poster..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Rigenera" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Questa immagine non può essere aperta :\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Seleziona immagini" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Si è verificato un errore durante il rendering dell'immagine:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Salva immagine" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Impostazioni" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Dimensione finale dell'immagine" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "pixel" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Applica un modello:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Bordo" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Spessore:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Colore:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Attendere, prego" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Calcolo dell'immagine in corso..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Errore" PhotoCollage-1.4.8/po/nl.po000066400000000000000000000050621465467221700155140ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2014 Adrien Vergé # Copyright (C) 2015 Frank Quotschalla # Copyright (C) 2015 Vincent Bermel # This file is distributed under the same license as the PhotoCollage package. # Adrien Vergé, 2014. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2016-04-11 22:51+0200\n" "PO-Revision-Date: 2020-09-24 13:56+0200\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: none \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.1\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Alle ondersteunde afbeeldingsformaten" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "Afbeelding %s" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Afbeeldingen toevoegen..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Poster opslaan..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Opnieuw samenstellen" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "De volgende afbeelding kan niet worden geopend:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Afbeeldingen selecteren" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Er is een fout opgetreden tijdens het samenstellen:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Afbeelding opslaan" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Instellingen" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Afbeeldingsgrootte" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "pixels" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Sjabloon toepassen:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Rand" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Dikte:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Kleur:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Even geduld" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Bezig met berekenen..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Fout" PhotoCollage-1.4.8/po/pl.po000066400000000000000000000051431465467221700155160ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2024 Marcin Schoenknecht # This file is distributed under the same license as the PhotoCollage package. # Marcin Schoenknecht , 2024. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.7\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2024-07-27 14:06+0200\n" "PO-Revision-Date: 2024-07-27 14:06+0200\n" "Last-Translator: Marcin Schoenknecht \n" "Language-Team: Marcin Schoenknecht for Polish translation \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2)\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Wszystkie wspierane formaty graficzne" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "%s obraz" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Dodaj zdjęcia..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Zapisz kolaż..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Utwórz ponownie" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Ten obraz nie może zostać otwarty:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Wybierz obrazy" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Wystąpił błąd podczas renderowanie obrazu:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Zapisz obraz" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Ustawienia" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Rozmiar obrazu wyjściowego" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "pikseli" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Zastosuj szablon:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Obramowanie" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Grubość:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Kolor:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Proszę czekać" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Wykonywanie obliczeń analizy obrazu..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Błąd" PhotoCollage-1.4.8/po/pt_BR.po000066400000000000000000000046721465467221700161170ustar00rootroot00000000000000# PhotoCollage translation file # This file is distributed under the same license as the PhotoCollage package. # Danton Medrado , 2022. # Andrey Novikov , 2021. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.4\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2022-07-23 09:36-0500\n" "PO-Revision-Date: 2022-07-23 10:05-0300\n" "Last-Translator: Danton Medrado \n" "Language-Team: \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Todos os formatos de imagens suportados" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "%s imagem" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Adicionar imagens..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Salvar pôster..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Regerar" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Esta imagem não pode ser aberta:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Escolher imagens" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "Ocorreu um erro ao renderizar a imagem:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Salvar imagem" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Configuração" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Tamanho de saída da imagem" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "pixels" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Aplicar um modelo:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Borda" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Espessura:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Cor:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Por favor, aguarde" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Realizando o cálculo da imagem..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Erro" PhotoCollage-1.4.8/po/ru.po000066400000000000000000000056101465467221700155300ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2021 Andrey Novikov # This file is distributed under the same license as the PhotoCollage package. # Andrey Novikov , 2021. # Eugene Uvin , 2021. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.3\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2021-07-02 10:29:47+0500\n" "PO-Revision-Date: 2021-07-02 10:29:47+0500\n" "Last-Translator: Andrey Novikov \n" "Language-Team: Andrey Novikov \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Все поддерживаемые форматы изображений" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "%s изображение" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Добавить изображения..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Сохранить коллаж..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Перегенерировать" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Изображение не удалось открыть:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Выбрать изображения" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "При отрисовке изображения произошла ошибка:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Сохранить изображение" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Настройки" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Размер выходного изображения" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "пиксели" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Применить шаблон:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Граница" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Толщина:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Цвет:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Пожалуйста, подождите" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Выполнение вычисления изображений..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Ошибка" PhotoCollage-1.4.8/po/uk.po000066400000000000000000000056341465467221700155270ustar00rootroot00000000000000# PhotoCollage translation file # Copyright (C) 2021 Eugene Uvin # This file is distributed under the same license as the PhotoCollage package. # Eugene Uvin , 2021. # msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.3\n" "Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" "POT-Creation-Date: 2021-09-27 10:29:47+0500\n" "PO-Revision-Date: 2021-09-27 10:29:47+0500\n" "Last-Translator: Eugene Uvin \n" "Language-Team: Eugene Uvin \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Language: uk_UA\n" "X-Source-Language: C\n" #: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 msgid "All supported image formats" msgstr "Всі формати зображень що підтримуються" #: photocollage/gtkgui.py:104 #, python-format msgid "%s image" msgstr "%s зображення" #: photocollage/gtkgui.py:161 msgid "PhotoCollage" msgstr "PhotoCollage" #: photocollage/gtkgui.py:189 msgid "Add images..." msgstr "Додати зображення..." #: photocollage/gtkgui.py:196 msgid "Save poster..." msgstr "Зберегти постер..." #: photocollage/gtkgui.py:221 msgid "Regenerate" msgstr "Перегенерувати" #: photocollage/gtkgui.py:279 #, python-format msgid "" "This image could not be opened:\n" "\"%(imgname)s\"." msgstr "" "Зображення не вдалося відкрити:\n" "\"%(imgname)s\"." #: photocollage/gtkgui.py:285 msgid "Choose images" msgstr "Обрати зображення" #: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 msgid "An error occurred while rendering image:" msgstr "При рендерингу зображення сталася помилка:" #: photocollage/gtkgui.py:398 msgid "Save image" msgstr "Зберегти зображення" #: photocollage/gtkgui.py:622 msgid "Settings" msgstr "Налаштування" #: photocollage/gtkgui.py:634 msgid "Output image size" msgstr "Розмір вихідного зображення" #: photocollage/gtkgui.py:649 msgid "pixels" msgstr "пікселі" #: photocollage/gtkgui.py:673 msgid "Apply a template:" msgstr "Застосувати шаблон:" #: photocollage/gtkgui.py:686 msgid "Border" msgstr "Обрамлення" #: photocollage/gtkgui.py:691 msgid "Thickness:" msgstr "Товщина:" #: photocollage/gtkgui.py:701 msgid "Color:" msgstr "Колір:" #: photocollage/gtkgui.py:740 msgid "Please wait" msgstr "Будь ласка, зачекайте" #: photocollage/gtkgui.py:749 msgid "Performing image computation..." msgstr "Обчислюю зображення..." #: photocollage/gtkgui.py:764 msgid "Error" msgstr "Помилка" PhotoCollage-1.4.8/screenshots/000077500000000000000000000000001465467221700164625ustar00rootroot00000000000000PhotoCollage-1.4.8/screenshots/photocollage-1.4-preview.png000066400000000000000000014332311465467221700236360ustar00rootroot00000000000000PNG  IHDR ctIME#/ IDATxw|el6 z*(v=;OS,gy{} "MjI;GJ(I@K_fgfg6yf –-[j~?P]u=Z!B! !b`ۉ[nMvv^XXHVVIIIX,ƄB!9 (++c֭ѽ{wAȪU(2334-B!B ӦMAh 6m- :uj4J!B!VÐ͛7c2ٳg222|!B! ] t֍{%֭].|!B!9@QQncee%|!B! ]׉nK!B!͆C!BqHJ!B!;EQ0+"= B!BUUB!BwJ"B!8iB!Nώ;),,:{!6M0.s@7i nhSTTz`ק7pZ<'|t]g%_5;vԔv8Ԕ&!Cx?>BS%fRSS˹[Xd15Kz!E{˗SYU`OΞbBSFo:Zכ~_m~!D!::`0koϜ/qejkx2ڷkmL=0|>vCB|dB":dda&nVz 7wvIvzcnx!5Bf]\}ٕT."Ǝ_zWqj>ݻfqﯦK\y͵ K^}&sݼX,z~i钙>47ٴy35$'3v(.",f3EEżJ#"dvU˸K^`UDDDpa\󻫈B%GÍ7BNn7r+9$'EYW!Z UUA,f3ӦL ^^Qd$cGl_ݻ7]tD۶mXz k~Z+?ˈaCx=ӿo_HMI! 6^uu 5++|Jsi646o&S'V y7X,L4nEEkۖxlၺ@?JKKݫuuu|gWT{B%G )1{4$'%c-BBuul6ڶiCn]dL:v`scY]1b{1 |:k6=4o. (**fyrr^M0Eo3\d2ob* uXt)׬!66¢F~x߽~}гGwt]'o._Mdd,!8~oZZx!D+4} _7̽p{TTVлWO ݫ'wv{}vt`nWm9e(.)i@0Dޮn=?[2%B[Ʈݻֿc"CCk|[7Mu_hצ 4 lڷkw^8o>9~'Jaa91bx  5 g1fw.w﮽IOMhҠmz:]x5M;!ͻ;GCMݻ;x~Y"0vhc_?rzOXfp O/ %~\??`ϞFgRTRLRB"6m ~ѼG^Q]]jK B;w٩poǓ>̭2M<=zH* !D+ 6(-/c2n֭8?}{fԙ#!''z}wNԩ#%%Qv&-3F`1Mg67f Ʉ!|~?жM&=}z۬V;srz}ϼɖm߽:PQYALL &ȎgPQYɎ9-,fv߯/cԙgRS]܉a[V /K!U_ɓp89NU_vݼy3^zI $Bt^}M|]nFN$ "G}$OBBq򨭭 ,H!IB!8).2"mӆ]TTV2l`vD!N"x8ctt6lDLL _x^I!8mxBbc39 !Cz@B!!B!$B!B&s@B!'!B!$B!BzdB! B!BXBRB!BqbKJ!B!ٳg$t!B!ĉ#B!B!B! B!Bq<D!Bq".= B!BG!B! B!B @B!⨙t[RRR q8)C"N.nvϖ-[())Ka?vڴi#m)ѣ-oGlݺԩSZR~C };w[l1m4i 4huh %%%L<] R"~c W_}u&CKkۿvy+))ibNc…MSL LS ?Pܚє# @!M6Ǻ| uvf_"N.GZ[RΏe]˛kG&fڦ .N!My3K:Pw4:'7;+x9D)oBS7j!BB" "-B!')BBW!= H|45XN:I-YO&.DEEI>ºwn2!FH,mo ◚> {Lg3Ep~ۘϿIG2 %ɉB~c}lQI̺ =Y)NjTg:'in5_f@XV~eEGJtt4(,ZNg$`R`!#G 4n&xu,+ 9hXܹ3yҴ: J(:ڶ"IχO\X6Oϕt XL64]e -U?6XL"9IbL^ft 47(y-rd QX&Һ|.e󷨸t|0U&FV i|>4M`ؐ>?PB qA4+xWtHJLbi| 8:wle L~!aÆYLr.Yb[wܵ8]dhk^]=, }n&{w-Kohr9>r'qbL^8Ħ" @dbzcu9tIĨ6 0%y HҹF % a٨bW.<:IɤGTl%H$1>fEQ~D\XmVt]GU"_q 4:wPh))|KΛ6u G`h]i,U-췍Cg0$3ɌF }naAܹf & K烯~&P@:u+kA!ZAt`>#쮶(uL1T%ݹҦPbd; BTD2 y:[73欳 BAf3{DGPUUŚVqF2wd@VR$XQMӘqH~?6v Î+2Wd4w%3Ѷ HKOG~VUe5{ 6VOkj5(^{}LVU."DzsUWr \{%S# .ngp#&%5RRS0&ƃU[WKll !ňda'>!(jkk=55[X*׷W]v YB>8ų9¯Yy%۞=VgJ+e1EQX>373쳹-SRZʬ/ʕ̔0eD 1ݟNw F4J-D?!-*b0VcXa-g' *7m`ቬMP@f\|)L&

k~JLJ};wJ']ϥ稗q ɚE| \QrYqŤrL32__bc}wbVYÀ~i\yEl61* ԛKdnv8^P.1j7Ź0EDNlС#`4((3,xntMEw!Q5tMG5PAɓ)!m9sp{㶿uGc^v\ÇO>`賈9STqgOg錤}|iۖynӾ]}z#))EQ۾!X:`蠀`O+\arr0BӚY'KywͥSǎM/=; BqOh$Rxwýt&|⹃a+'e̟0釸JW ?qc2p'xOْ#^SSӢ]DvM_umaw%yP^ +9 ήu[h;c21=::y 5:3=7n=6m:fȚPL^dNWSP𢡵x`-DY{:_v"O0d2Qg72:-7tpk*ۧ}p L#c08{hLf37xCxɢfאhć6)N:dtdMQa1cLn&| RS8p m0/;8a2*&.*ȑPuB@{N7el(Lzp!s̙|pQolx}^bc_)jqᥗ[ʀ~˙9c:,0̑Ӈ?]t֕o>Ͼ"+VDf^0sƍ[opbڵ%{V^y9:d/UXmVƏe_Yz 6v"::sƏK.nՕ)RP }09\q],IxLddZZ|X,D\DGGw3xirɣO>KwZ̞3OPHi2?UnL<~\cx^gU~zu6iM{0j9+5YfYd %%StyLelz/ %c0fGf%TJ2ΪVoÆKU䫯ÆR\) m' fNS<Z$b=՜Ķ5^VQN3g\kjjlk?Y.f֟On}%V\fc1`oh߶l知CFF뗕sᥗs嗱Юmn&:gvjֿp,Z4ܾ~Xr9c:wvURBx^5|1wsn)vm2f $'JHKOgWpFDrI|'D9(iydH `e\rLL&#C rW[X58.={hZd.-+eΝλJM9K/⫯qns)dryIRRݫ'o kt:~b6goh??F^O<,63SRZ?Lo~jSY ʻ}>Cک;o[*R ׷&L`İɹS0w|38M8g8V+݇͏C @aQ1* }!w}? V;﹏ "|ɧ\_x ߻︝^~¢"74!!>2ӰO[ocƒ(Eu[7w6}"6 AlYv~}%~&tz;Zh5G i?[|9-XI6d1UdV)!(؄9vQ*f r1~Һo45躎l&`>`n(â%KsQ\\§?gIڷ F|^O< V.w+2-fSv6Fǜ<;w*Cڋϣzߺ}kR">sN%-5KOz@;}x\) >ܹSc6ÁD8,k4p|1s,fMs|]aM6_TTD?y4Mcȑ,^6ҧw/6ggv:z6d*Κ~oaCsƈy| 2.]Yv-[m/{ֵ+Z-[0\ΝCSrWl6n=wAZZ ѝ-SvoWq"5+|bEQxi>ۛnemO{Tlyܼ,)ў䤤pᾳW|9{/ٳ!)1.;7'̼Ny֬ ?M77K fQ z7bظy3O<Cusg9>ۥs&qqqTЧW}lا3a躎4=F%==~?=O_H' zzu``3#:V^liKd͚UlذΝHh @=yXQ6uj,ϟ@.oϓ[~F~h}z`^RSS·hUu+,M׍rPU5|l4Wdɲe;燗Q^>FWKf&?/*_q{w_N[uT EUؙe˖g^ &}?nS:trLÞחy,SN:,22:6y¬( 0bPF9] 7˯C6'1u$i*XwduB;o~4ozZ*yyDGjGm4IIN Vrptm!~ UU17q8݉O삯_DHٷR]]}+3.e:{7FLꪶ+t GLKK>dDFttj}q*Iurgeu`O6.*L 55uԔ- BQBћ&ė0bN>|L<7m*wo|~ݤ|n8fԾƢ:'&$۷ɴ7~CZ^tEit!pe[{(jvr,.E4+)̝;.&x3?#NuM5[dݻ/M8n_1R9/Щt?no wɮT冿Wfc6G,-Y!`? )) }:4AAQ/HaQ1<u.VMPݠ1x ~VL?҂d( $'&l*Ot]gȑ}{^33[ni> ۊ`21`Wb=v4yv!&s2Zh'O, nSłhl1`jrPd2HmCQu. =0~zLyD8cǧ磥۶m;I&vגHbRK.b΢%ߓ%.]3"bBfAKUUCbgOե3 $%&6پ&'Swo[P.voN^u73gL ::ov7&+ iJO'rv- =Ȟ=ӓJn-|}oIdԙ#߯Or%ŒeSY9G{MNnAǛ4.^_c46d/OW9#_yoE^˼4e":p MӘ>c:O>$`{@RwSS]M꣐ < wz,HچQ[^=zh仅>t(=_g%::Cb41M~~ÿFӿo_ZCTMcAt Gxgxͷ0*:{^z?C?{1NvwR:fd؃p:[motU'DU R咓CfIFFUZBJM=tjeIj͚Mtt4;grӾ];`ys3ƌ:+|l.?&֬aX,V ̟xUUyyyك^|Wdd{޴lظ^x6m0_?"&p=x'Sꛢ(t =x`0GAT\G30ULz5yW>Koifce[—> n߹̥&1!+/{LҰcB/|JfTA(U߅Hc"f ɠq& Æ g`L^EŅ 4nYٺ}+s!&&T.2[ߏbe糘~9k'=w 7'bcK/Gx萑=#<3Xf~>B7C|$:|C4UcǛMeæM<‹mh#!m!]_,_H\Zo[71:&=@>beL8g<{ 4:7:1 2Y?wW]}_ԧM֢ϟϸq7Wi< >Qz4hXVXtSY? [9)BnɄt Zֆ 3xB Ptt4'8N,Kxn߿< a2B|> ,oA\\FÁb 6f"""wwRU`GsW_1~_T>|9sF> ~7\4}Fcg/q!~ 벞~'Ǭ6ͬY]yL8 MtaPUmߝjSX@#ӻakXp\x^~mAԯp cG͆餪 ]׏}mxs4иٝ q8&=!xEqT4,YG}pdoB0`1TVVyS6fo|$m֬YǾDuR;b{OD]`~㾻13е;hV?_w IsV7Qu*++]`0PUUu+tM}?UU):)sݍ|cYF˯[J\\\\nA(jr<R[s5 \sҲղښC'Wy5' i{`>7lpq4 fS$Axsx`Y5ʊ8{@Z"4W"AVo`͢LHj?x'';UU< i6gٌn8o(baDD8y79g$`(`h4b6g|ٛ~}7yC`66czlVkx~>Mhq!mX0o=-=b}۶ob0I 7'r;U<³X6n!<ׯ̋Y ՙ oq n.p5-^jڷm˖m|\.-MDz24Md25:v{,z>[f7jM&۷ >}ZiFͅ Tt=~O`&#$W0S)#Hpdtkx%օur*0bHfh:gfҶM;bcx+Xl!-5<vK]lݶ~e_$YmtVo]-:Ll-e@8}c ivSΝN'F?#7/Ą_މ_k1 XVz NLR^mhڵkf;?5eђ%"9)=MҢ'*,f _ΛK~= ۵Яoʕ3bٟfQUUպ!a'w')WG?UٌdnхvəU[cܑq^/GMp/Xl9фl!""6mHMM v>Oea=ӦLn4WS"먊¿O}  I|>o9VYv B$$$?!}hW]y5o{>IIɨzHKٌ"++ld2Ss咙31LhF U$x$$$p8Xf-wÇ|[W-[gnqYUU{ ch0Ib2p\8 @N2Сc8Np Cxljb۱Z'5cyrEM Ti_:y/{=T?: 6 `sFz֏DfV5<]9^WI 1{s5NEE8U"^| i c[ Vyy7Q[űM'bGDDuDKˊ8k7A(jSri f/.+Zvk)o۷o'11=XW&55!&&FS ޺uZGmݺȆ`Ȇ  Ct #C"N.n֣Gl… O[`!m.o_|Q6mZWp:Nof Ҳ"N.nv iOTy5k֑OBx~T8=u>t^hg&u4|áG8 wWcr@݀ǹo q`@?gBqcV3{jPL ]\a&f#*Y RbPe8.<~&UUqbZ{=8TU%Ɏb! V XHvPk1^wvpưAxl%DAC )X&,3BAȞp3NÁ~]Q$::͆`bs΢Q0(J]aP$ /AŇŢcZCOCmT4v~/dI=X{vdgcѕ&hk,~ rrr0 h F0(MvTUf7ᴛ9a"+!">.}zu(4, ZHbBFvV zX,^Tk R7*3BbѨ8׫|#77pƴXq0~-*~AEF~i( +:gX-S 9MH[L^y{lXgɳOtEI"{RbrپB^;S&'q~:Ő@Y;4lmtno_C$5JwT3&#]H\DƄ7hɉ腻AP1`¦&uF[@f6s(J6;֐f5"43mcح6Ɉ늤=E8RSTHzW !:؄hb2딖A\I11$6ZvTRQ\^Fb`Zgt]'{:HNI1/N ɓ'׵k-n:I1*|7x<>f੩&oW1mHc )6it ЧOBma3tPg5۶3eU*ŘftK(܋5ܸvU?,+RچKrwl*_-f\β"t#Zk%R ΍XV*r>{7{!{%DDxnjʢUGF^ >/+Hay@i4?VyYƃ'utEc0(\$[kqb\.:g sEx A^Ј/!j[,^L״4QB~#j0uTU!""`Џ("#X,X6@dĤèVcNʠ'a5@4l&cWL+͆FT4UET>/j|*3>% X-ftM#2҅hbCQՀ` droxjL-f"v+ȶ>>owߜ.. $!RHmڢ5*Ij<3US3%g5*ۢȒ(h@"^܀vNsƸyGTw^kɂ$+ly JX5&bE5 IDATl$IHKHP e l6 Q%( JJ!#2}VAQi>;"n6dU'\Nz$д ]2b@WD2"N>OsAZE4Mv"4 }4"I8 Mc <#pȶCg.Wko ) 0}Uq=L`H޲5sJf5?{z{ "smt MeFffxJ >OrczCrIPC'x5|$GΥ&ܚi!Ơm,x3g|^s}N+Wh#ΜKEt# \xE{e"\e?\Z'EWM[ /0:ZX"Ψ]Mf&$(x+=6#IΥw:@z,t܀܈fIDty$ (߃0Dd$|0&%ctdJw, ^(GwBH% R[M2zDA196Fb !i}D;DAT c:>Rq[ [[dffo6%kmCA nOIϱvk 5/$p55y>Q, LGZȞJ}&xʀv5fiM/y^k;'dEh hzQD\T@S-HHf*$+̽2rܭ\ID&"$I@u0 b4MCQdQ$r]tU#B8&#|IG081a0lam2AV\q]|/ĉBl?b641PsISIR$ HSF|.Ȓ@NQLdြ.% YF mFU:&ik #97y~"K2,$ "cL0 5dADUUdY|0 cfeW '_v@1Aɲ0%H$IeZQ!"J̍}U֐E;oR37wez6S-߫)JJE4M$ )&N~ ''N\ekcצp}/1t\|@ON3:2I*G`{H _8ˋߺEZ"qRlWK4:GCǰ!aP0=w"6eڍyFrV(PTk|%R,<=66Jc)ʁIWDvGX|kP]d3{:1h5Y3d̀fKn! 9g2OI.9J.3;}Gp dnydU˗>E t\X3VrcDQ2$ AQ%>Q$$Y=+KsׯQe,n؛MN鰸J?p`(' v]Ȯv K'x/]0yC`nlo?'H qi#du!v"&5S XcC>r _gn@nPeiQ0UV1 (p]UIX Av.3fe_y q kA0Y2CvtV"gh'誆ef{Ob8G>=XY#; KKLA%dQb8qa;hGjƴlFd]53' =TYCkܹݣI;dl|us*^I:p_fseDhm5H;D(,_[gbsWeW>;l0w@n">ܶwW* ̎COU~Œ[ycS)71Bg(bK%a`؛4EXy7Or"OtY-lמ&?B8J᥋ z*&^{#`j)Ѡ Ff}Hg2ϳR}ӽ2KC+[֯CΟ:ϽRy2R$"K2a! 693 R@1 7E^|Ba-"gN\v„@;L( Ϩa>Dq]2VϏrVD848X!Fo?߼j訊tg?4/ߐ ̯Ro.P4 !e)WktmT9풊: r}6<@xz<7ƣGGi>KZLgT\Ad~q_/scx D5S^m91 K1N}?ZKKS !$CV;ĢaDB?ƌ'ߺv Q􄋯4T0–l<͗Ee2H\gF tDh/x\?o>SggO~xs}+<wRAe`AgHiLVSH<S0UC)T$?2_c ԰k_5^0 CGqyeQDq""C( PUYJS6#A;0#$Y)f\_MfCMAkȊJAPBAΖ)* Y]L <UEDLD4TE!MSDQu'#L)hG!2 e8 ʙIo.4GX>Hi=֮')Ya,# `zɴ"^ SL)1BoBhoS)E))J&rxeA1Z㺓ōwSfAoVcWQMò0fƠvO08{ ls|{" ITJ|AT=},&bk_3Dy_xP`drjK?3~?ë[$fOY^-P,!fY^bm} ۭsRw__/ҳ\n\OnO޳lR-9sq \>W{[[niuV=f|0愔Mזٷ/?#/rߣhs:3*(ZncR~^!2'ȏo;,2mU-JEy2GH iLgjl(3F֢g;dM3ghBENOѵ}tYd{ ^!(EKc|?"$I@%.ip} $gϲ](ʕ+"YVֶlC:=R*rZEt:4\+pD8p].jW?)YOsk~s^{o_tH0[X"Ѱ+˫?S&>iEk|O?kCBE(S(3#׷oy/p?Ϲ6ʍ6s5eJFT$/E|9JTFGL"g5>~L9B~gD>N}i@9΢:Jp]rb%УXRɽ &&G8^'{ݰ=wcۿ~cO'MZjS3Eu&>Ŭ$Q@'dYxe"&ٚ52C9~Wx~99Q)%>o*+h{&O@ !LϋHPg8īN҈D7dilt8 *Qu%eI>9C C!##ETYE!MEQv c;~YȘQ "DA3T>D}=ilooJh6$Vth(KKMr+tRF`(~@8g%y4YȄȊIMSona,>)=JYqS4ISh m(?"*I 2>AUcccUinnpˤضMIܺy hlLOC.'^U3XX[W, 7 Ye&*:ə,=t^ծwl o)}-/_ė"ǧc7B.amcJ1 +2"%%&Dϛ|*("Z kP`ЉD{-7 0X+\yq 'gMhIsi Ndijvy|bx96b`<$RIiooqgH|s{Y\B0>brk\&*cn@!cg </Iq7^(,!;2wy9|IuITcĈغ;WXx&7߹ʥsǓ?CGȒƌV }$iPD8% ` 6VUF> ]'@GƐĄ7RșXFZ~~U]g$cqhW_f M^2> %gTIE:DHq}Kڭy|`EɾsOPDKǝ s-`kkR`+r4K768:rꣳݤ4`C =zzKHR 5u*U.#Zo }ֹv6쳇?)W(1-pfTGOի,]$ Sݍ V\}'8z 6Ԧh p"m㴗߽$<$b\$ ɏat* CD(]UnA6*_o/w93[d%ME|~df84y$F-dgQ3&5&H-Z@5c@@w٧ g*$, -FbiRdHSR0B5TUFUTIJj C$)D%bdMCE[J% S8(.]dllN$$OzY')gydrrNd}ySC,36zorkm6ǧK8^M&򀖥0{s)BuXnX<l8_h$akE+pxʵ[vgtYGϗquM!^֗[ܽҡ0R n=9^/቏g)MWo% eʞ!K SN; Qgx`eo:>:RWX}S,,(ev*vhy2[+ܽ Je a d$b\ևT4T#D_ا!=jvFC&Ws2p8DE$& CLI!QB?F2 IDAT,g3?@"<}Gtf U]Fz(dO?MUik6R#35Ҕ|.G*KlmeֻMRQDL2DN$s FTPXi*؝&=g*a2a :!=?}[Ldh]Vh7{1e.j@v 93VV#bA XXdӳ#&K%όa-ۡ\ʓXy"__ͳ|~ވC" lm`tqȡx8q?(Ϟ{*o%#i~_G9'8qbb`ZTFD)e ^%kG&4L>v B@E6\Yhu]XbNP{u^!^ԧTz/oz*~] #?z/?/eJAVMi8y;vZzj$ee}!9 ~i.]Ɖ=zhjm YYo%>W+TUӯ!jS|F(a"gScdMf|?KKk&(e-Is( a;a Ye: )iS u4ND$(01 I~ojQ` dxIv2DH׍q<ՌM)aH֯8}xIafb!vs MqIUl\ODazȒq纤I$hJ$aG &]T1rEMySJDA@ZP[+ _d~rI37oX<QYl6S$A~~scu} %NrC',Z߼7:a[ >S1nwtaswc`S^n`R6]K.^H 8Mr)n *$qH{nwx[7} 2-7lEL"ttS#F.qn_ddOPh=5p}h c qM4]*{PY^= O>9,ul"YIJ'$i,+ĉP4 ?$`CR2( ȩJ 2:"`ݥC* )#5DADUT8V( 3MJva/Y][a\BTRf4[DN" -@"j4[HQ/rD% F"C!Dz]RI}x )PDB'rܾ}a ]'@&LQ drT'7+WRo;$NK^%7} `R1ş><;93ܝm^7xkfrfW^K٘Vw_~?;̌xQ_6^3rWfXG׈̼E2]hv02ԣ>xa*cck-zJNĨVitmߋ:I}|ZZ C]P‘9Nc4k :UI:_w٧i8J\@% E$I"cdYFU:fSv ˮ"*!מ%i:D73TÝ;p”%,2U9 CILəQx23G,W|չ۠4\k(QvN=&N"se&:( I"!ɒcP`H"q(b0 hH0 EQT4Q$B!x{eiҏ,!"J6dUBvnHʼa{' F&'PH$MX$I\D6*a&# "QUU\'<,4MH=H:NjIuX[ (`h#8Z0>: bɇx}2K? W˛suK{ poݻX x;#}3!}f %;q||L}Ma(fug/\I؋8;;p:^ɕȲH"(JBkk* #$A R"N|07i_tH␳fX\  Ưiט=k[4V;8r;s |#f!Ϡ\M(!/;HNvղEd[y2E 4Z(l$N<_hgyf|McۣZ12 b,K DzQidYDY2p\Ƭ %`躔5DLd,SjdQUˆvs3Xi )[MQB*Hr;co|D{tIӐc,ܾhm?norZ}QESL27wYQh6[( eqhli./sӣ,5)H .R(pQ͵].jW?)e+z.m9|YKQ?_8q VΤsSG! C2~ Vi/9K\^4;"r;;m((NU#xUannmd/?G2CGf˯^ȍ"s{ɁclJ0Q[5X&62D.q!Z)*&HƠ jZ!IXVQU 0k~y?FߜB H~ghcY$!"i){^ 03@6LY z )H* h-0~h1X" fw ~Q;.B vF!_ibQ*o6|a q?{IiDigA^$,LbJ$);ڔZ$DE#b6}ڮ0A*t=(f-&:%&iĝ73+%彋lDFTgeeqo.4=rXPJ$07KMBQ*phIHSAĶmhgo >&.c64s\4Eb-!NR-QdAC,^6mt5])xV7^{szOh{-dYXdi*dv4[M2r"E7"[r>y%)q}4 : VpOerBl$1n4x#p`Cnb g'&$iBI-b;}\z%#C 231'Q3縹1\9}G߹Y]HD7=蚆 xIK5.H ['t;}; =n_Y Z0GdsyZN! |cw@JL̘l{WL8/m/w|S? +ihB \15 GdsY:G'$ $)Dڴ{=TMljC\A`ZCP0ŋCڽ>e_>GD80pxH xFșgn~0 l/p3I?Y#eƇ"I=c^Ͼi7xWp].jW?)26R\9qb/v/`ء=FǙ>71t)~‹< SAMLm>|Ơt.ſ[nQHo3J|NUu*vu7GDIYT2E$[#l˒X65KzlsA %p/s꾷suukp5Ώ^WwM8$} s*f'/`Mp\EBw-2Sof51ELGcq݇w DZqB=O-:S;yo'Y]X<;h+z,I9y'e:pؾDY"#!]#δIOǞ~-ހkX*+Âvq c(t|(͐4X5zAJ zIN >ri q=u0DPˠw ~Jsw5W4<q(J-B}5h#I:vM,r/|YJ%~W)}0Q)a0c+ʰr<`L5~( l' o6cԬlQ%/[9ѧ(TMSV&LDn&K: I(fKQ ڀ`i12d ꮓ$pQW]0D$DD' WC<[iF>'en:yNL]0 q(r9l*l66hn4 ,CU<%MDN{Dˎ i,-2"v8sR^*bPU0 0st1 7WHI92=NMpu}kĦBY X݊(MD]^zmO~8NHm$&#)   q1[/Q)$Dbfz Y ]!~6bB.G D9rV'di=䄔,DT.A2 1VauLY3H҈(IϏ9P4xɷqidž(ah E!\Ő`ܢ/ ̦;x,K}ll_^Hf+?D &i 9m/ÎbHQ lv-j?G${p_GLV-* qO^c6O6q=`yFI& \fny#:q(O:ygvve&iǙ1G%ʹ8o~%$  'NnPJK'9zo4;xċ3 ՁLi=3DЍT$ /^Gr i_s_wZwe8r(@L^C𱴌E@JFFaH*$I|{G1h~{hĄaHXBE fgqOOo~ '~{³'v% ߬ѵ]LI@b, 'dC )tH",F$EUY#c &Kdr2"4϶QeC}瑸0DdbÌ:6$stbg qy9{zIEeDICTUCMDIFD8#JdL-\!O14 'ATLdAA HPWΜh(tE%33 K0tZ)dr_ ꓓu{ h z*a9|!hYi:8(,C ʥ`9/-VTF+4׻Db T_ƪyoB7^7P$ TVSߛqKRNA#w|%hoSkl]Xə9Bۧ8J@B+Zay- '~z{v'KݪGe2MC+hZ.ziJiFb9Qpm6s5R8% aa }&gCz^ "A0P2)w&R{㞇I5C$Ʉ\@EL 3nv^$n4h;A;'`"uM2zmeO?VgsL+GX!|nvx!GB 4HNHE+ Fc=Wbc}VrjuT] :kCPٷsG9t2p` 71s)1Zpmmm} qP$ :vx}H- oq~ib+YY\uoٷ.>7, QR S7)-dIvm*Q(ԉ>?<=:ʵI:W WOη{gt ?BԊ6BCz$nH+Tqk/rٳl`@Cl!9MDd" " AbS.4shb]|?v|xxs)fM]bHA HM\U׈"YQT U۶Uˌ( #ܦ, bFsc75rx$Q(a"U,ɐAdu*;~W IDATuJqHU -_3ǿyRIE/wma&VD[đOe+|CU8摨(@JDѐYE. ):_g3TeXy-ɃXCuzr] !M0dqBbTi[kc̪6Q1y3Od$YBD*[t#@-yAC[YF{Ȥ ѡͩ'Wȓ"P(^Mgm% "kk.H)HO"?xIdx{;)`fZwuGj!2 n KccHJDQ$[6~xt*00(P8Pq?/k^)8bώLVb pVrDck" 5 Ft}Ḑ{V0#PtCakq otOshg˒H/kWI 'v\67rW.dme Mk#Dc>tNc0RS2&Fg`=L׋%YJ%5e!xFGj\YRT.lqIvkΎGi4]CbY!2@@D4&B2dI$TU" V%uHp8()"5DU[m$Mb#;ɕjܱk9PU h;}r9յUF4{=(j2CdAdXT}BfC$|Je\YZ1V[^͞ˌܸq3gaYObA FGQ4蘆I#X& Ə KD)DYL# Q7?qik+<~՗S_ǿd n+ 0p/rX*Yj!fqb @FEǘ1WcG*B4b {mg\T2LZtܘ*%Cnp٦ZYE T~C',zhXI Fu O20knoR}?^zm$\kk=?sBܠ`Hx@dȊD&ȒJEd$(yhBD$I H Œ :[P4 0h:}FGGi68%enf[@0<]אT@h^u]Dv2%Op3?S٤Œ5y>LF<3GU_֦'`]es:a@%(`0u=u(EmMDh[2U% C!#"DQDuJ*iI4 vC3ѩ!y]!ɆnTIQ/j(+70u&(* "G* En˧F3J(Q,]cF8(Xapfr,) 86kXV,MB1V7?ʻ9XAKe]qc2u7' zE8dcAje67q7h{l6O4( l©9~ӓw{;̽o:o\˯, Ri@` bCS~kWV"N?p{ϢY8USe..w>8{i.F W ȩ Q1*gr1xУ!.yY0 YF$ijDq<đEQAX.b&iiA P4ULA(F"$9FdQB+5JFƸ KQĹeb?E*9{&" v=cxBJ: H^VB`17ة*l64{Hh"J:wN13BF ju^YIW+g0 /ѳ[,.\ceÉW ]G666~TȮ;z}f+k?K᩿&Gb&҉8u;PhE}*igxˇ~xOȓΎ}ӑoz,Sm:^#ȉɗ+c}cbb:MN>95BN9l4I)xKE$i fmBQ({[./h"K^dttO7311A}UPQ&=P(*P41E`q/ivm$Y!'I+ 1B2p~(/{ܝ$SGpn7μµS1y8V(zL(,CӴW]~< ,<&JzuDm 8|?4sdž\%6dUͳ˔bjxU$1k4ǵ&l,Qdna$>r86 Y]8f7ɕ9 =o1sssz=lOb;t=T@V5n.\`R$(Y9tUP48F2?5I\=' PUiT2R4p;Mfdn%N"8$$Y"H]ɖPb+Z42;]1J3&;9Qo9< GvqyCvԗcsǵ}:<\袩2206c4M "LKGTK$~~*+dqJ&/C3fK>[_E^b~Z,eyLTxkЫdJl##f=( D|/HklvX\l>n7u.5bI]22&:)s5^8f̾&'}o-H(dYF&@@@ɷ4%2,C$Cdt`=zhu;T+2/^(k)3qc,6[m ]cT5S؃>PT^,1?DzU886:gV m?=92ֶ !p\HZ(JU4XlfQ޲EU/`g32vO[uN_lclc?:dn*IjE;Oy>7_^g?1[~x{_f(_x/>?|,݃~ A+O?B%&)hJy,,b;6Jx,(s[dj3*AR̩Tf'#6I,Pϱg71\ohFN0Ty)F&a:.=62A!h- %z&ɇ;nU8HE?+ t0b|5kw3zߣT)*8%%[MrqcMW$ ű~蝬m$*Lf^3Nr ?ECD\S0-^l۾mambs~˨:s)4x0Q:eJ9P8!)uSbI'4rR,|DUgssEEBǣVa0EQUd&I :ϡ$i$QDku^aiyU8P61 w$!!'Eȡ*J߂e&U^|E,"R,&jjscj6H q*zm'm^ZQgBt FESV0[[&C(`o |[x"zB qEx.ɲλ"%LLa5| YU0x==!Q#o߱HL*I !lI q$ |?<5x"RȎ&+Bb-"cNN`zDFAbʉW2;mued;v!fZZ`G5FasO`FʮYdk*M?Z3--7pS4"2?8DQ!H}AFoi!{YDq/jHCF+E^}NO2DŽ0a{i7 qcLFy7}mcŚMC 26nc Wǘ8pcR(w:nzQ ĈWYw)-tYulI$ضSdu$Alj.Tv(,m9F 㒂 v:pqao@O=VGv٪0#uUaD{8$K,%Z#E.3o00McɑEƃ5q;XFR :fڰؒ0 %0E = t,CSX]a YfF7N0j8=LIt1T`tU#_Z&WcySL\ii"Je$iU\gn&f vc 8!2.qG!VrEYEZ0 [6[8V{nMCx\Uk*kI )y7TKE)F@i JHHnQ)O :JJi1Y=XxJ}.<_Z$괺>VރH].WAwA(q\9,Q ARZm[r?8cugxg7o؉q:+]?8D*j$nBZ`}å6<2w@ss YI8-_QJuvT19yCrC= kLDh i4 R>d/_QuX|my>H" +<ɲ8I K },MH(ZmaHD=爃a')ns4 R266cCRǗ%Vm^4EDE7yPX |2# L#Y(C`w[4bpixEig0 e~pk6܍0QV创]dP}x3tz+ݻ1S8WVPe4Nݹ A rmj`QaLXZ8ZT yt=ϝ?4֏| ?YO?c'rX_:IG#(Yq^ERRE20slU֟c8?Y{IV_g<ܿfzy}ddSRDH/F<iB&2@y~+yRĽq0+DV o3tTEQxBLIQd((TBBj5<ABtV6t &9z=잳E2 ,&lFOY GD0"B MCE(&}$Q$ C')QD]{ i=bXFn.A.x-)JCfD7k{8&Ϟ_'U˜돒ߋ뱷JEc BQM0DSuQat1M/J]D+q*;~k]wY3;͌FKDUS|wA]fE`on0>5A\@K$!!S0$&GQ\ UJaH|>CcnHӔFAt׎)[O`G",sd8AhSh. +*"4Hb+UY\\`C+)IXe6֯0? Is~4vo0*k3N~< K;X' %։D \bј[Kol>%J^iiLx5 Yx$v2GFD+G`ۣ^*rxAc 7/_aO<>~5 8@~z%sDٌ݇V,Ƕf nS)Ljc-48v(ۤRԙMUp-bCwDf(طg 1?x< kFw9}j=#Dd&ˍ|7a** 0 3K zH"Jf P(Yo6aUu),^(XQNSUIu:$g^@>㩣?<;(!bַ W|G{+\-Y8tCu op}aN=I @,!,$ YnO}-~=LE2{P?#U@lqsWyXej i?Ik"FIH 7%oqk [&IU!T҈JYgqIV+"MRw!ryJG7XXuT1 *#Uvʕ 5g<QEEޠC4IB@ElyuŎ+!)}(3tInR-T@D"fFFl6ycVmU1;?fzsqp3 Hh\ib10);&{g) g7PMT,Cu IDATttM܍5 ,(/̡#y.20u&gwP̉\p^, lTU\3mZvmXt@ 6~,mqnn7$Z ^xq^8~+opϳkjz}gN&1}%Oן$J⾝5ΜLqgBjLQ+HI9ٻ67Y)d ui^=K?r|D6}ogeYyު[9H*E+9H2nYr677L34pƸWO7VӀ68(K*URtCtν'ǝ|5呇5SZ˹}x_em"=~SKFTb3[GxMÅ+VF!.@F>j\wRۖ,IڞFx4hl,r݌B# *"dI1TM׶g&|0 6)?j$dh8ED\YFmz@d<¸>2K,#r\l(v4m[v& (PLeT'|S)J庇&c I.J!(E Z:Ý%](,l&hB" +xxQFNlvd"/m$2i> 1;È(ʶNvk,z8Nyvr|%Ըy:C ZܖCLF}ݺ kSASeۤu$ϼvLYBdI0S =$S|?Dt1[>"v࢈2C(MطUBۧު3;]JOFΤiwTˆ/-lfcu=civ;ms> LM[״x?ԫglR&;0W~(:$p'hwp)#'ǩ?JcsW"^x=m2 TQtDD2F Hdµ>(Mta\GSLdshL6q_۶5 ITdCհmI|KW7vMEM`+)2CL$}ↆ咄ChT0}:C094LēI W\/d'7 Nt€^u UtܻV+/HXum @QdBg I.(eZd2;=5>fe$L躽suRttC)N[EA-{͇ƈifX6lƇ|7],WX{ 1&揰<~f ߪQ)$T1Rèa6OrQUƇI"ahJ"ѳ]R4"#)E iqJH X aH̵v|Qh:!f0=ulףި# ۡb mJ%EhwUQ]PDZ[2VJUe3=X_A \DBECm[g26y t ? q׎-8pjį~{~f¯(<}"^,ot l)9L %ɳL #&'A Iۖڃ`lNY:V8c(&"G>;'ǰzMY5%2z,i 2ci*~H!kL.ݷ$\ei._H6cjb^l.BQ,,til2{{}xS.֬QmKI266˙Wtml:桷?녜=g߽q9>"y!{2|]/2%^p r7B@(m"E"1̰rd2Yڥ#{nfq81_'y';x?FW4`8y ^> ڝ*c$_@%-kC|\L2ӨXM(aY]֚vw<._[ $^\`BX1kcH) c{$Ileuo~ͼ8=0E|| 1vDd :olR^]2,em\n> ,DU|H$hw 󸮃*$B6vLs\Ʋl Cx[ﮐҲ|wzfTvEtYV Wgry$Jb>QvHg&"k8ŕk}5z-kI ' 2;$%HE1q]c|< */L@u5lGƈD|V6uQ#Cdbdk2Y')Y".3#ЍQɢKÙ$vyV$@VeNW(Gd#fXYYa$a I)rńXؤo$R)`-%6;藟 "KvʷݨYjQώ_w!.6:$5C(w.;'=HVŕSxaFh>$$D"yu0}a'6:ӟ @ㅑQ2fNsmn&.]` VD H,˘Jj$w%iۨ LaNꯝ,6VWy]Q`qaQ1>|%Dэ( fnyrmy4ę3_gvj=9q235JqxC k%+8 K8A@i(VGV(BZtʕ+hF"T*Q,T*tq;_)f'hsAa"IE.՘)j6=Νg\.<~]W9u2,,QY231ϟiYBBY)t65=nK* T(f .Zbnz'G_=G.,80ɨG^qt,DijY7mRPc 9p?g[%nFsx,}fh jh"{&7{xO"OIbmKH1&wClT)`=BQ@LhO=P} Ux ^oq\.Q5]Pg] E妛aUqLkJeWֹ~ν|Kr)6U Lc0BOqnsQnϜ+c$2Y M:OqϑC\Ad0% F~": BhooAtQq|x+,.?~#|/ znzO'Z]~O<QnEU$O9̓N.+/yηxߣo#Wޓt;}$ҙ,z/J"'}\8K- DPCQdUiuLLc @tm ào|#z A:6Qd!.jT75*DJˎ%w=(JL<GW$Y3 01NyK>vעi-u]0BմKxC ˡ(2Q *kH%%IDdk;h$ sQ%SHNYH(*eDaD$ȱ f0fycD =>ȝZ>[2[3xY;9ؙU > T uQIAH$D$uGnc cY{$ծV C>q!<8Žd* U@Q(⊙";&z&lnUЍ^~#=X8#O<?1a@^& g,--s1>2Ly-.:*TS!-"0bx7T~u)3jVY()Ek4=.iu8K]};)I"[[.,1EV#Ӱ:}2F:GABMrB="DDXn$i 3fæk;8*JJ!T,A1OQZةZ=Ye}yq(Qqm^$k׹Mbf˅c UX:zT:Z͵ylS" Ccei#+)v=ɞ5.F=PtXw-vFA$eyGX'}v;:1=NZswz9j2>{wW_-($Y[%܉qc~l"!$#mh[ EDBDd|'X˥ n:k/+ aA"a)T=MSqVq~O%&FX+-31~d(jc( `ssQٞ!i4~@E۹vʹ膊t]`X ǐe׵a[L`S0NI"@e$I6 CdQǧ8>&=K&.~oR}Գ8{w6)T*i(簬mRÈiʾ[ IDAT6؞QVnc2Lu/ưEOsݷqpHGԀ06>FT*z 뺤3Yzt O'8ꫤR):zl6m9NLNMKW]?3$g$'UZk$]7q.ͣdFS4${ȵ /8͗5, Igr駘[ 4<+ |.CڢA^衉2qoO/=$B@dd@eT~w=.V6s]lm>yoĉ /OlW ]㻉YDؠA(,^#dE@ @Dy R[̏rai-qCXvKHRP%Q/Q"Qw>vgfi {sx/wl!90"JtT*Lt;5d0" ei6tȆ(d2RA( (b~AbAk[%Fl|YeX,B"+xh1 ͠ U{,19;O}CGopy`&: $cmsk2 ͠T"N1V"boLܑ;8 S<^ P EQ0MAaۤ!k݃"ᕉ$ vwZ9lS D]yYNqfzg C\Zl3;&v!xg-H$0PE G4UkIF++Lr  ?['HbȒɗePUn$BS^-#ƒ&#BU"ݯFY -Sfgvq `YOECi\YF&ZϟM3LSq.n31ؿ{m(CfJV `\gMo|]Yj+X]Ziv(6,_mw_"ߓr8Aieqf龷23=1{'fIUD9M^e㩯q~a _H1M! |?`$ YՠNdYZ@c^@${HZDO;Ȳ" ۧ-Fo" 5{fkk QDT`n PU(eqCQ,e2J`!H$:4z%bm*Dea4M( (2l CkqC|Ej@c:#ɀE{"ZF­3KyQn}t IpI^jTl&+OV#Jy.wL9v"O;9ŋ/xOF~Dtfr)(;KxErCQdV4/"7Mp.^a L2_wfg8x^?vDcc(ՅdUn\Yoft={8rvan iwl1]NBv&F#{\.$ҷLЁu6bjF,Ab=&Q 4g>Ɓ2jHPrHfN\zr*\[yp.K&m`9)Ѫwa{pQ7ݿk.DzDI.?G]ܤX^\#) IGxgLOb(!f\.۱c6os%)]vJŦD24M)ԫ&&s3)N\T= DّEOgI} &uҚ8lbz"A3'8]TN2&eARaRW/%|`x} "eVzO$1"-b!naG1B?$N`6+Ժ\052<]w":7"l]̹RwM&$IV-{| VM><tl.e~᣿z=?r䶻 |0siǞ$Cl:KR*L௕9?s 7~\pG@&'2<{x#,>k 8p#c9wرN16Ljg,BBӟ/hi|0-ĖDSlއOO;?|Q7d29zξq߱bqFW5S#|裿/^m鄎$$ ,7m " *6퀾 D\BE∂F($lgHo}$*DO"97q>7oC0mHivlmmanӻn;t]$_E ]U[}:.aBCt@@"B"Gcz=4Mr\];eG)G[ b8B'Jq8VhDdcr䢊l[JA=)5K6j$$ "€n0y *u0h 1 n#_(:q`2h\|ͯO$ )] =b,XI AzB] 54/* QFFWś|T:CF3 c#[[Hf=e<ۦCØIeskK \]@_dE})Y BV$]ik V*!@ t|&F4jw.n,n7}.TyKxK7mV7\'!U]cBQj\s>EA}I6۬U . %j[4[.2zgϲRZ {; x[2V(QHfrrF\"i &z*"FQ}F|(mdMQ4EВY\4U?9F*.nuP5'OQ ^?9 rqٱ\m)LҾrge.,\W5Je6MջH<VVWֈm)@D0PT#cb٦f94=nC|;@k9{z"IShZ6#&W] $IFuH÷; 4. H.nB"+!,]FJa1ŸȊFBe4ݠ5|B>Omj+U*AQ\/@){}j@\<DMQ7B:ӵe T]g̔\1mbN< I{]%-QC8:D8ivQM!&ꔩ"0XԤ[-ӗ6WTlڠԑ9!ZH& 7u$-ǟBӳ N;p]APD hgdI rL4=B E]U hmIc{|Yf:;Ozd::Łx#54Ag[.as/[XjJefehBȭsȥ㴪5n Q^CCV""x ?ht.^D@ŕѯ4 6yGQJ% q}8JG4g`ʤ/gh4Zl6A%L vڳ7ܜWdO|˲X٠Q'  ;]\8 P.ZB#Hp7@u<: 8C,''4dI@ű&f#0,{{ң04>Ho>ˍ8g %zh5+llJ'|elhu^Bۦն i.j,Ism4M V z,UYV?ެt-zr{ * d h5UXZIP9zF+;a}4<T9Vx<1ϞϑUʁOehxOAScܾ=iv(=gda54mmsxio݂V=Q iOT:6]Fgٽc++ܸ4Dds=D!eiuj r^&ć"djy̎:SLC8\c2eszIi|I2}.KsYMHDvP͐]rw ]ŏ Ә˅~' i7{y(Qje3?sߣQ[QP5t".k|S7mQ/lދ)i>yCz{iMͳwWg8s6qm駸G?DF$miT' R$`3{֍j@(Ŀp-m.F,mLlFQ}DuB,f׾}3Yo\e5+xfryYHt;-òl\5-v ݴG?lu@ Q(7mܘNwж0;M;+jB 6/4s=3lB* lP RӇk$RI +U.N-랑 h2j 2%X&Asfdvvr>ؾ*i9|kȩ$unv|nH9^Pu7yޝ p, /e.\gЗT(m"H63K!'}E&DJzH3X,GSG14TdnߘĵmdEGR$dQd 2Zi5i//~q!!BLYNS5L! o\zRC32%^x,gg8#8nE؍ Dd3I.ݚ%"~⾽LdgkO"cdNo;8W˸pg*QZYF+Ĉvuns#f֨.48go|j5;~;QASv;0[` 2 ^˧97sG>@w~7p|! b*B^}c{ .*ewGHߘK@.q! ,?.bh*,s'x?+uФksx?>W4lFiNRnO$!xRlvx(bDA_ &鍇\lrOpk,$)Yp^j9Ж`vhVݺ/Iz-LߢTZ'91J׬Ӫ^!!c$AUV<Y6>&z6ٯ("a {> k)ga$z.nI$ҦծiS<Q% a p<WyGTΔ S},{*H]^xgЩTND> )sdUD'Ibd8ﱶέen.Uy*MŲŭ.k]}ЇvsM׷![(H 3(W֐$0UvqF]abKu-]Cu%bl2˳]I:{~b+̙xKHHGD@DHF(1 E Aj 99$rh(]@vǤk@G":٘J&qQ;pÐLB#BQH$DXv(6zNdIjX]0PTvhulF3WȆNOVc nJi2b,S IDAT7Lګ3 A^Ԑlׯ.w3S'~43Tϥh[mQ W._E>]ICEr豼OaR^[#J3exp{'!۶Qkl`&+s x]`u;+7h7(3Q@d\ףcfvX? Ly.=S(pUU_aݥzs 35Je҂B1o^b_%z3qdM"'K@.~\@?4Mi" nC:|+_d|/(aݏ1Kia;ZCdMv+0޷Uy :E&`qKO ΋?I ~W~gb36KoMSZ_gLj"1=2t[mZg/tWazZ8F6Ke1d>!:"xNj! !h*A㚭MmT pP$N1 4xxpFYYY^Z@S5R`hf(a6X]qB;8ˆ%6O HRC$5EܜlHDz6uD ۶ 4&'w@C]7ptjױ ӲHi!#R:} cS0t^z+t<3QW$zȤ<~p^VKYm([|I&6ƍ~L7dbyG47C-X[+5;hFo@BO/ BtF/C»vatl_Irf}uzsI'Tɧ+e C2m|ϥODiRT`lVDU|&S,6; "6{{1.,3:1B6ʀ""2lIwl@BVeFkp{سw%vm6B{]!K Q!Ij\]qMsQUvz8YBe|DՆ@UD=% \3/(MPf0&Q7!PYٱSHĮm,Lz! n"{lEMapKW$GQUGi1=e91$b^qldwuX\]c\->H:GU4fYX.1Un5Ϧ6RK,V:\^{g^yc;qxr^;Cp uB%޳w}=1:J0 eRM[7&G-bD.u:&ꨪFm:-[]`rv>\E(ܹ ddz}yzpef2RPWN:|.EMV}PE??q. ]@E%d@T,KH*};rߡHe$&Cl-s'\69}sV1Sb۸99NSowysw:9o'O3z\BPcvR12qte'~TR_Ϳ~a~ąH6)T݈eҭ/x6 ) 5DKS/H"A (*n1% N"$I#te#hz ;}`'w +32zȵ#ZG#+sb:5C*!Cx$ J< aevHv6'( YohZDhzAK#z[ ڴi_ #nSS3tH&D%t?(? MS+TM"I*,1@U41Mmʫb}}UI4{>r_?o{''nkHl#: !?GB٤յٲc'/pe'r̡{YXZAů0TAu A58ŢcڱVam>oy(AӉ8]puDz%:<'O}~V\ ͲO D6dMbXa@ ]=,4H$ Vq,bFE*Fˤ'd" ,r!FP'B={m#tZmFwndZ뗙]U >,QHk\ilx\>3/0"4 dI@c : :U#{{az]ڞMco"TFdRgBlbzzX>x|4#^c06_&y#Mca. s3SΗ1G$;)$˭enf`0Onp%\w`ya\&FO>H\p;gxQ$DE# Lެ{!ڮb&Qd>dds,X\\`fn?ɧdGsa1"!>o<#?&|{iY]R#w7.Mq,eȤLղ(yym~xr\ex5:A֭Ԗi}Hv`fЬRkup;6wlcdle`37UcWn^.$.h1./jOS7'%˓Y\i;l2۷9z+a;m>b bm⦆Feb40p]_|?$ }Fi,.k.sy|kJ:۴RQ/T$;*ὃTu"&lMK%)U:\ԙ\^V$W;ݷn?MۧeXq7#)iw '~/CBM,_+R Ow@PSͩo:HDֶcCL,Aa;fy%&1*mٵ)rei)"U@u6.e@ d RǨ5:31]N~|a>Y4YٵIg 2wU~Gȫ:tW_?^b^o,Pc.ϿC|+k4i-)C&u4w. 00Un|㳬ݸE͵tHq=n3:*soTb fЛO06>ȯ|* J1d1"$"1 p(Ad*YL?W0]X]Wkȑd5 6epv ˋKTjq ӡiT5U<(]BNPy6׺bINݼrmb7=(.\`yqlз-v(R/oFfKSbJnD}-O_%RW/d "|UhT gXj0-'w_9qx$iAlu*Z̸c fkeƶ!t=.,ۊ"<'2?9iiЕ$i-Yoƈ(dyeVWقyTU|VWW1mJBXdܾ}CqUFO#[ߊRlS0SSLVgfz ݥMQ"h( ĦŪ[{ K9<;z2/Y *&|Ezw+7oRbӫ"XQ^>t]IcY"]F804($)ݲ5=8 ɞj!Nخ4Bs}( Md=N2Qe MdJE5tܮE 1Hq|'"E+5v{*_ dj")YH"ՆEoBA)ڻc+ IO\Ej2nѓ͢ W7]N\[& ij}5Hc=uL!FZD%.\S؊Ȯ{hZDCyFHRbvnGX[@5FN4;xo0^g֭7Ȥ82L`jnp] ` _Jbemˍ&FqB>M$g.hT]^1@1do >F-W?-~ɚd1cXMH_ :jv *sjzoppq|ߥtٹm;AAVy'imd}{cZBqWoS"RTٹz ~QjMyTkgwq]XM@BfGt[dMR/s|#}MXx]d]'Ϣ*<_L]Xp}X*?%u q%!*v[tV{ZXkDv^>[daf928jUF荑0 TUűMq{% Lrs(ɡEa"e"*D34KgKK ^l2Aivbz%  }"j`0BmS?-(HerDQd|> HƳ_:q43s G ЩY=x",;vd@W(QD s$t:-"gy:n˥X#?ಳ {)eDgLeHJ,!#*a[UCO6۷fqvbR *04Ђ:,Ӯ¥Kdt3zöf?w̭.3e~leqy . I647T6ծÕG4`257G(82BussUBd$rC3km fݭ7؇~ v$s Lm6H3b YNes0T cPݨq _9q8^\&R<mgo;1w;~/q,d'۞Btx& i@|埿ˇ$Ӌ>Pt]% wq?NAs Ξ !E?v֊;p[lݽ/1sv>{w"e f8V+.\xAm d6f؁XOZ!=ZI0:Am}$z/~t6zϷVAQ>6zf]IJLپ~Bh=$|$vL&Eˆic *:ݎE1O#q5"D"FHr=2n4 M]1wWh aa6frEA Lϒu -RZY(H0MD"$ Eb/_%w{+ո7#"'`3#8 s.]#80L״ud:4ܳk$nٵ{7W\ѣ,--0}6O<3ӓLߺE6f4 .:*##i0ılD Hd$VDL4xn)sn IF\ҹsܺz>5ץ?' |4M?ipBWXvHt]<,LMMa{wD E (r'0R`}mjmLut) 1=Г "!E>D0j|lFg}_| J4@i;z:  1uS*wM^D}-k&JVrBғp lUje@펅*8NC8+A #3Y[bx|2cum1Pcmr;&NȎ8C=iuF{iwL%2=#Cpn c$2Y*CTB$J5j{~%Pt|Mei?g JCY4Uu;@I-,ݶP"JČ$K%R)hw,NMP ǵ&N .nZ)Y +ZrÜ9{䇸 {ݣpuo Ͼ#A‚hr b&0yS_+ܷJ.kܽ8,_ז.ek=.q/Dyge|O#hԘ_}3h^M`y}_\EԒ7eҌguy{3i[;h/r2CƱ6&Orpa*\ۨ-VGMJYfaggcclΓHA23H4"3v/U%2M|7`{̕ ">'_o~^ܠsLD: IDAT+B _Uv铜y[:C >(iYQ']|d=ۜ5\`vvX2PHg|/ c˥yf@^׈-_ܕI^=u#fhxxO/xx30x֍:}d:E%Pem9HR!N"z1+ VqV{ $n KٻsǦ>un{=ʸ]MBhv#<=AC|Ā̞:.^66ضH(뺤ZzL&@BQ~=S9dRf߁~i58xbS'cQ4 Y$q8x mL&,aΞ=˓O>믿SO=+B B.3(_?ul혈 :H$״i5jaIV:HmMXE9s0fض?$)A]GP3J@uI&tt ;h7dD0t1FIG4F-MU1}8AC(lD0 >6"!Hi}*AC K, 'hUCry!Ϣq" b@ %Ut %4 9Ejc.`V)meyf5;:.'.=IԂQѣDn j]4q"$Er⏾R [Tj,u|~=OPDanEp$8wcdXCQnI#|$zsMFǷQ\.d[אHm7953c<[A^G)v }3:b 2Eױa&>Wy?̻+}vJ=#s,%̛'ٱg;Yj^`;(OmY^bہdҬ~_&{n(8ym<7IPR|"Z,D`(•D9I$3L"F.w<#YzFI(0ޏ2ͩw3σA=l 8E6QT#ctD|j> I$ ??}z.G}1p8}(xu:2 EP(Ǒ6EXD<3,.sHبj.Րݷ#_D4\ @AdtMqMD\@}WV?@:#fHEUbt*, .I(u&#J*ZU׹DG.n8> P.fӤ2v2D@/Q?3mj2aBT(lۋ~%C@U5z BE$A(mE;PӬ V9?jGD:B]z~41ѦƔ)H% 羞l.GezF4qdY\dY~ccc]$8Ƿtq߃q;XYZafzj$}}}$YY^Z! 2<|'xQ0clUtwubanKWdco,S(IR) i"3.k\8 [.XģMJٗO3:˝3Ea=FyG&5=]B!ne^9/Ϣ9- +2dm_9㬖r 3.Ԫ5Z B$*CAX|"0zD2A2203;" ^(Dx# ;FpmC NEtk5ntM+B&;o#yB1"39}զ\.km4Wg]FbD{Suj [ mKP+HţHz@WrKE뎱5c{FU fk-=&Ign EmNk}\D Dlۦ2I$3H=:ªP9w?|YO(#>[)Ȣ(jV Mh*o|1QnkuZ0$(cM+2[ ߉D PdK&FnSC4<1@D!Q9c]= 9 +/Gr`Bz>v&Y/QIM_ ]b];^_)dAL#Gpvug񽘮 lΎ=Z6-l h[ё*Ul/\8Ǟ]m16NNOMry)ij5LZ.X 6Owm\6zME]=}l&J|#&9HQ'TZa{osQr0_8C1]ܤ]ܳsIJ ȽY EDHwv-tvu%N巟ƅnUu@U g9Gfr FآHsyض/P,\' WM,}:mѤoR3=B" I*Z\ox}gvemaމݜ%3lV lݜ;sJ/PIEŒP3F"2!s߼L߱%Qs`QN$Q oߟe]w`;;&(-_"2 5Z"ѥ*G(orNPOCGDrT1n}+j[;o|r`ma dd6-b[/m[i6 giBGeTFKԹKQ9BPwALǯ֯G:>===LR*Uؽ{7um'?o95n=q˓'p b?^ Gr̫./*HuIyJH"~`c4[H誆 {rh4JX"Ƨ~f{>w]J}Zɵgs bTٛq1]"Ջ.$Yʁӳ&ᅤ Z&* deq>7OD?BV>OLNݡ5 fO8@lUf}s%"9F?BH`&ۇl~W1,C(ӧ瘿jp*PPXD#IQX\ch3S,`H/u'W6xGyWه pZB$ѴO1 Z-~v~zMOQ`ӣww' R4{H\h{8MNxhRBtjO2djjl6KH0M`HB"$)`( xEI2dQDQ4 @d]v-Ϊ!uGihi"=;Hgwo8/_ OO:;C2e^K<7ؽW*,\X.UJU"@v^8X#G*0iѣ,8;X%A%|rmB0ei*vEѰgjͣFڟ}2{QT"p=WP)&$H2cRBT2a ? !a4Hacx"A2"O4eQ,lb:z*#p0MnEA5bHn-(6BfU=LJVh3yr L-81[]2>^(:,rPc"jŷ_xBA*A؋RE 9P524So4(Q8UP8aUh-UWQ#pvfnj ߦ0S㘶xr2닜sac{g9 :3)v޾-:3m}HO]Wwm\͞H2=B_We?SK cq槊4[+Y.M|I@%rD2'#o:a˫xGfhJ*o8;H?z}j4$#f[I)2#c;6{y'dwocs-sfwwD pxO{h=+hK+ԚxSL@xS?IDr%zYg)J"B4Z:s 1C7+Sg 4${aJEC4eqۙaieMQF!-\JMĸNM;)٣'VStw'X^STW eh(i 4F$AicVӢ lڴY ,/_|cw"UJ"cϿ 'Ӽx~ { n9rwl]%љY,pmazdq]Mvg3U ;'F@:Sez:Y];!څY$n{tF܉asa|*;F1K5܆"?N̼Lpo+gҜZ}#cxwvKL_&ev7i-~hm+^I$lN@:٥ aQ6xJn AP>r'^xΎN.&/OϭL Ro[\y-F}0#:nx͍ta.?71!GTٽsw*';1rGyZ!qEif 1h&mF=Bqz ,Z5êW&< V pm2 I@ o$ :6ϱh{x~H,(İ,L |,-'PUH$itttPI$H.~jkfM!RK"J@/MiLrk؀OwW'fց$+uTYn#R51@E<")wa#)= "ӧG?x"*0;Ğoc7$ `j~_`ftU9;kjtU\(|\\҅Wz[A{!o~^~7C(ƍ7wrY~vtftuf9wCۆ )**H`yah0OgGӓD!H@Q4 Dz) ԍ6tMEz{{ƣ[vPXﺃRB*bڵ-m2,,c mpBnF٘&S/2::L"ժH&gb:F.Vҹut  Ua!bYub(ANZa5Li2Z(BU'Nv1ڛ|]3rϝttXhT9?{RA;@L&V7//w|ӿ(q)bÛ_~'^>ͧ?c;ɇ?i_塇>HiɯL}>uro r]ro $:W/SXs-7}.Eh5T Z]=ITUsեUS*Pc!:u bDp}/1{ezeunx,B41 b`D"0 K52uWV^CLHAH.=Ѣ]u^z+p|៾m<$DD$IBWC(ZAQ$v0-M`Z&g-|_@H@z}vv~ >o"z.wKϹg>6(oE:lg2(FZy#If-T%C H2L!$SX:-Un3Ĭ*D=dQB i(mhIeY[3"I,D-'*MUŶܷL²LZ֖`u_G0V U9[:r7P%0ȿRϭ1==Iys]Pkԉ#|ӿ_|GQ6AQ\bBt+HX%8c[27r bŅEnn8nD$DQ^c 똦A<'8IRqL6י2e4u4]Ce6 Bah0pLE<T=AnqW_xl*E<#'N~ʦalAE^y~O';`/]"ҿ/p\;i4M|#|3*O=JVˉ#w^am g|"#DZ1 bW_*2mA$Gnuj(Fir4st_y54HiJTuFw3@{9$iA2W/L.|gy ~.Z1l rwGttƐd/piG_xs/J4,3}Sf4F;>7:7%BQD4h.!h UK"7IBu0TJ v(؞HqfZP zX\^iK0mcHLI8CLf_FfWWSr~xm{vX.&j oe|T]GB:2aou6!]nP/)Zo+Ca^+ҪEo Xc! ᔪ|'Pصܲau}*,כ[j1-2:"_W9v'hz؞zRpue_gPE~F6+Fh4D#4MŶmdY?AL\AO1ٞ>5("ШoYJ 2>1̙!1~:5[ql,7p^*_q% rl$Jsσr{~6k̬iX I"B(ù:7wؔy:BnxD1IF424i184&fG}8K ,S׉EcضlAPĴL\EE2+4j \m5-/5fgfbξ tVIF&EE&ze u(V Rp:#;&^ʵ ̖(Uj[-Z+|WxL*pg} w~ܗD#GO U-;hdm,cx~Hbsz{ӟ8|WufyT;gro$|&y& wp2wY{6nڀ(9{=g>u4EK/3~ˁG-g_bn ?!ñ|sk'p 8MQGPNB2R(F*WDYh6#TuTLLa\l6BPf0th(Jlrp9LIp'?KF $Jhgp4L\aL*yY.  l4M3@,*^z'v>|?\a{õ@/~.IF|;_\u%C's﷾FZUo{MRK.Gp˭³C,&GeeNNF+亻iZZ-VZ͛9x`?Ǐl( D l0#p~::rXN:,g;r,"Rq+VNFiU/23,_\'ir~o.xWw>j2ҝcw^kM"}GzI#7p$}nB,w?pWnUDb$"X`Oe{]W-ێ({X㆐On_(qhӋ х{o`mxSgHMaVJ֯\O^c|zdL!b5M=%+Zd,I$޳QSpE"L>uɪ)Gf9TU^mG6sX*GC]*rxWO_dn>LF򉓜ӔjpinyK4JmH%SD(%Ld_}Q#җK+bгǰyPGWe$sp>ϭ7-U4Y"Ri\Qy9cVdT-`x(g{Ov"Ka1nNF֝Oz(Ors9ipnro P'jTkHG|zaH<2iX k޲D$-Z(t|suPK2ma]#=b2C#dv dNƘЋfo<ȕo{/uNP+Q- f ,~] /~f;M^Obp-jHA ӛ.oŷ^/Ҩ:QDճij9E2>?Wr{?;`TY&uLoG;| 7J IDAT-%ٴe*oX͍ O W\ ĮhӋMʵzYԖI,C\}c"MS&+,k?Rو3LC8HR]3@rP0( !¨"l@]LJZ&#D&\w-Ͼtb WlOBHWw'rY0}3!-eY[B5,zX5Z*+{Lύ'زe1yf,êUC, L Z +Ѳa&(tD |GchA\371W\@(GP#T"peUbQ:1KM~Թ7_}3_{g9Tykc"NSayVN%8rDĨUضE2ѬQ(1 q,Z\+,X>+7\mf0;wɳ9ã!>כC=4d"L6ViL=G?\ZY~8_$}D]ϟ9Kny$IAu<R"I1\GMwJd: YT_"*z x6Μ;:WX-!5:ڳ4 Q2LjߓAYQD uD"A@$=4ECD,uV /רC=B$!eiHC(ˏ\Iq=wzäTnJDFȒ DCaZm*TCv ׮ŵMG2WpyΜQ֜ďzkpfADk׍ ǸnM`8E3?Gر̞hPy{ױ3c[T˥BA].t##dY sOrQ,vAPi6h٨ў͒lRT9v0a ZJu 8jUQ#+&b] E:p c#LOK(aL* tF4HzAg.L5dLjtf04t6uIh2VK}B{2@`/,0:O$@9}4igdSD{3\|j@īPC 3ysqEj<8->g"ӆ $I|/RŵtD:{-afbR1eY&kM Ke>s.R{^y ZhM j5lˢ=GV#J<1JXI[v!;`[XbE1n |L{SNQ֭}gw>Uj?hN)U\@%7/sn::s)h.َ7箮$ӶHF3SIm _Fa uRjzIJBKi ֬ŗFU#Y4m:canixDgMJ'[fSםO&9dDcaV l/b/=[QijMV:|Ry q3WkKȞ}5vћmc&"uv\W 8#)%O?H8]#hN Ͻxk/ ؼH-ՃQ)a"m4RȧY3hf!޳C]e.2=74Of8ŷ VtW|n.6 ?}ޕ9r9|I4~]={vs[p3l#z를96qE<V=2Oe6܇(Dc)2*?Owt0qjWjY{!* {b1w#AEz\}eX0==ͮgv($Pa4;.믺۴XORZ*) 4e>яmv='Hai(W*Ȳ JKw+Vi!"}ë^EOWTd &,@\}\%ف.X=N&g ѰHTENl0=UL7!h Aq|)3 &TNbe!bUp-4EB CtdS+j,0s e-\&8V CoZ#ނOTIqf UDY2}!=K6CD䶷޽ް=Xv5JKx-nT?prp"?Loob!gYGʫ`:bS%F´ ;BMpdjHT$ xOdA@A am2\͹hp]4 Qu)(JH8/( KIJOŶ,0LFӴ.H&ϑS3|9rmm|+hBiLԈyuwldae)r.<);GĜc(]XW7f u][(),gK.q}oY12 򃯻oWsym^!g}N -A$* xCoq$R TazjA%\dJLa)O\fE1šO{.}8{vh*AZ:yŗ(. eYA<1u^8tKz O.P uy;pF;*ʮBb];|۵,Ʌ[`/ s˴ExZN(hyn~<+W @(} +HK<Ďe=\q _vI$ۙn}6o^oݙ#OОiZX/⶷JOW;VP>G?aq~Û`Û3촍z8u^bj;#|,KhdP 5Y,tl8}kiU9t6 EnId(Ed?+uޕGT Ba瞛{trVAfL˨!"^(L'hk& d 'XXR:s\w_O`{2hs0E LK7q6moNS)6X5K #R)2a5($YsIOkR)[fs .Ag91mCy6d-TZۺwzSDDIZB!z"c D<'iXnGq&xC*YccdqXn8C"s]x~|هuӏ1sjǸS-4H,E(!n{L:YJEvs3㴷x>A0MzŅ9W͡X b8 ޴ :r[xuBn}G~-0݀^Jq+IRξd:#8N Qpm1>;,>̕/?yϝp-nocۦ ڵn3#8A8/Glǧz }C/*&MVj,j'YF{Nd/7_Br, RIRp2 &BrQv\}gӓ.CYǯϣ$4TEbP3XBE,1`f4m}8mV/dh.V{drh'eyM0>Sy㸟3D2?pwq g1L* IDATil?)C۸q1ЭIG!@K;Q Ylxt5D \G5_撋G}}1z{׿YE<4O%Ve{G5F+QgEI1Djk.Tk:ZB".3ߗpUIĵs9# p/!e 9Ĵ|/IDT$#9,b<°kWP>z\G(FїXT?oKsɏP+ug<:c8SGITO-ܴ+p{?* LGVá4?N]/c.cvI$pMtDZS{{ȏ|/߁8d22n#+a6 z;8xݬ]J2i:2O6 X+w|jjL42ˉC,'gut#I硪6Y?{'6DTM5$D!,6a n@~q*eX_ًb J'L0-(U+l%8}8\$ S7ټy-yBN/wHrp8lpG=DQ=zh+˽ Ze5'h4F$2!@8s0G_{4S3Ϣ> j4 TUlbe,c6mcYl0cD,ljA<gK/'@Q2Y E\%85L .wҖL!i!pY> .0zWY&jǎQ.Ox< YwX3N >j,)IKz?s%MI(Hj.1ˆ妭WO'N(,c7-r]DIF,YX"H-Π.|v=ē_:W^=F$6S% []IRE0ݓ .';qLOLвZkZX:k`,8G%?eҨ0: )" Ө5 C#J:[.Ʃ㌵%93>@{ lBV]A{_cb]R~',b4Rl6ba澭TR)ytvu1Rzo|>/s~V5"x*ZHFRTPZCFlE&`M_ߋ6#U U4UA-D0t ױ! + J|YE[1<ȶn.xU*ܱKuTJ#!g(Kh tsD0"A&h^ڶcRu'?CT)ͱ43OfX VAc5c8} nReF6E8& 蚎Dmsl۶luC/'fزcN٥։k)A6Hk}ΚݷP׉FO,Ų,L%}W2BV*ebD#:,B!E!NS,q?d"M~@$ΞnFg~-7y'S#-lH D19j9z'OcsK)lbSҒja5,IFȑQ pv%[`=yBH5"rs#)*r*Ǔ!g9q1>qJ@9JѬؖa(]Ǭ՚VÎ O(%S$.ܽN\t+NFKbVh!qGH&EQdBUUmII&AEZ:{HP'336!4ELlkuZ)ԊyΞFD8>˥KXɯ ?ΝVim/OpӆVNNL^b~~r_τY֨m"7_Ks%-Mq]˄3iTD2ҹQcIn޶i Ś cV03q %KoٚcDp|Xav=~4iaV UiT爤dlD4Ŋ3&RL,"l`yu;n?h/6p"R(3k^p | (2$#"b|cbӴQnb7\* ˔/O/x)o/ MkڃXq^E%0B!Uidž~S.oGǖ P4qGJK-$'ݜ:m񾷽M83C쯿Û_:,1z~o$Y,l5oMg0T0x+__Z"(;*#J,B|]7k"598 %v칓$ȩggε=Oszm%jgRUܶeOKWmB[.xdb+%6tohܹcn]]}TWK*цgYRq:BU`\|D ͭN[”DF UlR u/H^M G3DYd2F.]=8!Y"禘_ASl߶b:47{!FnZѓmeYĢ yFuȾs կ%IebMNҮ)lHU4MnIXN7Ü,g=;_};׳Hқ('qa \=iVExJy]#ךb \ Hr2-- Hz=@4錢 H޻3g`&CVHe3Ԝ*C<_( \AiD]hlqMϘT0r4Fj2}I;*$lTʥ|?Q~`;U7X5 \.( /[n?W}YIkIy9￑~eN.exlej"Rlޖ",׹7"*dq[|)e Vgtx\%Bi$qxDeas`Ĥ0MX.^l\ԩiz.,xܰ}3@,ӓbgnLXH" +AҕNx8nS8M .RjHva:;Na0Ͽ@RdBo`{ zQ*9_E&/ w4Q17˴#U2Z+_s}?`uZ_!CV`r9g4,Ɔtvv<-M.kNe ]Euq]jks jmp'9֍;Rٙكl|4+0`µXq3~Dsۻ%ˢ-E|1F8? BwhkgjzNj;_4+Fvf*}-<8<ЊY[w^vL][IOF 'Mն1j&m3QmHQ1 ֮VC~et[zՂBYEìO&l (Hrװ4>OR @f3_rCJ:a5_@E4ET*0i?1)ot&I*bay;(jEBdi8TǨG"WX؎ *N2DGUj@6-lg=Gg~NDErjm;؍+Sɲu%~ l áKѩW f'xT*%>\Zmڨ ֭P(:Q|~~t?Bɟ'%[j5Ԫe̒훙+(J&zB̮,0]\-˄I7qKخEÖ$QEUouVQ8~ 2 B(FObv\7A̭ٴ>l-\^\+۳0Z/gz$E.flD$beH'1׎FXW5/ ">${RnP).y.Z5"7eǯ H (p? =B4<'je3|Q9Ω#QR, r{{;_d`ozKȖx.rYk?F8j}׿-ܺu|ÿQ-84/-Os7Ͻy5QV|IU&.E{ 57 $jHHTX&h}۸fyAD$%"wiOo1%$xGe2xI&? 4ӗl!2u8V2|ګ8p m\FA F$ĆUѓY.9M:;{}~uDI'`8: R:R˒F$Qba*TtdjBYR<mii\ى'~J 80>9AgzN:Z|eV4 8ttI${֭*(R*汾7C!+\,SܴkزC߮=oG(*aQ6lu]ZH GDSܽ1=[A  /*BP#{?I2vۘg ϟ7_+-d]1:QYrqf²,"+++x"2F'7rl0~\߅]qnVSr$RcT"-9j<`bb P, fMǢ_126;0Mh$F,./資\ӗk{֓ȪG2F%#o_3^#n;ӣ\f_ s`tFy EnA5:ih$I"V{pp @JP, "&{^6K?!&%.?=/nz IDAT]5ʴVWu87{>WOB o_4}/đn@f6\|,KDw]6 2>6DƖ(0FM>DUdf[MW-G j8*la V(BGKʤHA$!hXUdU&r6,rJg& #K1ʕY%똦 WݞDѫ2Mb(bےMR,M[*2FřIZڻ$Fyܦy#(* IU'!YUz ¶\t-O x4Ȼ# 2O1v~4lgN^-Wh[tB*EV5T\b6 1 R%QR=t4ȭ;l VuЃ?cz|o/ޒC$230K""jLMij(h bH{}dY\!֙a A7ƽ%UVxK:bʶyí #%"_d2ũS'f.)_(Kr<]7EQ—;X,. Ё޻s],,fl;_"nVfОIg Ysn~똞\ 5zA=x?`;vڊKxm KƁ.&'ȵ%12dŐјIPgvƩU4*J~ 0UI2ԖV$Qq]UO{HO]h\; M-p\N8Ͽ\4Bja)DRZ^@ d9c!({ %Aj($cy\[$vJM# IPd4[|Qv=4l޷7SLK&H ᐎeYX rLTK~o}n$ a6BqΜCB^w|233tmFP_5X-вZGF9qzU>v^ ?8{/3=3fB,aԪɶZZfsb2H[W75p.J#&Kr ShT\ Fp,L:Ŷɉ.[V Gr47уOqb^P/e$M% Ney7jϜFPKS̍”B\ubN;C(%g_j|Wz2mٽs3|Wf? jb?ETݏ6wȑwm>lNiB*!G}棄Ξ-ә'RLd-iV9}@7C f*tM1tdag q}IymX/}M Y5I|x^B!_q:tեePiQ7*,LgNVav0~7 uZcTQ G(ZFq:Q#ѻT6rՕ" Oϻƅbt&SwZST*F>'Nc&}H(Q-\ HXjk'P(L\Ұ-LO`Վh86d#3b1F],Rإ-]LO^'#KD-4ҭ\U2ɰN$ò,DQ|Eö$i[M6Ur9uGwlި Ii p0ıd l:u/|1' -Ԃ<%{(YgO!2f& qoNñD5,"M :]zQ79rhsL6iq.>#Yn@I^38~$IEXx,,,I$P% ---d% Mw{'+aR{o,̌7iSыCDq]6vP.Wf3h5FNP,9P0VƬ7|1O͞kSc?g? ǧ0~]I%h H i\O͎KgȄ#˪Q6 L=i: 6Mҙҹ5L8:v 4FѶ|_XL0%lN4Ƕ]2wG} 03(ravf|yIthL6ymw155E(R.)U""޿v!ωGLM?~ #7~A"E5Z8Ӆ2+p8xՆA !H˓5PvuE&QFm[)%\ %bn$E#R*꾆ç. ;wd!XD?Wc'yѭ@G36r-ˬNQ'B%xfE%a^/f<_ q]Ff0]9;VBL5 tu""  9k^vU5\ga޻@uD tdlH}M$3s8CjӣDf<,Y9D[(Rc31w"__jE1e@% *M E+}Y*كq @'X]מvPV}-Zx +Z3Qadh& װVa kYz{{ٴiYaW:Mrm(Ȳ,KضM!\4(HBnǩVM1zܦpjHRQF$ +hadZZ( 1ZxAGm rK/ǟT*"@ i% aَ60 75<4hmW]A`rbh,LQ?*8Up(-m]!ȵ<|h*+h_ׇcbm9dIeyBoO/3lhR7I%\gΝWl J<!Į{eyqQع|z eDB ɱ;1g.\29ʾ |}_L1\,P,OkHa8/eH 5FUfѻq_=tM[\YFJ4|E)0 ;n߽?ٜd孯wWo M'׽ѷ&NB<^ǼP N<T)&)O |?}|+?`e$Lg_HTuΥ_?(~4|\'|@"SǠ9}p9M}6k"5 kX!͒rSH@d2A`qq\.6DevڍiX#ljcV_/#>Xa h#͐>ˬbLݻwc7W&-JXTܸ1Μ0β%G/45OsJ|/]ELUt-8(L\f* )ʞ 1F+>DW*dkٲ>ܛJp$2).;O"f裏嚶XǏR*Q.+e$P-c+DQZ"o3ȲN&P{TOq嶛|~ғ$$!<o{8AX`Co/RLh2:YAttǵ 9I,zTXFT\F7Ћhvm7=h]"n6N;r<-DICB- 4xҡ= i:m6]jZ&}q:Z@i .+qM+H!"hH![ %Z49gyHBHxa,aHHHG0 QB_dYZ"Uth4(tm"FB@Z(Fa`0ed =[nt-拨SvӮ4 4 vP1EQ}0qmn4<M0 9tlf$;K&4 4 LOA p|Ƥ?e\envROx6FTU<ZuT>ЪZU#C\m/ IDATy@U(W>(FK9QYbbBRd2)Fy+Rl VMŰ+=(QMNA~hBe֕WlGwZ\9p`:6’=F$޾NOqLf4@t *N !tPqCUW̒T95:ټ@4l\=fuY!:\9p!Sz_C/dqTd0_3HWeba.*"gppwA*hR;-ok "U ߧ\ͯ>YvI@H2&Ot-4W}.sqgw[4;mn/05Ǯ_|g%|P}V x!hqǟU H% wSq?vCKBʌŵ>@AC/* Cŧn熫hZ H4W($> yv,B1D2A G\NB_reVk,կҨwɦc(NBA!_,.f^6Cuj 2c( (-$!N gjj7r\%˜VUInUIUDApɥ}KO ?уdr*tVCXq%"O?ͅ^|-Q@ȒveI/a(d~FEQ44 PDddYFS_xg29&q\g˶Mȧp^81Ŗm;6m!F(299Izn?dG:BvMTXD4NQ$ ]I%Q1ⅤIff:anH$ IgLOŋ( bFtr)rpj Y^{*Bz_O=ͫ3)D!$SՈ$R9LK<CEldvz\.GQ39z$f1*b׻-ךxGѠՊ2:VN$-O)^Q)KEnh|v"zϐhH*LB:XJ%B!E"ķgQB%A?/s֦8v =rMIe=s ciC̔' w8w ftq5Xxq3iϢ>M,VSr6lXBh4ꈲ,G В,icU _t.?/XAtA raX Ӈa["3xˮeRXBLk>MƫtMTPPmdE$NQr@V >F$ `rb+pbd2$i@4TE! C_ j5z~z?c ̎yvC"! |/Jt:EQMz{Jh 5jڼ8c #kͺ ]\O'i ˳8 (J*"Mbpqx+1[-DZ6b! ]'*_$IKGf[4 bD\Ǖd~lV*feL\'d=\gK&q Db YdY0(B.CDJ̚5k8qL>\@MЪ4iU&x)^{v;·fq0T \=)j ZMB%BS'B hxW&[{Bf1E!HDt]m⵻.$zL6ffXu&y$  AX$MѷH,逡L/wߣ Ӵk6[1]6S*mS[\Vt&̷8w{N,C2Fq:@nE_/A_q9A'M`ՠެѬX&k mǑdMl(nfzNF}@ Ѳqt]3BS$$ïO:AEL=Op_)ء@*! E؇Sh4ɯ [p\S |o}{z(WsZ&xY9~(ap`M);lJcv}=b{}[.\1qIR^Z06+1IID6z"NVghh>W9db+eٰm;j6[<~fiȡ|JΕ_]o! ""QჇa+f_qz6Fa ÐЗH'#rFv4|ԛm*eL1E'k0 5jw| ~v| ǗqU<1"*XXDUUzzzrkES."ri28'dl|͛7't,GEu>?s󯼁C?Hh.  xs/Zi'*u<׹?IDu\hHxA |QccNTQ$p$ `lz|fva:l۾ǟ=D$su Nbu\&I@ ݀a%٧R Olqߊk]n~﫩,| ow,r.QjARLҷ^ A 9m:-Csu;YO 2aW+>B}a5i|kzlŪ!UO{v_2^~Ə-=vY Z9z&%E~G8t) ?a0=4NFcU&7qPUٹʮFb h"۩5I&tk,rhl3[?ǽwȱVyhn>ېTLi'; ZoSc/"H+Wٶmӣ4MQƶmNE!qMp.G, MDMQP({tt:(F `ݬ^ YVZؖ|ɛoy-F7b]"fǕYEd"CK,"Ll6$u% MUBe IT*(kk$|B( dGz6Dw}ٚ_ 9"# ؔ^dm)E.c6!N&afFlp fIE[@oonP5J&@V086== )HFO 8$F*rX\nc& " LHQBRT=䱱6vSGqѷ\ Bph0[Q|CҪZĝc)zmg1z P2W! #{S<,;?FYq R?GeҢ.2"c,787՘b1:bBul:(LM0f lNFѠZ.St]4MլGD8Y[7qi$I=9fabw(h nȘY8::$ W2Vpbro|S,hhXV2݈:C t*I.Q$ lG92Bd>vt CyQ 1My4:}?wrr X3f::tB 5"JZ*#芆bA\?Dt(X.!zR'%xqpm٦c9"]G%rɊUػ\ 7z>'>'KI"6[hFIk7uh 9$\1t]cEl_1QOp9E).|&ĎU;-h˪5 f-^q=wfx=U{ٳeر& /?U]!ĸʭk9_aY+SK=\o1wog%@1U{'|}|etQ4En dWJ#ad41|A zzz@ؼe#Z =;['OӌSMk/kJ%*5F U3DCq,}~c1lEe8"Jkq ^!VX,AR!!_,jdEt=NXA[sqQuA%4 1S9DI`߮G؜ Euv(Њms\6%umj:~=l;9R$txO$^3yj֦c: e&OfafQN-;v`MȲ333q:?΍7BN뺬_fj|10MD4Xf W#JQJ%c˖Hz8i4-X}Su,e``(vre Fx7ƳȤ9tRD,jq] wt[5@͊>4:C d jfEQQU˲yœ|;MD*;Sfvע7.Wa]P(`rA R./D&a4ta]j:T A 'c>4߸ !iKt:M"4Mö]|?$hui$Rz2Akc&uJDjL|mD-zȲJjZXdY֨O8hTR):Yq, ״.6]zyC/=^mZKÈ_.B!xq= l~p߸k=%28b.3GW E]UBs(GpluV4-v}= k9.nkt*XG_d4.Z‡nAmZbqFUUPT!*l5 k֮z~^2?E q4gIѢ7=ۯ{5C;\gJ)qO2Щx-"|{|Xr`&lFg ~ⵘ^r37C>ǽ? {1v$ϼt7'>i+yaz}Σ IDATAvi*_疫Ct<4B ( ]t!w 9qn5‹ ]^>-kYֲ~$+q_xӛ}{mz",icY{M{q?AQmG ݲZ6T4!'OƂ@z$3ɶפT*ɟXX000iI:ö=+z'i!VXLaa0lg!P,8pk׮XT*.X ˲ frrHʕ@TuB&l61&Q*":ΚÐ\.GdaB,!IRE:j zzzXXX N'Xk=XL[_xHvӶ@U. ="|5u<%Fq 1-NA +vIF˶5-Pva'>?|4m⺆^cXJsVgmn4 MӨjH-=u!K›8 zt8gfEHֳip-?ڹ0bxϧ\v!cS s\4^p)KOY%#0D,j MB3(]?fFS8]`j=7*6Wiw:KϽs2 Y[q[5$\7†fl xh7/e- Zo?aO K s/rWh8rQdI2q,ER]#&@0mERq,+I(L*baaZI&"ltr̙C(Q'Bt0 4Mn!Lb?xƕ'-ҨUxzAg՘I>_.ZlizJ(SiD9ddN>;(JIJYp]5}0Kw$~_^撍q3vT*(B* 333KY}k6 ⺎$9K!x.DӥlL&I$c4m\ϦT*aRnE:VNT* O"]Dt4v$m#k*Kn`|Iuf8Ǟ_2P.S*)r*k[NQdlE^UUt]5@(#44q OP.)*{(bK?v˯r/^i,.PV4_>v~ ?\s-,20s 9q *J=lr *b1Qphaibt~fggv̑@݁{_㒮@ n$I!mpybcLNqy7p Ú>ge&H3UX۫108),-ĺ8|r~~ "^ J^5ŋ!Y[IXeۺkԪ}t1pQ(I2[tQhL&s2;W\v ΥeOJ$"j:A kWlm2Կ#3e:$kYC% 7ݽO.&P"3.9rl}5W^Bk2j,n:qxa>go{? p}BX(R-W#M"!9tfd, |u}'&S=v)S|FC#1X$vی=GuT;:c6\~15v]Sh&ͬhǩ!1NA#/wݍjj_Aiɇ9 .:R} '}~/)3(bVV(WH#jLs|@JV14bz|>,=?ì,1_+Ç_57\PoFC#_=xlݰiedYm"kX(Ft.}a@(Fd<(,$)$i):fl@Z&H$4M\7¬ 9N=PA\j{eM퐌i4߻QE;#,cGqZ6 n4ty"+* ru,xX82٤~j)@@<`~-]b۷.'N~Z<ϣD] RmkLLLD4yb/&P!5a$RI̮qZ+T*TU5@ht:bn6TZFH(Ũ ڴ:u}saDzǏN?EXD:JT"D)ωDh= QVU-*=AU(2 25>OuvV o~q12 E pd~-fǎt:-j:VR<u:,X֙5SOLx;Σ?kaptsdi'&QTq@,:M_5XS( MY""AQ3-VM[3>[徽u4$&\Dݹ^ʤ(fs Nr?DY%8$7}'X<߿GUR8OM&8! "mIբT*q(u "ӨGhNa&ե;h-B9g9(W nAJz 7ܲݜ}[6@ |Y\E"3?g5+M A|t88X3( gxxEںII'Xs{!ib>y'_ v>60:?яٸa bǓx~\Ȓ,4ózˊX n׾LBVDICLO-PhZC`fqtRC Ӝ>5iʉ}2I1CGobt$ 3 lǣRL|nw $i|Oc9y 8*o_"!v,EBχ C6S{a˖-ڽ{E-/wV5ID#kFVuk7\0,ӶΤk;Gz>f]cY|?7ʡtO<,K[&H`~g/^xy 8,1"$PM0=CUW7i?9szz֭{XXXVQTz,,,F˶iw;TU0v 6<,3\jF}˱C61`6 T6-h4hk\|n=DQc}}Nӳ X8vq{6v7#<Ƕm|ݢ5 :Au$ ׵1~[޽{zdy=LF3 vIVX,n5zl>G (vKZt,\.G ܱcՍ:q8QLDHx^}fihj8~H Sbe k 'I#*2+yTU% C%hZqu,"o M(ӰiN2lFl:ԫ&/>;Yvy?spLmBfG6I.#0q~K.P^N7{:|￟W^z:_W8u$VF/Eiq|#\ێŮ}{yT*EAUU\צT,:gVV*rGm$K/ukTmwYe/O~+)'9dX>4/"HEKqC{Ï *lk׮w޽Nݎ(,Td.' U%aP^HEd3 |oPwsz" M<G(@ &rGyocw7Uh6u8Nm89eN#?sRitHf4ŗym?B/$"_0"EDu33@1CpT ?U7]iׯ`Y+ؾ qf%<+H4ezYL* C[<'yo|m?ʯ0CH2^3OXdT%w}>4&38JvMYah;O:f*˱[og4{/LwȦv-drYa r8yʺgسу?]!0 qn~'^c$uAd;K%y˃2}uc7mlo@' D!X,D"ZӴB6mscgNdr3+!>$}T*EףhF1'srl6Ջ%9$J61A&B{0~Bj6PTza/cO>{|7!ȱ客( xr1MZ ]R%!!ld2I\fvv9o7c%HN_ln9#}s};vpLnצz\!m[yr/11hlD)ijU àX(qmr ]V27 |۷rhvXh5 &Y[G|j+s?Os')0CK!6γ\Ec o{G)2cE/_ul%SHR^C$=NZeUUj %7nPTo^]&a;ve hwhk!ΑɤС&OOKH$7WEs|3O߇ȱiա[n8 CЇ, ~Llsٿ nMQx"pa}MU{0 \JaXAvC5E ) :[; :@BnT #^AQ:ȂL6C^=CӠxNǹAaި "SwG-XNH/8P*+'?Ο9~͜<7Aׄ^l1R*QD"K24Q4x]A@kRx^^+I/=u0{QzcZ[O2i &KUN| ϭky'@vsYqZojQ - Q TE Љ"X]i8z(mj45RfD1,;GQ2,я~SјC5翍29cyi|!|P^[c▆s` [.5ru b!G Ä ܾoc6yY;Er7sX]+W*{! byy|6E2Z6zA4;t:-I Y HcW'ە6TV-4H dˎL (ӨWgؿZk98ϾӧpzNףX(HX^Y# "`=F@,S dHZ \|y~fg9fg(JE^0L4M#! 1pXX^"ϓ-;]("Pm4:@DVE4$U'vbN➻DV:=Jn6 @e2x"nv=קc;YlXmvvE:+˼ut +efRDfEӫf6kpZF" ɬvFH3vF m,ME?:(!tL2E*c;DYPX]B+ ) pWy'8}4w<e\f4ʕ+9y 5Aatx(?\RZJXahl fߞu֫ZEݮB8k k+dY^^\.c6Ovt6HRCpm !FsM34P;g30:J5hAىȭ A"Qm` ̄i&X^]b||@D5BQ@$E@B.ǂj-֨f E( A@-薉h.͞y>epvMs HJ?*=_mڽOr{6fG 1,NAJ&eDZ  "6$;(D^;4nG_.`r#[wX!x_|Dn>x,>qk*aDA +z) ym8z-t$vM&_x)4*-D3,^=yV,I+()DdSy"IDAҹ<=v3ss )djKQ}%~K$QX#ûvCYYYcya9`.GMr6ml ,o:TbnJ(Y)QkcSSS (rE(UXZ\CMZc'5W*Jdy&.(oC!huuD"$IhEF"K+ $)hvt]gn: iO|v(yp23L_%r(8ry$Iu.;l~ǭvzO/|R)Ou{|j31Ok7<ƕJ={qIۇah vn1ZnM7DՊW:"d2$ <٤lR,i?nZ-Z}4fa"Eu!A17f7c`}PKQI,D"&c#+k!\V/M`yyn03uBt'=4R5!xlpd햂TO0ssqQ.E1Gӳ;mcEr=4{H,Μ?Gs_q>O!>fnt=ė;"'yDLɴ;u\4DQ@u1ɨN]ŰLB!$S' :x y6ߴVH^EؽkO^$ˡJ2!`e>4,$)׮^EAymٳ rxdׯ羁(*$R&]3_"*c{gN1Зx(xQ7 nt@GX?Y3g$(h:6Bbfd~CEqZ}DQD>}L6KRXP5={P.sA@c(0t4դ:=l.*+8AHH}M׉X]]/|/O9 faI3LONqaV?sdYo} .Ni* }D,--ѿcf"A^H۶c}(qѬ.cIR>UCUUl6VFTDY>5=m__+ sCl{Yvz]mۘf(dHHf`` X_`xxLMGTbʛeYlll`&mCkg~}Ob24<5l"luajt:Ik5:snz$Hr96KTe%]{lT*G4zi!eLdia;wb]`-qnr_a SܹbWL_Hdvf+Hݻ VȒD啗_qlrVsPK/>ʽ?ȹ'4 _v6$^RdvP.o~,t(Ǧ fftt.7v;pL@,Jb~@J4#iY]|ɫױ2}wm{"ҹ<^7E`!}(nB$O(J8(+M&&lD: Htq=cdSi*eTC'|**FA/%EӋsM\ò,?EIvx5 AVtm'L!ndxaR4ea|3rQ!*lM3Pumbp!2to~[ o!=ϣcqQ:Sd{.j'KPSyⵠɶC>'Ο~gYxN-U&Y[]P*iZlT׵qz-*2L+ %e$ףaw y~|g= Fc`hn&((JDQpy\.=MQjއ|`WNLDyiZV36'IgrXnj$&:j O٨ר7h:$Skxu:2Ϝd(//"y-R$LrjluX\ZBe^ ] eZA?-T&Cc Css4Mʕ;Ir.CÜ={0X]Ygh$3Etj=gel(DRtMT̀("{O8DHDzvi@HUkdlfra:K$iPU=V#8N YQUy^#H!!Mb4ukt;5>gZ<;9ppxl7T*w8 g\xc=8YrG`VVj?GZV/c5xrlDN{gia\TX9= MGLF5U't=w:GQ-zHaLjB*6Ul&^o{T܀ty&d P+ &MF=~o.$Pr!;Gc݇iA=!aF̑9.xO0 K.l9J};p Qᵣz$r94Hh2evy *̯Pi+lI&^gva s&c:Jymq4 vѨt{ߛ#.P5Pu+'yWNX^^-8Qvy}d)>me `.V+5\7d#|+`xhPt5~`YwYa?$q"FG|?ނy>B#._o|GH 67 fشq#!I|]Ȳi걻022H"亮oMo˩d-XEDIed9d2q`*K:1M8ĵ2(1]% T2h"Kq:un:z{vonۋmkd=;㖣S g9zd#(`UWq]gy0{ED}}47yNIVy?gOѮ72q&'p!I !O;߰})t_2-wRݨSgyMXZ^ch`jHKM"(qH QPJV*Z"c:3?s;gc ,PR"i&& {"ŽTI*dG`Z̳$[=K%LW^`SA(!v}RXu Mu@>pk0wEJ{nCD$AqdY۩id=|?DR\tSmA8VDUUB"5dQ"&(rDJ`Eϟ$# $~ .\A GfO'2TdR<_ : e+WQU93QEj}t*,oih6/CrqJ.\z}ŋVom=Ͼv·0~{|zƼmlo@dC$ir"۵ 9<ͶC*"mM]%NEfS#J% YUUI$Z-kX P,憤os-k(^b33<UQhqṬ]'v1 ɠYRQ( MӰmT7h4j"D8mMe!+"aV":-  S\."eRiA #VӳmAСC,Vj|I护ng|aׇv m1Mt:ͥKQgWYVV8/o~9o7ˬbc2skmAAbn:~ 8}W^sȹ n߽1}8Wx3Gݔe/'c-m^l6KRiN1Mn+d׮]hI`N8Ӯ%-* +Kd T&t}LK矦oh}؞Jp#//a#q6TUEQXNg8z"A" 8, S6Ȳ̕+H¹]1b<e), ? )U~S$@:Zҧvz=\g>HD$_x{$+gԉWq0Y fT|sMre9DkI7|\t"!s2fD!ZzN9tw^UVL#DE1 AqD:>m >n 0Crf!7P@":DG9zl'i,E"'uDQ$mX0O }BO@TEʖ`nb&j{q&$\\7j몲" *oڝn9G&ѱJŀ>?xCtwv7_mКJqij=0qs'?J"pl\H (m4ؾmcހlA`qD4TU0b|vtot:I2iLZQnEQȤ(J-d( lAo}(p#۶9JyTMfll HetK? 46* JxW0q WMJ2;ua%LUftl'+ Unvi[E&+>|rt:;Bu:Z-DTU(PJu3-=]pa~wee]) VTwϥ٪oe:Z.' Z K,03sL&C=9BEعwRiD*C~p3mH_BT|h4\x=PUzaׁfh"΢ɞH:30؏9\!$͔P ~ӛ6˲XZZDZؒycv5fϾ͌pTJ(ɗQ/|DHSM6=$IBJ]ithB iV$03Ӷ7EQS,b>Gn=SUq"}Gqb4 ;E`23:)dsYz"׿Uw§.I#4VN\cwv7 It.o_&Tvh$]1'tk\kO>82KT5V)Z- #˳8- Yr0:Ёt9 jJ e(zhT4 &&I)VQeD"tm0daq)~|:~N5I&WEՐejTl"vE\4h!#v;F IJ=F)J4-433GEl%H8~ Q5oh*E&&##O0Z-Z-mF֖י:2kz{xgfjjϓfiLPyHV0[s }Q&HOS̗t382Kh os',@0`wѫNCw _ 4W`SծS>.Ӝ=w]dE@Q@TDN J*CV%*cC8ŵ%b^Dws^ా2Om f0g=KGIz|3\4z(F 0 ˲HR!j:('Rts( hN I7Qv:x]|_GkYfȋ&(Rm'/_j c7)Ul } Ch[6-O6 ϐJ}e4J $=Dݦ]̅UFM?v".2@6Mf`ԈDWJacb0 <H% $:Ν'"t {.+as,!"WkfT2 {P?QP5!$ Yp>R)vEi+e$'?ǘ1__埿|繫!fA~=o' 3tvgԖ66.s;=|N3g9:QIzMd'g(\{$Gƹifc9FrR6hW)aH61 ]/zh8R(!z,Ӳ;ȢL% E0dYtD(B@"( Č(X QS U1~Pt~! D\@TuAץB f rX,*$%zMU@S2D$!){}^ALaj@:@?^24};.~;{3O?ŕWBu2ADQ0EHqlٳ,.h%L:3t2錎R(RD1t,7)䋸A1$9o}]h\M$$IӤlQףb{X+0x,2>Dr,]]]U/v+EgȎq"Ao,"Ee|a)(m,8#ͱYr/z*GNqC,S*:T**Zn9F%đi R =MBQp0B5$4mDL٩b6g ~ՔJETE0>1E۲э8;;y8z56rLwfzF,<|xNѠq [[$TF2ox#gO"t3gI2 S,\exxCc\d``WB) |*,l•6yALMQn~}쬰1IbI+UF& }xJʷp;.zOsCoKߟ2&S4B1D4Q#=|ERUAtE hOxJٌ\IӨ 2 >sALh$D{ǃ8A7 фxBAn DE n|b%u8n*A~dN#1*GtJD :(@t+{:mQ"$5WDFVj,//Ky,/.b6ccc躆(m[4( (|/~ (BeYqX_ ydnn ioq8|ҩn6Qu ͙AϳfynX,b;0t~}wjh7$LYI&#x&aggg ò,:m\kŔV"|ov[oup~%<ݍ,hWq]z➛VTU2nql-ɷgUN/`wgr*;|$7<T6i,\~'nw(PF=ՋiUl\6XJF AO&pD2[[[g`l{hJqC4 H2'K^EBdvn뮽M 8zhWƗg2ZlwtXn0"BEkYRprz Ŷ:htp\$##)$r3RױDAyRDZU.Rt:'X"Bki|0::ʖKZ'H!E"0 *"}Vָ0kɚ1҇&Hj"oyu8~H7٥*N9(OC39=N?]w1efBNGFuZ+t3te,/_"gom7tV4i5$RCXrKll]z_w8~WI͏1KgGox9~-o{ ~YEg0&+2Y# '|E %|aLWAjK@@yw Y._6ye1]ofhl7sE-nɥmu}>d1^XNi/ "ݐi[e9|1d$UAB\׋, PXGEDîMLxE  X/Ӡ8QAQuD"mԕwlE+N O|$]V~9z1 B/gzq$KQ%8(@tP@?^rݽYVHmGff[nʥ . IT+uҙdiT*R{?~w~i}̳x7bY>lz t}DAattsP Dz$ƫ^rKu!86s#o>F4,- M>( d29s]B|TI }XW$Iv'QՈ|'xVG Aɻ>~bEѨ$cqrHb4aY6粻[4z$ ?L6GX 7kdz8V˲cQcQ+X]Ychx _A]Y[E9JLH&\#\^_DU| zbLG6tT 6UHx'`ZRU:zCW|oWurnC&JBb&MJccJ⪆af5sì-q*D }o:4ЃЪ@HB(oZ(!TUG\NŜ̯ױ ˔ M uc9*+ B.hG/#h ۳8?;4ɓΣ V*eH,ipnvT'KPX BRcpQwsw.8vhbsbusm9fDB813B,sën'sr96JE:*rKȎꈞ8*3#=t O`)'oO*FGOW'\Y h#!'oװvy @R\o19iɣ,o]6S#ڄ*(z>2""K"y{s]ڞMycMitl|YP\/dsvs=~1ܣKfd,WTM(QBAD] Y Mdu,$d=z#Bˆ:~rI8s/'4D"@S<G}љ7;wB~}=G( (Bs/V!}dUb~vjӱ MiZȊH@@Ƕ%fv*wZzŝ?y>DL:D qp܀|'zt:ʒޤE9<^B2PSB AԽW>@˾`&vd<"C#-?"NLN"I~ V]'*""ᱧ~߳o F 4 ,ˢkܨ5,184z3B4ӬBn#;6F,M\wh:Gp/G'IcH1,ˢնtuqzgR_Gx7SSD%Ro4QeIQQul:Cng// *FIj-Z/O IDATDZ81Q-0D5G֔Ȁ*{hIQEDA"%ˣZC""L$Ѐ +Xcesͩu$")*1bx[# EACפ=_k<\|i\]䕷OvbxUl،N D@%-1G#>XB]w^z9пU*8,Dm(g:d2J*=; } ]Xإ|sFNvZU~o](\riBV$<$ n$ǏY27pΝT"?s%cw#Wr5'1_1F&+m!mje.NFcU" *$C=/;R #8ˡ& CN>w'Ou]zts_Yo*JRMnQ .j"*/^fzzZ5纘[Onl'ᢕ>}u:t7?.]m Qx RzA]w\~5;@+Wp- C#iĵ:=`;(uk @ V3gcloo(k.z&jMӨ=)-ߧXm+:a(O&hnfQ*cQ.M4]apM6 FWW/]ahhXXC':tZcb8&s+e_sZy-Gy``0"5#KMed}fe;y"( vژ'tw2cStODy,/m2r@ӓD \>oNgPvt:FQ߭auc'b$LGEHQX HxSgQ}Cp[quVvbh Vر$A4:,;oe{c8vW_zۛ)TC?L!"#/L_: ݢvDUCtUc3qN2|@FDh>ͽpYY]bf(Q}ag{lW/~JF@uH UkdnH& b1iaʔ ~moS+jP+oRFDY?:(@BdNB Dі%Ȳ BD}d<݉bS$m[4juq#SY[GS Ndks-5D⦛o塇Nj"=T+(O66]/Ȼ,^crjPH%MR _}OghUlf+OraL3MP0 ^HdqQb)}~vKZaG}w(,#8PE.݇㶱;+cÐ52 .^d|dNAUulA(maxAl&ˑJwSvQ !u3`"GdžwVf/ry~z }J*%EƵ:d'wo~tf2J ! 6VlBqk{h^FIq\+:<ənEt/F0 ۶E@E"SuL!2PTulERDCW\@IWwCY[ۤѰ+rU&'!dYY]f|l;'looJ׿^{Ɠ̞fpp7λt#+8,ǯ mFzاZo aa$lѭ a. s2f. xg#n;kN=V㠊n3JF&= ߻K"vjHKͫѶLv+ ffP(l5w^~{GAz^CE$GVD"(ܹ!;etpd*(,Eq銠ܤj1~c#I#=#o/~V! vs-ʥ "û#H"Z]հM'23}\x,8ˋj!*2KP 7hحci޷5ź @ȁ#EQp(J$BϏ< Gsɮz>S+.q7GD:]|?4˲9,20ЇFGӨl! ׵'=,,Pk;8K"(Kh 2u>r2.qv0GqGy߉3~Nilmma&u42AP#.;5!D#`,mADVr\K$zi YNSlBCÏr-wpԔ)ooOTOɰIP_fws3fL!@kI&}Y{Tv)n!jvH 8bSm7_şuD#KI%M8jHe"===twGtaTUl+. `h1G*-c豹S56vuVzj>%&C>w0:˃wlCST-Lff*E\c{{(nY)tu^{H۸ܷ'w|ퟠ EbqqVR\%}~BE-Dew23S:rz ]V3@62z EѢN$bYc\H.A2gii\.:1-A5*0՗ ?|=o/_ЈFeSce:}#KeyyF>>![f/}84:B:lHlvH!FBr};:'o̙,6 Mb{~w;Uv1 ˲}L&EՊLȞiQo&ZRoT#Zu{4MKcIM ƺ4Wdڡ'479qNB"iq4"W/rKOó=._wzr03(G`[T;I24M0di)J3 &*_YgPdsl^|}(`c1"eYixG9M(KLMLlfI#Ɗ ]Esqv] )٭+sT~>H֜fq~hT%\C&M|FeX E`* ÀI4nGɩ1̮1UC|˻\wXA"cssVRVoU QFC~: c(Nϝ&ubf"jwh%|'g-Oqs Ip7ԓOimsƗY Lq=j˲r*(PVx7l6"`^8r /]Vرc,,,p5x{( <䓴Z-NGy3bCzpuWdi~%v-${&):7G%` ضJMd[rh#fIvU2#,,cu(>]2GnK~Ջs.NmKc$WOnj?-?R&c Rlj|=H--`۝}X눢i&4/N'dih[$ $;+y-؎P.$Rwr [y^?ND1臔*5sp h2XZ(rj'SmV\ jmd2o$B@LAvq׳, UU1 Z!d^oIE=9F0C'I r9lN_oOyC ]$'9=}( 4W6((y;X8$I\iRWIēlnsP,:J믿.H)[\|~>f:n5dh 1Vs1]4M Gŋ$IخX4. U4jupw6~He}Z~vP5H"##}t,Yi6MP(P5B]Z )_m$ o0ܡli[gJX6dzÌKP 3Tu{4}~-7>d,IVd3Y.68hVz$@a}T*_'A'Y5uaI!,oa5  xX /O\2O*NӨI$L1z ;iԪvô;66T*qrϞ r;?.l2ܓ 012{'{$Yz=ǟ>+WuU0 A&@nPtR䒒HJZ E1d]*"A@,@tO{_2+;yL@v AWui818AG?<͍ O]dE|=4 X{*9~*k\yx c`uk?<7 :k *X 4 ,$c{氃mWs8Ɉ>iS'($(b8t1CN^JlLcr$ S15 wєɘ$ܼ~tsy|!'d"PZ8շt:HRE 3aDowc. 1UpÈ3.J"(+*; : RTwD2 &l>p_yalNb{6R`y4{ѫW5_A4RP.N %}N1>qr?##M81t= " Caz$It:] q1,ߛC`{pqV*,T|7N,ӷFtSl!OXL݇O?ܹ}{`P8$=(ޘK"I.]`~zVWol\gOh2ˋTJeڜ>}chFr9ΞRJ),ˢ^3?H,2==> ɓύCj|r*CbqvD9 -m6),k|ñIW9}j=MG0{4?/RRH&pbHk J3s8~$*3kOy%RE^zXL4spHynIx楗&#`. Iͣ<[b404 OZ*E\&;lFJnO8RByk׮ K2avQ 09kaGs>RD"P[I7ܾ˱j%FcoE!/*HFӠiϦ1}Z O?w-YsO||#ވ!sYb1/ƿϻo +ysLh>ldӲYB|L.OX Ol Ĵd\u4Y!#K2W՟"t M80 + ޼ME||*ګyF><Yk#K*"w667\9kݐOD45ŀjL~_(38N8.^d"$)T0;mFsgHա bTf(LR̕mo F.A`2$lǷlMK-6Ʉ Jj "P$EUqdCBZ~H(HAIQwM O'HD@` {GEN=G*3Eϰp&V0=wTث풎87}==ҏ#[c@~""&bɸ1r%TU?#"zދ[5MGv_K"SIث8}N;acxy]PȰ4/ғ9>OX"l0 @,(hVܻˍo~{}äq*RK?x'8x쒎F?-hzqzǶv8b`so=/}eSxz%x§c!~0&]%]Ea ##9CdYBe'_Vg6!57I:G%2*{;^J/.0h1-C﯑)f5hnn>W0*"/vX8•DGYY%&$a0&IhT)Qsd!#I* ,1D.>,]Jiic|kM1:Ia|̣۷%y!ǖ {!\b{6Ķ]zp3ҭop 7-}cd*C_`ADY 21ap4lcME F |zc1Y)4!J$&TĈ4u"Uce " Ƅ12ZCkH{ۼPo7DR >$-U aa r-PDk|HTN͓zı€fJX$/`X&~%TMas.1)`󨲂 X&-I2L Da'(g͇J:P,LcO28~%ұ3 X9O癞;A1t~Ȣxlj $%A^E0 Yvd@td@t+h$eeDG"`4i٥#"Mƴc4UEEK\_X^]ٗ^`1fn\R)6a:{D<^hNQ([k+iv 1eiyƍ"fedˤX.>K>sK$Si߽KOʗ>t1,..y1z.(pi!ccփn޽_>ίP%DzH2C)NjlxԶS!gi .]$ Vkvxx]B_|%^;Wss+PȤSf)˸0"wCD؄련#ä*RF2n\[?`wJ2GǁLy31Y$ٶM&n"* 3ܷT.tv{_^d0GccJY˼xaqwWYlhwX;,<x\_ d|^~5-Ͱ2þADz 4]#7r}:Seq{#/-rK03W(/.RL@ⓟx/C >)sn6zg/>/?ETF58!JUΟQh+3E,^U3-0v9wN'H˸̓۷K# 66Y["BקgY4 榗}a Q#:"seOa=TM"1#ED9n5 ^EVhSdN4-D5*[2L:3EusvsU1MrY"f( (', r1Mqz";xt6U|_&+ |?|1"l/"p;|d@td@t $I"J 60[U=5TD"r9QTi* [;]Oy Dj6CA9ti:^`ڤgZp7>Eԛ̬Ob1c 'fmhΤL MӘ 2Q*2N^ SSȺF}ok2xk X.+? ~#Dŋg)%.Υ3v<$Q&pcV49"JOu7lL%E< ll2$o&$XR=3.Z.ޠiLH Q಴03D.7PEtYe "BDTbo>o 8=R$Q/<'x"L6bBQ77~t~byi'/R%Ο&Y{ֈ._ZZ1R("ͥxo_ss `Ȝ/ŐeH)NƓ%$s-L wMf(p> jL? {>Wc 6mJslLcT]cnE1oRY|5=2Gs+)ά?™YtY3Qid{H>cXgmTB""jă{o<;`&F`d3=[dM*uK$F~SO+O>RDD:v_՝-|g2w~mrxx n]G'(, 33H!3 T!%;uN~˧ܸC,3OB@kCZ!S9>gx UA*2x;q.6#à\# As<&W%tpE&"w|d@td@t;,I^@4 Ɠ@+*neX,繌w#> %'rpı96~"*ayc<,2pPmrxd/CSU}YN?!14l~,?%T2]aOk?X6o??D;1EkґE0DJt;gfPU{" "L]yp0II*ћ﾿<@I Zw0]!z]88|\ r<"_?#I:O3;3MR&AJ N8eXc?:;dg.ׯ~_3r}(W a8 (Aγ+S'>ɩ4/? V'_²L2(,3lofm( SS%F#t*xijLMM1ITPOvr $ytb$|.ti-!AgX<J%6ėp3뫷IYaee)%sY~?m`[lQgiu4ŀsdƎM:l(1Te.N%qhu !IJصTmؙI2/7n]+s*Yܡų%:p38ȠB:I "k-s9h:l:cIbN*Ӯi6wj?r/GRf#z@h S*IkSbA" ;.iO{2s06 O@Put=A{x29v ]!Q(S{x2=Flr~l5HOtƎAP $\Egcǐ"Y=2ԄNynz}5&-̧FGp0|A.ɬJ6 HQH$ӄS1\{_BUַTrH2:6lLD*#YiM' ,hq̱LVqve;(UX8vK ܸqL&~&^\ ]JIqHTDW( w^8E65Y\\f8Ͽ@ĩB4b)LBg|AQIӘ#׷B!P1AR~כD=!Z7#r#r#_?^ҕ3D=z;@d#L'חuxGM֠@TQDleAV[@D 4-LkHHKh$O=r,K&'k;,;A2%ϐ(L DB&;(Dq Q^ggƎ$K= 43 gIgL/N32[bJdsXܹ#r#r#_CD1M(>=̑u nTL?nd :lSwIbz 4 SzIV9l4Yۨ]JdgctUVY^=Ƌ~|#GCN.%p 9rkTIZ{KJȧ\|TW?_PO#WϑӒ<~ gK?VF ]f+S:m@LpkFm O>y\&e!K'Y`o0v;k\Mfr^xQV]{]Q!VSxK)*o 0ѹYp )c;oNFT"TM/<^ɥ<^|g#^$pȒBX@UДIib&ưϽM׈ȋyZbt6MK1Yi@̑E6}DQ^L>(D^㫸mZȊ轟],f03BOo~'W$RyntIG7q۴Q:Awrrqަ<#n%88'_R*ɤ{* =g>.]~m#q* YGsMʥ)|? |RcT*UL$Ce}ޣ5-(WΙ3EܹΜV? h5 L diunb,\oL!_`ffT*͛{ wzUA|$+$|yZ ޏ:5!J4')Stz&ưƄg Oe[.~j9->3UJS,ѲO\ttvVJ&mʹ%\e^~9Jt W$ IƦKxw!\6s +z)#G.i5v1c.-0;= yR OaR(OH1Rrk)9"Lycݾcm3s,o.Arn?bvsm54Uj*'= "a+"4[-ϵ[p8Dt$UazfRij1>ܥalФFm~"35Qdϱ ʄycCr<##ŀa M# BQ\TEƱU& FƀMZ&B$q9==.R F~wp1akFC:e0h6|cRu-zC۷SX[9 8XAVɥ>#$Chjmk4fa{:þM1d04T୷c- $ Mo_ cvC|ߣmYu Rx(~7~iN_@B.]̹sg'.o_\煗_o r͔YFb<om [xx6T?}~'?k/?>ye4TYL:E8ll4IS8أn3p1Ȥ:mcLU/DHa005$ cDH$%Eu B$(#$bHGU!|ed0>tMSp]zaߺ3NQ`]OVW9 )vH7ЇU科cDQUvvm0]h 姹[d3IsseX 6pL2zO,R,N:oіew}pUxC:[a#xƘǀLYŲ6B BBV^sEZzߵzw{>7X\GHס%L,ˢp(GAV0WQ(lf gΜbe&? #*2v7nR*Y_]3hjQ5v:a|IG) v$ ;wg}|~8OwYZ:N*iַSeqPa0;Saoo/33}kA{AmR@h+,Xn첳xNԄr6G"[U~uo{@Zb+G)lZ8v ;`q4vaXN YZ,~<}S y c!1S2n&Q Wa0B]8>6ŠY#",]bzb[+KZbZcܺ~vҩ;d=G~dEQh7똆Vavf[/b1=w]aBPBUA"$Ie=` rv<őIzNѥ3xI4!t;4j{LLL*j 2U$!W!9!9!W M,$ YoI v;m&SYCpMEQJ4mD]A˴hN]FC0\fYUEFR 4Uf> A)H NI Hmp\[H aH.W ctMgai~#ڭ.7DtZ3Ȳ-<ǡqmw??A.'7>NK k|&_~>Fhit]=`0@%tC'_1:2RV|1,,JLOOEŸ IBg~~MvZS*}EP5Џz,_Bul+Wq #mvI:Hz'x|)9>=grBf |~Ck8.f(zQ\#`4g@urdۡHCY'l QҨY#_, 1"UڸX]Ѱed)`wkcjd[m8eƕ׭_: ?9 y.-GoO?q14f.翅*,Z5ZAtL_b%"/GN"n?PӔL0pk-8B٦ڪ#$k E>B$TwW^g9^FJb>9[m`ʜMFΜ}857E!o4j[Ӫ16y)j!lo,WY<\JG8qna0B_9$ 8$ 8 ٟ)TU!#2t ]S1u]U$x/?CGcjbYY[Gd&cck(Nߧruw˗TIRt- DU5$ Cq" X:m81t! #HӔbD*e1qswh4iXn4Ep]NYg_2'x!vj`ؕ<e>-jadf_(s~=|wQ#{2:1Cyl&um+eEQ}0 XeVW0uJJ!XXXQjgt-&&IMBQLvPd195N$,,8Z^oi d4`c}/p0>9.GQt02>^A7 \_8c33|멧hr 356Ni EƏ 9{_y#)y88|$QؼkW_-Bn`{MnKfaBDض,؆A@\Un::}(LMsI}Gβv~mw8]!bV^ajbF+/e5mmDC[Wc>:u:G9E2%#%>Vftb8&rࢤ1Gfj丱KWY٫r%ow1 yv6VPősGpv]<:5*WQ z$YlG~#2OTJ<3Kw"B(IѢl^s6vEHk zL4aG7UkYШS8}Ő1R BI zbЮ255~Dnvi4X['py~W!_3x@Iz8L-˥o~OKmǧc126N~| %Wnj5A.sdr8SS3hD?r ]t]ꋏ!) )R `F Ɏmo˦Au)U*t{(jWڬ{`IqHll##Zm P ~␀K~qLgR"gDhH8l!.>UvcscbHzlntISfk׉DFiJ $!N26R"$SdgEN2)R)BfFdI"'c4uT ?t00m8M Ӷ DIH`$N\*ZDY'b$ag{oz!?~nϠbkosU SVx:]筜cJ%N9s_k~-}~˩cF]$ fѽ4VUӘbgg 8v+7V4 tz\K,ZcŐ3ΐ1pDQ-$awgܸL̀+Ҏ-ezfZx$J!?Ĺ狌1PB67pas󳬯293&0LLSɅ w319yI/c[ 9ujYٯnSDkopuDpmc&(P5:w?p?ޠTK_kfNӢuasm})B vs6C[gk&3: gպ5GҳOf$)ػ, FNjlDb017ODWe$r)LSoZi;op^#g渲]{B.O%FF|)Ұ΍kLL_[F6lqb&?2K`,{ds1*fbe$ʣxߧX.b]$"%NI&lU'lrNXӑ%9~4?Qq(f $|M IB)! CZGpG\(}MeIzH@}A@O|CW??<C|OW~Wa nR*4]?اڨj2Oi4DQD$IBț_y(X& c4Cu]TYAUU$& c",'  ;/GBdv$I" E4+1?=àj)˲H4ME>~iV EQ3"qIILN8G㛏=^!xdM(LKNC+_cyǛxܳDgmUIVVc) 1V69#o:Q/@y$YETTd)j똺Jer$BQh7(*Id3m E3w§d q620E`l|FC>x>Vi^~6$b@UbRtfv-ahHBFQuʕ"{LOOTeie$NG!X68AF|?׍ooNC|OcqgHIUUV0 CB@x&8.a"I />9zs5 djfqu? 144M,h2~0`{mUUuX JER?ع`@loo)ibvVYqŏ 0?=~C=u]$#"!0fX}PT(CUdUǰr~6qTݤ069A`6eÈ^"=@S(PT0s uCo 9w7=pw{%WW&L6mƏ}CN8{8{?z'?O=2~"& IDATBݧ},$ \ƵX3ĎC(]NeLKjy 6]$w^ع7Pd`H?)NAϕU]#FK!"J[7%Het`wNJ`g:B$(Bs\4 OG]Vz0;xw8qH@q))B"?}ǡPPHDiRCUU8N $ m> :,XeHm+˼$IJlmxeEBΦϓ75y(blJdECl^>v!atΡh:a:BHz=*ȲL0m6fUUr y(d|r!qg$EZtCo `{ Ov/7+/'7G>ȍ~  T=#YOBu ^خP #S'u&*s#.n0thuӘBō,?qOdtPdWޮaeP&JA׳^Y؇{C$eɻ}0uY!*ڲy|Ȁ"ͶRP%DO1yzB(2rJ/? v ,qM$M~q/EIdxUA#k"4-;du%k/$ Hj^NAA24M(SfJ٭A 5I0%e;|ۋIԬ494-Bex!{+I^헢den׌b Vi}/=*8Q@cRBtFr ~$accca0.q171n~ϣwdA'b !>nR:SZǗ>VB2)Bʡ9P5,U&2{U$)|EQ<##E4M{ضeYضiJ%t]cli2MQ&dy\`٤QLe8 Q`:B!| i{#ah& /%@RTæ# c4@7-4Mr4%,5 3$)X,.+|S7|MGYN&Gϳ~ۈ(}dXۿK:ZRʉq2\XDz$AO@FUظ-`eW)Z{k4w8rO~QVmaMB%93P5$L;3$3b,+{pNӬ] -t]&Md8;I !Qw g?+쯼@)hĐDhC$ uh=l}b(s#M^$93e9{RIhd}oB'Y 5c d-35ajl̤ۄ*thk >'C2+IW<$IȈq1:ڐ!þ)JF$г,z_dxE+dHb2$p< D _$o?V(F'ޡrxߛ㲱Ń㋧9t7 .Œ,ˤGH9S%J=tsёv{6v4?WXެw1/*"ri+_Gd9/ӟ~~I:UΜ;OK z_EaH[u>>'yKpܪUW>7JowȀa 2R*p4N rQ]VS:~))ծCϹ1 *#K*EBA1,# ]>c=7~$$ Yqt-?U>EX It:JE4,\{,؜>wUt0t:|EQyfwמx"+rj29ˢk335ƅ7cʍrA.WHs\#HhXv9ϱs:{9Q*] B8w] <յ###Q3 KA,4FULfg)^`t|wN-_PsCJ9Q,5jTЄfiLcz| MU òKtMAW'sUЈ40U EșepiB@Rd4-KonZȈ2nOGR4]$CF 3G^F[އn;Ftu7-JM9wOS*pAt֯>UetzqSw?qP2X*-gdj%/PzfثÝ$gmIxAf *rf0Шth4P!QP@~-PҘcJVrЉy/>lw^/oRmtyt>Ermlb w_qǒ2`^f Hj"nf!)鐸IQ5WU!dJd vɐ$@F R^4Tsn]I)4uJQFL4#K9#St[%2 ѐΣ^۪>I$IbHxAӟxHTQnib-GUj(f>^uۡv?Hqz3Ka|`[&Q e(F5 AS 4\z>qW2 Det$F6- FTP0L\?2Z&B'gQfiBWQQ$0eCUI0PmXTCG$){lD$=vn\A+kK߾mVzkLM}~|4aGz9Ʀp{LNϒX ol>HjHY&i68^<et(#cKHfPөWYwU^x:YZft"@ OUg+ pvC7*r+Ӏ]((K ex\T>i [߲ȭ>%;͵NY]O_c',..27Y1{;si\jЗK o$Iv]P<׏$5D,mHdeɯ$I} ]`5$>0dI"E^%{fJw U(}6Y\ؗnu0G$s@U"`sDmb9\|>c ܃)92iQ,2RެӳlQ*QT6{fGM0!7^vگ x|#f y{Νg,?z? '=}/?`w݅m<vih 8z_Lުc'Q03Bom0253}NRay'+qN76lCE$D",0 LBU\ajNri( e˄a@8h2~TJq ')B(G$GPnyC !9b[>SodJqB!Kct$9XI%"5v,f.GX⹧_]k"gz Lt zU^j7x]clm>f$DDdxo3s, yS۫CУ0q 6ryCHQg`Ix@W37 Z:aecT)%}% dY D躁@"M,W/{dyw~N>7az'#)H)R bVLZ1HZʥݵkUkڲJW%ْE@D B 0&brn'> `W5on{Ss}7/$MTB[-"4C7Ƽ'Ȇkc}yTl(wp&#Gdgy_.NK]N\|D |L:m}ad!JC] : CA2h`*w+JHWlv$id ~RMvǰSZt>IT!2L&d-BD1ѧ~-ajzҺA* <@O(87P058Y*gdh(dSTʳط4`0RK=$аMRiBNy&WIYܷa>XXߐ[X -`JCp{a t2-v0fq?~ʔ\Qs=2@޺q|=kXzQ>SgGt eǿo1XJec%`Tķ٣YZ^c~v+4qE#"l۾YR.;Q+g0tJF*DL*!"v; "P̢:  C۹G9?ry\c`0ϱ7Nvҗ9v##tm M#!2 4 |)%BHtM%l"]i[$ :.@ߠdMӘ/ߵ~_2MJSө4$ 04@*a*_ڪJ$#HRiEFi"DTKUt(hL qwɍ f3,{ ߲mtEv ʍa:v:2z$ug8{vjPvk/Ь\$p;hI*;{6=TVN;XtQmkӪ\c1ߣUu>`1 ./"E@!e-MI*~aUΞ3!eZ7"Jtˣ%-Y]nI_WLN_ ΀oO]?ץ1#ufO< /ÇVXGg>zG )ghpL7r}aSoWI{p5~$?cCwn͖YsHt֮KW͟6sM705aewPP^nei#4+sؚAA7 Bba $XV"B4E`~i&H !I$J "((i(BH"E%m%+ Ƽ' 1 }d2G:b7fo`h*8G?˼v8#9j!:*AyRH SK?b "@N hT1v1 ITHL%iۘvϑLt(dm5L\fiy UU1mzd}Åsg(I!NKɾ>Buϻ :\CuuXߵ`D*ai LԈdҩ8NRHR H BR@_'ak*B*"ޠQD/}$35#z6+ߢrB$3cv9&=DǾ;~||:AuiSG|ɭزeWΟo^dˎ{t -(gN<fALPUŴưtMS{hWg\$VgH RԖ\ff(F-Zn_lJaʀ\֢tX[r`N-R(dtz(h^m{H$'}9˕[ %}Lj49wQ_N BN:֭={~d"AFU*keLS'y.!$ 8dY}!a(Z B:[:RnE&RQH=nCSU4 BUœ֑t؋Kz bY9Ody^1 N O":Uj0T gdzvhΒ,Y|kXqN#I+dx y'<Ù3}3$R`u (BN>?s,x~'6f!CAW4BGeRb9B0BCet0Ia2Ipur Pi"UG*W_{(84V~u=ʶ_}S7\T dK_X8}vT2 IkWpTZ=c잞]<5G瑩lݢr,{z=SoHjcLNo&MOJh"._3qC11jwF$)%}פO'2-X;}}+K1qPL&AqTi@ҊA/|6l[L:y}wɹש{kL YlJ}n^}cmv*v3:NhxaP)dpGRG'W0 fI*-~}n۽ gϐLX d#_%,j4̥k?8K旿w8I[a|rzs#8*tlVwO`d%vǑ2!K3)HEC>A PuVu!DJq3я<Z^/?Sce @UUDj̬dY:.AFwǥZIFF{x|IB2s -P+WPD"/n,'3Lso*qpz=4]C EV:>lfmY?ӄ~g~HUbSn`&-@e+flHAՍVQu4JD~UT4MU><0ώBs6gxg/}^:שЩ\eK_&R-/>OavF'7^B189*s/sp*w??pͧ#ԙڼUOq?P}~+[ĩ(9ʋLjQgd:޵vА7퉣Aɸ~I\mf?k]o=6&x#T(o[XNf !u3>i@Fb&DK?I-=/piX\LpI&'(Rn)qlBT@*7/ffKgغybΜ훰th\eܘQ,0o8{GjC|zv:Of/W;wb&ZFGM޾ǿ8۷M34Tdi~xLωSo1q)8~gO)VKDm<- TޢݬО?G}"=_EȀ 2{ô10pC( (f(nCP#[%RY̓L0D!Rx~nhijg$ ."MMkl0 l"# o ,]X,Ri NuzO댕(QDA.lߔ%#?fj8!q?s0q eakqML\gJH*GO@o!ly6ekQ&#iߞ%pݿʪW()N&"A$(/P)7 Vi,JY~];]F'o;6VNt+(R%78BbH)H$c)ȸx-YDXM0h8RHǰV籇$]aeST#@λ9 [c4@"kv{ Z!ˋt Mm)4VWjI|\'^ J ﶹ+7ket{ \G.]߁sL/hD= fd6Q=6Kt +71d*f?{t:Cy!.\:FTH,{!ի)n}U' ism&| f.Rܟfjpm&tyP՘Qxc%hJ{O~”7d\}ùWfpbّd4n'w2)J5-s̞|HHrzMn§~a'rj]wT^྇n35$j t6oġ9v,w[(g_M TPئFomCh+ $40tHD-rQt(J 0(zr9K_E= l\1 wd9 >ir]Voi{?z)^ˎ{H)co/<4unHefnJ87K :a(Yc2[C)nF᪪O IR4J E@Tk5T'n* $BF b:#"|υHt*̎oF1c'l8qM%N%]k?[`(M+x@UTTUOOjIT3 ?<j>gsq 9qzmdy=B0N8,ϟEOEum+ϑ !~jAgeDl6IZ]P13(FRۢ;8NB"Q ҮZ@$`*~9) J@Gc%#c]$E*7@\;Bm,NUXUt+LlcXW<=ދ438.:ǃ{?XS?t-UƉ'i:|Wg/EH$r$e@qd+STz2|#b' P j]zJeDA@z^ E|Xmǫ(BQ"S7Q  HgKA"I"~jZ-XAl{  %t%HelVWY^.sϽjm'yF~)8OMRTYY)S!%a uúo d ào&U",gkxNEB!8KSt~ d9.`zf*iN&DML&<Uӈ"k$q@Ft:mʭw? ve\eJ"!^aqQkkxosI֖ 6.˶D*Bc U ft$+*tAԫ xNM fdEEi,F87p&[t<@$*HGHH RKbi4å γcrRB[& _tk3lڼ48K,c \/ >KKUa")u(/.זh3EJW9yuƇlSkaZB86 pE*v]HhwsI: 0)4̕8qvlc gn>(n0b@7k|%6l+ɶcVbouB! $ߍB?5ڌ [Z#m9wQK/СDgtb9~o77MdRZg/qlfN{kGү3 -Wٱa/x kUVW'$XYz/pm:o[c~L:F:mmJz3Tٵk~]-{>@4 O}Wtu~ ޷xu IDATA䛗iy'I*Lo)pü~(g?uan5dedb o=wƶ-"k^%txJDfv iL=ah'zeнjHuaN)R( `6Q:B7G2(RqPTI(n"`xx&j`3?Fo;VfX~zl٘y _(*BFv]7?q=j.k:co}MW 2i4aHXjQ'޵Vnoʙ(B3t$H4+d$4T* b^ 6(BHARAӍ8p=x}L2?9=smvhG!I @IGȘ G6W`n!2ՕY~ﳻ{5@&l$(,HV{^)8uL3͸H(C$=PO%R0t]31Yz*J䣨&9(sfnwW>VKK9yq,D1t"uiWՈ{^dzW!?8m Tj6]ed@u2z tzO,t{S綻g)Id kKdR* vfژif$B U я1s"{!Ku ;@J#4,>s( h{,/TȏM]|y0O:{}t;1!!FĬVʭ?׍ M$4 ;ItZ @hqy#9Żwe/+&F}V1>]O(H:޻$͎ΞS,z!2L Vصc+$°HRj~;wl{iug`cjRV'ReJ!V*mt g_~7o/s1r_z z"s?:4<"N5~'ԧ>D沶|? ~x'/72<2']:"da֮FP8a#:$e)LNo'@2,OλraNFE!MVęSg0t d/3RF8M,aRVvu/{QQ6}uuCnaHqa!y*Rs0$_MSd29# cEke2Fh7[XAI")H&tZ-ҩ!b_ߟޤd24]egc[gL;mpDH0;=8F:-U_'B"DHqdfTzOx('>~k pY~+{8Ԯ8_R_\d 5g:1L+CٙX!HjWDKʐa n۵$\ Jex]=?>xdS'Odp0s6M玲s(L!PAQkuq?VˤnS  34ke{?R@hd9Z.aĶ-[X:V_c` 3?}<=\(T+MV=Jز:K&kz- 5BBR =G0e+BS&n"nH"D3()W7wB + 2ZХdRI ˕*30-D:F]b AЍ/별ݐŪ`l0)K4k& lѨͱVmv]N]^F& fՕ(j E(V.ǵ3lކbل=NQq> ɐMc]cڤl 0U <w;~ؒpj5B7~ ~$vq ~o'^$m9s)9pv]__O!'>E*eg)s/EueY(BeG7QTH&l[ %Zhh0mpˋw۰MPI} %t<&YBU_KFT0L>H7Ll~]|I NR*Mz;h|n46['7yeI'^a 1dc6W?@QT$ z Y]VG3M& UR{(jt:8"2BX (vt*vPl"+R,zu|>0VV4z0a0X0L17?G $aRivRգزeCWn'=Vk;5=[S 3O=i1nܘa b7QUd:d o "$2LjHd((pq|@>tIi،mgZefnaݸjId=n(3=^05RJ3Tڔhj}_|hꭦHXk0,Wd(i4ؔ%c ȰI.&c${vNuz"G[&.?O~;x6ۧ'ɕH&,+7xCEvBU+}*D:iL=}ЧQICBp2c#Sl#y{:Klݺ!NZ/04Z]4٬mzV E3xw^/\_"?lnř dy*3kBG[עf ySu:r.19<97 r;CH?V\n,p"c<ɯ04}+KU ?: F4L4trC[޺ J#TG]tBڕ5;0ec;P1غNE# #ZW( #,4-_dP (crU o* Q0-~o3r#L|wl٘ _$$!vQi]"uzؖtl*DZsؖOX4^@U5Zel[$I8.,"´[qJp۶"zuw$ BJteŦx2i8]MՈpzVK{[-$dEQb$6anRFV *ڻg>k-~W~?[ODSPf[7i$S)0$R"VO@ (N$q]DHѐ2Bŏ[U ]S, T4P ZyzAj:HQ+{~Iz羿7Swuwuar("@!06imoֶ6&$!@9Fa4ygg:WCaחRUrA U^Ic5"><%ehUBvh"R)m[=]4*efQ؅kgÈ9*q] Ys"'IqذOϤ tsu&(6jUQx;ea=(x):r<"zxHOV.& ˬe2ԫ&3P%s3'q"cW+ボ8wT|.K3=G^-`l\Pur) L,]^$ !+2?wtd~>}' 茊l5D-ǒ, UT /h#_;nW^m#t<ģ$zvRj8jɽg7CI ϶<A#ϟ`i$39ŋ ""*c~S֘a$P!\'nޯz s rD~vua,S\;>ܶ=5<nxHcǘ[*Yto}'g<<=lMmMmŀ|WZQ56H8 E׋CTƵ- [bZ(`Z&cG۱?v2 kYVm YU >sV`uF}:БYbt %;P̭`8ѣ\)!PQe `6.~E%bbqDEV6$W5Y4LA@QTY ݧWۯ[Gm;T*`7>P-ev~Nl6q&砨aFA5i&qLusuZXPӲT]C|؞ 8O 2"];(f$Y+_Y[EVuW_A(prvQyu@wO|vdL̹Yx5YYZS$;832SA j q8˙,?~!jCmEM\kOϯ#6;v@[?7 A]IGtwݾV>G.䯾};w^O>C]A%Ս"hR5'~`qf9ۗ !#=AVB.Lnh#~,5ɁepO#qȧWyP-^F[y9u4Lo~[hWyG#̠ RľhA97CZHTscTqg@Yg/17I4 /²ll\ϣZQ*XW\MQp&Z2,8 o#A.WY1ryQhɝ 6$!zzLad*@ xis.,a,fJkb2:(4MIƶ,dEaccMUTknt'^d}i_Q,n *>fH$NlyTF8nP%ORIt0q\\ADIOqmQpqm=jp<5l+\s%m-z`۬X"Fmp,(:XvDCH$Sn`ҫۇj)O,9Q['[?(F/V-1, ='xXE X_n'.b:Wxx,<k8X D% x0y4_QDUük/=a410W@%| j#LUfN~ @Ո~;&|ǞF4d=@)}Ip?ɖ+,^OI(xFBgOs. IDATi:GX}P$=d^6OWi8w,~A?\P0A8'W,u bqw Gс^^;y0YiVS){MtCKWJT`j$F|rbae,/-F=$XRIRc\nJC̮0>dړ}Ϝ K&nw=ȉ[I"[9;3K#Kf'BΗ-S]aj`0ls$xSD#];w9vF6{Iؽ}'O=*ဏ6zzSl*${R\0M"'VVIuS`=/@2f6$X^^$"W]קLѨ5 Ο;GOOs?gD"KW2kTky"2wz:;Oo>dS>x+똞J09u~Dj(8ۂ>Ш7u-Ct$tql# PoT 4nsV[jᒕ[>?Z Mp,\4RBDU47Jo:I'<_dzJb+4&i`Ud5gBʰZ?̞ K.kZIkEImqq*9MmXk4Ȭ/Ef,Q)#Ij֖b;"*((KhnKѠRQUɯgk+TU䞷F Lo>E1J(MoC'۩q׭|KRtG]U0}K CHXc1f)Μ>NЧX?nQ9{$}}4^|s ֯9 _$Zy~Y*-G>x'bv66\ݣ~͞bgGa)cyrA @~S;J7XXp!2C)*&ޝ9NAg p#@A %+!K6S8|V9>K ,gtG<(D-BwW?zD"QtTE&W\#]"[#ep'ѠpKurhJ97],:v mViZ 5|Xf?Ovp U &yyX]I6E'fٽo/oy/T _3Mdg_[fY]m8=Bk嬫3X_;m0QJ"◫8eH;usP Pʭ?0BK+GE(U Y_lv +G^?`mP8$dl-MߠTm?<ƾ#zKyl`4&OF=" EY[Yϳ9u"}8zmvUd/Ǝ6?OY_>Cs3\<~{{o?a(|w>׸%Qaܳq?FbUJٵ ~pXpdwF^wItP|9wmRQm3sKNb)O3qݿ^~ֳ8GpIdU&+>?6 Ȧ6 Ȧ6b@|=T%Mp=Wh4 $Q0 rZ$2Qg _wi2Qed=:1kNDUUi6Ȓ'xxqO֨!K2ʑyb6M,FQ#2U^b ȚZB(C@Ьf=cfٺCK#jZYsFzuYA^=1C"  *~ ,#EȬh cc{l~^Μ=8@e=}d%lœ5$U2M8 sȹӌ NQDzm$dEsLΝ8HtSXuFp|$|s!Al`eef֛T)3>6AЯ#kWPU#y5vn$ hkgIU DZHgָ4sX[RmKsԍ P'/,Q7 :ü|ap8L@ٳuT'7$h6[&8װQP*m|DZuh*HHut?l6)9:a4i[zQb JW!vS['8ӬO3IWX҇hχh.iҨWq=zJ$`p I$p<Ce4Iу!,!S}-(~2I.y$BY5%<ô-\r\4MhCUlѲPA74U%[h$UeZ QYv-Es<YQPてMt_Jk7q@jKZzA%Yұ*"oRZA󇱚u$-J%jldqr (BZDV|Ogw/J Q 5`ޡ)сK< "eZϽX]-AaՊH&fϮ!.];8} qa$4VB"ìo059L,"K.h+ g9In )h ٻ33jAM^QjdN0N%yv. [9{!OoJeB!$}VfXXX%ι tIEl\Aulm!@q#KVb{54-H:[DVdI"#~L@ӨaOp %%q]7S)_=&/ITUy so;>_cddz-\;{|'iԛ|+3׆߯NI}|ˏ2>1z f9)Vx汇9~bJ<"hTU~lRj.q>fmbc= ) O>`y̯ydB9y3j]ScTw 2wz?aԣ_チՋDB07i 3'/3ۮ]oD$aEǶݻ}D.\MMM^fbi"&I4 4MRE>1 ㈢lld ;mh4i mP: VBq=uLǴ~F!MUj#Q֖|~$]EU@i BV'`$*bY"(ndUFOaѬ]]'ETYADZ1mp0"L~ejf328FBDBg29Bq`8•˗' "2= =xѴ"պC,h11>JA[2mCT+N@Sh4 dh&$k[OUq=gfx gNGxH$H>i\wv:;;1u ɡka4U# x@- urqBN:cq4%0=qQ9pp Yp|eF>y4ybjZBӴ0=dg/+k+:HW*G_a\2EGzxk^e:M`[&ʐjsxkjMSE;0+ $ѩQpym|'wz q0+Kkq62 uzNVF[Ξ~n"66*HJd<ΩK4MF{pz%ںzreHGibH_'CaboA,jf'#q.]|q[nA58wy+GP7 #!r|͆GO_G^[%ߚuSЗ$Ozmb#nk=YXXb\ZSAqC_6cv ܤ^*S,dΝd$!1@WK"="6.3A>7c[x( xD HlhUڄzHW,'T(h1c)p º9EaL[[ PUg/Xn)eN+3(~,Ic 4 ²,z æa4 "*e\ngfvg7>4kuBg-TjM.?Epr{!2NƳ[&U?}S,<)Ʒ_Y8b$7j'.XQ?C4f'~ ?Im;xϘͭ$\F ~g49a6MJ<EmS]d֗83320m}ܼkյY`H?7L9p!WA %eGheCRdlEeieQP&;?>ξA#=A,d!z7,v=]C^QQ+lM7;C,tyHQ䣗/jNAQpj11x|H$ҴQ 3.nccc445a "!RZ:®dDf3([s4 2}CIMk7ٷH'g~Ow~+X>F'pe6o!4$T$Z%R^QE¡*DÂaO esH.ycvb ]$Id):;6`At{000Hrmva]_LMucC3;t}XGpYLq=!޽ EUmjoN Spy9-\`%BMyӗL,YGX]#cbrDQDl(AQѩn)+ 1>1-s}t4:M1_dbrf06**+h4Ff9ɩy"nnuO*>"ih/#PHL2=}fdK[5A7dL)i.Qg&oSS5imidqiNEWEn: gPUbc{;OvJGmww199JO&Ο?Ëo چE1 r4m\nejj]ȚۭcwZ@pN}9edD[ 8} (P= TVϞԹ}?[{lfy~Ӆ Nr WLI^6)TdIDuj ݆a%l6X,D|ᤤjeV \e5P,%ݎER²,(+/'H 2TfrsSm^ Ahn,_a{oI%6XdUYZ D,j0ݴ `-J.Y[c-e+j1(Ϗsaxd.՜8[i=Ϧ(rkvҽ0lt: Y 1M0LJz0(N,$|ea,E)bEvvKbCWP2Q'O@d̼MQɠSI!BZb(H9bq:ۨ$_oݴG*H&gbd ECۇhT]l,VTnLzU*fP hX,BKm%CA6s& jRn2^9:K48w{6=Bkklk Ngaa\ʍ{6xFGe25ދj$YJUlVnD^ϲ8*rU+GXFsu -a{۸tyٕP#G`h`[$Kdj+wU ;qB2]uN7w_<ą7=\&C-i}^Ne9*5ϟdC|c8ɿORoQۨ9'dh4{Vtq ,.ҲNg{Stvpw_C770Mkc#Rn0||G8~yw#E6 ]73kݮp7&%KqKi^{Q.z|{Eaʛ[9K2Y?y'ßex˭9x_+KW0 WGA>n"I*dID^lT,, 3?:/'(K|kNJ>B%8>T*"W(`)H:r4CI-bWEը,/c5ȲLIS)e_P( I*f4RIDUU"˫2dY\vEqAE$IbY?YɦhEIίlݱj՟ ]7;eOIBS <3y;oI9CDQVEu=lpnaS8W蚉nh'LƩE67QmKRuy R4m5zr 䱋*UK}5rE?ggמHi+9,2@5%Ρ<kȾ0v-tSOSUgCS%>2;nx,DS9*tJLnb6|<.c2sK4UP[C2aPsG\WSA:#Ho`x2^iho'\S#)h.ΓzL9>Mu,Y2H tM`eeήFGG e8v0uffijcr2| I]Mzɠ??ҏ! lle,'w]jRI'./ޞNt%ϥ .OѵMĒ)l+{vp1jk6oxY ŁcTUas!2TN< e3+v>[ S]=<3ddbo;]$Y{Y.:N[{RXX$i~/UM#|~7K3x^ffM҉ìNOaq|-X\{$KalhH:+'Oӻ}/}dJ.D~ oYڴ FΎDO>"׼c|'Mﺋ?L!<5$hS EyᄊLR qSr3Ɂ'KO|c+U,bA+дV|Incraޫ?݀87o+l2 8KxpcqHίU󥟜G5/17?d$'O1Tο6==_{?xfgb|?ʃW7\z9V1&[4tQ׼%G~̇>1L+ W (\oBWUnM:EL|~7+ q.MmJA'2 XÍ) ?p5/Y1ec_d\g37"ٝǞ=;8vV)&f,`6ۧqy|~n 0|yGư9 j|_?׾svnۄEO>̛G_ph&G<*$1v|4V Ʀ.1]d7ğ=~D(p gNJy]5عϓ,=q ֻl#kLNճnn t]#SOٕ<7] א-LNQje-6`1ABDg \S$]frN"tsx Gf8o`~xc9>bN7fЍK(=7EGgL!Q֛82/ ^֒q~ch%l6/~UIk<Ξ:NMM+03:EUuct4o/=Ɓ_cz>.Jv3<_4WhCmLO1:op2) Jhmc~r]SS|` |_꣺2Dʾ[vu^οc,ڰ:O? +ڏ($R lJX[SHs9MbP2tWχYD)\wTJ,hicQ2$JHN@о*0,# x_$>9؇P"'ē;nr+wB,_3n/ӵ0XYYb lܴ ˆ{&Gd/!Jry$b"4bz IQK:#In{Y8<~CAvn%Xd A*pR*( lM[ɰJf10 \tv& /ViTwKV c'):J>^EE%d?x38.\ Dž)ڱ  kXm6 0;$sE9I4Er|n gx<xMӰ,3tȫ:nbHW؊"!"iTdYFU \N2JWW^V;*+ tƏ_%~ʠk,%d'"e̒Bgk=n^_/ogz. D2E(8N lv a.C'L; u]2n2qZ˰LՍVҰ;|9nL$6]]6\K:TUI$ vFlp L/_&\kc3;~ mhlaC{#"dFvmC"F6㶰Ӑ ¹sً,9ll(ctt&/}}/e[CCK"ca.ʞFYHj_9]w܈R#<;c;JnPWM<ij8$  .G`[Z@ϦKl5V3:>{n~X%/mqsݎj,!X\< N%je-S1ښzXLmAG|/|6td'pO.7,GGxmxfGu]9ێqadF3uN ﺊ~pA65˯N&c6fKg5^ĘaMSu|Fcw ^;{M vasjDDlfqSU]M2I6%tby9N&giy|!C!R/ vYX^d Ujj :86tl`jv|Dq'"E<^` (A{[3 '(EJjS&\V{'|W^9ƾFϽ{۰Y܄C>!ĉ7Opzaҩdt>OA<7|-xJ;ʾ{>Η~#]t6j% JQ5KT6sE]vdCgJsgY5#GNǰ49+>JjeR R o:J!RNӖM4\׿s:Z:=8G|R[ ;r.\YB ﻓDEKR ̢JdiY4VY&J>)\>?2U>2lÊnAeDA`] ^ɉiZIk5V?`tl5%E,7QY]Z,bw8He5'Hъ#˔7koeJ:HLAF:8})~[bhŌ%DQU)҈(*5,..r~_LZt},,dь"v YZytr9gͬgS?1݇$&yH"M4Udr!j8?}& +ocx:ѵO>G.dZ;17_C'L\`v9ƆN(E/Q]Us =<̓87v]%Sbt1JvHsYB^8|}uAg[;gbxl/&\b@pŀ\ ] >~>Տ$*#x,;* <.gϱ몫p]]6 jDžde Q1 ڬlJEDaj:%D<̥ I&r z?NJ$hC!jq=S315\6 vz,f,Yfsb'7OK>cn* ` c9P"#'hj#T&_O*̧>#?;4ߺ~JɬL\Ib9PlD6OϪd*LlD^)K)P(P tVc-Y˳(&[zked# "n͆l1 Mgc*I.|KLj!J% єJ*KI)&O/4گHÔp 4X>x YN4n]IJ$9aVW6M,c . (%l!k(F0p9ƮN 3g.Psq B$syZ7PUQ-m4WXĉbdCc~1ήW TT(+N11D:evv]j)^" ULωGil Y[bs0:tN"y2IW6[]]t5H bd2,x}n^an!g:xQ?H&,F%DFLͮy;7Hk%HU8]48-X![p ]x?M('ٺM ' a;>ӹGsc9T5eHSs\{NAWwξI6)!>àKN) HB.ZTP BI25U"_AĢ (&)zQ4I**ضe;NOOs ohFE*+H[9G؃dxN*&as&NkJeu͜WϷ~2y;hjk K+y稯 ~oGֹ_}NHE}<+K`޻+Q+KW NH.jbX((9Z68A݂ (B<oRS!!IGN%G)P(HJt"+<8,,SZ"YO2tDB2Cu4!:r:fBIӋ8vr,v|𱺘BۃN[Znbs H@%9~GOMo:'8$IO/%1!GopWtZd h`p8٭% Eg^ scJYR[mS^?naF0L hf QSt4]@LI&]#"` t`%6_ћa?兒47UrرZD_2EU#2YeHd`:YPhb5 _^8(YKNkW XE((йd8+es]6R^ebz(:v LUESK,=-,̠)LI"% kͽ;L>erbt6N"'m'C\{'g"?XEC}'<|&bLL&[\wٳgr6>?=MR9$SC6nW*taHw;BQ4C<dJ.^>8 uC7inˑ=p$gƸ9u [:|rf ˂mc~a2?|T&"1!J\&XQC.KQ7ygk ]3rel f06y{? f-'?ɇ>^ƙ"%xtürroU =|^~H$zkpcHoo M/pq`(z}|Buo&rG3|鋟fv>`u.tk.ⲛT-.҉ StvTo[Y"LW# l1n&J^(U<}"WT)%$A´¶Z:圞gTUog-fjjG4ގj"QQp--I>Osß{MMy}4Q o9䬙h4F0$ hؾx1`l@Bd $@HBV(49Ǔsv3ߪWw֗S}zUZfrv˗87W7nJv]{ }l\/yv'L WWk#]. %)&  U |"}@pO( D!>@G88HCcr sD,\R,TeS5 ZZȗJdyz@n"aZ x:>ݏAnSPeZGQ4,kh^7,X,$JK۟$ +᳃"*tvvϼFt,kT,/4w瓟 [w1.'P%>Ī=M~vEiY1HU{~jy>ߢ-cy[uhnMyyvAj1&f6s MRAt*D QָJ_{2sE4Yeltl kW17?I0@dq+U:{{in@$$âRab1l˶省4 'MAݰ8{ j$ )yRq֮Z~#6_/mTAf8xQ6oچQL5q07w^SG"e.- #"m-]H(""Qs-UC5:zf`c^d֭N!%T4Wtime.Scl|4xwbԘ_+byMQ>}p3iMv033oqEqR}dE<L\^-""s dEi;L"fjgWoA<~aDM*^b609 WT/gGǘ*1?;W^@`|߱BfX 4@TTP4£ϜZ+5Qaz.Cl|+0̟} ;;euV-[k6q~*K&=_vomGM" %wir o %r o `~nVYEuttM  ( ~N,<"b&K!PQHOf'g8ۯ MQO$V]בG6-R6jK8_5yeQTqǕضm/܋ Jp؏Q)z&&cBQ2UW)HXj1O:U˓+9nz."~]CvTu TJ5?SgؼM PU  LTNԦ^#o`tfBȭoK8 IDATOa; (+?1I(ǯ[$ZFZZ[H$bȪD?sc a~aj4Ǐ Td1 mmM !+ȹ,g{9:EFy$>ٿd.oŇQb-OaW+4nDS+du{\xSbL1{6䕓#J>-Uy-א瘞g6gq_5'9vG `T8xhM.6jl۰z1 :z7o{~ xK^ | _,-7_NXjq7kt$0vrO읠.zdj5ia7_O|{1:_b`[* |wOs5!-q<$rAd1P$ \~#ӏrUWQ(xt0!NF4ul:ɏ^;</N!(T\Ӧ!Bzޮ9D" tt,<foVrn8$STr%vvΜ9ٳ~ 9 'ɧ?1wAZZZPE(.Lq-wҔ.`5 Ul58|A"FmrDRof-``h8,ۯ <ɣ_]W"{UhʁCI* Gy$O*0XTb1EcAG(+RdMft%NJR.GzbHj0LQc`p.;Z BU@%Qs<^]v-v]ca#J}<3\[PB>Պ :[I݊Y`æH<]d-,fuvFlQh%V&x Ϝd|jeWqHqVkl1{=E$eYOO}*7x߻G)HA[y]+>[6U7Mtw +ϳq N8_9jHc"U;䯿S>fz)r o.,\%XQU۶Yj9cuA@WTLSחW30;FT(8G>:7KvL.RR(4aiDz9.a6j&~݇O)XY5GT qTU zDz H,077G0DebapOG,[ ˱ihRdL:G,@UU@n[$8X|&K*DnBwbl*/2mK8"MŲ;n M?APB5ʅuvʅ* }A>ϱgy}$"r3Ͽ[%y85 I즧QtjXvŹY8snIhoT\Pɧ_b΍;1BwBgW G|J"Z[9rd/} #rzw=8pu+VͰv6z }]~yapOmLOgvj\NT֬[Mv>ï~$mM-x2(/f..߼4lj:+K2"F!3EJ -Evz<`ppM7P38ZTLtfNk2c!#:k׭䑟[o׮CwА0Ϲ<~}I>DsR!_'?bǶ|gff,dלt%^{&4eD+VmO kgDC%Vot?y_S@ G93tGnJinv#td#-XzA  Q.q<QDIɁi tj:$cJ5p12T: JP,0~Fm)̎(JR/G$Y(mZHiU 䪆("1.p=M<EkR;H"WzɈ@4Eet](dTEEeDIFВzQ?8_f3JUYRezTsEpL }}ݘ*MQ aAg`N(#S ^O2( 6 27It4ee՗z$Oa!SR+D\T':#]MpXj[ x* xngs#8uf3BxhFx M|OUijamm~> ʪf"!Xٕ`N:C:>O>!TN>Kgkx(slz{"͠j*|lqh8I$dthA<0:HAhoR-υA"\X"N(jy? )Gs؞K2H!`إc.p@2%013;w13=C'MS7zp(F\FUb#q]ZgXr˖qI.'141DYӎQwe޾֬^Nc24/}L!bz!"Z}z{_щ[B9M\۰mZbtzbaj~ݧ X՘_XanFGW(ZͷtYsw5B\eqym \v=p #cgTW駞BU54'ϾF$*W)e&F#h^}^'.%riieN<ߝC lצuPYF,V\ BXf>W#hHkpيFzےtY,32X15pbc;7+&yϤ91abJ:`DdrjdT|Qw)f˸HKBXٹE{y*]]HJDT-@,L*ъike6^CSS`h"G)W/NW['|ӵhh rap-YR޾P wDbLMR(=|}n /rMVehon```L.CsSuUP--Ou.rf$Q&Ͱf&2dp!ʥ fCp|(!_AOc {8xyNzZܙYBv\bBP(?W^{Z0w~UQr#$I)jCQ02>:Ʋ+)rZ*,N>;*+8n 衩.-AJFG" M}^"ΰf23D~]bϓY\|~Xr3MmXn 8unD#~:dr jŢV/֘# R.^… g}ַÇ_3J2edJS sRr,q͢a֬ 2>;+XERF$N$+EVpu|Jna 8Wz'2'yP/?EnzɳgJST?I/dظz%a񭇏zXVw_v=D3OkS+EC|7~"'K'?F~-$oaxxhimE䩳l]dYk#|kqsW_$~MiFkmmvm[|%`>5c>mms}Sm{+p1"$zI\›B\`]›"/oE$/][IJ 3T&i 5&/ 1jK60>2u&TU0 ܋Ga<%X.`d)wtuu355p81N±rEqS(Dp$H2DQ=o܀(Kضd%dYEBDFt(.eC4MuhE(˿͕g 4%,"( 2*!yk O#*TEV#H:/BSB.G4dx؏O ꖅg{A nQ֑$l>GЗVRV)UL{OQ;2JFLTC;X7 cY5~?RTA9džֳ{$ "RD֍# BZͲvN9+a+ KH$dQEt@RXa|︕?e˶ZN7ih'Y:o@Ջct].۰Ε">"mk&o"ڏ-ٟ}|)UTe߸JΜ~_Qs? Wʮv p ٹr~SĒʗS*v+=7BO<yB<ӣ~TS$cA~'1D*T%ipI\›ai  ۶jm۔e"f&_*#Qgӎ+% a븎 m\GRX". :p\.*ϧ" ^8,(2Y珰~u;$Q(|>5` ,/M*0"d.ۼIT\i9(8C8^o#/#I~/~s+>RYDI'͒-jLgplÓ47PYJedMp$eGi:W/K(~ut}'1_??S<&Q*h?#@p1m EBlZLfcR2j芺4( VBA;r+13AUٌuzBr=>Y-֩W 4]84_>UF?O<75`pfmD<  DR(:g2>;o$ /I,:Xj#>XXafG#L$ /g; 1<}+6`rtNrŚMC,+$ rrz"Kߥh"N.3Osk kWo gdl۷$Q5R[ṉct1¬۬Y ;3g cϣ{I^xf/J ``<7nbjjuYfP@ʔju$,ae4B=jY|LI56SG E$;"??D{K|Q|>;o|'V$Adxd#<>>-RBKc7Yc#(,sGFQ8=]=,f|56%m/ώp3o$im?:^ƞ6Ace7y'"\82. 4;u7]v_|N᧯c%>m*UJfu޲=H[ IDATS*,#ZI~|;/c7S<'?'?~DɽYuu12/絗p7 ?W︊G~3/;nkwš|+sm{w o \`].A<\4&ZJڔJULefnSP;dydYvDŒIAP, "UGeRɥUC1_DEb I/#<#a{:]+)$S ʥR`0D2a4UEd* :ҍE*HD0"nZTkU`Pn$%[K]Ke\wgosGJUb,\9&YHW-P,Lab~@Oc6F8_dÆud39/#Sa`pH]q48u_~-)ts{fnbp0[1B LY">hOX8;AKCr.O@S(UhSc<8a F}}_ưd狴&b9ZH4ʳ/)֭W-xos]4-.0#cOﴵȇsCL30q!'3>1h' :Lt%B[k(rl(mXZ|nCߐO_gi*9DhO"҄(l[{“/,DK, LM2=o} %OfoOOa 2oz=*ʷWTZZ*Ͻ ^`]\ʀ\u{@eje,K*bRD&WTziQ5L\AR!H2$0=>x8?/c v\**h^CQ4 J2Հ e;>zE@U5ibY`.ڣ"8Ϗ H~?@e,[֋ 8jf;8dɩV|xaTPo8{< Uq\I@0?+$AATDLge_;a  :ZSDB>EQe4MFUez{|z  xUzT*rl6sG2zHT%PWʨã,fv.gphO)T D#} 0k Sd.+ F rҏ8pG2@c*BKkb$+i'_C`d*Cͪ30y/_gR*GOmF3iY#ѕElq$4J{e]}v3Ѩb[e\p`cBɓ$!`c ,Kƪ#iFegG(/|ҵ|Y3kk\-_S6-LP\ͮO|I !MPըau(WnCg8uzmgG!8! \b-} %XZO̳L5(Bo _ecet7^o8tvt`r:n=B0MZRcͲfv5=^LA6m}` p{lၟIt]>?O( Fy4DOq+~\>G)?ś^#޸{z/|oXν_w{ϡ0 +d9ǞFS_x4PL}d~%^VP4YŦinnƶmD"A/ȑc466#("-twㅠ[~+?s]Y/tvWu]"-*aqO`Z%̲Mkk/9Y5"f&!I"$h* >dBBB$b(*$bDW%Uk6pKp "DD)BOddlvQPDB}.XW$hD]M ]&X(&ssY|X3/\gDI\!8>؎7_TUelxu55<" k 6.-ჯ܁Sr?9<ĒUVh2k;MGW'$b$ DEV0Q-tm9_{W܉30Z`ja:N0r:`˖f2d9%"ӛn%;oN( (),fU;^8:4'py&ossִ[;x}׾YFMϞ cޫjE+6rSc|o|E+xpuOoǙ03fNuVzI:c!s>:ͫCW &B }FNY,,J8c6,#Zs/̯g47t3V+ܲu3_`VW9u?;Zï)Z̧|vԶ{IԷs,]O i*hSkG_!Ź뱭S(f#çN3[=Q4+V.ܶu=?xY$= Hf8%RH2G4OAc]2O 4[k866;)"D .~\y#xy?e+?b]}dy> Ra{x~@(IP|\צ jDTUrĈTR*yAV*eRH]m磨$t;A #Uv]ЩkZ0x8| Y WKdY4 UUK_oOҫڞ3=,/`T:S0>:[jbi5UZkMR2MX$0.Xl.$ˈB.o269L0>cfDt:;ɶX.أSԇJLMeXض}'?YiX?G"DɸAGK NKcTL#lgQw#n(Hñif򌜛!)3:1| ItSqj-5iLlXZ$ -k:Tţ$E1 19pfS9u'98p233Ĺ^Tf%J:nَ$A/^F:'P(ʫ>Ù3ikkEexL>OKs3~: 9Dz=ߦhkY(J )|jj?@MU5+Wpft,[ "?y(sb)K#M{{5'aH͡* )eyMhQ/VXK.GDDg \{͌G,6\M_o uK8~(+.ʭw0zb]2|Y[y Z8|+uԋIuT7G~+R)ݴww˜K褸?blKGwƑIWWIF>^҂Kѳ,jI!*  _3Ӳ9tkV-:Qc=7t/AQb,0M}S5 Xƺ%?:QXӔ &u*:qݟuHbo׿܋.~N#wށ&e5t}N2F]ǟymgGODkĉIQE߼앙3Y(Bq;~~ǑRniNYǶa ScS.YQx/;r5euayjnWvz >ptr\~e;Wn^ /۶q~}/@,a͟CQט!iz[jG?1FN{4E} zWްEE.}:34umxG0 xG, vʦ$Jeev(6 55u,d(z^%E+&lE&/rq.]ySi̢$:ȊJ$HxJ%!/Λ#A*L5U5t-I\,B 2:!053K[g7 `T**sI& !Hi& Jk(#"B(/ x(hgoy[)hH\Hsl?0KNk>8 ɳ/)zZ-^}?T+-y8Ϟ#2?ݴ6a߱Q쏮Qd2֯ I%Tf.#H3)"2a&"I;Qt)p} 87=KMY0 *+5 2A( !cZ&/"BL&7Y`Z%?\}YiO?9k.i]KZ'ǣh2Y.!Y:e9ro˺IXfp(r-0unsI&Ә""DS, IZ2 uH u,]H'BZtuvLU# Se>ě7T%nQ*XI|Ϥ*`|NG,"*@5QSTc={SC8AΎ6|>ښ)89&GǨѷ(Ӝ:I*eռuCCQה`4յL RS(j`rj+]|G)-؇X۴~}K#+a9{I\NλnwYy;exbnFN]&uIh%`b#i~ϑ0k1 ,]r Kn)M<_~V,?uCFp _w8z([Ύ6MLPUՀzvN*qڕtəetΜez:>҆ZYz zmښv "!,넢B.׭c|+VruW}tאdD#5dzfчd2E$тy4D<]<6?/xچ&rg!k8qb~6ذf=>|. <dhog`p\qY>ѻ-l6W7/@gw!$y~8D]InA@$=D2 E\\@.", : ,>^`^fdˮHx0P$H4NUMssbd2Es B|'YV0"L\bY6Xi^<IUD I FcDb1T5Bck+%L4CRU]òm(x IrmճtJ&ʖzYE5Ԥ {#PN .[LCC#lH"Ic}-fP{'"t\$U]G%j:'?vK6n UƙȜ)ZjioEtU6y *&ggG~~T9E~J-ףM\}2j2=IF:MzuuUw ::Ylc.=,͠h* ի׾zeKU7=R({쥥W^}0pyWXH"M.'}Q_S0b ko;;YɾYk0sS:3e!YU RLb IDAT']]mW|d dM%Op] ?8zt%VO&1MDK[2\AWePgђ:~qD"NǶɖ}(D]DĠ );."Ҙ$g!SBWU2e e AH"z._);`6-u̙%42x,ElTUU{6b7>kY18wnU?]'YmFcS ulu5) r9mP,kq\>(;_zXu|MKP.dT5$<nsL''N$:3,E.]^n [B.ѽ )]N*#o"Y#{~CO"ΜB$ꪺ:ڻlf&fXw2gxy ʙkQ\4K/ 638pdnõ}-0p-゙S2=8WO+e GX|^|ĵOw[xA{)xoڲd# u?3;mܰ۶=+6WUwWE _& LZQ%uinmc޵$Α95tn}Q6n̲}bM/^(޹&I"D"z{nVf穯jcƍ޽K6' S_bϞ}؎G:ٳ+s'ׯ|RqljYd -]LL޳#Sr/ބZ<=*>?XgIk57~N,eǏ1S}LJ XSGs tm#9g_:Y*cE``eFF9ptlЫ-ٵ-kgqzjR{nGXJ֭vg{=7\c/짯s1bՆ%|!gt?\s3<EgΊ+/Y;͓+aU%&V/[MOb^=m/k{|KoNMصo97x"rd># LӦX.NW!,t>m&R$Iǯx"Ύ"z,'(88^PaD  /O0T+NP[@40dXM(x!8H$f&[LgJ9Or%:VH'b "J2^xa$\H$ 2(^ Oh@"aT_h eld Cd/)v?ˡ3 Óah)5QjtEhRYpH#ܼe%k6ȦK0XX~!/(,Du,Ev \lL`)L͖]R,,d k{MQ4~TCm2F*ePeٴai#j.kҵ]k= OQ"7]4]'0tXL'TO%})SHD\F 2< uq2"s?vZGfnピJ"" Yd|(u5U`|dY.IɈݝvIN暫pi8qb  \)Of;abB{1Vۡ|ֶóJ5yC#NMKiz{qhI L-Vw|NM[}DN:FN7xl[v05It5L1X,F4;ի"J2r8u7n pM#J}U; hi馻O6>;Y"!]U(,X"n9G_R @u)fRJe@ AcK33SXI,D@`t_tmd9o:ڵkyd2z'Vr%LDgW7|Iul:;ZxLssOr tR$yLMMs{W4ҽOcD 6r?|'|ټa+#"O2n_Gm:*ܾJ,SOM3P݀CC\e%;ƻ-ckk}-WbbzIUX@SZ%Yܷ_% c$J ${!5p?x{cRt"aqvڅg>>e8rb|"08;0ğ}"+16_sx 7m߼̜;Ïm=ȢϫyK#x+?ww"|ox ?_[-2;;GADDA\8XD]T|H@WZ4ш~^>U)w~T`$] Ð0$RVR!*-K7[R3476 ""Q6M'BUqr"! x?lL]R&<łS>ݷ qlA+9ؾ"hADp|&gO伧EQB AĴ},D YA PDDASdZ8w$`:"!!Hr\UR@* gA"ģ*9.TBLi]CDf2|gοCH̑lܰPW_ϩC˲Uٷo(:|T*izA6]~%|'(er%$/)-$U$CdArL$I \q$EE @P|r]At<e#Jb<_@DDtE8BT7pBRdO Hn%l$A*Q":oqH]Qp|Q  Ų*GoZmRPD94I"̊ŭ<u.n)0>2T8;v#3YĦKn' Ut`i"J.xf:6-xGyWizhbFLg/ F =lk۹}446S*3-?EiE#ޤI{:žSc$iJ7 ;19 i\yPgxR4??252YE E3xX CHWגq}0GF m\>CUU *EǙfa>%bs(jeBD DՍML;.Rh< mA$gQ7IXʣ*X|4E?$ CNs]?sQ}*H} [xD%0dA:mW{5ƒ>Ou27p̣!E#e"W2F4TMDC #COU13C-4]3Eb۪j8Ss: _#!)bHA f3DE#"SEJ2"%y4MIGl"Ha!;WY ]ECR DU"kx(eXeچl< Ydf!蘖L=b"s,8AHT&)s$"\|i/TRo ˗-Mu3ԤtrycǎcZ>x-o`d| ըF8~ kC,yeB@p(--d~l!Y,qzoG. Of˙E\96Y# > Vf<Ӕ$YS"""W z@4 IJABC+,BP7P<M(;㐟F$C4}GD,E%R(B-#a(#H.U x8b/8xJ2hݐ 4F~F|o>B IĖO~맻[޽gx+{{?﹜'^nΎ1څ6zg~bymD{Ύko|[/[A߲G#w#z_? ߶;neO3OqzhN >q avzɡJ3zd6]J6T %Vr6~?"?Suzj.|)_Ʒ3?__;xG W(&|eYLĈ8Dcc3sȢH<+&D"N]]yezBt:A"K #gk:#2$# "I">""g#ry= @eK( a(8N%^;-BQ D.gQP$,F+ H EUUO)L4]EVd/$B,\"A8S@!ldIDӢ!xe)˪HTB*T:~cQ(m4 Y%P dlE俣-F %@\(xLئM:]{ώMO i\߿bz.㻿|\y |M@SmWc#>=-7w\B{g//%_nzf_K_? һf vv%Ə&>IԎ^¢EO_8ɽ?} E XR=wlv8]KYvD zZ:|λ:cgyrݵ.|ۯbz%~zk5,1#rfIFJ%E$I|>O\T*K&qZ{F>:rb aD*Rh۩!FcIbkx!tYP҄ D:hѢ EUƅfsM|tP$ܥjAQe<Y&bYDFܶ+zW~.&_6QB0= OH8%ץ&]CHrlTQETM`:cR*C* ;*I+!%#+D<"XM"hM2Ө(D" DR9Sٴi=|` ~NZۛf _<уc)ʫ.īǿK ٹp͘Iow#X[oLvUӘdu͛(ؿ/H% YSp+TƓ^k1c I]P}CQE ]1ETY"]tYv*΀_F'Ȣ>ڄ#".[>#H"^(YTEl@X.,Ht-ES)T%"1YFnm?mQ6vMH&8ŋKLLS%,,):TTЂT(H?BqBۿӔHKbZM6 M=xܴ^= $f}~=ť׼~V@_f8w.RHibejx`]s 0pq}Y6qW~iHeH)4 (Nu5k=LL&Cɥ;ZO8zdSkg~BPKfLM{vNc5v3`"1`4;g\휠UwmyIQ 36)띄ŕ!㧗A #͹_eymc~_wϼ ս IDAT"+kʫC"aK2:ٷk-lQb3izW\tc^<ɫG1Cw&8c*| %8Bc 04PHQH( lDŽ2۬ͅ 9K4va] s<0J9r^8w3'.2ݞ`>/oOl,'Fk˯ }[/7v<Ǡz &EQKE|4GJ,0 ؔIJdBy>qR Cv`84DkCDsa9apֺ+l0sv(1zClrAeQ]kh _Zdtsqmn2A)r4K7nIi:"%/K1pF˶JahieI6iJDg)h5  Jt69Q4IKM },ѪK pDFY<)(1)nC3puЦEF2s*R"- AIQ֧y@m H(U)$"ǒ&aXc<)Ǐkw7fE1c86IY^Hxa;yQxGQE G#,ߣ9⊫>ĥw8震kp١=|k{-^8u0e4&)=ƒcG_*fk\{sNH,/S< '6U117_9>{!ı-_%Wc\pEUGHfoI=={ O$|:CLLcR{aJilY/Pf =e:D% C1hСQQ,)-e,.l֨y.m3#eQd%lQ4InMmu%'lǁRя"B MfLیP8e6FJFcQ,r+wϲ[ㆣW0Ӷ9tnee{C[nox^K\^=︃o>,oQ4Q8zUǟ]M{f^ϭwg(N~+804OV޵a}~g%]ηX^ CwKWd+oǧ} u;X&G;4LNOD1WQMn ڍǾ}[߲t]~μ݀llBz+vM &qcY,:qAH'ՋH*,ofnpR  aQ4s}VACsbQ4k+ ߸⚫ۭ26N:M7[ߗUVGTAd4C%Y_]@9!)h|,:Kh9IdIv?Dr~O  e:ݘ~4&&3usY_YSa3װГM/|$EA4>&Eㇳi qs.I!KK"mRm T)XFSjȒ ۵Aoc)LV4ÀTN`) gmL6l?@3v2T;>5 KTsy6Wy8Xbقfe0_KQ(YJFLCC6BHZή8{vw߸V\l zbcJl8}\08[|4qC(t2, C1qy #.,7{[Uضde}:z47jx0sʫX]]ڱ@K+&P4} bn᠋@(Mƶ< #'I+/c*rmP5I*xB3c:50 l)cl@>(+!Fu%Y:XtfuZ*EgD)p<̌?ݻQ\Od lG4|vx H r\A(L8:OIJIX`Gw3CO-2[46Y|c_D}?GcgO!7^#_c421@=2?$S1-kAwl,츞x9{ɻƓ/<ŏ;9tMv;o/ 6Lndor380}_~oC ȶ~ >k8N6ȳg s:99I 6S̼B6 ,..qWp* 㭐ٽǵ"i2;9V`sciڠKcc}ui6[v}h8"e:F f&1& 4Nwq.qGU !@)Ex&eYi|?:IʀWuKJ=3=wȨbHI0Ir7@PfKfy34i<J0 J4t42=9j&E :ybP2^#`0,_iDѐ ~43SN58vjF#. ,&/kld׉ӜT R*RSպQbB4ϐ0$>dl-H{ ],˩Tih`UJiE :(M-خ tG`.e%ZTZ6a>g#^,S2Ru.ì=") j~fոFܿyi v>3~,K(KxIPZDZӬ2K0,c\5']XL2-(fhECq=$q `y\iN/?p'cƐ gü][8e~rˮ;-~囜:OA۸/O /G9r0_lj ?{? 1v0Hxon6Nq-_>%O;A>|_,4Mc4kg7?f>Wbs7_>+C=Ϲ{wz˙2(<_}?~"K' \u~[ ȶF`1ضΝ;diu!.EQшVEӣѨ"IsU);LLL&9Ҷzݵ4Pe֊IW:Ν;GgjUF#:RJ׶RGhq][93صP=hd3TAb"q\KTY"u4e*4heШДW'Ib& v(u5 ɲ{x3ҔEi T2yd٘VE2)sZu!`@)ʼLtQ0 IӔ`6(h5c \5:{v͓c.?UMhu EtfST2v06]pƒݨc*l}(bez݇9v(˂/>C L`4Nh%%IR!bc.Ee5|eYF^KT |2QyINNU%5o50ʆvP , B2ψcR Ҫ@KZk,K$dsYQQAEXvה:]'O7@a4&rW2;87pr`v6dջC,]X使!^}n71x.~_<#M^g>y?F-JgdN_UR\w >˷N vwύHG,pj˯_w?_Ň[)Z0ij{~ 'O2{A枯 g6h=?#|]8_=4=L;dЬd#N 7x'x+8r _y9Z SZdyΠ'bzvnﹴHimj8[(iM#qJ^j`800)Kx<ƶm;k!y^KZu6i5jHCc4 ji" *lVnlrA.h|WBaK߷X>w)*̫\D`h4q]˂VxzU<}$Za Nv]8c6*lY5d$eA^H( *y㯸wo26 [E\s~yA~}h==-~$_o0hj=<Ӽx {vM ۓ+طs'NDcp>͛Z^b:?̏?A=m7_ǃ:0A WdC|KNOWzl= ~ĸ]w|#}ןh4brz(v}#Gl *10+FE2%I8^uI=XD2G(^Zm6Ȳu|4f,$è&q5Ou6iی}݅9J-h6 IDAT-Ijkm;Y!B8lRfDöm eYI)Qd4h4m,Izj+j|AG0B邉z,K!YcQb[Dk0;;V)dch4hJf&(h\ff&f`$e14kԷѬ;LIGH2 ht;C\q**CX\phy3ulN^d~~]v`KI&X pM4۲@kx?!jJJ;_k)Ҭ2{v0 0jQ%!0 c+j90miMTҘz\+VzEіlDubye2)k%tj0P,w3*hb.zq#z9Gg[piOc}w= `D82'>D;A- ӏ~]$Bp`^N=θbW6sSll58 (pqf'&0wv ㄼ,I$Eٳgaue[oo=5eaH.yi!WQLXH0%RxO`l2Iy-I.plRlk[inK1asG4F*$y U$рg%²q]ѰBZ!(U.-ɲvX_2==1MIqQ*G6.ʊ̉,Y^YbDzgc8[,#Mc:O8 SB4шaԊw9paia5!n[.4UTUp'o ݲۺnm5u +*Id2NFR޾4]0ȪUkMJ;]*h ҉ i7Aa^J0c4!Ndt0ǖM o1 ƵM,!#$I#p̱L)Kf^C=B^WoQ BkȪhvΧDiVNf\} gh\'~]q><ܼ d鱳uʲ&NSF)1<`DY+"fфXZڰбPMMhe4fuu2;]òyhsnZ秅Gc V lO(#Rlg!nC);jVT8~Xت+|&{G~%֜?41 !5l|( \U5ǯ`:67>$Z.‘h!rt)ХI3},"KRZ"uo{4I)u5IaKTpk$I뺔INcc[׶.avKm^{z40iR (?/v6.\kC))t ^˯]>u\yx2s7r* 1~abf4sgUO_u*<eY"eEEU#5iZfIY;׾QPrP1~?irS|Kt]VؖCeUՊN!$pxtLel }k'Bo({; a[60Ф0NEUqx"8XAdj~KCL0 'nW mQ8ySeIa(Ntz)Mʲ4 8F4<'3(Y wq!q8iX4e4l֗\fq,Ij48TƷt]')r*( D.$R5C3(UEXjCB]ΤX:Q#9ĬVWb\R精i#Coڵz] Q|§?2˜L:q fB'Ttpmh3?I4Sfu B76Vk 0-eaE VUua:qD!Tԧ)N S #VXKhF,-RMM%yG ]C3<ݥQӐhd2|,ݠk~I{y@ |C]abV є vvvET)E(&k!X]\qB'DC4z{QxQl_cyy+kZ0 siyw 'u}1vB~?6?$"; ?,ccw^f -epm h!u|T( bj@~p>s)Nń4MJEAe8OGAxD7`>|EnCTݠTIYW4a˭w.-;6nMZ8dYƠŶ[T<w m ],k Ɠ6ռ11imGe;R5MI`;&M`mGq2خc-'Y!Qy^ۉ,,kd0!q4M ̲YWge%u8ۣ1ORbY:MUkeB@TekkZ.0АY T e !i4 u]a8:EP BJYL i4Qche6du]XKMĴ-gB=dqqW^Ъ#<--,[Cj G\:A04P\8I;`g^˵7r~wnxf2-wuٳ\~svkP`VW6ȫ8cí[X]Yo階yx˝;w bΉ)@m@e#P !it;cm<'-+i8b&]ϣ2Ξ[0=, gc&FdYt:g2bccHAeIL)mGut .' cHMPKg/gT VF{/#0lAqFJtQ+FcK+t [f*B)DlE*j{i!Qu{)fa<%DGי&&Y&\"CSe@f`jt{QVf0TPU@0x;W>Ʒ;4~/o+gd"+ :OO&Pi(9Q[PBK))$IxuJ@)$9J$P/"yS\ZEUJ4J!T}BI,,"t=?e]tfFğ} A%;>y22nwyy:i2 ض KRhm'%Ej,%BtB6,:~*zu!mymjTY&5 IDAT?irS|1Aq-!5fX8ͰCӠ{t|<m8DJL[lLu:fKk}VtLFǵm6 J ߦ'FíQsW*Eߧ,KʲĔh]פi~FQV9iJ4s*3PC_40i MSD0V ;LA t*a'ј`HH_.MՐU%m$ NK4M1u0/фO ܀LEiaJᴶ育j.JdyIW.ul&L3ʪ@CfFUQR`#h M:PE눲e{ca v4ZOf}:]]ٛLnptaX&$ᡳCTmpcMܱ.=K%ӶPOX(J)шtau|:<qlMlǤ+bo5Puހ8 1tE<Ʋ <1*bss=xۃ|ſ|Q98iކ{ @/~S9+\z/2 W쯾g=,..E1<䛿upxׯ0\”ԯHs4#Jr,F#-S4 *UG5J(+Em5 <=Cʘi>v˼9I `FJmCᜩ۽Iw!:!= w'3 w~D]Dymn@dUȑ!R*ge7r >[;xŰ? |f))ѵS*22YƠ`4 Mǥ˓Oc9*V.^͛$EIh=4cgo3O?|08OLGDbQ]+44U0|MuAlq=2%\&)Nq2@!-NǭfS.nQym8<:qҀxJyɲ,xP?h'avi__' 8)PJyi"5q? eBˋeʩ뚺1Vi&eYQE+\,jUM͢k2+phM[ E.JJgxYV6ӲAAtBLart8ò hD A4E#rݦj,MB7M4[`t̅e4r"g20\bE{3fsB5tzdGQ T"|ʺ”$Q4؆ ZKGC#o$EqHcaZ h a*} %4uJY B4$²JT]nl4qu^$XGX44,s#XÑ }pZI y^pvilSnw?L'0_f: 2Mu~iEYE8 zeBtX3VH%-[n7 QJLElFqiH)DkT+/p|xyǓO~-_꫿ @g1?u~o V7{4VYwt;YpY8wh~TCyeYmHd5E3J]^|*u E&U.";=Or7.uf E9mZaHLC1eb LSCj T2g#t|A`:i 40MijF$Rt]CkN!9뺭6j?-J,ǦhYNA(&gE~P@xG_0 iLZ,A v3FTTeCgr頤h$Ijڟ2EUsRry s* \;0) ML3 Cд6uEd;io[ e4$i)EvJ1̣0uۇQ yf$0+?W\\g fsvni:a[ScTK&1;:)8ГI8ڥPi)Uxw bx4ykdi/>VY_>Kӥ_aT-޺yN[HQܟ !$IZ׾V+R5}]T_C:"KRή!0 UH]PHMw_07n`2ėfI`..!M … XdƟ~o/L9B1H\ hz. 5LjШ "M"4Fc3^8j ZEڧ8irS|c8iw\4 Y%ƶZn|]hayiCkŠ~۔F~"BOS%86iJB7ؖc[] !t;-/muh/ieќ<Eqz7M\VyA ىQZMH)iH6nxl|LQd-K_d2w}|4 Ӱ-ms4Ii]tFRTLŠY\1dy( K&kRUH)9f$F@ҺA REe Rזjp$Hp:C dw($͉ϱq-,ti{v,jzehѡ.+LCɆ~c:#Oڷ-;LÔnų:IM-%wwxi]]]8N1e4VӐln,ݭ[TUGFDqt8$ID%dYƭ[wCXGdYA覤3>Gtl8c4$ix>EV- RO|7̦!T9Ollr]8sfa/=b㸄յ%*lDY$ kKC4p2 l0tFk(GGk6gVtRH7{,S!lz>%XJ E9g>/]4◒f<AQ$tzKE&ݣ,Sw.q85qVbjݷne$IK-r)q2M=?2gүs~7y1DJaII<{]h&IBP5)JU)xɧqь/{WO2q;(&th7oE3:i%ݮ)5ƔiDS`>! , 0DC#ƨ2zھC]MUUاA8-@Nq/.XD00,N'2Engb&uY | !x9eRX6ab&Uc[YÅ>!m0hTeT7#($֦Eg|] 4Q a9a8VFѡj Mpql5^r4~(8:: A;)[Ir$}.tlAx|,tD [ut,G,:Y3M&aIe+W^1$e4f<1j2Nqa\:a`6y]b`:6AgNAX*G U5;6sg@#挢UZCgmO<"MC(LA7%ܸv^ǧQ%x8U⠏åYٸh$e iDcyB2:&4IgV,-M='1^`v<K#Kfc9<7 <:M.Y3#tK'/bMPgx|M4Hi=A. ŒMܼ /YƏ|q&Bl[{;BS̎y` c<ф s4`:8Mh!/M(°մ)A4EK9ե Snݹ᫯"uM'+0M<$Jb tVȺÏ=k &mG3T]bjP9e!Q4QdJN5I* YzS/ N5 ;]On_^wHͻ[QLhBuq8要d?: k1Qb:J(\`YwvI t"pK_IϨyVaWPBe7x#Wby8Mj"{Tg>ڊOGK1;Dv jL) t5̦n uK˰_oW!<iNVaj Ф*qz666X^X$D32[mmr5uuo?8| DUŅAR=^Ӵ l. Ǖ4o^ESUst{At )NqS{44b0uxlQ9u0'NBmbǠ77 v) lSfۃdcs8khjKb< <Ŕ.oQKKKemyřb:;UU`9YQŋ]v@/߀mGc>nhtt2fnr(4HyM~~kk l%ݻǩSg(n/Q$) n ZD ʲ^o@,zҗOnܺunR6ã)e,h)[[a15[[\M.qOvUj.s}&Wٟx<k<ģ˛a+h:KKK'c=,.u,3q2]v#B>0e(HMY44-@IsU`%mK1{TIAa%4p.3Ի206|,^KƑjtp{,u^c \sShu\Jʮ t~w/?$ﱷ}'k6WGXZO9uEʺs/8AW5:: ' v"InݹcHj) ,0.*DoiW;Hq'vMWUAU?k/ c k۹.r&Oث[Z")ヅ8.<c ٌkABk1~:>y߽}VpiA9õ(;#K V GA@J%Z*v6`$!I34lZ u|13[oYQFtߠ QNʫGiYeUH  0f<4{oR)d.S{o.6sbJjYIRjj$ \EV˭?WvAcA^D)FoimٍZEF~{ΟC蜴أ(8 l%(A֋ AR6M]SNowK9×s+܊bЦx8AMoZy U,z5hZ_@sEM_~B +k~v,y?+gVXr>Gho.a,K`2 Ig+zAIya4(ENSwgwoGϴ8w,7rmnDՆFa:3|GeeAǜ_sN7i*QW4Ŵ%B,~So=+!XڧK\Dd- cr1NGNP"Oi[!4VUŝ{8ͩ7o\sDg$7i|cy.͠E&&AC4X%uRGߋЈkTʢwb,J-Ra2ɐʡ{e~|| I:[(+.jI([1ܟ4h"D[+E{!'١矏ٿm||ǹq->뿁S-DDYS2׶m78;¶kJmuQĮkBcq:oݤK{OxxDcy7Ix⽬X#}s̜Mj;>+93".UUyͷiH)_Uf6Ym&S0z+9';_yo9,,I#$'V4e2 ! Vl&,qUVcym|7[UEt?=a{8Ko3xNpx [0~/F8#|O!t::\w2ﺽirۑxcr1VS`c2B`.Q$q{rE0JS$⻊Z;@BXv#j5R6c 9xR㹊4[T]ּ?gS6ů}w%jDYQMZcCk~7aY"ޔZ2Bm/1t%_A6EX_kd[7GjlUflXmÛC]t@U]Km GK>nR~^~!.-ZMP'~W 2k{GPI&+<4ϼ%N ҬFIMO9 */@5ū(=n3 {79HRe!-oՐTB25e1K-(*0B@E (UP SjQlg~IN^yviXYZZ_̩Ե!|I\l[9tlw;)9,E˘*֭ll* BڊL5\4u]0ΙG,/ӂ?_ϰ+xĔyB8ψp(cwO8048o!62q8Rf9پ7r#L^ChS ]aIk{2"?~)%1k"'ɢ, ۢ, CɨGTF)I g86ym4%%!9%:.Y0p[+L^kzO1N ,O~)g|ݔ.>No-1Ϲ2M4¶P6F"hun Qv@QhS9Q&'AdeG(e KF:ɳ7}J<65>nా'JıxI(բzitP{rf!N#ƻᅩph gmyUR NƴN~ Gܸu¸0X3O<;l&D>q~)\%nn0ql?gC?YQ73Blr/}9N(3uh-i$AjSZ6F >Yd9EQdIQm;Ο;OٙP^y*+t<ğ dK(RVVW>a̱9o'}+l-L܅dYeon#R (WPV)P9{cķRUGskw2֋N +G;(-u#[K8! suN<n^kto2<ij#EYh BUGS sH< f4[آC$x W1eBatIddaRflIK4ͦ@bK8yoNѢkq%Nmd2EX t9%kr6O9~~o>~vwwy#Ob CC._ngivo!Gi,cgq]b::"OC.^H0p 4_VfC(Έ5ow<_Z,hLfSZixprkMV6h6)߶88[%"/Y8vÚtO?+ni7Zw&[("YR;KckIt|s,@9ۉL y"lh2mg>蚢J9<[=iȩP:Ml3'H4R`${Y&P0_Ze|0& u%qE{ē*-[0i*,Je|1;>|:hP6 . ͞K2{^CbTL3}I,p2evtYyJ+ܾǃ{S,[:׎MN&$1jy)ʚgXฒ_FTyrMƿeJr:mi$"x8MEU@Q!.pw'%I{4ט6|(nHo##Qf|68 W6H9L'G6lv5Ds-_24ŖǑuEZW@]Srg2)q'Q&p=d),KR}8Pm(T%߄+BYؾIㄍul =֗?h~aC1Ѝ{7ٿ=FF1+O)6r Q:%sμC4ym.H2'@ ?;+  U-:ˆV#`uUx\ ڵ8Jr=0%) lQNPך>D3WKWgw0UNUt=GXcRq]oQ24wѢ$ (lE #EqU֠ W ^ ѥAXri5F6Z#&' KQX"r1:/IԱfɫpYK_cO߁~z|ꐤueR XypȠ=뱺~(Qoki4=B|XMPW5٘vKդKe2J$BI#CTgXVMV6f^f^G9AQ\rKAX>JD6UDDt{=f9ݥ-dr*{+νk4g٧Ye7ڔu2QPCV4|f Ҳ8F8j# Ҩ`}}gn=ò]V¶l_Ų\$ )=fNa0 9$*&qeeravλ>CqT-@eSp:ti1 w{HªgTY60hc:;7 T_:y "|E:<*R6N$]/Ps#鳒IL^BXex䩏e&O?~HXV?hrw{G>AzY2 Vʼn'*Kt-4R4M,E%&O~MZl1{Ʃvr4dt}ē lIe4euN5o1O;0w9@Ez0`ժػs?Xs̷ e9KBC]izv&Nt$F #$NhXjDy8oFllR#q}:[Ou15ic3kxݻ(Ywxm}|UH)wzh1ڬ6=W|SAZg~?z7{Sg8RsbƵ,xzخE^ոeCyek8D @ÌyP6ʪePRZVrxHsE녮Rq G A@@jm0>f9Ѭ%7c>jCJpj<7KDYZ <Xr?8z2i-GQĢ]F1'V0JEI#Ɛ^|JY80VE4McQL Fu Me,_^ttvjB0gHr]BW˲ɲJ$XP6R!EYcjSTu%uiP%& zr p>Q)E]n=@:zw\0)Cd,Vat|8c&35dyE^vp(X.7B:F+\eNa V;뼾fEk$9`c TxFkX"`e A0Dv}.g>-nZ)6T||-jq=O#fFMf|fimkl=Onoܤ6L#=ݰxϣG_;<1;׮p~'o W@wuJ 8r( `pgsMe1(/ %ԦBYNϣlqo|`a̱9o16(By-~cDJѤszJtpmZPDIA,%4M9B7|0A۱wז6uUr-euz˂3K6;^ԈNc@=H <R|gJet'Im*c] pQ`\篐~553~q-_8`;5q}_OIȀ;V~WGpc\б->,-ӄe5,0HFW5uP%Q(Y%e|M^t-9FrZX% ZEnU]"e-nM%nG0XKZ-Aia~H-m4c),97~~4.Lh-ך}'߳qO3q4cA*r'4:m|%[MaDRTR*} `<i*Ǖ- fq2VcH %X"t0y;88NHfey49xDQ4' -lc^ڀ%uA;~ 1q)9pX;Yv,>QuIoPߠkJE%9uU f)dRMTduO1 _>s':>~P!MQ3fѓ;~loݠH0kvWxKOܝb<(O${VW$7s@nrM xn4!V߶mB:ǁXu DP#o*A2.TtbpCE:M0_N^MbsTprFx,,~t{ׇڒ& CCoa Eeշe:?ܘM6-p.FSc@I`g/yДh']G=NܹLy}O c#^>͹A3٘H'س˵I}L$b!wO6Ȯx _t[c Kѷ2ES8W YqQw]BǕpF#Gy m=SCa܂(0F Ai0&OH]Dh]S[LE@i Kkȴ`;q}_o!WSCw#x-\<{u2!a+xS 8 8ݞuZ1UmHc40%B?qp@ln"BZQhƣkz7:rW&VҢd7X*mI6v۹|t![́ M/=03p4Mig( RPxI.+v;1Yv.766 KGz] wd3[F'4<Q#$Hby4g44Z uYc0HXF Cp\eqa"|8(V%3[Q@3b<^\g-Ig0&9Dϐof0e^<Ŵ:l߯ta>5u1\ty)<$JzeAJcZo;Sn{|"%[j ^g]7qu`u!IGcq𔠮kqin3Wygo<Ŝ0@z<ԷXo|ϭ<ϲۄFo~[XY?wQ$Zko3{A.rr7?^:rm~ d:?NEhOi%+j. 㳾AP4,CZXƉBlfcqh e^{Y3"ht e;pui-l=;طJWl\}VpYR"nuQyx*$^1#-3. erhi&^ADG7nƓ Bf? [Ya=KmdY*iT Flb*s#m\ZEJɍY$1pi(BMS&X%r,EءlC4 4rThH]LƵo֠N{VҺ5\88M:(@ē@dHܛv|PkϢM 1J8fI+}('`0آ׊ i%@)uO#EN]GZ"$`߂KD>+D4AQadD ~˿tgJV4 Y:'|~N;Y{<2;;<Ը C>/𾷿\[-UMHW<haP֡.kʲ7=Cyw/Gi7\yBy$g0Զ% (r 7N^SfI6O{ =Yd #G Ҭz(!/'r2HS.xKuͳ/¡\=VhE&7 [ 4Z:QSkTeF@U j#PnM`;46EijKUIL- cQ"KIvRD9l j>vvGRe?3H4U=kmBN@X˙ ٰ=gUpҋKʀk2:3+f*EHľw~aRۃ5?leA?J=HL9|`#Gbt#9}nx_=ukVF#y~xēxA:H<(BӠEa{{}1jBם$C]BGbsj#EHЦım ǺkoTl!EJf0.MDLӍHW8ASaEMZ&Ɇy*Am njTŸ(]Y[xD{o?O<(w1F[+jZ$II(lnqIa0x.ʭq-Dy>äے(% [1RA%a% i:rή1.S.^'MStѶ> ˚bȮ^[?$c69٢ԌэG*0ugqEo(+#py.u^5'iC"/K.b)t[TMM8SQHa޸8^Lbm6&[݀p3^JĘ*Z2rY1D> QMNxwN늢0h A(Xbs ߍ-S O4%c]}KQ# Ԏù>IS+~P)XpS-) 틸"Yz&́" qPh*tIpT-EryPSM(ʺFJEZn}KX tw/o=KgGcs}~u|d'-ˋ;@X!y?nfW}/S^u\ӗfm}Ї2I2qzOoӨTx6ӟyyAn-wm0=}l\Nǿu{ MI[Zz@ Acp Sc4%"kBRDk44MqjX 5?ǻO䎃ž>νt{m0wqO " L&0H#\ ^u,'޹}g3:)ɖa9{/[o`}~vbA#Nj쩞' g7F𥯍S&Ϝ>uD0ױ$gi-@ z2t.j  -H;I) ϗXJ$@UUH+:".R`C+CCʊ2MleUiuC-1"L-զ54agct ,E8 }B1(SW9whr܇젢Y.,E¸-%*P8ֲ3`8Й gQ'n9BgF;lmm K^h2oybf܋p:ydRc4YuR\}V6 qiqFw;ʈeiAQYF7,u5eSPF-?D>V USSiC]| vY oA@]84H-ٳ O~-΢5(l\/A uLC 16; JЎӬ T"M]iZc<ʀ.c/}nrUNc>vck=tg{}o[d'? ?3/><)7kSH))#?=va1 ?3?O=_Gzq2ω¸W_o>~'Y:p?_i"+Av4<ܾM$1w`c+Lw8qVwe>ׯ=7? n]w_SNݔ`{ UahЕA !m2(RxE"D z*cK ^ k:8KZD%iH~ş~:bPt9$߿Ր[,ф)wt -عV1*[L `uJV/2׺$76hڬ/'`PD87Ӿzi0E˄^k JBdefVkC(4Ѥ9hj].PcO0Ɋ}yNshnu/ XZ(n#EBḊ1 6ͷsrj\7D$ʘ[X }]^' \h3;H^ܨc[Lthf>bTo2RiM1cU :NWO>Cg~ݯ?~\8ј8EFQ}ʑC]3]gZ=IU[ffhsNwXAϝma4^EJ0.[#Z~_u ;-k<*P 6҉jgʟ.vaj;WHK_fhr/"%aAU_cu~k\vɋ-urڑn t I2RdIH8q;y1"[K簦@ye$݂FkY^.fXV"TLؚb;(A+/O!Y 08{dFI)D^H`Ƌ;'obϣ,Ym#2s`+oQnQ4C{%6A8M Ȳ^fߜ@% ‘ɘq񌢣|L{ gAy0G:ҧ;{u~؍'t[-eL8uʜ),p\ջo|@ҿK,-.\ɵ5뀘7x{8y=5+uM6љ"'Ml]U|UU}ο=~O<2 s!Nϱ;w0y 9v*8w-6i2JVxK*8uZ@J5A:%M!Hrf5xu\عy{|OK#j\/V#HgLԕD9R8D%d5RJo>]'_A8x^)*P6 $Q%G~@U_My>[W7?&ɝa@\6f2;z+j9,5㝔QbE{׿0cqUQq,Y(:a{$Qǡ7{͈%G#4U6:x0d<e1fעŌ7V3ӊf0wŘQ:$j7 meLϴijPA@w ܈Ħtfؽ׿~fm4Vׯ]y(ˑ2M9"?dx*et3*. 3l?OR/Gb}&vȪcckL]aaa*vȩ N/$%2FwUd(Nt; <,YZ!==XGAau7HP==S ٘,a~[itec<ṂO|8n''Za⾦ sss@M/nܺ I8.{w _M[Aqyk[ÿg>6F\|5]JՔu֓Omp[}_L3Ξ~DO3Dlnc,Ս ll1+'Pei2fue7҂lXA/Z?Xuyů%;mLyqmZ>lkPYVey~cBIqlmG(Xg߱HKBP֖w.W)^f8%zEF:qU?"rtKڭDZ!Y2Z`\l"FvS>I: 3; ңqcőƵgF!uidr}r-+(vGOYTnt/\A4ݚkCԏqap 3$5:yX# twQi+7R]K(WCbWZtg DM+K"nu=F5f{9ð([4R7On, p(tk=(k^Aku8*<Ā2MYػ5N\'nJ><]< ͍ :sq.6ʱ!_F(G۴!KgXRJ'rJb%@dET W P[A`z3hH YjkF᫒%C<% }Q3UTeàty * #bDd['q xeE#CD>* sAkfH^6.?GyЋ$4O砤iBGy 2ΛI a`xEz3`%O?MZpHStz~ĸ?,؆$Fwܟ}?KC{/ť;^|>.;g >nv6,ːRrP޽/i20kv0/^ҕ!BXzy8s,S{ ;3EBIT8G]6$c2Jg/>-_gep2iP{V2rih1\Zgfń=$o}~AZj9wpogy4);NWgXkx^ba MnD <`rEQLMV[O2"@(G3@4d9ä!n)+q =C$ L~8_~sW :,LQn~o y=1+$#S$Wϳow{"lY;l$3dMO?ՍMdYY];(MEYK|Ჴ3 طgjN-\ F.PEzڽ%/aOKsvG M;*;[l$Vfo-<]d&$á3iclHiʊnק$HaV7w~$htIUnqӌ1'ݐțÎK /_y;⮘Z.ˌA&<;r q=_}|Su -| ~#9aN״痡י;9J;z3|~"yQN[q5.I<] =h1;Ӝ܄,`{0;+rju\0!AuںEeGQCzSdωQ8X(8ԡ$ڤ(vp膩6)VI 16EF;pEv?ޢ5nk/M2^ 8Fc qH)qFw%]y&ϸLH8>hxSwVBVʢ&Ab$ Bsҥ+BoK/?߼0EfYcg#n&3S$y1S-*hhwf ]1I"Äf^N&pUApq߰B10`{C~̈́^)'6ԩ_g%G#^s,$U}.lJ:R7X(q<NƬ3J.Pká'O]N9{/(jF`+^QˮyA%^LtW]jx%0>lCk\rtz MlNjYi Dž=EC/Cc_dytik[15ұc:SmAm|[vc{'KK*t<ҌGL[J^:%5A7<;߰3;U[ukJ5mlɖ,CN @t ttЌN0$1M0p0Ɠl0gɶdͥR{=~CJ{iu:go}y؍-z( y1&#L Akĵdl ^Ũ(iOIl4Ð.eM/&ifF;Bd+W{<:4<}ww?ȗ?笜7TUA[b  0E%_b8JY[]rdtWca41)kO0utœ_c={xc/^FrwǏsQ2bdMcwG?~AhF 1y^^W\ IDATq 'sЀlox.7NѮOɳ2Soc>fT%0M70D#XYu yr1.,,3Z:-\&Ctƪ{i}P;x ;3RP0~-,!e!XI$Jq"lHkرI?l@Vcmm0wl*EY>XU3TH$= ejm)J%,dn1Mya4sA0)X~!ӓ$9،OЌ:aðvezVttfݳ qblLy8^E,c֮|ɮYƽ \5G ظo|H=xoy/!'Pg\dqL>{Ȯ]b<ᫍAoVCMZdip1.\q|Wϳ>zM$hC,ϝaC֘5s/֛QY1kg"eth@?BU;( Ҳc,7DH{$Q~{[wn_,F{{}q qaa( 9~σdx I+J[AH)Grr1~ {&&wP!`Fg/$V0$FR"(q2C kb C(TfKm~ \\p 7ܸ7||==3C=.xCs|l8ZZ;qMd" >>V "Ɏ{p!-.bl-;VQV[  <(hi6걦(4"Аe d9ZM%@ OIxBhf&]>Kj(s*w\7 bKu]`gg J"h ȆXv %%3;1|a8_P8IfޒhҎ*8D &^Ңp啄2iqcmGPN4fԋ (5V}wp药 '9L#:‹~ds;`OϿ͓OopxGYoAL v1\$+2BShE b&<`<|7x 戚\|k}굌#Gt䉧8wbmmFL|F뎠Ls!)H,u|D1o9z=X \I;Ԕa%2zpZZb#(`#i$M"ad,k2w$Zs8=@w׈)wrܤV[L?=ᣟP~fus@Pʾ#1V {qDxB  [y 7,!'2 R&ju`Fdg4`ӹ;ux_'Åg"e$PFYfcJb 0Nyf]8VeEbJ7G욨9wS;<4q@Ahi{!&o8g]`U6nxc鹝07W?(gS'ɋǬJ B5Ӈ>_76_?;-]\<ӻXJ:6>Ru;دx{L65a#D8K=տz>zfqMljVزD Ei5/"K( B#6B'8~ǎ"&L;LM0#M*uX"9y)^{]<}Zs=o6D}7u G mmZ04/] r,!z# g(":IήfF'C # WiZ1WV>AΛ{?q=/z ڵ0$A7 Nx`at &@9c$EW$/Q]csesؠN:;Ui;Z}!K/4"uDqyqg:`ʜQfXWJE@ؠ5%Xa'D!sϲ ~gΰDxOo$΃Y0Oh*_ %!RfJ:0рuFBM"o8P!Id(T %b ݣddvjEO;h(ܘ|31{KњnsyF zq=1(]XkomiM]96׸ŧ "CDs;λ_v&Cܗ;<ψ[XC[5,,,>(q@cq0Awbp΁u4[X9hİN\jDk!b;6זYO}ﺟ?G7'.|-7zt;m7FLML`߻X'xӼvnV@Svܻf9yi0? ft}6sY\Z؞L& ƫ I)2K8*#"T"ш- %9rRh$&T[)yA]Fܔ-W uHlBk`u j :ՠ!= ZB OW9daΟ)L3Uk_r:'_XoB#^: $KYgqHZ =(45\a:c #OYXJYÆ!yӬ%*vO^Vk eK {n,cj:kW/yy+L?,W8sfy잉8ӼkL%IQҞqdo7DYxM7 Zh}n6#gfn{~/0 'x}w]Y3np| GBҲ@*daiZNgLFFSJR$ FKfwL JW:p(Zqpmqc{1E٧H 5RHjqknJG W 4X$ /9r_/x*'(A TP:I *^ ր#qX^ZDiQAGxU+IJUCJ8B : Q҉/kR#v)HJ a)ph%PBbb^D8(GxJK4 iC{<9"s"k9 AUp#@Y&/q=7CLpiN:z|dE]O>>d_ry>)N3.1s'~dxUe f̉G75 QF=hΡ\ᖷt™9ޒQbPaR5 {OhSfC)|E ~);8!ΣQFy.JxOlWWyE2oRo7 ,I!~ B=M٠d)]c;txM[?}{-nRl}5~ 8 @UVKC4Nd}|\KC<̩215ǡvxdLË>K/m[-r!WV~(ZXkB%-rei  f8`휣+*VKLaZHx-4ZCix# ) x^8WB EzB)Bl91ee* HcC1 XVX_!pHJ ;Kh^A P+d)@Ryph /E8)R}`+FH0k!#bx!Q{x竭^ lZ8JJ/JQ"eރH/|h( "AUXPJ_[VA(jZiCơE!x+@-2JzrcQJ!ȇe+eRwBO#\Qj&Zh.;j\zd3)6aH2sfggwgA4D)EFQgoڋ7X?(t?O$t'u֙pf)o#Fw"wsyGv?"7ɋ{zck{|#o fjmOO\3}AQg.an~gvI2s]Kȓ!GmlmlՂo>CGG{ ^[B3!ETiHx Ȱe|gcD]'k,K>3]__^Z*8}.H};]A:Ln3`}8F{3UW9{E.}%~uTY0jb$lhbf3- ^*(7KVQ"@Xًӧptƻ PR K4]\%'􎲔DqcJZ0U[ŕClL4JSk60 ,BH{T;f Ɋr{VǬ/.skpB@0%GL^"LLqnػK=_\EfP~pM1=;o7yۭ;y)| 9 o Os9&o~ؿo~{66^M5W8ϭ\ I2aQJ)¡ K*C4t&'1kHDa J9U eO3:+8 X p?ibD0hhwBoLCG`,o]5^|_:Cgf~m^_eH:В,2aQ%Be bt(hHC 7h'!GpޣU=o8y!y e% Jy.%9KG%Q|,pDԺ pFaF`LJ9OVf'YI@R##ŗ5"רZ{a>5_=UhJTIM͆`mu:e^(" R(6{?}\ǎd*VQ/]%.SÑ"3U_![2瀭 nKRڜҧ;!ߺ*^9tK)p֢UT[kq^Ei7{Uк%zPA5mH@S @8EBPIYDu,g !sVU]qV ! G d;hFJʟXK G{tb, 琡z*GUeg$8B`sL TEX-B Zp[r!U۪)%RW$E $h[*^"J"A-ɗdy[C lUd^@x)N-BlU`tY*XqN~9qo};2 }%4O~ɲ k-^@#@)EWEJ/YYY! Nx\dRT UJkvG//MZ?O~?Z+~xSٻ{[;wKn.]oclc&|ZxIPS2G1C=)rCU—<u@ܝ<5bA(A1XƅuP.gi4%a1AZB-x~y5P1-'J/.7D ؤhlU՚rXRoN"84'$ɀg%*c ()us!a qh@7%Q=FJȽCE1$502E`2{WPum4s};P)H1I~DJ 0.OSd%w.H{IpϞ#W;F Gb Zqqd_ɈJ "(*Xu+ ]jšG/8"p!p8,]%Q:tꚡd G"#D%' ȇ*H7 Om]R8JDE6oaTemYƒn&*$R?co-\412طkac%*д;Hz׮\E_֖WƳ,qr?Q1~Fchv~| D>~(M@{r?Eu/y'xȓ_,)o2|?O{O+\}y{Gvr[C)KְrkmC΍Q0e)9u22yF0&ۋ6 6j1;:{ ܹ'lvYX$la$Y2+u-_^YnIK@HH`eldv6N9O<(US5o7|B! )&!6`ZmC'yt3OTX%q.A % VFa{yt|Q:Kl Z 3T()N鹷%Ǹֻ]:yw jpz4FjKESb2 PY3 RCprT+.ќ'H4U"P>$p8% “0eW0ZmS@٤ᄬcd(&cˆL&r`Q'Ȫǩ옼1Ppc,s{;4fE&!r`{wS#l$|aEO=R B; xF!x: #(-..; O DHH$l-} #+R*Ҩv%DԘZkD`KB2wQڧe882%e"D̬e*xkP`XM!\D}r DVCiOUE22,R(l UF!ʹ\h%&45Be3ң&A66U3$!DRzH)I*50FP } 8$;l)dsC)ըǤKi!5(oM 1IՑD `dP*Jv~مE[+,њ]@!%=q*i鍼|~ 9fjG(ګ t&h0X}8IAkVWpWP"g!EQ auyAQsii}H{g:mˤi7peP5\h{=,nTD Jш&d4EOpk#rEtZ|?C*[[\Fy'oܽ.ٝf$xA#M *{%hd5%}|a=V] TB"]A@4&OPdPPcԌ3,&p22-e*'Lw3zj[˟0p3JbL; L}^lS!$KH:#k5A$(!E J1:e7a:p#lokv "z*%HnHrzSr2D& iK8ꯐ le0yJ' %Xސ5[yBA$_r/=D LIc ;(!!MvĎɲ| Qȋ] fc~f,2\("ҼCD.X]of1^ǟ`|׬n,w`biOuqa[n:'_m~*B"jIБ5})RZQ\d1$yDx$J~ e-ej㈷a41XyZEBJlreɨ(ݫS#>WH£EhzkCH!-sSr6UUqqswr[/4?zΞ|!M4UIUes*I)%A~LwHӜ77?tLh,;R*cxFd` ȃ!f10p-h?`jfEz픵-ַ?Ki-Yגh M1x[b)I!|zT;A)CyVy2Xki7$MI%!#NT\rLrX -&Oqnd|QCBLmTcpˤrn0ڲQmXa}@Pf)K/ЛAXEXKTΒVEJ"2 Y ,KQN{EhƑJ^ͧQN9?Ӟ {, NSt.Е3,)Y;MyfK>MɍLs`C# H p*fɶ7!qQ^ћ5O5;92DT ' K$(-(|($ kjDb].D%9<J1YR= 1f}@)xZBYDDu&Af Z,Fʘn<5Iwɫldnuj_aoS?o @~Edkw~%^uu[e ;pi_*;ã|8r[~!55M.3 Cʲ$;vNo )5Ipgp"<`Q|ɱm7qk^_b}e9)j>tÛ7w35?o{ݏ?}{ߗHmg>͵ֲ̨,xgx먆c$A#{g3M7yчxm2䆗ӟ||j/ ;L,dϝ;Kž=£@xKSe( jvYOCQV8[$I!4b^O"@(RqO9+̱ˉǿ?kC $C_U=mQX.,N*l5n,uMA50~DPM !yR vDa:hP&L?YA4z:) QrI1$`ɲV!sDcc$V1Op:$bKqcȍ?4ZaBViz %I h2Ag h%milJ$P4c!*{3TIs4{|{^U%]E`}0>*M\NL\i̴,>(/^6UM)fBPB%$y 0'F[C~)'J6*$6xkYtR磙[jILZ 4"[184^s/@chI9)_ yb8.چ`ȡƹOWdԯHOkjxLŢ0^&\[d$#0{Pe4fbG( v`avJ)+iO`*B9K hD'&=)S',I^-I"EN}]F |-+ ^ Ǟ!U j;uEBdz 1Z`B$継jYmWųOYzS?|{_z卜\ F[b>Vgkav˟}XkIӌgpuwf4);O~7s./㷿{|2jl𬬬J((5gODkjWjz/aO3{{rc$AK6in;эM^AÇy#Fݠўh;x~w̮iwILbi7A8䧾nbb6(|E!FcI9& V(wЊ:J*1xӞKo{$z,6FAEeG%YN.g(v`g *.l0 6"2Bm)*0— ͥ d}ҭ1M#(@1.+`C\ l'M9&5 n(FzjxQ^W#C6M6Ox+0؀,=I !TUZF&>"ǨRD&?YFQ4nc(Q&Cɸ,87P=y2ncg6^m|;;bVc Uٳ7TigxW5cwX=Ņgϣ'IPeF+kl04#4c#xej$Bes_^nQ=hCg$;ѧ)LE HCeIZuoMl'eP֩G*hV X:)\BNt+%:uwb_ %:.ͯJ vxu| (L\~ T+6*h * ._G$(5RQnT\h"WڳFGDua=RFNɟ\i} Wu|lNKR0&g!DҔ^J#Fb?fC8`?UW-=:LT$ <^R@iG4g_˗i6O;}W g8<5g*n< yy{ݫYpsg΂i0Xj̰H(F"hX羈IS^dlBpۿH"1ݖ`v:EK?ƂGNNX+V&Fiu,yuce_`  A3_\c`u ; X0BaҌ/m-(k^>ʫ$-";QKJGP'Ed(E@o16"!C-#SgGDe$yg|;Q9 Cd1Ld;v*@3+S8 X 0 N"pQ2*Ka)5 u"Ne)vR2Zƥ֢n7)(﷭`1R s֊ R #b*q:?]`03@b bu{n~~'|;%MVvoggozC-Wl0M6]{^ K+KWm[[[hU` Jȓv3ǏF4[4L&uxUW|"EDȔ.QϿz~J)4*y_ݻ,iwPa.m:>@52 ;LU$w{?}';?:~mųg7ϾeܰФʢBԕ a y,HJBkš1z {L3û `*(4얓E)Z owD KdD(hBEe*ԬįY>f-R5;{%aEP#X`Oȳi?h#/s{-oΗѻ"茵 ؍e:SZPUl# 0(u5໇(ivhwַgH,Qy$9t:m"x. T…ALцu<Ȼ]fb3.ng i\QDj^13w+x Ǿ-X^`*Ho\@V{vIf)2ksSC 2a2m',Q dB}$sE,U^<4=!X%5Q1 CD,KX I Ibm@fTApe Pi݈XlD`dC6!*z,17tdWBAUN©@ ҵ/!AڌGTm:5l`YAN`"%IJqQ:* L\ \9[6\\ H%WJxB!wDKAG_F緬*?6|{A|-MUF82HǟsIf F7ybng319Lr﷾7"r70>g~~;sF0gv;'RKDsE>vN=Ǩț} od<@>ۛyݽwpþVO/ַVv~wv7Ӹ- [w30'k_|y/͏z[ QTvSSP(菫xygJW{7|HIX%U)yJQJl!};y-h!3Ц)\s0Za)8 h`e6y0 /&lǯOJh $ @*~]@ 6/@Xjx9)44E8q?[KKr gmL+CقU&$Yt-JM1ZҖNAeH&>F{z/ݪ9~q0X8dBz`z C gbChvHr}ttEs*QOc8сe;o^*qo!cE4+MNW$ VR'16 rIEQx)0 \ z* IꎍXOd7v"a;ѽu/`q?\!RQ,ϨSwWXb~UJU_j"FK)#;SF;b߅R.cn˝e_R|IHHj}BD/(u-!.d]\Xc>2ZdY3CMHbQ?Cg%ddK4U=@Lh,]ϳ&äeA'|H( hk4-н݂!UDž'?u v4/<Þynu"ލMͲo?F"o"4( p,..R8åt0?5K@&C%(i冴cq~FA9 dž {gif3v'Nfiu˧OTðm+5wqUSrZ67֙YnkI8[wq;v/Ox)؝ 3t%,426% }oES#{ yOrJ,Y1_>'=zfv񇰧cU{yÛ'q#Ln“9RVTޑ&\E.!x$,FԣU3^-r(IE";8aNZAe&QMhe0Mh=ȧ N<8\xs*./к pD;&'cMmr*ʪD#M 3E53{#qKhOJ 94ff)F5{˜F;hjޑ1 U(ٽzfp"1(P|;\G&bv`"V1nq&:1FcY%xO1h'fj>~wGen 4R6emKX | Y҂QjS1 ,(1-AP#1HlPr"I]IzIN4YxuNlЇMkg7('[b j 3=j C6hv;|#~0,,FYHӔ}թeϥ7)MVΞgM7r]w2;7JLLyK}h᫒(ے+_rkn|9G$)9|4EQpqc `Z&2z{ircT~wv7 Jpz9tn̦]~c.>ƽ-7ɣOo>+#׼'C`3tY>9YH$>+Z$*!8_De9FKp%'9̈́h"~F9ϮB{7Z6߽X_z:u]y/CD){t/ݝ,J)En=9a/{uX)UtƒuH 'Xː惬+Ç({z W>94h6y]gNof )A$ ҭX szK"u0v; 9 2(#Ô_`7ƢU^ORw@@BQ!-o a^_xJ/fP& zj]΃I"r(Е_XbpJbG#ZPz(*"shB t•A&u=f @TqDLhMQS8X=Ag ֓i;%CCUo]:Oyy.Mt¥+9ۨwĊ [a^P+O=tJA%e`E"]'J4k>?a#;_MRo > q2B(>wk٭f*3'l IDATgJ*p?{Lg7,۞NV|Y?w4ǹyAڃLJ^ I+ lL}&o?̅3xG8DmY%q0 V`]XJjg5B D))gyHq-sВrA[C ߁ch+ 2vȞ4ʫph۾X8HU¤md!)Bw0VsbgF8^ g@نdz=Ec Fg?UeE}"*(\P[BR(">)/PD># ֭Ԝi9t\s\ "(C鈩J-2KQ7Jck/_cfzlY@FXqYu]Ǹ Ck Ub1Bt>8H"Hᜡ;$2ݯP fEKE9IJ& 3 (XLB"D0 EZCA$nҤD)rgё4A/]ئ{I9pL׫jq¸jgF&מ su_,t {8vtC~myG?ʩNp;|s/us\O򪗾 geYQ2q,/0%MWW0eIg7'<KguTV'O|isK<+98O֙|Z[.& M st) 7?~iYnn[MTB+QW}5T073`_3>y>ܫ8W/#EN*-3Ujlnrxwe*GwH'ޖCM%ś)5q8k$е 9L۫&9h .E8*5wX<r<&LI,}|O1@j?>R8z6{YqN!@ ۸Q7a;ՌtɰߦNL \*ÝuM z41ȇ ǚ1dC*Ltc3AR^1\ޣ4 %6tDhj3ш?>"4ӳ{XԣHӽwd5>X$V8O …(KXkÃ@+7`h,*R0#%1bMa™HDp 8}"Tcg~M=BTR$4W6wxŝoM,,/& )/-8Z~"6d/O%rҰ 4kɽ@)"喱D`Ζ1K' $9ɡINҿ - KT@^XD}ROa DmU:8TINb%R &lF2HXIsCETCt@ߨ6%_`EKJќˇW1\9ͅW~z/{fP;bz;r}?=$1=E f2sSFx<Ǹ)m F i?y^-/8J!C&D=v$a9* _#3?h{{ =^W/=^r^ݟ$K,m!_B8(˂`Fh#jNkma[ n7K)1ǂ蹌9q\Fֆ'b!r|;?y K܈uL-QˆwG=E=/"$iF,5Қ,BP i˷"Ô"vpۗO-1$u(H7>Q@P5B97.B0iQ[q4nHT}Ȣ=gqހQIiEUr۳f\ۆsG#q5L*;'b:ۤE3L,,3PtǤ\X6770O9s';)reNY+Pj|Vu>=^ʽǮRη,zcl>h6rH։3ɸŔ}ȣ%ޖL1+ kJ Jaa薗q1'^ HJJQp "/x1! rNᜣjHT=&ۑIn'S}!!]pxOp̙7hsutrX>P6d Z1s^8+s~CF l@k|Lex'p>@c$S3^ D&4aoO-i8wls9FGMxJHcJ 4COeѶ^MP6AkA%@&ДfYSE0K5iQ"E4xn&,6G[2x6ßJH牐I.as&qh2ȄOjc JMiߨ,.,زG$͇]hdYf*kΰ`qq?yX%i:8>q FXNV8rZk5}w>Œ#piDZ'%Y!(r4 z>ZGH)%/8.?߭dv뛥J*yNn$2D"0kK ޣJDy&"Jg.hMOyn> ǡ8-@1*PYX( :%%he^XANMbb4h̥UW۔ɡ0Q9 (]EzJ$gQm9ZD8; ւr`PIY(d`T*7+P!y1k[a2ʊ@}/¯ 6vq9S 08.Vι1EuG`6QV8 gMר0 k""ynY QxʴJbN2 wįLA8>XG%7U*И]D]1h[0̻{(C#}LӰ׽GJʨD>R *δ:jfDHbJc0G)K:T&ioTm oCkP;"/& 'ҢYV2ϵ XgIEpUK VN߃Am. ex2" SMJpe,:/GpUq*};C&W/]y8AcTPjܻC?ôQ:X!AhMBysx[JKCuخxMݿfY6Νgff˧Qn^c ˏǿ#ա(L1pOѿC+2FPOJCbV~zb(88Qx :hB("s $DMs>i ^/}h@I̤9UJ@t0raWZŒѨ$sZ<HAf'!ѣ=0$c.RȆ(|`=]`XC1Zb/{k(ј1OE1,~нc|(\qCΏ|כwo[_?,zq> ;4dWS5]>rJJߧ65jjNQ9шxĕ6}hcvڭo9q+Fm!uJ Qr(ҁb>%0=\X;4Q&Jf8cER9I;DgMKD !0\ :FȐ"D"K% x0%FG%HuƘ:p"F9Ebn>jZH`fGArYQkz̈Q=y^ F;!(m[5n ^ylqVI6,}ΑP-Jd2\}0J)Qv(vl|)˭]p#W8 㙂hzawZ#JƘhYb N-QI>ؚp{=7T97>Í WꎹY:vҁeZOhW{f1CA&AJ\9$Ic/;乢PկE҆T.RA@XCF;{B#BOҲ|mAzRI^`u vih&N k#L::.Nd^W-w-zm$l\"IŨۤ͠4bC\B0Ɵ=ĭod h>7>l$J\ٳ:쬲tFAXboiZSn_SE߁Hxq.`"|)SN BI(aа`w"$w D{AUN7*&U8 e}H؇M*< JHcIn%^.k&MG0*f8VEXS[$y9"m Z߇}XbD8HÜ,aԽ\n3w*Xop˝-n5wsg,kk5{BCB)ʼnAM7B+ 3317R|5ӧ84͙k|LY!9N*~1F<ϙtfuٳ0ˁ}XbFg4w"]%Ok FLH*Fؚ24Ii \8 񯐺+bq^p;Y%.xW{?w8r0Sbdggjur/x1Go;_*>ῢ5v|5ZZ؉HJIddi4ҖDig_yx~;{+|˗IvGFyӛsOYu*I)܈z1 4J Yĝ6UA֑)|:$m}ؼ18gX# &_ aa!P0GyofՀk#1-C?hsj0U1z]TPԃP0nCkGw v` *6 I}J ?rX y%b֕6BYd"!ǎ5[LO}zmZHBF!Xձ5xD(J$} 8("p񘳗Wݓf&nDoQm.!GY4HI- Ȧ3;CVl2[&WI+BٕȢ$ iC\P ,ΈxB:`'H'Y,5Jg^U*e8#`ݿN?o%qɍ\f$?eshɇ-j`0@:Cj_:Mnd8s]s !,l̞9; ;b/9.d0oc<@8M;0:}Fx5Zmؾ+0(4~4t'qǮ-jDX0kri~ ~y-CC=ycUרUJ丠N4c *$ wavG=^%fCDazk+TTS/DbHٖX jMwƙcfiz#crꍔoiE:CЍ* iJ*iOHg&qB(' YT-aGPlVQ$W?1kFFPClJB&{YlD IDAT%[m ۧ8K#*ANh7A;6VVp4lo v^ݢhjYƸ1ϻ&**"N:$ޢxX@GJ:MVm|;MZ&z!ΐQ900{2;X!߭dv뛩TJH5d9 eAYƔHAxTR"<~U3x-)RDfQ &wQD!cIdB%L"B{# $2TJXl^ݐK>֡꡶ )8Zg?Gu_|ǐ J v!YJ6)e:Շvj) rz ř 2CUj&& ; a墥фs06a[/qS wn|vcN5iL5w[X!Q#Zm9Wϓ$ b &QbHX'$W0mP;(#jΠ'X0 |E)+#z=N&fыsls\AVpF ՚bڀq{K(鸮7Vix&lARj]3G?2E<֦zžC,TR~ ,Cm#_ Aa ^9-+5ɲ )j*e}I# bO㈴SͩVwl?UY_Y亥9R9SSubH%B!<ΘЍH旨E)tL8GWϝW~;9sbm8"=ՐiɁ]E! ÿ@k0&bCo^+HI{/(--ٿy7OϿ#'{_C%|TB4-O>I%:_ w 7+x׼xqΟ{=OrML"Qiufl_/nFeIӥ97E^ezz(Znso{fȲ^lj'>]/z1q+_Z>~Fn,=9OLJ^1($_}$_~O˰o $bQ~/~#U(aa 缚Pva䠺/ah{nBك)lwـfTWf?#OY\A=ԄiCa~a̳ǎi.oZ-d*ɋ,z38,5&:SO&A8BotH!c{ Wy2ΈR9Jٷ(W%< zCA;RT,j]r#mwJV7[co#&ZH51$R"|Yے/~{LTx_"@8X**5Ȟ$ @DZ#FUE9fA.hġs4+ m^d\|%'кC҆E\RN>lQ`,@s?r3o|9{MGE[0}.3Zqb'V}9om84c6vSS3,--׽˲`HU4[m3<,m9_ <‰[[_~]7曏c )%JE y7g;ӄՕ-ؾİ7?#},ճLޛFYveLw19JI!rʲ6Tm(24PeZUEC LVu pƖl˒-ɚRJrΘ{o{qbua~ĻVX7Zqω}}, I`ҌbZc%RJ1'Ӛ~€6 cbjW^zׯ~ ЏRj#TI}!^K>>Ha@QJDQp8{i=}7C:)+,Vh:cɬB;쎴 rlALEFz8Btal vbULx)3d1Lda"Rd4A~iR@Շ60!aqAoS>l-A7t\lo zM&/n16y!8dUCQ8,?!-j>kP*Tңzt`/Lrþ12h!X]YAL!Z#=oyVdu~w>o?S2y;x?Oʟ|1{d;'rKParr ?b'jwV8ddd ?p&CC_ͥ1u0  $!C('\HHJW $6͗1sQԣ$cj*O wY/{,-@A6||DQ@ )%nbH$`,ʕT*F긞P{i=}7IAdN41DPr8J4J8$YJ(x$%Qade35(0$ŕ AehQB@o6pj@r`Jjt\l\ TǠv|bw,Aew&׍@;H÷vJ p>B;Yys\E/; Br $Z h6pʒl]j8 *&ػ૟,S Q*|nrO{ ÁɜIQ*LTC,hcOs7Gd2c!wp/m 1|/Dfgd%\'B% ~ )TACZ&C\BR6帐$4*%^\Bޅ_DHyZǔ`4I3lm44o`=PqbjL:;CbG .J`l}{x;c8# mb}0?5…'s\|ڽ$l|FBmbf$(('}.,#\!6yYOU?/=zf籵2W_y|񉧸Gb[x+0Y_wRFvq6Vٖmb,3ePYS(HLnÔhը9yP̑e_c}97>I^~YXE]q@ zqLn]ꕵ : ]!'e^I,ǨagQitXsb e) rǽC_qp@J&s5[-P\d^d5{U8kWqBSĺF@)z;Mf,ǥkYj]_,Rjf'hmlq{xop` Ią}<|]Ox>q{0R+Lv ZmpM O> ?[4_xZ(A10Fj}eK,shV@TZPDH0^9>R8r%[LOGzAoQ^p3ajSTKe_ʕ p B#]p^YnqCtp`x~O{Ȟ$!R X"+VL L:A!F(סѤPhJBA rqSDF1(mpWڸ,UN6 HzmT@:LpT'3|7( I &Gva6lO!69ް߰u^>!2 nee>ihp&wD6!gy"M?!jӌ'Ĥo]$|H6Q!p]ZDTjJ$++NP&Jf!GF_kgOkI<$ TEqLPCkwkY_F*TB 'B%~L֋_!~LEݠ5tb2 "uȶ(22)!GJtHb;x|3'd* rK %.kap 1@uhS?c~6Ε.$ft|"K# }*Pڝ)<"* S{>|xHL$O/dnLzl4:R$L-^y鳧Ԧʸ>35"Ix瘜f.י`<ǘ=p}3AW$; jH22#IPT/}wq6i1f/YfV<րav~"?*gqH!n;=IjP+nAeN0R=V$Cn縼8t=w Rr H ms|[܅ck'4]uM&d}ѐBu7MzW_9+/qIA=L0bRj!aTVw }(\]QZ꫗94029T %JE ښ>"TA1 #4EJq4˶S␻SG~s|SMN޵t8CSc\$5!XF9~ocWX]ĝ&Nw} IDATogeMGVX) )#tal{>gG%k׉KK|c?Gi4DP+q|GQ ~Yl_Ho3(kXvr%6"m32 (Xsi#swT"DEA$q"ڍ5&G&˜,N!QڡV\*1ZHݗ\|FfM8JgUu*F9=$s_?5pw<:B7ȲJ1kO"Qo.X(buőc6WgRg<^&esuHn$M)z+ddT =*++<}i %틗Q6_gcZ9 IMXZ)iR )x֞ }O{Ȟ%1h؄+sj[]$XZ|)p\ACmnNBX*M IaHMJAJSD <2q.D)΢B" Eu2$u aoCg X<^Bhz  %Ȝ+LA@ "d-pad2 bCs+''4곹q*fgNHm1I)HA) &ﰼE$iBѭyi p쀕WE##cJ%M .XO~D8N`ƪ4gET K4>z=Kd~ Q@XAPp'NbNgijxרW]>#z/l\r~#Uc+)W& xE/ʎ "+@l8q&˹+9p,/\f#ʍ$҄dCFX(seמ.O>n*4W> e:}JbV7F|,`#xܷg4O>7s ?u^|3ANγڡ^ 9sckΜ}Qo@y|$ws]B9‰itHQ| \etv<ʶkv~g?o/ZqJfRaoy#\ &(%h|LN[lb&)B)6^q|?7L* DqEN}7>)㒦Šr>yAR$IȲ<)ui pv= {wl0h2!KdJ%*RN֋l5Vw(NN{ΞGpmzO}cFFP҂6l21_Fү )ś<1.Addq딱A>&EcQRce زx՟,5diw:v(NNPQf&L{p Y@*‘h[B[IXҤa8 oWɃ0A'< X=_{1F9.;RͮѳZxHLė[^/؄FDPB&ɱ2C-kFtx~c#xx't6kMKv&-nj)>.<Ó<{Ot6w0P= @[W/>q]:;$S }Rt#p܀JJ }rnrGzF]g\YGҜ>0CJx8u?x<[$+!wbr|&Bs Aw6l~,rHmWiOUR2a|n>jI?9rM0R.)QpKTn/nl4sq̌˜d- 9:bO"SD4@(IuU/"`1}Ұn A1=RdE<'SVYJVPVGx*혬(8B7_|`Z|<\FSw.C݇Rj.,Y;*\=5AǍ9V_\2̕Scz&IThF3D& &qzج>in۳mcw[~ 6xb 7 jD%܀R%#1YD/Γ(LP:vtQW0|SZ b,IÝՔ՗@K)wA#EJBK~=`*@yE&L*j 5FyJtIW*"zm6䱭Xu-"bQØJ 7q0=:(&%[&(%h16/]j{$2RQຊ[>Gk btьxư͘,"Dc*&x <{IưCP) :_dkq$ Ӵ=.JRLC/՜4_fGYi`Hy@M#_5D5`b|&@H1YtEM\a((U7HsS@p081D FevQ U N{6TIG lnj(~;dkczP$N(FTcxRQtF82M17^KR,׮{%<w=GP50ۦ2A1&+W|<O#3p_>n2z1Aࠅ•$g3Ġ<xB;8V"X? 1YDS^?.4g wӨ&J!F::\ۀQ~ &usPcqr^` MPXTf1J;nS'D)bIDM,rMϣmH`4:Ȥɥ;:]֮l5fzwRY259sg(5/ϰY8~q]1!S$\822S4p]E2J$sBEe= [bl31H2!A2 t3p_wX${_{>FreqÞWiO=:9jm/u7ˈ:Wmމ3k"X繅+I'6tPuSFlJclh-ɕ+ bA!P'n@D\ZN0N^3>:rŇY> H6G pC{*!iVĨ Z+>r?Y&[kӁ9\;]e0j5=W5 V`}-UEwӯyZ)& R؅kf@_n /Dg-O-XI(IfJ;OCHh\^[ V5 ]2U|L'xn&X8#Eb'T `yTTp"N++7_+"D:/ TPs+|,_{1cL!F0RDaDP ON4ʐ%Hcr hRTᗊx%Vo}_/v!g{ uMvPMUakejecw$5fesi4iu"vS Z[C$<&j&&U\,?pdm4?1$[[[!VF5cztt'O"DcRWiO]~7A'Ya5:m~*jw yr1VcK^=- gmcp|V'y<S_ ISܢO{aIenSFMt:} jEKy饇I<ȳ1y7DjBkkolTg?M+_$QxGngۢuQ727S Yg󰰏"S!V?Fh1P82k^$n%xcyJ-oClzny=soilv'lo6 QS~2XJް+$d ,q,bۦُ93%0مDEH3ˉ򅂋Ef1٠Wbd t}xIC*de$z~o85[$Z KL̔=7M֣K ] L!wav]Oos7Injn0.`l0Ɣ. Inz! i $I.lMeKr}ήk{p <<~ѣE浃(D5&$z"ZhFMd! },k'Ic¬`c:B/0C_JI2(e ɡ)*.t+(J <&6V?PQTI${̟zmTxs?F ׋X gPdDgWb2y<% ah4d2 IJ,\׍'A1AlR(Q$≋*a8jjZj*"ZIFIDdb"$GqTkZy)G@QIwaby9ϾS+Ut-C"Q C} T4 y.B9 F`=yR|!mt4䉱`%t!%ͪBo:M0fs/ ~XB[Bk06ŗqhA " LrX-u4y)|?ĶVhbI1ym4]Ţ%7H<"DɾQn|ُ3~Y/n7vB`x1/e*l-F WָvT몆OEUu8TXju\s'N1waIķ虳ߏWRA*:RO#4]8ˉ|x%BM5CD.O;׎y.xitˮ!'ѵAmuHhdTEt"!$)LU "]~ o~ e30c{ٿC 2 $4"(lcE GQfvL1IKB&pƻ6O0"@ "KA g OGFG>u$L[''yuב t%Uo~#F!ER`ms!zK"M sʫi[E ٞ>>dvn5 d! l H6<[w^ʿ>oA:nbeD2o:7 )%B4ÈyFPd2;u5k1 KJVIQPiضMaZ?5J(\(q'YW8LQPX?z@ AY%=Gb:: D 8_ @<{ šlYq*<:afpTCIYD!%!"*FejT>;O\hbtA+(BaF/rTt;N7q&Ԟ8 a ׏)Mr ;T'./ 4\z3kx$C&F4sL>W\qEPI# .Nqh:!bu}}O_I uUUYq#2RUCtN)QRPF3UOQYX&x:f -Z\wMlܶe-W"Y^y$LEضN"ʫdnnT/nP*RD!Bh48ihRGn""dvfmSV)JNiC$gsjZ4cCWT4IWjT]YdWUb  `p]UǴX2DM2diZM¯AZغq)|H{eHA$Txq/AkiU"&CT>h7L6O]Q4 AGF IaxZM$М %'WPR%tK"T l0cOw\@ b0L $ Xea ܌]0y.,⩀,DЉbqa~!Hj QBXxqɖRRXG m"\Z*  B- 9u} Urݫ14ZB8C2&;I=b* ) jZV@ q5]S D1Pp)DCR̂!!eX @UC )pNDSKd nЛOs;_G)5vj,:&< ˠqÎSTGv㣄a%w!dM/\w8d.RjD"\FpC!-@J%PU)|@A%OO:\@sͥW󆷽…!Q0I`hVj,|W >žU~OO>wB-*ʫb:qһu;8z|;`]'3:̅sl߾(p͗'?uۿ⋇;><G~gn9wvFISmoS,,,ȃfHE\cq4]4M4T\.!LT*Eqr B!mS.( ="Z"R$BjZ2T }Hc,Kub@1q1R#2:6za0N@pzZavA+TU-4aݧU/26:CFqvI"TXY=0}jG4T\Z^|KӪ I y" f¹9AeAlY9~l+U偒SfQdž =kYt=5MJYIv "R{%@QUHGQ5juH|k'ؿٿ֔`FO3telq_h-7[4#M*ij( k!t)CH nM:O*J*{QdMR_?<)tCHCŀ=$ՀPtR, ӊE*V-A;mU]YW"6f`ĭl-3:ЋD]rmDdyJZW&MN$1L S7H%̝9ns!0}#L8RJ2 h4, !K!v\.OI,˲(JuFGGWU jXQZV $HsG (r%AↂDBC0 X 9_2@}XĈp80jԽXtnJ L.q?5A&ჽZG!!Q8yNpބ'D nY6ݴ}Oјtko"|;N1`LBG8.DZ-J=bkE=μfZ]be$vtYN%\AkƑH>:A~"=#nf+ii;q`$i..\:pn@/͘$xe@I  OAd [%lXiCҐ!US%%MO]Γ&h$h͐^l&-a|'=Ӥ/q 4ç=Y#B~zB*W],BW-㩔A'ƢYS4@'Q!|5p=j)F=}o LV OSa㛿R)}"Q( K=iLSGD$5*:VR!G5OqtOc;o5F"`hh %L-˟~I'="O_x::gٱR֌f݀?XΗ/N+XB"gqHj0}/Iiө)Wb/;2Zٱm;Şc*zix! c{_hPл.Ra6n/Exv:siSo;D7!nL‰g>e[ٶiBڦިFEO&>B5{T'tgnǟzNv)$6Rʙ)d6vSvVUU?~v>}}}4 :R ^ )BPVZ Z?I烡W)%;-KJtE%pMōB a4 $i4f@т`f4P5I3FPv8ۙ[ߪ<NYB$ݹNeX?)>L$]00"Tev)LEO>h{_؀C؂s{gIʛ% )_h:T=MD \HT!w1w%?OAcM#GlQMAOKvbAAQc,5E.:UW %|<ϑ(31 -0ӊE F&ů¤ jڋ+T9=a"?$BߍkG&!FNJ,<,Mxe9 $HBu*sݵQGQ;(:3.U|asœݑ2kYR\zUňqJn 3_?8nf"SHㇱv*/QŤL'DUTM I4u0"4* (jM[>fpknd=|W>05) :Fغ͋G>?q{z;>\{7NN9nJf+d>E?y2v2|\ץjI,3Am47O7EdixMbWr~4AM{v6ng9gKOsTS:*-־mD raۥ'/۸#~ӛ$IjHT9EՠP)NlBU(E^T=~ ~K" u[y\1rs3gyh/XSa}?OWJ=%Mwuh|_7D\eΙXAs;xQ j^n#%PYT"7mʔSݟmFJQD² er7GQ;j|(e>R*x~sſfllٙ|vaE M& t[6NdsĦ/2,ǻ/-[oxZsNkfv^q%gϞN&@QË/'WȿDmuVt:G}%2;vL&ڵkvhat:f\[wbhAk(ʠ ݐHUܹ IDATI;mUz%ӛghq4Ef.lU,$PZ1 \?z?7`(*r-8FEx+! 2X'+ JDrNH2@$G oA8bb*躉"YG?ʳr.w`M2óhqիBQ{.w|AlK9{jsuWyM.?NW(؊dž~>vBJZatL^8c%74jYLDU0]B^MNj875cm{x;>".kYǰL_P7R…Çv.N=R?W^>y22:B3,c'3`zzD"I&ĉK=K$}=aH|1< m:>,===8CNa&Vg}3E  ^S K$× pv]2&!T#?P~S/oP (袹h=9 PHxaY n*]׎\EtPZS[ƴt|% yzJ<0ӟ0[3szw/~Ip˫^je+G SU#]F#$ѓƩ(!!z+ehtm 4=]MQ-$Ο>ZJ/ϝ]d0 #Cv%_߽8+C}<7P43Tq"pbO)xEzL(Iz`ԄЊUv7DhLkPLA㱃->O&R\.|<'k %aA7eJ-չ홀aсDlS'9؇iE tjG*s=,Vo_Z~.R05NReM}sM:`M圯;eVNs3<|f+7o}^zB[$ǖNSIZ[KWpvj# K!d$1L;`v~zF#)P,m_鿣h1;;˶-[ٱ vmH*T5keYJRaaa[6q10 J#F0$Ld6}2m̒l!Oblln""0"PVB`YVCXIQI$- jZzͰbۄ|Yc!> ðqAC:slͻH g=]=xn',]rFmϑ_`9.c-j1)RKBX0V dula*i5MO zL cp#`՘; ^ ֨LBB[ׇ2H-v"gH{`2P/@0$$Ilߙ%7֙3$˸&vҬ_BeVe21r(] :HT} slC'#G5y&ݡ!@/^ʭHhJT@%iYJ":* "͈Ori<OtW+G;Lqh}$lRkΟ8Oc oU]ÃxRv;A iEvh" ̜CQgb#Mt, ey$9*ٵo'}j`:7\}(?1R wϺaSO11>̡SαFM$Sm&6f)e̚s\Fy>FyeױoCR_GȯRa ky_$QYs7ހ9lܾR3&Ba 672(КͨN]#ۄ2d|evjDNA4ML]g%w}'{nΓhf4F0`1ػ>v9^Z@" "H(8J3Mt=9u~^X\yoթIӧFB&F,|M/v"T߽4K1%K s=Y檚?s 3<x! ځnje@G SC.B9 Qrپq#ʷ|ȝ|[7/?` lAt/c>'`9?I毰8Ӧ[:F*mnfzB͏{ޞ"oI)bHh9#=L6%-6:hQfolޘ_#3`VظwLK/_™22aL4l"TbXKh)y$I"Ih1bxZB1/f4>)x*˸*TmnܻJUaۆ;`o ?2o:Sge>:0ķ,[nbd ʟ|6FJIY6[eö‹ټ)`ۈ ZQ>r;W.7xlKL"\?=#.{Yy` h+UzKfWh*齃\ ^qYkb;!+er7*k=fyۛODɤsKoOk(a8u2\Օr粼 =,X wP$Jex})h,VZ0 exkU^{V"XvMbe4M%h7H!XCCQghc.!$!LՊ Ӯ61eDI!i 6Ԡf2D$H7z"gّq"Lj465MU%h0bC K,? 8Q[ aÖfzL|\ q.nڶ +>dUH Ү$d$ $ZDʩ%C[hEH~nQbCjgBI"V1#)$5:w;tBV6A! 6=aƹ9lp; E-dXdh΃?dTXyH2D&A[ (-B]|<lXΠ'DbO6~A8mH( T65ʅ [F=dLm3 plϵ'Y"{Հ{~\-8$SdE2 #;(in9fjǙv1+ Zgqwu.ck r"H"/*W%H+ZdtB(9(D p;De8c;)EPd8zq?c[,Mq xWI d׶7p;aGC!E IjԨMXte}$cK3RƱEKl҆ 7rsu8x/3R#4XX-Pj\²,jϟ@\_|pm\I[;@pqn&8Uzz{tF\nbI2+ϱw6\_D0|-@*6h[OHZ͛7H$8}e =k(#cr=3#|ADUuDBBùǡe8W;7AҠ 7ӀJ KG< c;h//T̝H W5lӶcH iFN" W~t Daf6ؽV8P!^Ъ++C2J+ g ,ђ*m.D#d =~\5d * =:{ Q?\ 09D ou0 Z6*t6BJhtQ5  nx>ȁ@Gƛu7 ;)5.Zpu1>:%%@0Q:Ordb8kv[aEe^: Ģi?=.]^BG8"a+&#W쫯1fNN s-y~ѩkhz,M*Zᎃ?Νo {~3Z:z:wp|qɷP5|96m≯al[Agpe6|A-UƳZhO4E4ۈZKt1ĒI+Ȣ,hoCp=V |>dMtm ;a4lɀva [ A$+4bgPe&>d'A: ű<:WYCyẹjL>L0D i`ch} e^eh*De UƲCLWDm$Lr͕8Wqm|A׀ V@(: h]j'd.d=",0VE$؜6ّm_XdRSĂnՅNXÿZe`F1id]zaʵ P4% T,Y\0Bz'='sD$񷏖~Z>wciKv.p7P(M gWI'EC$Y&bԙ_@OK|Cӧ(QWOalYbwI6F,^!6MjAK ^Ç$IWNd DO}o3InWثW9ygOOM0l@Sn |KǨret=EXfCx\{p*x@אZT&Q(KOc_/ hW Xk)cy睇(0:GNQ4gvzooKL]%#_>K%p5sk&8?^ [2ٿeI)i&FFfs:tm%vեV7 ؆Kj6qG\щv{߉Վp٣ j̮\fD{3\8Ze[ rh|:];i,<,|(FdR$._UԫG.ˍ*3++טR6{yN]:x+7XYO  @~ݛPc>ҋAS#(Z(Ud Y-1e!8EFDFhV](fGm4}E!|MWA^\n;x(kJUMԞʆHUӜt)L쐭h{aŲ&TU% +G0.J9D>OTbHE̖G2m8xmY _[R0A cŰ醲/Yf#Z.(l!y3W:nz2p.h.JDhui,VXPoU)CknWO2Bb2p0O#ʸz$x -BdsL { fծAcPYWJ,X4`mK`f} P>JS`X4V -VJPkT 櫰ԅ 5ڄe)\a F6 2'OcGOA4yO?v-+B4泌nH1Pl4yK1MèD|cbl;٦GyoN`966r籛 n=?FQ *W.1/K?G1RyZ(cmKӹT_'Of`h#c#Fp.j|vJI$1OF5TUl6%M7/g_4Z>FmE3hw~@Vᶷea M`f8u T/tlͶ[97{ڊ"=y4Ys}TMrc3,PzE24CAPykl wa+.?z,Q]?EƇ_ͿOGT^\_(Do'agE^8z:&^~*o޻53ٳ3^D-*qAĊY(v 4Z̭LsuY`g(bYxf& e6pGsl98X2};= ={מ`MHDQ99,( Xo e[ ;bVxfoPE@Q ۼ->$t`k`z1 b4f[4hi@c5r|*~+iL_R0Wۆ]!ibfЁY,\ ÁXD64Ab!am*E* yØ51>C߅L.F?װIhVl`#KáNl@HNxL&u  z+ ĥ7BLg J|^ +f;*|O.9AF6]i|VR8e[y=WZ'd \"P5];0:^0 3Sn`muLEM_CXۑr1 fh8{'Hbd, I~?f"Fh.+e'IpE>G?Km9>Oa%1"{X豫 wh^Cϋx]/@ߨɅiIhO0mH@m#t5F4U29tgϲ4%Hu6`d_^| 5w uJrKYn]!ۉU#9qYiE~V%eȞ16$ϟ‡mH1S~;opgh2ŧ VX|¡Hߞ4ϟD [34dfumS+-\fKs9!6 ҫ84P_/QR_wz4…9{ UĔ{oư4[-JWVy㾃\Ypo^R-]6 (<~$wյU2iV@>DKeE lN|1p"1TC`p/(c;Ss-T8sI4MdYFe&`;U]Uxr t'eIlIٮdd@rMaD,$vlGO~_uLd4\*v(ut_wєFCJ|/LEUA)K0 <MnMi <%N WDR@^'g9 B.r.NQ" uC3ip=h HqdCShWPp}WzUwz ^lo R B"D7jm_zv=T)va"t>oUIҝG܉UZCJv^{Q|I GI⠩1h4A~WBZ-bql:M<\'Cs"AJ=pAkPי*5̕Th\aF )n ɑd#"Fb  Wt9phIpm} ĥi!ĵqx@V,QqYǟ{!}#džɍL'CrȶsO\FL8~(z* 4(*7|#o}[o{[8,o\pN;Omo~Dr4{σ_"2W/\~m1e8+gM6S WXZg, 2y Eǡhq -.w>="cGw~@ęTu,qeni=<|@VJtKl'dƶe]<#$0*(Co$=dFs}_ƃKks=7@shGX[nRZ, z=,BTle;\h2jA0ԥyk#0aUPu Y]j ^{A]dY6LDECQtEFQEl&LuۈBc`/)NUve!3(x<$w;&p?@>Ia Zm⚆ pq}D&bDdܤ)y{RY1&r58t0WG Cf4 =\b PBn"D{Q}>kA.⪄gp<ͮEq 5l$S_FW `n.MKp$pgpՁyJ&愌D9cv]|Bj8tLS X`k2.`J % ~pt2uogPmt*ٻ/N"ŀ-JD7:YZkDRDb߷q|@6;@a4Rg]MQ2tu jg[8F׾~#iv/<̮.*qeƶiejSe/˧ظussMXx]O;vr=i0>ևI?GG8_#W9~*;vR"iY{@r4ƚw즯3?gsm*ÕDN{VW[}&(/Z+?|#wad.z(b5들( !LHXiH)A+U\{$A/7r%:O(] ;>0]җKb--QX^)!"c#EmI^ZcH'a l=(z8f *rD`l.=Nn˥h 'PL Q+#.jrIU AV |1p:5̊khR%; @w<*냦?#I &XB(݊@2oBІ!z.B|+ DI$ו=O#=|U@E%@Nk( lBhXU|: X*z 5 }>h5uxUbAl7^Nړ14Y;hTԄp({m x>v^( |%,T\ 2* BTBOC> 8.HdR2*;6ƈgL16b>.9p@H_wpxx1œɦ-;p$d~|Aqˍ7hqrH&" fgac/>| ]%K8=[zl&Y6yTZ81_?@k1z0N~\}#<Ө oH!:>C͒yqh^>ߡm)\aǾ &|td&ϱ\a nKďxs,Y%ݟ0J. 0#^}B^sWΆ) #%_,D/א5kN@JUIJMO,2uawF˟Oπ)..Uz_yHe|2C"!HQ܈mh x\xkz 7~fCe}Q.uy{G) mWN%Ux \:LcN*.cC|o~?E OcS]n7̵-cInؽ{)jɎvF搕$F{_{xRAd ;Db B?S\m`u4Yy8UW:dmr(/9Bejqs69sQ88BY&I [ ^m{ zȥs.ędS)Iv(eI*Rot-&/LHq$EdvL$MSeR,6F]cGyv 4YQm"\dQf'O<l`6TЗx&aחC),i*FӧN13;*I2ȲK6#uKCqƷ&pCqyFwe hL72vCbȮ!Iq$'UHe I 81]!UYo.ղ?s UTMd>eEVp"L=)Xb>* 2P!c=CԴ,$ZL-]#V0lgozZ %x_HkgΝGLK]{=oqÔ_/9HMG}(~8<4ox 2MdD"G^9ƶMrEɋjs(*LlN1؟؉ ;P(wuO?8̖WI)Eu_V//}y-4M- c[Mi =,2"-@Lnv:o_{nccD$}|}vû_NL1r~ܴDtU_u~ĝoz#Ϝō9~.*~>Hj18dnN/r>eZ5lbL߲Ɯ+O.NטkYL4.Q姧𙿾z[t+'>nrҤZjqؖ]ص7﹇Ρ&09Be[e,I%Σ?R5YFE: 93#˖aa'AS|=gr/ԨDa=+ߩ\7 ,1)Qh,`[c{<=YzNc8lKD[ sIno\5°}p}é:g}XBI)oH Kar6ɤJ dZ <  ":6bLK5LM2I&RNHr aʹ< %./! D0IDQD$ @ BQ z =4mB"eha"i$t1 {ze-0mjK %M1Q" z8A8A٤s3dz׿ُ XI:CiQ NЪX 9<ڨ4iHGXxUt( )r\B(|BUuFE"֊1舢$v;g 5nDbú3)Q 6MkC4 L;NxX$ ˓Q,1′!aYkЙiz8*Tpn &m8ۀ'v1Dq cJ:8~b@H4:.d(d50 3Q"=N-Aψ<Fz(1!f1I2iR@@J}Woa .Q*x#(RZ}TU+cۘ<~-X7`-BM0UHaqq7AJN9" "Z{%C[9O{Yt(Y?W(ܽ뽬2>4O|UYB ,O'Q{oMrO3;7ZC.ehu{UƇqVQOrQsOۑg{w@{ɧ^V5b8D4Mν\#TeitMFSH(jXy7aÖq2z&)O2X+LiZ-+a&u.>u>ȁC ?SsPcׁ+XiO;$gkKt5U{/ӟQd3MҚM"OW\Gw['p< 1yY.CO@-Cri 3r8e q/yk/6WEN lR)wu,$%RUA]''8pFHRm㊭<7~zg0±}3Qjr6oG+1NCU5*$4l2M"Gb/cRIHhJ.$+Ҳ:YOC==xؾGx̭,5ea%QDaH,+!PQead3 C1 WSl\C7 (eR.cZ6Z@/>( C9z%Ⱥ}U/PMvE&W\W\Hy̼8H$kȖivϫ#K*gBT]Ytwu q;W&kG0uXC" #b G^PE7І f$5?v.ŋL~]0` 28buءS1(n!q[nwJ h.KP?c!I3))>NORh$4zAq$KI )F| 1u31 UR? ixG TZAJbY-\fdĉWO]X&3J)gX00un6}ZoAZW[2VC9;<3 R(Bh1VE;Cxmp~֖B&tzh&ӓ,id0*^{闫m=?gaYQQA\b&s!~|}n\faX3yfEKc̟> bWy,O,.é .&ظ@+籟3(nسs._._ _WS1?䙣x0{7\I6K#ߋѩMVβg6:- >OQiBS\}T7¶Ҩs}'~gg7[_z .y%>0}-|K/2#NrUO/7/ek#}Nm6Ӈ4Q‡ock[X~E#8 VHވ.F=t&%72ˇH2:sdzPٶm&oШ7|-Ώ>Y + |E ]'}4!HRkVZNq8z56Φ3a :g2Ù si|T4U%V*kʴ;Mt]\NAL&q::@,@r%Ŷz8;8}ރ,1@X p%n ;Nڢk~X!şFPBNo b u9$qx5)Y0 1ddN*b)H"lvȷ-A jR!?6DYf$X>LSҜffIC`''?D@veΟX$QHܛټ zaæ UC #\7^sbldSFǸ\ew.q8Ӌl23\r~j"-ɨt^NraAo>"&z {wB㏜|ge{6Qmn6ʵt6sָ厫7 E{?z'\'^?Zݔ'iV=of$!:r[*CCE:2>#ޟGI38I[Y66#1"<q\{53vG$yǹ $$!aG?#GeC;96U7\Gs:^|a3-6y=jI7ynf~7oz3oeZ"?K oZh( ahj߳naj5~sN7"S.HJ rqSaj 'P#BJmAn'WOqn }΁+Ulċu| mcϕYeT74wWfEa"#2nصo''sm*3B-jUZt\iZ J%*y)ENH@®m[pm\*nO(hl&"ȧޱgitl6 3W^&NQJ&I&IdFZE54E "GQ<#"HH$|T*"K("r09S/g*pt\?@fw03&,!"AǶ4 8fH|?@V"J3KK z%u^o P!B|5Ǧq^wM0myC,UevrRB7OzU7]"ְޑ4,oΞX0sMedlD` >'yiF5S2>e)ɗXqO죐W8uk %7o{94NrTDTbg?΂Gg֝E{ yzKx4VB+q<=iw\pQ0$dsW9)''^cR.D26Β}zEgs~3++>Oѓiw/q {{+l{N -~NAM>vH\hq [f̡wzЩucyC}o\@CCM2rfXe1t+G °#$SoԸf'*_Cud y\byNPL<]f?[cDz!kdΜAdP5hL08;5 gqJX`x/IIM{0FRHUb@VZNC!f{lFtgOjYk& Z0 >VF䵨uDG *rN'Q7QLl@0lVzzש/7hM"CzTpO?r.TAݶ<:'`|e\8*K矧c]suWŪk IDAT獧&8;yW0<#gC8S\kټ5aDCDBV1)&a5X妛h#Svvu'7s/>a*jz! A9R `+?߇eYF"AcnH,;LS% 5lBF3X|^,6bYQQY]]eaB&ea>Ke$ˤ=Fe0b6,(ʿ5M &|FABQU!r1 I_C3U{XvsS7h7xMd'S8iȲ,dz׿9Y҉h(n( 4$IB>BWzsbWk)t%r0DT`~cuAs8vlWL^vxS>rJj)Jl۴T"g~ɻ?|BI@P@NfR%("#M#dPtSkHh|ÿϑO|Kp%&N}8{nl5P ?IA q)$^y ~3hA?3'.Hf3A}g_[ U@aNNZU<梗dv\6Žk̆Dʍw4֚n\untC")l. V;FD$<7=9P4O[cy~9EɦT:;Gx ȉ<+Wl{}v;U_,M%ٶyZJ )+/J$GIg; 0hm@G!Hiw|.i:+ 5D2LF|2,c6(</@e(BS sH @>"*eJd.v I->|jzJye#0=7OTb<PSho5VPTdD6ҙzej]^GWU!}z ] 4] )~`ĵ="5D =|BG,#KBVM6 CEՈFEݼsP]KID;xDӎ1g][\r") `Eftݨp(4XhqG .Qq MpI]-L Ib&Eȗ%; ۸Q`F b$ cyj|%E8~7%CGe(ȐKCr3P2m(iawp ag _N &*:s.vB(خO2[BWI2 bYE1$#]̒NؼA#U%Ky6˵,YΏi{6HRc +\ rmҥ"6رDlN3Osi^<4Ed8No7q~wlcj9 f*HmClLŔOK1eLf0 0吭znOc_b/X'>3pu~1Nsgj<]w=N0$^#b6+MP#eNԗCl;Jecv-zꦭ|;OrnBP3O6&Z}UDd2-\2CkE(2؎,PURHO6"ITg2̖}M͸VH$bFa2)ˬYZ F4mrq}Cw`?N$B<ۦ6DRe # IRi@0;nû^~dYDy~HnE: 5Z1+ҕ;NݱP k1y@1D G$kv nC`DR(q"+ ԉ 0 gxQF]anNn{wX@B67bV.YF]s1PQ.1"EޒєK!J]!nit|.nk]T EaEpm5 AwE1pѺ)R׾"кZ N-D`yc?n^O CNv!I³<'yGbtE$~hV5v,1ܫj^dȰUBOG1'\?p-dg@.3W]˾'}^}'G+D y倗-Mza <_x'f-?0 l? }TUE 3fȚIta9>I'g gH˂8 zؽiucU#DqȪ磨*zTOeI%O|6,TH%46a"1PTdVCӢi" ClCVT zH:Lu>{E? <YKO`5ɧLJ=T:frIƕ[qر)q?𱟾r`#VoنHs 5Y<*}oz`c)j Ã`qz->wUX5$!$̮5vG2oPCQﴨ_Ggq4ri?&v^8G6gp Un.^?uv`o 8<9a@B}?rH)9vlǩ=BcF",|秦Mw\Eyqd# gpM)t;IYV[E}kbGǫ dȆ]pٞ4…3.0x_scjYT.[5 PmI4TM8V nq[ =% ]1 :ĦAvcCfQ8kوHBVtdUuBA吢Jd2)$<7vոuQ bYgm!vE0׃,Ӈ$l&m\GSL*~RUUXfxiDQ8 \_u^甆$<@$$~ AyMdIGKAh]; [$ P"ϋ~ sIDN$in U ]DjJ 'CH '8܈ Bmź\g+ We0T}itS/q%t!XGMZJl0 ٱo+JcA*KKTOsCV؛fx(jQYiel#NZɥ˒3,Sܛ`D/qm۷?gۍ%4;ٜja.T5jK6S*"\.fLWj|?{bй'0 !!  9`^{5f^{6]0kcc1$$l&3=SSu3Z?ۿ穧:uS&)KDFР٬sTY: )B`Qkԩ9gjy[) ]X(J2=yԹnz2mYz*'!,=t@uУJwo7Voxd*jS45A)ׅ QdN @Vgu~Fl +8 ԉF0 @6dժG-l]LD00K J*4H8֑QuP!bbEB(\tTd.%Wڬdq!$\> L6,y)`/"I؁)p*\[O;5d~nIZԸ"k8b_#iB7TvWKRiT&ee2Z*tT&X)@6m%Ғ,KLJ!S~:,Ű#wѥCAAu Ca]leq< t ρvGul @{VTE0Vb v;09QciMglBJCLO0z4m17/O-w\8||3wݵu[-^:Lǖ^`b=Cװ4tAw|3yn܉ i,]ȉ 4F}x[nڌa;<~><]๓yiy߯ [o!:6dnٽbAqI։)W$.Й>,S'$~n *|S|Gx&:T3n#!4U"5*"=kT9ӤSхnڬڭpf*D1_Cz_*k0~ǽiw<y?%(| {nȑ#\Ao#] *cg}-N=񷣟r@֝tnE6.LP쏨~{x_b|Ho<ȚS7ѻ7Or@erqXg\GHHWŤ]V. |oUo8J$ڜ9wׅEgy6b7n3eL95z)lMґ 5+vd,:N t(=*2FV*fB9Grԝ:SSNq"UN kz95> Ŷ J C CD0 R躎9yi)+,.KDũ{%]yHTj67So$Y䯘W A<>N8e%ԫ%8e4-}iqw" TiUtݔ}4Ԓ}5+FVXٯtiLRa~)@SEQ$/=5ѫ(igoe>ĤUa ECF`MfubOК<^.a2XfR}Fob'˹I?=3\i-_9ȡxobulqk|oS}]`i{̅?Hf>Fî[\8:C&ce vB-saj98G_`_&ش{]9v 8uʕ!ŀ Kyaٹ9=I3OV&Oԉn6WӒ;8J-hxVHy;^GFDB2xlv ?5mk^ c,RVYXR6l]p>tYtGYAb},5jdYLSqqGcNe>J)N;COo/NVv4? !J!4*"F7uΜ;qrҠR(%(˸Po?aѫ3du~"&N@ ܎Gt@AzHt%hu0 D.ȣ[ ! C@"eMla&:h D ϫd1F$7N?17B/%0Ĵ--xl4X̤"mDuRV!%e28 J؇DpCJM*1בI!+8ee0ii׹n%n[m4WOM]u$eH]D)HAH$cH,i |Ujl"h0=#0}QQwQ֒r Ka\@#cؘ]e:Mj\Xfjf[GuVØ:^CNV.-w7 s c m(&D|)ڝףI8_}n߈:tNxhMCaiN'룜M_G6nFV=Clߵj~h׿}{7vxٶuǖ8qt)OkFXDmMH*U;~U"gbb3`ff|3cq&Y\Ӫ5z)T J*\r og$/<"?}<7irite|c~j#UL}:薤YĭO)&NСrL̺GCd_lV| (mv9>zB<)Qm? (3AaFؚ膁Ř$2~rl(Mt$ d1-E1'N\LdĜ3:1i[ LH>J'V>l!VsqX B$)C(fy0^LS.=UxRQwOĽ;7`u+̛qj-v߰}|/|YnSy7mw&Ps%aU7V9v/ޓu/_ҟq> k-6p1~W3isyKg?úa^ X\ĪTYssH@+<̓_#VH}ADBhu9JhQ)̼rS҇/WYdfq:xO/r5ǴaXC:e֯]G1_@%nB%֍ #')X6]>Cr<ʋm uF!5u\V*Yj5d5֮DE!Z=atӢqoEf\TD牢z|>KOQ5 #w a5G`jrL)G9c("R09;2Y+eOް9~ *XUduVkePRvz@贛D~ L-Nz=v*БzBYЫa1C#P~WhԲH=-TMx:a&D83!Ssf.HL,TR>7қ\47 Ec ɄYoC%ZjdR_e&HRV BI[յ5E +Ņ"]'̌P #0ɶue (ZA^W 5`. 08 |[7M{= f&T$<4ą˲2q˧L-/p8Ss6&9nRdK<~)>ws  &׮yN-18J:Xm*y[ κgfzjq8ĉS4vr};q-.Nx9zlG}D|VļKnw8wagOR4\֭5fl]g]X;Y$/;!c$‹c\7^s^cn~;o:\AJf&2C!%՞ |i`,&b/2V~80HDI3* PB:%@JiM,*HEG`ndM(?f@?O$zGWWZ~_bkv!ߋI{>5+{lJ ]Tz2{ICvv5o*z d3\ܻ;Xgq޳h͟D !c؜~Mlھ7}}1K8N=f(L81P&"!S b|Dq,Cı"}vWϒujgB{=ŽۆٽgϾmkOMq s-B[Ǵ=hz4AzRbUލ=5{?vsqj; l!rBi;1R?uJ),H$M&?JE-xB\QL]'&j覉%uu]u};]} s |޸~| ݬ^{fΌC4@UJ<\Fk;-WQk9rzjt3D31JŜ8;|[8cG^`.3_e˵kiT0&mvm+a']T\XXobHkﺆvVP_qZ*n3pc4bllp sg.q.[™c&CU.]3,W^|ucˏ<=<ŰlgAΜ9 ryZ:Ĵ-t _,ry](t0M2m)RnC&ǒast]P(n0y4 @]|xR?$ R8tɮG1L|CŒz5kFpt;3qGՄF4 GiS((K;r0MM}u6ruVgMאߩnAqi ʧ]BBz5eKDK%WXuUхYiI#RC DQ 85B"2Hh.LNNS++LN2L kr߲Jz2V4Sai"ZA<H l(F^jWtJK MJ=$+)\"V_J&S_ b 1l(\hQ]$`4(ِ%]`^\r0t5ҊH-bv<㓉cڭ6% e3۲$Vz!S֟X1Cnymd>6a ULx)wgeAkD)Eeʂ1 CBWnRJt@8FEEW+@'"4LfRqU|MCq̹CLqʼq|3s;>ӂ6mM9q$7qF ӊafqͱy[/!dq4l!ly6 =]k;lGm5h ZF1wӗ9ySfo86Tѳ.hzH)A<$f\Zem۹ ;ɴM">/80 nBYAГ/sy{)U?<65LEA0Di84N1ThE>Y Fh;hkuvKΒ0FR%Kfan2:q0亞ĵ eoZe9VE 1'NFPjع v֢: 3 s'>ä+`T RgZ{Z&&&h:fDQD.4 WWl @Vgu~.|tbQBEH$xC" C#E.mLK%FoKt4!h*@Q[J(@0d+C -D0  QHKwLH\D6!Ԉ&r7D6[WdVbNVRvb[DlJ”rzW+"P0b._1[fZh"a]B>LSԃb G,Jfv^ ( 7ЭDPCOO"K ^=:zg=!r4c:dJa̼Cb;e)jmR(MǥXctt ìzycni\|Aa~~SH B:ʁ%`CZ (VWu4M DJyy\VH_^XJ) =RMxZh.xb/>NŰpPon-x+/gjQ*.$rNOxOqU:="#{x+|e3o }]=h"Vxx,_!y'y_E, K2z/G.ܱۙ! IDATϷ(*ȝHeo "c_?G}=- od9~xh7F1^WacLNQg 8Tȑ<= E<\B]jJym&'Xhֹ41٩q&kKxi1LJO/r/eZqs M$1-%r}4!5@kYLT 4E@!_ӿ(LW6a.c333ؖitZ ULLWJS*d,#n@th6[ȪK!bBf Фʀ*YuTd]U*!Ar  $!*֐"´*lb %`2:!* QRJe""L;@O$]@JLh~$zrކ Z iQ`j:d:vR0 Sljͤ]\KɊ4* ݾ"T+HALqb\$0+m"e XipOr/Ҧt!tRi.%U&8Sc' $c%ԒtS&P5a?KUI;7#wѵ&2>ˀl^'&8m-/Әs l&Zhyinmʉ0oV#78Lʖh`]%6uϧP21Mf`!1 бkKd5竄9֒0LJ[eFE(^c(l*O^z\i"/ZiE @kH.(P"5)2֠[&BXZ8Ixdmf&o_=M.l r=0zz |O>LA+[wroG1?fG]7ا`d5\c5e2)oX$~~١.nI0fP~K_'cy}ݽj "ߣtØUhJmZ4n~ݭlUe]9LKw=!:,D>RƄO 7t#otMDaB1- '.,tb+Qg=H L 云ȓB7y 2Cr^X_rv+ݮts+Ұ(add)Z$\6n$ sw>1ge"S9XEd|tRJz`l"bj0= .֮Uxt 2lBʪi(3-g53h SsTryZ #% &jK ɣqKG4IoAᓋZ-K,-6Xv\|3R-9"9usV=4G'\f'0u;ljt[՘gF=EI vVg3Mr,s:EYk7{~n'ylyپټ#zL`YLӼBhFF*{IqL qH%@%IdT崢82|ٽ1Yaqr̐W:bY%zzTE qkL=h.; s>xwA%y9P:K9}2d?T t2t 4Xl,pav0%7s5Rs:{qn4}yܻ;Cg-wp罻ZMt=qL \..^ɏ]u;8g|Eckx0vz=[]8?\-QJtZDq@P,p;Q!k 1<0H>[`y~022BRA4lfiia{yr,J/,,,lt]4MKKDQ8A$qdnYN~8SMAZmyff1 3aS J2t:ju]) K%L$ɓQ6۶ll1R8q]N0t:_ @Vgu~ܑ.ř q"|Ρk6]$a$ zrJIf}d y cbe%It"@]$:a?B:q䣄'%Ta^0Yr:A,9pbH;TDb ԨI=DWBM8?eUT,Wz@TZljwu{k/zz[bi)TegdI^d?NC5,3Yz6XXB m#,MAj4@JE}N``8x-aHԘ]\%CULƦt NđT% XDDpuO<(EG_47{odu}r޻gHpӤJ%%bEU1RʲTp9󇕤JJJ*QrG,[H-QDQD }>mw?z@ US5=޼|wC=Gco/MZ<[е[ׯأ&ihy/oK36? {ҷ_/tQ[X޹Ƙ.߼._y2+|w& Rb#ޏÒeQS_~Ruq._/+_ /Ё"+זX KgWiꄰ"Mi޾>˧yh[LGchZrdC>M9 8 YZ\Wc~c~~,Y_]( )eYnϫ';װX31vu"APqۛ;癦GCNE~,ϱ8P6(7_噧^ouS34,$.QO3'n'󁘷gnEyM ]\updHEZ J0XB)Su5#GSh L%"U #&"8cQ5<؈r5b ^xs2W{9>Z{/pwy;W٘,.vWؼg1nS|Og_ywykQU?0 XZZK{$2t/BlF_̜DNJk9&k..̕kqCY_wiek[oփ0/cLjq?z%#s'<9>|*o~ð $_oqq?cqĔ{hoLu=!o*#-oKoso?G?ܤ]4y[\"7_h:dWtt?WA30 d4+KtD^4ℬ$ E3^8XXXWEhD:.j$rR{K͝\lp~O~c)5UUHZuM3! TGQ: j5(e!NaT66;ۜ_`ıgQT aPPE]dEOU:-$61JVd(j:V(U!E U H`2`e3D 2Q[l"d)K*E&F Fg RK> Y/ _Ko7\%^/23q`6BǨyw{F ,y츙*=9.([Fа|ʖsTf O?_ >rOqUH~\68KܚKt~<^؝؃Tk#Q&L[L;@6tAD ^DiGZ9@ )Ev_ȈF3$SZ7@)iR. hG4.)Aw7}7XSV i',5b&vȵ3zԩxjJ<^+3~?ou0`o"޹7ܦ /gx"k4ث|Sܷzg R32N Ɛ~`aahဃa)7K]&k75t:I{VRO%t; LǾ8/1z&%JBf/r0fHl7x7KkLgo8:;Gv=>O|}G9nӺ}_.5buy ;J~{#fKGdX]"eH0KVrCI=yد ұ|#EYۿrF,P@(A_g:x>Ρ};E$/lE6Tɝ}>5McߘW_J-jVQ~W^KU9,،MkKKi:\XXXX򭛬v:渾$s&V x!wpjIQat7h1R]Pi&4 om|M_jc_| BXn{(%Iz~8nn1Z*5Zsm VF"K$4?ٟ's2P+.,k`ks(i!Da]N0U2@0袄!S"9X)6¨4XD!j6caR uiQP ɜﮘ+bxei哱ô 9k73fC̒·٢3Ԭ~X3{u{M='B!+S4,9+}Lrv2 uKr |y;~ N]H6(n\5tL][XUA2Φ{ bANhcis9 Yb`mN4!aȊHQ #E^L"k\Pr]A;orus4ph2`p_׮nPDVT[ORsoRg-:z2F`LUԄ&!4[8fxsĝ;%n%omw6uJss [o3Jbrwzb+\g`kFh4H Q8L0$pL=+Ώqw=U Rag 캮_{_#$-^6Aj`gslnRqu08O /^{\pg'½ގo$+"8X&ÔKB`mT4YTX磒GcE),c*ZIos7 A6B00_yŅRXej4 A$4&+Q(ٿ0< ~!O~kDQ3k-bLʒ~? HP5eY/>z1KmF[#g0W_~фKqt2u,7oSYdcZ(%I)iN"2( ˦"KZE5桬qGw NDkI,--NUs4EZK^i>E8$Ϙ볷Km,Q'!K2e<ML7]j5Ff2B0 '[ 2>bקct"U9NF'U^#@MfhNBjqZNFPT |L7FSNqF!U]R3t"S,ΏM+RPL B #JD;^hBB tA6c5<Ǵi>8f`ELU{<0OueqL1hNq41 /22 _h*CVnmmDa{\%}_6lp gz`hǐ/-S< 3CZd}3cЇa\w]~+9P(* : Mɹ=9FJ'-QbkKc+)aa [Rڂx;|~w`C6lء(S6OO~f6f8خd̓% L-:Wp5vnQԥ+Fi;rg5z{/#C-r^} j1>db2yYE.S/F=w~qΛyj @G G{tpQnx|Ѝ(1[K@" %)ʑGSdrf fo|D\:sg?'<3_ ڨN¯毲<=| Ƥ^B(B3i*Ah={0Bc+r>+R1~XԬ% br[㜡 ӂP cIjdGB!YIaKlqh6L#TCOf:)=v_~(Ғ˴ ᄒK:`ZL1֒^\svKćHM~+OR GR']Z*^p8例dwnsz}=G>M!hF1{{4Z=&F'Bjh4 V7oG͹ IDAT:2N3ZqaU3&#~^=C=n]*H(b4#,K&l%N]Z$-k:&)^7rK;IH& Q$ 9Y6,FU8.kZd>8 [p2?=%S#Bsc&8cx0ί 4@'(D&SCYijQc+#YӲXZ백5RW%.v0.:5d@?AeOW~1ސ]*!f oPh}C̀qy0 m1zT3@l}k^!<` JĬ۝ɺ6w 0p0y>P1XFy=2ާhͷ_)>>I;Õ MFL1.8zk˯ld5flQ#6QҀH b17A$~RLPXEC#߽cqe _++?+hε^JԲytm CJ,Mu`B͂,Zb;UɵoDJ6o좂7أJPM§Nr83K⮡gdžjB=N!qa+H'!;9#!_&!z4( ̙E^SX +}_$n7ՌNR3}R8/>uh˰P8Ck>gR#T @UM4Ŀ!zANAdHX1g(!)f6'~9CЬ]OM>)LM\y6 h <`+}oܸzx_Ŋdߤѝ{b%g}HƉ1%rJʼnEt!JX5@7Z 93aHlXa@VD"R9y# ,B)T вJD!ɦ%"P$A0[b-QS4) Y!&$ Pul 7c=5_Kjl.frYT0ɶ93Y쮖CRfjWOL볾=;`>[{461kaW GG;ox _VA=HʅUݐ Tt3Nt / „Qܐڌ-J+PBYz:5b]#UŤ T*0BDPa OjHZ5n._W_zmPf62 D<7{|S{8͝-nXn5A29m4bԌGz=W渳. L]ш\`LIL&f@8ߧi3LjGg'79 's2+\ 2h.fmFb$*Yvs8XaѢ13ra" Zh>ʯk Pa@nDf_m6p7)735ڷ[c a_Qbb}Dw(1 ; 7zBŁx {=E{"o`w{qA.< bH-gqڳ,*dg>_^ڇ/<~aW ?akӊ*l _^`eE]M9ѴhQDMY^Z@%vB+piƫo0ԕGajDAH5*JZSяLMT!J P6F2.sʠf\ȵw/ k`VB"(TDRR/)`.f}i P𾄴pp>sbS^{*ý] `q15/\@1>'L)9KΝk<ǹ̘mZ A]r6wcC~wɯAsݿW`^1"c 7sH))'A2 ,DjDh"h5y"GȤZ3BAQd(-wc|"XmXceaͳ$;{("Zau~%(v1U`Ҝ Ryr?̜y'?q5'8Z)j!ѲQ)ja˯T6}RغK,).t `yMWdJ1:hWcFdQD"ficW|L†!VPR:\w moR_tBSx!=D>Y*~k*AIAA҄MDX| WxrNIRW d47ɧ5: YY^[~{zsG/0<NjKi4BPP6C4^2gWc8$/p4"Ǜ/އOj}$E)En _̅\|n'nD2̙Y8Cj40EIYY*jYjH GӊaI#Fb:4ͩ@Dq%E ¹9s9^}FC.=ƅ_=g~ǹ)Jc bؿǷl_?$3<1~BG%t:!:Ԭ_dRސ|QS$Ƭ:qHi$Z8N/P!/k- d@8J);Uu,-!dc`@ qk-w$Qn7iv{(-'=ע4"N":{/6i#vnlbdM<7nWILRΟbpkJC;Yݗ6C:s-~Qp#,4%. Wc!1}VX%NĝMKfI%Edḓ) %DȻ/DZƏ|G$vtƔ͊Jbkg-q=a\v9>CH"b:ħ4g::˒#S1Lclm{q Gq)FtJS)W+(˚ EO2SOħϰ_2Vj[e/5BV pi7X(byy0gn4A lLUZ `SgF$QxD3iOU*K햏x=Tu):c P*9*o-\a2 'YȻN7E8sU8[Hn(G ֐oe,]"F(曬= *.. % ֭[H3>HӔ6pB=, ڌr$ %4)nspuI7)ʌ6;{J[syRqO>ib]M]VL#ƓN~.v4よV!9\8Ð,!YZZ`S@wyaw'f[jae:JCʲ$M})1P '`yxBY:`:M_@kgϞpZ )3։f29`I+nnſ1f\ !h " [X3EZ(1fâdI"2#HڔAK΢)JWVR|ھla͈Orz-ꝂԞR8Hr:$GjE M^9a!2e}i{& m$pY=c/BfR. S/ [z`ʃ/Jgf0-+@6|)b Qpy فYH(= 3C)I(>#߂KŠt *33~*&LZԓ!HPtWGS݂hD0-QBkEvõMYE5AiqMo|~QY!YEYY,l|GZH㘺X={lO^&ԎA+BxmuccmF4ewijLis f\hHҲ!4*E1' R$*PH520F*+=TWc gL)L,Aعs -r"P5Z ͕cF:t]e> J?6*Y=}OF1wI$v,Ke1 Gz9ʬFJEd'2(ʚx:'3"Lڋ{N0 D]987vN&HϺ\uKKqZK6hd,Q:(WŘE:FdžV$.I]|5ӗz:>Di/“GHrt?ⵛ/tۤqrFg(iSKP9,)Y)[یdqLX:T&^zw_?d`uo_3oRi՚D;oxӌ^> RpαZ(59Գ=sqJӠ^)Iӄ}^1UM+d Ѓ HQÚX[5ZE ƀ^9T"$HiL\ -kAEEӛ!AE$:6X7AeQ /?5`;БPK|[RWXAi*ag0Z8TS9OaMS&.Wז(Ҽ[֘EsJ2p [5;f~Hh4+ Q٦*I`>HEfU֮=>\{ZLLʹ$/p2~rȃ(-OٜHs!b-ܭz$.Li]Xv?xנ7A]z{E:x5G5G9J4:AF<Ϣ?z^ K U0H"FmQU$;ԟR-qu&Od$*ߡiZ F?E:?3} {d6W~WЖ;%8=6drrh>o<0{c-Lemp-8cG3DB* L1 b,"^K(9VX]B(LY&r54nJdBan#HQBqX9#Iq&5;k8s?{XRDžKG\M?+V_:6xʑhm*B AD'fiZ\'tҜpᣏ=KlBP׆4M&Ӕ^6%^1-IBGB;EXoHRMEtF=i^{u~~ ̍5JHq`(JpB"ƪ)[h%7*kk*l os E1IT7D,d"tUF+dzYRp%r` $ST R 9'E^7 q Tծ"(+j[ipi.<$f1!u+M!ơ-)Y֔fp Nf1̒m~v3,=R0K^mkKDNszoEָY UGoK\IyXeUuyJZ#?yWO,IkG)k"Ypt>m:. RQO :єutRS^&N#%65Tx$3v˒rAO0̗g,NWqvFڀ< Ǐҷ=w_-T<7d6h jV7mszwۯ}n.y.?wY$\;lVje\u!Ú9qPJn)"-%mVMBgj1H }2WJ8қf🔔ڔW)pMhJuXLoH(d =MoILrPVw3E@^MqUNڋpސ,լh)_`*0d;@Qc+!VՆ0M/G`te\cOל5"h'5g'9%xsKb y^e+װY"'jZH{=l5C j>i8]cxqpz+? S_ m57/&Zd2y4MOe\^fR^|)3B3]̸z*wܣ.+>&d]F$wc H|X B&#!tIt= {͔ڠnN94ݢ\+p ݦCf *p}6Tu Dڤ*ɨݟ{3<"nE$YL\rz$/i! SɺELFX!|yB囱HHҲ^^"枵-i pҎ'J/=nһZ+*g:.+HU, [G'gY"j='֊TiW+i嚲StlqnkAD6a'hv9fgo`[mkxeTtex7.#՜o2jI_`ϯJ+`jbʑ_˘hH|ӻ(dNV<>p~""/[);[5&7excXb"*oP2 M+UD\Q?)~t͟c>[#W&.JUY LV\ EAhfdTUEo3 Y ZI֜TEt~Y~0#9/^drzNmInl/p4?X0ʺ,mBej~YxلA'cwx+nR9G+N]zn',NW|W/࿼׮]ÚDuOH`LJV80#M$X.𐃝m8B*L/~~/9|[O'8WbȦ\OkLmY,XSt_ã&os_~#I6C MhÇO(ZN'\#bJch>ںc?C|_W[ W,L׿.BAo|" oO~;  ON؀AAA6 AAA HAA$~½AApAAA؀AAA6 AAAaAAA؀AAA HAA6 Bp   B AAAI)$  ? HEo6({VAASwH)QJ&c4%2,d*IENDB`PhotoCollage-1.4.8/setup.cfg000066400000000000000000000001131465467221700157360ustar00rootroot00000000000000[flake8] import-order-style = pep8 application-import-names = photocollage PhotoCollage-1.4.8/setup.py000066400000000000000000000115121465467221700156340ustar00rootroot00000000000000#!/usr/bin/env python # Copyright (C) 2013 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from setuptools import distutils import setuptools.command.build try: import setuptools.modified as dep_util except ModuleNotFoundError: from distutils import dep_util from photocollage import APP_NAME, APP_VERSION class build_i18n(distutils.core.Command): def initialize_options(self): pass def finalize_options(self): pass def run(self): if not distutils.spawn.find_executable("msgfmt"): raise Exception("GNU gettext msgfmt utility not found! " "It is needed to compile po files.") for file in os.listdir("po"): if not file.endswith(".po"): continue lang = file[:-3] po = os.path.join("po", file) dir = os.path.join("build", "mo", lang, "LC_MESSAGES") self.mkpath(dir) mo = os.path.join(dir, "%s.mo" % self.distribution.metadata.name) if dep_util.newer(po, mo): distutils.log.info("Compile: {} -> {}".format(po, mo)) self.spawn(["msgfmt", "-o", mo, po]) targetpath = os.path.join("share", "locale", lang, "LC_MESSAGES") self.distribution.data_files.append((targetpath, (mo,))) setuptools.command.build.build.sub_commands.append(("build_i18n", None)) long_description = ( "PhotoCollage allows you to create photo collage posters. It assembles " "the input photographs it is given to generate a big poster. Photos are " "automatically arranged to fill the whole poster, then you can change the " "final layout, dimensions, border or swap photos in the generated grid. " "Eventually the final poster image can be saved in any size.") distutils.core.setup( name=APP_NAME, version=APP_VERSION, author="Adrien Vergé", author_email="adrienverge@gmail.com", url="https://github.com/adrienverge/PhotoCollage", description="Graphical tool to make photo collage posters", long_description=long_description, license="GPLv2+", platforms=["linux"], classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: X11 Applications :: GTK", "Intended Audience :: End Users/Desktop", "License :: OSI Approved" " :: GNU General Public License v2 or later (GPLv2+)", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: Multimedia :: Graphics", ], packages=["photocollage"], scripts=["bin/photocollage"], data_files=[ ("share/applications", ["data/photocollage.desktop"]), ("share/appdata", ["data/photocollage.appdata.xml"]), ("share/icons/hicolor/scalable/apps", ["data/icons/hicolor/scalable/apps/photocollage.svg"]), ("share/icons/hicolor/16x16/apps", ["data/icons/hicolor/16x16/apps/photocollage.png"]), ("share/icons/hicolor/22x22/apps", ["data/icons/hicolor/22x22/apps/photocollage.png"]), ("share/icons/hicolor/24x24/apps", ["data/icons/hicolor/24x24/apps/photocollage.png"]), ("share/icons/hicolor/32x32/apps", ["data/icons/hicolor/32x32/apps/photocollage.png"]), ("share/icons/hicolor/48x48/apps", ["data/icons/hicolor/48x48/apps/photocollage.png"]), ("share/icons/hicolor/64x64/apps", ["data/icons/hicolor/64x64/apps/photocollage.png"]), ("share/icons/hicolor/128x128/apps", ["data/icons/hicolor/128x128/apps/photocollage.png"]), ("share/icons/hicolor/256x256/apps", ["data/icons/hicolor/256x256/apps/photocollage.png"]), ], cmdclass={ "build_i18n": build_i18n, }, requires=[ "Pillow", "pycairo", # Also requires PyGI (the Python GObject Introspection bindings), which # is not packaged on pypi. ], ) PhotoCollage-1.4.8/tests/000077500000000000000000000000001465467221700152645ustar00rootroot00000000000000PhotoCollage-1.4.8/tests/test_collage.py000066400000000000000000000171511465467221700203100ustar00rootroot00000000000000# Copyright (C) 2014 Adrien Vergé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import unittest from unittest.mock import Mock, patch from photocollage.collage import Page, Photo class TestCollage(unittest.TestCase): def setUp(self): self.p1 = Mock() self.p2 = Mock() def force_cell_position(self, pos): """Disable random in placing cells""" self.p1.stop() self.p1 = patch("random.choice", new=Mock(side_effect=lambda x: x[pos])) self.p1.start() def prevent_cell_extension(self): self.p2.stop() self.p2 = patch("random.random", new=Mock(side_effect=lambda: 0.0)) self.p2.start() def force_cell_extension(self): self.p2.stop() self.p2 = patch("random.random", new=Mock(side_effect=lambda: 1.0)) self.p2.start() def test_next_free_col(self): self.force_cell_position(0) self.prevent_cell_extension() page = Page(100, 0.6, 4) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) wanted = "[25 25] [25 25] " self.assertEqual(repr(page), wanted) page = Page(40, 0.6, 4) page.add_cell(Photo("img", 10, 20)) page.add_cell(Photo("img", 10, 15)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 22)) wanted = ("[10 20] [10 15] [10 10] [10 10]\n" " [10 22] [10 10] [10 10]") self.assertEqual(repr(page), wanted) page = Page(50, 0.6, 5) self.force_cell_extension() page.add_cell(Photo("img", 10, 15)) page.add_cell(Photo("img", 10, 10)) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 50)) wanted = ("[20 30-- ------] [20 20-- ------] [10 10]\n" " [10 50]") self.assertEqual(repr(page), wanted) def test_remove_empty_cols(self): page = Page(1, 0.6, 100) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.remove_empty_cols() self.assertEqual(len(page.cols), 5) def test_bottom_hole_A1(self): """ ---------------------- | | | | | |-------------| |------| | | |-------------- | | | --------------- """ page = Page(30, 0.6, 3) self.force_cell_position(0) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 15)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) self.force_cell_extension() page.add_cell(Photo("img", 10, 5)) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 15)) page.add_cell(Photo("img", 10, 10)) wanted = ("[10 15] [10 10] [10 10]\n" "[10 15] [20 10-- ------]\n" " [10 10] ") self.assertEqual(repr(page), wanted) page.remove_bottom_holes() wanted = ("[10 15] [10 10] [10 10]\n" "[10 15] [20 10-- ------]\n" " [20 10-- ------]") self.assertEqual(repr(page), wanted) def test_bottom_hole_A2(self): """ ---------------------- | | | | | |-------------| |------| | | |-------------- | | | | -------- -------- """ page = Page(30, 0.6, 3) self.force_cell_position(0) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 15)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) self.force_cell_extension() page.add_cell(Photo("img", 10, 5)) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 15)) self.force_cell_position(1) page.add_cell(Photo("img", 10, 10)) wanted = ("[10 15] [10 10] [10 10]\n" "[10 15] [20 10-- ------]\n" " [10 10]") self.assertEqual(repr(page), wanted) page.remove_bottom_holes() wanted = ("[10 15] [10 10] [10 10]\n" "[10 15] [20 10-- ------]\n" " [20 10-- ------]") self.assertEqual(repr(page), wanted) def test_bottom_hole_B2(self): """ ---------------------- | | | | |-------------|------| | | | ---------------------| | | --------------- """ page = Page(30, 0.6, 3) self.force_cell_position(0) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) self.force_cell_extension() page.add_cell(Photo("img", 10, 5)) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 10)) self.force_cell_position(2) self.force_cell_extension() page.add_cell(Photo("img", 10, 5)) wanted = ("[10 10] [10 10] [10 10]\n" "[20 10-- ------] [10 10]\n" " [20 10-- ------]") self.assertEqual(repr(page), wanted) page.remove_bottom_holes() wanted = ("[10 10] [10 10] [10 10]\n" "[20 10-- ------] [10 10]\n" "[20 10-- ------] ") self.assertEqual(repr(page), wanted) def test_bottom_hole_B1(self): """ ---------------------- | | | | |------|-------------| | | | |--------------------- | | --------------- """ page = Page(30, 0.6, 3) self.force_cell_position(0) self.prevent_cell_extension() page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) page.add_cell(Photo("img", 10, 10)) self.force_cell_extension() page.add_cell(Photo("img", 10, 5)) page.add_cell(Photo("img", 10, 5)) wanted = ("[10 10] [10 10] [10 10]\n" "[10 10] [20 10-- ------]\n" "[20 10-- ------] ") self.assertEqual(repr(page), wanted) page.remove_bottom_holes() wanted = ("[10 10] [10 10] [10 10]\n" "[10 10] [20 10-- ------]\n" " [20 10-- ------]") self.assertEqual(repr(page), wanted) if __name__ == '__main__': unittest.main()