From: Hugo Villeneuve Date: Fri, 26 Nov 2004 05:24:41 +0000 (+0000) Subject: Cleanup of autoconf files X-Git-Tag: v0.3.2~15 X-Git-Url: http://gitweb.hugovil.com/?a=commitdiff_plain;ds=sidebyside;h=eaca75aa6c133cc6ff3d707f7ae8dbfbe51a6d2a;p=dockapps%2Fwmnotify.git Cleanup of autoconf files Removed autogenerated files from config subdirectory Removed src/Makefile.in from repository, and added this file to MAINTAINERCLEAN variable Removed stamp-h1 from repository Removed wmnotify.xpm from EXTRA_DIST in src/Makefile.am --- eaca75aa6c133cc6ff3d707f7ae8dbfbe51a6d2a diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..4295f32 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Author: Hugo Villeneuve (hugo@hugovil.com) diff --git a/BUGS b/BUGS new file mode 100644 index 0000000..7eda24f --- /dev/null +++ b/BUGS @@ -0,0 +1,6 @@ +BUGS +==== + +o There is a problem with the esddsp daemon. After a few seconds, the sound stops +and an error message is reported. This does not happen if wmnotify is launched +directly. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..f52ccd3 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,93 @@ +2005-06-22 Hugo Villeneuve + * Removed autogenerated files from subversion repository. + +2004-02-24 Hugo Villeneuve + * Added error checking for IMAP4 responses. + * Changed default check delay to 5 minutes. + * Added command line option to display debug messages (-d) + +2004-02-01 Hugo Villeneuve + * Put common code for POP3 and IMAP4 into "network.c". + * Added SSL support via configuration file option and autoconf. + * SSL is now transparent for POP3 and IMAP4. + * Cleaned-up error messages. + +2004-01-18 Hugo Villeneuve + * Changed 'AF_INET' to 'PF_INET' in socket function call (pops.c). + * Added IMAP4 basic support over SSL. + * Added 'network.c' file, which contains common routines for POP3 and IMAP4 + protocols. + +2004-01-17 Hugo Villeneuve + * Added project to subversion repository. + * Added 'doc' subdirectory and updated autoconf files accordingly. + * Added the 'bootstrap' script to the distribution tarball to be + able to regenerate the autoconf output files. + * Added section in README to explain how to use eSound (ESD) when multiple + applications try to use the sound card at the same time. + * Added the Adobe Illustrator source image to the dist-tarball. + +2003-04-04 Hugo Villeneuve + + * Fixed a bug which caused compilation errors when 'libsndfile' was not present. + The problem was caused by 'configure.in' defining the macro 'HAVE_SNDFILE' + to '0' instead of putting it into comments when 'libsndfile' was not detected. + Since '#if defined(HAVE_SNDFILE)' was used in 'sound.c', this always evaluated to + 'TRUE'. + +2003-04-01 Hugo Villeneuve + + * Added a new rule to src/Makefile.am in order to enhance the readability of the + output generated by Make when compiling (removed the display of source, depfile, + depmod, etc). + +2003-03-25 Hugo Villeneuve + + * Fixed a bug with prevented the new mail animation to run when the + following sequence was encountered: + -The user double-clicked to start the external mail client + -A new E-mail is received shortly after that + -The user exit the external mail client + -The user manually check for new E-mail + -The audio notification sound is played, but no animation image is + displayed. + +2003-03-24 Hugo Villeneuve + + * Fixed a bug with the audible notification which was always enabled, + even when this feature was disabled in the configuration file. + * Added support for audio notification using the following sound file + formats: + AU (*.au) + WAV (*.wav) + The OSS and ALSA architectures are supported. + +2003-03-10 Hugo Villeneuve + + * Added xmalloc function for locally handling errors. + * Renamed src/wmgeneral.x to src/dockapp.x + * Removed src/misc.c + * Added src/common.h + * Added src/options.x + * Added src/configfile.x + * Moved src/config.h to ./config.h + * Added some comments for splint code checker + * Changed background color from yellow to grey (transparent) + * Removed the thread for animating the mailbox (moved to TimerThread) + * Removed the thread to detect double-click events in xevents.c (this is + now han dled in ProcessXlibEvents() function) + * Corrected some warnings found by splint. + +2003-02-06 Hugo Villeneuve + + * Added option '--enable-debug' to the configure script for having + verbose debugging messages on the console. + * Added M4 macros source files to the distribution tarball. + * Added the name of the program 'wmnotify: ' before debug messages. + * Now handling '-ERR' response from POP3 server. + * Change the case of the POP3 command 'quit' to 'QUIT'. + * Added error handling macro 'WMNOTIFY_ERR( message )'. + +2003-02-05 Hugo Villeneuve + + * Added some comments to 'wmgeneral.c' and removed unused functions. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..a4b3414 --- /dev/null +++ b/INSTALL @@ -0,0 +1,229 @@ +Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..5c0c165 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,24 @@ +## Makefile.am -- Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = gnu + +SUBDIRS = src doc + +## we want these in the dist tarball +EXTRA_DIST = autogen.sh \ + $(ac_aux_dir)/acx_pthread.m4 \ + $(ac_aux_dir)/hv-debug.m4 \ + sound-samples \ + pixmaps + +ACLOCAL = aclocal -I $(ac_aux_dir) + +CLEANFILES = *~ + +DISTCLEANFILES = .deps/*.P + +MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure config-h.in \ + stamp-h.in $(ac_aux_dir)/depcomp \ + $(ac_aux_dir)/install-sh $(ac_aux_dir)/missing \ + $(ac_aux_dir)/mkinstalldirs $(ac_aux_dir)/config.guess \ + $(ac_aux_dir)/config.sub $(ac_aux_dir)/ltmain.sh diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..cc589c0 --- /dev/null +++ b/NEWS @@ -0,0 +1,21 @@ + +2005-06-22: wmnotify-0.3.1 has been released. + This is a bug fix regarding IMAP4 server responses + spanning multiple packets. + See the file 'ChangeLog' for further details. + +2004-02-26: wmnotify-0.3.0 has been released. + Added support for IMAP4 servers, and SSL encryption. + See the file 'ChangeLog' for further details. + +2003-04-04: wmnotify-0.2.2 has been released. + This is a bug fix regarding 'libsndfile' + See the file 'ChangeLog' for further details. + +2003-03-26: wmnotify-0.2.1 has been released. + See the file 'ChangeLog' to see what has changed since last version. + +2003-03-10: wmnotify-0.2 has been released. + See the file 'ChangeLog' to see what has changed since last version. + +2003-02-01: wmnotify-0.1 has been released. diff --git a/README b/README new file mode 100644 index 0000000..eca05be --- /dev/null +++ b/README @@ -0,0 +1,35 @@ + Wmnotify + +Dockable email notification program for single POP3 or IMAP4 account. +Wmnotify now supports SSL. + +If you want to have support for audio notification using WAV or AU sound files, +you must install the 'libsndfile' library: + http://www.zip.com.au/~erikd/libsndfile/ + +Program launch: + If you want wmnotify to produce sounds even when another program is using + the sound card (MP3 player for example), you must use the eSound (ESD) + library. This library act as a sound mixer daemon for enabling multiple + audio applications to have access to the sound card simultaneously. + Hopefully, wmnotify doesn't need to be recompiled to use this feature. + Simply launch wmnotify like this: + esddsp wmnotify + Your other audio applications must be configured for using eSound for this + to work however. For example, with the XMMS MP3 player (version 1.2.7), you + must specify this output plugin: + eSound Output Plugin 1.2.7 [libesdout.so] + If you don't have eSound or you don't want to use it, simply launch wmnotify + like this: + wmnotify + +Project website: + http://www.hugovil.com/en/wmnotify + +This program was tested on the following systems: + "Linux From Scratch 4.0" + + +For installation instructions, see the INSTALL file. + +For recent project news, see the NEWS file. diff --git a/TODO b/TODO new file mode 100644 index 0000000..10bf12e --- /dev/null +++ b/TODO @@ -0,0 +1,12 @@ +TODO +==== + +o Implement the volume for the console beep +o Test if the 'execcommand' variable in the configuration file points to + a valid executable (double-click action). +o In configure.in, is the check to "sys/types" necessary? +o In pop3.c, gethostbyname() blocks for a long time if network is unavailable. + Try alternative to this blocking mode (timeout value?). +o The volume setting in the configuration file is in percentage, but it is not computed + as a logarithmic function in file sound.c (dB). +o Use the same Tx and Rx buffers for POP3 and IMAP4 (check the sizes...) diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..b605cb3 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# autogen.sh -- Use this script to create generated files from the SVN distribution +# Taken from glib CVS + +PROJECT=Wmnotify +TEST_TYPE=-f +TEST_FILE=src/wmnotify.c + +ACLOCAL_FLAGS="${ACLOCAL_FLAGS} -I config" + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd ${srcdir} + +DIE=0 + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile $PROJECT." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have automake installed to compile $PROJECT." + echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +(libtoolize --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have libtool installed to compile $PROJECT." + echo "Visit http://www.gnu.org/software/libtool/ for more information." + DIE=1 +} + +if test "${DIE}" -eq 1; then + exit 1 +fi + +test ${TEST_TYPE} ${TEST_FILE} || { + echo "You must run this script in the top-level $PROJECT directory" + exit 1 +} + +case ${CC} in + *xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;; +esac + +aclocal ${ACLOCAL_FLAGS} + +#libtoolize --force --copy + +# Optionally feature autoheader +(autoheader --version) < /dev/null > /dev/null 2>&1 && autoheader + +automake --add-missing --copy ${am_opt} + +autoconf + +cd ${ORIGDIR} + +rm -rf autom4te.cache diff --git a/config/acx_pthread.m4 b/config/acx_pthread.m4 new file mode 100644 index 0000000..b3c966b --- /dev/null +++ b/config/acx_pthread.m4 @@ -0,0 +1,226 @@ +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl This macro figures out how to build C programs using POSIX +dnl threads. It sets the PTHREAD_LIBS output variable to the threads +dnl library and linker flags, and the PTHREAD_CFLAGS output variable +dnl to any special C compiler flags that are needed. (The user can also +dnl force certain compiler flags/libs to be tested by setting these +dnl environment variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl If you are only building threads programs, you may wish to +dnl use these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE +dnl to that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands +dnl to run it if it is not found. If ACTION-IF-FOUND is not specified, +dnl the default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, +dnl or if you have any other suggestions or comments. This macro was +dnl based on work by SGJ on autoconf scripts for FFTW (www.fftw.org) +dnl (with help from M. Frigo), as well as ac_pthread and hb_pthread +dnl macros posted by AFC to the autoconf macro repository. We are also +dnl grateful for the helpful feedback of numerous users. +dnl +dnl @version $Id: acx_pthread.m4,v 1.3 2002/12/12 23:15 ac-archive-0.5.39 $ +dnl @author Steven G. Johnson and Alejandro Forero Cuervo + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthread or + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: threads are created detached by default + # and the JOINABLE attribute has a nonstandard name (UNDETACHED). + AC_MSG_CHECKING([for joinable pthread attribute]) + AC_TRY_LINK([#include ], + [int attr=PTHREAD_CREATE_JOINABLE;], + ok=PTHREAD_CREATE_JOINABLE, ok=unknown) + if test x"$ok" = xunknown; then + AC_TRY_LINK([#include ], + [int attr=PTHREAD_CREATE_UNDETACHED;], + ok=PTHREAD_CREATE_UNDETACHED, ok=unknown) + fi + if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then + AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok, + [Define to the necessary symbol if this constant + uses a non-standard name on your system.]) + fi + AC_MSG_RESULT(${ok}) + if test x"$ok" = xunknown; then + AC_MSG_WARN([we do not know how to create joinable pthreads]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with cc_r + AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/config/hv-debug.m4 b/config/hv-debug.m4 new file mode 100644 index 0000000..f8fc330 --- /dev/null +++ b/config/hv-debug.m4 @@ -0,0 +1,18 @@ +dnl +dnl Macro for adding an option to 'configure' for enabling debugging messages +dnl +AC_DEFUN([HV_CHECK_FOR_DEBUG],[ +AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], + [enable debugging messages on console + (default is NO)]),[ + if test x"${enableval}" = xyes; then + debug_messages=1 + AC_DEFINE([DEBUG],1,[Set to 1 to enable debugging messages.]) + elif test x"${enableval}" = xno; then + debug_messages=0 + else + AC_MSG_ERROR(bad value for --enable-debug option) + fi +], debug_messages=0 ) +]) + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..c99f352 --- /dev/null +++ b/configure.in @@ -0,0 +1,129 @@ +# configure.in -- Process this file with autoconf to produce configure. + +dnl Initialization stuff. +AC_INIT(wmnotify, 0.3.1) +AC_CONFIG_AUX_DIR(config) +AC_CONFIG_SRCDIR(src/wmnotify.c) +AM_CONFIG_HEADER(config.h:config-h.in) +dnl Checking if the NEWS file has been updated to reflect the current version. +AM_INIT_AUTOMAKE(check-news) + +dnl Testing the C compiler. +AC_PROG_CC +AC_LANG_C + +dnl Checking for header files. +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS(stdlib.h unistd.h errno.h assert.h) +AC_CHECK_HEADERS(string.h strings.h) + +dnl Checking for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_PID_T +AC_TYPE_SIZE_T + +dnl Checks for '--enable-debug' option +HV_CHECK_FOR_DEBUG + +dnl Basic CFLAGS values +CFLAGS="${CFLAGS} -Wall" + +dnl Checking for POSIX threads library. +ACX_PTHREAD(CC="${PTHREAD_CC}" CFLAGS="${CFLAGS} ${PTHREAD_CFLAGS}" dnl + LIBS="${PTHREAD_LIBS} ${LIBS}", dnl + echo "Can't find POSIX threads library"; exit 1 ) + +dnl Trying to locate the X window system's includes and libraries, and sets the +dnl variables x_includes and x_libraries to their locations. Also adds the +dnl required include flags to X_CFLAGS and required linking flags to X_LIBS. +AC_PATH_XTRA +CFLAGS="${CFLAGS} ${X_CFLAGS}" +LIBS="${LIBS} ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" + +dnl Checking for X11 library. +AC_CHECK_LIB(X11, XOpenDisplay, LIBS="${LIBS} -lX11", + echo "Can't find X11 library" ; exit 1, "${X_LIBS}") + +dnl Checking for Xpm library and headers. +AC_CHECK_HEADERS(X11/xpm.h, ,echo "Can't find header file for library Xpm" ; exit 1) +AC_CHECK_LIB(Xpm, XpmCreatePixmapFromXpmImage, LIBS="${LIBS} -lXpm", + echo "Can't find Xpm library" ; exit 1, "${X_LIBS}") + +dnl Checking for Xext library and headers. +AC_CHECK_HEADERS(X11/extensions/shape.h, , +echo "Can't find header file for library Xext" ; exit 1) +AC_CHECK_LIB(Xext, XShapeCombineMask, LIBS="${LIBS} -lXext", + echo "Can't find Xext library" ; exit 1, "${X_LIBS}") + +dnl Checks for libsndfile +AC_ARG_ENABLE(libsndfile, + [ --enable-libsndfile Enable libsndfile support for audible notification (default=yes)], + [ac_cv_enable_libsndfile=$enableval], [ac_cv_enable_libsndfile=yes]) +AC_MSG_CHECKING([whether to use libsndfile]) +if test $ac_cv_enable_libsndfile = yes; then + AC_MSG_RESULT(yes) + PKG_CHECK_MODULES(SNDFILE, sndfile >= 1.0.2,dnl + AC_DEFINE([HAVE_SNDFILE],1,[Set to 1 to enable libsndfile support.])dnl + CFLAGS="${CFLAGS} ${SNDFILE_CFLAGS}"dnl + LIBS="${LIBS} ${SNDFILE_LIBS}", ac_cv_enable_libsndfile=no) +else + AC_MSG_RESULT(no) +fi + +dnl Check for OpenSSL +AC_ARG_ENABLE(ssl, + [ --enable-ssl Enable SSL support using OpenSSL (default=yes)], + [ac_cv_enable_ssl=$enableval], [ac_cv_enable_ssl=yes]) +AC_MSG_CHECKING([whether to use OpenSSL]) +if test $ac_cv_enable_ssl = yes; then + AC_MSG_RESULT(yes) + AC_MSG_CHECKING([if openssl is available]) + LIBS="$LIBS -lssl -lcrypto" + AC_TRY_LINK([ +#include +], [ return OPENSSL_VERSION_NUMBER; ], + [ AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SSL, 1, Define if you use OpenSSL to support SSL.) ], + [ AC_MSG_RESULT(no) + LIBS="$ac_save_LIBS" + ac_cv_enable_ssl=no ]) +else + AC_MSG_RESULT(no) +fi + + + +AC_SUBST(CFLAGS) +AC_SUBST(LIBS) +AC_SUBST(ac_aux_dir) + +dnl Creating output file(s) +AC_OUTPUT(Makefile src/Makefile doc/Makefile) + +dnl Output the configuration summary +echo +echo "Configuration summary:" +echo +echo " Install path: ${prefix}" +echo " Compiler: ${CC}" +echo " Compiler flags: ${CFLAGS}" +echo " Linker flags: ${LIBS}" +echo +echo -n " Debugging: " +if test x"${debug_messages}" = x1; then + echo "yes" +else + echo "no" +fi + +echo " OpenSSL: $ac_cv_enable_ssl" +echo " libsndfile: $ac_cv_enable_libsndfile" +if test "x${ac_cv_enable_libsndfile}" = xno; then + echo + echo " WARNING: Althought the 'libsndfile' library is not mandatory, without it" + echo " you won't be able to use sound files to be notified." +fi + +echo +echo "Configure finished. Type 'make' to build." diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..3ae20e9 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,9 @@ +## Makefile.am -- Process this file with automake to produce Makefile.in + +man1_MANS = wmnotify.man + +EXTRA_DIST = $(man1_MANS) + +CLEANFILES = *~ + +MAINTAINERCLEANFILES = Makefile.in diff --git a/doc/wmnotify.man b/doc/wmnotify.man new file mode 100644 index 0000000..17a9c38 --- /dev/null +++ b/doc/wmnotify.man @@ -0,0 +1,138 @@ +.TH WMNOTIFY 1 "February 2004" "wmnotify" "User's Manual" + +.SH NAME +wmnotify \- Dockable email notification program for single POP3 or IMAP4 account + +.SH SYNOPSIS +.B wmnotify +[\fIOPTION\fR]... + +.SH DESCRIPTION +\fBwmnotify\fR is a dockable application (DockApp) for the WindowMaker window +manager to periodically check a POP3 or IMAP4 email account for new messages. +If there are new messages in the mailbox, a simple animation is displayed +and an optional sound (or beep) is produced. + +\fBwmnotify\fR now supports SSL encryption. + +The interface is kept very simple. To manually check for new messages, +single-click on the mailbox image. To start your favorite email program, +double-click on the mailbox image. + +When you double-click on the mailbox image to start your email program, +the new messages animation is stopped, assuming that you will read your new +messages. If you don't, the wmnotify program will simply continue it's +periodic checking of your email account and will restart the new messages +animation after the usual delay if new messages are unread. + +By default, the interval between checks is 5 minutes, and this can be changed +in the configuration file. You can also enable audio notification as well as +specify an optional audio sound file (WAV or AU). If audio notification is +enabled but no audio sound file is specified, a beep will be produced. There is +an option in the configuration file to adjust the volume of the sound file. + +.SH "OPTIONS" +.TP +.BI "\-\^c " config-file +.B wmnotify +reads your mail account settings and preferences from the specified +configuration file. This option overrides the use of the default config file, +.IR "$HOME/.wmnotifyrc". + +.TP +\fB\-d\fR +Display debugging messages. + +.TP +.BI \-display " host" : display +Specifies the host and screen to be used by \fBwmnotify\fR. By default this +is obtained from the environment variable +.SB DISPLAY. + +.TP +.BI \-geometry " geometry" +.RB ( *geometry ) +Specifies the initial geometry of the window. + +.TP +\fB\-h\fR +display usage and exit +.TP +\fB\-v\fR +output version information and exit + +.SH "CONFIGURATION FILE" +.IR $HOME/.wmnotifyrc + +The first time the program is run, it will check for the presence of the +configuration file in the user's home directory. If this file is not found, +wmnotify will automatically create a new one, and exit with a message telling the +user to set it's mail account settings and preferences in the new configuration file +before restarting wmnotify. + +.TP +.BI "protocol " +mail account protocol, POP3 or IMAP4. + +.TP +.BI "use_ssl " +This option controls the SSL encryption enabling/disabling. The value may be +set to "0" to disable or to "1" to enable. + +.TP +.BI "server " +mail server name (or IP address). + +.TP +.BI "port " +mail server port number (optional, default value is 110). + +.TP +.BI "username " +mail account username. + +.TP +.BI "password " +mail account password. + +.TP +.BI "mailcheckdelay " +Mail check interval, in minutes (optional, default value is 5). + +.TP +.BI "mailclient " +The program to start when double-clicking on the mailbox image (optional). + +.TP +.BI "enablebeep " +This option controls the audio notification enabling/disabling. If this option +is enabled and the "audiofile" option below contains a valid audio file, it +will be played whenever new message(s) are detected. If "audiofile" is +commented, the console beep will be used to produce the audio notification. The +value may be set to "0" to disable or to "1" to enable (optional, default value is 0, disabled). + +.TP +.BI "audiofile " +Path and filename of the WAV or AU audio sound file to play when new message(s) +are detected (optional). + +.TP +.BI "volume " +Volume value, in percent, when playing an audio file (optional, default value is +100%). This volume value is relative to the values you have set in your sound +card mixer settings. If you find the audio notification sound to be too loud, +just reduce the volume value. On the other hand, if you want to increase the +audio notification sound amplitude, just increase the volume. If you increase +the volume value to 100% and you find that it is not sufficient, then you would +have to increase the volume using your favorite sound card mixer program +(ex: with alsamixer, increase the PCM or master value). + +.SH CREDITS +\fBwmnotify\fR was written by Hugo Villeneuve , based on +the WMPop3 program by Scott Holden . + +.SH COPYRIGHT +\fBwmnotify\fR is free; anyone may redistribute it to anyone under the terms +stated in the GNU General Public License. A copy of the license is included in +the \fBwmnotify\fR distribution. You can also browse it online at +.I http://www.gnu.org/copyleft/gpl.html diff --git a/pixmaps/mailbox.ai b/pixmaps/mailbox.ai new file mode 100644 index 0000000..0ba20d0 --- /dev/null +++ b/pixmaps/mailbox.ai @@ -0,0 +1,352 @@ +%PDF-1.4 %âãÏÓ +1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 3 0 obj << /Type /Page /MediaBox [ -82 174 695 618 ] /Parent 2 0 R /Rotate 0 /PieceInfo << /Illustrator 6 14 R >> /ArtBox [ 84.33398 238.12793 622.5 394.66602 ] /Thumb 39 14 R /TrimBox [ -82 174 695 618 ] /Contents 41 14 R /Resources << /ExtGState << /R1 4 14 R >> >> >> endobj 4 14 obj << /SA false /OP false /op false /AIS false /ca 1 /CA 1 /BM /Normal /HT /Default >> endobj 5 0 obj << /CreationDate (D:20030130231421) /Creator (Adobe Illustrator 9.0) /Producer (Adobe PDF library 4.800) /Title (boite.ai) /ModDate (D:20030131232638) >> endobj 6 14 obj << /Private 7 14 R /LastModified (D:20030131232638) >> endobj 7 14 obj << /CreatorVersion 9 /ContainerVersion 9 /RoundtripVersion 9 /AIMetaData 8 14 R /AIPrivateData1 9 14 R /AIPrivateData2 10 14 R /AIPrivateData3 12 14 R /AIPrivateData4 14 14 R /AIPrivateData5 16 14 R /AIPrivateData6 18 14 R /PrintRecord << /PrintStyle << /deviceNumber 839 /pageV 1320 /pageH 1020 >> >> >> endobj 8 14 obj << /Length 1419 >> stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 9.0 %%AI8_CreatorVersion: 9.0 %%For: (Myriam Bouchard) (Punch Communication Graphique) %%Title: (boite.ai) %%CreationDate: 2003/01/31 23:26 %%BoundingBox: 84 238 623 395 %%HiResBoundingBox: 84.334 238.1279 622.5 394.666 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset AGM_Gradient 1.0 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_pattern_AI5 1.0 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 5.0 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 0 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 () %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: -64 -159 512 600 %AI3_DocumentPreview: None %AI5_ArtSize: 777 444 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -94 679 1.24 1010 721 26 0 1 7 40 0 0 1 1 1 0 %AI5_OpenViewLayers: 7 %%PageOrigin:-64 -159 %%AI3_PaperRect:-18 774 594 -18 %%AI3_Margin:18 -15 -18 18 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 0 %%EndComments endstream endobj 9 14 obj << /Length 9703 >> stream +%%BoundingBox: 84 238 623 395 %%HiResBoundingBox: 84.334 238.1279 622.5 394.666 %AI7_Thumbnail: 128 40 8 %%BeginData: 9250 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC %C7CCC7CCC7CCC7CCC7CCFD09FFCDC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC %C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCCEFD07FFC7CCC7CCC7CC %C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC %C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6 %CCC6C7C6CCC6C7C6FD09FFC8C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6 %CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6CEFD07FFC7C6CCC6C7C6CCC6 %C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7CC %C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC76E68936E99C7CCC7CCC7CC %C7CCC7CCC7CCFD09FFCDC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC %C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCCEFD07FFC7CCC7CCC7CCC7CCC7CC %C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7C6C7A4 %C7C6C7A4C7C6C77B9FC6C7A4C7C6C7A4C76EB4FCB468C7A4C7C6C7A4C7C6 %C7A4C7C6FD09FFA5C7C6C7A4C7C6C7A4C7A59FA4C7C6C7A4C7C6C7A4C7C6 %C7A4C7C6C7A4C7C6C7A4C7C6C7A4CEFD07FFC7C6C7A4C7C6C7A4C7C69F7B %C7C6C7A4C7C6C7A4C7C6C7A4C7C6C7A4C7C6C7A4C7C6C7A4C7CCC7CCC7CC %C7CCC776527E535352A6A5CCC7CCC792FCB4FC92C7CCC7CCC7CCC7CCC7CC %C7CCFD09FFCDC7CCC7CCC7CCC7A67DA8FFA87D7D7BCCC7CCC7CCC7CCC7CC %C7CCC7CCC7CCC7CCC7CCC7CCCEFD07FFC7CCC7CCC7CCC7CC5153537E5252 %7CA6C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7C6C7C6CCC6C7C6 %52537E537E535428FF7D7D7BA56EB48C9268C7C6CCC6C7C6CCC6C7C6CCC6 %FD09FFC7CCC6C7C6CCC6A57DFD05FF7DA87DA77C7BA5CCC6C7C6CCC6C7C6 %CCC6C7C6CCC6C7C6CEFD07FFCCC6C7C6CCC6C7277E537E537E5352A8A77C %7C9FCCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCCCC7CCC7CCC77B537E547E %537E547E53FFFFFFA893FC759FCCC7CCC7CCC7CCC7CCC7CCC7CCFD09FFCD %C7CCC7CCC7CC7DFD07FF7DFD04FFA87DA77BC7C7CCC7CCC7CCC7CCC7CCC7 %CCC9FD07FFC7CCC7CCC7CC7B54537E547E537E537DFD04FF7DA77CA6C7CC %C7CCC7CCC7CCC7CCC7CCC7A4C7C6C7A4C75254537E5354537E5353A8FFFF %FF6EB475A87DA17BA5A4C7C6C7A4C7C6C7A4FD09FFC7C7A4C7C6C79FFD09 %FF7DFD07FF7D7D7CA0A5C7A4C7C6C7A4C7C6CEFD07FFC7A4C7C6C7A45253 %54537E5354537E28FD07FFA87D7CA09FC7A4C7C6C7A4C7C6C7CCA5C7C7CC %C753547E547E547E547E547EFFFFFF99FC9AFD04FFA8A87CA69FCCC7CCC7 %CCFD09FFCDC7CCC7CCC7A6FD09FF7DFD0BFFA87DA77BC7C7CCC7CCCEFD07 %FFC7CCC7CCC7CC537E547E547E547E547E7DFD0BFF7DA77CA6C7CCC7CCC7 %C67C7DA77D7D5253537E537E537E537E52FFFFFF6FB476FD09FF7DA0C6C7 %C6FD09FFC8C7C6CCC6C77CFD09FFA8A8FD0EFFA876A5CCC6CEFD07FFC7C6 %CCC6C77B53537E537E537E537E5353FD0EFFA87D7BCCC6C7CC9FFFA87DA8 %FFFFA87D7E7D7D537E5453FFFFFF93FCA1FD0AFFA8A0C7CCFD09FFCDC7CC %C7CCC7A7FD0AFF7DFD10FF7CC7CCCEFD07FFC7CCC7CCC77B537E547E537E %547E537E53FD10FFA87BCCC7C6C77DFFFFA87DA8FD06FF7D7D7DFFFFFF6F %B476FD0BFF52C7C6FD09FFA5C7C6C7A4C77DFD0AFFA8FD10FFA87BA4CEFD %07FFC7C6C7A4C77B54537E5354537E53545353A8FD10FF7DA4C7CCC7A7FD %04FFA87DA8FD07FF7DFFFF9AFCA1FD0CFF7BCCFD09FFCDC7CCC7CCC7A8FD %0AFF7DFD11FF7CCCCEFD07FFC7CCC7CCC79F547E547E547E547E547E54A8 %FD10FFA8A6C7C6C77CFD06FFA87DA8FD04FF7D7DFFFF76B47CFD0CFF7CC6 %FD09FFC7CCC6C7C6CC7DFD0AFFA8FFA1A1FD0EFF7DA4CEFD07FFCCC6C7C6 %CC7B7E537E537E537E537E537E7DCF7CFD0FFF75CCCCC7A6FD08FFA87D7D %A87DFF7DFFFF9AFCA1FD0CFF7CCCFD09FFCDC7CCC7CCC7A7FD0AFF7DFF68 %9268939AA1A8FD09FFA8C7C9FD07FFC7CCC7CCC7A0547E537E547E537E54 %7E53A876B468936F9A7DFD0AFF7CC7A4C77BFD0EFF7DFFFF75B47CFD0CFF %7DA4FD09FFC7C7A4C7C6C77CFD0AFFA8FF9A6F6E8CB4FC8C68936FA1A8FD %05FF7BCEFD07FFC7A4C7C6C79F535354537E5354537E535453A76F6F68B4 %FCFC68936F76A1FD05FF7CC7CCC7A6A8FD0DFF7DFFFFC99ACAFD0CFFA1CC %FD09FFCDC7CCC7CCC7A7FD0AFF7DFD04FFCA769968B4FCB4FC926E6FFFFF %FFA6CEFD07FFC7CCC7CCC7CC527E547E547E547E547E547EFD04FF769A6E %92FCB4FCB46899A0FFFFA7C7C6CCC6A8FD0DFFA8FD11FF7DC6FD09FFC8C7 %C6CCC6C77BFD0AFFA8FD08FFA19A6F8CFCB46FFFFFFF7BCEFD07FFC7C6CC %C6C7C676537E537E537E537E537E53FD07FFA8A16F6FFCB4FC76FFFF7CC7 %CCC7CC7DFD0DFF7DFD11FFA7CCFD09FFCDC7CCC7CCC7C7A8FD09FFA8FD0B %FF93B4FC99FFFFFFA6CEFD07FFC7CCC7CCC7CC517E547E537E547E537E54 %53FD0AFFA1B4FCB4A1FFFFA7C7C6C7A4A1FD0DFF7DFD11FFA1C6FD09FFA5 %C7C6C7A4C7C67DFD0AFF7DFD0AFF93FCB46EFFFFFF7BCEFD07FFC7C6C7A4 %C7C675537E5354537E5354537E52FD0AFFA1FCB4FCA1FFFF7CC7CCC7CC7C %A87DA77DA87D7E7D7E537D537D28A8FD10FF7CCCFD09FFCDC7CCC7CCC7CC %A1FD09FFA87DA8FD09FFA1766E93FFFFA8CCCEFD07FFC7CCC7CCC7CC7B7E %547E547E547E547E53527DFD09FFCAA06F93A1FFFFA7C7C6C7C6CCC6C7A4 %53537E537E53525253537D7E7D527D7DFD0CFFA6C6FD09FFC7CCC6C7C6CC %C67CFD06FF7D7D527E7E7E527D7DA8FD0BFFA8C6CEFD07FFCCC6C7C6CCC6 %C7287E537E537E2852527D53A8537D7D7DA8FD0BFF7CCCCCC7CCC7CCC7CC %527E5353527DA8A9A87DA8A97EA9A8A97D7D7DA8A8FD07FF7CCCFD09FFCD %C7CCC7CCC7CC7CFFA8A87D7D52A8A8A97EA9A8A97EA97E7D7DA8A8FD07FF %7DCCC9FD07FFC7CCC7CCC7CCC7535353527D53A9A8A953A9A8A97EA9A87D %527D7DFD08FFA6C7A4C7C6C7A4C7C65252A8A8A9A8A9A8A853A97EA85152 %52A87EA97E7D527D7DFD04FF9FA4FD09FFC7C7A4C7C6C7A4A5525253A97E %A87EA97EA87EA95252517E7EA87E7E527D7DA8FFFFFFA7C6CEFD07FFC7A4 %C7C6C7A4C7527D7DA9A8A9A8A97E7D7EA97E524B7D7EA87EA9537D7CA8A8 %FFFFFF7BC7CCC7CCC7CCC77CA8A9A8A9A8A9A8A9537EA8A951A075A051A9 %A8A97EA9A8A9527D7D7D9FCCFD09FFCDC7CCC7CCC7CCC7CCC7A67B7C7C7D %7D7E7EA952A075A0757E7EA9A8A97EA97D7D7DA87CCCCEFD07FFC7CCC7CC %C7CC7BA8A8A9A8A9A8A9A87D7DA9A876A07CA0767EA9A8A97EA9A87D52A7 %7DA6C7C6CCC6C7C6C752A9A8A9A8A9A8A9A87CA59F7B76A076A0757EA97E %A87EA8537D527C7BC7C6FD09FFC8C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC6 %9F7B76A076A0A052A87EA97EA87D7D7C7C75A5C6CEFD07FFC7C6CCC6C7C6 %7DA8A9A8A9A8A9A8A975C77B7C75A051A0517E7EA97EA87E7D527C7C7CC6 %C7CCC7CCC7CC75A9A8A9A8A9A8A9A87DA5CCC7CC75A075A07C7B7BA07C7C %7BCCC7CCC7CCC7CCFD09FFCDC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC %7BA0A07CA07C7B7C7CA07BA5C7CCC7CCC7CCCEFD07FFC7CCC7CCC77CA8A9 %A8A9A8A9A8A97DC7C7CCC77CA07CA0A0757C7CA07CA0C7CCC7CCC7CCC7C6 %C7A4C7C67DA8A9A8A9A8A9A8A951C7C6C7A476A075A0A074C7A4C7C6C7A4 %C7C6C7A4C7C6FD09FFA5C7C6C7A4C7C6C7A4C7C6C7A4C7C6C7A4C7C67BA0 %A075A051C7C6C7A4C7C6C7A4C7C6C7A4CEFD07FFC7C6C7A4C752A9A8A9A8 %A9A8A9A87CA4C7C6C775A051A0A07BC6C7A4C7C6C7A4C7C6C7A4C7CCC7CC %C77CA8A9A8A9A8A9A8A97DCCC7CCC7CC75A075A0A07BC7CCC7CCC7CCC7CC %C7CCC7CCFD09FFCDC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC7BA0A076 %A07CC7CCC7CCC7CCC7CCC7CCC7CCCEFD07FFC7CCC7CC7BA9A8A9A8A9A8A9 %A87EA5CCC7CCC77CA07CA0A075CCC7CCC7CCC7CCC7CCC7CCC7C6C7C6CC7C %A9A8A9A8A9A8A9A87CC6CCC6C7C67BA076A0A075C7C6CCC6C7C6CCC6C7C6 %CCC6FD09FFC7CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C6CCC67BA0A075A0A0 %7BC6C7C6CCC6C7C6CCC6C7C6CEFD07FFCCC6C7C67DA8A9A8A9A8A9A8A952 %C7C6CCC6C775A075A0A075C6C7C6CCC6C7C6CCC6C7C6CCCCC7CCA57DA8A9 %A8A9A8A9A87EA5CCC7CCC7CC75A0A07CA07CA5CCC7CCC7CCC7CCC7CCC7CC %FD09FFCDC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC7BA0A076A0A07BCC %C7CCC7CCC7CCC7CCC7CCC9FD07FFC7CCC7C77DA9A8A9A8A9A8A97DC7C7CC %C7CCC77CA0A075A075C7C7CCC7CCC7CCC7CCC7CCC7A4C7C67CA8A9A8A9A8 %A9A8A851C7C6C7A4C7C67BA0A075A0A09FC6C7A4C7C6C7A4C7C6C7A4FD09 %FFC7C7A4C7C6C7A4C7C6C7A4C7C6C7A4C7C6C7A49FA0A075A0A075A4C7C6 %C7A4C7C6C7A4C7C6CEFD07FFC7A4C77BA9A8A9A8A9A8A97E7CA4C7C6C7A4 %C775A0A076A0A07AC7C6C7A4C7C6C7A4C7C6C7CCC7CC7CA9A8A9A8A9A8A9 %52CCC7CCC7CCC7CC75A0A076A0A075CCC7CCC7CCC7CCC7CCC7CCFD09FFCD %C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC7BA0A07CA0A075CCC7CCC7CC %C7CCC7CCC7CCCEFD07FFC7CCC7A0A8A9A8A9A8A9A87CC7CCC7CCC7CCC7A0 %A0A075A0A09FC7CCC7CCC7CCC7CCC7CCC7C6CCC67C7EA9A8A9A87E75C7C6 %CCC6C7C6CCC675A0A075A0A07BC6C7C6CCC6C7C6CCC6C7C6FD09FFC8C7C6 %CCC6C7C6CCC6C7C6CCC6C7C6CCC6C7C69FA0A075A0A0A07ACCC6C7C6CCC6 %C7C6CCC6CEFD07FFC7C6CC7BA8A8A9A8A97D7CC6C7C6CCC6C7C6CC75A0A0 %76A0A075CCC6C7C6CCC6C7C6CCC6C7CCC7CCC77C7CA17D7CA5CCC7CCC7CC %C7CCC7CC7BA0A076A0A075CCC7CCC7CCC7CCC7CCC7CCFD09FFCDC7CCC7CC %C7CCC7CCC7CCC7CCC7CCC7CCC7CC9FA0A0A075A0A07BC7CCC7CCC7CCC7CC %C7CCCEFD07FFC7CCC7CC7B7D7CA17CA5C7CCC7CCC7CCC7CCC79FA0A075A0 %A076C7CCC7CCC7CCC7CCC7CCC7C6C7A4C7C6C7A4C7C6C7A4C7C6C7A4C7C6 %C7A47BA0A075A0A0769EC7C6C7A4C7C6C7A4C7C6FD09FFA5C7C6C7A4C7C6 %C7A4C7C6C7A4C7C6C7A4C7C6C775A0A076A0A075C7A4C7C6C7A4C7C6C7A4 %CEFD07FFC7C6C7A4C7C6C7A4C7C6C7A4C7C6C7A4C7C6C775A0A076A0A075 %9FA4C7C6C7A4C7C6C7A4C7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CC %7BA0A07CA0A0A09FC7CCC7CCC7CCC7CCC7CCFD09FFCDC7CCC7CCC7CCC7CC %C7CCC7CCC7CCC7CCC7CCC77CA0A075A0A07CC7CCC7CCC7CCC7CCC7CCCEFD %07FFC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC7CCC79FA0A075A0A0A075CC %C7CCC7CCC7CCC7CCC7FD14FFA8CFA8CFA8CFA8FD27FFA8CFA8CAA8CFA8FD %25FFA8CFA8CAA8CFA8CFFDFCFFFD0DFFFF %%EndData endstream endobj 10 14 obj << /Filter [ /FlateDecode ] /Length 11 14 R >> stream +H‰ìWÛn#¹ýþCça€1{›wÒXh6›“2³†gvƒ`Z»c ‘%G—ÙL¾>§ÈnK–䵃}._$^ŠdUñœÓoþpñé´¹YüҟʳºboÞ´Ë~²^,Ï«ÜZ½ŸÍ6«õ’šÞ^žTþ¬Æ˜æ½»ÆýÔ/WÓÅü|èI4ó퇯Ëéä¾ +‹ÍõÝdysR½½Ø̯ïªvq¿™O¯'kL©Þ-'wÓoúLü<]ÏzLýe1]÷g“éɸŒŒ“5ºD]Ëïjþä•çÂ`˜ßLç·añŸóÊ)´»ÊYI¯Ñû—ée¿Úr&evƅõ+Î4F«3cÈ_\\oîûùúb¹¸îW«v1[,WçUûu2¯>LnÑ3©þÞÏf‹_«0›\ÿkgÊǾ¿éo°àb³ÄÜóê>Výº„ñjÖégâªy¯+~&* +Õ·CÞ}¸B0n¦ðƒîz¿;{țy]À‹Á0ytØN¾†ÕŽ{˜¬×ýr>Œ9¾äõê'èuGzWw +,<¸Ñœ]¥é¬GÜO֕>Ëm²ìýÇöŽ`Ògj¶Wù4Ÿúõn1ÚÂå»°|4f{ûóe;ÍçB=üã$× )~?õ“ÒW燽¥ÅþŸ“Íl]¬¶£ðq}Råýð@ «<É`>üãÅÜcÃh§œ~¶ÃöûK«¨d¥ò2‘–e¤©+¥Ñ+†™Çç¿¥-Rì>÷÷3\€\À²6¹`5ýÝ~F"òyÔ©QØ ö•æË IØwÿeÚÿz^}\Ìû’³f¹þ4ý/’c­­”R¥õr3ë—?ΧkÈP“/ÿ°¸ég8ÐãÜ4›äüí'ÿ->O–·ýšnÆl³ÎPáê¡ëãæþ¯“¯=Ý1^øᡟ^ü”÷wêUepKqaTÅk^W!%QØçn–‡4&^-â"ûa9½ÎÏÇÀäò‘W“‡~yÙ_¯ÏO‘ekU¥= pCÿì³Ð‡IÔ^QUî»åôf[¸VT®üÉÇ>s;¿~ü-çC¨pïæ¥Ø»ù !"r²"0C…ÏQü³Å-¾½Ÿ_Ï67ý(¯À“çgƒ—ü?ƒ6/Ìz|^˜v ‹^˜òš^|©(ö±Î‘G:7¥Šò÷+\‹åtN9f˜¯Â|§{ ((+SÁŸª¿Ý¹ªK4Of'ìhkF…pÃ~fu¶ïYýÿ=üYÅØøa0¹cê‰é3ƒÙÁ\6OÆð§,dka1[Kdy å0 S\à ÌÂ÷°¼åÖñ”7Ʌ¦„FX˜^4"ˆVDщ„Ís uK-´ÒI/d+£ì˜L8WBI@—VFYå”WjUTJ8¡ÐR+m´ÕN{t«£N8±0Òhp¿3ÞӚ§çÌJ«­±Î6¶µÑ&ǝtÚYç]pÑ%œ°ë­o|ë;DF6º±MÓ´M +<¨`ƒmH­hukۆ!X&„Ku®k0‘T2É&ŸBŠ)±?£RJ¾´hjÐáÐm’Æ@‰á<Õ]êº.vmº¦ópd;Ói¸”èxWÇ»cCl¢ŽE‹UuTQFx×mj»6¶mÚ¦õ­ÃÖ 6¨Z‰ò¶)t!bã!48€Ã1LÐ8Ž ǪY“š®‰8eÀY}ãpfƒ“+œ_ ·µO¾ó1 ˆŒ÷2ˆ“B´bV»ä:įEÄÒ1„Ô ° +árm“íðÖ„Þ#iÐV!!eT›d:‘§`dÌ‹Üi£ER«™NºCj[¤¸A¢n´Fê%J€ëZ%DDa”‡G™X”‹FÙH”WµL²CMµ¨­5æŠÍ èŠO k‘P…P …jQ²¥+QÄ\Ô<¡¬# +< Ö=êÞâh܉{Á9.=‰«ƒhãB!$¸m7Kã*pã·RøV +ßJá[)엂ªÞ\…%I‡'¯'¢Òô}ŸØ›«£}a޾©ävx}:ë óB,’ji<Ç5ÐÇŗ DOþO²¨è7HŠ"0ôp¨}YrL„3ÃvÜGOՎ:p÷¼ÃÜËvÜíÛsòèYgÅ¡~ÁÌ+ö¶ãr{äטyÙ=ÛßòNrF;Žç£Ùѵ‡±ßè|m žì•½ê@ÇM3vÐ@`ý…QDûA7ÍÜ ZyTÉ*+䢎³6θÈâ,ŠYÖÄ[=œÕð=üT7[U¼'ŠIC3\uqVƨ†&[ÑÇÍ #`“T2Ï:YQI+Û¬–=°6˜È½)—K€²ÎÚÙ¦ôì54h :ºœã0v€‡@½æƒ4€þ-X 2AÂ{½0PðdaȨÃBI B‰ •”_L8ˆé…7ր@i Üj„2§·ÒBˆ@_8#ˆ Û¥Á#ȍžT¥ÒKÈòD@A‡ˆˆÑ´Ž%=c,x3‚=ÁÎù…ˆƒQ˜U!t $0­Å‰h«Øùôt äD¯N g’ \-ÁØdˆ8øÛP¸ÀåŒî»f° ëï‹Ñ“FKõh Â`4ñhòÀÔ+L“±òok¨öúÌs ,aü÷ª”#:…!n‡:巔ÊsZeP+l”+Y­ìë•=Ų§Yžª–A·°A¸ìJˆ—A»ì¨—ý²U0[ 3ª¼uŽBf”2£˜åÌ(h i²¢5ͨjŠ®•dYÜy3 +œ"qŠÈ)2§"u²ØäN:#‰’?E‘*"ˆdPB$…H ‘*‚ˆ$‰"’EœggmDêˆô)¤±ÐgDJ‰´’Éz‰i&™ñ³<¤ŽR–O0F·0ƒ-)©Á—ô”ÏšÊ#úæG-Až9+ÿêLJ +”bß³GõR0ßå… +Þǂ÷y:Ïh?âýˆø~@ü‚ùõÙü0B~¨Ùÿ D7>áÂ23qAa—SÖ°L!g2ZÈÄ@ÔÀsÆe&ˆ‘" j£>Z qƒB9# ñ€d¨E‚@Æ|B|B{BzÂù”žÐ½É˜Np.2Œ„ø.Ð-É2nÌ&¼X?ÂtèÍ”ËQÁ •ÑEf„ؕJq|⎵‡Æ?nAµÛԂ¢#^ÒÒ¸§8œ¤äF-–eô3Ã.Çîìñ`‡O÷x°Ó²Ã°gÍQóæ̲Ì/£å¦3£å ?zÛ%£íð2M#¤ËЉõ<°œXQànc"QâR° ЎH0q°/+¤¾&¾D9¸ŒËW˜Ð8 zƒ%.3Án@…‘†P´ ‰÷ÀVM8…[Þ¡LFüýrٍãȂèä?ôF€½ê]™†7õ´µ—^2H@0¿?qãÞÌʪê&©‡5€}QìÎÎ.VGžˆh θÄn€d#dė9[é äaÇ3Hè ƒ !(ôä_d_IXõäDn¼ÛXGÊñK´ ç]x&‚)¹béóäǖÑ'ã£ÀìâË.¼äхÁÅr˖Z¼³Ð’"K +,1®Ä°¢Q%æM)šQ4¡h>)㉆&}Š%•%’ÅÎÞ°WúÓZ?êý¬zë{çJx.“ýiüixJœ–íÈg<Ítšy—´ý¬Ç9ߑòü¨F>õiš8ñ¦ëíÝRLo)fx"ÅÄÞê-Å°¹ºcøñOÿþük†™H̼ÉVY~‰éeô2n¹ÅRKL,1­xÒ[[­öÚÅz­4ÛZÎv+½Ô;–Ûc½Õ‚[YÁ×[Å¡ó™F¸2ñhÏÕ¦Û¹SÕÕ²»žÊ.ê.nº%Ç?Оð—7ü(CwÑ.u).%¦¸T—Ú¿Æm¬ð¬ÿݽz÷ìõãß²wYzYÔ>_[pm[\úöu…¯9Ûü™oà²¨¨ärª¾•E-ÏUödïåRqÿ[};x½}֗½Ÿ<ÎîÕð¶}·<ܽùøþîÃýÃ'}b¼ÿëÃC|ê—ËO¿½/¿½ÿððç¿ÿó³Ûý†¿§»Œwøú&ː穲)Ó»Œ™g·,¥ÅƒU—bïæÉ¢9¨5 #©3ÐÌÔÔj&%1µ5±2%¦!e&Ü\ò ÷…úŠ|ßpaQA¯˜WÈâÉwÐÝá, Ü[T»b] +fÏ@%aªd’š™¡‚5HéŽ%ÓSÌN’ZÇ@Pf­pb ) ĨýoËsVù4 0lþ½åUšnÏñû«æ9>õXóqYɌa7¹`77×ÇY•9N·›>o®ŽwÚ}¬útiÃý!;¨âp ²R䞼Cϼwñƹ+wmwÇ …cƨ¶¨¦¨–¨†¨v¨fØ$# –çä€UJ¿½³ð;Fã3ÛSÓSËÃS·S¯S§SŸS—S‡[ NíMÍÍÓÙÔ×ÔÕÊähêgêfêeêdUt±¾wô0u0ú—¹—zWZx0c@bœ@*($+`¥\:؟GÒœ ØYÂêpKÄÑÃ+éo×YžZð¹ónxˆÿîJ#øªyrCH¡ŒÙíW'Éq§8ê-ò}fœØu†4úûdJ]ÜN¬…ªR¬bæ1B‚D*›ŒiØ°ÃË-?bû•2o¬Ã–âÌ­÷Í5=3òþyft)ÖÄhRÀñéúz¾%^½½5½knh§×VgÇOŸL 4tŠÂBVLW#Ïð”Lt3Ȝö†÷úp¾õtó|§ÇŒç¯pöÃfbíôûãá|"4ÌÄÚ{ì¹ ¼;ÕÛèd <¬†õ𮾵³jø•45±*Õ›B'‡ªèN=ibë*aHbGbFbEjDjCbBbAb@b?b>f=j<›íl¦#–3APb65ŒFlf Å¬ðuõuúŠƒ­ˆ©ô4±“•V"FÒÃEÔCÄAÔ?âYν£ÌÎAçLÙ{]Oiæ-8üpèüþþ£'àÿbC’\YŒ,ʕž8i‚K^…ÚhŒÏa¼UÄ)–DÆžX¥¦8[W е–ÅFë"ʐÆÉ*£·ÒØ°6–8&lŽ³uÇ`í±e¬Ø Wvȉ-2àäõl’ »d‰†µöR'GJï¬S6Ú*QÀ´WN©Yö©[V©]ÎÖ/ƒ5Ì6vÌ®p¬™³MdÛÀ¦Ù±kÖÖ6Wë›#§·ÎÙhëDÙÓÞ9YóôÎÊg£õ-P èdÔk e­R ÝwPm Ú?!-Ÿ‹§–ÎŽ]SfI)dÁ!cÆ6ãiönùˆÛ: 1´)äSŸ¦º5îöKÄaM$6ÄbˏÝ{GX)®Jùߘޡ[È"´öÌr„VD–KpUâBf`*Q àT@ ˜äÁ£,*ðmL`°§€à&aŽ§m„5 8#”éAáK¯NÈH•FˆBœLD‰€D0"„@€~=„Bá†4q!°T(( +‰ˆˆ ÅQü5ó¿ámþé éCÉlß0Ëç¡}†žV¬,!¯2káG=D ¾œ!ÅÅ „0kȳ…L{µfúIR=JÑ9×(}d´_îK8h̀ßÁU=Cþ§%è;”Œ\ã IÞï™øfþÙRi¹¿eò÷Ìþ#ÓÿÂü_²4±xkSÖª¬ xvç~Æé_Ù*$‘‰¤c/ ÄÈn°„Õ¡”VZ«ÁJ¬5¨B’¦Ð<žmad_XÐ +v†š­¡›z^«3ËCaõ¡I"ì*Dan£^ӛGF\±:ÔÓÁ +*ÜbHÁ +P ¨ +Tª„¨…\ =ü`Šx\*âšž¡ƒûl5˜vJè7¸«:ȕµ°¤üQ¥üH– \*˜[ÉÜUMö + !Ÿæ4u6U6‘2ßì/~ó )…¹u8Ì%B:ñä8Íì)ªWœÚ¦á´6§·ñ6ÁfÐq2ãL‡™¯ÌqÍnÜã/?9§söŸåê|Óþ…'7ÜêÄÂÛ72Ñ{&ù–¾ÊêVÝ»›á=HÙewF÷%…÷`ñ½e€¯@È_ðæMàæzzP´MPµ] A,ÀíìÀ¯†;ถ+˜uá,àõnà·Ç;ð¼×+ð½€À¸ÿê#û{/鿃4°…Š`KgÆÈ&àÑ:¸IÃ>P"z¯àíÌV0À<›A Gª¥t…cA˜aY#K‚gMhY*V…•eab]Rà…-CÅΰ²5Lì ¡öFÚ±<ÔRÀc)3+ÄÀÑ[¨­H¬V%ÆT&º}X/LE¢œ}"N{šîö¸Ç^|Ԗö¶Û°¿2×6½6Û:{§û‚[ìÇe›ÜúãžÜ$ßÁ%£ÞÌ9~EÛF×·9l¥û¸çŸ7ñt b»I£P¯‡R Oä-ô…ÄGPŒN9‘0‘C""ââ‹ðà{÷Ex¸aƒ;ÁAñp·Ñ@8ápÄÇ碁pãv†„"Â'Ոøà¯CYCÖ/]ó¥kn]3™ÆHQôþ´U¸˜òbϕ—êÒâ÷¢Å¿»Wxü[d×vAV¡áB]Ì5>ÛïñeÜÉCKñ5|V°À–tÙN/ÓkªÚV¯Ùþå«M~9·VðýPw#›—¡»èÁ⪴®ÊoÔÓkuϲä í +Ÿ¯+âº|Ë'—bÇqv¯†·í»åáîÍÇ÷wî>éãý_âS¿\~úýÓýý¿.ãû—·ovû_±U}ïDœ_?·ô”7ÇLÐíêju0µ[‘åh»ždQ¦3r&bm&Ú«:Ws:EÀNp§ÀäzθÉٗè‡ù,ü¹›ü3úá/TôEð)öz‚<žàN`·è8'”óœàmÚj`­ÒFàlÅßRc=6¨Õ‚XXµ‚R èÀ¥^¤ð"…)¼Ha/K–18@34¨‡Z(þË~™ôʍAøäx—ìË·âb p5|Öq‚ †.:ŒìÿïÈȬ…ìn©ŸF°}ý–n²š¬ŠŠø±îVºÇP32àŽ,݄EëðÝViÆú¬M…UY±"Ö¢jÁ2lX‚ ³0ó5f]ç|Æ|ël·œé³¬s¬3¬ó«=MmœX›V pœÕ§æôÛS*Ŭú¼¦™µ¹]H“Ïð@ú>ϱÃÓ£Š}ÞA„1˜±~oñžÏú>«1õ±ô>0•3•ø%t5wë1ǝŽoâ!-âgûù³ýt†ü)…ŸRø)…ŸR(¥ààð›T/Zõ‹ýn^þ©*ýôüòþÁ§Ë¿N?Óâ']õڅó•w>OמFýÚ7òû–M~™ÿÞïŸ?üí÷|øôñó¿ìåã??}ŽoýååOïþýù÷O_>þYÒ_ Y>àarñF6>×æe‡ÎRÅ҉l8™:§4pZµÁìZ—Á·}Áœà[ñÛ¼#„?®Nü$]ÛÇÕùÏ\v¹Ò}M|9ø8`|qÌ'èCLFúÆúJû¹ê¢ªâ'Šæ‘IŒ¦¦ Öà ^€® F1Á4 ¤&Nù5¬1l+Îì0ÆVåÏmsasc`m´müm4nlnœnÔn ¿² jaÚiÙ·±íhX-«cVÏX#kbiw1  É•Q¹1.µ-_Bێ–Õ±«g ¬QƒU£ub¼ÎŒØ…1»2j7Æ­–¹“͈ݶƒs÷LH¾%#噐|KFÊ3!ù–Œ”gBò‰Œ¬bJB€QPYN’iÈÕóFnúc䄥y†›æÈMxH°rS×ë1R˜{HâŽ(ämªø¶(ämªøª(ðP7ܤ«AE´Œ·á¤‰LNQ­glOq¨›*cv´â)U´ëÅkõÚb 5ë(«¸ÁòHî\·§¢#‰ýòl‰uÚøõPTÿ b6aÀ2žnj÷€Z½—”SÓ%¥RcsîŒÊÞ¨œúæTOë£S\]÷me½KÇËƲšµ΢Á7ˆ§ÚL{ÙÜ`j·˜à&3ÑfV3ÆFèn6£Û RAè8U2œà¶?Òíºûî¶Ó¸ñèÍg1ó€ºý($š£¡ŽÂ„mh  ÍшÀ°ÙŠ:3#¡ØüBçW>/ ýÌè¤tqLO î>e¤žYÝÜj¥ EbÏ̲aIr+¢{‚÷Æ}êw¯nJ‡w‡³T”)?rþ椯œ?B‡‘õ›Dû»óþ¬Ä/ ú»ýÄþÝÀŸÄ3aGDòWPjœýuÿgò?;ñ -Z€=µÖ žP°äþ͉μ/ÄýûÆ×Jù‘óggüHø‘ïižnœÎô4ÊIè‘êfŠÑ£íiýµhKíÕF!Ç2‰ÚÝQÅ•«òÌâl·Ÿu»Ï\¹'-;Ò!%}LûÉ3–â2»T/Éík.lI:3d:P¢«Ó´iº4Uª&U‘3µ CUáù©ø²ô(;¡îLu¦8Õ[E©ÊT`&/“– +KE¥’j±b*¥•"¨žF(Íìr‰bQ©¨LT$*Ð´j¬_åÉ$¸äÀÝ`ȃx˜ì?™¿$÷¿õþ“ó«íãÁê¨Ãß`yÈÇþ¥z©ñª^þn^Þ¨*=éüòþë'-_0ʄIҏªaÔO_+Ì9Oîâ©axÅ~èò˜Ï_Âo@(wzïäuªÛ7”n%„×¾óðOžoc7¾ú¶Øè¹]­¿ªªxc}¼¤ë_{XHño»Žß5â4|ˆûiõiùÄ=Îo^ðøÍøZaŠ‰æl_=åâ éÌÿ°_.½qIþùx`_Œ~UW·±0ÐOÃç…O{t0^ÿlddV¿¦g8¤d­ ¨ ¨áLuOUæßô?›m¿ù>¬Õò®û-¼ŸžýóÃ㧧ç¿ì…þéã§çôÒÏ?üþüüᏧLJþÒC^þ(§¯rýþ ç.w“î–|ç›~Vþ.Ù| ™ø­9½4¥å6 ‚@­Þ6žV}¨p¥ªcÉ1Üüеe7%'wºtÜ·Ìô!*ÉENºïiÎ>Q­ ÞûLÅñy.£Û={x¬ãíJnÿù…3¾q(÷ÖùÞ]m›/P÷-XÞ_òš7±×˜/Sùq_˃k"´Xn´ä¨ÙqMÈ¢[íø"5FZÔ(©a²g˜éJgFʌ‘RC¥ÆJ –-.ÁùÕm"æHGj.[¦ÆM œ)rjèŒ ;5x"zŠ§O͟`îTS¨æÐjÉ¢5ó¨%ÒF¿éÈùNGaB,¥2§jRÍ=­4˖Y5µ&×ÚÓëÞ}»ÿ´Ý.¬åw›Ž×!OÌY*$ƒ‹*^¨òV‰ÿR}©’Ó—ÃÛKîzÓE’°$'’HGž(QRE¹¢5“.3aÁ|X c˜©#a£¸ÑêµO‰ÉOAá£ø)D+'P̈́jj…±µ×ö&´fç b©d8Q8ž,¢´D;LÁú'VUÎ*Ë-͒] X£%Ï0 +®]/K3­_F0K5–kŒc[’Õ$™²ÌRÎ +³gš8Ñӌh+ÓªkùBµ’T#×j k½läšG¢œ[T9Û†mF·•mF7;Án¾Õº5]·Ð-±mr²i%²UäZ³@­íõLę6Y‹‘fÕ²@’mYÖ v%*Ì”ñÀ?†cõ†bZ½WºT¼³a b(q’%–í+,UŸV¼,9{q‡ÃW–œ¾Ü¾½ä®7ý"™ä É<ƒº#Ž¡‡ªµh´8×ÀL…Á+0ë =`)›ÁÛ˗¸QÀ #nÜâz<ȈšÑ¼9°ÄƒcÁ¿uþ ’ túFãJ$N*·ðɾoÍ{}Õ¾·dvîæ}Zì{ë>ÐÂè÷ D›ÐûT´Ã$4˜‡SQAe ¨m&ÔhÀätãsTCž+LU¹ÎC&LÚï ç ¦¯Æ V˜Äó˜•ô€€ûoõÿ5·ÂL3æf„‰è™¤3_1ä0ß3md.èÀ††Ù €¥æƒ:F„ é…À¨P0,̌ C«‘þ(03L óÿØ/·Ý8Ž# ?A¿ÃÜ°xÑsè9¹Ù™Ù58Ž!Lj! q-3×EÁpž>UUõa¹¢('€|Ám.wg¶5]ÕUßÝ°@9Líè(…õ- Â~–+DÄ2bP!Ѫ”Ø«˜˜£œèKA±XR€!#8héhßӚ¬Õ±I5óZÝvZ !ü\¬‰V–KTà`*ÃIƒ)F’Å‘Š@§A„Ғð‘ài¡÷P„34áUØ"^8ZfU†QâÉ*òP£±¡‘aqaQa1!1ªVl3µ8;ŠŽŽ‚& +ÆþïÃ÷êyñ»8½šqUwÃÙÞ6_ŸzÛüm'Ÿ‹7Èéâvv<»^œOàPz¢ C$H³’Ý =¨ ÿoí1~èµÏ›ËP*µºhyÀ¦0>ÃJà%pØýÖmÈÚ¨m:ÛF—`í «ª“ãT:T;÷ÁzäÞÙƹ3»VìX‡'‘ù$2÷Ÿ@Rœ{}z†üä6es§7þ×öÁ spxéü†ÎÿXùÍÔ{|ÔíPùª¦·¯š*ðuýÞ=»xL×ù-ÏHɤâÞSŸw«­[“OùᾘsjBˆ‹Å_»l¦÷öÀø‘’~ñ¼šo',‚.}6ÉÃÝĒÐOlj3uÖÓºŒ¹9v“}òö14“-÷´A¶QèL³Î«{¶ý:\ìŽW_Ý^^]Žwrc>¼¾>Ú­/«Ï~8/oWÕk½UµÃçîì]¬0_Q°üÑQë Zۀ÷¯å÷­õ5$ „WG)Rt£ h‰’(«‰j¢&(,d0L‚‚ñP‘Edƒ¢ƒ¶ØA[01Š¾`…1PrÁüÈ:ƒ•ÆJƒA’ÕwåUÈ ŠC¸Ò4Ç̳Asôª9³jŽ­jQT3Am"7Hl8ªp¬6Xo0kFÍÕÁºƒ¹S´«Ñ¢@˜BY…°iÁ£Ô$IÝ Ñ©K[ V¤mµñ^ŒÚÀ,š£C ­ƒ ‘W[Ío™c‡¶jwÏ ajÿ~%(½îgfz"§¤$¬4)+1)íj!¥FI©)1'1)í‘[kpRǜD˜Ä 4;lÅ +N2Rj•”Œ•˜–VxKh锗Œ˜ÀLŽ#ÌÄÔ$ÌÄÄÄJֈ©FØu ¥!Ғ±R Vê9È)ŒgGñlœÔ ˜’z:[P]d¤1Ҝ‰OŸ!’ÃÑdFbJZ@I+(I8©'1)õ ¥ÄJ+gΠ¥ك gñ8HüHÝÓ©§tѶºÝB>-R;¥\ãÜ¢KXwp5î­ïV"/C¯¸ó}ÔÛå¾tøzœÐïáo` 0¸ƒO„G§0qî­#ókOи³²!²ArãèCIYAY0yUPN˜<”“ ’;@²!2;ïà}ö}(ÜÎ`œÜÍPÌnž‰ÄæÞAYxffvÈXŒÂ Â#@x…ÐÜ+·ŠÁƒb°°ê¥L!99Fãß]þypÂ÷Ac›Å~Š9v +ì {¹ì8d";v(B€œØDš L§¢qšãßZ¼óƯZ›w"–WZµ-X@m҆b¬­×´uÒˆ›-b¯¸¡^C›Ám-Ú’–Ã?Ž=ð!Kà)…ËÉO‰<¥ò5; ‚YJß:ËêH)H2h‹d€t€l`ù@2‚䏭h\–$- 1-lµXZH‰¡ÂpUàÌ6ƒÔ‡±¥± Q¬à ½&‹š«j' ©ìˆÚœOYlÇ òÚLÖó㏴ïì´@qÒ·êw4÷[ׅì䇝h£ÙM=¥Ï‰´¡ÃäZqÙQ†å×L†M0tPTï€èô`t¾/؃mÄòXÞÑÆÌg0çU€yŽæ¾!4w|x‰ÌË×æ†å}ÄrrÏ1($ß*”ˆ-‚r‡p”þË·óQÑ<ÎÏ9Â}¿ˆ¾ DNÀôÁQßÇ¥£ƒÃå¾±ïq¶Vœ3†+6tTxtoÝëˆîw§ä>Ü‡HîÂí pÝ@}—ÁyŽäãÊàœvÚ<~,z,v,r,n,j$f,b(^.,*.‹‹‰’Ó±ñ*ݖ,4$0.FÅr"ւÄC     ‚Zƒ@B`vˆñ?K2q½W׋ã·Ñé!ê1sø=ÂϽ‹Ž®ÕÉ+,.Õ½¢ÊuíNõXò©ø“½Y;v§º2¹Q\hŠE“W™´Bm)Ü9ypA $Eª…NËàKߨŎK\«ÍkýZµNmQïi_ÀA´ ˜¡v\ñ(~ºêÙÅ|ë^:¿áªPùÊo¼F|iªšZSuý¦'ÛèN ‰Ã#¾wÏ.>bÄü–毩Ðэaô}L¡™xd×Öô1b¬§‘ÁWdYZã£FÑ:óêžm¿»ãÕW·—WׇãÜ˜¯¯vëË곿ýt}wøC5¿¹|õ¯Ï]y‰9ç+Þ´¦ÄS!yÛ\p9Äå WâÜ}¤¨S¬sªr íÜE¼‹€WŸ…ÂS(<…ÂS(”¡ˆŠ‰ˆhH>ï‘Íù_™”*ûMX*ðE1ê䷇¨‡n\|ûóñ»ÛëãÝõñõ_d0”ÿà¾ý7ÿÒÊ/ß]ÞÝnDIÛÿ¼»=TÏ©Ç[‚¤üªjšMaÔdá;XYã™|õâW\þ‰¾þ“nþRu՟«—÷Õî¿xNiž»Â„ßÐUœ9]¡Ã7Å8¾:bÂç`Æ)ôL‰¶]•vìÅ6šæÍ´z3„êúÒy[èÆ®:º +¸m³é:?U¸‰õðí§«0Õr£ËÆt6÷â‹~¤IꮲCo“áw³up3Ú d÷{kÆ=ÃfÎ͍֞«÷l@ìh¶b†ÌÖ3^ì þÙ Ô¹°ÿ¢­­/mM®Œ#mñø6¦ËíÀ>ûÒÜ%qËlܐÝô™¹qº·EÈÝؕyƒŠ§Nâïí•*-Á•ùÕ%Ç`°¥p£mP²¯°8®Ì·Ñâhð©½6ÔF”^ÀsmñŒåã; lP2®07ƃtö¥¹)ØâH[<ÙgƒÊȔíö¥Å™ßÇ‹ÓvÚ ÔÙ,NN¸±+ó.¼Rû£lêã&چõÅ´}6Ùc=¿\ÞüüîÇ7—¯äôìO1´ô÷›üÍ£oðIs°M˜Ê¾Õòðú™û›Ÿ—@–wa",¦ßûÄ­é};¡K8Xï&›<®– ˆ6ɦ¢×¼@hiòÁku²VÇF ]PŸÒ©ëº).£—²F×o†±mN®lÙ42-^#/UÃã›É^Ñ×a Qß5ߕÅk²ãOÖÖ«n3Ôdô´!ñÐUÍfëÖ®(#Â@>Ð;5=\ÛR†ù/çՒ$Ë ¯2' +–o}‰³´ÇÞ¼_ß©oÑ]³°½™éT!ú¤D¡ñZY³ÅÄ"‚Y:^N²ê»䁩–kƒ¤t +Y/êl|­wðè±^D ÛvMð\täru€vBí2/Bt+½ãÞI¶#B4Ë5˜?`= Ó¿B'Þoæ¢uľ7X1ñ²|ÀýNn”Š:ëÐÇÜê¸í +¿šh—Š÷äG„¸ÕÕ#G~•)a‚ù`›§LÀXŽráᘻ%>L™Û„¼Øø¼UÊüâ4J£=ñẐ…w±ÇB•>ñŸEajÅsö‰,H™' +1˜¡>S-e–Œøש¯<’9d‘ðzLzà£bRæ%…=øくŠ ‘—l„×ë9`ÕT¸Kÿ&MUø’Œ.¶p¢S•ü[B\ݾUîÓ(¤£(@¨Æ ä@!øpñ4sVÂÃà%m`ÖØý|2IÈÜw8sL$Ú;>ýŸ2 r†ûê¨1¶¼™åKՉR~à#—R¦ù¦kæèO|¤lŠ<«û€C6?ðY)óêéÊè㉏ + Y2 :­ýÄ'µ„ÌÙÀƒdáЙeldÈÈÞ‹;Up\³}'ìØl`æÂ6+÷…ŒÊ®8oŒ²¤ÌÞ1öF†ºNÈÀæÉu.inï·\Ë<2 ĵËíNÂgŒ÷@½ì””¡î)lšó¶Yh‡¬aìF[  fz`Ú ¬hH!CJM6ë·t¹wŒlNE!Ã,À Õ< öÌ=l:)«¥ö…³fçúÀáçnVQ+{®n· h¼’|ðŸÇ?þúûϏ_~þüñù»ŒŽ'D«Tƒ%éHzÀÿš!c“¯ø ùÍL~ÕìÇï—W¡–bR”¿ßŽŽ³h Ȟw±#úÆ£Myqùñõ*›©»€Îí4òò$„­ ÖW¡æ›ÙYüÿ4¥Ã¼Ïìh>‡V¿›ÆH;,m½T¿ °ÝÆ\[‘ñ¬Eì,kÈÒºbô۽뺗SlõiÏ)Þf0˗ƒmb”5t¥c7ÁU_,<îT«Þ‰/ýWÛÌÐéÅÚ%V±ß +E‰N¢ý5ÃÒ8á<”¡Þj†oáÓ½úŽÏzxª†o˜rl ;ºj%7Öß>Æè±*ã\é¶ó¸›LàrÅÍçÝ2%qé â!kîµNkJ&Œ)s¥ɱŖ+3gú"û8üŽ*sÔK&™ùGwKEM-Û5³,T‰›ãŠ‡­÷X}E!'¼¶2!m@°±uI“‡¿:É«‚Õj‡o§­QZ +l?¥†Ì¥ºShÑòýÈ:qœ$rÎÕi×}‹x•Ù|µ^ŸdÓ^¢$¥gAëió× 1«ô¦ì¿/֑ÈjyØO/ŒVÍVÚ¡æ(üà=í#õö½ç.™¸vÞ6j‡÷UWCk¾#±šJ±M{ÃW +PÅCڒ¤8Áoâ:ŒSj:^Ú·äC-·‚ß.òJZ8‘B•¤íØЀGM3‰[æª/v>hU&ñn³…Hüü‚Ëk yÄ( ’S0‹‘$ŽXí—Ã8xڇQg†(wàl2Â3%bl˜E–‡Ùg3$TO;OŽT~ÁäÈÒよ¿ŽödÍÌQÅXiÙRûÔI|mÙåÀɤ[TíøÔvh£S"®´˜jS±oÝÒþ<Ú¿‡™®Vÿû~`΋FçƨÖtlÂÄl‘Ò×X›ä ЉŒŠ&X©µbCmñÚ'6ñÕ`•ÜJÚ M²ä¹¬j/&dùíXқµ{¡ÀÚ­O%¦™%·ÕƒŽ>­H™Pçÿ qà$ endstream endobj 11 14 obj 16421 endobj 12 14 obj << /Filter [ /FlateDecode ] /Length 13 14 R >> stream +H‰œW[¯VÇ ýßØ/‘ [cç–7BóÐê” ¢¤TQ…P ”ŠsÊ¿ïòeöåQ@Éá›Y{ÆöØklÏXs+K®KNëÝFyùùòÕS•5%^r[+g|ÂÖÿñ™®°MDòªŸ}kL\â/øKkÊ$ ~hTü ÊmI á¿´4ÏóJM—ÍÏäÎܶÏ9o±šH^KcSíGUÅyÚò©~žöÍí§üyZÊ8Ó2æÁ/iGZŠœy‰ r$æig·¨9Ž›;å wgçÔ_Ï;Ç°SøDOŸ߄Ž'†â`;Eá¹¹G‡Át̛ëyJÚ3É$ªëŽõ»>7b âù1¤9MLá:¶ÏîXæH>nÌ©{¼(ÁëyåÒAp¨ßϛo‰öcö\²Ç*Žç±ùÚ>¯¡ÍÁq®¢\Õ5²<,¿'Ï#ÈÉú0­Ûb» [¤S˜Ç*`î bAra>‰»fzqæÖ£Ÿ›üÛ­ÜNý¼åéí +—=\ËqË.mËúæì=ëÓ.6qS“#tÚGg™~¬Á¥ØARük‡iQû®·±×Øbå2¼™­hÆĔ[±Ý{Ò,¢i–V:åÛ5¹Kr;TäiÔ)_RëÓ~d…É3Tû‚åT»N剕•’Ò­¯}¨£dÍ%YèG-}›ûåÇ~á}M]¹õƒŒ9=ށlب£-› xŸËAOÌ#¹-sÍn¿Ë¸užé†.ß^¾ºÿ·üôۛ珞½}ûâ͍ϿyñòÕM _/wýþæÙõ«ç¿Ý½ìC#°Wgüaï,NÊV.ünÓ¿cø_€ïYþ±üôï´<7üÉc+àîڐs¥Ã)ð0óaüÞØöï,†Ô»æuâ¡×‹ï5|ÿ³€N–†]¡Ðt§à9þ}}2àõ¾ðõF›´é5~ZWxûó[íÆT ð]ÙA|.â­Ï¡Ôãϗïß¾yõë ê0ÑêIciy)_F*ßïÕ2Œ4&mŽðõj[·S걧§Ï¨©Sµ1çþGˆÔ—÷. ÿ_»|ŒÔßÚEçOþïæћW7o_ݼ¼wÏaóÑñÃåá¯ú¥û—oÞ¼ûí?SΝ‡/Þ/1A•¸{IËýË»ËÉÀ»Êu¯u¶ô×:I¼¦6ȑ«3’£NÛ®Ûuc|wI[IH^° +MYÊ'q¦©Ih¨í"àÏ[º¥ø¶«[‹ûZ+ø|u=mG?hŸo-4KO ê?´õêòËå‡ËXîÜ]žü# +¢x +ɟŠTù’HeÍß]ˆ7’˜ïZ嵗&øê Wt;×ýê,äð.Dãø—wZþá|irµ¿Èò©e×`F¯³l(Ô¥He°€ºë ”JËÐZó͂†z°Ë&o›JÙ@´ÍÜלpGMÀàUØð:´ƒPPà…êX‡Y†5qq°1Ä?¶Á_J‚³©©±=¡=6PÛQt#QÈÓ¨Ô— ÜXªÃµ!¯(ˆ7Ish*ï%@I9»ªÖÑóšV¾÷ž›ÜÖ2HÕ,fºÏä'@¶¦âÛÑ倮ähQ¾*ئ³°¯Lõ@­“‰ -}|ïe ‡±§ÚR¨G‡®`GÕȶ¿à­â'XJ­.pË¥;܆/eu[èª –(ˆFr°à’Å~h`‡ÑÞ°;4MI†Ÿ +’́§ê±’4#PǼÇÂ:LHH~Z„;‰y¥!©FF­N¡Þ «¥ìK«t3 ˜W€— ¤\ƒ§CCZ ¶Q2S•Œ5 W•Æ0¯®›V_”ûŸ·Ì—´:ü˜]ùɨ$9ÀÑkD¤2Ñvöœ%\G3³«%¢j„| ŽO;ßý‘Íw-¹X +ß%gŽÁN> 7P\Ôt^ãáh•dçl×Þ ¨ðH8g)Ît¦z*ߏk9&ÌèXÃùJsüÌËíš3 k©ÌÓãž 7´ŒÜÃSð´ñ‘ö#áœ<Á–{vחòG5½uk×p·duÜ<¸:µúœ¦÷JrS ò[¸?¯¤Ät’Ç%‡¥ˆÐä>ގCl­àž‰{VØUé“FÕïàL*ôØ!¥r•c¸"Q9ÆQ€Ý/.‚ÙX-¬½K[që²T…›÷´>¶Z]?¥® -Ž<êDÕAÖTã`kuªßš¯…µ‹„(úäÉsá̝衤ZòZ8l\žB…ŒPº¦±gÿFmÂÍ+%@¸¦¹·¬ó»J)1àªð€Â“.I+¹cŒ.'@æ`.9y‰*=<ØÝ\$ÀÁálË +²ê§puæºé×j3S£ÝD±ÃØ|ˆ&ˆXU»™p–P ·f² +€u‚Ìa"ZØmIVgϸjÃêaM$«$-ܚÑJHý³`Í°-t՜,×jûAj Z$DS[ Ï špµ…‚[$sªk´€ÐjaE&·2ì}v‰mÂÞ¿(˜Å:(©lá°®FÁÄe€!@$ː(@îD}nRÎ}À‰æZo"¡ÌŸ*4çXx`éáÁ¦…ï +ëëBA¤š'@7,%yÓ=˜¥NÉ5z0s¶îR—Ž8„öhõ¶‹©(—p¶6Ké)DZFþ×Åadê€ÑfJ¬cö¥v]~ŒµdC“ö`Ž ú„h,½SsfÅò¡›•§·.ânE䐶ŒŒÕ´Ç’¼ ž1w‹vkɒSëÛ-ÔÏ3ښhgk~ n(C¢ì½ ›§€‘ÆŒc6†JRßOš•[ìOV44† K4qVüÑÓ¼Í{쨕5ƒ­)ˆ­˜Q2ÓÈñŽ¥MÏ6Ô«º?îKŸªo½·àšð(ӇDCzt‘÷‘×_Ôæ ¾öÁV6¨€ÅÎ"-ìTâ%ƒký½¯ü%“=/{ۗ½î,‰£›IÞc¾Cx&‚™”´EËrò'Nš&F=$"Þ¶XI3㠏ÿŸõj[±ë:‚_0ÿ°_ RHìu¿$O’ãÙ1 +ÂcŒYak÷î՗ê*NA=‰$PhƒXŠ5rd‚ËK#ö×>+ÎZ-Hœà´¬-Úñ1UÎY\pÅ&‡Û•IñûtÌ‘Ȅ‘ÈæìÔ`¡ +Lܱ±1{)` ÌÆƉš©_OÓJZKÀˆP_ òðZN–)á(Ž²&6Be4¡H±åãÏïd‰Ñ`X¯¤ cn­ŒNÀ1ÄÇ܉Ùá~C¨ÀYßFÁ—(Z+}÷öŸ5§N¶m•BÂw¸Mð”c¶péX3²3@ý4YfëAòPNq´u®¡eý†n¬,Ü7´z膦 Kêë•ùTmnÂfP`þIå,,hb´Àïµ{íøöøñ§t¼‚õùS‹Ü KšdïDRǬâOîZº1èF9sóäýVúÒ£ùþÞ\RŽoE¸J Ðo|µÍÑ?ÅÊ!òMº6h y©%0«{;Æ(5¢QLj&ª.#ͶÐý0ºÈw8.„"×;^±áZë"×ÀJ0‚yP#ڕ`çÝúv¸÷JVØÏ~þâÑÕõ¿ß¾¼~ûÛ勫Ç?azðtaÆ,/þ{}õöòÍñàñãG/_¾÷ô·ëvöáñwœüþT]3Ø· +eš×22rwŬ=¨l㐛ñÔ7uµ-Öw9Ë}çeOþº{X RhÀrÞ_Ö¦ˆ°Êuªt 29K†m-'^Ð5c“5é%¼`‹¿ÙփxUª×áŒÇѹ ¯°@=µ4“9À¸õøƒÿ«óÞÁª#°^Á˜Ei“]÷ÌiǘƒÆ6ÑßÄ ¡VytÙ V§x +ȁ6á(>¼w<†·Õ¯ÕVÄZÁ»@ǺfWtÜ{t—õÂ.ÚIž836+A¡[Öþ<t6P·iõ²¢riQy‡{§á¡¹Wƒñ8šj:Ø ¼€°^Y°! §*€ÊÁè¶:£ÂÇå¹ê“Z’~QÎ+ÞÖXC{žÌÄ2PtÕfº·2VÜtœÏ› SJŸù”Ǭ@¤èý³:݀¡Ç-—K ôÆ5#Ɗo2ܬù®Íޞ5+FæêRªg§ì5Ÿ¹ä8˪ˆmØhôïO3Ú¢¯®W•îhÕE!iŒDOkšuÀŽ[‰i/ ?2µÔ«#Óë$tÄúŽºîÏ!ƒV¬©‰¶FHVЙÐî¢F]aÌ3o]ll'0Ø-þ)KL–rÐu–{{|f=?ó>™` ~ƒóùµƒqVe¶sLÝ蒐Fh…Nkí›Æ蹉ɴœŠ¾ï*¯ç ÐڋôÉ°ÄÀ•µDZ—Á£O²¸nzc¼Hz MŠ-½—1ñÒt•\Ê΢L¹uÓ=ÙZÏ«RР‚†´Q[ιGç\³-¡Ðú°õz¨ÜÚ]ñ[†htüõ7#c0ŽÖÊmÐ7¯: ' »©ç9xÕQw@ ëú[ü +Q{¶E +úÎB&€+¹Óg€˜wÉRÙ²±ì§@$¨ÜÊ°—‘†5E+2³nðÏLfã7.2ó4†WŒie)DöÌ(’¾Œ¹/ï|’\¦Î’O\Åî­ºãeâ¥0.ˆ7ž¤ÊŒÀ69H1~&imq[·,^+u.}rfËÜ3—„iÉBìê»JV¾ÁŠÇ,¼•ƒç—Ò>êœmµYT²áÓï?p®¬L›_ù¥¸6ö¯ú¾×ZDvsa‡¢0•º,é9È.êV½Å-ÙLà´~9 \þËÖÔ@N5ÉÊ~ÃRfÕó؏›[l=ß+aL)qNPdm mÔàæ„A`ƒ5ÃmŽ™´­ ü&ƒqÏ¢µ–‹´®vG üÄì£òšáόìÂ.–Ï)W¾€ö·Ãí.ì8ë ÄrmràítïµtßjèÃeŒ¡4j93“ßØvِ%A:ñ“öû†ô9Í·X‡9'Á\d˜ÝPž\èÓ·) T.7’?@8+Ø6½[²,²w¬–œAj9¸Îøp£ÍÕ„/³Ñ¡ã3bäâB'VŸÛgìp ˜tcDRà'~•&ðÞ¦[ĸ¶à67Ÿ{¾Ž*§! +>½W\8‰}à±dۆ÷u8edx;—”!~p2¸ÕFÔ-ú>¶L=!Aàb36bâÕj„ ÿž/µÓтƒ»csŸMãóE6à*¹Î\Z(à+ý†kPÅØÕ®:+ie,;¼Þ̀2cØÙ»/€n25¶市Ey ^Û5£ùPÿÃ8K’cp$mê @é®ceZŵ k\À6OúkoMG1›Q€^ãݦ÷Æn—zv±ç?ÜùôÙ£¯×Ï_]¾z|õþ÷_¾q}ýúê’Æǯ߼½¼c~ðÝ뇾e>¼HÇ£‹÷ø?Éÿ=ÿˆ/ßàï0}8ÚñíñãOéxëó§ÿç¼j’î¸mà t‡ï.Ar­íWåUàR’•­E:?œáð='%yc©ÅǁF£aÒhˆÝ ÚG–®ù¼0èóù«WäþÕwå÷/ÊÒyúa)3üYMxpØç´°›So06)Ô +.À'•É3ûP7] cÒPL G}ýÉIÉ3̾”öY"ʸ࿟ð«ø/P¸*ÍA;ÅXÄä|µ‘Ü–Œ‰yEh‘Û¶ +·UâZ‰îqŠû†±õF0Ô3•?‚[Ám I¸M£dó=`/Èì3˼œIÍ·´«¤ÍUÂÖ#B²ýÐÃnà\o5Þè: υ‹ßà +d†›é„+‰Í÷ڊ?Ei1á­ùU<—°TsÂ{‰|¶®‘a”ýFYa‹:ÊÞb“µÉcúÛbCí‘Ìb·¦N)‘,†ïOž!AeèuAŽL+‡GdžK– >ÞòîÛ{:þ骳ýC3 £ž¶Ճ¨íþàMT€ÚÁé€'$áÉT;Kµ>™ÚL$yœT\4üãMUD+X$ŸT|a<¨ +ËJ}PUÌ8ÄÖá\řf²~ßî#føMX˜’ùä+0ÁòÂW³:!œ7_•âÂbEõMí$,^Qۓ¯ð&TƓ®ðÔK;éj¾+6¹¯ÖÃGÜÆW$ [k|5X¹?ùjÉꞕ¯áœÛÉ×v»×›°-v¡·üûöž–/|EÂ|ñ;øªe ÛÆW½¾wÓUÁ +óH]_ú¢«š-ŸóIW»´§ÄltU¯?éŠ`So¶SHÄÉVÀ#Ôäf«ùdŽ Èيo”ÙûÉV„ÉÜ瓭ûãIW€ÓÄAW¸˜–ú¤«Ù ÎzÐÖ¦ŸtÕ$䃯ð…½éAX5K2ù$¬Åb.æAX+5{a‘™¾°jkµ'aVêóIXÜ:‹ðIX+Ë }Ö"Pšoøí=1_‹DºÌŸŒKß6Æöûƒ7eúô;( {\ú¨OÊÚÙ:Ɠ²¯Y¾QðZ26ÊÎK!oÎږ¡ã¤¬-!!(7eQHͩ씵EôŘï†y~RbéýIٞnô ,\¸P™e;Ña Gi©peÍÆ×P¸›²æKHäMY_Rã7ÊÚV¥³”E _¦6ʚõ·þ<(k°Þã?(ë;^ïOÊ”Æõ¤,` yRÖØVkÿxKÁoï™ùJÙ”zR9IÛ(;îޔȔ#y£,`¥þd,0ÂZûd¬]ºFúÎX$ºú\Û‹¯.•Ü‹-ïeÆJˆÚEY<…°ޔ±Ï”EH‚I÷¤¬- Sړ²Ø•|Ã;(‹Neð¦ì@ʺ“`£ìx1°†Òa°Ó¹Û~°Ÿ¯þh.}Y­ÊLtÖÅ:ó$«’BY­0ªY¡k›¡X\E=ú䃫@é0‹{'WþóØ0j¯üÇ÷ïüõ¯þüB ¶XÃ&d{ˆ? ÈçÑö]çóúÕ+â¿úþ¥„ñŸØ%Q 4XOH7º¤ð´À~“žÙöCKEÞ|Óh*7X!¹µ ÂÚלä¬V»„K¢ôµ»Ö¾Òµø뗷ðgÂk1è¿qê{Š¸ÝÄN¨ J¥ú‘ö”Z×ðº–bo[û•Ÿ¤šÁŽ2ã֗Ç~ Vþ°‘öÈ[’OòÜQÏe¤ì™»—hVî +\‹• o90@g5‘uŒÝãQÜx¥…‹6¢­­sleñŒ΅'Ai{FB¯ žðgÖo“:Uë* ‹wˆZ‰Á5SPl%þFÖeqYH¸?’ÑÁ¹àÝZ[èØ¬ °yãšS®©'¸Ê©5¼>LœùµY)|Ö ‰Ù°;g7òùÌbÒÔ*sÿûž¤Yw م4ÇX?,>…­#fÆϕÒÈÐY“ mÊÇA‰ß±îß¿è«>ê¯8+‚9/,ñV/~ÁÖ’“èç%˜iÄ})Y^ñ7ð}Ç÷°[Ú¢“P°Ü”hT#ÖHS¸¨×TðíÚ<‚ªD}ľÑé㇟…ƒÇLÌ= ~€³·[Â¬³µ¹£bÛ B¯ð1¡ìf¡Ÿm6|ܳûto„fzëz'æñè8 A‘1#´"Ícp™rËýˆ°°mSÍ{©aé(¾Üôý"Îbin7S= úl†¶Á‹¬£Šwz•”¦p‹{4³˜ä¡™ãl·åâ•ÃîÝ cÃà*×Ù6}`±"˜ðgaŽgäF'­³hþé ÛôWO¯YÚ+lKT[éµ5ÆU‹å?îÅT}#ü‰g–Mmàk ªÁýú½ +ƒÝúN˹úµ>ó¬ðð<@ʸx)~¦`|ÆYx]1T€)–5DÜKx*€\P(&ɸnH̒HºÚü󜊱GÍä»ÑE~9§‡šoÍÖ¯“á1·JޗlÇÇÅþÐ%ρ [eã¤-­<ˆÁXuÖ%;1†;\H¤¤Ïxº"{¾{f=Ž¢wÕ>Eè֞ïA ²ï®r÷¹"5Ù²Vjzg"X—Á&,œö+?k¦ÁýèºÁ0³ 5hA²j"îyBIÊ÷q‚Óó + ,ÖY"ï*#D¢Êj:µµ¨dßö^Zæ  +‰¨­Ä"FNŸáÕ}ä¿×Qú.ùÇÄVŸù®Z…£þÕÌI¤‹_ʔ^F¹›ù*tÒêJM§ÄdÆw1 dÓ«$+ >8­ö0Gë<èФ<+A—iù {1ÝÀbŽ <öU+Ɂb„Π'czÄÌÑëõiPlâhr€×ZÆNÑEWÃ}-ˆ™öq‚*CΎÐ(-}áÍÙë-m˜¡iÖ­˜&³µóhk+©&é(bˆó=j݄3ïY¸¸çcos‡ÁòÇ[ÇñÖ ÿÀæÄ\ÏÌ»á¯aE«ÎôoTÃ^ J¹â˜Vΐ­³C¹›Mq•<›Š +ð®ÎÂgR‡ g­€ÝK!oÎZ˜/ÁKQ+‡Ÿé{I= ›+‘Š)y¯ýŒÇ/Ú¸ël‘xDäs`eïQŸyåÆޚ%ª!3lBæ $ʾ¦¹y˜É›àÙn˜Pá5jÈÜBïñXúx‚^ëh¦Af‹‰Li÷ě3dZno)֘Å(h€s5Ïäɱ¼”êAˆ[rœÒúÐ9â,J—aš+„4:a_ÙINf¢K{x½8šSÊC€×Árr¥{Dϯ yÝZ–dÒ›&qEa¶ˆü—ýjmëº¢¿`þÃýb°K;9ïGûIJó!aB‚ƒ¨ £Jªc#M@‘0þ÷]ûu_3r(µ¥Y:÷Üý\{m;ÚKkÝà+'#[a†±žEÍÕÍ9^K}†¦][€ò +Þwu¸Éd±ôZl@wjWŸ€p]ó‹y¥õ黩xâõ&J öÚ 6/;K+ªä2ÒÞcJtÉ 5׃ĹqRuƒ‡1Þë$Ö¤Ž%?{^Nö•@Ð e¼Ôî$'yaÖˆ®´kQ¢EÊ1“þëjkŠ,FÁ60áU€È’Ú ’…‘xy´£U&‘°RûRš5‡ÑX¨¶()çÙH`iÆ ‹ÅîEQU´H—".ÍÉþ:/¯)\D¸Mæ0@ì_:r O-°½zm³Ü›dU•eèk7ðY‡@תMÂ2‰@´læ ™i½ê抵rÄfTb¡Ïn6¸ÆÓ8+ÜdÀªÏqVËr”$*W8dA“ ,&.$€%ۂçiïèœxV¤ý…»^žïë(ÌØ£€RjBôk…OÏŒÐ4ž8¨…>jhŠ‰A#Íè HxÛRÓÂuȪ,x˜Ã…¶:A^*X- +ª-fíiVrš2Ê ìc҂Ì'ÌÓà‚™[e’¬¤+- ¡xJ0¤ì(š T&½ Rλ0uoL™Ïöaõy‹–îëÎiAȅxŽ7ÞEªºø‰¿Zãìê1Zo9Y‹c4#—FC¡SiÝ-'.d¼ã`O#V…jÆO"ƒä©²Ô¡ò Ir±yqöm{óÍþæüáé÷_¼z|¼}Ø x~ûöÝ~¿¼Øï¯îooï^mÜp¶yÂÿ~püuù¾Ã/ï}Òðýðó/n¸zùZ„æ6³÷øAª§v¸š]2l·Ä‘!Jx7{ö¦Ïîa ™óÆÚýà Býè!Â'RòÐûò=\^áðëØ>úp¶ñðÁï7Ò"=J6ŠI&b-¸QŸ¢/"Zûn ƒZC²ÄM—Ò<wÇï¾ÛüsóâÍWgwýøî·ýÕÃÇᯀ^þr‚ÿ½¾úéñáÝþíðòüüìúúéþõoWtöÕðgœü¾á~ƒÁKôa¢üÁ…J±À›Êê±°Ò,Ð>ºò5ЦÒÄzh°©3íAÔ,0IN^&+"`WŸÎUH +äNøœüéäqÀ( „ëw8p‘æl¡­\D‹°p¹{Þó£Î½ût>Æȹ@¬àhü’Ç®:Ê }›& +ñ³ÌĆhoiíÝÂécn¬n=_ŸÙ¥x?ZãÄ uޏK+H«’zD£-ǬkÍ3Ùä x|Ò­ã]=ZÜøÇv^¦­'g•÷ãJˆÙç¡B’ªüîé\&è襧sÛ'yç|'OºÇ¢G êÇtÆü~óÔd©Ú7u·viw¼6wÇrw”ŠV‡uW°qôdBF,!¯mmð8ŒùÔ>)ÐSÚÇËíX½õTÕu±éÃËWÃå?¿}™F‰_ Q†RX¾6Š‘)^†ìFY®Kënùè3ðôüþ™XU¢°ÞÂç©<ÐÚ8ùè˨sÛXÍ =¢4k¨ËѓƶT˜(´–µÙ#úÓI¬kñÈmDÍ +•¬'k‰ÆÑ.®®mъ•!+C¸/¹LèÝ +łéKђŊâej‡Ñç­Û0™yž.9IT¾´ÄÓÉpŠnF—?«îB“¸ϵmjá°=¿;¸ñùê†*n;ÒgV7 y'J®3ã©N÷6e&“,vâ ªß×6ƒwKxaz¡yú9¿ùØü?O¯ü×)‚𧧃qÛ8"2nG–ŸP¶JJ%D³ “V¾Ò DŸYA`{ ]ÖÛ˜iŠ]oÖp…ðг®]:n0ÐEí#SÓ ° u¯cQ.ˆ. >†%Xi^_ëûC^fК0tñ +ï÷ïD™ºæŠ¸ÚKè +¶ë d£Š°<ë·9òFƒ[£®ÁJÊÔ.0ζžõ¬'bòÀÌj)Æ(¸-|Mgc¯I00Ä0sÖÓK¯Ë³[ðjAs±.A ¡½ßõîGP_”œžó±UKpš¾N l+Œ³ "MÏϵ°`꼝A3ß`ÿš]"÷\%9æ-b~^k–ĺd~Ú-UÁÐêu‘9Zü!fj«xµ#,!'Ažæ­rd¼ÚÓ#·¹V¯ï©!rHè¯ì<ÙB™0+Ÿ{XžD=€ot’t¸)v]lSêµüaTô’½©QÉ÷„—.ÁEðçÆðnCtçl¼céò²æS^%•¼.e*ª»8æ¡Æ­¬\RoKmf©5»`‚­‚f·¸ë̂Å#`§ñd¡‰¾s^+*´w#_uðçžë° ̪¼t}œGïNDäÄå²¥:^4xÜ“7XÍëp*Yˆ&´Ôt4ù¬áÀ^ÑÉñ†õύ„Ô¶¾4A“221Ð F¡|rM(Ï_pägg©7BªË[Ö¬ËXÓ¨˜R¸úÉÔXåh°– §À ¢bZ‚D˜è0ޝÂ1æ>ƒå^_²¾K+Šz6jXÊ8}`löÌÓ m•jÔt¡€Ñç´eã´°Jn«ÿÝy-œ}Ñ·÷æ ¼>l{‹ë³ ÔÛôÎ✁9ðZ0Á¡6³SɋÄõIÁêY(”«+«³•) ‡[¡ðÀB9² F¸z,+wg]0¦Éƒ å>ÜYh{è«ö$zJ +æÑ٘’öfªÆ9dAªÖ›]ӈĘV ªó}ÞÅc`š¬z³³uë]× Jׄc¥£ÈO¬y}”KOGÖÿyó¨…ŦnGϬQT^¢T,QЀ(ŒÌkå!BZ“¨a·zñ3ðøö“Dⳗ};Ü+ÁFقî ãYŠí÷gÑ1*`Á*Åq€@€¹^ëA@žÍ¦“„É”ƒò/æ_×¹îMg ¬Ë¥›Ö;'fŒµÞ1”´VͳÓ +e#NWŸê¬0Á8¾§qùœà¹?“ÄzÖKvÇïþoV6ÏuÓdI|¯ÄÅ4Ì°³^'ê ApV¸úDŽ]l^œ}ÛÞ|³¿9xúýׯoöžß¾}·_À//öû«ûۛÁçW7œmžð%饯ˏøð~yèІqà ÐË×Ü<«¶|b +N8WŒ\Ö_ÇѦ a·ì6{Üü’Ó–;³ƒþ×Rµ½ñ^‹Ç•¦[& ;‚+MêBEÒMޏaïÓ É…G被NCi4%fZS´ÂÊ4tkDNæùÉNnê •ÇZÑDž ʁãÓ>8Ýpcïö&üª{—‹²câï.3›Ð’GSòk-¥ÐeGƒbdž gaŸ:Z’ÈLÖ³V¸Ü{â~݆lvy_uÏÈNÖ®H5nۃs,SIÕ<Š§Gé¢ØÍÙÎ#»’³œjañ ŽF“þ#Ê5REøs¢y!:@駦!Z‚ûT4‰Ó/P2ÐÛ¾CKÞ?wÕÿ+餒,Ókºá“^5»vÞ6ð üwÙvq¡JkgémÑl YÙ˼‡")Q:ß1ŠA߁Ž>Š?3Ã?@“ããÿüøý?™0Ûß'L4V3µÆ„ѾÿvëaþùÊÜ3)twõx@ùß¿äâ_L·iGÕ>[¦é“[VÒt~?ª)ƒi›ÕEM°4e¹ —ªƒÿ Ažg‰{}vRçöŒÒ]³çĶž´ç¡åÚI¸¶µ.Mo?Ç÷{ìªÄ#éÊÄ×G’ßS„jË$ ?ÇäÀiÈ2dƒßÇFDúûDsáá–ÆídŒz$ܑu[{ÛÙð«!Iÿ*9uå?¸q)ß-ò> ù9& $V™^|3Ö!Ù­¡Ï@^Kù]ÈõYŠ¸~yû¼§D¼KÚc‚Ÿ*ñ¦hO~ê„wMóÔ_øÜ´ þ8 +O¹~[—§ +¾Vûë#}üX|Ò[´·¹þx)ëM”—2é¯Q&jCñóDð lŠ½ ¶Q(ã56 ¹’~,õš^ÀÙ§vÁ`¸VÁŠ$–ݦP3GЇÃìÊ¡þèž}­‚ð¡/)̟x@r𷸡  +&)c—ÅAÀÀF}‚¹Ä¾J3rC)V[$!§ò÷{C‡ìò­”§¼²CdQÕÕã`^ë,çÙ™éºuƒ>®Xy©×£ +VŽ˜_yÚ_rûš_²ºAW|ŸJy) ©ÒÛU[^:šCÀNù¥aÀ—èôëhûD–âՅ<:Öë»Yömh× €ãË̀m†Pòq¶”Ú¯I¬Ø ctoµ ‚8/òÞ:]TàA—ÚÊÔæÙD?ÖG»È¨šÇ:xË¡‹âª8Ó ÷÷âôð"Ùº˜ÀÑ1«yP.àî™6͟íË9mAp À#År +MDCŒOIr —/o©Ã­$î׉"bÅôŒ[@¹c]GñjéRe$ fõEÁ÷8µß3»mÇ\ öÔ)üí‚+T3Aä.R[Py]Dxbךêé3ÜkNÖYR¬Ä‚I76›Í~®hÜ=TݚµW‹Ä úÁ†~åDÔ>¿—jœ©>.N~œœÙ”–Œ9…þlB³MAõ·&¡º;ÈQëW°xK×£v<ß¡+QûF—Ñ­û.÷ˆ“j¿ª´uÌÕsƒZû¯Ï^ó»Õ³ae[]ºÌ­·ÖÎl‹­Ä3[p¿õzg pÉãH Ø¥[w¶èÓuÀ–¯}çN°ÖD·wº8ÐRë™.~‘ +ÉN—}ºçœŽl]¨N I—Ò=ªSÉñkl¥KÎI¡¿é$ û!„ëy†&ÈçYÖõ"t·ÙʁžÙ¼Y·¶0.¾DYÖO­Ý, ¬ç6N¾îIÄëâv$&ixwvWp+ÆnfãUK|ޢݝó)Y¸ÕÛª¤Kæ~˜”3/¯lR &‰NÑæO5óX[à9½–ë,—“êi¶µ0m‹8-¯»Î‚IjºŒËn“ãàmˆøVµÕÛ:qµ{¾F[uĝ݃°½ÀTM¡]÷ÐyûwÀæ ÖaÚ¼&ÀÒãíJ Mͪ9Ø=³Ûézl¸_+¸Ý30 +ùòٓ+;~°§çUl:FæöƒŸ +—1{cßËàËVàÁë‰ê«´%h=‚k]Z©b¸…xn; ¢pgþOpÖê«^`+Â?&ì&íiÄ£]`þ1ÿõn-†G¿Â}–µ×H¿zÐõö ëÌKµ/ÖÄÌj¢kºNõZzœEò3Ë`È6ôk¾ù±­[ëì²$›5Np Ã= O<ú±jg•·ÌÙbqÜ +ò­#¯sgŽdOX yæ Ôƒ¹éø[~ +a¬—0ˆF/‡lxÐ) üэËE‹¨ ”5¢å0§o]RÈ7–,ëÛÍçÈ´Ô™ïugÑ™ú!Û3GªdNâ}ÿ/;à§Õ|ɹÔïisÎÝÃ˺Ìo*‡Éñµ[vh`Íå0N³¥T´–Ã:ÁåÆ<}÷Ø­fñËýÅ:ÏPÓLË6ŽóQ‰òa1azóþÀ£J³áã7fàŠÂ·¤Ö²vÜ5MlC´Q‚É*fï†v(“ 𯆕bZ =†"cb—ÐCZ/Ìi6¤pDs¦ÓL0X$ØY ð¢]PÖ&ö5o%#{†5>Ë\dXXõçï[ãýPaêIŽò&d:ÑhÌ4¶ÆY }ÀÏé±™·³Î†Õd—*IÕ f¬±àÞem…˜ìŠ*´¡gÅh1/–²$FÁöº¼ Zƒ0m¬ˆ:ž?© âÇ*¬HUêYaä;XR‹êm!˜ ³UøD[>?§°¨7k°”Õ¸÷u«ºïŒTÕ Ò<¦«A)²žå® +ºHš_­œÞ¦‹dÆïä÷µJ1fci¦*”GC ’3alcÓår.òû¼”04™ÏDªÚð:òl˂¾iÊ'˜­nB¢FâÔr@¨yœ%IøU©Ö©Ü”ó÷© +¹‰îÐ|~Bü¬*BgM¼fâ¦æ„PÔ¦úP>ˆA  ëà·.kLBÚiê1@\¥dŒó¬5*A©Ì£¹H……8R +Ž! +¬Ci;©Z“nÌ­)[L- VÆ(`¡ÜÖu-²U;›ëЖTfr…i +E"hL ³3 0²#<+—)ò§E–L!œ ZG â.#AṬ‹›¦P×Îò¡,e›NÒÚ<=Î$P[7gž»ôš   …®!Oû6—ºj¤”t0g*¤‹öŒZŠBþÍ.3X²Øåh¬(l£™Vvo±([¡C´€—O2Âż¥FZ­ÁÌ÷¨ß¡îa!/xÄ.ûìª(Ü÷Q/£ÛéªLû£A<³h™C  !^ú@¤™"ú@•›+´Cïm2ó^ ¨ášßÚALÅ!µC a˕b~¶Ïª@08F?ôs¥çõáHÍ6<Ñù}J^›ÎãÔŽUK¶ÉˆK0CÙÁöK 8W°#ýÉj8‚*ëÕK ?•C l)˜îkèÍ1™Ø Ä쿲BúªAà„ ä‚ø!U/D<0½AìhuçuÁðX¬¥ßì‡>@µd9‚¿¤ì‚FC¨#žÐiqÄ[ §Š}I)ÛÉ°ÆÔqÉ`ä´ò@cmy@MH¼<Ш¦E[h,Û¶õAw¹ôß(Ò¡ ¶AýЇ —>0\ã)Œ¡Áâ!H(”/u€•6ßæد¢X󡜁*<ìՁáÛ©3­­ê²©î¡ Ùض:VXs}¦耬£²åa6K7±äAºÊ\ŸÊw lkºäô.=êå%0yRy F ]òÀ°9c[¤I‡:<ˆ«¦ŽW:x¢ +Oð_œÿÿþßsïh¼­`ñùyÁ¼9€ªxMë}{7°^òí¬—Ën]·†ŸÀï°'’ Ý/C§§ƒ»h‘"¨¢(Ûéö¤ ‚¾ý!ER¢´Ö¶}’#­óEK¢(^~îï}${<|ÿ³ 0:Ñ:0̺t[³  èjÎfvsü>å-V£:~¾“Záp[¬]¸œ¹CøÓãþŽŸáػ͢«1á2{7çŸÅm“Õ¬Žß]ÐøŠ4ó6 †î ?˜’•'•ÄrE$}ÁPƏâ²4ÓVó¦²òý‚ï7¸åÙtt‹Y iÛqµVû oºqÌ;¿îɑ¨‹c­´3Ô6z=CÃpŽáÙ +6æÄ0„ì$ ŠÂ‡4¯êÏÍ»*ÈÈ ¾ß`Säa>Ì]–’òbCR×ãj­ö‚ìºuÍ;Çȕ9âۙ°ÄäŒù™Æ@Š¯?(J“\\qäÞ0­…Žc—]5쏿ƒïÜãZÖ3@¦’E_B­×U»n\s³ï1v%ôã’LY¢rÆüLØeàìŠT]]”9|–Ò²ò°Ä¸ìªaü|¿àØú°žÚ0•.újí¸®Úu㚛}¡+ß\Ô˗‡ë_à·¯®¾+¿{º}õþã?þôöÇ»÷'‚¯îþøë4áoN§·w·[^^˜ÃÕÅGø¡„?×ÿÂ_¾‡_þôé?~ýÍn^¿nå¼ÍM U!õ&"ؤQ&µ’AŠ ç±|Üìx¼8ÁQ?>Þ%õ‘¼K–XQ:‚3žÎ…îR+-ç0 +'x¯Õø}<Ž|wñõÇ {øϳš,í@H]ЪtÀ¨h ·±m3=«@öa°Íõ«³Ü4Î4!1Šn…Fê}ç—JsŒ ‘>G5šbK‹:g2‰aØÖ¹¾\+I0…’Y&cYîw Q]p +Ò½pÊ­qYÛT_aÇDï0ãûAE¤'ÖÛÍØvo6 Ø¢ mŠ7„ºYëk¦Mm¡á ™³E]U¦¦R–µ¶òY‰Z×Ěå|S‹v,Ÿåe­÷ŽYâ13_Æþñ` /t a a9›¡Ø>°eeîʑÄ7?dž‚7œ]]…õ¥ ŽCŠ´©«na`»Íâ»pY²ó«¥Ç-”ÛžmV›X ¡…>ïÚmõ‰Oʎ¦Võ\&w‚™Å&%vl,ëZˆYÁEӓ²øÌý/x7Þ^¢?ÒVs¦&ˆ˜b7p<€J6ÆÇã¼ +oÑò¹Ù`bYº 6ñTZ/*bʈgÚ`»B 4ù\¨1Ô÷´—6¹kÊ­ÚeqÕ¹îoK+£pwùR¶Ùãf–bÃÕ2qYºÙ/¢Ø#¿~ƒ•þ¹Uúč 3Í´ª8%×ünMðÅj ,.þЌœ +ØÛæuÀ-Bj56°!F…é(oSå£2Å>˜eß5ùÂi‚ɑɐ}Ñ:¾V -#p೔ú +bˆ…Úý"Â)úÊgEjðÆÕSó«àŸ5¼á|UKá²¾8O›&"Oe56¥\0œíßÛBïŘ` ±,Tcƒ'F-#ß Žà¡Py-&ÌxÂùô»NØ¥œxm? +ÿ#ögR+ åû Xž U…â9Š}.u•…â|6¶ˆn0š"³nµ˜‹Œ|?–šþy,ÕsïP,ùPúםºâäk`Ç?:ƒûéïž/×ùSìŸÒK°|á”;ðQ°ë«£¦õlÞ-z(‹g)ˆScÞÜê M“ ræ7?™Z;•ÐE*!©f%¨Î¡ž§(­¢žþìcmàwx$–@*°~‡Ül¹ý°`m˙™SaÞ丿÷³ã[Võ…LkY¢1|mI Ø>µ[לðœü®MTZQ’Ðo¶F«Þ\Ô˗‡ë_à·¯®¾+¿{º}õþã?þôöÇ»÷'‚¯îþøë4áoN§·w·g^Bê^]|l?ädü¹þþò=üò7 O‡pøáðëoæp ôúuOÛIID.0ó·UÀ3X¾?nv<^œà¨ŸuvH¨¡d Ž2¹(|œ1 +g› gsöñØäJÉçE‚ån +µp^5¥6Ĭ¨'­z]a +¹ŠBA Ä4kU?©îˆÒ%ôϵ–/¢4•ègEæ¦ù ×~7ÍÔ'ðN4øàБÊÌ™ô n£Õø~ƒ»ÌrzFî¦y*¤!ÕìÅ:+LSZÍ,á):7›Lìk3Ž‰ñÀs"+̓VšãôY"zLe] +=x¢­±ÀDe¥ ¶Þ2„Á—r¥XÅÍóÚñ†¸;)Ý ¶' œ©Qa‚ÉV±ß’üœ öÚXž¶Í-Ü8®j:ÀÀ»y9Ÿ¡ÖÀ)‘ú0n6¯€‚ÀvM?ŒÉÄaÀÎÒ(,2< û!Ǽ‚ô=DKeY¤d²¬õ5U¥ hîûceBTº(‚ +N‚ë­Ú "¹Q+ êØ4ë9'éW/Së6Z$BÌw=×å䀓ôXÉÔJÝh´˜Š•ô€¿¥Ïz-ü­›%5zŠ_JËo•Cª«L¢~‚êz¶1=ÎtÌxT0ì@Ôêa¥ (öìl0®²/‡iš`–µ:†dÓ1,†TÖJŸ@Ô`‡·JÔ_û¨j-—¥›ý":ôOf³èŸ'¡CýxK”¾!×­Z©¬ìêf^ºƒ'}Ón‘6²gÂC÷lïõ´îÙvՇk“ ‹gð$pÈO[¢»ú ù/‹æXDϞ*øÿŠ÷™¢'Bmʶ’­3IŽP®`lpç±ÜuÚUÚó>0Èæ@ց– ?åp}uáÀNètÉûç};ú%MvüŒ»cR‚äðÐ) ïŸ0€®ºæmI Y~ÑQÅ·Â(ø8ãÌiyä:Ž½ï, 𕂏g 3x:²,¥x–Nç¥ .ôö¬^<ƒñD­xññ7šüm©DhFKÔÆ ÷#üKcÝI¬·j YØ.ñ0cÈbø-«È®g©lqÜßùüMÐO¶¬A¿1¦¤é؟9ŠkuºéÀ(óÆøNŸN(ˆú[ã˜N€ø.!¸Õ?ÛÕ † ${©¿Øs|*àÿÒ^-;–ÔHô êj3 áâ°aVP,KBšù€ªê µšω‡3í¼·$zÝ]}ÊiÇóÄ hÈâ³YM‡?F¡žÛ8fÌãLïÃ*°ª´»À<†Õ<wÿ¯R¯³ÔÿA™qō•!Åä óDÝ1"ˆ¥üðâ3v¤¼\Þß»[uwõ¿þ÷Í÷?ýøáíӇßûùãŸÏßúâkºßڐ/Ÿ¿ù紐~ûåù‹~øþíí_ÿóû§Ÿõì—ÏÿÆÉïðÇâójvdÏ •þíòAók JdŒÉýnX‡¢“y CÛÏ Ìµ:Èsx7{!–:ÀR¼: 3›/…è0 Žî%“ûð °4¥ò;1‚`»&ŒÁZêÕÔ¾_ äk‰ÄãØ(‡+çSÑëh+‘*);«Ò”¢‘»¢·Œ„r‡Ïäo¨e/Gž`hÁVy…ñ2‡Hw‡0J2gWÈ#BwñÎ;©…H¤\úø[©UE(C…áAŸ‹0\Š»UÊãZõê5"µT§ð߁-Ñ߈Ú|ìÚPüy|×°6ôQ©|lÉjµgõQY<. wŠíZ“ ÷"Ø[ç6{Ԓz÷¾ß«Ôk9ߗýËú½î2ò¹Òý9‡ìƒ#ÿÓÁQ™,ÔÎÁ± ¥^¨üXò2k葳\X…7tJEÿ©¾÷5Ó·¢¹öÞ.‚õýö–‚µ j±J c”¬ ¬-PŸ +ò "؊¹Â¦š²ƒ5#OVUDy8le­SnÔJwPßò1O4èÄf9QÙN¢¶òõF^mVÍÛëځޢ‹¥³2ñÅ'ɋ÷V’{±f@p°uXãô|£Nö”I% 0Z¹æÚªøû؃È`4†U? t‡ÞYÇ-U\sÈt+¨ôx9®mÄW*;Ø8O 'Ñ#r<šZÒW¦RÏÓÀné˜=Àr³Ö +Ì?׏ørè½Å•àŽQhqÊ˜ÏϔN£¶8æKΉŠa¸ù`…à¤'‘h! vFvW±ås÷H"yv)(9°“ ;‘03²……Z[ã °–Í*d-õD4<~½ÄT®¥È‰Î}/HkùÌÖãóܤ–“w-ªƒ!ɦzéÔæȺҲ•\µe…w i&L„—§©7}èuGõ‰×Sn%& +*«»éÚÒå3ÅZ Á…@§˜5ÅíIJ€Þ’Iõ#‹ƒ•£9tîdk 9H1ÒÆѯJdlš¾7*GšJÕáªÕë`¿+GyÃnà˜“jAéèíåRmžq5}B…Ž ÂVk„:/¯ª¯›ÿ½…žl2x;©1Mþ< Â@ž*YëÙ;¿SSf¢8‹æ𳄖±’efĤÏ'fŸ3æ"IÛOòbü¼דÈõyƘ@™í¦V­}¦Í'4\áV/Þ+¡y?m'Oãg@+†9|½¿rȇ%OŠ=£ ¸$CÛrÔïDAåÚ/Ï£øJ§Ãü0µi›Æ÷‡OQç›÷kí#NÁ‡Ú&½{ Q©ÃJ²]©¤µ÷&E)³úTÔ>%ï=€G?Ï~<±èü—§,ñº£ Á%¾Ú-aԘTÖ2O›¶±¡t6|îÀ§~¥=Ì­Žz¡M I–…`_#Î1·–ïëMdÚÄÃIc³HmÎå’à©ç)ÍY†›$g JAx©5¡ÅE2°”¸^‡ ôË@Gƈô“HD76ÐYTªæ¤²ãm Ôlæ(ܼž F`LG`çÇU=µW…xùxNfS1æÍ6ÅU°ô.ûÄH™wi°b§€ZFó!Zëù’ïè +¬ Ó&¤ž\¹p¢ÃxpF̶ à”x§ºÊƨó¯[S=•Z¨´RŠÉÉ^ÐTŸ¨bºÔtÌoE8ñ¾µ@ÎAZàG,=¾—g‘=´ûª¡"°m´³Ï‡qÞvp(yö±ß8Š +c¹¾>*ôF*»¥‘jÒ6—ªŽ3˜ޗ§æI•ÇX QK®q%Ú¥ß×”LfàÈÍA&‘;°/ïO›”Ðñ}s]…Ã&b Ì-@#˜yÔäpf6FvõJÕ¨Ž¾J€Æö«ßj]™`A¶ñ.ΒÊJÖv²ÍáÐÚ~s²ŠQã*lèT8À諺ÎxÂ&Àn/8$»H#UsèÎL>hæ'l?ùc˜¨Ý󀥢˜#cºè¼…[ðS<¹=“ÛŸŽ*îê‰qrÂïYö‚Q°e—Ò=úE1ŒŽøšbù¨ÄåՊ™à¯-ô˜V¶8*XUÏXÁ³]v4:k½ôèÁåý¥]WSÖ^}âŧpþ$ ]J¥n‘ Ÿ'ý`ES¾PºÔës¥5d@UÕJ=£ŽeÞ9y²çêyÝNbþɗazáë㶗ƒåçœ@Õô!›C3š‹ëEivŠ ·°h&C'NËAž½q|߻ק¬˜]£×„€f3¿}y¢g,—<é¸Zxr5vò¤;•w¢tÿ_êác8hJH± ‘B]QfHªM7¤„û¹LŒ¥­•ýy͞ò HÃz6ólÅI;ö>UÕ֚l#Eó×V-ªäv…UÈx›Ä 5Û ÅG¡—*ì²5Rµð:$®V}mÍÏbuŽårö9ê79õ­Z(1…BŸ}¦¥® Ⱥ‡fÓⶲ¬{(`ïÞe ỦsY/6ðØDTߔã¨ßIG +—ç‘à*çóa©.MXŸ7ŸÎíêô~Ýè>hßØQÜßA(@ÈÈçËގ鵬Œàè çn™¼B÷%4‰KÎí Š:qÛoLxsSl¯'”uŸ[䡨Р)Ë꒩¬ˆò鼪‡QKßO‚ + +íK¨‚Íëq]Bkßs U̔õº„®à™úmçѸóXB×ç—%t1õ\BŸŽ%tñ~)|÷¹šÎ%ÅKùy]BuKÝÖw‰T­´èÑÔ|>ÒÒÍV/;ÿò´Áà‰<¾×ÙÆo»˜QE>Z㍁Tº‹[«\Å.!òKLŠák†k•Š)`»×—–²‰ ]=Œövù©( Õ:ÄNH§˜P°5¡0±´MM(˜„ë6)VpßÊçQÊY¶IÕ¬ì¸^¦šÙr䘀 +ÖV¶¡z¿y½a#ûê'zþQïÑçm0JQ•í¯;Z]ã+†>Ó*«½ú¾¤B²Y) H¢·ÐæX(³ñ€dßaéÑTt´}ÎPM­,˜}û¡nÛ~of«y`$ÅÒÍÈríñyj˜Ñi›…@·cªêQQ÷¼:±7Ti:Ój°Ê8@­î/^wáfžŸ—2b¬A黛˜:dۊ¶Ï]¦Ê𱤍˜(œJ$4[Ö·„‰-—îÖDøyò0”‹l„ñ—ÕÐ“Í endstream endobj 13 14 obj 19918 endobj 14 14 obj << /Filter [ /FlateDecode ] /Length 15 14 R >> stream +H‰lW;’å8O¡ùu¹¤,>OÎkHŽÑê]A)·úNé~_読;Z9Žv˜Ôšƒe’aŽ1oÌo¯+/ǹQ/¢¾Îºx±¼ßý’ÎtÚ9Æ5KÆ# ±®íåºfoŽuœÖjM/§Ô©q‹È³Ð}Ÿit‡¥ÇÙ4©?ÀGÖ4 òø¨þ…ŸO`ó¨Û€0Ž’„SÀzáuú¿ÔÓ__)nF( •«=…˜Ž> œWG: dÜïJ'܁Oñ#=þCp ÕÈÕèö²Sg;1ü!HŽ¿Ÿ(7Dµðç÷‰V˜ZZ¼_ÁJ ¸––f„$xßÀ×$ŵ:\dp¢WRFÓDª¸ŸQHDnÕ Ð6g=i0˜º“BJ]ãÍ +ÀÔßX¤ö(×$z³h¯"'+Ö)ýe|foVN<¼êæëé¿cß_Gý` mñ¯BC¬·hÃk4µ€zôJ’…[­oƒeŠñ£ £Ó²6FÙp+Ôjy¿§Ýš+RóË}²A†ŸÄ'£35ðÐUDŸ¯5²KÚgÂÐìDѕ*áܘ'øtÿ c²`çüýQVaö*Úï#þ}µ°Ûªª1Š°"Ìlåå~`v¢Vçó¤,˜ÔÃ'©Ï¿¦+‰¬é]}ûöç7ã¤b8P›¦‹Ñ˘¬ë+1óàÄ·q¼ì,ª\ªøÙ®'¢voð¼;ä™Eå¬ú:¨úìbŒ/¢¿ˆîԈüõÁ#ÆÝæu«X:£½¶æ2ŠÇ¥ð>S»aÐÀs|uè€Á§?Z—MÍ0vÌ{jÚ^Y£=ÝȃwÇiÜÕ/¶µÎàëë$êêN”Z#{wFuòþ%û!øPˆËŠ½•´¤ÿ\–EÝu-cæ.0ñÉãÀ²f°>Æ¡“2ó‹ùzñ%ï·%!ÉXo'–é€B蛴1¿ ÁZ®´û$ôjY;Ó±€ýñ•ýXœhõÐÝ$†= ÚõžÝÄ5ÃÇÕóòí8ˆ{Öyº°ÎïAÌWÉXÜ/w¥ãÃFÝޖÍ!Û´æNÙðn¯u{ÖƎ“cÎì‚M›«ÈËp kÙT¦ÝtùÛã‘ÅÊôÆl»õÛtРO~цWËH—·÷a§‡¨Áà’GexŒÚá¹ÈÆ~ÙmB[29Ä{–³–ÁZù(¨¥9‰°¢nâõrgW÷ˆÒ#E>|b6­eò‰ ˜z<Ÿ¨îKD¾»<ЁàL»U<ª½¢‡MhX®âædð=+Vš`C]ó)gŸ~â"¢ ktœD Ö°Œà¥¢ JAëpq©µå}4¨¶B\*U?‹5ÒӌÉӗ܍©´„õEBÉs¯Ÿt“´JVÉçkµÔképà÷é1>vÉÔ¥sf¶ '}Eù»èã V”5  º À ö¥Gv‘¬a†Çèi Ù×1.¡ËÛc³ó¸Á"WEtä òÛÖ9z¡»<æ6'œvbÇAQÂ;£•®¹±ÑŠOÝv]Û·Ì|”‚A-¶*òáFTaæ¨ÎX<œQ5ñáŒÁò] ?cì÷MM0,7¶œÃ]AÙǀ)ÖxYµÂ\K†í 7Ɣé­ccÇ~(4¹‘m0úIßju + AŸ5ú7„ Õl<°“ȏù‚ç~NÍ¿ Vo \‚?Q„“D°fh‡Œ‰©ù¸*º“`šõ5õ‡š ­ZÒ²ÜUóÍÔ¹{Ô\iïC|ƒ¡Gˤ¬Ô}q#v•Ò—ß"½xÁF2gœŽ§Ba֌ v¨ ïk:8¢k¡€Ñâl*6úͤ‹~?t§- FÃWÙWð;îGÇG‡ºÏÎÈ%‚-Ë[þÆ0ñà‡x>Q„Õ‚ß'ªÝÅórwd’Žc&hÄؙRä‘öhä:ÍyYÌNº¿ç pOˆ{bxL’HoÌÃ?g^›‡ÿùª¶-uýº´ôтü°¨Í.Ž‘χ³ÿs@{¢5 Å@/ó©ëéʏ²NWj³™µ$¨Úç¢T´Œ{ޟ¼dc~‹‰—ùã$7}¦Ò»ÐöiMÀÞ)žn‰®ìg!°MV€.°“qHO`~]Ÿâvž\9|<>Ùm‘ïç»R"á4âCæö©cÛñ)ëé=ÐÖÛû y£×‡¦ÔyHÆýè¾ÞçŠä‰Ï> +¢º{dtüÉ?Ð䉂•‚'LFm{‰y=´+?Àcö˜Ëí€õõ±|y +?¹„ZdkÄx‹vm4]´£—á‹ï; +Ö²ØÕÂÍè3Qˆ–Ÿ²^UBÊP\Âòn¾#(¸Gçi§›¬Í6Z´ ¢aœÒ¤ ØD©³ëÆfq]c¸¶ˆÄ‡ÚtÁÒ´¨^uÌ©TÊECžÓ{@HZˆ›5()ñe¨™å`¨»Ú`«®b9»³'û;îK$ž­±âì 持“ð"q«í$<îrZ.ÖG.t‚{°V‰¥‚Gñ’ÂòÈ8bPKfÁËô{6~ÓÈ›.u,«íɸ‚}Ž$q·3 +ªX]ga<±»„6¸‹M±Qè,KµhäÉ]Âjü°ñòQîr/¤[°Ý•6’ê×ç½QÝ'mrKIM҄ÔVßú*ÅtûÐ:éVÚÐDí²^(OõDn ­zžDù—)¯/®Ü²Ž×5à·zÚ¤áåndÁàR[¹2<ñ†¶šñ0¨¿÷¶«Dzž ïvíí3Ý9Aíµ9÷Ÿà&QúePˆ|_")2Á`{JÌØhù㼕Ãþë’>ogõœˆ~}Y_ÐZ>¿lŸ'¶ñ‘uƒ0>`‚HI£>•ÄèµÝ[§ê`!ÊÎ9ç) ÿӎ oN Ì9îI1¤}"H¢æ7'¿½°½;).wS­)ùÎ0LÔTsˆ©a…ÌS^qè"„$lÁàšÅ”ҖS3æyɋˆ1p»1¨$n*c*º3ƒg«0&@‹*Ãj%½)Ÿ¨ÊôÞqÐÏwçfóªYi”’z‹ îÖéÆL!t“ÈÀRà½ÇÞHc…{1nËK؝ë2•Üé*ÖÈcFf”šÂÞÌÈ`Ë­‰3#Ãe´[\ +˜nj¼0§ÆneOÜÊ2Þ”eˆô(ːRèÏ= ?4 îÝRü »ó­÷ø=ò+,qÉ/ší汑A·‹flþQ2Fj„]¯uÙ‹ù‘eúk^×<ØG¨5³Ö¾“¯¢'æ“=Ðe%_ylÕ°‘I$r-®%†3­r­0K£[YF0¼ý…z—„C·²Œe‚ÝÊ2$u¤eÈ?v>*U²Ì3ÏH>äšv¡wö¡sJþ½S–Ï]V}0gî6¢½d{¨3Ìè„ò€UÜï¯ nHÄ®|`4,æw¼«¡c›fº£†6ª»'4~x¡’íQw¢•Å<µ»&+¤Àï»'€¢7óÝ­OϓÀ‰ >=¸ö÷ùÙµÜJ¦Ö·'*‹¦1îžèdè¨I›oOïïYuÉõÎ_±¿¿®é9_ò˜¥ì¿¦=’¹‹'å{ÊIE"ûýðñ-ì ´>-hù9è`J(xÓÇ,¿ÝOÌJMLÍu;6î)w¤ ´”¤yNJ²öˆžä6IÉ+~É«x¡8~ªÚ»ÜD2‚Z2•O¼íd5(…6T àªÕ¬Íó6Q[»?ÀEŸÜ”ø=8£Î†&ÑÖƒßXŒàÈ[u4]Å0®ç …Ô#Ѻ“4|vLY…&³™hښ‡ÚÝÿœJ7KS¦ª™…Ó('4éh–R¹.³.‰»H³Â¯Òè + }¨@›ÃlQy†êW÷--{P¼9¦-òÒȔ2øÅ.c‘ijT˜4¢Aþ&ž§±Ý'þÛJ7šJ:eüßZ•¦ +Ê7Ý~’gŠ‰ãúãh[†¢GÅz¡ÄKe=ÀFÙÁ:»bu¢i$¬Î²S»ºé¶W°×2 ”ög,«ó2LGÔk»¿è9tÙíàÃí’ŠÂڎ<Ÿ”æ²—š€qQ ¥’¢€r)«w ˜Kä R)T–U<¸¤(xô’…… ›K×Þ5-i`ŒbY˜Í¬†Ué^hŒ.ä¥c3ѥ䃲헒ûç+}ÿGH þªK\\c9 ’ø÷‡‚´¦íª1MûáïÔ«²@òä 6‹òbÖ½ÆR¯w[7Nx`Æ s•[òýeeiË.•Ò œK›·éÔÈ=Aº-Ë,®ê|Ղ¯†në²´OóUï]w ‹÷¢Khæb 1² ZU8Ö)º`ÙûRÄ»l¦¾¼ilºD4E"ltL©®û[ÔZ'Šå’>‹ èΦ‹LÅ$¬Ñžªqiþ¾žœ êz@o î;*Âzp[°£Ò.lœjÕt“™‚$jçãŸ?ñƒ£ÿúï×_ÿûÊҔ tIsØq0±Kn‰0Æ{e®tßÎ*ä†ìM,5ì‘"Œ9>œZýF¬Ç¤¿µT~Ó1$ÆÍ-¨Z‰&óšXaHû‡/ÁB)–¡'„ì)ՎL,¯¿ÇnmþàAª2œìh4$^æº/±®Kñv‰ŒûAYW²Mýy`ć"Ø©¦VÕaa)_!<Î+ÛOrªÍ>Ý~CŒ–L/ ‰Šå;²PbJó¦!€¦"¢¡d¸ÍÇP +(<~¬Â…¹©à6”ñÄm(ãíÁP†H¡ )m§’žŠë”nKÅå,ڏǥñ#Y˜ÁÐõÌ>*™û2ó×Áƒæå{î6àÁNö¼¥Zø’*§~ŸX²¯¤ëvh×\݁¨—•/;ÙáÄÔËÚ[%~90‡ßÑN28•Ê£d›8G;) …ºídÃË_¨÷H8tÛÉ@°“!Øm'CRÇN†ücßØrçiv’kŠ.¤ïè'{P-ÂïÑPv؄¡õ?Ž’Á3Íæ(#e€yu±,ÿy`èɏ*+°EY`²ã°:gÉs÷Em}ښe¹¬ÙÚêgO™Z¿ œ¾{xÐZ'ÛÜUœ‡2ϵŸ…Jöù]4nÀ“>lÿÐÅ +­¾ê±åœ_õÐن×$fL Ÿ² ;¢]ڗ¬©¸1<1Rà x¨QU4¦}»¬ažIt¾aúsæÆõ|‰­]T{ÓÑD‰Åÿ0™7›õ +§[_’%ž¹óÒîëû-ñ·ªNü }Y;Yqd¹¶ ÏEíÖ£˜>~ŸV!ÓôÛC„­f—¿ÍûÍm€Y»³­Ñ*¯µi<¸g(8©ª]ap®™/ŒàáÁíçS?4Õj¹ï NòûO¨Ýy4æÔCNž} ‚º—Ëù°û:ÜÒ8g¼þÃC %§Ltqÿ•ò”ÇKì¨Q~ކ ³ð!/žÞî™<Œ‡âíhœtØÞ"…é€n¼s‡—)“ê“;ÐJe¼_¢ÛéÚ* Ž<½ô¾žUI`o+Ï{Ú{\à +÷v‰ZèÚ«ågk°½Åu“Ú{=æ:¿³miن¤‘^ujŠq¢¢`ö±äv;š”¤¡0³L©NÂ?­ì†.(Pï¿¿.˜­&柩®ÁŒ–"tûgԏxaÈ)¦aÁ<$® +qê¦¥‰UròÆp¿ÈvèQm°[‘ßÇ +­à¤‹;FÙ"àpÀœ{yÉcð¤Ôy“ÇÈ{埶`è  uò‡òDöÁöYõ•ç&•úƒwh}èuÀ3À3؇}B‰•‹fCÛG½¤?Ǭ”ò|¹~-Ý@áHv$£­÷úµeÁ‰tALçKiMìb¢'y èÑñ~9–—Ééà&ŸÃ@1=õfσÚ{\à +׶I8ô°Ç¹?’Gu“GHéGÈ>´>”ÝÚ<ã䁂šNa½˜u§³ñ,uùè-~RŠÏSÚôñØNîyγÐFú8°Û­ŸÞÖìÜu<\+ú½Âñ†!Ùã"C]‚á %<Þ4Ôz›Øó*Ñî†Üj{ହ}€L”OWp!æn?…HOWƒ4¬oW >e|·­¯;{Ãôç{z—>e€ö”íäkææƒ=¼€³óÁžòµWÊáÃôç›9—›b‘‡Ž®ëu…Pǝ”Æäo^_ÁÊM­Ýd̵‡Zy·àβì¢x~P{û†·¿Po“p(ª´õ€æ«+¿Ûm:ú>À²²6¿ò­¿÷&‰zŒ°`ñ¶CÕÄÙÅ×䝽ÍSšfù¾6<Æÿ^ÐFÿ÷­Øû€¨~n™ñgôböH"]{@u‘¸W +O%Õ|“dÖԙäqY¬ào<ŽÊ;äqáÅG<ö82óÿlW;’`9n®|Nôq³º}qóÏtµ{ZyijÊkž¾æ!5û1—®Éô!ŠuÔg¡ÊÝà©Øðz¡çpÑ¥Õ?¹_'–s¿žíYéæ.±Çñy\˘ÈãšËD LOÿ ó.M/yÜó3wÜPwܜ.wÜìsåãžVßÑ$N¢¡Xiê’$ûÂÜyx“ºÔË$òx»9È#™<.ü8Œ_‡qKãvÆÿ` Æ¬Ú §Ÿ+½ÿ¥pG‘Ípš&õ¤JôŒ¡`^õÉH³·w%†÷ ŸêÈ:SC¦í˸捭²NÆc"±êkj•ݙ0ýŠˆ©Ñ»éQz¶„8më+½y«Çîo¨kÿ^õ5¼Á9»¶Oö@ïQwåîõÕÞàôtó-ø¸úMñ- zdÿdñý‚ëœÑ#¾t“rÄ·žd·—Ä·¢T\=×h¨F~W|k¢6“øæ +£ÚQ ?v¥«icܵVQ%ºrÿf)U»~TŠr*Џë/Åuy£œûDmÔÆçû ÷1cƒF}Y¯&rp4Í`/c –r%нjóX«¦Ú@šk³c>ü¤-eO»Hˆ¡å×Ñ  5£ÝZððc1¸<ÐíqaãbN­`uíD°*w½©ZfvÀswÏvBàúÚM{H´¿ Xt* |áºõ¾J˜xhn% ÒÚ@êέ@iw`‹ª%ÐN ㎪ÍúBAWÙ«m£$g7¼Ž*èÊLªSÄÏGµ‚¼°‡©¢B‡¿®ÿL`²ª®6mzZ0Ú5{Z;gÕSV‘ÿe ¹*ˆzW‚Ã÷\µR þ9\Õ*áÑË|x­Uaõò .¿µU"îpJw%AŠ~ÈbF¥ÞÓ ÁÏCô(¡vh½¹Ó:šrJó‚ñžÏä ä7/S*>jÞðHԘ|©{DyNù\éô@o‘Ü=MêñEÍCæÉiФ%T–´ÔÇü”=áºy9¡†p%ÆÜÛÖ`µíæ7?½êDïqä.BªF/ûéx8ܐ1XC»¶îhÅàk;áf}P83ŒPr::ðc=|­@ÓZÉz Hg×Ê}P…uékü<Þ¥KÔ\lE—£t§Q_V`@×.ïQ{¸Çë=€U +ýw¬PïÜd=4âL¢òþLèµiÓk=îùÙyÜH“ó¸9]M}³Ïê5¾Î7ÚVs3s(fSj}FÄAÃ'€v\{\C!TøwçQp“övg%oT|‹¯}KÞð2|²ŒÓy‹d­¯õP=ÔjË)‰ÂòI–’t,®ß•ýk=l³‚ò×zH_ë‘Áûô/:ïRþZt~²)Ôk=RNÇz¤ìSá‹îb2Cp¬oЄ>ÓqrÉݞ.÷n[¦ÿO6‚Ý^vã‘Ád< – Ûû㻀¸?ZFÔø¬c=ü#²Ý¦£U7ዪ>! ñ¤$LöC@°ñì¶mÍ7p!z¤„ØŽ^çø(O PP+K 5-FHWJ¨½™ã+%Ä -#ô£$+m>C"ƒIw?hOK‡©ƒ3¤þ×%vì?íŸû÷Ÿüׯÿýë%…´ ?ö@â/ü‰uBð0öÅ_8ôçÿ–Uöá…%ÿR ŒTºajXCÖÔCøËØǞÚ£Y@µÃ·U—óµ¹ÕՋ0’ß*u…óŒ1Gö¢k0.b?ë†LÝÑßý&Zuþ=ïWKoœ(ùêIÍQÖMü¯_†AÖº»h¬ÂX@(þê%ºXÊaI9Ö¢´œøF/«;XèM Õ\XÛ¹ƒNVs¬©‚ï,omŘP´ÈRÞY:=´ÒÖfcÖÞÍÀ†Þ»§Óô Æ(‘²ó.“Â3šJ%†üÓSï“Ögæ9D+ÀÒÙ·«úÑèÃ9JÀ¢] DÝÀÞÆvÄä§c&‘_=ÌÖäa·Ô†òãRå`_íi»Âamµ ¸úUVD Te)\Q©;*§®â¦fx5 Œ”Ý.¦çì“yÑ?Š"ñegÝïñ8Êo€Vµ÷Dю¾Éj„J¥SËýÛà~–ZÝ5ùgí/†7uzH‚‰ÕþyQä6–ޖŽÌ«DI9 +€k‰î-¥QV%ö ™³;6V·ðøÝ¥†‡ƒ½×ô Zü5ë«ñ夘¾¨mo ÀèŸÿ{ªJWÐn}±éú/Øï×›i¡o‰7‘ùöúêî9s  ×:bƒHé›tœ r0yî+pcú6ÛbšX9G÷>LÆËÃËÖv‘Å:†¼<ÈDÓÏ¥gdÔ>+霶,(š6¾Ç7\¼ßP¥e6“ŠpUPñ‹Å™yÅ 8.`k:6ŸKÌ\ëû Zç­½O÷€÷ä‹Ñ][¢lÆXŸã¥¯Ê=>BSï³AäCŸŒ½°ÛžCýO.–6n”»¤Q¬Z-_ˆž:ÌÓvŒ;•a\ýQn›¿÷³ž~Ðèý?/Šüe@Ø9^f`“±g€¸ 7p4捩 Ñ¥Ø8¡­à„Ëf n •È7B+8h£(}Ž‹®cΐž# +XA±ÈTc’ákã Ñ¡ôž qŠUy¯¿½b ?ÚàýטzݦwSH†Ù ³”ûò±3îñ2˜8&œS'@è?ÎcÐÝ2Æ#dÒÜô,ãôe [€‘MÌ •Ûf}‡8Kéò;í/–uPvC×í{ÔVñ$¥ÚËrÚlD÷Ÿà;5C%ívµÎG þ‰ùsÊÌ£,¤#*q¢¨]T°ŠÙêÊ×)gJ‹Rw5X‚ÞpFf•ßãéJÙIüFñK¿}¬Üö,ƒ~i³½Ûmøh”ïÑâ$— ü&’JÜÎîV~³Ïû9*¯cG’6”Ç31KÎ÷îVÈ*Áv¯þ¥¯ñ7ÓñxÎXJ¶©LJ•zšþG”rË9ß<`ëc µ²¸ÔH©²/“4ÿúe×$ËH –jâ‰GsfpÔ[îä+7Íy.Ÿ[skE©Q@˜·aàž~'”Z|6¸!‚Ý|mÕi259Æ}·h†µÎ÷ºBáNßCF±QVáʞ‘Ö6ìmǂ&\$ûa鹍˶;öÕ«xXdx"Ü͏a{Ò4»)®zú©å1¸WÜ: v¬mºØ®"PLl0hˆ©ùZ(ö±‰ãaɀÕóòO¯ì˜åŽœ^ÂÀJ·éXdªµþ֋ PàtQÊíˆÐÜP©êí¥ºÇöÃQª= Ù®Æ|-€Û/½ò¢ÞVyÓӀ÷üܪ7ÒÛÕ)£Óþ)÷Dð&˜cÆfg%.~×p­Îºå=çüдÖoÓo—Ñà7pc»'æ[T~7âõä"Ìe^ô¬IÆ/á.»nþžL|µG”Œ’iF¦'®ç*SÞ@÷~'ƒÌ°Z»/Do)بî3.¹UTD¯¯eá5}Êê¯þ€çÕt¤¥¾éaH €¢ê‚ S¬‡ -§SÇF‘–þ·âID ÷†ŠÁ&l… ÚµùÝ·æ°tOž hº±3º˜ +ÇÛM $ µboìMè|£ÇW2í vb Súç…E}ŠvýÂb'­ÁŽyý¤ 5© +¿!mªˆB¥¢“붵Buº«:Jëp”n3Ò á-Å\¶›Çh/€ )÷‰ÿÇvµ£Ýuã°d®§ð§7¥:S¦¤v™ý@RuœÊ¾øuôàË.úi!}&JÀÖ²a Ìd+eË0C<àn®ˆÍliº;¶“ºp8,ݜ÷ð}M°u™ùÇû þyòíéÚ֝¿¾´§ÕÃtiՏ¼JÖÖ¨0ü‰ÝcÜ)\A»}M¡ù.ϏVže­Ÿgì<‡ËÂ9-•ç¢æz <ʃº?«¦ñaE™ó& f«·8MVJŠÓ¤‚©¿Óä ޓ/VÂBßòL“ñø0MÆ«ži2¾§|^\Ü A2šz¡;M2z£ªY?Ó¤,³e)ôÑÕ¤z=%¡K³|Aïh;…þŸd¼¿Ô13ãxw't×­öü âa£E516¿>þéێeÈút—§ûڐJî?àQjÿúI Ù|ȶøÜÚ9ú‚(·ö1„‡ËÊ1Õ×=ùÏõ4‡¥,ƒ¨?zÒªí£U„·Ã8º¦/¨ù%~¢þÆpõŸþÈ?þË}0y)-tēVõ×èªÅŠWŠ¶Ì'Þ@ ­æ¼Ø w£ßÓ܎nÜML°¿ÊË6É +fÍQó…ô[ίKŸp×A™fÛPêšj\-¥Q ÔTØçXQÔ§Öñ À©£XçÔbëhƒlPIbE±16˜µZ©q^V¨Ø­Õ¼Yjï~£%Յª¬mûç¶ÚnÁb·Ç+}m>³XÏT¯zØwœ®ïTµö¡†ÎúÏõK#Ñ|‡XÊnzÀ~?>˜„…›-7-†Ã#…†‹^º ¯ù¾÷&? iwòP¾ä|ì»E¡@Yⲯ¤ *”*jtý´tœ¯YYó]ÈίýÝQ‡Ëü=\@å9Ï÷¢‚ºí¾WP†iE•6Eoq2õŠ;Az® l†üzbûvÇ\¼à=øb»îŽÇ×ÄÊu³ßrLU|²—´àa3ÏÇ¢1| í×̉€îsù? ¸G~M"ÁÝ£n&/Ejƒ Äsk ~ÀjãƒRµ4Áe+¯µ/4µð8»Ž*'÷µl%RfÏ\RÜxç6>ð(Ñ Üuø!Àg¹ˆSÃM۝/B~£Eð*QDœ=ϤŽ£j¸éUۂ×‡™-4IX ·T¶dnB֞,Óm\ÜE’ë`Þ}ONOq +eÛç9îkƒE¥Õg§Ú)ï~æh|ÇUÓ-ÛpO¨Õ0¾¿‚Òõ”?/‡B©ög!+¨hÍÓxwà̎2¶Z’cA È°ib +¢u³•r»Öx ­ðÔÿdâßøþ‰… ûAü+Iå®Ña¨ÙDß$NŒ¡ý-»Yë©ú­ú‰š$Y+âäœ4Ÿx€…¹s|ë@ö-B'{Z-[\Hhó¦,—ßbÌÌFäкӱRßM[óˆ2¥$óHÈê#ýƒ_ó+ýJ5ÛöbõJqñÆÆ-§!}Ði-¼†AÍÎ-9ÀÚmmý¹kl1µ5³ÏI€9¿+¡rY“Ž“¶•a*–[³–'™4Sf +f3Š? ïH™Eã[jÿwâ˜,~ kã|X´LÚ@uа¢v“Aê_:\àI¸Â‹ ¥n“;ø¦ÕŒU­õv™S7zŸ›x†ÎI6ÂH–ÉÒ˜B:MÚt"ã˜ÚÕ=OKîæ×÷Š‚ªÍ­Îpí)ÃF(;²WÏHEY5ݸ^òjD5±ŠÀCšù¢†G¸SÝEŸ]Û:S˽¢žkó¿·¥÷ÎEopŸT·g¾ï®Ç[38œÃ:±'µå$›Ãþ%ã—3ÆB“¦Óùë…Q[M{o`$m¢÷BÙ›gÇÏl*ªîNÎÝVWߏæÍîwS=aú™ËyÙPmr̲Z8´¾+–Ñóò-aØ[Z~ü\nX󢁫vÕê* +pÉíã½ >™ °XÅ<» +mÄx/g"gL¸—wø¼¯¢ûú¾ß1ýüFê¬ !喸Ì~?úððŸTᦳ«‰‰©Æ›Ò?þ5ÿÎø[Ùèj› ·‹³ê/‡A/#4ZmHYŒˆÙµ.P·‰»¡›rڻ퓫¹ý=×T*Á)ŽéŽ5Aæ܈~YY…ùYnê*YD´BúÈõz”Óf•,µ¶( ¨få調ñ—µì§~„Nƒ^·»ÙiëÝô2”qÃau7òs+Z½†«w:Û*ÏA@ ø@jrßÊ&Fbàž.Êѵ§âªT›¯:iþ€ˆéü¹¿¾Y'틃ZQ~°Ëd{¿/Èh){i®V=¼·çüù‡¥¬å«|6bôðSƒ6XmyœeåüD9õÂÛz‡A;Gqæ=µƒaÍ4ÑzúEÑÐ{õE%~=hY'cÈ&†ª§c@Uçü:¬ëu"±‡ŠÌúPCl6¬+b¼Ö³MÝꞺF5 ×´ªÃi`3/rN'ŸªkåçáŒasiÀp{™~ûƒ‚]1ëj.¹åHÓx8ײÇÁbœ©ôö}6¦Èž”Ý/nКÑb‚lí1ò.¤ZîI[5²`_¦é.;5§köo-ö9"2t +ælºOs£n +ã€ph9tkT)ß°Îkîχ”e¦Ó¤ž˜´$»œeƒ³j˜˜øy–iØeµlC`ëë b>ùÓ#瞼.'fguüe·5‚òLf–r\ƨQ)»/۔ÇQÁµ'+‚à¼:åµD‡6àÕ»¥Û¹aâzæQqÏÇ>™E¼€w²Á.Óø/˜fXЂ¨ «~Ô|Ê^-ɞ£[ûêZm"ªÜ^n’Ô´*ÑP£xº@N .Ð5A?Õ#¦]Ö¨°Òƃ½F?]ʇٵ‹.›IõiÆâ4Úæü"$þvÜRæä×xܪ}b°úÁÿ +~*ˆª-uŶ™<òB-lÝøL܃”Xš›ørÝÔ#³ù<±Æîth¡FtÁ™{(5K¤6œƒäâíi @,¥˜g£{²d£v=­˜zÔ]Y™a†+mœrއθ[ni¸!CF¼¾‘¢‘»+…ç +;ÀÔË]ڙ!‚û®ï€ÃZË!Wª üŨXHç>ßÑlîþ¯E仑% l×óùÒvêtëªöÙàzÁÒ5“T‚Yo@ïÓX¨+‘9TV i…‰lâl¥n>‹Ø®9‰&à,Ã=0—¶Dûe†õú”‹?àY—FŠàÒOŸoE÷€ÂÊ>8¼NKð°fɇD4©êÙÙĶ¾¸ÉFº%à‚ÃQ°Ñ{K¨žÿÓ]åșî6ðºƒâ¨¸/ñ8TêL•³ }76 Æ™þ?’F7‰¡å$?5—4gd3ؚgC9¶E&$ë7…nP;%`ÖQtH‘ØnëÑ튌nߦFM=¶ô óºÇéûA_´íˆÆIg!¬+¦cãzù±Ëá‘vÞ;òj«æø Â%uñא+¸ZŽ+ASŠÏŽzE:* Cê0!›îÁ¡IØ(Âh¸Ï5 ,èÎUl¥›.þíi”¡8¶³`”4ÞM ±ËÅΗb ãʹJØmï缩¼h+f*?Νž@–†—I²®'˜£î˜2’uÛ^ñ¦wMÛS¬erßlÁL?ûøóÔU̺rû;ٖ›|Ñüqüî_GZî;å÷<¼¯B'a:°ÊD³ôcí•Ðö2ÁPí¥qۏ„ø*?K Ä*-úÿ tØx$TUçR£.3ÒÚ U±ù6¬: ÷ÑõܬC=îEˆ›7úîû—‘+£ñuP­‰ÌÇ[ە$Œ T:Y®N3‹\Š\}Ö­<8 gˆ"‡Mì—ÛÁ‰Åȍ2†‹Í@nœÆ:^r#x–šÃ8†´Üa¸öóõÅæ]h[­çwZÏ_õh=ϱ‹aSÔ£äµ”v¨¬‘¡óËo#ãôZ¢ÔF¶­ àFÆ ó!8Èv*¥8.²-K;Oç/íòÞ:8Aɜp*æÿa± + `Pº_ѺÉ: vÝÆ ‚A¿3 '÷ĝL»çÈêÀíw´ž?ۉ=O{>”£ö|ÄZÓje&ÕpcUq3ƒÈPg=‹³>¶’hÀ¬]{o‹;ã¸.Bâ›änCää÷ㅑÎÏpX«_˜+܋L‰ãSBË»!X€¬‘BNàD¨ª~ÅJ ´¦Ë¡%«Êû"À˜ßžj¨°dûyy`#ÕþbT§±*•ì±ÈE•õœ°®1ßzì_CªóKÛç¯ØïÐ(wea%¡_ŸŽjT„KϹÝ[¾êXz«l$³Oï—Ê6O a°Œ¯»ŽÈDξûwÖ,ù=ÃRnÆ{bµ'rža«=‘'\r²„;+iœfP¦¾Æu¸‹iX”8Mµ7†Òç¿´÷W+tvÇÙËþD¸Mh$쁦oRƒØÎ*çpÏ^–4ÿ°˜@ôƜMICÅ[®:Š„åH@{Èä3ž`ûuPaPC 殸´¡c0“76œB¦€W>km¶V¡«v¡–G‡y&ÃÕ[J©Ræ-i 85'¸,æ´rÏ<ã‘e8‡X+•b]26F:j‹¨»¤íÀߪÅëÈëYÛèÅ»€™Ô‘¼Š*âŽñOD. w‰ ´tô· :Dsü¬ +*é?̾z™ùÃ(ÞkqÂÑwìE¸/à“XۜÅßÝâ[ÿóïþû‘¹&Á¹˜|<ÈцÌ@MŽù$°I™sôªŽø|JöÐðeKúÜd)M \mÙ0R©jõ„P» %p îÑDFn}ÖUó¶¥ÎüœHgÁFF†åkôKª +÷Ò¹-ɞI¬:6ñĤº²$)H‡’1$›ùýÀ—{ÚRü¤MkïzTkâ70!62*×"›a¼#¶Õ¥Çvԃ h£’ ÂíB;øÍÔx Êï +ÛÆܬYת+$pÍh +ÖÏ·šw™íw,¡?ÛYBÏc }0O´÷ñA;÷ÿH›ÔÜõY”v½™³d=‘¨ѾõL,߂Ïë¹o_CØóan!wÌüì¸mØ„Ó Ú}õ碙Ói#¿») ªWç…,€×h%úA‹P´÷ƒCG?H ÝîÂރ/¦Uà·<–Ðï,¡¿ªZBÌq„>d­g$¥võ~j){ƒfŠ7„‚JMGøq„'Éôu„ô*·=ÕzÐ9BÓ$"ÕùýÀ˜Z»½Ci€ùÆêFÀMeÎ`užX‰õbSÅ+ÑÚ Gdm¨cFÒXúKë¨5rÀû”ö¬îôŸâ6½œaÇƸ½ŒqrŒqB÷Uå–K+ƒ6ê2ÃaÖJ6§gªúpO4L¦¾’kd¸Éôœqa³Uß|,˜;ìš5w1oì\׺p¯]¼‰QOéÒw­§Ë³9ÔóÞɺ—»®×½1$6¦zûþ(†Eºè¼»m‰6i±A~×·(¨²r¬†{`Ù¡§QtÁé&,µnºGßçÓ¸§KëÒÓÍ댌Óõ +ÉׇîÂK#nÇK9áôKOÇÖÃvë­Pâz8ž7-R,e˜ÈÃñ€ÓÎ+Ò9^mêóðû:p[ò_ë9¾Èk< 8ﳁ†Sžxµ ï\$’Q»Kj©Ó;WC/ÝL}×vù Ӛ:4ÏÔnþ';®BOúåÂßÑ@¾„@‚…ÍÞÿ¯–Ër#øõgc˜ñb”z.g +/lÊØ7 Æ4îö ªãiŒÿޑ/=N]éEߎ֑R©ÌȈ wBlõ~Àµj–@/%Šãäƒ%­<Km„°¤Ú$„%êJXp£„%÷RØÁwšr£„©S7FX’öà„%7NØntSÓ³G¦æÖSEn¶$üѕSío <=ÁjôåvJ >§Õc%Æòâßq—ãp˜ÑG ì†bX”°<“_w9«¹Âì×Æ Ëªœ°lÝÆ Ënœp€ïœâVۖ‹¶ãwNØB]œ°Ý'ÝnlEMñŠuœ¤@8m$ï­Tâ²+ï,á)²xð([—)làN + >\À/°Û\À +l¹€¿b ¬ÁḾŠ<~5¸(ã-yÌ`­#ï⏱òM&RC#õx.äy›M\[±‘ŒD·–S£RkßÐÈ&£o€g¢¾ë^B6ÇÈõÚõ1ñõØöu\-=·s?` 宏  ¥ZÏ8{ÓrÛ/ÔÓɸݨµ¯ÌÁ#7Ndsâ.‘®TN‰, ²â’È'HÛù 5‰, Úˆ©Kfà¦D–¨Z¯×&‘%üÞÌ™DfнæÒȜ§’$O¬‘CÔ@¹’¥Q‚>õ{Œ¹måà*õìk¦P¦9 >}¨Öä¡2τ^n ¡}+Ù÷ ۇ‘m-(ž,ÌûvÒP_˜3¥ifæDÙcå»H÷þom¦qKò¦’RApLéÔ@¾ma{; ÅΛ2Ø¢f…uD)j3坼f]IŠ¦:teæJJš”Öâ{¢´þ ‹¦Í¶6Ô¨XJ©Ùñ җbñ¤Ÿã£â/-’›ÁèÅ 0åÄ&Im•2к±/P¡6º•¤) MfqôÎ_ìó2$z:¯ 4ÒZµ€³MÔ;jÛtõÞ +àèÓìÖÓóR³÷·Ûo,Áك¶MçJðv¹dç±Þ8*GxՈ‹ÏrDǤƒ11˜Òɏ9ó4kb tVúí䄺àùw™P5½ì˜S™¹Üî ´ÍÏ×Jü³£†ÁQ{߃~_ÝÕò õ¢óºº“Ã[F}ö¤yþŽÖµÔ7ô¨Ô;?nÁN~”K‰%\ô¨×§­¾eŒ'³{¸MèŸÑJÔìG«úÄSÊ®;æ]·NNüñ¢¤D ΁Á:Ñ8Gθi&®à&ڗ>lÄ/ЄÕæ#P¥Ðœù.{Þ3VóRî#()éÍG v“òžK. ”»Š°é#¸Ä§ýK^õ’×ÍFus¶lDdÊJ§xܱ2¿{ˆm¿e"ÖÑ»‡Øb\b»M¹ÝwµtØ=RŠäÚî“ +³úu“ñ hO›äÑåÅôÂoï\j.¢Äs%Ê×ïPž1F¸›˜é<“÷@EŒžý6¢ŸJZ×e ªH ÂÝC°pï=Ãýî!lwq‚e~ÝîbßrzˆýøÍCì¡N±ß'6]€Œ4%Ùe!8wœ°ÍAÐ@µÛm­Äpí¥\»ƒàÙTÄnbƒ+ûY$íÅÄ2ªyÜÄ u0J_“TX€w‰ì#“X•zé®Íò¯¬ë‡&v®Mš€šy”]°-כ:`WQoòÍM°O!K&›)K"?äÁ®øw4®¥"ŸöáóÀ?±±úþi\_}}}ø#~ýâÛ_÷?ÿêíÓw?~ù×ßÿñ§Ÿ>ÿø¦àwŸÿö·þêû··¯Ÿ?]ôõS¸¾}ú‚?áŠW?þƒü?þ èßW¾~{ýð§p}úá„ËJV±q @îc j;æ5Ey´ÿÛ8ö{yz“`~÷¤ÁÌ >Ê·e3¾0š^ †›¨7Ñóf‘È jÿ +´-Q{xÑç¹­ƒ:ÓÚ`°ÈÀ|pþ³øÛýRü…x5$m!Ã6¡Ø²ƒ4~60*ÃϋÔ.ݵà³1¦x= À#CÈX©Ý›@3e`tRXxýÅàÚ% nÃ!Õ/ I›6֦䙼í»la‡¤Žq<߈´x4×2„Bm¶zô>áÛ&/º{]5i9æU‚xu8妰øÓðµe¤n Eá ¼ ÕçÇÛúy‘³Ù”<3¼’¾Q ޙ\£¼Àª:˜Á¬yØR2F‡D;k ÙFsºkõµÔ¼E`‰ÎcXϦ¡.E›:0Y×e‘QÕ7)g“PDփ]í8œ*>F0%»¸©.Ü1Ž/AÁ6ÓbÕÀ\‹M?«…»=*Ê5¸Öžo¨P”× + +µ$«p†[í +#ÁMXÃÚS•^g¬hm"¶}ž%aó‡[õu¢ºb Å¿Ê[ÌÙÊ2:[{èуäá(EÀTt$g¼™ÍËóà¬~sÇ`Œ–t¯×áp5¡ LiCž  dñ¥Ïö=tÞðG%¾œ{5ÑR¡¥|‡¬‘×j…¼Ë³Ûݓ íûVf€SQ +8 ã.‰lÀtf?ÃF²aTb«–|ŸeÔ®5û÷±EÛ`´Ô®‡ìïŠwrÛÃÏþÎéz·êíº/Œ¹¬‡ËÙIÃ/Áâ-¾ßó1‘4òþ#šL䳏×҃ ’¸5çTG+ªQ”š$Fã“< ƒzs µ2¶ÂwF5òe•Fv/€:y­º–÷Çÿ0†V2>´GcÐ- \ ‹Ñ)–°Jà¥ÙÓ]nÆð7€Š?Ë7iíææZÜÔžY‡zù͆zIzƒä"bíϟÛëpB£¯…R Û Óõðx‹‹‡e³­¸Äg*ƯIŸ¢«´àþ"ŠÌ°L0åëá¶v‹r¼™þǘš‡a³<@Äé h)+qC‡‰›«•óñµWˆœÔ}¤Á·]ç¸~ùEv½)Ñ{¸¹J`“ñ<Œ‡ä“M@.Æ mè|Œú `9% Ž/4lÛHÕF +`‘aÊCl¦&ÌÌ*«¡àã„ÍŠð&A'q3ÿ£ÃF݃Dé‘Ù¼®ë>¬Ðm w©sYeÂAY¿D9,¥Í÷$oßxû Í2Ïæt8ØM-5ÏBNÁ؟ó@²³Tÿà™`Âf¢?¨oQ ä?&sS·íïè_F²‚Ôl.¶:´È |¦'MäpOÑF#:/ÛZÂëëX»1¨­ ҧΠD»æË°µ#$²E{ó]¹¼gCóÕxŒU[+´ª»9ó$+[ـտªr&™è·­Alçb¨Æâ…Õ仐®žh}Ÿ’Õ­;i¨ôRÒ ÜpªÝÑîR4ÖæFÎ~z¤è9áTjߞªÆç÷Ɇ7çZ¥ÀŠÇÐ㡄%Ó,<Š9•MïpÏ[­ae.d+ƒ’?ÄPØ»Î'$—¥½o°hX.ÿbpnn%¥lmï6zqƒl`+Õxxð7¾/ZÜ»cТÛÓ¢‚}8kþ9Ø|\3_Ðm^Å®†Œ³4O± kŸ÷L=™Þ°š}ŸG´…¢ÄmYpI›Q榽5×iyMZtŒ.¡Ç÷ŒÑ¦G£áÛRFè¹Ïôcۑþ!ìÆÜ×4RFyßvdM)œoÍÝAMi–óMó´®çŒ¢XzasæQI'"è+“?g)É@y.ß2R¶ÃÁªÍÖ¦(ô…µ-ªbû£¼ p 4v0ÚdI|xW©J¾»ƒ:$°m²Àx}¬"ô8ãRwÒ­ÊHi±¡/•™óýë`—Í«*ؒêéPÎ6¸YûP÷D—6/eö_º«åØ¢„µ’°ñwíë"ý÷a$ÎK&Ùܹ£±9¶!Å«œdúgOSú:K5¤¦Ò¿AX_€©°»±Ñ-ô\çZO·œ2—Ž3R”ö¨ü­…AѸ»¡ãYÙ§y1eg©¾·¨>)9ê¾´˜Z&¤Š}#H%ˆÖãÉ®cd…œ`qôé—?Àûê+­WÜflÎá¿sžeÅõú­#¸³9÷Ά °M:¶ÙV©­>e· f+€ÛãæwÝ£ØÖYWw‰éžRwÉìy£4¸4r 1í;…t·ÖkûꝬØuø•æ,™É†D½Û+æ&25lOx $‹˜»9¢œÏ(Q‰rœêm µ¡uC $–-„JxÂ1êŽÛmw¯íƤ´äÀê³}ŸÅ<Í[è»)57xèÜÎjŸ¾Û[†îê ƒ|LwM˜¿?Ï·ÝÆæYô МKuvÍK÷æ:ћÖôŠç§¨Áž£<[HH‚d%¾ÌՎŠQú)”>¶õ,×mÖã©a¸UúÇr Ë KͻޙT|·;ËT剼ꤊaÛë®Lÿ¦€´_Or¨ÿÀ5wrxß+õµnÆʻғL­'=i•Ö©Œ„‘TüÕ$ú}r›2¢RZ´-ÆVò¶wjX5çÇRƒ¿³&OkK=µí×þ6ó^¨”±/×¾mœìÉá»õzÀó°«É>¦è+ân?¢š¶â,†‚Š'°F½‡òÅ]®¸¯³`IÆXo‚¹-}JØ5¢¯\ƒÌ í”×ð/¾ÓœeÁô¹V€[ĸ¡µ‹Ù}Ø|Åá©íÀPÐà«Ü>S+äi£~›©“0ê6#¸_&ò5E€#·eÆt@I© »ÎèùXЛɗ±°-–ËX’‡kT¶¬t@IIËç!˜.$j«CœeOK’©/°Ä$KՀ•’–:O8ÆbNGZòY‚t:«~ÞÔXÛTmõì¾ZÌz6"ʈaÞÅ×n=µÐ +ÎðÎÉÔ_æYIpVeY€%ÀSí›d6¡ ‚™—¸÷ ø[ÍSbüšæ™•'–RŒÔ$‡õ:}v.Ã6çÅÜ/Pc½é£í{NjÏ'[DÏ ‘¹ì£y~é±3M¢½’a(âhžº§gƒO´ U‹—ꈕ&EhAwçÀNò‹ýøåÓììÏ!§³îPØ7…©<¤OS+nÓ±®kl²·°Ž#î÷àÆÊy5ŒŸ ã­ì°d5¦Jy ŽÛý ɉsN.…rÙ +Ú×^ÕÆ ‘#Ú<›äRv¹¶^U&qÎð¶2OQx¹^¦mT¾ˆ`Í-Úm‹ ¸%ÊÅT®£D=ŽÕÖQdH —ÒgþCc”þ»ñ.§ß Ö8ë_8ÄÏiè-½˜@Rÿk–H¾|_CÂ)èEûçR +Ô÷ï]ú:;®ÜywöËønXa1Y]«<½YÎb)Ä,_An4¯îêW‡í¿¼Žx˜Éþ„ûöô‚v%‚| ™  »Õ®N„âg¸Ä +à¦ÄBElÏ8j7>€S1ÄYÏ3Tñ€uÕðNï[oÑ{Þ`Ui!—'@‰#Ëz̀1•FÆµÓ>kö¥j<ÕÓÂ*?ÇWœkŸl£ñkÔ mð]Öдwh쮁b¡Ps-³…bZ¾‰->!®Ëý»u­4yN£‘–¸%X½ÿñ—>¯g]3÷’¡Î*è*´†d?Ö¦% +•ûq2¹•mè¯Æ ÂÅñø€õT¸ÕM𐓠°L`\*²šßý®«¦bô âÁ“’óãL¡”_¥œSDÚïLnn´X‹f  O[2±övÞ߆>¿·a9¡ø†&¾4ÎøŽÏçÛ¨ÿœÛq¥TTXºsãö°»“ÇŸâ,E/ñ¨m4ŽR¬î÷Òø]Nã~•À7ßî«ê~xÿÈtQÐiÎ÷ohÜZÊü=Å-LrˆÉÚOAÌÖr¾õ-ºŒk%-Û|¼ÇðÚ #Ix£(y)ìïÎޕ¦*Õr úZúƒª%àՎîäú¾Ÿ®‡êS|ë¨CÅ_ ¼ºóû«´0Ï"¸V×`r +NzyÀ´RVŸz— ”ügÊõB/Ô½úÝC…A“—#/ûê¬t­† R€‰l³\×ÐÇÒô¢.×4%{ØK¾Ô‡dS¤kª²ŸÅý!ü¡›ªC„KaT—_g4볈aͧ‘p„Û¶J¸óTH»xa'oö›Q_cC)(jtF’…D\ËHìÐ*ãÌ%›Àwp '׶ ë½mÂ'd¬à͚=Ò©Êñ¾¯¡J– ܖDžŸAêks=Ƹ§ã +ðïkEãéâvø.»ßà©áÌ?4Y”D0Ž¦H¿o8Æôóhmóü螡o.=´*qþ! e®í_i3ƒÑÓÀʔ×ùÂûŸRƒ¨×':"±îê¦§ÂÄÊiSr› ¯Ù?1ú¤;п¹®²c1BVQ2¶ÒEúï!2²Ø7ù\1^|IÅïŠçù}—%™Íë“[è|Àorqħ*4+«xD‚ÕŸjŽ´­¥ltÿ§~ËNˆ-W&íɄ¥rŸ½=°+ÙÃÀjcžŽ;5YÖÅؒ»€k?äôÀ*|f·zñÐ1ëN´P–’ôòÀæPE±õâ÷Ô¯+ lÊòúý+½Ø^"cK˜wͲëªcîêú9ãCÑ/vO©Û|G$ÇPxZö©ö¸p`ý™Zç–G"Õ†ÃT¯¼,gt«¿½ÉùS°ÆIº8RŒ¹?B%~ØK–K-*Üy8Ò-gäуÍwíÒOrª‹E™ÚÚ:oæÊÖÀ;Š”dA[h ¶f›¤Ê±^ÌåTÈïÒ/·îe*œÌÿƒ *ì9øºt¯ÑËö{–+ØBM¨Ÿ—¿óßìo>ª@ý ®¼m’B8ôÄQÍÜ`®-K7S\?ê~T¨îAZé$V N­úÌ@Ê=ŸoÇc p°›ë€ –Q˜ {ŠDúÓOSw}ÆÒr¸ÒRr4HpÎ:ëóOÁzZÇ^&c»i$7á3 +ˆû\ÐȨx‘'¬ûAæwÙbÔíû[`V#¢%€Ã\竄âw­>›uÝ¿’L^Г,óx+öHâO ôÒ +sÛ».Z( #-u¾˜À¾¿Žbêì¿‹û]?/+Ëwn\]-§â}>Ÿø»*à±Äaܟ=¼eóÕχ­¨øO¨…= \#oæŒ`FQ·qêY¯†$¸»¦SOb˜ hHòŸ ä endstream endobj 15 14 obj 20743 endobj 16 14 obj << /Filter [ /FlateDecode ] /Length 17 14 R >> stream +H‰|W»y«¹¬`{p« ñb캎ÍÜzb@ÉÇöIŒøƒxÍt1yLb{ÿç_sñǜc¾yÂ<Åß +\´ +· Œ·@¾_ËX;A~èüöqàýº½`Ô>ØÊÂæõ<|î X”6 +t Ü)Ae“ + ð8p8Á°›>&H¥6ëìà̇k\c 3u +ÔYË/©d³·׶òu:•Ùnî·-fçCÈú¶9×[ƒ Fu(Ã/YÓÊWfY?¨´ÄUsñ¹j=”UÈZŠPY­ÃŠ¸­á“ø2àQFØ [o}r Þˈ®Éª(.ÅÙM{ãì¾ÄN +¯Î@\¡Êð`UäA$ìéàÄ÷‘AÖv r<Û¬(Ñ`چîrÝØ2ù\µq¦ÓɺäUÛžñ¹ÎF¸»™Öu Kçkmt­Ñƒdá62ڀGžAlšÕÙ 2†±ThQù¾+ú(],«ÒÄIXÙ:‘ż7E…&À!e ’gœ„ü¯)9ݨQŒ·Ïæ9bŽ“<9Ù §m6Õ)P'5˜å*Ò5þÝ.ìÓۄ€æ.òö£³½ý/m¬`³¯í!j\‘,},©´hwƍG𰓥4±‹YÔ¦ÓÂq’†ÃÀô–‘€#£«àÅËÛÀpXÙ?:–^ò:UnžÂxtƒ×;ÿšõ<°ÑØ7OQÐY0%Ç>~6òQÕ ©Ønøc%©??­ëšÈIÂ!MG·è…á^ê[žðWÛ}iʚî*ŽB$lM8å© ²ÉÕ[¥·9íÊø訶þjSÇ¿Þßò0tÂì8ÅUtAdЁ-_˜0sÍç÷TÙI)‹_ܵÙ[áSÿqà¿tŽ|DÁ>/j»ïӅ‰Æ>YèµÔ1¨…/xô¦ Úƒ…… i}6¯Ñø}Éa/73&ÕµyÂͳ}¿þú-v¿×N¢aÊý6¦¿ÆßyÉÆ#ŽÌ5 ÞÍÑ1÷B·G»95umڅÿ0‚~”q^ð#SÇ:ï8UsØS ŽÛ +Õl ãÍ{‚䦭ùDzՂgcUÑöbl€'\b˜ØáØ\È0Ûýþ){s)᷐¸˜Ïc þ0 Ï>± +ø¨I˜FÐê3:JOh»D¸À6 iq.#ËvçF‡=w4¶…nÂD"¶¬çi/ÛQwŽ Cë¨÷–ó- +„Çú¢Ç{ôp +8֖‰zp­Zœ2Ý.ûfiP'\¹DâæÊ| ®µ†³¥;cÔìÐÖ^ º_܄SÒúsmû1„—ØÆ@.·Eµ*6»»p$mϓ´‡Á«ýk¿|¿d5lÔwy§”éï0ÙÎR;tÞ8»­½›V{µå é©ï²úì²n°M@kž¯î÷³éæ»ziŲ3Õ|Ä*\‚ ì±º•{诜8=¼â1SìeñÒ×å÷¦ÝO6˜%FÍ^9ggà‚4AG ҉ »õvpʅbUª”ÃÝ®áý>ׯ?kè{ýêÀS=¹×‘ÌY”À¡ˆO&vÑO3Ö»d`F ÞQhþûºÁ­>ºgƒwQã;\"eñ–½ß÷g£ú.ïœï\aÿê@H !€T XÕÆrƒú1-WÂòaµ:1Ò;`ÏqþÃ{´•³ö|àô*јŞèèwâ0í8°äSs{;üՇ×YÊ3áÈôôOéú'ý4 8Vô>MLþj㢗ž5¹§M ”ßbÉûÕÄm.Y9!Q°Xd1]Fëf¨cÕr=C¾T +¤@€PJ×æŽä-H çÒT mé\ÇË`´_ƒùhñUó„öêËj wªýV¥ ŒlÉëv×Í9Ú_ +Œl_pؗï³þ^¦ÀxL¢LǪ‚iÊ9 +]x˜f‡Ç2øöcj_ZC¬äL ¢|6‘V’îÉMõ¢ñ8¼ð6065¥Ê d°­Wç³i°ŠhgõÍM`.HòX ¾zöEô'ŽÎÁè¸|æþt;Øj,×.t¾µŽ[­Ó¼Ô˜6?‹jz¡$­ì³¦b€LÍÀóyÇuÒw9Î=ӅWÝwŸ^„7ßXSÜÙn?û¶V##ó0,¥=á¯6P£³gOð&îuÏÓ] +žV¹ŸíÊP>kæä> 7èùûÏV_v¬ÇtÛrb|æY¬ ‚gz?útxPð¡ÊÇÏFPšu¤5öµ¾ÖÎÏUsædn@IxÕrß«bKÍζ‰ëŽ~g”9Nºw=’d·alõrÔM?}öÑ-WIÈ®ªp”eßÏ·£·xÔ +&¹‡ÑjŸbOì8­—˜<«g¢¦¬æ7€QoÌw|?א&ãi#˜GӋé0ñ b¨ðÛOnµYŽ Žr»Zn ¡ €Úl¥$ýy³5zHMûz#æÈü¯'H-÷~Ö[™ëªìö?ä}ô0«9^®® p¿ÎYXu-xKùýþ<! àr.nKš´ƒ;{÷„.éþ5+*fï 4ëS…Oªv,ÛÏ¢Y÷ÅhïY½Å˜·þRÓ+Ƨ{¬·„«-ºÍ{[$ô±B“З%"IÇl¶&‡oï o‚<]ÒÃ6£89ÀõTŠó‡K/ÓÝFsù<9 ïրk°æ}RÛy`²ÛʚsÄêú:ŽDŽjµJP¼ƒPݜ,=™9d˜Ø»·>‰—Ê“õó¸*»ÉµÞðU¡§a€’¶7zæ[`/%ÿ?íÕÖZçuDþÃy ئuöýÒ>ÙJZTRRÜؔŒlR¤€*·äßwÍ̚­sÎ÷I!$Eˆs´´/³ç²fÍbPXÝ$ ÉÃò¬ÊDÉwÔlü l–ÎÙCòÑTØԓŒ=jò•%$f™“òæòS±5$çû² °5>ÜÖÑÄ8܊±a ¤Ä%÷³ÊÜY|»wM˜Ld©PkøœÇگ㉽˜I°æÔ¹v³Ê©ÑTd’\ä]¹´S ÄØ\ÓÓ/@H›;†rn]k`Iþ„3¾ïgòÏÕ#O­ Q˜_³µa´J…‹Sœ]¶g¸˜NRá™Ò(+µ!¯‹e®[Cí|Mˆq©Q¥NQb¨í%f# +vQc‡3‡±¤¶!ªY\U@hrN\}YÛ«¸Û0).9…xkXÛC穅JÀږQy<}¿Î?æÅd}œÒéIísP%ê² )i¨_= +.@rŽ4|ƒ#UÙ1ÎeíÞ Ð|’<̾ní“ØȧJì +5Ñ>ð”7Êî„ÿ0÷wòx3Ú½ŸÂ¥54#O‘ Ó¬e¯ÊÉÄ–å®ãƒ:Í&U€^DâÞȂ\’‡=.© ¸›ð‘öm}HN0ŽS¥nÂàÌônkuÚ¥Ñ{—dó`³ŠSãQ½æ(ýÊØ"½L¥ðZXÚb¿‰<9S†¦]?]Í@tlMÍǟfc¯™jes±ZGÜbñÈ:=!ðaºÄi6ÖëÃ8ƒX§øÖºµ ãˏø\FÑa^(F[>àÖ¦“'`0'3™QS¤mqÀÓ .ÃP՜WûGKª¿xóàX)ŎfB<5E 7þÌ.Å +;0Bä»]‡ÈÂîóâߗó¢Orµ¹—Îng®W;‡¶ÄlíÆa*ò„°h¨«œ=PëI5Úè1 +eÂT¨”øeŸO§hÅÝËݪj‰«ÿ€(ƒnëK±‘P@aý‡µ‹M*²2q¦8›Ê/ÙõYe +$"‰ ¥ª€Ó‡„­Yl5© :GÜŽîĔ‚†'i›öq+š–ˆp:˜¥’žX[hDÙ4‚Û@O&t‰^9n¥>Ée€A˜„Ë´$I2šS)lÆD*®Ü²4º€î©ùZhÈ隋æn ¸^>«­Sð€Çò™&’Lªˆ’r°çò”iX;2ÏU¯8è(ä™ÝigÐi9 +ññ:(d`°<×OÊ匯-úuÒYßq­×04r´>µC;20›ð€°¦"*… ,÷NMi#XŒ~^µ®°µ“¾Í(òâF%oç6’ÃêZ`¾4óàd‹š +ìÒ÷{Ò f—b†ôý$åíý—Ë°kvo9 fá„ÉY¦bêÔCÀ uòº0B${¡ÌnÂÉnÙh®sU%ˆø»¤Î&¶öLãÚäÓ_j–Ðbít7Àýó°û¾­à`ŒEl.%¬<-wæ\HDÚZ N/K¬É‹P¶(_Æ @2Ì8˜G´ØÝ[ÃÜâ1#Óð*Z åáùWÕÀ {ÒiWхŠn¸82TNƒÓæö6²g‰`Û@q101Ò ”D¤:™³ú)@ËpxØ 'à0ÑÖ8"ǦL%8[`¤··¹ù¨E)§ÝFÃe¨ú,TY²š<•­·:Øٝ{¶çºû+4Y_Mª‘› 4HL´w*l¬.5yŸ«}¡ggøkšEÄLݳê dÏÆZýpQ‚ª^¤eÃÁ„7‡øl…7·ÆIä éé )±³r\ ¦f.ÞKÍ«¸ÉÝÓ,Púæ#‚3´Ãîýô©¨È4)‰ÄÉ*´÷X¦.ŸÊ\€‚f¼r˜œ ¨Su­Öö\¹ðÍÅ<<{~xûíÉ·/^ýq|÷‡Û¯ï>ÿûŸyÿñîÖÀ׿ÿt{?{s{ûþæã‡Cy¥øêâ3~bÀ·;üAÞþˆ?þ„/ÿôßC9üùð÷„ào¿‘w –©[ç­ö<£U(ÕpŒ^ ­Y +äêôˆGà‡3nmüúB*øºD™ ÁØH|@ÔNùÈ5øhHì·ïwÍ° BÞå@|+5ú „ÐWMÄ&Ülj &eƒŽ4¬é+›O5nCy±B“1Ð(4£âÛl–™JÂJ;ø‘„ì, ü‡o*U U+Uß`¢vó.I”/¾ûòÕÝýWŸ®ï?ýpûþîÇÃï=C ƒùùáË¿Þß}ºýþðìõëW×ןo¾ùáþ½,}~ø þ¿ËãØSÅÛ1æ.n– p7>PÈò?(ƒâÞN¥»[^;u®Ü£½ŽË­ˆ³ÄÀÞ]œ£3úÊT•6äÅÚ6„—§ 1êzPjq÷׿¶c…{ðQÓ<òo¬òÑ-Å{o’Û}wì6_œÄ·¹µ—„åëeâa9T;¢×ì*¼Dqž©i·5ëgÑ4\Ѫ¦‚L°ýÉ4Qk‘ýÔe5­–-M’©S?µÒ \ýÎ1\{²¸cX›­Fä.Ð™Y—?+íyÕÎM{=f<Ò&*ÉÔ§ú^‡ÓYµ­†â$% äh‘ÝKöÐÏȂS ±×‡fº~Y3ýýæۛ~yñòòæ;üö«Û?¶ïÿðøîÕÇOÿúÇ_Þ>=½ÿø¨à«÷?|xÜÀ/¾}||ûðþÝ¥¼DÝÞ|Â?¡p¥ò7¿à¯ñË?ý|ɗ?]þú·pyôÍkq¦…©äd(aÉ}ØÂn.ùZ*ýñOïÎ-ÞÝÀûýøôû÷O~z|ûñ—Ëo½@ö3^;½¼|õÍÓǏ?\^¼zu{ÿéáõOOoåèË˯qðwøË¯WB~,òÂono|œÒåç­'²÷ÉS=˜ß=ŒZsøn »ß?ž‡óãÍ7τC¢qÁ…å¿Šç7ºz²r3„`o¢>ž3þe¹B‹Éfˆ•Éoíۛxùú¹Ë7° mY®öyx–A‡é2aìZ+ÛÏgí‹û¿Û„ÿ—6‚SªÕÿ°Ed/K.bZ>E¬g¶v¤/ċ?ß,ʋö…ŽJCÎ4¼RdìË2 +ºÂKõÊiÚCà旍×ØpR­ÃÓn\y¦õ’NLÎ/Ř{n™TßÉ%bÑ;ï@Õ±á‘jQ× ŒÎquÖÀÕ±«}T4á åàhߘ—©˜Sb3MEE`ðr·³U–±=ØL•ï `}É +§ý2Œ4:¸µKÀ½åüAÛX<31åBàN͌`–Øè¡Þ<]±0֞–äL»`åìyPí(`c÷·Äy².ß3G6³\æ+4Tf¾·þ[`Ç½D æƒÃUÕ`Ç^ЇaU;sU±*˜z5 +8æiÒpN™Hѯ Íͪà6$Ê©_WuXD@l]7–!YŽ01O1‰í!#wç¶ïf–rŠcMÂU©Ì,AŒ±Á-EóՔlTó”v¸ºÝ<:˗qV°S¤ØR iJÊì¢Æ»Ÿ5$·Ë©ûöú¢£´|pk^Ö+ @(¦€'½ b/h`À }«,.j¹õ¢Ø,u9Y†Ø’»¨ùç±5s Rm—S¯ìíeðS±¢@Ýx±VÙWÇ^‡R¶wك„ñh`—º]@ÍbCóv28ªŒHe¨M±Ú9ؼ¬!Yú4 bSüʚ¹+Õb`Ôö…†•¶ké­`e-pÑþ6øÎ`fe4)¬³‚`L20G2Ó¦B[Ùµ³=˜1ûÃ؜ç¬æº{YÀ –ù2Ëi<²›Xª §^üÁ±&(Ør®‹ÝNöâ­Æ¬²Wž–œ7-4D“žÁìZ°n´@muÄT¢aVž!6ØÀÎޛ8›£Á9)sµ©a¦ªC¡EYrÍj’J D\ÛWwÝJ¡s¶jÙÁl—bS0+)Ãòx±Ÿ¤u;ûÒYÅy…³>¦€µ¶ï˜Z:Ñ¡»Vè5÷ÕTÜ7j¡r4,•1ÞÜÏc\n#՘b´»QÌÞt9‹ë~ +ä­¸—¯suOC*3Ö:ëÌ«¡ õ,7Ǫc›ìÌ>§Ðq’«Ónv¬lzw~ÚáÊÍòr[N×,ŠPØ5ßÊrRí´ëZtU§1ReÚ?œU|娣x™r^cDÝ5Nv‰!Ggç¡FV•-Xm¶½iç”yËmöŸpc°d +ºVHúšóĚCË9‚¸úç ŽA “³è”‘p4ÀìܸÜUM7 »+åý÷À ^mꠁ‰¬QgU?€C¯£!¤WgL•œ”ìlï.ÌB­ ¤¨-)„’Wà½`Yµög9„õe§!,±ÅQ£W"|<2RÊX©œË”Nxvk­ýQbRÃê×NIÙ +FƒNI€96O—^oÐ̋¦ XMìA“KZãÊóûB^ɵÓö Öîï‚_r’Ș½ëäð¤`ŽÓÀ”xLÙ½Òy!XÉi:5Q̛ùyŒ&1+dÔeOÃÎï=ƒ7äw¹ïaì<#^™Ð%Û +l}—TC+Q—`êÝ»&·hžUXÛ/ªå´£c«aáßט§P¡lg«¹Ú#ùõ;ÿ&Q®Áô[/d¼TÊD½ +®@M®@{, ¼5á›jqa/jK©3p·E3OÍ +°r7Å7žEÁ–<æ1aïÝ®I È*ë:g\TÝ\ø×i€3—|w³?]zw»C­+˜Ýì ¹G{KÀç÷E« ³¥ÈSå4€=Ó:3׃_CÔZ`"§öà.µ^§H.rf´˜b¶:E¢ª«(¯ Π“qÐnW½Lw'˜uÂqYI¾5XhmÀY-p6¿†70:3GoáCKhq.KC‹zhT‹µ /rúüb+”n[°7ž±-v¹X»IZ}ÙaEMøŒË÷¹ôÃU‰³‰ÿ±œp?# E/ƒÎÉ-¹èXT¡¬ŠŠ»u·(U)î6¸ECSpψUÑ´=t•C•F›™±„Ánó®ÎîlgºœFàw[µœGÎZëÙèhÔ¯‚¥ûÆDM·ÉtOy•´«ð]væwÉ,å…%8Øy•™âÏë‹àŒµÌ|opâŒh)"—A¨»ƒ+»‘nåÐId Ú&”\Ì5måJºû˜U˨?9D>ex®¨€#—ýçØC°ÌV-`yÒ0ÍQ+pŠ®™üû©8S6Œ±'Áà ð¢³kalq1¦»£R‚ƒ%¤>p¦È³4êR#G[1hŒ„ýýÑe÷ú*€19]rw›à¬¼ŠjæßԞô«ßr©«\)ؙ}H’Óɱ.|"Þ؇Žô‚!§fè‘Ýt"M8F®Œ­¿ú}¶ÝŠY‰òîfržw»duˆYeÚòè×õ™•S>/ÚL›PrÅPB!O’MÝ_Ëa)”»sËÏmY¦–žl(ªd‚%‹ÐÛDˆ)“\dÁÍÐçðØhì–ÜuP&U3Û0ûÇØl'¶2Íönwá{·:f¨‚nõàìuւ³0«®óZˆÅß2çè9[ŸÎTNТ"Mc£*Íþƒ{µÅDࠃ•LQzì*Ù¬¶@${A´äÃ`SeÀ*þìóìs¬-ÚXËý/ONl6ø®&¥Ö Õ¿0ÀµÈÕ{’êß|WIŽ$9|Aÿ¡_ÐÐNé×xÀ\uíüÿuŒ¢™ÜcÉA…€•œ¢¸õ0f0ncs¬^Ž¹‰ª‚Ú&æ\ßæ.p !uê¨åY_ãâ Uv 9Ë–xvô©‡•svÕ×ÌüÚjø¾ù¯Öމ:¹+Üd<¹( ç¨-]ßÚI¬~“›¬Îa:›•Y˜^=~iSFOÆdIµ……¶–}ô–ÎÁ\fèt ô-¿öý&JЛðÀÜMç?#Å; Þ:Aã¢bÿ4›ý|íËï{‹dÎ[CyTu@eãó¤zûH{» O¶xY= %b;Êù~`ý$Ìáüb´qâ¼Çï·:q^ëQ.¥Ý¢ô|?ø ë¿2®çem¡a-rõ#xíhe2ÝŠN&`Oü~gøÁï‹ñè …›Ø~C`h.‚ùè‡û–Ý~•¯¶Æ,õïÙÉÀ–νÜn¹W~nÇýÒ ¸™~>ÿϑ¶}7HÏH –#)ÛVöqÀ+E¤¯;ˆA#e™×º”4­m€w¹ØcßóË|zÈÁÝ}nt=­£¹á\gá^u }(Î~”ÑkO˜ŠEÞ¾>LZÞ‡éVn?BÉ´€}f˜H‰¯` e·bsxÐ@*{œ:=’)Ì#)$0pêå|Þû} + U)e•0Ršcçö<ÕxJV§SsÍcv> ]-«’ó—o±úµQ•m®¨¶ÈQÀ ݓDl¥åvúùÝÈoÍÜ'âjŒÖւûºn!UN­/e!q£rm*_+ƅƒ+ œ-¢x™Ý~EjŠ®è€û( âÍÝ 5ÔÁË÷e˜@ß5 Ö®Ô:C¿9Lò@Ê×Ð]uTÖF-‘°ëª=ùr>ôÍ͎¢3ô€ZÚq`z¯„Qü{¾ÇØ1Â^1O¦!&®¼=hÊJN îðÈ֕o©ùšÆ«G{lOì`¡jRȍI8_Õ|;üuÏc»øÞCÉvû‰×¥ú¥Ô·V#8 Ìfvz-–»폩qµZ¬~ØUÉó»ÿïhǑô˹ØBüx/êù³ÃÁãðÞ©.»Ãy©Ü\&9͔o®ñd€kbü9ô´;®9 p-Z]àò ÅUŒÃñà:K…ì ×Çxy[þö /›™IÛZ‹Áڍ©ƒ'=mæìÎ úÚÁ´å­â"sŠ~)“×mnöù5*¾¤yªÜûۏààIÀû×óûiÁlR‡Ï•@Áª,øÔâ-°à|G{5˶C?Ò Pñôîÿ!Üzð,7òz·7ž5ôÞæ”P¬>Õë<ô1zÛpÁ®!ª‰»°ÞFí8ÑZºax½ä:Ð93¯o±¼Âb©¢“Ëýíçãû«˜ äfÔ½H[é‡0¾m„‡…·¸zéh™]X(JÃþ‡Ÿs¼ƒ'VÔàð±©îGh^³X° +=›þ#î%8·ús]x=í˜M¥7ž…¼k<ëK,ÁД²*u֩¢cylM0£äL£5÷vr>LÚ8 ¶hq€C¡éҔjÊúWeR>Œ–¥4qÇÒÙl堣셿zîC‘áø†­^ò[y °v¼ÞE‚G50F¶¦r°—t]i¤€ kWðBX#_î†VS“Ý2v%9Øíòëgkç½l¾ÿ÷;,sÈ¡›å*ܗËfž—ÉÝZ50ì|n[§sR,©ïß_¡¹9@Í 0—©6½ü‡¨¸Ja/k+»§ì†3`Ö uÐWPN¿j1ä¥{P“(и{â ÚÛP‹y+"=VVÍ:«mhGؓ͏'tŸ‰zBŽ…E0AT6ÁVƒX¥dô|/t»õü¨®íցOnÒÐ]ÑÎ÷ì²Vq®r5^[÷Ê(EŠÃyèµ·òö¹ÿµÔ#àȹ‡¹ù|÷C˜spˬ%œ]eHöªRŸٔ*¬˜»»u͙ì|>©³`³’*ª§ÚÍÀƒæ¹^4£¹Ò¨Dé‡ûþ®ôwüåý÷Ÿÿ*['—œ¼·Ç-XÙºÑ;ùôÄüùëõïŸ_/û÷0f©:ÌåÐñ"©ó:}³za‡•vTá*Ña÷òð­Éá‹cîr`«í­_@ÿušœŠìÒ®WÜ=;&v‰~}ïã3ê÷r¾ñ-‘0¥’ƒ§Ä?Ì*뙹¬×ÎÐP(g£ÊB„°ÁÎ}AÓÚI¨_›NüûZuå5htï~ŽrfËj€9&®Ÿå¬V(ÆЎè+úpíü¾E%Ê[ˆ­ƒÕEŸZõúüX­ÕX‰€-&ಆL´Ri 5°¬Ï‹od²š‹ÝŒFåéZ,Þýœûù‡wä.ÐE†öˆ„HÆ=¯ÀD,8XÖÑQc×KŒXknÑQELÉÂô¡lkLÎöt%ºŽ*»®ì#2 +š9Æå^5‡f·ÎpœJ=˜èµ`^}üàÇ-ž™"õ\/:1ô"_+@s·´Þõà7À+sÔÁ%#fֱšïå@LJGS*:Zy¥ü{ü¯“mºÈ½÷5PaŠ¢úü@ýùÏï&ž¿tÏX•½4ûl¼,c_#ÇlÑÀ£EÔaÚ šZ1))Y¢Ù;qr]̚.jO¶§Fæ±~¤`Ÿ­Æº‚µäÔ¤fÎ xQé:dîþ§A_WNډ>^ûü- 8™Ò¼Ñ‘âr]·aÙ-m~¹­qúvø‹w׍;Ÿ0OOe›Huæ›ëœd$À½žÉ²v(Õ“_hûB0OM*ôDDhZzq1~oZ ýª‘Ε4Wg¡ˆy9kçþ23ïëÜßHhxiêvhM lnàù×ûéÑ¢Æ<Yã~X^×"Õã¿Ë±;³Ð}6½¯æ3®ä3bÚ;˜ÍX p CfÈ>?;bAŸÆmÀjo&¬«ôZ@pS€æ” rãÃI—lÊC¶ÞÜ2-|›YK$@pb0¥;bìγ¯Ý2‰³=½g/\£Ÿ‡½ÅëÉÁP´„@YN×¹j¶•ƒ±²¹ÄB‘6ÇZµp êÿ#¼Z’#ËUè +zµ‚ +BŸ±§^@O_xÚ¹ÿiƒ8H÷ÞÌê;Ò'B|Xw~²tx$œ<ًr½ØïÊ­rZ¿,EçV€™g0>f¤ ݝ{Ñ´@¤(›¿“­T“M:å]­µ·ã}äýK0ÏoÑÕ;ÃWÙèç'6&óT+°©´Q7—WËgeKAÓ5dÒ\T˜_%ïx&G¹\Iht][i …ò§…mtÉ& +vùÇêê°±ï£#<ô¦z j¦ã̖¢”ôÐÃà,bKv¶Rƒº½ÞàA»­´j‘Ӂ˜A2MÈ6#Ú×c 1fØ”*&=4 ýŸ&o¬öŒNJs²zk˜¥~HõYT¶ý  Þ̚ +:iZ€Ø;ˆ}Jc`¥‚Ñq—ÈÜ¢ª¯ªûàþU´£·èZx²·Öt–3¦ôöžðÐ_wQ ÌyÀ#ˆ'Oѳ2m2OÁ‡ ®Iú|ˆW$Sõy°¯ë¬“Oe7ºœÏl¬£}JiPL—›ÍˆÎT,=SëyZŽëµŠMËÂébßÌ]ïݝp_†…Ó­*…–ÉÁÁìíµ,í–SR‹üï×ò„^ªMß|[¤f+~'kÒÛR\è{£¥Ã+álîù0¦¥ƒ=Þæ`pu‡fò_aò’i†”r˜/h‰wT'ž-EíSñGsó5;‘mB¾¼9ʑbÁ+áGD±ß#_8mS+wIÉþèÒc$l|*l“Ã&VH[‚±ãZÇï­µ>wžFåyeÛu{T>Ö¼ Q¯„4¹”Ê ^y˜°rDÓ>ь궏±Òº +ÙàãºcX†a¿‚*ÂÛ®¬Ì³HÞ"Ùãöú‚›‚G€ÿùÃÂwsl+Ôvڜ€Ý¢Žeö™¾%ZÖdÏ[U´¼ølE_KYYj ¡a,ö”lÞ}¿R切c‹sFkX$.ÀhéŽIÎZjOÉÚq{³plSlcžó½¢átŸž†q¹ß‡õŽlo‚îæÒ»é­ë\ ì~Ù´F×ÛÎìzDè1G³;Œ·ë²áø“k‚<3(þ  «^‰Ð¬ïÖ_̦˜ÃÍi|°§bÛR_©«Öe[õ¶Ùæ)Ò¹XЧ¼òçcûqÐ{b€ÚXT£[ÁˆôHø;aM»Ô§^–ŒPâDl£‘OŽÚÒØ{䉛ìV¾K/÷Օ'î‡Î|÷ÙןjÕ7&^ÁdÞÙÞµÅö¢ ÀÅs¿ªãYd»ÍöMç +KÉ\úë?"v¹Èí@™Ro癲Û-ôj¿ôºŸ«VDá©HEË»E±Ò±¿ ¡wÑOž~øïëmên)ÛC¶§I¡Ud{ªÞÒâé©ÛK7êög¦´è}D¯9˜[â=¼¥àãßQ¥VþX*»„s^ ǀé5Û¢æ3  —A…²Õ6Ȃ%:¨»L-Ó.Xú§áér-sðQÛ©4Øï̀›ìzA:¢hlšr­E’…÷eÔ pëíƒa™MnÁ[kú}ôìÏvyÄԵ‰¤Ç-65P¦6v{F šo»åtí^J‡ôl76.GMÓÚHAM&wS{» Qó۔ځ£YÜôæÒ¡±èôXkw2Œ4âöˆ/ÛލX×}ß3Õݦå$|nPWøfÞÚž*ÊñÏ-àÐ,ñ* _‹-óxYºàRW¤ÙyºôÀ¨ëH0è‘ :³ýúë)›K†ßÕWÛ»+8,ÉT²6*cûº(UÛl‚#Ø8†uæñVû<èwZ…Ó2óöå̐3jpma ìVG[çòðá¨Rq½ÎÀMRk>ɘs ”£& 4² P8xœVà#@¶mm+èZ™ ¦±¡Šª¶È6…Á:g¢¥³Ý– 7©n¥,²þžMÂÑd°ò]%O<‚qœ¬ikÞN1Š TQ¾\ ȋÖ²ÚVÀœd‰ÊFx⩵G_¾½ç0dŸ›A‘-ê}ó–=eweç ¹¹ØýEblì^¥Ý@9Ìôz8j‚h”>rrqQ´UŸ‘³A¤®;©«é,#¨ +%ê[Á[ÝA¨•ZooׁZíµ ttXн±ìYm³íJ=‘)ôíæÝ+wQÜ? Ÿt/EaëYõĄ { .dp¼´_°¡Õ´LÖoOºWßDí] ƒpàB4ôµÂ¦ +”œf¼lÐôSr5³cuqÔ¬Ì|pºÆª[”.ÏMY«åmؑÅÞwfã‡s¬ÁHÑ7ïžeÑ¥:ÍÈr¦¯õNªLoùe²gÔ¼[$w¹ÀOõ`÷Á‘s˜ev"ßw‰@“2ßÀEOßÀ®WǃuJ÷^T/„/À1D.’¡ _òÒû xRዽozAæ݂"¹ ìmÂe%— ûž  w­Ù[$ïSêÆFw ‰w3usì›cªwH81—BŒƒXh~ð+Å2´–ÜvIéºö| ,8„X-‚/šw½`{¬5ÂFø”LÙÉÁ Ä´n–øœÝa–@©Pƒ¨¥=¬$MÉ!mŸW ¿Zc!HJ[SÌ QøÚfÌh8®µÍ}|Æ.a±#Îû¾–ÇgW`¹wzÿÂaóuH’*’Ë*,*c̍*g¶­) k‚«t5b@¼ßàåc”æXµ\áï”^ˌ¡%ã4[–ÍÈQärgn‡™gFÊÎØ_½ÐJ‚¸È0ãûüqø:ÿ°ÊPP!ÃX7x¹j›Õ={ßÍjSÎcK—Ãp0¸¤µEç!›d6_‘%9ŽÁV-PÀÑj cMLkÍóY!=HYž/ùÑ$J™Ên0ö¹AÔ·YêêãüÇe¯pµÔà¦ü0as +:d 5êæè.Šv6bÄ]ƒc+öI`6³aÏ"÷»²Mk2ðA‰ìY`.™«lÿ“ŽîÄh=s•U@Ɯù"`Ç[ÙidqÑx—Áš Á¥c¶ºZJ€f;6·ÚÙ9ï¯\we¾Þi„Œ±‡™z-çá‚Zök(%™®) ©WxëiÚö"¯­ëáÿMñn–’sÄwKI'_OhÁíñÅþß>Qnsϲ›¾BÜï"%öq!¤ê¼v*°¤’–O¤Òë#Ó΋,'vïÊFo1XêÑË3óÒ~O¤DRóÚŸ*V÷yôA-ô֝F¡Ývaùž‘è"ç{Ô7Lî±Þ±ÛȲöÝ!ï;§jù½¸­[lÍôL¨Í@É®Ãü(¿‰±š Oò´³ôvcz¶ÚlX÷­kÕ1Ï`¹i hø`îDbÁÝ”Eº÷6S#W]tÖÊÊ2.*µ@ëWIe­r°¬U[4ä +ZƒÚãMÊPÐk§­`Κðè¹ÂÍßcØuƁû°¦f5öºaî=-nÑå]v/½BZ½ÆÃU~Å­Ÿ¿ÿ÷םUX'ó{½Ãš%âÄdrûoؕ|Öý½­ Ø+$·8K¯îûz‡}¿Ø&ê¦ÛŸé.“óÚrGÐ9tý ÍZ{ë,¼¾ùoD:ƒ½{þ‡‹$†‚pdò¡ÍndЛà4ÞÑN¿Ã=fú xà]ҝ¶ÇkO«¾à>+ÄJ§.¶•AÝ©šG2<«½oâB%©°è8xÜÃ¥Òwd_øþ´¦*Ëwíwµ¡§™pÇ~ ØñþÌÃ]>šB§_‚’ôVFZÕº8Y½ÌËÑ!6¬Z¬u0=l‰£ʛ[2‰ŸÜqF’+\}q`2.ì²tËsIr6I³~ —pµéwæs„«m<_ÏÅûó³T¸Õ$|1[||>êLø÷žz=֥ӚG{7\2žwÈíìâ0u†ûH;äc.l¹v¸Ì=(kSîBݐ¼½¢¸ÁUGË3ڛVÊ*ŠïeÆ-40î!–6\{ Ûò…AŸq^Å-ñ1Å\c'SíX5k9ÒmÑ¥Û­Ü]?ÿ·¨òvÎFç3¦ÐĊUºñ¬ìïV¢Ì¤‚ +É9–C^#Ž¥~§Àv®L[®œËsQErìLý¹`$OÞ˖Hî×V‡YvŠªm^ÏUdß ðbjž-Áàêø1­B숣ÑØ+Œ‚&xƒûÇ^°ž|éµ]Ž{K³„$:Ih0]ÒmPl¯P4·äÜm pJx-±ŸpÌö ¬­VGâÏíAòM<*÷€ùyBÓ ™Ÿªûk"ÛÅt¼—åép.ÜÁ–1<Öè2Ží÷oþº2}PÃæÁ^¸êˆ€VœT±fm™Ã½x犛 +¿Ry;[Å8ì‰'Ö~Œ(R4¥Ã·@5µäp˜ÃºJ“K_¿Çŀ»VîæšÇi Ü®“»˜¦¼OCeU¥!XJ°èz +(…ï£X¶6<Øø/é6ÉïS†Ó’„Å£xzQ<\¯Z¸«­ÚÛô9Ⱥ†l‹  m´Áœòr°ÃúúíZ¾ÿjbTŸCñk.ór®ož« ZWFÕ|qQV­>áv˨Zᱤóû=”>QýüÕþ´‘½à U£Gºf•i Iùܪb—ŸæÀ,e¹eObU½N‡¢" +áßpíímk*^m¨o˜Æ’ã@ü¬[ëz ¦&Ná¯ª0¶.3õ-uè2Ï¥­!¹õ´ÕÔ;‡P»)Ò& Ö;­©[÷«Ø× Å#WúÕRKž±ªÂ·&óì¢Nñþ A’ÀvµÆcä¼Ëcªª­Òãg‰C”¹ïqš„+pí>ÔÅtÉo07Úךv û͍ÕyÞ 7Éïév̝ †ó䳏Ri+áv¤u +ÜB+êq;æM<Ùv‰üð7:ˆW_3…ébzÌ’Ûå Ø¥1Á‡nM4EÀ+>KaÃpÀ—½˜J™øùÞ&ûñÞê–´âû ¶Lf…UzŽ[Ïï%vãÊä¸VÞ¶ý­ž©rtžzUךIÝElÕù:Ë¿/X![zU%Ù)S®~‹­2‘u’¸,>¯¿„ÎTj—ÈdzåãJõñªX +_WÖ^djr1¬¿î55‰‚\P«Õ{l-6Lº>êΤBïǪßV%´5ñÊt¯ÂçÔ¾­_RÂ÷TÓ0ì¥Nyœ@´¬>·žÇÏ¥§|ÁuƒrQŽ†ƒú綗5bl!ʊäÇñ¦ÃTãç“ÆœŸ÷§ZHó"Mþ~Ã¥OµJ[®ÝsHm‘•WYx‘¶bN\q—ÄðkiP'M?æÙhý8ÐGVNjIkTˆh5¢2v°Øtί7Ó¿–yVì{¢¶UiËD:(±ª–£mM½¼¼ò–¶.ߘâ%©þÏ?O<5,Ôtúo.×z7+N³L´¹É¼ÀÈéÁÕv­.°­§:ZYgšž`étJ +  ëk­˜È¹öÇaOõâlVlêWÎ(Û³ÊCX,Ê٘££VLzÇOõtiVyòj(a[ÁÕÞ;Xó¦fØÖô>B…"íRa^GÖPš+^óՃOÆäÐëMÿÕ[»f¡½<½néíÅÑ'#hu ¬¼Â†i»«½Ud¼:­¬ ɉ2ÒÅ~Éö :èÂÞ´«8ΕÙ4 ï⅍äי‡a˜Îz2µgi&ˆq9ÓöíÄ žîW£°Sž¦#ï§Vp£­´Zªv,€9a?Ze¡p“e»\¨[¦R°65h¢d‰ +ÃÞz‰Ïû,ÄÐdfŠ=¦¢<Í.•‹G~ÝbåiЄ7X5!ß°qæ&Kº­>ߕ¥\b=[þûÚªW®¦2ßk¯·ÀÃO®g .Rz8¬ lŒYâ{6}5ՙãébX¸b.AÅBkȀd›Übêóu. É _uouô[é¡Éè÷À¦6ˆÔÊBªL½×sX!^ÙûžÂYèsbýÜÖrmGkØ.(7ƒ ¢rOç%´{v­‹ ¸cSŠ€Ëg. ºüãÀ]ˆe¥(…¾êËë€þÅÐÁÁY7¸š9¹¿Þq£çÛý®ØkR¤Û²ó¸ÆÓ5Ùa¤&¼ƒÊËñh +ӊ¶ƒæ¹LØù´¾S‘ ËÜ7)–1Åueö¸”óF7ÜðëévÔ.áö´Ã^&ƒ­Å;’æxtۊ GK¯p;ýæƄƒVû飣³ÕëŸu—D_þþâ’Amö:Ë lä<È<…3)üyy]v‡-…mõdÐç¥y R&Y'™ïZɌ5|à ±±W®ÂÝ&g4ºa m…ÐŽ½n Vvýëù\yó¸´CŽÈÅár´[+ì‹Pàñ9ö£-õ·)«´séèÅáÀe2Ãr8›àP—¿Ÿÿ÷RcõƒøüO¿GjJôÖv5Eg¾«Lö[Cű¤½9ànìâÌþ÷ç0§5¥ºík½ÜJI„ÇÁ-®‹ݐŽ_—Ö\rL‚Dùy¹‚Çu}Å=²9Û.ª9õyádÓbU¡ Ø=M}ß²säˆ77WºfŒÂ R¯ë‹ö‡R.Е ¶«ãrŠo–ç×KŒ]Ñäb¨˜»xk‡Ç¹ð=„òq¸4~ÌuK”ì;­BUšë$鎶çk™„F½R|§p¸ä·ïÿ§»JVåJŽè¼¨¡{#rΈ¥ÔxaSƦ¡±À#KÂÖ[´»Ýøï}bʼƒŒ@¯êTdddŒ'ª[Â3Ð>¨cÎ   Ñò±ó€“VTTGQãHax©¸¬³táAiÜÍB@Ç̗H÷àzS°AõäâWKïrk[|!­»¦Yïu´’ªw4O@×»ø`ëªøþySRxð–vÚáyt—ÖâxzÕ žÅ.•e“£jŽY §‘cNX]ÖA®®™V_=¦3cڟstÅ é=‹_ƒÑ1vÖ/ø”:͚uHˆ²pÏáKH] ņ¸P ½½G5i7Û\€9õCF.‘:ђÒÌÀ<ÃT}AœOý”’Ï<ˈ‡¥T+ƤۻŠ‘sJÌä鹧ƒ}¦g +~PlQ°Èïg[¶ dÜ*ì¨Òr äº è䉱V1ü^mÅK¼ïá÷d•^­¹¯óΧ>ß°ø& ç4­L‹g AëÒ'üŠh´ö{yã^¿r\á³Oçg·•  pžP€氒HO‚Ä¡u_ÒŸFÝSŒ/ƒ®aùŠŸ[œoF8Béµd Š6±K¦–|07àðAYfEmÁm¬Aãàrׄ/lšžˆËŒi±º‹Ò™¥ U?ÉjùZ¾7©V§ +Ž>ö2‰O¸Dt±©·«èÒ߂.$HGÊqNA´üÐÁn+(w€”#åz>*äoAõñª¥OÔ9GÎòìû#ù j]Ó)½i|LÛ@·MÛçR.™Ÿ07irÑÁv:ç·¥hHúöÐ[£ø±Û. 2N ärÓJ™¶ÖLó&Wç‚ØŒËHý:]Šël9üšœaRÇW%dðD=>›»ÒÜú:/ƒÞ²3±d› +Ò8öèuސ€ôn°·€¾~„ÖP0Ƨ.‚MP-ÀÍ/¹Õý[µ6%¬ù@Z¯›Z9ÕÜU¶H’ˆR§!£àJ«B²ÆExÂÒùnAιžuWàáRÙ)ÐÊ4¿üJþ('²©õƒO‡çÈ󘊭‡i8JÈñAkL?ˆRKëÊÚûœ“›†Í¯ºâÖ³ƒ³gÇPՇúèÇÑÀB’Ã,z”lr¦çe~‡±{ß¡´ ,ýM+î/)*;&µ Zû»àŸØ'°Áó 1G¨ÊƨӾe‚z¯µ½Òèv›wYWê.X=Z@d]ú¹ÊÖèònWù48ƒ”{[Ç9š1s*·›tò8(3ÏÀ9Æ>ïj1ò„9…[¸ÛƘ®m(‡YD ,³n³Â?o0Fi$r¸P–ˆÄ·Ëz?škìh‹‡mS•ÏÜÒl{ˆ`aS˜OaC×̚ú ¤¼r jKkÁ9[¶MôÆ)Øé4ÐfUЭƒGf/nHOâP«íú\[]§å¹tlu+1W›&h¸(YÁviވf×í/:YÖ·ööæܸƒÜ”˜&…;t›Õ¡ Úf·Y鞇Û_(‡ÖéÞò«>Æ4)ë­9îš^-¸kô5|A»“kûêtU©åv^9rLã(Ü#*{v.t²ØóèîдG|Êó’Þ ¢çÓ~‡eZ*Õi†Î:®L¦™\“]dÐ k:$ë‘õ ,fŠ‡¶Â®u - qƒ`۬เ©-2ÄɕŽ¼žº%W©ù«Ãñ® ÕèD‹i:Øf½é-LÛ0§ºŽ†Z'ÛMøB<,ˆ*ÀLAÕ·Y4di%"÷LšyóÉuY’mÖ54WZÐ^–ß"2FwÑÅqL´™jKP!Þ6å)‚YK½ÍÀRwÁ"AøΏg4pƒä +d”%°%)Çô6ª0»¨®YOGÝ1€;­—Ø&u¼Ë @uy?/+ÎӟU„I^ (Ö±ïŽ +ÂƬK›˜%ú‹ÃÝJVÌjN¾"ý\j4Øf³ô¥PS¹Äë2--­ÑÑnZ}ÙÖûÍýº°c ˜¦‡N›Î‡7 +lÅ&X½”û0¼œRäðMè@ i!9­_À’¦ƒµŽ­€”Š¦1"%FŒ&›íº[ †í–nؐ¾jGÏ®VÛE¨mÝˆV2»rº€=Ƹ€AzžEÛàn=<Ë@ &[±g].§Ô ŽÐå˳0d”q–kèTo #>ã¼pà³g»­,–ÔÆMÌÖ";Â7 É#ßÏ[«‘ÌÊsœƒ·ý•"1¨¾¼ F}7Oäµ)ª,F¦ËÊðy†[söäÂÓUŒB* öe#[Á®ÀÏÜӆÏJDû/üøæÛÇû?ž>ýêíoè/¿~ýôîǟÿý÷?|øé§Ï?¾øîóßþñz‚¿ùáõõ×ϟóۗôxûò3þϏ¤ÿÞÿ_~‹ÿôË£=~÷øӟÓãÐ÷ߋQÔ,7«!>f/+HÖnðó !ØìÓ`+ù?ðVòŠ›ÿ’À!°ç€îÉ +‘„áwüÁB5B,A…5’|Ë"ùþÎ}ÿbZ{û’ñ¸ŒÇáPÇÄúE®í²ïX.Kk}R÷ÌV +ÓKÖtõMKÚª [kE¨þ#²8È5µ\Å2š§‰ —ÈÖpÐ%£ª#YSPۆÊv”w7ž– 6swlV–¶doÆÿëå¯ðWfäe’Škøƒ^-ߒyĐÕmE~K …‰2l͸ žL9ÃìºC£é7ijáÏHSþdB 3ee‘²^P‹ ®‘)£ˆ½½ZŒc®ö¶fE ïÓ0åö:kj‰ŽØe²6í}̕å`ß஍ºJC>U1³+€Y«ªmÚ|2‹5:C\`ý¬!P< $ÃJ´Š–8u?È8¥¶¶Ã˜ŽH%·m9D:H<ì¼´ +ÛzImm²Ü¯FÙ&X—åbFå¯ÇáÌÁÚâ#ê¸H‰«: {ï4£\=­»­‘ˆñ”Àž?5uªg'x]@&×<›ÁÊA<½gw¦ÕJ‘%£ÚCS%?®Õô5·xY!ìeap§‚²§r½úO¾í\y½U†Dö +Kå^ÈÀ‚‚7RÎcú ƒ* n¥#zpžúª9à¸ìÄ°+`¡ŸÁ$2Ò¼’ hõ+ø·j%<\kU# ŽG­[ +ά±6»ÎYÉödێΞqEwB}”âzR³É?Ñd};ے-¡S’Oï–ê“MÍLG}£9ÛØÅÓu‚ê]lýe°©—¢ÃÄÓÓ¤¯Dv*_瓒NUª=Ñ1Ö´±­µؾ7ÕhQÚ8wŸ Ø»9Pj0“õù]ñæ¢T1„°BIšj-%íký*HC|ÀOR?ûàTÑ®B‚[Ñm 8Ø7µÑ¥ ,YQÚF~€“ö)Ø1'ÛJP +OÕ p#3MOþÊ9Ovûh Yòìl·%E{ ûXSSÕ×Î"0híld‹¿2ÛfÀÒõ½ œ–‘dOÞ¨‹ÊÐ d\u%6¼rŠYƒx:î¾Ù FoË´«ÊìLP A&2‘ÌK—5¢ù N,™)Ú.zÎÙ§&¸S%ZßT¦Q#‘•t¹ZZ~ûï]ÅŠ¤ºº—³UÅyDâPÈ8»÷˜E;A‹ ê∺WŠê,®> stream +H‰´WÝnœ¹ }‚y‡ïf؝HE‰»WvӋíZ$Ým‚¢ Ǜ¸hœÀuPäí{$’;ç*½Ïø€¢ø'ò°í)o—»ZOy_5—­×Öö”ts¬7þ« kÛïütãÜ­ä’]USí¤}’” ,EtïšÄa%ÙBi"¹÷â ¤îZ%'†‚ßvß½zrv{÷ôúòîúýÍÅí§íG@' .õ&rº=y~w{}óf;9??»¼üøîÙû»‹!zº}ÁŸðÙÕý.B“‹;׸»EÄmë­–=2ZۊkYQè®ÈÚÜݖIÿïž!쩍ìöŒ_äŽÑ>KɆæ¤ìÊ$u€iŸyÌI ,RŠ§­ìsOÍ` š²ï™ü*á:1Þהk€Â~ž!: 0u²º©Fè¤,Ý1YFqÉâç%²¸¥bÁí¨ÀÖM©ª+mð…ÄAžg§îYB¶iv[KkÕâÇ If·¿TüŠ²•ZºÝ¯ÒÍVXèPM³ê›êžJöðeÁ›Ǜö}ïT΍6ke÷)kf‰8{PjÕ¥àpNý²¤u–¦¢ձڋA3âf~ +­€k¥¨âä©BL;‡ÿë盕fÓÚxú=§:k³iÙ'êÝ_S¶0–}á2Ýèû<Êíåå}bñ‡ÇL†ñòð‰5­ûJìOL;±‡U0=j9‹‹–Ô³%ÍØ 0#Ͳ¤Hîj¤')a€wۗ‚Î*õ¶w:d•àÞ25Ñ3Í,Bx¥¹d*a텛[@\Èe¥DR.¼ ÷7Må,B‹á¼s˜š‚«d7ƒ‹»Á}™öˆoU‹½–\BÖÇÐx/}§Y[ícrp. ¨†QÖ$–|äNë|<(ÀE뾆h!َúÿ ;¸ &×=;€µðQœâ¾‘Ι“õR/†6»Z¦9Á­+{Zª8\8ue¡Û&ŠD‰2׃köãªf#˜®ó¹ÙtË™ãí¦âpQ7?Œ&­ºhj¹8¨•Crô*;·_sYëVsÍáìxoR-ayq\Üuɶo7@]݇ºÀ`>5¢MaAiäÖ=XÐV͎B ²TW C¯û%!یP¸M½Áи>ö ` ÄéŒjt•¢úõë9Õèi9…ýµŠ+€hu°Q +Ô¾Îkór–­zx]¥úñj·z©õ¢…•;G¨Ù¾¿¿®HÑ`¤á”¶ÏJðñ +HâñÇÀŽ»œݯA¾WÉó:ߢXÜO/éA“dA–z€i=?1çãÀÀ‚ê žçÞàºôóšrx”ÝJ0h HÑşÆa+Î7 šTqY¼Ä­UT­9Hðrp#º§×ÁĽL;HÚîá¥À§<øˆÁ¥¸I´Vc–Í­ÀNJŽ¸¶ä±¢â|@jp²1g× +À‡V°ÃTÄ7¦éTe ·èªYÂÀ¢Áú;O¢2À¦ë2¤iûÕeµäȔí2PoJ«ڂ°å/.Ë&qP¦µ/ٙM7+w·Vƒ© ˜4Uc|H"{h˗ïi3\ñV4t]î=ªóñûØzÔ«G#‘Eg)&Š!ö@Ұ͍z'²)5a¼·6XC,^MÛ×ï?’­£yý¢¾Z/ŸÕÖËÝcux´b©î¡4ÉàáÂò™5èrM‡6—,°ÐòMÈR²9&h¶ŒtÜ,v±áÄHbí¢\3¨kr$lƖáM²–]ÑÒ­ëTœÍ¯j½w*¨=֑6h~™î +~6ëh¶Å²ÐP[É&!HBM £}$3q€c*TÁ&8vX›dÅ;cØÙî¦lyí£„‚ì{HC•X¡p,ðÌ^»y.¶²‘YíÝV>(êêǑ‰IHléÊÆí‘¡ÖPG<ððföq¾`ÚNǥ‹IÌ=ÖÌjêØ­¤ÏjªÕ¹yç‘'uÄ׎òâ4•¢ ;/wFÖlØÌÜý1¨J™uÓÇ4äÙÃK‹•@ÄJ_ÙêZsÐ:‚ëÓÉb~OÉsljÄzGñÅž·1ë♗<[R+GŸT¶þ3ÇÃQÛ &X‚UarÚö8à"1Ä»U´‚TQ°š¹åͺheM5”¢ÀAmOsË) è¶gD:Ú%ÇZB¬Õ@è ûqʸ:àÞ­Ë?õ«ÒaYò‰6"Õ$î_ókøENBZTwY +²3ž•{J¥úHHk??÷-½›Î¨XYôn +SUƒX4rw̙ÍP-¬i­k”Õð$—Vï3¨š8ŸÉƒEl€ ²Û +8À1O.w‰WùÈíG-=êÓQÿñX”ü2ö>— +æk›ÍÏ:Hªfàç4kÕÝËČªëz–\ðPjçAÙµ¸lErԗ%Ȗ2k0H4bÉê“p±z…lWЂÇ+ºYώu'ì{<t Öè‘>%Ó`%tZ_¡Ê‹«IYç¹Æb%(\w åÓKJq0åì7¥ñ²#‚¢1Õzäplqâζ‚¸þê²%ƒ N0@³Kg“ùJ°GI'k8 KàŠÕXx k>}rk‡ó‹–Öew‹rŠÍpì1/w¿í¾{õäìöîéõåÝõû›‹ÛOۏ€NÒ e9ݞ<¿»½¾y³œŸŸ]^~|÷ìýÝÅ=ݾ‡àOøDƒã朕 +fÍ;‡Á\bG}˨–µŒ¶ØPƒîtkÑ8}ÆÜßè*B ^Ý´bÉ걶ÒÚ萴V=i¬)†åÅYduÞÏ\¸ü6áùe§ÛÉéöâï~}wösõû›×ç·ÿóö¯wwW·7ž_½¹¾yŸürssñîêõ6ÑÍáÓ]ÚÎvñ7oi#|^|Â?ÀúïÆ۟·ü3m¯¾x¶È:öLŽŒ¡T øÓ@dŒ+5tžù™‡nvy;ûõÙ¥ñfú–Æv3¿2Rl¦áö‹]üœVÞ¿ D¸¨ÔÏms.“³9ï<=è!¸¹ýk”}Ô§»W~¨À(«_sy ±:j£ð !½O`F#—5÷DÎt~áàãåt~¯Žž¿½øpuþ﫛×Hó۟ŸZ!üñQ‘¿}úpu¯ÚÒHšÇvv;s‚ö‹‘n_28ÄL:¤¬/dgØ;8ù¡à~ž‘cðà©ï$F3¤ž"^ú?ö«½·m‰Þ$wµ-RO·¸b§éöö¶ œÛÛ½E¡Øj¬­"’œ\óÇ~örH‘zØÍÃyµ“X†3?g~ã¾!¬vGÒv­ 4ø`P·ª…ÊÜ,-æÜُ¶êùø¸æ¢•·†®®¶ÚƀošFÓòyjû6ô pÛq©D“ùÐz,Αm…&¯b–œé>}5ÄPØ= Áhؒˆú¼!s!4C¢ tq¨4O¦´nÒÊåJ-¦Ø.jVÁ;˳\cy%Áå+? E#"m²}G +•Òѱ9x¯ºˆ£˜à˪%qâh‹>ê ï?«K¡~s†Ñ“ }_q|ìïpö,×a†P錫ëâÄÔ­Bé€R‰É¿¶ +ñ{œ‚Ôt=䅾­J'£È´ 8º!¬dÔ©ëŠÚkÓºQCˆë#Z +3œåº¤fÔã´í€¢ÊWSUemÆßRTH ごкPè%ŽvE/m Ý®R‹=`*>SÉ "!?õùˆi1C¨ójM—§'–9ê!”((•˜"­Y|F®Kë(!zPykêê¸ «- ˜õÖӟ(Ðl¡Ñð™ŠWP`°VfKþÅh•Ÿ2UaSL8g ±+Ӏ:bh„+æS)\نPAÊäáѺ¼á¸È؛÷r]DS‹)0x䈆AÞ¶üQcq)Äŵ£†®ŽÆ°ÚŠ|=UØ»3ª`ãŽÀé'*1Ãc኎‡DŽ×$·ª~6pØà3%– %Cx¹!ŽTB¬ª5¡¦eZÌчt—\ƒbž  —ðüDpmË + ¡Â<°ÅÜcêúj´àB¨M \e¶ãɹ Þ÷ì . ±Ì—­Ð£[Ï?%ô´B'‰m³Áš”{Q½=ò<[b㰀t">Y?E¸\øáM–A” +ý>ŠÅpa>è½YcÇQ²‚ÿ‡'¿G³²·³7ÏN"9tü¦ái”“Ã|廛Ÿ|8 “$>ÍÃå"žIÍ·Y– ‰G–%9H’ 7¨î’~oGèS‹¿px&›ôQ•)UÓ¶0Õý»ºm %ËR˜"Ól•Î7z/Þp-©R=ž‰MZ”R'«ˆ‰ñ.N»´•â«<, +Pç‘V¦Úº?„é|É7ºø‚ÅeDþ…¹¾FõM–— r\†ù&ƒÇ«“°ÌÎbajój^Ƴ$ªœ€ºv˜ò‚T{ËއyvÑ©%LUª“E˜Ï2½eÝV"CC˜2Õâž‹ÍƎgy–$ä(J =aªC +m&òáóf£ûPÖñ¾yõ2èӗßyVJòЛŠÒ—ÇÑe´AYêM!8Þ1~ÏMmajÍ+I´Êûó¨ŸÄÅp— ªbT+"[.FítƒzS;;pOÉð]š†gќ8p9¯ ç]làâAρ+1r"?"vkS`×õS´º“>: œ ɒøæ#&4>hz-fNAž,W^ö-áä º§°ÖÀÂ(¶ìºª:5ߥçŒócNsd}/ÐqÇ K¿5Þ0L5\âû^ëúWœ»‡šSå†@ؓÿä§ïÁeº¿MÇtEÇÞDêpJ¨â3Ô¸1Ü{åm_H”¸J×m#¨J¹QÅëP¢¶ô;ΝÖ)¬/0ŒÈ?Ð\:`8Ya¢˜¹Œ0ãìQÛ±ìûª)kÚ7³""hø@pům‰?Fnù†•5KÃáð ̄fÆ]-ËêÃ-þò)Á±H€kßü0lX™“+É«l±"_˜ÿÝeК¥‰…aU„Âå8*'·¾¬fÁ¸, xÌð;¿Wˆv›‡ ‹l€_Š”á¡'Uµ†D}\,p_¶l­ôV ­qFѾ†3¶ö«ºpˆÞ•iC¾&Ý©Õpïþ}RØå‰{¿ž(6ÝØ£{ƃSÿ†£ûõ@Ï ›Â|óø¨V‡‡ÞåñÑSIæÕÜP_ò9RßC>½›µ¸"÷U¥Ö 0|ˍq¤Y­|ãÚ1®j\[’È`|2Y¬­ìͦĬÖÜføkrãÚ՗L¨×ðýö‰¾Ásszlbo8ÇLì=þU÷¸²›×Ω>“q\~Ûþ˜f©¸!Ïa„Œ//Ã<Û*î‘g½áÞ¬ŒÏ#¥0œdgKNNℓäç¢Å)A”îâA–*Ϻ^Ê?ûtݗ®°Ò8,â™~w ØÔé +\)ïTò!â +O"¶ñìm\&‰ý ÈÒzÌó uÓXéNC®Âc ,R2/¡5s Ž!/@å¬\pÁ "l=Xƈ‡Ë<ûmŒ‘‰ëä0—ºMφ(—;¯N{0\Š:f{íF.wŒŠoÀxMƒñj÷{½*ñÈûÏpóo¸øXØ0³ŸÈ¯¿YdÒ÷Ó×z?‡Å£äé‘cÝ5њ?±íµ¿æݵ·¾»À'Y:_Å嚘7¼È±Øœut¸¾Ææ°±lêððéH€Cm_”V_Ø mÃÁõjpT q0,• ïŠèåy”Îç×ÇhœD0ó]#Vñ‚öjèôëk}í _þ?š­øšâx·Õ2^ʧÐËöÃb¡wÜÓ¹³( xRyV`æ–Ø…5GÍS[B¹Õi»§…‰*Ž5AAïÛFy$UãªÁú^ÖT„<.Êäóc(Ûc¿Ä§—ái‹d€˜üÂå$C?ë&TqŠœ»˜FE!‰JÓ"KVe¤T$<ý²&Ê£d¯’z•4žŸFÅ( Û§—£”p¨øŒÃÿÇÅ;¾‘ô~ªÅt%9^„óìâ1Ô{(7ì¿O†_ð¢0òߘÕ|抎 e©x€"±•nyklê ãP謏y‘}à5Y^¶ªdýaG©l(¬©—0EÈÊVä3k!* sLÙ¹¨ eÈh‡E½š=&ô˜ËLY‡=»CÏz#6p}Zٜ%úÈìр:63 á‘ ©M©ñ€®{£å2ÈZ.sYÓeµ\æ²ó{é ¼¡»Ûï _ótð2gyü1ž}ogÕÎG¿VYŸò;?/â2zFÆ l,®×qj4ñ)¼3o¿ܲR¸wqâ¾ïéCîip·[ºå݁Qf¨IxíJl•ûüó«øodùøFÔ{ `'ÙHÁ\˹«Û[OÁêöÖS0ÇeËõí64µ8˜ÐA¸^›ƒµßhù¼‘ƒ>?,{8*s¦eXœ}§2ß©Ìõڞª¹ãï€ïÒ’gNNópGiIØ.é[‹y#þm3˜Š '<Ï#tÀhð$š#¥wÛ¿âwå?'8^`æ;–ç?‰M¿“b|g”èF„uújL¦i'ÙÅ®|ûŽä×Ø2ó¬\|#írÚ³Œ¬@÷®œpô[롐`«ˆ¼ O’h–ˆy|J3æ£ã½y¸„›K1n|˜äE{2™äŸ‹2L’ø2êLêÏ»çª|<Í͆^C·Ø™‡ex,^äÞŨM†{Ǔׯw?šesnìoŸ¿zÿÍþ÷úrÿÓÞá÷ÿøã_¤0qÓxgé´ïá, +S2—ˤ;à†Â•"¶½›DüâÇþ«7:â¿óûôýîøºkñQXæqVÆ3،““,ÝrYn ´7ÏN"2åfÈ$ËÓ(/Z¹Óxڑìoߪî¶c'& CÂÛ0ˆ 鮪®®—§ž¾÷|Ú?:üރͿ“]G'SC!l\-Pf˜*¨uymˆFÙ ^.ˆÆd÷0H¦!½‘_ׄ±”°½4–dÈ~ËГµTÞKâ#ÿÑZK²å¾²l­O47Ê×å~úF¸ßkÿFº™ï "ö<É4Ïizر¦g“¾æÇYA½ÆՑ.¹^O·Ô^=Ñ*xV¢8¹/øð¦Á£`bx‹ˆ%‰j<¹JIf)Ë7 +ƒpƒÛ{‹³Ñ(a)R;Y|“”÷êž$•ýú«î®Å#|æ•îzW YŽâ‘ò{”N×ôýaxålµZ&–³ÛtÔðiʂ¦k´ß,H¾B¼ìAÛ â¯¤ÒÀÿNðò‡ì€¸ \{póܯ?:ànï¨CT)Èã{÷üû±uþ·ßF·Á?¬]ü>iþOûÁŸ}ÿ¿Ëƒ_& ÷¾-þÂÿ>þùO¸¼8æQ&‘½  zé5o"€’åäøxËCè­°¿‹' ¶óÉ̒ç0™7њm?0"®Fb1ž,êÜnMÁÎKÔ®Cö{ŒBárêY²f3=<4S·Ï{B4Óïâ„9…g… +&« ׌?ã‡Û’Òþ¬ZçoÅóV%6‡Ç=4Cb1ž,@ñÜn +ÏKÔ°Q  §~%käÁO¤û=:…‘:éL NvÿEpMŸŒÑk¥Ä°dޝºi㧥;.Ù³Zšm¹.14[7Lu¤ü¿3‹ÎFñdI¼dJy<%ý õ㯠­ìÕ¤³º_ŸLw~hº5Có¢µ;#¿"031 ½É>å—JG.ÄS:¬LÖ) Öœ/[ÏÙiÆ¡ÒNÞpõ¥ãêCAk·{ÃéUà' $yœðçs ]¾é}îÁ8´Ù†ƒ±°…Ž{9ãÄrÁÍvM§‰í™Ù3,G3tX14Ï°¬­“סŸa•faú¥„žýàjè)S˜¿‚ðçÝyàÃHvU0"-¹ö®}ì]|ˆü6OÅá ®8¸rqG]ÒA4ÞۓËC¸KC–¦LøÒ̹´û¹2IÊ)ÆàKCl}ºÝYXïo¸ûÛ$HYi¯¸ÅlÃ${šå@ýéšéØâôøЛM>šÅ/jqz£”ŒV˄uÃôlüÐñ‹n-ø˜ý¢Ž˜l¤¤Ù²‹”½þp!Ö 3–{Õ²…˜¦+yð!—>™VÞ躅WÐÅ„¹†¹¬ ë.ºè‰««ØHÉÿ1d¤*Ö4¼f.¦Ù'ªâ¦‹±i£ðFè´ÊnTU,áðóÝûQá¿, ‘’)ó252ÌÍ\<šùSUȍ K¸¥tš3**f« ÑÖ\™WÏvPØhêêDÍÌ ˆCæїێ¬#W÷Z"mž© +-™ÉRîJêêî(eKU œ¡´Kù+)yNó„ŸE1ÉÒ.²,ó´Ý‘YV‡(ÁÔP^¬"C\ZÐ,wR|¡dl=‚"yŸõ˜_”’¨Í¦¬([–¨Q¸4 MIÅp°m©iÚ®¡Tfù+Í®sW<˵fm.êCøs–`2–¯¥êÜnÉ?òT™ªÏg²òt´'Aõa%/eqÏtœÂ £(3¹fn֕ +2-ÕHÔ¨Ù"Ü(—£‚ã™æ|EŸ,èY(•×sž£ºŸ†y1Žm˜39±¤$¾Ñe8W3–Ì¿ž»—·‹ªy +SÙljZ†‰Â'£À.£”·3N£ñ\™)dq…¦B–ôƒ8eÆaÌ¡Ó9²®÷ëHŽ%­XKv ˆ"Š:¦m¶î5g¬”,9°Rvæ€q§˜Ü7Kû𰌒)å,ÞÀqO’àVÙÑÉ~²-§t +5WY(ž¢RÄÒA¨Ç¨:ËÒi8xìéVê$q˜Ít §¢ó+ƒªZ®QvøcˆÕA‰e4 Òr®Šò«K—/ÛÇ] +“ŒÙäÃՀùí0üGiò »Y&ÛÏ K…d‡‰Ç’Ýó.éú^וˋ~ty< +B¶\HÐp2/ùº0Œ9BüûùÊ'û§qZÙ®¤/ŠI|Íøۋ”ÃÕ4N€i¦çÕ*лÚ~ï`¥ÏÒlZBìzÃøŽAŒ +±q|BÍJÖïàêÉ2È£AN"¼€å\Ï$ö‘ +@¢á v +±iä®]cjïdÑ^m;‘Ü@ô úú)y c»|}„h³"bµä‚Eh€l4\4ÌBøûœrÙÝ=3€ØÝÌ ŒÝvU¹.çTAçÞ~~ä8Ï Ö!·ãބv˜ÅR´”7y°é4¯è†‡ ª=yÂâgüø[­m?´þ¥Ú ìž5†RçZù{ÝD‹þږåa]R²<7aC>¬¯ëñ¿a©ÛÊ@Qf¿biÖ½ü‹Ay±ô¨Qc§Âï5Ö#–…†äð2O0Q§£ ö"ñ0­ÐðÂSg‚f[´×]JÆb¤9|FÒasöBŒdHÓ íïï#QŽn—€¨¡º:hɼI“υ“ +׆Z‚7æ ÐKâeÊ~dûMH”íçßOópF…Ž#;oöá]' @2@)Cnô®Mʌÿψl‰vù>¿›ÿÁ*ኂg`ÂKÂô +¥ˆ§8 °&”!dsm)ߦ˜°V#ïÉKvÀ›¼ÇòÄÔsX/¿HÃù‘axÈӆIóæì"~b„²Yå5ð|¼(Â!Ö"¦È×%µºã«~¶˜Ä ñmÉÆ"ú¸ÖFS.)qsÒ$-;Ï´J ã÷D¸bph`S!ÎHÐáÓ6vX»T՝¸¹“äV¤â—u]ì)äQŽÎ–Û7èà7‘ƒVŒ¸nÊ$EÎÂNEŸ µ”’ÉÁauˆ¤w‰ã&aæ¤Ã%ïä\¶ïµ54dʱœ È9Àoà›¿5©ýîûöä8V'ÃY©¥ôAà¸qå_R.‰ý¡æ ë$É"ãcUIJÒÎX`±.NáÅC#‰%«Ҝ\ätς‚Ø~Îõ€Âóòu-5ŸVÌȉÚiDn“l.7^(Kœ%ü“Ç椌Œl<#•qbQùÈÈ AÙQ&ùa«”I:¯J² v'ß(¶e™*§áì'¾~­XñePæ‚DJàÌyǬ±g®°ÃΜ át^IU4sÎWó²HFC³‚fofd¯LáÐ-ÊØhŽ•éyŸ„N,˜übg]GÎÃĈ粑`aÅBI3:]ö€’”iАenöJœ˜G´?ógôÎ_„]\)%ÿ&üØò¯qK#„lº8ðº!›O¯®¶ßÀ.¡­™ÂwU=B¸ÆËy1B8w/œ"á›r¶ +áDºÂ ƒ&+g˜·@»dÃál~nôGç.JPáü©” +ǂq¶öè\¡|îù +SÁ‰j÷(xL®T{Ácrá+&#£ä— ìÊ¿L^7Šs›JÑn ‚)ñ_ӗ[´nÎðí8h’Ò +̦) +X°‹<,Ž(`QñŽ‚ð<Møˆ›zÿ/@÷^b¼Â>oÄlJªvlì p ZûÌ&/ȳ%scÁlòf‘óÔ§šYd†üôB zˆÔØ;p§ïn.gOýbw·ÙÙùevÙÿº˜}š÷‹æò~öз³›~y‡/í墿_Þ.úöþêö‘wp¥ß»¸=ëOæóÏ÷ËÅ §N!½ýaÙ/®?Ý@@{Ù/Ûþßþ¼œ¼¿š]ÀÁ8_9õãíüvqp U8è_9x7[âÛÍËJß8}¿€ÊþfùŠ˜s~Ù+ßçýC?7/jÙÙy÷ñ§æ?É}˜ endstream endobj 19 14 obj 9689 endobj 38 14 obj /DeviceRGB endobj 39 14 obj << /Filter /FlateDecode /Length 40 14 R /Height 40 /Width 128 /BitsPerComponent 8 /ColorSpace 38 14 R >> stream +H‰ì—mlSUÇ1&š˜˜ßbü¢ #P¨ˆ +~D÷"Û:JtqƒZ6öë¶vot·ÝڍµÝv·²¶Ú^³i„ ¢ò„É1$àŒHœ™q _Ñ࿞r¼žÞ{{î][4áÉ?7·íé}žó{žsÎs¯\Xx%‹ºªn\ÊÏf$þîQ #›1d_7ø§Qý‹o‘ºy|ù­±¥·Æ6ß~ƒÚu(´l"ºDíW¿zß<¢‰;çe”ÿ̙¥Ÿ¬™\p}ùƒ˜d|ù{ëòrkKKÃf³?ç-ÛÛyÛbÁüS‡VgŸ?œöš&&&fggqõtº|ÞÅW‘lò'@@LԀ¤K…¹¯•—îÙ3N…EE•SSSR,‹Ôׄÿä]qø®»oÊxGf¤$I“““ÈElØ •˅.þœ@ÒÈ»)–û¢kjÚiœpýÑâÀpí|~×zù‹}.ÅÁ¢(Ê?È?~ iɅ¥Ä”ì‹(/Ï1==óϬŸ[ßyÞ)àw­‹?…'+Æ^„U øg.øùó1–‹ó_¯Ç¹eKƒš;¨½]Læ¯æ'æ\øǘ5Æ3K@Ñä¹À4ñç¢hÚ@ î͂ ŒJ‡>ñ‡úvY,­~5w‹ûŸÙýÍ_²–ª¹F•Šýûcƒ òîӏ#@mu¨¯«1ÓJãänGqóQ’Ò’ÐeŽRAE‘]¾|‡†¢>ߐ DvïöЌ`Åѧ%êßëJ9ñƒý«Œðöj?Ym Ò0¤@lþð œ&BÚä'’ `þBz?QŒtwGè—Ò–õ<üa‚³Êÿ”xiØü†#sOÿ­[Å#@Û\í6JCÈ‚âì.\ø-#÷ñŸ|Ö½ËõòO‰×@ýÄSùC¿Q þ‘zÅ1ÉYÀÇ@ ”¸çæë÷lÎPýOŽ|0uüKžˆI#}3“ ÒËö§ÁWþ0¢ñÑ2µa$ 0éoÃFd þãî¼ùzùÞ¯ýLÂ_ºÿ6¼â*=³!I{+µÓÿb~zùǛûâï¡Òâ¥×VK%¦”X„æ\êí™ö`¹ÑŽKÿ^Ýç¯Òª”[‚‰IZ³ ü§î™‡x D:ðeÁ›Ée‰Šú<ú,'ÿӟ>e6«vƒD--¬Aœ†€fÃZŠŒ#twL ” +aººFÈÍä@ þòÅ·öQ̺ë_}Uc6¨8„¤\$Êòá{\Ë£#чó÷ÿy¹µÚü!LÿŽ\c2¹€tÇ!½͵յ^ïAD2<|¼±Ñåvu„CAí\ÿ+Üï_D™¢¨Â­pa2µì*ßeoiñ=zîÔ©_ º:|1r:ûìöÖÞ@·†k¬/#üƒùø Ïē}ûÛìõ•55û$éÛ䈐‹ªªÆw{84¨– )ÖË?@4øo+ÞÞÐÐ96v‚¸ ‚S‡ÃO½T—˜wäo°W핻v8ºšö¾€—q#Ï4Æ5Ue…[‹œÎ°sÈåpWoB<¡Oè—Áà‘ê*[gǾȿsA>]üù Œd Möæd èî} z×Óä2jnî¡,9k'\…>ëz\÷lÛ¨ˆ¥²ÒÑÜTß×ëE$ ð§:&­üH\ÕíÌõî+êét45¶"’¡¡cdÖáÚMÎw×~ãێxüž`r$nwû•§£5ðyvèâ?|5™> stream +H‰ŒVÛN9ý‚þ?î>Äc»\¾HQ€h¥ÕF‹ Ê âaÒÑ DÃ@Äßo•Ëîîé BIO¹íªS—sÜ«³Ç›çmÿ°¿ì÷Ï??~\¯ïûwÃýð ®>¯>XÌêzuñ¼éwm=9ZŽ^]ú¤ÎλÕ?ë×~Gg¿ûM¯þ(¦²®¾ Oô²ß=÷ju¾ë_†þWµ>ßûõüåð°ïo«u6l·dÜ­7Od>nwêÊç¼CR`ÝmÖ{ W÷~Ý­ž~®wýÃÍk]#'g§Ñ9yPF§"=,º¬v÷QƒêV=y^úkØöûÝp£v½°êþI9ÈëÿÛ.y ૹi&d¯C´ /–vÛþ½»#0€ÁÔGŠ&þ»ø«ÚúKyõ…ÌôïouumÔ­ê¬ :Oî2RÍ™8ZK Ù!‡´ÚL´”µ‹–Û`uΉ™Äæ‘'ÆvÒYÅÆBÄb¤ Ž·[ +0rïÈ6sI“#º˜¡D䅗ŽFGg´ÇDÍUߐ{£}6NèQ¢Y,{ ?)-“µ1†ð–”¬9†äÖze]¬bl!=”ӐL©„Ez¤A”#¯±?sCåXʹ$G°¯G–õ¡zJxãK°-¿MVOÕ¾¤ÝFBK=,G8F"xc’‘Ð'Ŧ¹š30ÒXç³²¶&ÈÆK'­+'á-ÊA¨â( +ªž8ß oÍ=€!Å$¤3ð0œ¹°œ12::M4ALî"”L]ãRL—m±ê8³®Ÿ¨ŠOSzî€áóñË7E-87Ó+OŽç‚ÕìI¡dÿÒ~bù\õe¦GœÜ$EÁzm¢ƒ¹¡—H¢DÇ>LC[‡»(–í¹)Qp¨M̨D$K¤a®DXÔʽO‰|›“Q‰<Ï4S©$äyB2̄M¥Ú¨CXÉÛt«ä4-BÈ3B/4fb¨å÷(CK<ËâÉK*D5”p3%Bƒ¤ÿ-¶` +ÛÐ œ‰mh¡°Égñ'<ó±‚ä7I4­­ŒßD“‚Æ‘lË_Pü–l¥>B8 ÈÂt@8¬4#úX9h‹%mk|C EqÉ|u|;Tó`œN”I5Í­³\W$ñ ~ݞÑôèQÒÇ3 Rpc¥“%m]K§”äԁg]ÆåXN 9Nˆem·Uè÷jàaÒ"ŽN3-höÄ}Þ}h½Ghtu¦«f®Íˤžh=uÒ¾]¸¾¢Ç~ã`ט™¼¹.Zà‰RÙÇI 8`ùL™´€ï%‘™pXŒÆy¡“o_ŽDDŽroVÒCeÆDz€v éë WÒ6iÄ”;‰Ï¸Êï‘øKPR ¨S:ç;ĺö旇§ë o™f•‹D7JžÏ*g Åg³ê ñ.ñ‡ã4«žæYJf³JU¡NnÆ4«Çqk6Õêj4g7dÓ®,JâBßì† Ÿ@3vKÓSe77º(-¹U³¸,âèýùËi÷¿ð³ endstream endobj 42 14 obj 1285 endobj xref 0 62 0000000020 65535 f 0000000016 00000 n 0000000069 00000 n 0000000133 00000 n 0000000423 00014 n 0000000533 00000 n 0000000704 00014 n 0000000778 00014 n 0000001112 00014 n 0000002585 00014 n 0000012342 00014 n 0000028847 00014 n 0000028871 00014 n 0000048873 00014 n 0000048897 00014 n 0000069724 00014 n 0000069748 00014 n 0000090122 00014 n 0000090146 00014 n 0000099919 00014 n 0000000021 00015 f 0000000022 00015 f 0000000023 00015 f 0000000024 00015 f 0000000025 00015 f 0000000026 00015 f 0000000027 00015 f 0000000028 00014 f 0000000029 00014 f 0000000030 00014 f 0000000031 00014 f 0000000032 00014 f 0000000033 00014 f 0000000034 00014 f 0000000035 00014 f 0000000036 00021 f 0000000037 00016 f 0000000043 00016 f 0000099942 00014 n 0000099971 00014 n 0000102279 00014 n 0000102302 00014 n 0000103667 00014 n 0000000044 00014 f 0000000045 00014 f 0000000046 00014 f 0000000047 00009 f 0000000048 00010 f 0000000049 00006 f 0000000050 00010 f 0000000051 00009 f 0000000052 00008 f 0000000053 00005 f 0000000054 00005 f 0000000055 00005 f 0000000056 00005 f 0000000057 00005 f 0000000058 00005 f 0000000059 00005 f 0000000060 00005 f 0000000061 00005 f 0000000000 00003 f trailer << /Size 62 /Info 5 0 R /Root 1 0 R >> startxref 103690 %%EOF \ No newline at end of file diff --git a/pixmaps/wmaker-tile.xpm b/pixmaps/wmaker-tile.xpm new file mode 100644 index 0000000..564fdcd --- /dev/null +++ b/pixmaps/wmaker-tile.xpm @@ -0,0 +1,183 @@ +/* XPM */ +static char * wmaker_tile_xpm[] = { +"64 64 116 2", +" c None", +". c #F6F6FF", +"+ c #F6F2FF", +"@ c #EEEEFF", +"# c #EEEAFF", +"$ c #E6EAF6", +"% c #EEE6FF", +"& c #E6E6F6", +"* c #E6E2F6", +"= c #DEE2EE", +"- c #DEDEEE", +"; c #DEDAEE", +"> c #D5DAE6", +", c #D5D6E6", +"' c #D5D2E6", +") c #CDD2DE", +"! c #CDCEDE", +"~ c #A4A5B4", +"{ c #000000", +"] c #FFFFFF", +"^ c #F6EEFF", +"/ c #E6DEF6", +"( c #DED6EE", +"_ c #D5CEE6", +": c #A4A1B4", +"< c #9C9DB4", +"[ c #A49DB4", +"} c #9C9DAC", +"| c #9C99AC", +"1 c #9499A4", +"2 c #9C95AC", +"3 c #9495A4", +"4 c #9491A4", +"5 c #8B919C", +"6 c #948DA4", +"7 c #8B8D9C", +"8 c #8B899C", +"9 c #838994", +"0 c #8B859C", +"a c #838594", +"b c #838194", +"c c #7B818B", +"d c #7B7D8B", +"e c #525562", +"f c #A49DAC", +"g c #A499AC", +"h c #9C91AC", +"i c #837D94", +"j c #525062", +"k c #9495AC", +"l c #9C99A4", +"m c #9C95A4", +"n c #9C91A4", +"o c #7B798B", +"p c #A499B4", +"q c #8B91A4", +"r c #94919C", +"s c #4A505A", +"t c #9491AC", +"u c #8B8DA4", +"v c #737983", +"w c #948D9C", +"x c #524C62", +"y c #7B758B", +"z c #4A4C5A", +"A c #737583", +"B c #4A485A", +"C c #83899C", +"D c #8B8594", +"E c #83859C", +"F c #737183", +"G c #414852", +"H c #6A717B", +"I c #4A445A", +"J c #83818B", +"K c #736D83", +"L c #7B8194", +"M c #414452", +"N c #837D8B", +"O c #6A6D7B", +"P c #73798B", +"Q c #7B7983", +"R c #7B7583", +"S c #414052", +"T c #7B7D94", +"U c #6A697B", +"V c #39404A", +"W c #626973", +"X c #73758B", +"Y c #73717B", +"Z c #393C4A", +"` c #6A7183", +" . c #626573", +".. c #6A6D83", +"+. c #736D7B", +"@. c #6A657B", +"#. c #62697B", +"$. c #6A6973", +"%. c #62657B", +"&. c #39384A", +"*. c #6A6573", +"=. c #626173", +"-. c #313841", +";. c #5A616A", +">. c #62616A", +",. c #5A6173", +"'. c #313441", +"). c #5A5D6A", +"!. c #313041", +"~. c #5A596A", +"{. c #293441", +"]. c #525D62", +"^. c #293039", +"/. c #525962", +"(. c #292C39", +"_. c #000410", +". . + . + + + + @ + @ @ @ @ @ # # # # # $ % $ & & & & * & * * * = * - - - - - - ; - ; ; > ; , > , , , , , ' ' ' ) ' ) ! ) ! ~ { ", +"] ] . + + + + @ + ^ @ ^ @ ^ # @ # # # $ % # & % & % * & * * * = * / = / - / - ; - ; ; > ; ( > ( , ( , , ' , ' ) ' ' ! ' ! _ ~ { ", +"+ . : : : : < : [ < [ } < | } | | | 1 2 | 3 2 3 3 4 3 4 4 4 5 4 6 5 6 7 7 7 8 7 8 8 9 8 0 9 0 a a a a b a b c b b d b d d d e { ", +". + : : : [ : f } } } } g } | | | | 2 | 3 3 3 3 h 3 4 4 4 4 4 6 5 7 7 7 6 8 7 8 8 8 8 0 9 a a a 0 a b a b b b b d c d d i d j { ", +"+ + : : [ : } < [ } [ | } | | | | k l 3 k m k n 3 4 4 4 4 5 6 5 7 6 7 6 8 7 8 8 8 9 0 9 a 0 a 0 a b a b b c b d c i d i d o e { ", +"+ + : [ : } [ f } } | } | | | | k l k 2 3 3 4 3 4 4 4 4 5 6 5 6 7 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d j { ", +"+ + < : } [ } < } p } | | | | k l k m 3 3 h 3 4 4 4 q r 6 5 6 7 7 6 8 7 8 8 9 8 0 9 0 a a 0 a b a b c b b d b d d i d o d o s { ", +"+ @ : f < f < f | } | | | | k l k m k 3 t 3 4 4 4 4 r u 5 6 7 7 7 8 7 8 8 8 8 a 9 0 a a a a b a b b b c d b d d d d o d o o j { ", +"@ + [ } [ } } | } | | | | 3 | 3 2 3 3 4 3 4 4 4 4 5 6 5 6 7 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o v j { ", +"+ ^ < } } } p } | | | | 3 | 3 2 3 3 t 3 4 4 4 r q 6 5 6 7 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o v o s { ", +"@ @ [ } [ | } | | | | 3 | 3 2 3 3 4 3 4 4 4 4 q w 5 6 7 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o v o v x { ", +"@ ^ } } | } | | | | 3 | 3 2 3 3 4 3 4 4 4 4 r 6 5 6 7 7 7 8 7 8 8 8 8 0 9 0 a a a a b a b b b b d b d d d d o d o o o o v y s { ", +"@ @ < g } | | | | 3 | 3 2 3 3 4 3 4 4 4 4 r u 5 6 7 7 7 8 7 8 8 8 8 a 9 0 a a a a b a b b b c d b d d d d o d o o o v v y v z { ", +"@ ^ | } | | | | 3 | 3 2 3 3 4 3 4 4 4 4 r u r 6 7 7 7 8 7 8 8 8 8 a 8 0 a a a a b a b b b c i b d d d d o d o o o v o y v A z { ", +"@ # } | | | | k | 3 2 3 3 4 3 4 4 4 4 4 u r u 7 7 7 8 7 8 8 8 8 a 8 a a a a a b a b b b c i c d d d d o d o o o v o A v A A z { ", +"# @ | | | | k l 3 2 3 3 4 3 4 4 4 4 4 7 r u w 7 w 8 7 8 8 8 8 a 8 a 0 a 0 a b a b b b c i c i d i d o d o o o v o A o A y A z { ", +"# # | | | k l k 2 3 3 4 3 4 4 4 4 4 7 4 u w 7 7 8 7 8 8 8 8 a 8 a 0 a a a b a b b b c i c i d d d o d o o o v o A o A A A A B { ", +"# # | | k l k m 3 3 4 3 4 4 4 4 4 7 4 7 w 7 7 8 7 8 8 8 C D C D E a a a b a b b c b d b d d d d o d o o v o v y v A A A A F z { ", +"# # 1 2 l k m k 3 t 3 4 4 4 4 4 7 4 7 6 7 u 8 7 8 8 8 C D C D E a D a b a b b c b d b d d i d o d o o v o v y v A y A A F A B { ", +"# $ 2 | 3 2 3 3 4 3 4 4 4 4 4 7 4 7 6 7 7 8 7 8 8 8 C D C D E a a a b a b b c b d b d d d d o d o o v o v y v A A A A F A F G { ", +"$ % | 3 k 3 3 t 3 4 4 4 4 r u r u w 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o v o v y v A A A A F A F H B { ", +"% # 3 3 m 3 h 3 4 4 4 4 r u r u w 7 u 8 7 8 8 8 9 0 9 0 a a E a b a b b c b d b d d d d o d o o v o v y v A A A A F A F H F G { ", +"$ & 2 3 k 4 3 4 4 4 4 r u r u w 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o v o v y v A A A A F A F H F H I { ", +"& % 3 3 n 3 4 4 4 r q 6 5 6 7 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b J b d b d d d d o d o o o o v y v A A A A F A F F F H K G { ", +"& & 3 h 3 4 4 4 4 q w 5 6 7 7 w 8 7 8 8 8 9 0 9 0 a a a a b a b b J L d b d d d d o d o o o v v y v A A A A F A F F H H K H M { ", +"& % 4 3 4 4 4 4 5 6 5 6 7 7 7 8 7 8 8 8 9 0 9 0 a a a a b a b b J L N b d d d d o d o o o v o y v A A A A F A F F H F K H O M { ", +"& * 3 4 4 4 q r 6 5 6 7 7 7 8 7 8 8 8 C 0 9 0 a a a a b a b b b L N L d d d d o d o o o v o A v A A A A F A F F H F O H O O M { ", +"* & 4 4 4 4 r u 5 6 7 7 7 8 7 8 8 8 C D 9 0 a a a a b a b b b c N L N d N d o d o o o v o A o A y A A F A F F H F O F O K O M { ", +"& * 4 4 4 5 6 5 6 7 7 7 8 7 8 8 8 C D C 0 a a a a b a b b b c i L N d d d o d o o o v o A o A A A A F A F F H F O F O O O O M { ", +"* * 4 4 5 6 5 6 7 7 7 8 7 8 8 8 8 D C D a a a a b a b b b c i c N d d d o d o o P Q P R P A A A A F A F H F H K H O O O O O S { ", +"* * 5 4 6 5 6 7 7 7 8 7 8 8 8 8 a C D E a E a b a b b b c i c i d T d o d o o P Q P R P A R A A F A F H F H K H O K O O O U M { ", +"* = 4 6 5 6 7 7 7 8 7 8 8 8 8 a 8 D E a a a b a b b b c i c i d d d o d o o P Q P R P A A A A F A F H F H K H O O O O O U O V { ", +"= * 6 5 7 7 7 7 8 7 8 8 8 8 a 8 a E a a a b a b b J L N L N d d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O W S { ", +"* / 5 7 6 7 6 8 7 8 8 8 8 a 8 a 0 a D a b a b b J L N L N d T d o d o o v o v y v A X A A F A F H F H K H O O O O O U O W U V { ", +"- = 6 7 7 7 8 7 8 8 8 8 a 8 a 0 a a a b a b b J L N L N d d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O W U W S { ", +"- / 7 7 6 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o v o v y v A A A A F A F Y F H K H O O O O O U O U U W U Z { ", +"- - 7 6 8 7 8 8 8 9 0 9 0 a a 0 a b a b b c b d b d d N d o d o o v o v y v A A A A F A F Y ` H K H O O O O O U O U W W U .V { ", +"- / 7 8 7 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o v o v y v A A A A F A F Y ` Y K H O O O O O U O U W U U .W Z { ", +"- - 8 7 8 8 9 8 0 9 0 a a a a b a b b c b d b d d d d o d o o P o v y v A A A A F A F F ` Y ..H O O O O O U O U W U W .W .Z { ", +"- ; 7 8 8 8 8 a 9 0 a a a a b a b b c b d b d d d d o d o o P Q v y v A A A A F A F F H Y ..Y O +.O O O U O U W U W @.W @. .Z { ", +"; - 8 8 8 9 0 9 0 a a a a b a b b c b d b d d d d o d o o P Q P y v A A A A F A F F H F ..Y O O O O O U O U W U W @.W . . .Z { ", +"- ; 8 8 9 0 9 0 a a a a b a b b b b d b d d d d o d o o o Q P R v A A A A F A F F H F O Y O O O O O U O #.$.#.$.%.W . . . .&.{ ", +"; ; 9 8 0 9 0 a a a a b a b b b c d b d d d d o d o o o v P R P A X A A F A F F H F O F O ..O O O U O #.$.#.$.%.W *. . . .=.Z { ", +"; > 8 0 9 0 a a a a b a b b b c i b d d d d o d o o o v o R P A A A A F A F F H F O F O O O O O U O #.$.#.$.%.W . . . .=. .-.{ ", +"> ; 0 9 a a a a a b a b b b c i c d d d d o d o o o v o A P A A A A F A F Y ` Y ..Y O O O O O U O W U W U .W . . . .=. .;.&.{ ", +"; ( 9 a 0 a 0 a b a b b b c i c i d i d o d o o o v o A o A R A A F A F Y ` Y ..Y O ..O O O U O W U W U .W %. . . .=. .;.=.-.{ ", +", > 0 a a a a b a b b b c i c i d d d o d o o o v o A o A A A A F A F Y ` Y ..Y O O O O O U O W U W U .W . . . .=. .;.=.;.&.{ ", +"> ( a a 0 a b a b b c b d b d d d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O W U W U .W . . . .=. .>.=.;.=.-.{ ", +", , a 0 a b a b b c b d b d d i d o d o o v o v y v A y A A F A F H F H K H O +.O O O U O W U W U .W . . . .=. .>.,.;.=.;.'.{ ", +", ( a a b a b b c b d b d d d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O W U W U .W . . . .=. .>.,.>.=.;.).-.{ ", +", , a b a b c b b d b d d d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O #.U W U .W . . . .=. .=.,.>.,.;.).;.'.{ ", +", , b a b b b c d b d d d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O #.$.W U .W . . . .=. .=.;.>.,.>.).>.).'.{ ", +", ' a b b c b d b d d d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O #.$.#.U .W . . . .=. .=.;.=.,.>.).;.).).'.{ ", +"' , b b c b d b d d d d o d o o o o v y v A A A A F A F F F H K H O O O O O U O U $.#.$. .W . . . .=. .=.;.=.;.>.).;.).).).'.{ ", +"' ' c b b d b d d d d o d o o o v v y v A A A A F A F F H H K H O O O O O U O U W #.$.%.W %. . . .=. .=.;.=.;.=.).,.).).).).!.{ ", +"' ) b b d b d d d d o d o o o v o y v A A A A F A F F H F K H O O O O O U O U W U $.%.W . . . .=. .=.;.=.;.=.).;.).).).).~.{.{ ", +") ' b d c d d d d o d o o o v o A v A A A A F A F F H F O H O O O O O U O U W U W %.W . . . .=. .>.,.>.,.>.).;.).).).).~.].!.{ ", +"' ' d c i d i d o d o o o v o A o A y A A F A F F H F O F O K O O O U O U W U W @.W *. . . .=. .>.,.>.,.>.).,.).).).).~.].~.^.{ ", +") ! b d d d d o d o o o v o A o A A A A F A F F H F O F O O O O O U O U W U W @.W . . . .=. .>.,.>.,.>.).;.).).).).~.].~./.!.{ ", +"! ' d d i d o d o o v o v y v A A A A F A F H F H K H O O O O O U O W U W U .W . . . .=. .;.=.;.=.;.).;.).).).).~.].~./.~.^.{ ", +") ! d i d o d o o v o v y v A y A A F A F H F H K H O K O O O U O W U W U .W @. . . .=. .;.=.;.=.;.).>.).).).).~.].~./.~./.(.{ ", +"! _ d d o d o o v o v y v A A A A F A F H F H K H O O O O O U O W U W U .W . . . .=. .;.=.;.=.;.).;.).).).).~.].~./.~./.e ^.{ ", +"! ~ e j e j s j j s x s z z z z B z B G B G I G M M M M M S M V S V S Z V Z Z Z Z &.Z -.&.-.&.-.'.-.'.'.'.'.!.{.!.^.!.^.(.^._.{ ", +"{ { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { "}; diff --git a/pixmaps/wmnotify.xpm b/pixmaps/wmnotify.xpm new file mode 100644 index 0000000..ac6fbcf --- /dev/null +++ b/pixmaps/wmnotify.xpm @@ -0,0 +1,450 @@ +/* XPM */ +static char * wmnotify_xpm[] = { +"122 122 325 2", +" c None", +". c #A49CB2", +"+ c #A4A2B7", +"@ c #9C9AAC", +"# c #9B9CB4", +"$ c #9595AC", +"% c #9C99A4", +"& c #9595A4", +"* c #9B94A4", +"= c #9491A4", +"- c #9390A3", +"; c #8B919B", +"> c #938CA3", +", c #8C8D9C", +"' c #8B899C", +") c #848994", +"! c #8B859C", +"~ c #838594", +"{ c #838093", +"] c #848194", +"^ c #7C818B", +"/ c #7B7D8B", +"( c #837D94", +"_ c #9C94AC", +": c #9394A3", +"< c #8A8C9B", +"[ c #8A889A", +"} c #8B90A4", +"| c #93909C", +"1 c #8B8D9C", +"2 c #858695", +"3 c #7C7A8C", +"4 c #88899C", +"5 c #464548", +"6 c #1C1D1D", +"7 c #010202", +"8 c #272729", +"9 c #72707C", +"0 c #888AA1", +"a c #7B798B", +"b c #585659", +"c c #110E0C", +"d c #413F42", +"e c #706D6D", +"f c #323233", +"g c #6A6975", +"h c #505057", +"i c #373637", +"j c #D7D5D5", +"k c #FFFFFF", +"l c #AAA8A8", +"m c #2D2D2F", +"n c #171211", +"o c #101111", +"p c #090A0B", +"q c #868395", +"r c #69676C", +"s c #E8E7E7", +"t c #E2E0E0", +"u c #8F8C8C", +"v c #615E65", +"w c #161717", +"x c #404145", +"y c #63626A", +"z c #71767E", +"A c #737983", +"B c #CBC9C9", +"C c #979494", +"D c #212122", +"E c #707482", +"F c #797686", +"G c #888585", +"H c #9C95AC", +"I c #3B3B3D", +"J c #C0BFBE", +"K c #626473", +"L c #7C758B", +"M c #9795A3", +"N c #777474", +"O c #5A5C68", +"P c #747583", +"Q c #817E7D", +"R c #FAFAFA", +"S c #848694", +"T c #EEEDEC", +"U c #B7B5B5", +"V c #7B7C8B", +"W c #5F5C62", +"X c #747183", +"Y c #9491A8", +"Z c #29241F", +"` c #9F9C9C", +" . c #6B707B", +".. c #612B20", +"+. c #CB3026", +"@. c #993226", +"#. c #311A14", +"$. c #F3F2F1", +"%. c #888491", +"&. c #49251D", +"*. c #7A3024", +"=. c #E92924", +"-. c #ED1F24", +";. c #4D4D4F", +">. c #ACABC7", +",. c #C0BFE0", +"'. c #C6C6E4", +"). c #BABADC", +"!. c #818492", +"~. c #342D26", +"{. c #3C342C", +"]. c #6B727B", +"^. c #6B6C7B", +"/. c #695542", +"(. c #B0865D", +"_. c #5A4A3B", +":. c #A27D59", +"<. c #5B616E", +"[. c #686A77", +"}. c #DAA167", +"|. c #483D32", +"1. c #C79564", +"2. c #636973", +"3. c #BC8E60", +"4. c #D29D67", +"5. c #747A8C", +"6. c #957354", +"7. c #62657A", +"8. c #CB9865", +"9. c #69687A", +"0. c #80654B", +"a. c #747284", +"b. c #C29264", +"c. c #737284", +"d. c #736D83", +"e. c #C4966A", +"f. c #A39DB2", +"g. c #9C9DAC", +"h. c #9D9CB5", +"i. c #9C99AC", +"j. c #9495AC", +"k. c #9B99A4", +"l. c #9493A3", +"m. c #9C93A4", +"n. c #938DA4", +"o. c #92909D", +"p. c #8B919C", +"q. c #47494E", +"r. c #1C1C1E", +"s. c #2A2A2E", +"t. c #48474E", +"u. c #605E69", +"v. c #67656D", +"w. c #716E7B", +"x. c #838694", +"y. c #8C859C", +"z. c #A39CB1", +"A. c #A3A1B8", +"B. c #9C9DB4", +"C. c #9494AC", +"D. c #9B99A5", +"E. c #9C94A4", +"F. c #9390A2", +"G. c #8C899C", +"H. c #837D93", +"I. c #9B9DAB", +"J. c #9B9DAC", +"K. c #211512", +"L. c #662D22", +"M. c #38201A", +"N. c #000000", +"O. c #7B7D8C", +"P. c #8B8899", +"Q. c #EE2924", +"R. c #A43426", +"S. c #8B91A3", +"T. c #928F9C", +"U. c #9D9AAA", +"V. c #57565A", +"W. c #202021", +"X. c #6D6A78", +"Y. c #8C8EA5", +"Z. c #7B778A", +"`. c #62626B", +" + c #111011", +".+ c #414049", +"++ c #5B5979", +"@+ c #616084", +"#+ c #3A3A40", +"$+ c #55555A", +"%+ c #212123", +"&+ c #0D0E0E", +"*+ c #252629", +"=+ c #060707", +"-+ c #181818", +";+ c #313133", +">+ c #46464A", +",+ c #5B5A62", +"'+ c #7675AA", +")+ c #7D7DBC", +"!+ c #313034", +"~+ c #6A6973", +"{+ c #CE2F25", +"]+ c #272727", +"^+ c #36363A", +"/+ c #3B3A41", +"(+ c #6B6994", +"_+ c #484955", +":+ c #B9B7B7", +"<+ c #CCCACA", +"[+ c #858282", +"}+ c #4D4B4B", +"|+ c #515069", +"1+ c #7A7AB3", +"2+ c #8180BD", +"3+ c #7F7EBC", +"4+ c #65638A", +"5+ c #6C6A6D", +"6+ c #2C2C2F", +"7+ c #2D2F32", +"8+ c #433F3C", +"9+ c #454549", +"0+ c #6A6B7A", +"a+ c #DAD8D8", +"b+ c #D1D0CF", +"c+ c #B2B0AF", +"d+ c #898686", +"e+ c #515053", +"f+ c #4E4C4D", +"g+ c #706E9D", +"h+ c #A6A4A3", +"i+ c #4D4B63", +"j+ c #F5F5F5", +"k+ c #E0DEEA", +"l+ c #BBB9B8", +"m+ c #959293", +"n+ c #7C768B", +"o+ c #737483", +"p+ c #EAE9E9", +"q+ c #C6C4C4", +"r+ c #1C1C1D", +"s+ c #3E4145", +"t+ c #908D8D", +"u+ c #807D80", +"v+ c #4F4F55", +"w+ c #6D6E7A", +"x+ c #4C5056", +"y+ c #404048", +"z+ c #363535", +"A+ c #54526D", +"B+ c #4C4B62", +"C+ c #131312", +"D+ c #5A5C69", +"E+ c #676464", +"F+ c #757274", +"G+ c #484855", +"H+ c #686791", +"I+ c #110D0B", +"J+ c #9E9B9B", +"K+ c #7B7584", +"L+ c #736E83", +"M+ c #9390A5", +"N+ c #7170A0", +"O+ c #6A6879", +"P+ c #351A13", +"Q+ c #883024", +"R+ c #53251D", +"S+ c #AA3125", +"T+ c #ACA9A9", +"U+ c #959393", +"V+ c #312B24", +"W+ c #DB2925", +"X+ c #797684", +"Y+ c #28231E", +"Z+ c #BFBFE0", +"`+ c #BBBBDE", +" @ c #676773", +".@ c #737481", +"+@ c #8F8C99", +"@@ c #CECDE7", +"#@ c #ACA9BB", +"$@ c #B8B6CA", +"%@ c #C7C7E2", +"&@ c #C2C2E1", +"*@ c #8B889B", +"=@ c #817F8B", +"-@ c #BCBACE", +";@ c #ADABC1", +">@ c #D7D6EB", +",@ c #BCBCDC", +"'@ c #ACAAC6", +")@ c #D1D0E9", +"!@ c #CFCEE8", +"~@ c #59493B", +"{@ c #3D342C", +"]@ c #5B616A", +"^@ c #AE8665", +"/@ c #322C26", +"(@ c #907051", +"_@ c #626573", +":@ c #C4C3D8", +"<@ c #59493A", +"[@ c #A07C5B", +"}@ c #B58A61", +"|@ c #5A5D6A", +"1@ c #636674", +"2@ c #D39D67", +"3@ c #63667B", +"4@ c #636A73", +"5@ c #62697B", +"6@ c #7F654B", +"7@ c #DBA267", +"8@ c #6B5643", +"9@ c #443D38", +"0@ c #6B6E7C", +"a@ c #6A6D7B", +"b@ c #6B6A7B", +"c@ c #6A697B", +"d@ c #626173", +"e@ c #636274", +"f@ c #8F6F51", +"g@ c #737182", +"h@ c #715A46", +"i@ c #5B6174", +"j@ c #525E62", +" ", +" ", +" ", +" ", +" . + @ # . @ . @ @ @ @ @ @ $ % & $ * $ * & = = = - ; > ; , > , > ' , ' ' ' ) ! ) ~ ! ~ ! ~ { ~ ] ] ^ ] / ^ ( / ( . + @ # . @ . @ @ @ @ @ @ $ % & $ * $ * & = = = - ; > ; , > , > ' , ' ' ' ) ! ) ~ ! ~ ! ~ { ~ ] ] ^ ] / ^ ( / ( ", +" + @ . . @ @ @ @ @ @ @ @ $ % $ _ : & = & - - = = ; > ; > < , , ' , [ ' ' ) ! ) ! ~ ~ ~ ~ { ~ ] ] ^ ] / ] / / / / + @ . . @ @ @ @ @ @ @ @ $ % $ _ : & = & - - = = ; > ; > < , , ' , [ ' ' ) ! ) ! ~ ~ ~ ~ { ~ ] ] ^ ] / ] / / / / ", +" @ . @ # @ . @ @ @ @ @ $ % $ * & & _ & = - = } | > ; > , 1 > ' , ' ' ) ' ! ) ! ~ ~ ! 2 { ~ ] ^ ] ] / ] / / ( / 3 @ . @ # @ . @ @ @ @ @ $ % $ * & & _ & = - = } | > ; > , 1 > ' , ' ' ) ' ! ) ! ~ ~ ! 2 { ~ ] ^ ] ] / ] / / ( / 3 ", +" # . # . @ @ @ @ @ @ $ & 4 5 6 7 7 7 8 5 9 , | 0 ; > , , < ' 1 ' ' ' ' ~ ) ! 2 ~ ~ ~ ] ~ ] ] ] ^ / ] / / / / a / # . # . @ @ @ @ @ @ $ & 4 5 6 7 7 7 8 5 9 , | 0 ; > , , < ' 1 ' ' ' ' ~ ) ! 2 ~ ~ ~ ] ~ ] ] ] ^ / ] / / / / a / ", +" . @ @ @ @ @ @ @ @ & _ b c 7 d e e e f 7 7 7 8 5 g ~ ) 4 ' , ' ' ' ) ! ) ! ~ ~ ~ ~ { ~ { ] ^ ] / ] / / / / a / a . @ @ @ @ @ @ @ @ & _ b c 7 d e e e f 7 7 7 8 5 g ~ ) 4 ' , ' ' ' ) ! ) ! ~ ~ ~ ~ { ~ { ] ^ ] / ] / / / / a / a ", +" @ @ . @ @ @ @ @ & * h 7 i j k k k k k l m 7 7 n o p 8 5 g 3 { q ) ! ) ! ~ ~ ~ 2 ] ~ ] ] ^ ] / { / / / / a / a a @ @ . @ @ @ @ @ & * h 7 i j k k k k k l m 7 7 n o p 8 5 g 3 { q ) ! ) ! ~ ~ ~ 2 ] ~ ] ] ^ ] / { / / / / a / a a ", +" . @ @ @ @ @ @ & @ r c d s k k k k k k k t f 6 u l v f 6 w p 8 x y z 3 ^ ~ ~ ~ { ~ ] ] ^ ] / ] / / / / a / a 3 A . @ @ @ @ @ @ & @ r c d s k k k k k k k t f 6 u l v f 6 w p 8 x y z 3 ^ ~ ~ ~ { ~ ] ] ^ ] / ] / / / / a / a 3 A ", +" @ @ @ @ @ @ : @ , m 8 B k k k k k k k k k j 6 8 s k k t C b f D w c 8 5 y E F ^ { ] ] ] / ] / / / / a / a a 3 a @ @ @ @ @ @ : @ , m 8 B k k k k k k k k k j 6 8 s k k t C b f D w c 8 5 y E F ^ { ] ] ] / ] / / / / a / a a 3 a ", +" @ @ @ @ @ : @ & v 7 G k k k k k k k k k k k C 7 b k k k k k k j C v i 8 w o 8 5 v g z / { / / / / a / a a a A A @ @ @ @ @ : @ & v 7 G k k k k k k k k k k k C 7 b k k k k k k j C v i 8 w o 8 5 v g z / { / / / / a / a a a A A ", +" @ @ @ @ & @ & H I 8 J k k k k k k k k k k k s 5 6 j k k k k k k k k k B u v I 8 w o 8 5 b K 9 / a / a a a A a L @ @ @ @ & @ & H I 8 J k k k k k k k k k k k s 5 6 j k k k k k k k k k B u v I 8 w o 8 5 b K 9 / a / a a a A a L ", +" @ @ @ $ @ : _ M D b s k k k k k k k k k k k k C 7 N k k k k k k k k k k k k k J G b I m n o 8 x b O g a A a P A @ @ @ $ @ : _ M D b s k k k k k k k k k k k k C 7 N k k k k k k k k k k k k k J G b I m n o 8 x b O g a A a P A ", +" @ @ $ % : _ & : p Q k k k k k k k k k k k k k B 8 5 R k k k k k k k k k k k k k k k k J G v 5 m w p 6 5 F P a P @ @ $ % : _ & : p Q k k k k k k k k k k k k k B 8 5 R k k k k k k k k k k k k k k k k J G v 5 m w p 6 5 F P a P ", +" @ $ % $ _ & & S o C k k k k k k k k k k k k k T b D B k k k k k k k k k k k k k k k k k k k R U C N 5 7 I F P P @ $ % $ _ & & S o C k k k k k k k k k k k k k T b D B k k k k k k k k k k k k k k k k k k k R U C N 5 7 I F P P ", +" $ % $ * & & - V D l k k k k k k k k k k k k k k u o C k k k k k k k k k k k k k k k k k k k k k k k t b 7 5 P P $ % $ * & & - V D l k k k k k k k k k k k k k k u o C k k k k k k k k k k k k k k k k k k k k k k k t b 7 5 P P ", +" % $ * $ : $ & y f J k k k k k k k k k k k k k k l w r k k k k k k k k k k k k k k k k k k k k k k k k s d o g P % $ * $ : $ & y f J k k k k k k k k k k k k k k l w r k k k k k k k k k k k k k k k k k k k k k k k k s d o g P ", +" & _ & : - & - W f J k k k k k k k k k k k k k k J 6 b k k k k k k k k k k k k k k k k k k k k k k k k k J c x X & _ & : - & - W f J k k k k k k k k k k k k k k J 6 b k k k k k k k k k k k k k k k k k k k k k k k k k J c x X ", +" $ & & Y & - = y f J k k k k k k k k k k k k k k j i I T k k k k k k k k k k k k k k k k k k k k k k k k k I o P $ & & Y & - = y f J k k k k k k k k k k k k k k j i I T k k k k k k k k k k k k k k k k k k k k k k k k k I o P ", +" * & _ & = = - W f J k k k k k k k k k k k k k k s 5 i t k k k k k k k k k k k k k k k k k k k k k k k k k G p v * & _ & = = - W f J k k k k k k k k k k k k k k s 5 i t k k k k k k k k k k k k k k k k k k k k k k k k k G p v ", +" $ - & = = - - W f J k k k k k k k k k k k k k k s 5 i R Q h u B k k k k k k k k k k k k k k k k k k k k k j p x $ - & = = - - W f J k k k k k k k k k k k k k k s 5 i R Q h u B k k k k k k k k k k k k k k k k k k k k k j p x ", +" * & - = - | } W f J k k k k k k k k k k k k k k R b Z J 5 7 7 o o x r ` j k k k k k k k k k k k k k k k k R w m * & - = - | } W f J k k k k k k k k k k k k k k R b Z J 5 7 7 o o x r ` j k k k k k k k k k k k k k k k k R w m ", +" : = = = - } | .D l k k k k k k k k k k k k k k k e D Q D ..+.@...#.7 7 p 6 5 Q U $.k k k k k k k k k k k k i 8 : = = = - } | .D l k k k k k k k k k k k k k k k e D Q D ..+.@...#.7 7 p 6 5 Q U $.k k k k k k k k k k k k i 8 ", +" - = - = ; > ; %.p u k k k k k k k k k k k k k k k e D b o 7 c &.*.+.=.@.*.&.#.7 7 7 D 5 G B k k k k k k k k b p - = - = ; > ; %.p u k k k k k k k k k k k k k k k e D b o 7 c &.*.+.=.@.*.&.#.7 7 7 D 5 G B k k k k k k k k b p ", +" = = } | > ; > < o Q k k k k k k k k k k k k k k k e w J j Q 5 p 7 7 n &.@.+.=.=.@...#.c 7 7 c f h u j R k k e 7 = = } | > ; > < o Q k k k k k k k k k k k k k k k e w J j Q 5 p 7 7 n &.@.+.=.=.@...#.c 7 7 c f h u j R k k e 7 ", +" - - | } ; > 1 1 8 h s k k k k k k k k k k k k k k Q n C k k k k B Q 5 c 7 7 #...@.+.=.=.+.@...#.p 7 I j k k e 7 - - | } ; > 1 1 8 h s k k k k k k k k k k k k k k Q n C k k k k B Q 5 c 7 7 #...@.+.=.=.+.@...#.p 7 I j k k e 7 ", +" = ; > ; > 1 , , m d j k k k k k k k k k k k k k k C 6 u k k k k k k k k J N d p p 7 #...@.=.-.-.-.#.I j k k e 7 = ; > ; > 1 , , m d j k k k k k k k k k k k k k k C 6 u k k k k k k k k J N d p p 7 #...@.=.-.-.-.#.I j k k e 7 ", +" ; > ; > , 1 , ' x 8 J k k k k k k k k k k k k k k C 6 G k k k k k k k k k k k R ` v m p 7 *.-.=.-.#.d j k k e 7 ; > ; > , 1 , ' x 8 J k k k k k k k k k k k k k k C 6 G k k k k k k k k k k k R ` v m p 7 *.-.=.-.#.d j k k e 7 ", +" > ; > , , , ' , h o l k k k k k k k k k k k k k k U w v k k k k k k k k k k k k k k k l n *.-.=.=.#.b s k k e 7 > ; > , , , ' , h o l k k k k k k k k k k k k k k U w v k k k k k k k k k k k k k k k l n *.-.=.=.#.b s k k e 7 ", +" ; > < , < ' , ' y p u k k k k k k k k k k k k k k J 8 b R k k k k k k k k k k k k k k U D ..-.-.+.n r $.k k e 7 ; > < , < ' , ' y p u k k k k k k k k k k k k k k J 8 b R k k k k k k k k k k k k k k U D ..-.-.+.n r $.k k e 7 ", +" < < , , ' , ' ' 9 w e R k k k k k k k k k k k k k R 5 i s k k k k k k k k k k k k k k B m #.@.+.+.#.r T k k e 7 < < , , ' , ' ' 9 w e R k k k k k k k k k k k k k R 5 i s k k k k k k k k k k k k k k B m #.@.+.+.#.r T k k e 7 ", +" > , > ' , ' [ ' 2 8 h t k k k k k k k k k k k $.B ` f p r ` J s k k k k k k k k k k k j b o p #.&.7 r $.k k h o > , > ' , ' [ ' 2 8 h t k k k k k k k k k k k $.B ` f p r ` J s k k k k k k k k k k k j b o p #.&.7 r $.k k h o ", +" < , ' , ' ' ' ' ~ i f B k k k k k k k k j l G b f 7 p D p p 8 ;.N ` J $.k k k k k k k k s l N 5 8 7 u R k k I D < , ' , ' ' ' ' ~ i f B k k k k k k k k j l G b f 7 p D p p 8 ;.N ` J $.k k k k k k k k s l N 5 8 7 u R k k I D ", +" > ' 1 ' ' ' ) ! ) 5 6 U k k k k R J u y i n 7 p f h X = q O d 8 p p 8 5 e ` j k k k k k k k k k j G j k k k i 8 > ' 1 ' ' ' ) ! ) 5 6 U k k k k R J u y i n 7 p f h X = q O d 8 p p 8 5 e ` j k k k k k k k k k j G j k k k i 8 ", +" ' , ' ' ' ) ! ) ! b 7 U k j ` r 5 Z 7 7 D 5 r ! >.,.,.,.,.'.,.>.Y g 5 8 p p m ;.N ` t k k k k k k k k k k k w f ' , ' ' ' ) ! ) ! b 7 U k j ` r 5 Z 7 7 D 5 r ! >.,.,.,.,.'.,.>.Y g 5 8 p p m ;.N ` t k k k k k k k k k k k w f ", +" 1 ' [ [ ) ! ) ! ~ g o h b i D 7 n I b F Y ).'.,.,.).).).).,.'.' v Y ).>.q y d D n w m ;.N l t k k k k k k $.p I 1 ' [ [ ) ! ) ! ~ g o h b i D 7 n I b F Y ).'.,.,.).).).).,.'.' v Y ).>.q y d D n w m ;.N l t k k k k k k $.p I ", +" ' ' ) ' ! ) ! ~ ~ A 6 7 7 7 7 m b { >.'.'.'.'.,.,.,.).).'.).O w 7 w m y >.,.).@ ( r x 8 o n 8 5 e l T k k j c 5 ' ' ) ' ! ) ! ~ ~ A 6 7 7 7 7 m b { >.'.'.'.'.,.,.,.).).'.).O w 7 w m y >.,.).@ ( r x 8 o n 8 5 e l T k k j c 5 ", +" ' ' ' ~ ) ! 2 2 ~ !.v ;.f m w w D 8 m i I O r { $ ).'.'.q f 7 ~.7 {.Z p 8 ).).,.,.,.>.# q g d D 7 c 8 5 N r p b ' ' ' ~ ) ! 2 2 ~ !.v ;.f m w w D 8 m i I O r { $ ).'.'.q f 7 ~.7 {.Z p 8 ).).,.,.,.>.# q g d D 7 c 8 5 N r p b ", +" ' ) ! ) ! ~ ~ ~ ~ { ~ ( F ].^.y y ;.x 8 D w o 6 D 8 m 5 8 n /.(.w _.:._.7 @ ,.).).).,.,.,.,.).>._ K 8 7 o o 7 <. ' ) ! ) ! ~ ~ ~ ~ { ~ ( F ].^.y y ;.x 8 D w o 6 D 8 m 5 8 n /.(.w _.:._.7 @ ,.).).).,.,.,.,.).>._ K 8 7 o o 7 <. ", +" ) ! ) ! ~ ~ ~ ~ ] ~ ] ] ] ] / { / / A E ^.[.r O h I m 8 7 ~.(.}.6 |.1.(.7 b + '.'.'.'.'.,.- F b i D o 7 7 w f 2. ) ! ) ! ~ ~ ~ ~ ] ~ ] ] ] ] / { / / A E ^.[.r O h I m 8 7 ~.(.}.6 |.1.(.7 b + '.'.'.'.'.,.- F b i D o 7 7 w f 2. ", +" ! ) ! ~ ~ ~ 2 ] ~ ] { ] ^ / ] / / / / a / 3 a a A E 9 ].f Z :.}.~.~.3.4.w p w 6 D 5 x m w w o o D m x h O v <.K ! ) ! ~ ~ ~ 2 ] ~ ] { ] ^ / ] / / / / a / 3 a a A E 9 ].f Z :.}.~.~.3.4.w p w 6 D 5 x m w w o o D m x h O v <.K ", +" ) ! ~ ~ ~ ~ ] ~ ] ] ] ^ ( ] / / / / a / a a a A a F 5.P 5 w 6.}.|.Z 3.4.~.7 h f m 6 w 8 i 5 O y <.K 7.2.K K K K ) ! ~ ~ ~ ~ ] ~ ] ] ] ^ ( ] / / / / a / a a a A a F 5.P 5 w 6.}.|.Z 3.4.~.7 h f m 6 w 8 i 5 O y <.K 7.2.K K K K ", +" 2 ~ ~ ~ ~ ] ~ { ] ] ^ ( ^ / / / / a / a a a A a P 5.P P 5 6 6.}._.p (.8./.7 2.[.[.[.[.7.^.2.9.2.^.K 2.K K K K K 2 ~ ~ ~ ~ ] ~ { ] ] ^ ( ^ / / / / a / a a a A a P 5.P P 5 6 6.}._.p (.8./.7 2.[.[.[.[.7.^.2.9.2.^.K 2.K K K K K ", +" ! ~ ! ~ { ~ ] ] ] ^ ( ^ ( / ( / a / a 3 3 A a P a P F P 5 w 6.}.0.7 (.4.6.7 h ^.^.^.^.^.2.^.2.^.K 2.7.K K K K K ! ~ ! ~ { ~ ] ] ] ^ ( ^ ( / ( / a / a 3 3 A a P a P F P 5 w 6.}.0.7 (.4.6.7 h ^.^.^.^.^.2.^.2.^.K 2.7.K K K K K ", +" ~ ~ ~ { ~ ] ] { ^ ( ^ ( / / / a / 3 a a A 3 P a P P P P 5 w 6.}.0.7 6.1.8.7 I ^.^.^.^.2.^.2.^.K 2.K K K K K K <. ~ ~ ~ { ~ ] ] { ^ ( ^ ( / / / a / 3 a a A 3 P a P P P P 5 w 6.}.0.7 6.1.8.7 I ^.^.^.^.2.^.2.^.K 2.K K K K K K <. ", +" ! ~ ] ~ ] { ^ { / { / / / / a / 3 a A a A L A P P P P a.;.p 6.4.(.p 0.b.8.Z 8 ^.^.^.2.^.2.^.K 2.K 2.K K K K y K ! ~ ] ~ ] { ^ { / { / / / / a / 3 a A a A L A P P P P a.;.p 6.4.(.p 0.b.8.Z 8 ^.^.^.2.^.2.^.K 2.K 2.K K K K y K ", +" ~ ] ~ ] ] ^ ] / ] / / ( / a / a a A a A L A P L P P c.P O p 0.}.3.c _.1.8._.7 9.^.2.^.2.^.K 2.K K K K K K y <.<. ~ ] ~ ] ] ^ ] / ] / / ( / a / a a A a A L A P L P P c.P O p 0.}.3.c _.1.8._.7 9.^.2.^.2.^.K 2.K K K K K K y <.<. ", +" { ~ { ] ^ ] / { / / / / a / a 3 A 3 A L A P P P P X P c.b p 0.4.}.w |.1.8.0.7 O 2.9.2.^.K 2.K K K K K K y <.y K { ~ { ] ^ ] / { / / / / a / a 3 A 3 A L A P P P P X P c.b p 0.4.}.w |.1.8.0.7 O 2.9.2.^.K 2.K K K K K K y <.y K ", +" ~ ] ^ ] { / { / / / / a / a a A a A L A P P P P X P c.].b p 0.4.}.6 {.b.8.(.7 x ^.2.^.K 2.K K K K K K K <.y <.<. ~ ] ^ ] { / { / / / / a / a a A a A L A P P P P X P c.].b p 0.4.}.6 {.b.8.(.7 x ^.2.^.K 2.K K K K K K K <.y <.<. ", +" ] ] ] ^ / ] / / / / 3 / a a A a A L A P P P P c.P X ].c.O p 0.4.}.|.D b.8.1.c m 2.^.K 2.K K K K K K K <.y <.y O ] ] ] ^ / ] / / / / 3 / a a A a A L A P P P P c.P X ].c.O p 0.4.}.|.D b.8.1.c m 2.^.K 2.K K K K K K K <.y <.y O ", +" ] ^ { / ] / / / / a / a a A a A L A P P P P c.P c.].c.].K w _.1.}.|.n 3.8.1.~.6 ^.K 2.K K K K K K K <.K <.y O <. ] ^ { / ] / / / / a / a a A a A L A P P P P c.P c.].c.].K w _.1.}.|.n 3.8.1.~.6 ^.K 2.K K K K K K K <.K <.y O <. ", +" ^ ] / ] / / / / a / a a a a A L A P P P P c.P a.c.X ].d.2.6 _.b.}./.7 b.8.1./.p <.2.K 2.K K K K K <.K <.y O <.O ^ ] / ] / / / / a / a a a a A L A P P P P c.P a.c.X ].d.2.6 _.b.}./.7 b.8.1./.p <.2.K 2.K K K K K <.K <.y O <.O ", +" ] / ] / / / / a / a a 3 A A L A P P P P X P c.c.].].d.].7.6 _.b.}.0.7 :.8.1.6.7 h 7.K K K K K K <.K <.K <.<.O O ] / ] / / / / a / a a 3 A A L A P P P P X P c.c.].].d.].7.6 _.b.}.0.7 :.8.1.6.7 h 7.K K K K K K <.K <.K <.<.O O ", +" / ] / / / / a / a a a A a L A P P P P c.P X X ].X d.].^.2.6 _.1.4.:.7 0.8.8.(.p I K K K K K K <.K <.K O <.O O O / ] / / / / a / a a a A a L A P P P P c.P X X ].X d.].^.2.6 _.1.4.:.7 0.8.8.(.p I K K K K K K <.K <.K O <.O O O ", +" ^ / / / / a / a a a A a P A P P P P X P X X ].a.^.].^.^.[.D |.3.4.3.p /.8.8.3.Z D K K K K y <.y <.y O <.O O O O ^ / / / / a / a a a A a P A P P P P X P X X ].a.^.].^.^.[.D |.3.4.3.p /.8.8.3.Z D K K K K y <.y <.y O <.O O O O ", +" ( / ( / a / a a a A 3 P a P L P P c.P c.c.].X ^.a.^.d.^.^.8 {.(.4.}.c _.1.8.b.|.o <.K K y <.y <.y O <.<.O O O O ( / ( / a / a a a A 3 P a P L P P c.P c.c.].X ^.a.^.d.^.^.8 {.(.4.}.c _.1.8.b.|.o <.K K y <.y <.y O <.<.O O O O ", +" / / / a / a a 3 A 3 P a P P P P X P X X ].c.^.c.^.^.^.^.^.8 {.(.4.}.6 {.8.8.1./.7 b K y <.y <.y <.<.O O O O O O / / / a / a a 3 A 3 P a P P P P X P X X ].c.^.c.^.^.^.^.^.8 {.(.4.}.6 {.8.8.1./.7 b K y <.y <.y <.<.O O O O O O ", +" ( / a / a a A a A L A P P P P c.P c.].c.].d.].^.^.^.^.^.^.f {.(.e.e.~.Z b.b.b.:.7 h <.K <.K <.O <.O O O O O O O ( / a / a a A a A L A P P P P c.P c.].c.].d.].^.^.^.^.^.^.f {.(.e.e.~.Z b.b.b.:.7 h <.K <.K <.O <.O O O O O O O ", +" ", +" ", +" ", +" ", +" f.f.g.h.f.g.f.i.g.i.i.i.i.j.k.l.j.m.j.m.l.l.n.l.o.p.n.p., n.q.r.s.s.t.t.u.v.w.) x.y.~ y.~ { ~ ] ] ^ ] / ^ ( / ( z.A.@ B.z.@ z.@ @ @ @ @ @ C.D.& C.E.C.E.& = = = F.p.> p., > , > ' , ' G.' ) ! ) S ! ~ ! ~ { ~ ] ] ^ ] V ^ H.V H. ", +" f.g.f.f.I.g.i.J.i.i.i.i.j.k.j._ l.l.l.l.l.n.l.l.p.n.p.n.< , q.K.L.L.M.M.N.N.N.y.x.~ ~ ~ { ~ ] ] ^ ] O.] / / / / A.@ z.z.@ @ @ @ @ @ @ @ C.D.C.H : & = & F.F.= = p.> p.> < , , G., P.G.' ) ! ) ! S ~ ~ ~ { ~ ] ] ^ ] V ] V V V V ", +" g.f.I.h.J.f.g.i.i.i.i.j.k.j.m.l.l._ l.l.n.l.} o.n.p.n., 1 n.t.M.Q.Q.Q.Q.Q.R.N.~ ~ y.x.{ ~ ] ^ ] ] O.] O.O.( / 3 @ z.@ B.@ z.@ @ @ @ @ C.D.C.E.& & H & = F.= S.T.> p.> , 1 > ' , ' ' ) ' ! ) ! ~ ~ ! S { ~ ] ^ ] ] V ] V V H.V V ", +" h.f.h.f.U.g.i.i.i.i.j.k.' V.W.N.N.N.s.q.X.l.o.} p.n., , < ' q.M.Q.Q.Q.Q.Q.R.N.x.~ ~ ] ~ ] ] ] ^ O.] / / / / a / B.z.B.z.@ @ @ @ @ @ C.D.C.E.C.& C.: = F.F.= T.Y.p.> , , < ' 1 ' ' ' G.S ) ! S S ~ ~ ] ~ ] ] ] ^ V ] V V V V Z.V ", +" f.g.g.i.g.i.i.i.i.l.i.`. +r..+++@+++#+ +N.N.s.q.X., , < G., t.M.Q.Q.Q.Q.Q.L. +~ x.{ ~ { ] ^ ] O.] O.O./ O.a / a z.@ @ @ @ @ @ @ @ & @ , $+%+&+%+*+*+=+-+;+>+$+ .! , , < G., G.' ' ) ! ) ! ~ ~ ~ S { ~ { ] ^ ] V ] V V V V V V Z. ", +" I.g.f.J.i.i.i.i.l.i.,+N.#+'+)+)+)+)+)+'+!+N. +W.N.N.s.t.~+' V. +Q.{+R.R.R.L.]+x.] ~ ] ] ^ ] / { / O.O.O.a / a a @ @ z.@ @ @ @ @ & @ F.^+N./+++(+(+(+++_+=+N.=+-+*+/+$+w., ' ' ' ) ! ) ! ~ ~ S S ] ~ ] ] ^ ] V { V V V V Z.V V Z. ", +" f.i.g.i.i.i.i.l.i./ +.+)+)+)+)+)+)+)+)+)+#+N.:+<+[+}+W.N.N.W.N.Q.R.N.N.N.N.s.{ ~ ] ] ^ ] / ] / / / O.a / a 3 A z.@ @ @ @ @ @ & @ & /+N.|+1+2+3+3+3+3+1+4+-+N.5+W 6+&+&+%+^+$+2.! ) ! ~ ~ ~ ~ { ~ ] ] ^ ] V ] V V V V Z.V Z.V A ", +" i.J.i.i.i.i.l.i.l.7+W.)+)+)+)+)+)+)+)+)+)+)+s.W.k k k k <+[+8+N.Q.R.N.9+`.x.] ~ { ] ] ] O.] O.O./ O.a / a a 3 a @ @ @ @ @ @ : @ & 0+N._+)+)+)+)+)+)+)+3+3+(+&+;+a+b+c+d+e+*+N.=+-+;+f+0+~ ~ ] ~ { ] ] ] V ] V V V V Z.V V Z.V Z. ", +" I.i.i.i.i.l.U.l.] N.++)+)+)+)+)+)+)+)+)+)+)+g+N.[+k k k k k h+N.Q.R.N.s.N.N.s.9+`.] ^ / { O.O./ O.a O.a a a A A @ @ @ @ @ : @ & H *+-+1+)+)+)+)+)+)+)+)+)+3+i+N.d+k k j+k+b+l+d+f+%+N.N.-+;+e+0+] ] ^ V ] V V V V Z.V Z.V Z.A A ", +" i.i.i.i.l.i.l.i.}+r.)+)+)+)+)+)+)+)+)+)+)+)+)+#+r.k k k k k h+N.Q.R.N.k t m+V.s.N.N.s.9+u./ / / a O.a a a A a n+ @ @ @ @ & @ & H o+=+i+)+)+)+)+)+)+)+)+)+)+)+1+*+-+j+k k k k k j+p+a+q+d+f+r+N.=+&+^+e+o+V V V V Z.V V Z.Z.A Z.Z. ", +" i.w.o.j.i.l._ l.s..+)+)+)+)+)+)+)+)+)+)+)+)+)+g+N.m+k k k k h+N.Q.R.N.k k k k k t m+V.s.N.N.]+s+u.X.a a A a P A @ @ @ C.@ : H M >+N.'+)+)+)+)+)+)+)+)+)+)+)+2+++N.t+k k k k k k k k k j+j+p+q+u+>+-+N.N.&+^+$+o+V Z.V Z.A Z.o+A ", +" i.]+N. +s.9+v+w+N.++)+)+)+)+)+)+)+)+)+)+)+)+)+)+W.}+k k k k h+N.Q.L.W.k k k k k k k k k t m+V.s.N.N.r.x+a P a P @ @ C.D.: H & : *+6+1+)+)+)+)+)+)+)+)+)+)+)+)+3+-+>+k k k k k k k k k k k k k k k k a+d+f+r+N.N.-+6+y+0+V o+Z.o+ ", +" i.z+N.N. +s.W.N.N. +s..+A+@+)+)+)+)+)+)+)+)+)+)+B+W.k k k k h+N.Q.L.z+k k k k k k k k k k k k k k :+}+N.z+a P P @ C.D.C.H & & S C+_+1+)+)+)+)+)+)+)+)+)+)+)+)+3+>+=+j+k k k k k k k k k k k k k k k k k k k b+u+f+*+&+&+D+Z.o+o+ ", +" j.}+s.E+ + +}+:+h+F+V.z+ +N.N.r.s.G+A+@+)+)+)+)+H+N.<+k k k h+N.Q.L.z+k k k k k k k k k k k k k k k k [+N.9+P P C.D.C.E.& & F.V I+++1+)+)+)+)+)+)+)+)+)+)+)+)+3+4+N.J+k k k k k k k k k k k k k k k k k k k k k k k l+;+N.D+o+o+ ", +" k.v.N.k t [+W.N.}+<+k k k t h+F+V.z+N.N.N.W.!+G+++N.m+k k k h+N.Q.L.z+k k k k k k k k k k k k k k k k k E+ +w+P D.C.E.C.: C.& y N.4+)+)+)+)+)+)+)+)+)+)+)+)+)+3+1+=+5+k k k k k k k k k k k k k k k k k k k k k k k k a+6+%+ .o+ ", +" l.K+N.:+k k k [+W.N.8+h+k k k k k k k <+h+E+}+z+N.N.E+k k k h+N.Q.L.z+k k k k k k k k k k k k k k k k k t +s+X & H & : F.& F.W N.'+)+)+)+)+)+)+)+)+)+)+)+)+)+)+2+r+>+k k k k k k k k k k k k k k k k k k k k k k k k k t+&+e+L+ ", +" j.l.N.m+k k k k k m+z+N.z+h+k k k k k k k k k k k E+V.k k k :+N.{+L.z+k k k k k k k k k k k k k k k k k k V.r.P C.& & C.& F.M+y N.N+)+)+)+)+)+)+)+)+)+)+)+)+)+)+2+;+6+k k k k k k k k k k k k k k k k k k k k k k k k k k 6+r+o+ ", +" m.l.]+E+k k k k k k k h+z+N.s.[+k k k k k k k k k m+z+k k k k N.R.L.z+k k k k k k k k k k k k k k k k k k :+N.u. E.& H : = = F.W N.N+)+)+)+)+)+)+)+)+)+)+)+)+)+)+2+y+=+k k k k k k k k k k k k k k k k k k k k k k k k k k N =+O+ ", +" j.n.z+8+k k k k k k k k k :+}+N.W.[+k k k k k k :+}+z+k k k k N.R.L.z+k k k k k k k k k k k k k k k k k k k +q. C.F.& = = F.= W N.N+)+)+)+)+)+)+)+)+)+)+)+)+)+)+2+i+N.k q+t+q+p+k k k k k k k k k k k k k k k k k k k k k q+&+>+ ", +" m.l.q.s.k k k k k k k k k k k <+}+N.W.F+<+m+}+ +N. +z+k k k k N.R.L.#+k k k k k k k k k k k k k k k k k k k z+#+ E.& F.= F.T.S.W N.N+)+)+)+)+)+)+)+)+)+)+)+)+)+)+3+_+=+k W N.*+/+e+5+J+q+j+k k k k k k k k k k k k k k k k k -+;+ ", +" l.l.X.N.k k k k k k k k k k k k k <+V. +N.N.z+F+<+h+W.k k k k N.R.M.E+k k k k k k k k k k k k k k k k k k k V.]+ : = = = F.S.T. .=+++)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+++N.q+;+P+Q+R+P+-+&+r+;+>+y J+a+k k k k k k k k k k k k k ^+*+ ", +" o.l.3 N.:+k k k k k k k k k k k k k k t h+t k k k k N.k k k k N.R.M.E+k k k k k k k k k k k k k k k k k k k E+]+ F.= F.= p.> p.%.C+i+)+)+)+)+)+)+)+)+)+)+)+)+)+)+3+4+N.J+N.N.R+R+Q+S+S+Q+R+P+=+=+%+;+e+N T+p+k k k k k k k k >+C+ ", +" l.l.} N.m+k k k k k k k k k k k k k k k k k k k k k N.k k k k N.M. +E+k k k k k k k k k k k k k k k k k k k [+ + = = S.T.> p.> < -+/+1+)+)+)+)+)+)+)+)+)+)+)+)+)+3+4+N.c+U+$+V+=+N.P+P+Q+Q+S+W+S+Q+R+r+&+=+r+;+e+u+l+k k k k 5+=+ ", +" n.l.o.s.E+k k k k k k k k k k k k k k k k k k k k k N.k k k k E+E+E+h+k k k k k k k k k k k k k k k k k k k h+N. F.F.T.Y.p.> 1 1 6+*+1+)+)+)+)+)+)+)+)+)+)+)+)+)+3+4+N.T+k p+b+q+U+$+*+N.N.I+R+Q+S+W+W+W+S+R+P+C+N.=+f+b+k k N =+ ", +" l.p.n.#+8+k k k k k k k k k k k k k k k k k k k k k +h+k k k k k k k k k k k k k k k k k k k k k k k k k k h+N. = p.> p.> 1 , , >+=+1+)+)+)+)+)+)+)+)+)+)+)+)+)+)+1+N.N k k k k k p+a+b+U+e+%+N.=+I+R+Q+W+W+W+W+W+P+6+b+k k N =+ ", +" p.n.p.t.s.k k k k k k k k k k k k k k k k k k k k k z+h+k k k k k k k k k k k k k k k k k k k k k k k k k k h+N. p.> p.> , 1 , ' $+N.(+)+)+)+)+)+)+)+)+)+)+)+)+)+)+3+N.N k k k k k k k k j+j+p+a+d+f+r+N.-+S+W+W+W+P+/+b+k k N =+ ", +" n.p.n.~+N.k k k k k k k k k k k k k k k k k k k k k z+[+k k k k k k k k k k k k k k k k k k k k k k k k k k h+N. > p.> , , , ' , X+=+++)+)+)+)+)+)+)+)+)+)+)+)+)+)+3+-+f+k k k k k k k k k k k k k k k q+r+R+W+W+W+P+$+p+k k N =+ ", +" p.n.< / N.:+k k k k k k k k k k k k k k k k k k k k z+E+k k k k k k k k k k k k k k k k k k k k k k k k k k h+N. p.> < , < ' , G.' C+y+)+)+)+)+)+)+)+)+)+)+)+)+)+)+3+6+/+k k k k k k k k k k k k k k k a+Y+R+W+W+W+P+$+p+k k N =+ ", +" < < , , N.[+k k k k k k k k k k t h+h+h+h+E+E+E+E+8+r.8+k k k k k k k k k k k k k k k k k k k k k k k k k k E+r. < < , , ' , ' G.G.%+*+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+/+-+k k k k k k k k k k k k k k k a+Y+R+W+W+W+P+$+p+k k 5+=+ ", +" n., n.G.s.z+E+E+8+z+z+z+W.N.N.N.N.N.N.N.N.W.s.s.s.W.N. +F+:+k k k k k k k k k k k k k k k k k k k k k k k k E+]+ > , > G., G.P.' ' /+-+)+)+)+)+)+)+)+)+)+)+3+3+)+'+N+/+N.J+q+a+p+k k k k k k k k k k k k+e+=+I+P+R+=+5+j+k k e+&+ ", +" < , ' , t.s.s.s.#+s. +G+B+@+@+@+@+)+)+)+)+g+A+!+ +N.N.!+r.N. +8+F+:+k k k k k k k k k k k k k k k k k k k k E+]+ < , ' , ' G.G.' ~ W N.'+)+)+)+)+)+3+3+)+1+N+4+|+^+-+N.-+N.I+;+y U+l+b+j+k k k k k k k k a+J+W ;+r+N.t+k k k y+%+ ", +" n.' 1 ' ' G.) y.) u.N.)+)+)+)+)+)+'+++.+r.N.N.#+v.r.!+Z+`+h.X..+r.N. +8+F+:+k k k k k k k k k k k k k k k k z+!+ > ' 1 ' ' G.) ! ) @N.++3+3+3+2+)+N+4+|+y+%+=+&+6+=+=+Z.V f+6+-+N.C+;+W t+c+b+k k k k k k k k k b+N l+k k k ^+*+ ", +" ' , ' ' ' ) y.) y..@N.H+)+)+H+G+s.N.N.]+v++@@@@@#@N.K+`+`+`+`+`+`+h.X..+r.N. +8+F+:+k k k k k k k k k k k k z+#+ ' , ' ' ' ) ! ) ! X+N.|+2+1+4+++y+*+=+=+%+^+y T.$@r+/+%@&@%@&@A.{ $+;+-+=+C+;+W d+c+a+k k k k k k k k k k k -+;+ ", +" 1 G.*@*@) y.) y.~ ~ N.#+!+ +N.r.9+=@-@@@@@@@@@@@9+r.`+`+`+`+`+n.V.n.`+`+`+h.X..+r.N. +8+F+:+k k k k k k k k +t. 1 G.P.' ) ! ) ! ~ ~ r+6+_+6+&+=+r+y+W %.;@>@>@k+W N.B.,@,@,@&@A. @M+,@;@H.$+/+r+=+I+;+$+u+T+k+k k k k k k p+C+/+ ", +" ' ' ) ' y.) y.~ ~ / + +#+v.#@@@@@@@@@@@@@@@@@#@N.X.`+`+`+`+V.N.N.N.]+u.'@`+`+`+`+h.X..+r.N. +8+F+:+k k k k N.x+ ' ' ) ' ! ) ! ~ ~ S %+N.C+/+W u+z.%@>@>@)@!@!@%@r+;+&@,@,@&@0+%+N.C+/+O+A.&@,@H Z.W /+r+=+I+;+e+N T+p+k k a+C+>+ ", +" ' ' ' ~ ) y.x.x.~ #+ +-@@@@@@@@@@@@@@@@@@@@@@@9+r.`+`+`+n.]+ +~@ +~@{@ + +`+`+`+`+`+`+`+`+h.u.#+ +N. +8+F+F+N.]@ ' ' ' ~ ) ! S S ~ $+N.W M $@)@>@)@)@@@@@@@@@>@5+N.o+%@%@;@/+=+C+-+Y+V+N.*+B.,@,@&@&@;@C.Z.W /+-+N.C+;+f+u+5+=+$+ ", +" ' ) y.) y.~ ~ x.`.N.w.@@@@@@@@@@@@@@@@@@@@@@-@ +N.N.]+!+!+W.^@8./@~@8.(@N.h.`+`+`+`+`+`+`+`+`+`+`+n..+N.N.N.N._@ ' ) ! ) ! ~ ~ ~ ^ -+6+%@)@!@!@@@@@@@@@@@@@)@:@*+N.*+^+/+y+N.<@[@{@{@}@<@N.S &@,@,@,@,@,@&@&@,@A.M+y 6+N.I+C+N.<. ", +" ) y.) y.~ ~ ~ ~ s.!+@@@@@@@@@@@@@@@@@@@@@@@@,+ +|@,+s+#+r./@8.8.{@8+8.8.N.V.h.`+`+`+`+`+`+n.X.v+7+ +N.N.r.7+9+1@ ) ! ) ! ~ ~ ~ ~ y+N.M !@@@@@@@@@@@@@@@@@@@>@w.&+y+y+6+%+&+r+}@2@{@{@2@}@-+$+H %@%@&@%@%@&@C.X+y y+*+C+N.N.C+;+K ", +" y.) y.~ ~ ~ x.`.N.+@@@@@@@@@@@@@@@@@@@@@@@-@ +.+A 5.K+5.}+ +8.8.~@/@8.8./@N.N.N.]+!+.+]+N.N. +]+z+q.v+3@4@~+_@1@ ! ) ! ~ ~ ~ S w.C+/+:@@@@@@@@@@@@@@@@@@@!@>@;+r+0+o+w. .y+r+[@2@<@r+[@2@V+=+-+%+6+>+>+;+%+-+C+&+%+6+/+|+D+W <.K ", +" ) y.~ x.x.~ ] s.!+@@@@@@@@@@@@@@@@@@@@@@@@v. +].a K+5.P ,+N.8.8.~@]+8.8.~@]+u.V.#+#+s.#+v+]@5@~+5@~+3@4@_@_@_@_@ ) ! ~ S S ~ ] ^+N.;@@@@@@@@@@@@@@@@@@@@@>@X+C+$+Z.X+5.o+K C+6@7@8@-+[@7@9@&+>+/+6+%+-+%+/+_+D+y K @K 2.K K K K ", +" x.~ x.x.~ ] `.N.+@@@@@@@@@@@@@@@@@@@@@@@@@r.z+a P 5.P P ,+N.8.8.(@N.8.8.(@N.0@a@0@a@0@b@0@4@c@4@b@_@4@_@_@_@_@d@ S ~ S S ~ ] o+C+$+:@@@@@@@@@@@@@@@@@@@!@)@^+r+w.o+5.o+o+ @C+6@7@6@I+6@7@8@I+D+0+0+0+0+O+0+2.O+2.0+K 2.K K K K K ", +" y.~ y.~ { x.z+!+@@@@@@@@@@@@@@@@@@@@@@@@w.N.X.P a P K+P ,+N.8.8.(@N.^@8.^@N.V.a@a@a@b@a@4@b@4@b@_@4@3@_@_@_@e@_@ ! ~ ! ~ { S y+N.D.@@@@@@@@@@@@@@@@@@@@>@V -+e+o+Z.o+X+o+ @C+6@7@6@-+6@7@f@r+_+ .0+0+0+0+2.0+2.0+K 2.7.K K K K K ", +" ~ ~ ~ { ~ g@N.w.@@@@@@@@@@@@@@@@@@@@@@@@r.z+P a P P P P ,+N.8.8.8.N.(@8.8.r..+a@a@c@0@4@b@4@b@_@4@_@_@_@_@d@1@]@ ~ ~ ~ { ~ H.%+y+$@!@@@@@@@@@@@@@@@@@!@@@y+C+2.Z.o+o+o+o+ @C+6@7@f@I+8@7@1.Y+^+0+0+O+ .2.0+2.0+K 2.K K K K K K <. ", +" y.~ ] ~ ] }+ +@@@@@@@@@@@@@@@@@@@@@@@@=@N.X.A P P P P a.w+N.(@8.8.N.(@8.8.{@s.0@b@a@4@b@4@b@_@4@1@1@_@1@d@1@`.d@ ! ~ ] ~ ] $+N.%.!@@@@@@@@@@@@@@@@@@@>@%.-+>+A o+o+o+o+o+ @I+8@7@[@r+<@2@7@V+%+2.0+0+2.0+2.0+K 2.K 2.K K K K y K ", +" ~ ] ~ ] ] W.9+@@@@@@@@@@@@@@@@@@@@@@@@!+]+A P n+P P c.P a.N.(@8.8.]+~@8.8.h@ +c@0@4@b@4@b@_@4@_@_@_@_@d@_@`.i@]@ ~ ] ~ ] V ^+%+;@!@@@@@@@@@@@@@@@@@)@%@>+C+2.o+Z.o+o+o+o+O+r+<@7@}@V+9@1.7@<@C+K .2.0+2.0+K 2.K K K K K K y <.<. ", +" { ~ { ] ].N.U.@@@@@@@@@@@@@@@@@@@@@@w.N.,+P P P P g@P c.].N.(@8.8./@~@8.8.(@N.`.4@c@4@b@_@4@1@_@_@_@d@1@`.i@`.d@ { ~ { ] f+-+W :@@@@@@@@@@@@@@@@@@@>@%.C+>+o+o+o+o+o+o+o+K r+<@7@1.{@{@}@7@f@C+D+2.0+2.0+K 2.K K K K K K y <.y K ", +" ~ ] ^ ] }+r.@@@@@@@@@@@@@@@@@@@@@@#@ +#+P P P P g@P X ].c.N.(@8.8.~@/@8.8.8.N.G+b@4@b@_@4@_@_@_@_@d@1@e@i@`.i@]@ ~ ] ^ { 6+N.P.)@@@@@@@@@@@@@@@@@>@;@6+C+ @o+o+o+o+o+o+ .O+-+<@7@1.9@Y+[@2@}@-+y+O+2.0+K 2.K K K K K K K <.y <.<. ", +" ] ] ] ^ 7+#+@@@@@@@@@@@@@@@@@@@@-@]+W.0@P P P c.P X ].c.].N.(@8.8.~@/@8.8.8.]+#+4@b@_@4@_@_@_@_@d@_@d@]@`.i@`.|@ ] ] ] ^ &+%+A.)@@@@@@@@@@@@@@@)@$@y+N.$+o+o+o+o+o+o+ .o+2.r+<@2@7@<@-+[@2@2@Y+6+2.0+K 2.K K K K K K K <.y <.y D+ ", +" ] ^ { / s.,+@@@@@@@@@@@@@@@@@@-@]+ +`.P P P c.P c.].c.].d.W.~@8.8.h@ +8.8.8.8+]+b@_@4@_@1@_@1@e@_@d@]@d@i@`.|@]@ ] ^ { V N.^+;@)@@@@@@@@@@@!@>@,@y+N._+o+o+o+o+o+o+ .o+ .O+%+{@7@2@8@-+f@2@7@{@C+0+K 2.K K K K K K K <.K <.y D+<. ", +" ^ ] / ] ]+9+@@@@@@@@@@@@@@@@U.]+ +]@P P P c.P a.c.X ].d.].]+~@8.8.(@N.8.8.8.h@N.1@4@1@1@_@_@d@_@e@]@d@]@`.|@]@|@ ^ ] V ] N.%+;@>@)@@@@@)@>@>@T.^+N.>+o+o+o+o+o+o+o+L+ .L+2.;+V+7@2@6@I+6@2@2@8@=+<.2.K 2.K K K K K <.K <.y D+<.D+ ", +" ] O.] O.v+N.v.@@@@@@@@@@U.9+N.]+w+P P P g@P c.c.].].d.].a@]+~@8.8.^@N.(@8.8.^@N.V.3@_@_@1@e@1@d@]@d@]@e@|@i@|@|@ ] V ] V 6+=+>+D.,@k+k+$@T.f+r+=+e+o+o+o+o+o+o+o+ . .L+ .2.6+V+7@2@f@&+6@2@2@[@&+f+7.K K K K K K <.K <.K <.<.D+D+ ", +" O.] O./ / #+N. +!+!+!+r.N.r.x+.@P P P c.P X X ].X d.].0@0@]+~@8.8.8.N.(@8.8.8. +s+_@_@1@d@_@d@]@d@]@d@|@]@|@|@|@ V ] V V .>+=+%+6+^+^+6+r+=+y+y o+o+o+o+o+o+L+ .o+L+ . . @6+V+7@2@f@I+8@2@1.1.I+^+K K 2.K K K <.K <.K D+<.D+D+D+ ", +" ^ / O.O./ a w+v+9+.+s+q.u.A P P P P X P X X ].X 0@].a@0@0@W.~@8.8.8. +h@8.8.8.{@7+_@_@d@_@`.i@`.i@`.|@]@|@|@|@|@ ^ V V V V X+ @e+^+6+6+y+$+y .o+o+o+o+o+L+o+ .L+ . .0+ .2.;+V+1.2@}@Y+<@1.2@7@V+%+K K K K y <.y <.y D+<.D+D+D+D+ ", +" ( / ( / a O.a a a A 3 P a P n+P P c.P c.c.].X 0@X a@d.a@a@#+/@8.8.8./@~@8.8.8.~@r.1@d@_@`.i@`.i@`.|@i@|@|@|@|@|@ H.V H.V Z.V V Z.o+ .o+o+Z.o+Z.o+o+o+o+o+o+ .o+0+o+0+L+0+0+y+Y+}@2@}@V+9@}@2@2@<@=+K K K y <.y <.y D+<.<.D+D+D+D+ ", +" O./ / a / a a 3 A 3 P a P P P P g@P X g@].c.a@c.a@0@0@0@0@#+/@8.8.8.{@8+8.8.8.(@N.|@1@`.i@`.i@`.|@]@|@|@|@|@|@j@ V V V V V Z.Z.V A V o+Z.o+o+o+o+o+o+L+o+ .o+0+o+0+ .0+ .0+y+Y+}@2@2@{@Y+}@2@2@f@=+$+K y <.y <.y <.<.D+D+D+D+D+D+ ", +" ( O.a / a a A a A n+A .@P P P c.P c.].c.].d.].0@a@a@0@0@b@q.8+^@^@^@~@/@^@^@^@^@ +V.]@e@]@d@]@|@]@|@|@|@|@|@j@|@ H.V Z.V V Z.A Z.A Z.A o+o+o+o+o+o+o+ .o+ .L+ . .0+ .0+ .O+_+;+[@}@}@9@Y+[@}@}@[@C+>+<.K <.K <.D+<.D+D+D+D+D+D+D+ ", +" ", +" "}; diff --git a/sound-samples/beamusup.wav b/sound-samples/beamusup.wav new file mode 100644 index 0000000..8686336 Binary files /dev/null and b/sound-samples/beamusup.wav differ diff --git a/sound-samples/bell1.wav b/sound-samples/bell1.wav new file mode 100644 index 0000000..8d36c38 Binary files /dev/null and b/sound-samples/bell1.wav differ diff --git a/sound-samples/bell2.wav b/sound-samples/bell2.wav new file mode 100644 index 0000000..2d28898 Binary files /dev/null and b/sound-samples/bell2.wav differ diff --git a/sound-samples/cuckoclk.wav b/sound-samples/cuckoclk.wav new file mode 100644 index 0000000..d8f45d3 Binary files /dev/null and b/sound-samples/cuckoclk.wav differ diff --git a/sound-samples/gotmail05.wav b/sound-samples/gotmail05.wav new file mode 100644 index 0000000..ad4703c Binary files /dev/null and b/sound-samples/gotmail05.wav differ diff --git a/sound-samples/gotmail16.wav b/sound-samples/gotmail16.wav new file mode 100644 index 0000000..8452357 Binary files /dev/null and b/sound-samples/gotmail16.wav differ diff --git a/sound-samples/halmsgs.wav b/sound-samples/halmsgs.wav new file mode 100644 index 0000000..5575cfa Binary files /dev/null and b/sound-samples/halmsgs.wav differ diff --git a/sound-samples/honk.wav b/sound-samples/honk.wav new file mode 100644 index 0000000..4a6702e Binary files /dev/null and b/sound-samples/honk.wav differ diff --git a/sound-samples/test.au b/sound-samples/test.au new file mode 100644 index 0000000..b9e152e Binary files /dev/null and b/sound-samples/test.au differ diff --git a/src/.xvpics/wmnotify-orig.xpm b/src/.xvpics/wmnotify-orig.xpm new file mode 100644 index 0000000..1a50599 Binary files /dev/null and b/src/.xvpics/wmnotify-orig.xpm differ diff --git a/src/.xvpics/wmnotify.xpm b/src/.xvpics/wmnotify.xpm new file mode 100644 index 0000000..0b44a80 Binary files /dev/null and b/src/.xvpics/wmnotify.xpm differ diff --git a/src/.xvpics/wmnotify1.xpm b/src/.xvpics/wmnotify1.xpm new file mode 100644 index 0000000..b452287 Binary files /dev/null and b/src/.xvpics/wmnotify1.xpm differ diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..ead5381 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,29 @@ +# This file is processed by GNU automake to generate Makefile.in + +INCLUDES = -I$(top_srcdir)/pixmaps + +bin_PROGRAMS = wmnotify +wmnotify_SOURCES = wmnotify.c options.c configfile.c xevents.c dockapp.c sound.c \ + network.c pop3.c imap.c ssl.c + +CLEANFILES = *~ +DISTCLEANFILES = .deps/*.P +MAINTAINERCLEANFILES = Makefile.in + +# These headers will be included in the distribution tarball, but will not be +# installed by 'make install' +noinst_HEADERS = common.h wmnotify.h options.h configfile.h xevents.h dockapp.h sound.h \ + network.h pop3.h imap.h ssl.h + +# we want these in the dist tarball +EXTRA_DIST = + +# This rule is used to bypass the default rule which is generated by Automake, in order +# to get rid of all the cluttered informations that are displayed by Make before +# calling the compiler like in the following example: +# source='programming.c' object='programming.o' libtool=no \ +# depfile='.deps/programming.Po' tmpdepfile='.deps/programming.TPo' \ +# depmode=gcc3 /bin/sh ../config/depcomp \ +# gcc -DHAVE_CONFIG_H -I. -I. -I.. -c `test -f 'main.c' || echo './'`main.c +.c.o: + $(COMPILE) -c $< diff --git a/src/common.h b/src/common.h new file mode 100644 index 0000000..9a3d3e8 --- /dev/null +++ b/src/common.h @@ -0,0 +1,46 @@ +/* common.h */ + +#ifndef COMMON_H +#define COMMON_H 1 + + +#include +#include +#include + +#if STDC_HEADERS +# include +#elif HAVE_STRINGS_H +# include +#endif + + +/* Common constants. */ +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# define EXIT_FAILURE 1 +#endif + +typedef int bool; +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + + +/* Returns TRUE if the strings 'a' and 'b' are equal. */ +#define STREQ(a, b) (strcmp((a), (b)) == 0) + +/* Returns TRUE if the first 'c' characters of strings 'a' and 'b' are equal. */ +#define STREQ_LEN(a, b, c) (strncmp((a), (b), (c)) == 0) + + +inline void +ErrorLocation( const char *file, int line ); + +/*@out@*/ /*@only@*/ +void * +xmalloc( size_t size, const char *filename, int line_number ); + + +#endif /* COMMON_H */ diff --git a/src/configfile.c b/src/configfile.c new file mode 100644 index 0000000..f06a166 --- /dev/null +++ b/src/configfile.c @@ -0,0 +1,388 @@ +/* configfile.c -- Parsing the configuration file + Copyright (C) 2003 Hugo Villeneuve */ + + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#if STDC_HEADERS +# include +#elif HAVE_STRINGS_H +# include +#endif + +#include + +#include "common.h" +#include "wmnotify.h" +#include "configfile.h" + + +#define LINE_BUFFER_LEN 256 + +/* Name of configuration file in user's home directory. */ +const static char default_config_filename[] = ".wmnotifyrc"; +const static char delimiter_single_arg[] = " \n"; +const static char delimiter_multiple_arg[] = "#\n"; + + +static void +CreateDefaultConfigurationFile( char *file ) +{ + int status; + FILE *fp; + + fp = fopen( file, "w" ); + if( fp == NULL ) { + fprintf( stderr, "%s: Can't create file \"%s\"\n", PACKAGE, file ); + exit( EXIT_FAILURE ); + } + + fprintf( fp, "# ~/.wmnotifyrc -- Default configuration file for wmnotify\n\n" ); + fprintf( fp, "# Replace all 'xxxxxxxx' fields with your own settings.\n\n" ); + fprintf( fp, "# Parameters preceded by a '#' character are optional.\n" ); + fprintf( fp, "# You can set their values by removing the leading '#'.\n\n" ); + fprintf( fp, "# Mail Protocol: POP3 or IMAP4.\n" ); + fprintf( fp, "protocol POP3\n\n" ); + fprintf( fp, "# Use SSL encrytion: 0=disable, 1=enable (optional, default is " + "disabled).\n" ); + fprintf( fp, "use_ssl 0\n\n" ); + fprintf( fp, "# Mail Server Name.\n" ); + fprintf( fp, "server xxxxxxxx\n\n" ); + fprintf( fp, "# Mail Server Port Number (optional, default is 110).\n" ); + fprintf( fp, "port 110\n\n" ); + fprintf( fp, "# Username.\n" ); + fprintf( fp, "username xxxxxxxx\n\n" ); + fprintf( fp, "# Password.\n" ); + fprintf( fp, "password xxxxxxxx\n\n" ); + fprintf( fp, "# Mail Check Interval (in minutes, default is 5 minutes).\n" ); + fprintf( fp, "#mailcheckdelay 5\n\n" ); + fprintf( fp, "# Default mail client (optional).\n" ); + fprintf( fp, "#mailclient sylpheed\n\n" ); + fprintf( fp, "# Audio notification, 0=disable, 1=enable (optional, default is " + "disabled).\n" ); + fprintf( fp, "enablebeep 0\n\n" ); + fprintf( fp, "# Location of sound file for audio notification. If no sound file is\n" ); + fprintf( fp, "# specified, the console beep will be used instead.\n" ); + fprintf( fp, "audiofile /usr/local/share/sounds/halmsgs.wav\n\n" ); + fprintf( fp, "# Volume (0 to 100%%).\n" ); + fprintf( fp, "volume 100\n" ); + + fprintf( stderr, "%s: A default configuration file has been created in your " + "home directory: \"%s\"\n", PACKAGE, file ); + fprintf( stderr, "You must edit it before running %s.\n", PACKAGE ); + + status = fclose( fp ); + if( status != EXIT_SUCCESS ) { + fprintf( stderr, "%s: Error closing file \"%s\"\n", PACKAGE, file ); + } +} + + +static void +ParseCommand( char *line, /*@out@*/ char *argv[] ) +{ + int argc = 0; + + while( *line != '\0' ) { /* if not the end of line ....... */ + while( *line == ' ' || *line == '\t' || *line == '\n' ) { + *line++ = '\0'; /* replace white spaces with 0 */ + } + *argv++ = line; /* save the argument position */ + while( *line != '\0' && *line != ' ' && *line != '\t' && *line != '\n' ) { + line++; /* skip the argument until ... */ + } + + argc++; + + if( argc == ARGV_LIMIT ) { + fprintf( stderr, "%s: Too much arguments for external command\n", + PACKAGE ); + exit( EXIT_FAILURE ); + } + } + + *argv = NULL; /* mark the end of argument list */ +} + + +static char * +GetArguments( char *parameter, int number_of_arguments ) +{ + char *token; + + if( number_of_arguments > 1 ) { + /* We search for a string terminated by either a '#' character (the rest of + the line is then a comment, which is simply ignored ), or the end of line + character '\n'. */ + token = strtok( NULL, delimiter_multiple_arg ); + } + else { + token = strtok( NULL, delimiter_single_arg ); + } + + if( token == NULL ) { + fprintf( stderr, "%s: Missing argument for \"%s\" parameter in " + "configuration file.\n", PACKAGE, parameter ); + exit( EXIT_FAILURE ); + } + + return token; +} + + +static int +GetNumber( char *token, char *parameter ) +{ + char temp[32]; /* Check size ??? */ + + if( sscanf( token, "%[0123456789]", temp ) == 0 ) { + fprintf( stderr, "%s: Invalid argument for \"%s\" parameter in " + "configuration file.\n", PACKAGE, parameter ); + exit( EXIT_FAILURE ); + } + + return atoi( temp ); +} + + +static void +ParseConfigurationFile( FILE *file ) +{ + char line[LINE_BUFFER_LEN]; + char *token; + bool protocol_found = FALSE; + bool server_found = FALSE; + bool username_found = FALSE; + bool password_found = FALSE; + const char *err_string = NULL; + + /* Default values for optional parameters. */ + wmnotify_infos.port = 110; + wmnotify_infos.mail_check_interval = 60; /* 1 minute interval. */ + wmnotify_infos.audible_notification = FALSE; /* Disabled. */ + wmnotify_infos.use_ssl = FALSE; /* Disabled. */ + wmnotify_infos.mail_client_argv[0] = NULL; /* No default command. */ + wmnotify_infos.audiofile[0] = '\0'; /* No default audio file. */ + wmnotify_infos.volume = 100; /* 100% volume. */ + + /* Reading one line of data from the configuration file. */ + /* char *fgets(char *s, int size, FILE *stream); + Reading stops after an EOF or a newline. If a newline is read, it is + stored into the buffer. A '\0' is stored after the last character in + the buffer. */ + while( fgets( line, LINE_BUFFER_LEN, file ) != NULL ) { + token = strtok( line, delimiter_single_arg ); + + if( ( token == NULL ) || ( token[0] == '#' ) ) { + continue; /* Next iteration of the while() loop (next line). */ + } + + if( STREQ( token, "protocol" ) ) { + token = GetArguments( "protocol", 1 ); + if( STREQ( token, "POP3" ) == TRUE ) { + wmnotify_infos.protocol = POP3_PROTOCOL; + } + else if( STREQ( token, "IMAP4" ) == TRUE ) { + wmnotify_infos.protocol = IMAP4_PROTOCOL; + } + else { + fprintf( stderr, "%s: protocol must be POP3 or IMAP4.\n", PACKAGE ); + exit( EXIT_FAILURE ); + } + + protocol_found = TRUE; + } + else if( STREQ( token, "use_ssl" ) ){ + int number; + + token = GetArguments( "use_ssl", 1 ); + number = GetNumber( token, "use_ssl" ); + if( number == 0 ) { + wmnotify_infos.use_ssl = FALSE; + } + else if( number == 1 ) { + wmnotify_infos.use_ssl = TRUE; + } + else { + fprintf( stderr, "%s: Invalid value for for parameter 'enablebeep' in\n" \ + "configuration file (must be 0 or 1): %d\n", PACKAGE, number ); + exit( EXIT_FAILURE ); + } + } + else if( STREQ( token, "server" ) ) { + token = GetArguments( "server", 1 ); + strncpy( wmnotify_infos.server_name, token, MAX_STR_LEN ); + server_found = TRUE; + } + else if( STREQ( token, "port" ) ) { + token = GetArguments( "port", 1 ); + wmnotify_infos.port = (u_int16_t) GetNumber( token, "port" ); + } + + else if( STREQ( token, "username" ) ) { + token = GetArguments( "username", 1 ); + strncpy( wmnotify_infos.username, token, MAX_STR_LEN ); + username_found = TRUE; + } + else if( STREQ( token, "password" ) ) { + token = GetArguments( "password", 1 ); + strncpy( wmnotify_infos.password, token, MAX_STR_LEN ); + password_found = TRUE; + } + else if( STREQ( token, "mailcheckdelay" ) ) { + int delay; /* delay in minutes. */ + + token = GetArguments( "mailcheckdelay", 1 ); + /* GetNumber() will exit if a negative number is entered. */ + delay = GetNumber( token, "mailcheckdelay" ); + if( delay == 0 ) { + fprintf( stderr, "%s: Mail check interval must be greater than '0'\n", + PACKAGE ); + exit( EXIT_FAILURE ); + } + wmnotify_infos.mail_check_interval = (unsigned int) delay * 60; + } + else if( STREQ( token, "mailclient" ) ) { + token = GetArguments( "mailclient", 2 ); /* Multiple arguments */ + strcpy( wmnotify_infos.mail_client_command, token ); + ParseCommand( wmnotify_infos.mail_client_command, + wmnotify_infos.mail_client_argv ); + } + else if( STREQ( token, "enablebeep" ) ){ + int number; + + token = GetArguments( "enablebeep", 1 ); + number = GetNumber( token, "enablebeep" ); + if( number == 0 ) { + wmnotify_infos.audible_notification = FALSE; + } + else if( number == 1 ) { + wmnotify_infos.audible_notification = TRUE; + } + else { + fprintf( stderr, "%s: Invalid value for for parameter 'enablebeep' in\n" \ + "configuration file (must be 0 or 1): %d\n", PACKAGE, number ); + exit( EXIT_FAILURE ); + } + } + else if( STREQ( token, "audiofile" ) ) { + token = GetArguments( "audiofile", 1 ); + /* Should check size before using strcpy(), or use strncopy() instead. */ + strcpy( wmnotify_infos.audiofile, token ); + } + else if( STREQ( token, "volume" ) ) { + token = GetArguments( "volume", 1 ); + wmnotify_infos.volume = GetNumber( token, "volume" ); + } + else { + fprintf( stderr, "%s: invalid parameter in configuration file: %s\n", PACKAGE, + token ); + exit( EXIT_FAILURE ); + } + + token = strtok( NULL, delimiter_single_arg ); + if( ( token != NULL ) && ( token[0] != '#' ) ) { + fprintf( stderr, "%s: Garbage at end of line in configuration file: %s\n", PACKAGE, + token ); + exit( EXIT_FAILURE ); + } + } + + if( protocol_found == FALSE ) { + err_string = "protocol"; + } + else if( server_found == FALSE ) { + err_string = "server"; + } + else if( username_found == FALSE ) { + err_string = "username"; + } + else if( password_found == FALSE ) { + err_string = "password"; + } + else { + return; /* success */ + } + + /* Failure. */ + fprintf( stderr, "%s: Mandatory parameter \"%s\" missing from configuration " + "file.\n", PACKAGE, err_string ); + exit( EXIT_FAILURE ); +} + + +/******************************************************************************* + * Read and parse the configuration file in the user's home directory + ******************************************************************************/ +void +ConfigurationFileInit( void ) +{ + FILE *fp; + int status; + size_t len; + + /* Check if an optional configuration file was specified on the command + line. */ + if( wmnotify_infos.optional_config_file != NULL ) { + /* Trying to open the file. */ + fp = fopen( wmnotify_infos.optional_config_file, "r" ); + if( fp == NULL ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + } + else { + /* Using the default configuration file. */ + char *home_dir; + char *default_config_file; + + home_dir = getenv("HOME"); + if( home_dir == NULL ) { + /* We're trying to expand ~/, but HOME isn't set. */ + struct passwd *pw = getpwuid( getuid() ); + + if( pw != NULL ) { + home_dir = pw->pw_dir; + } + else { + fprintf( stderr, "%s: Couldn't determine user's home directory path\n", + PACKAGE ); + exit( EXIT_FAILURE ); + } + } + + /* We add 1 to the length for the terminating character '\0'. */ + len = strlen( home_dir ) + strlen( "/" ) + strlen( default_config_filename ) + + 1; + default_config_file = xmalloc( len, __FILE__, __LINE__ ); + + sprintf( default_config_file, "%s/%s", home_dir, default_config_filename ); + + fp = fopen( default_config_file, "r" ); + if( fp == NULL ) { + /* If we cannot open the default configuration file, it probably means + it is missing, so we create it. */ + CreateDefaultConfigurationFile( default_config_file ); + free( default_config_file ); + exit( EXIT_FAILURE ); + } + + free( default_config_file ); + } + + ParseConfigurationFile( fp ); + + status = fclose( fp ); + if( status != EXIT_SUCCESS ) { + fprintf( stderr, "%s: Error closing configuration file.\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } +} diff --git a/src/configfile.h b/src/configfile.h new file mode 100644 index 0000000..595a3d4 --- /dev/null +++ b/src/configfile.h @@ -0,0 +1,11 @@ +/* configfile.h */ + +#ifndef CONFIGFILE_H +#define CONFIGFILE_H 1 + + +void +ConfigurationFileInit( void ); + + +#endif /* CONFIGFILE_H */ diff --git a/src/dockapp.c b/src/dockapp.c new file mode 100644 index 0000000..01bd329 --- /dev/null +++ b/src/dockapp.c @@ -0,0 +1,273 @@ +/* dockapp.c -- routines for managing dockapp windows and icons. */ + + +/* Define filename_M */ +#define DOCKAPP_M 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "dockapp.h" + + +static void +CreateIconFromXpmData( char *pixmap_data[] ) +{ + int status; + + dockapp.xpm_icon.attributes.valuemask |= + ( XpmReturnPixels | XpmReturnExtensions ); + + /* Using the XPM library to read XPM data from the array in the included XPM + file. The 'shapemask' Pixmap variable is set to an additional 1-bit deep + pixmap that can then be used as a shape mask for the XShapeCombineMask() + function. */ + status = XpmCreatePixmapFromData( dockapp.display, dockapp.root_win, + pixmap_data, &dockapp.xpm_icon.image, + &dockapp.xpm_icon.shapemask, + &dockapp.xpm_icon.attributes ); + if( status != XpmSuccess ) { + fprintf( stderr, "%s: XpmCreatePixmapFromData() failed\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } +} + + +static Pixel +GetColor( char *name ) +{ + int status; + bool res; + XColor color; + XWindowAttributes attributes; + + status = XGetWindowAttributes( dockapp.display, dockapp.root_win, + &attributes ); + if( status == XLIB_FAILURE ) { + fprintf( stderr, "%s: XGetWindowAttributes() failed\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + color.pixel = 0; + res = (bool) XParseColor( dockapp.display, attributes.colormap, name, + &color ); + if( res == FALSE ) { + fprintf( stderr, "%s: Can't parse %s.\n", PACKAGE, name ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + res = (bool) XAllocColor( dockapp.display, attributes.colormap, &color ); + if( res == FALSE ) { + fprintf( stderr, "%s: Can't allocate %s.\n", PACKAGE, name ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + return color.pixel; +} + + +static void +flush_expose( Window win ) +{ + XEvent dummy; + bool res = TRUE; + + while( res != FALSE ) { + res = (bool) XCheckTypedWindowEvent( dockapp.display, win, Expose, &dummy ); + } +} + + +void +RedrawWindow( void ) +{ + flush_expose( dockapp.iconwin ); + + (void) XCopyArea( dockapp.display, dockapp.xpm_icon.image, dockapp.iconwin, + dockapp.NormalGC, 0, 0, dockapp.xpm_icon.attributes.width, + dockapp.xpm_icon.attributes.height, 0, 0 ); + + flush_expose( dockapp.win ); + + (void) XCopyArea( dockapp.display, dockapp.xpm_icon.image, dockapp.win, + dockapp.NormalGC, 0, 0, dockapp.xpm_icon.attributes.width, + dockapp.xpm_icon.attributes.height, 0, 0 ); +} + + +void +copyXPMArea( int x, int y, unsigned int sx, unsigned int sy, int dx, int dy ) +{ + (void) XCopyArea( dockapp.display, dockapp.xpm_icon.image, + dockapp.xpm_icon.image, dockapp.NormalGC, x, y, sx, sy, + dx, dy ); +} + + +/******************************************************************************* + * New window creation and initialization for a Dockable Application + ******************************************************************************/ +void +InitDockAppWindow( int argc, char *argv[], char *pixmap_data[], + char *display_arg, char *geometry_arg ) +{ + XGCValues gcv; + XSizeHints size_hints; + XWMHints wm_hints; + int status; + int gravity = 0; /* Used to store the gravity value returned by XWMGeometry, + but not used. */ + + /* Opening a connection to the X server. */ + dockapp.display = XOpenDisplay( display_arg ); + if( dockapp.display == NULL ) { + fprintf( stderr, "%s: Can't open display: %s\n", PACKAGE, + XDisplayName( display_arg ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + dockapp.screen = DefaultScreen( dockapp.display ); + dockapp.root_win = RootWindow( dockapp.display, dockapp.screen ); + dockapp.d_depth = DefaultDepth( dockapp.display, dockapp.screen ); + + /* Create a window to hold the stuff */ + size_hints.flags = USSize | USPosition; + size_hints.x = 0; + size_hints.y = 0; + + /* Constructing window's geometry information. */ + /* XWMGeometry() returns an 'int', but Xlib documentation doesn't explain + it's meaning. */ + XWMGeometry( dockapp.display, dockapp.screen, geometry_arg, NULL, BWIDTH, + &size_hints, &size_hints.x, &size_hints.y, &size_hints.width, + &size_hints.height, &gravity ); + + size_hints.width = ICON_SIZE; + size_hints.height = ICON_SIZE; + dockapp.back_pix = GetColor("white"); + dockapp.fore_pix = GetColor("black"); + + dockapp.win = XCreateSimpleWindow( dockapp.display, dockapp.root_win, + size_hints.x, size_hints.y, + (unsigned int) size_hints.width, + (unsigned int) size_hints.height, + BWIDTH, dockapp.fore_pix, + dockapp.back_pix ); + + dockapp.iconwin = XCreateSimpleWindow( dockapp.display, dockapp.win, + size_hints.x, size_hints.y, + (unsigned int) size_hints.width, + (unsigned int) size_hints.height, + BWIDTH, dockapp.fore_pix, + dockapp.back_pix ); + + /* Configuring Client to Window Manager Communications. */ + + /* WM_NORMAL_HINTS property: size hints for a window in it's normal state. */ + /* Replaces the size hints for the WM_NORMAL_HINTS property on the specified + window. */ + XSetWMNormalHints( dockapp.display, dockapp.win, &size_hints ); + + /* Setting the WM_CLASS property. */ + { + char *app_name = argv[0]; + XClassHint wm_class; + + /* The res_name member contains the application name. + The res_class member contains the application class. */ + /* The name set in this property may differ from the name set as WM_NAME. + That is, WM_NAME specifies what should be displayed in the title bar and, + therefore, can contain temporal information (for example, the name of a + file currently in an editor's buffer). On the other hand, the name + specified as part of WM_CLASS is the formal name of the application that + should be used when retrieving the application's resources from the + resource database. */ + wm_class.res_name = app_name; + wm_class.res_class = app_name; + (void) XSetClassHint( dockapp.display, dockapp.win, &wm_class ); + } + + /* Setting the WM_NAME property. + This specifies what should be displayed in the title bar (usually the + application name). */ + { + XTextProperty text_prop; + + char *app_name = argv[0]; + const int string_count = 1; + + status = XStringListToTextProperty( &app_name, string_count, &text_prop ); + if( status == 0 ) { + fprintf( stderr, "%s: XStringListToTextProperty() failed\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + XSetWMName( dockapp.display, dockapp.win, &text_prop ); + + /* Freing the storage for the value field. */ + (void) XFree( text_prop.value ); + } + + /* WM_HINTS --> Additional hints set by the client for use by the Window + Manager. */ + /* XWMHints wm_hints; */ + + /* WithdrawnState, NormalState or IconicState. Must be set to WithdrawnState + for DockApp. */ + wm_hints.flags = StateHint | IconWindowHint | IconPositionHint | + WindowGroupHint; + wm_hints.initial_state = WithdrawnState; /* Withdrawn, Normal */ + wm_hints.icon_window = dockapp.iconwin; + wm_hints.icon_x = size_hints.x; + wm_hints.icon_y = size_hints.y; + wm_hints.window_group = dockapp.win; + (void) XSetWMHints( dockapp.display, dockapp.win, &wm_hints ); + + /* Sets the WM_COMMAND property. This sets the command and arguments used to + invoke the application. */ + (void) XSetCommand( dockapp.display, dockapp.win, argv, argc ); + + /* ... */ + (void) XSelectInput( dockapp.display, dockapp.win, + ButtonPressMask | ExposureMask | ButtonReleaseMask | + PointerMotionMask | StructureNotifyMask ); + + (void) XSelectInput( dockapp.display, dockapp.iconwin, + ButtonPressMask | ExposureMask | ButtonReleaseMask | + PointerMotionMask | StructureNotifyMask ); + + /* Create GC for drawing */ + gcv.foreground = dockapp.fore_pix; + gcv.background = dockapp.back_pix; + gcv.graphics_exposures = 0; + dockapp.NormalGC = XCreateGC( dockapp.display, dockapp.root_win, + GCForeground | GCBackground | + GCGraphicsExposures, &gcv ); + + /* Convert XPM data to XImage */ + CreateIconFromXpmData( pixmap_data ); + + XShapeCombineMask( dockapp.display, dockapp.win, ShapeBounding, 0, 0, + dockapp.xpm_icon.shapemask, ShapeSet ); + + XShapeCombineMask( dockapp.display, dockapp.iconwin, ShapeBounding, 0, 0, + dockapp.xpm_icon.shapemask, ShapeSet ); + + /* Making the new window visible. */ + (void) XMapWindow( dockapp.display, dockapp.win ); +} diff --git a/src/dockapp.h b/src/dockapp.h new file mode 100644 index 0000000..c278b66 --- /dev/null +++ b/src/dockapp.h @@ -0,0 +1,63 @@ +/* dockapp.h */ + +#ifndef DOCKAPP_H +#define DOCKAPP_H 1 + + +#include + + +#define XLIB_FAILURE 0 +#define XLIB_SUCCESS 1 + +/* Specifies the border width */ +#define BWIDTH 1 + +/* Width and height in pixels of Window Maker icons. */ +#define ICON_SIZE 64 + +typedef struct XpmIcon +{ + XpmAttributes attributes; + Pixmap shapemask; + Pixmap image; +} XpmIcon; + +typedef struct dockapp_t +{ + Display *display; + Window root_win; + int screen; + int d_depth; + Pixel back_pix; + Pixel fore_pix; + Window iconwin; + Window win; + GC NormalGC; + XpmIcon xpm_icon; +} dockapp_t; + + +void +InitDockAppWindow( int argc, char *argv[], char *pixmap_data[], + char *display_arg, char *geometry_arg ); + +void +RedrawWindow( void ); + +void +copyXPMArea( int x, int y, unsigned int sx, unsigned int sy, int dx, int dy ); + + +/* Exported variables */ +#undef _SCOPE_ +#ifdef DOCKAPP_M +#define _SCOPE_ /**/ +#else +#define _SCOPE_ extern +#endif + +_SCOPE_ dockapp_t dockapp; + + +#endif /* DOCKAPP_H */ diff --git a/src/imap.c b/src/imap.c new file mode 100644 index 0000000..6c272d5 --- /dev/null +++ b/src/imap.c @@ -0,0 +1,198 @@ +/* imap.c -- Routines for communication with an IMAP server */ + + +/* Define filename_M */ +#define IMAP_M 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for isdigit() */ + +#include "common.h" +#include "wmnotify.h" +#include "network.h" +#include "imap.h" + + +const static char line_delimiter[] = "\n"; + +static int tlabel = 0; +static int tlabel_len; + +static char tx_buffer[IMAP4_IN_BUF_SIZE]; +static char rx_buffer[IMAP4_IN_BUF_SIZE]; + +static int unseen_string_found; + + +static int +IMAP4_ReceiveResponse( void ) +{ + int len; + char *token; + + len = WmnotifyGetResponse( rx_buffer, IMAP4_IN_BUF_SIZE ); + if( len < 0 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + return len; + } + + rx_buffer[ len - 2 ] = '\0'; + + if( wmnotify_infos.debug ) { + printf( "Response: \"%s\"\n", rx_buffer ); + } + + /* Check the Server Completion Response returned by the IMAP4 server. There are currently + * three Server Completion Responses codes: success ("OK"), failure ("NO") and protocol error + * ("BAD"). */ + token = strtok( rx_buffer, line_delimiter ); + + while( len >= 0 ) { + if( token[0] == '*' ) { + /* untagged response. */ + if( STREQ_LEN( token, IMAP4_UNSEEN, strlen(IMAP4_UNSEEN) ) == TRUE ) { + unseen_string_found = TRUE; + } + goto loop_next; /* Next iteration of the while() loop (next line). */ + } + else { + /* We check for the correct transaction label plus a space. */ + if( STREQ_LEN( token, tx_buffer, tlabel_len + 1 ) == TRUE ) { + token += tlabel_len + 1; + if( STREQ_LEN( token, IMAP4_SUCCESS, strlen(IMAP4_SUCCESS) ) == TRUE ) { + break; /* OK, no errors. */ + } + else if( STREQ_LEN( token, IMAP4_PROTOCOL_ERR, strlen(IMAP4_PROTOCOL_ERR) ) == TRUE ) { + fprintf( stderr, "%s: Protocol error (%s).\n", PACKAGE, token ); + len = -1; + break; + } + else if( STREQ_LEN( token, IMAP4_FAILURE, strlen(IMAP4_FAILURE) ) == TRUE ) { + fprintf( stderr, "%s: Failure (%s).\n", PACKAGE, token ); + len = -1; + break; + } + else { + fprintf( stderr, "%s: Unknown error code (%s).\n", PACKAGE, token ); + len = -1; + break; + } + } + else { + fprintf( stderr, "%s: Error, transaction label mismatch.\n", PACKAGE ); + len = -1; + break; + } + } + + loop_next: + token = strtok( NULL, line_delimiter ); + } + + return len; +} + + +static int +IMAP4_SendCommand( int argc, char *argv[] ) +{ + int len; + int i; + + /* Adding Transaction Label. */ + tlabel++; + tx_buffer[0] = 'A'; + len = 1; + len += sprintf( tx_buffer + len, "%d", tlabel ); + tlabel_len = len; + + /* Adding command and it's arguments. */ + for( i = 0; i < argc; i++ ) { + len += sprintf( tx_buffer + len, " %s", argv[i] ); + } + + if( wmnotify_infos.debug ) { + tx_buffer[len] = '\0'; + printf( "Command: \"%s\"\n", tx_buffer ); + } + + /* Adding termination characters. */ + len += sprintf( tx_buffer + len, IMAP4_ENDL ); + + len = WmnotifySendData( tx_buffer, len ); + if( len < 0 ) { + return EXIT_FAILURE; + } + + len = IMAP4_ReceiveResponse(); + if( len < 0 ) { + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + + +int +IMAP4_CheckForNewMail( void ) +{ + char *argv[10]; + int new_messages = 0; + int status; + + status = ConnectionEstablish( wmnotify_infos.server_name, wmnotify_infos.port ); + if( status != EXIT_SUCCESS ) { + new_messages = -1; + goto end; + } + + argv[0] = IMAP_CMD_LOGIN; + argv[1] = wmnotify_infos.username; + argv[2] = wmnotify_infos.password; + status = IMAP4_SendCommand( 3, argv ); + if( status != EXIT_SUCCESS ) { + new_messages = -1; + goto imap4_logout; + } + + unseen_string_found = FALSE; + argv[0] = IMAP_CMD_EXAMINE; + argv[1] = "inbox"; + status = IMAP4_SendCommand( 2, argv ); + if( status != EXIT_SUCCESS ) { + new_messages = -1; + goto imap4_logout; + } + + if( unseen_string_found == TRUE ) { + new_messages = 1; + } + + imap4_logout: + argv[0] = IMAP_CMD_LOGOUT; + status = IMAP4_SendCommand( 1, argv ); + if( status != EXIT_SUCCESS ) { + new_messages = -1; + } + + status = ConnectionTerminate(); + if( status != EXIT_SUCCESS ) { + new_messages = -1; + } + + end: + return new_messages; +} diff --git a/src/imap.h b/src/imap.h new file mode 100644 index 0000000..75d7841 --- /dev/null +++ b/src/imap.h @@ -0,0 +1,37 @@ +/* imap.h */ + +#ifndef IMAP_H +#define IMAP_H 1 + + +/* Exported variables */ +#undef _SCOPE_ +#ifdef IMAP_M +# define _SCOPE_ /**/ +#else +# define _SCOPE_ extern +#endif + + +#define IMAP4_IN_BUF_SIZE 1024 + +#define IMAP4_SUCCESS "OK" +#define IMAP4_FAILURE "NO" +#define IMAP4_PROTOCOL_ERR "BAD" + +#define IMAP4_UNSEEN "* OK [UNSEEN" + + +#define IMAP_CMD_CAPABILITY "CAPABILITY" +#define IMAP_CMD_LOGIN "LOGIN" +#define IMAP_CMD_EXAMINE "EXAMINE" +#define IMAP_CMD_LOGOUT "LOGOUT" + +#define IMAP4_ENDL "\r\n" /* CRLF */ + + +int +IMAP4_CheckForNewMail( void ); + + +#endif /* IMAP_H */ diff --git a/src/network.c b/src/network.c new file mode 100644 index 0000000..2520000 --- /dev/null +++ b/src/network.c @@ -0,0 +1,215 @@ +/* network.c -- common routines for POP3 and IMAP protocols */ + + +/* Define filename_M */ +#define NETWORK_M 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "wmnotify.h" +#if HAVE_SSL +# include "ssl.h" +#endif +#include "network.h" + + +#define SEND_FLAGS 0 +#define RECV_FLAGS 0 + + +int +SocketOpen( char *server_name, int port ) +{ + int status; + int sock_fd = -1; + struct hostent *hostinfo; + struct sockaddr_in serv_addr; + + hostinfo = gethostbyname(server_name); + if( hostinfo == NULL ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + goto error; + } + + /* Open socket for Stream (TCP) */ + sock_fd = socket( PF_INET, SOCK_STREAM, 0 ); + if( sock_fd < 0 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + goto error; + } + + /*---Initialize server address/port struct---*/ + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(port); + serv_addr.sin_addr = *((struct in_addr *) hostinfo->h_addr ); + memset( &( serv_addr.sin_zero ), '\0', 8 ); /* Clear the rest of the structure. */ + + if( wmnotify_infos.debug ) { + printf( " Server IP = %s\n", inet_ntoa( serv_addr.sin_addr ) ); + printf( " Server port = %d\n", ntohs(serv_addr.sin_port) ); + } + + /* Establishing connection. */ + status = connect( sock_fd, (struct sockaddr *) &(serv_addr), sizeof(serv_addr) ); + if( status < 0 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + goto error; + } + + end: + return sock_fd; + + error: + if( sock_fd >= 0 ) { + status = close( sock_fd ); + if( status < 0 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + } + } + + sock_fd = -1; + goto end; +} + + +int +ConnectionEstablish( char *server_name, int port ) +{ + int len; + char rx_buffer[1024]; /* Temporary... */ + + wmnotify_infos.sock_fd = SocketOpen( wmnotify_infos.server_name, wmnotify_infos.port ); + if( wmnotify_infos.sock_fd < 0 ) { + goto error; + } + +#if HAVE_SSL + if( wmnotify_infos.use_ssl == TRUE ) { + int status; + status = InitSSL( wmnotify_infos.sock_fd ); + if( status != EXIT_SUCCESS ) { + goto error; + } + } +#endif + + /* Testing connection. */ + len = WmnotifyGetResponse( rx_buffer, 1024 ); + if( len < 0 ) { + goto error; + } + + if( wmnotify_infos.debug ) { + rx_buffer[len] = 0; + printf(" Connect response:\n%s\n", rx_buffer ); + } + + return EXIT_SUCCESS; + + error: + return EXIT_FAILURE; +} + + +int +ConnectionTerminate( void ) +{ +#if HAVE_SSL + if( wmnotify_infos.use_ssl == TRUE ) { + SSL_free( ssl_infos.ssl ); /* release connection state */ + } +#endif + + close( wmnotify_infos.sock_fd ); /* close socket */ + +#if HAVE_SSL + if( wmnotify_infos.use_ssl == TRUE ) { + SSL_CTX_free( ssl_infos.ctx ); /* release context */ + } +#endif + + return EXIT_SUCCESS; +} + + +int +WmnotifySendData( char *buffer, int size ) +{ + int len; + +#if HAVE_SSL + if( wmnotify_infos.use_ssl == TRUE ) { + len = SSL_write( ssl_infos.ssl, buffer, size ); /* Encrypt & send message */ + if( len <= 0 ) { + SSL_get_error( ssl_infos.ssl, len ); + len = -1; + } + + return len; + } +#endif /* HAVE_SSL */ + + /* if errno = EINTR, it means the operation was interrupted by a signal before any data was + * sent. We must retry the operation in this case. */ + do { + len = send( wmnotify_infos.sock_fd, buffer, size, SEND_FLAGS ); + } + while( ( len < 0 ) && ( errno == EINTR ) ); + + if( len < 0 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + } + + return len; +} + + +int +WmnotifyGetResponse( char *buffer, int max_size ) +{ + int len; + +#if HAVE_SSL + if( wmnotify_infos.use_ssl == TRUE ) { + len = SSL_read( ssl_infos.ssl, buffer, max_size ); /* Get reply & decrypt */ + if( len <= 0 ) { + SSL_get_error( ssl_infos.ssl, len ); + len = -1; + } + + return len; + } +#endif /* HAVE_SSL */ + + /* if errno = EINTR, it means the operation was interrupted by a signal before any data was + * read. We must retry the operation in this case. */ + do { + len = recv( wmnotify_infos.sock_fd, buffer, max_size, RECV_FLAGS ); + } + while( ( len < 0 ) && ( errno == EINTR ) ); + + if( len < 0 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + } + + return len; +} diff --git a/src/network.h b/src/network.h new file mode 100644 index 0000000..e291aa2 --- /dev/null +++ b/src/network.h @@ -0,0 +1,32 @@ +/* network.h */ + +#ifndef NETWORK_H +#define NETWORK_H 1 + +#include +#include +#include +#include +#include +#include +#include +#include + + +int +SocketOpen( char *server_name, int port ); + +int +ConnectionEstablish( char *server_name, int port ); + +int +ConnectionTerminate( void ); + +int +WmnotifySendData( char *buffer, int size ); + +int +WmnotifyGetResponse( char *buffer, int max_size ); + + +#endif /* NETWORK_H */ diff --git a/src/options.c b/src/options.c new file mode 100644 index 0000000..1d3e066 --- /dev/null +++ b/src/options.c @@ -0,0 +1,167 @@ +/* options.c -- functions for processing command-line options and arguments + Copyright (C) 2003 Hugo Villeneuve */ + + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#if STDC_HEADERS +# include +#elif HAVE_STRINGS_H +# include +#endif + +#include "common.h" +#include "wmnotify.h" +#include "options.h" + + +/******************************************************************************* + * Display the help message and exit + ******************************************************************************/ +static void +DisplayUsage( void ) +{ + printf( "Usage: %s [OPTIONS]...\n", PACKAGE ); + printf( "Email notification for single POP3 or IMAP4 account.\n\n" ); + printf( " -c use alternate configuration file\n" ); + printf( " -d Display debugging messages.\n" ); + printf( " -display X display name\n" ); + printf( " -geometry +XPOS+YPOS initial window position\n" ); + printf( " -h display this help and exit\n" ); + printf( " -version display version information and exit\n"); + printf( "\n" ); +} + + +/******************************************************************************* + * Display version information and exit + ******************************************************************************/ +static void +DisplayVersion( void ) +{ + printf( "\n" ); + printf( " %s, version %s\n", PACKAGE, VERSION ); + printf( " Written by Hugo Villeneuve\n\n" ); +} + + +static void +InvalidOption( const char *message, /*@null@*/ const char *string ) +{ + if( string == NULL ) { + fprintf(stderr, "%s: %s\n", PACKAGE, message ); + } + else { + fprintf(stderr, "%s: %s %s\n", PACKAGE, message, string ); + } + + fprintf(stderr, "Try `%s -h' for more information.\n", PACKAGE ); + + exit( EXIT_FAILURE ); +} + + +/******************************************************************************* + * Initializes the different options passed as arguments on the command line. + ******************************************************************************/ +void +ParseCommandLineOptions( int argc, char *argv[] ) +{ + int i; + char *token; + bool config_file_on = FALSE; + bool display_on = FALSE; + bool geometry_on = FALSE; + + /* Default values. */ + wmnotify_infos.debug = FALSE; + + for( i = 1; i < argc; i++ ) { + token = argv[i]; + switch( token[0] ) { + case '-': + /* Processing options names */ + switch( token[1] ) { + case 'c': + if( strlen( &token[1] ) == 1 ) { + config_file_on = TRUE; + } + else { + InvalidOption( "invalid option", token ); + } + break; + case 'd': + if( STREQ( "display", &token[1] ) ) { + display_on = TRUE; + } + else if( strlen( &token[1] ) == 1 ) { + wmnotify_infos.debug = TRUE; + } + break; + case 'g': + if( STREQ( "geometry", &token[1] ) ) { + geometry_on = TRUE; + } + else { + InvalidOption( "invalid option", token ); + } + break; + case 'h': + if( strlen( &token[1] ) == 1 ) { + DisplayUsage(); + exit( EXIT_SUCCESS ); + } + InvalidOption( "invalid option", token ); + break; + case 'v' : + if( STREQ( "version", &token[1] ) ) { + DisplayVersion(); + exit( EXIT_SUCCESS ); + } + else { + InvalidOption( "invalid option", token ); + } + break; + default: + InvalidOption( "invalid option", token ); + break; + } /* end switch( token[1] ) */ + break; + default: + /* Processing options arguments */ + if( config_file_on != FALSE ) { + wmnotify_infos.optional_config_file = token; + /*strcpy( config_file_name, token );*/ + config_file_on = FALSE; + } + else if( display_on != FALSE ) { + display_on = FALSE; + wmnotify_infos.display_arg = token; + } + else if( geometry_on != FALSE ) { + geometry_on = FALSE; + wmnotify_infos.geometry_arg = token; + } + else { + InvalidOption( "invalid option", token ); + } + break; + } /* end switch( token[0] ) */ + } /* end for */ + + if( config_file_on != FALSE ) { + InvalidOption( "missing configuration file parameter", NULL ); + } + else if( display_on != FALSE ) { + InvalidOption( "missing display parameter", NULL ); + } + else if( geometry_on != FALSE ) { + InvalidOption( "missing geometry parameter", NULL ); + } +} diff --git a/src/options.h b/src/options.h new file mode 100644 index 0000000..88026aa --- /dev/null +++ b/src/options.h @@ -0,0 +1,11 @@ +/* options.h */ + +#ifndef OPTIONS_H +#define OPTIONS_H 1 + + +void +ParseCommandLineOptions( int argc, char *argv[] ); + + +#endif /* OPTIONS_H */ diff --git a/src/pop3.c b/src/pop3.c new file mode 100644 index 0000000..d9da74f --- /dev/null +++ b/src/pop3.c @@ -0,0 +1,179 @@ +/* pop3.c -- Routines for communication with a pop3 server */ + + +/* Define filename_M */ +#define POP3_M 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "wmnotify.h" +#include "network.h" +#include "pop3.h" + + +static char tx_buffer[POP3_IN_BUF_SIZE]; +static char rx_buffer[POP3_IN_BUF_SIZE]; + + +static int +POP3_ReceiveResponse( void ) +{ + int len; + + len = WmnotifyGetResponse( rx_buffer, POP3_IN_BUF_SIZE ); + if( len < 0 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + return len; + } + + rx_buffer[ len - 2 ] = '\0'; + + if( wmnotify_infos.debug ) { + printf( "Response: \"%s\"\n", rx_buffer ); + } + + /* No error in recv at this point. Now we parse response from POP3 server. */ + + /* Check the status indicator returned by the POP3 server. + There are currently two status indicators: positive ("+OK") and negative + ("-ERR"). Servers MUST send the status indicators in upper case. */ + if( STREQ_LEN( rx_buffer, POP3_RSP_SUCCESS, strlen(POP3_RSP_SUCCESS) ) == FALSE ) { + fprintf( stderr, "%s: Error, POP3 server responded:\n \"%s\"\n", PACKAGE, rx_buffer ); + len = -1; + } + + return len; +} + + +static int +POP3_SendCommand( int argc, char *argv[] ) +{ + int len; + int i; + + /* Adding command and it's arguments. */ + for( i = 0, len = 0; i < argc; i++ ) { + len += sprintf( tx_buffer + len, "%s", argv[i] ); + if( i != ( argc - 1 ) ) { + len += sprintf( tx_buffer + len, " " ); + } + } + + if( wmnotify_infos.debug ) { + tx_buffer[len] = '\0'; + printf( "Command: \"%s\"\n", tx_buffer ); + } + + /* Adding termination characters. */ + len += sprintf( tx_buffer + len, POP3_ENDL ); + + len = WmnotifySendData( tx_buffer, len ); + if( len < 0 ) { + return EXIT_FAILURE; + } + + len = POP3_ReceiveResponse(); + if( len < 0 ) { + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + + +/* Return the number of new messages on success, -1 on error. */ +static int +POP3_ParseStatCommand( void ) +{ + int new_messages; + char *token; + + /* STAT command: + * The positive response consists of "+OK" followed by a single space, the number of messages + * in the maildrop, a single space, and the size of the maildrop in octets. */ + token = strtok( rx_buffer, " " ); + token = strtok( NULL, " " ); + if( token != NULL ) { + /* Do more checks for digits... */ + new_messages = atoi( token ); + } + else { + fprintf( stderr, "%s: Error parsing \"STAT\" response", PACKAGE ); + new_messages = -1; + } + + return new_messages; +} + + +int +POP3_CheckForNewMail( void ) +{ + int status; + int new_messages = -1; + char *argv[10]; + + status = ConnectionEstablish( wmnotify_infos.server_name, wmnotify_infos.port ); + if( status != EXIT_SUCCESS ) { + return -1; + } + + /* Sending username. */ + argv[0] = POP3_CMD_USERNAME; + argv[1] = wmnotify_infos.username; + status = POP3_SendCommand( 2, argv ); + if( status != EXIT_SUCCESS ) { + goto pop3_close_connection; + } + + /* Sending password. */ + argv[0] = POP3_CMD_PASSWORD; + argv[1] = wmnotify_infos.password; + status = POP3_SendCommand( 2, argv ); + if( status != EXIT_SUCCESS ) { + goto pop3_close_connection; + } + + /* Sending STAT command to inquiry about new messages. */ + argv[0] = POP3_CMD_STAT; + status = POP3_SendCommand( 1, argv ); + if( status != EXIT_SUCCESS ) { + goto pop3_close_connection; + } + + /* Parsing STAT command. */ + new_messages = POP3_ParseStatCommand(); + if( new_messages < 0 ) { + goto pop3_close_connection; + } + + /* Sending QUIT command. */ + argv[0] = POP3_CMD_QUIT; + status = POP3_SendCommand( 1, argv ); + if( status != EXIT_SUCCESS ) { + new_messages = -1; + goto pop3_close_connection; + } + + pop3_close_connection: + status = ConnectionTerminate(); + if( status != EXIT_SUCCESS ) { + new_messages = -1; + } + + return new_messages; +} diff --git a/src/pop3.h b/src/pop3.h new file mode 100644 index 0000000..6f018ce --- /dev/null +++ b/src/pop3.h @@ -0,0 +1,43 @@ +/* pop3.h */ + +#ifndef POP3_H +#define POP3_H 1 + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Exported variables */ +#undef _SCOPE_ +#ifdef POP3_M +# define _SCOPE_ /**/ +#else +# define _SCOPE_ extern +#endif + +/* POP3 responses may be up to 512 characters long, including the terminating + CRLF. */ +#define POP3_IN_BUF_SIZE 512 + +#define POP3_CMD_USERNAME "USER" +#define POP3_CMD_PASSWORD "PASS" +#define POP3_CMD_STAT "STAT" +#define POP3_CMD_QUIT "QUIT" +#define POP3_ENDL "\r\n" /* CRLF */ + + +#define POP3_RSP_SUCCESS "+OK" +#define POP3_RSP_FAILURE "-ERR" + + +int +POP3_CheckForNewMail( void ); + + +#endif /* POP3_H */ diff --git a/src/sound.c b/src/sound.c new file mode 100644 index 0000000..c7037df --- /dev/null +++ b/src/sound.c @@ -0,0 +1,320 @@ +/* sound.c */ + +/* Plays sound from file. Based on the 'sndfile-play' demo program from 'libsndfile' */ + + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if defined(HAVE_SNDFILE) + +#include +#include +#include +#include + +#if defined(__linux__) +# include +# include +# include +#elif( defined(sun) && defined(unix) ) +# include +# include +# include +#endif + +#include + +#include "common.h" +#include "wmnotify.h" +#include "sound.h" + + +#define BUFFER_LEN ((sf_count_t) 2048) + + +static int +OpenDspDevice( int channels, int srate ) +{ + int fd, status; +#if defined (__linux__) + int stereo, temp; + const char audio_device[] = "/dev/dsp"; +#elif( defined(sun) && defined(unix) ) + audio_info_t audio_info; + const char audio_device[] = "/dev/audio"; +#endif + +#if defined (__linux__) + fd = open( audio_device, O_WRONLY, 0 ); +#elif( defined(sun) && defined(unix) ) + /* Open the audio device - write only, non-blocking */ + fd = open( audio_device, O_WRONLY | O_NONBLOCK ); +#endif + + if( fd < 0 ) { + fprintf( stderr, "%s: open() failed trying to open device '%s':\n", PACKAGE, + audio_device ); + fprintf( stderr, " %s\n", strerror( errno ) ); + fprintf( stderr, + " Check if device file exists and has correct write permissions.\n" ); + ErrorLocation( __FILE__, __LINE__ ); + return -1; + } + +#if defined (__linux__) + stereo = 0; + status = ioctl( fd, SNDCTL_DSP_STEREO, &stereo ); + if( status == -1 ) { + fprintf( stderr, "%s: ioctl() failed: %s\n", PACKAGE, strerror( errno ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + status = ioctl( fd, SNDCTL_DSP_RESET, 0 ); + if( status > 0 ) { + fprintf( stderr, "%s: ioctl() failed: %s\n", PACKAGE, strerror( errno ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + temp = 16; + status = ioctl( fd, SOUND_PCM_WRITE_BITS, &temp ); + if( status != 0 ) { + fprintf( stderr, "%s: ioctl() failed: %s\n", PACKAGE, strerror( errno ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + status = ioctl( fd, SOUND_PCM_WRITE_CHANNELS, &channels ); + if( status != 0 ) { + fprintf( stderr, "%s: ioctl() failed: %s\n", PACKAGE, strerror( errno ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + status = ioctl( fd, SOUND_PCM_WRITE_RATE, &srate ); + if( status != 0 ) { + fprintf( stderr, "%s: ioctl() failed: %s\n", PACKAGE, strerror( errno ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + status = ioctl( fd, SNDCTL_DSP_SYNC, 0 ); + if( status != 0 ) { + fprintf( stderr, "%s: ioctl() failed: %s\n", PACKAGE, strerror( errno ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + +#elif( defined(sun) && defined(unix) ) + /* Retrieve standard values. */ + AUDIO_INITINFO( &audio_info ); + + audio_info.play.sample_rate = sfinfo.samplerate; + audio_info.play.channels = sfinfo.channels; + audio_info.play.precision = 16; + audio_info.play.encoding = AUDIO_ENCODING_LINEAR; + audio_info.play.gain = AUDIO_MAX_GAIN; + audio_info.play.balance = AUDIO_MID_BALANCE; + + status = ioctl( audio_fd, AUDIO_SETINFO, &audio_info ); + if( status > 0 ) { + fprintf( stderr, "%s: ioctl() failed: %s\n", PACKAGE, strerror( errno ) ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } +#endif + + return fd; +} + + +void +PlayAudioFile( char *filename, int volume ) +{ + static short buffer[BUFFER_LEN]; + SNDFILE *sndfile; + SF_INFO sfinfo; + int audio_fd; + int readcount; + int status; +#if defined (__linux__) + int subformat; + int m; +#elif( defined(sun) && defined(unix) ) + unsigned long delay_time; + long start_count, output_count, write_count; + bool done; +#endif + + if( wmnotify_infos.debug ) { + printf( "%s: PlayAudioFile() Entry\n", PACKAGE ); + } + + if( filename == NULL ) { + fprintf( stderr, "%s: No audio file specified.\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + sndfile = sf_open( filename, SFM_READ, &sfinfo ); + + if( sndfile == NULL ) { + fprintf( stderr, "%s: sf_open() failed trying to open '%s':\n", PACKAGE, filename ); + fprintf( stderr, " %s\n", sf_strerror(NULL) ); + fprintf( stderr, " Check if file exists and has correct read permissions.\n" ); + ErrorLocation( __FILE__, __LINE__ ); + return; + } + + if( sfinfo.channels < 1 || sfinfo.channels > 2 ) { + fprintf( stderr, "%s: Audio file has %d channel(s), but ", PACKAGE, sfinfo.channels ); + fprintf( stderr, "we support only 1 or 2 channels.\n" ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + audio_fd = OpenDspDevice( sfinfo.channels, sfinfo.samplerate ); + if( audio_fd < 0 ) { + goto play_audio_file_close_file; + } + +#if( defined(sun) && defined(unix) ) + /* Delay time equal to 1/4 of a buffer in microseconds. */ + delay_time = (BUFFER_LEN * 1000000) / (sfinfo.samplerate * 4); +#endif + + subformat = sfinfo.format & SF_FORMAT_SUBMASK; + + if( subformat == SF_FORMAT_FLOAT || subformat == SF_FORMAT_DOUBLE ) { + static float flt_buffer[BUFFER_LEN]; + double scale; + + status = sf_command( sndfile, SFC_CALC_SIGNAL_MAX, &scale, (int) sizeof(scale) ); + if( status == 0 ) { + fprintf( stderr, "%s: Warning, sf_command() failed.\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + goto play_audio_file_close_audio; + } + + if (scale < 1e-10) { + scale = 1.0; + } + else { + scale = 32700.0 / scale; + } + + while( ( readcount = (int) sf_read_float( sndfile, flt_buffer, BUFFER_LEN ) ) != 0 ) { + /* Linux/OSS -- FLOAT samples */ +#if defined (__linux__) + for( m = 0 ; m < readcount ; m++ ) { + /* Float to integer conversion. */ + buffer[m] = (short) ( scale * flt_buffer[m] ); + /* Changing volume */ + buffer[m] = buffer[m] * volume / 100; + } + status = (int) write( audio_fd, buffer, readcount * sizeof(short) ); + if( status == -1 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + goto play_audio_file_close_audio; + } + + /* Solaris -- FLOAT samples */ +#elif( defined(sun) && defined(unix) ) + start_count = 0; + output_count = read_count * sizeof(short); + + while( output_count > 0 ) { + /* Write as much data as possible */ + for( m = 0 ; m < readcount ; m++ ) { + /* Float to integer conversion. */ + buffer[m] = (short) ( scale * flt_buffer[m] ); + /* Changing volume */ + buffer[m] = buffer[m] * volume / 100; + } + + write_count = write( audio_fd, &(buffer[start_count]), output_count ); + if( write_count > 0 ) { + output_count -= write_count; + start_count += write_count; + } + else { + /* Give the audio output time to catch up. */ + usleep( delay_time ); + } + } /* while( output_count > 0 ) */ +#endif + } /* while( ( readcount... ) */ + } + else { + while( ( readcount = (int) sf_read_short( sndfile, buffer, BUFFER_LEN ) ) != 0 ) { + /* Linux/OSS -- INTEGER samples */ +#if defined (__linux__) + /* Changing volume... */ + for( m = 0 ; m < readcount ; m++ ) { + buffer[m] = ( buffer[m] * volume ) / 100; + } + + status = (int) write( audio_fd, buffer, readcount * sizeof(short) ); + if( status == -1 ) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + goto play_audio_file_close_audio; + } + + /* Solaris -- INTEGER samples */ +#elif( defined(sun) && defined(unix) ) + start_count = 0; + output_count = read_count * sizeof(short); + + while( output_count > 0 ) { + /* Write as much data as possible */ + + /* Changing volume. */ + for( m = 0 ; m < read_count ; m++ ) { + buffer[m] = ( buffer[m] * volume ) / 100; + } + + write_count = write( audio_fd, &(buffer[start_count]), output_count ); + if( write_count > 0 ) { + output_count -= write_count; + start_count += write_count; + } + else { + /* Give the audio output time to catch up. */ + usleep( delay_time ); + } + } /* while( output_count > 0 ) */ +#endif + } /* while( ( readcount... ) */ + } /* else */ + + play_audio_file_close_audio: + + status = close( audio_fd ); + if( status != 0 ) { + fprintf( stderr, "%s: Error, close() failed.\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + play_audio_file_close_file: + + status = sf_close( sndfile ); + if( status != 0 ) { + fprintf( stderr, "%s: Error, sf_close() failed.\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + if( wmnotify_infos.debug ) { + printf( "%s: PlayAudioFile() Exit\n", PACKAGE ); + } + + return; +} + +#endif /* HAVE_SNDFILE */ diff --git a/src/sound.h b/src/sound.h new file mode 100644 index 0000000..cd5866c --- /dev/null +++ b/src/sound.h @@ -0,0 +1,12 @@ +/* sound.h */ + + +#ifndef SOUND_H +#define SOUND_H 1 + + +void +PlayAudioFile( char *filename, int volume ); + + +#endif /* SOUND_H */ diff --git a/src/ssl.c b/src/ssl.c new file mode 100644 index 0000000..4b9f520 --- /dev/null +++ b/src/ssl.c @@ -0,0 +1,99 @@ +/* ssl.c */ + +/* Based on ssl_client.c (Sean Walton and Macmillan Publishers). */ + + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_SSL + +/* Define filename_M */ +#define SSL_M 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "wmnotify.h" +#include "ssl.h" + + +/* InitCTX - initialize the SSL engine. */ +SSL_CTX * +InitCTX( void ) +{ + SSL_METHOD *method; + SSL_CTX *ctx; + + OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ + SSL_load_error_strings(); /* Bring in and register error messages */ + method = SSLv2_client_method(); /* Create new client-method instance */ + ctx = SSL_CTX_new(method); /* Create new context */ + if( ctx == NULL ) { + ERR_print_errors_fp(stderr); + abort(); + } + return ctx; +} + + +/* ShowCerts - print out the certificates. */ +void +ShowCerts( SSL *ssl ) +{ + X509 *cert; + char *line; + + cert = SSL_get_peer_certificate(ssl); /* get the server's certificate */ + if ( cert != NULL ) { + printf("Server certificates:\n"); + line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); + printf("Subject: %s\n", line); + free(line); /* free the malloc'ed string */ + line = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0); + printf("Issuer: %s\n", line); + free(line); /* free the malloc'ed string */ + X509_free(cert); /* free the malloc'ed certificate copy */ + } + else { + printf("No certificates.\n"); + } +} + + +int +InitSSL( int sock_fd ) +{ + ssl_infos.ctx = InitCTX(); + ssl_infos.ssl = SSL_new( ssl_infos.ctx ); /* create new SSL connection state */ + if( ssl_infos.ssl == NULL ) { + printf( "%s: Error in SSL_new()\n", PACKAGE ); + return EXIT_FAILURE; + } + + SSL_set_fd( ssl_infos.ssl, sock_fd ); /* attach the socket descriptor */ + if( SSL_connect( ssl_infos.ssl ) == FAIL ) { /* perform the connection */ + ERR_print_errors_fp(stderr); + return EXIT_FAILURE; + } + + if( wmnotify_infos.debug ) { + printf("Connected with %s encryption\n", SSL_get_cipher( ssl_infos.ssl )); + ShowCerts( ssl_infos.ssl ); /* get any certs */ + } + + return EXIT_SUCCESS; +} + + +#endif /* HAVE_SSL */ diff --git a/src/ssl.h b/src/ssl.h new file mode 100644 index 0000000..df562b2 --- /dev/null +++ b/src/ssl.h @@ -0,0 +1,49 @@ +/* ssl.h */ + +#ifndef SSL_H +#define SSL_H 1 + + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#if HAVE_SSL + +#include +#include + + +/* Exported variables */ +#undef _SCOPE_ +#ifdef SSL_M +# define _SCOPE_ /**/ +#else +# define _SCOPE_ extern +#endif + +#define FAIL -1 + + +typedef struct ssl_infos_t { + SSL_CTX *ctx; + SSL *ssl; +} ssl_infos_t; + + +_SCOPE_ ssl_infos_t ssl_infos; + + +SSL_CTX * +InitCTX( void ); + +void +ShowCerts( SSL *ssl ); + +int +InitSSL( int sock_fd ); + + +#endif /* HAVE_SSL */ + +#endif /* SSL_H */ diff --git a/src/wmnotify.c b/src/wmnotify.c new file mode 100644 index 0000000..74ccda1 --- /dev/null +++ b/src/wmnotify.c @@ -0,0 +1,430 @@ +/* wmnotify.c -- POP3 E-mail notification program + Copyright (C) 2003 Hugo Villeneuve (hugo@hugovil.com) + based on WMPop3 by Scott Holden (scotth@thezone.net) */ + + +/* Define filename_M */ +#define WMNOTIFY_M 1 + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "dockapp.h" +#include "pop3.h" +#include "imap.h" +#include "network.h" +#include "xevents.h" +#include "options.h" +#include "configfile.h" +#if defined(HAVE_SNDFILE) +# include "sound.h" +#endif +#include "wmnotify.xpm" +#include "wmnotify.h" + + +/* Set in DoubleClick() to stop the new mail animation when the mail client is + opened. */ +static bool animation_stop = FALSE; + +static int animation_image = MAILBOX_FULL; + +/* Set in response to signal sent by SingleClick() to force mail check. Also set to TRUE at + * startup to force initial check. */ +static bool manual_check = TRUE; + +/* Used to signal TimerThread to quit. Inactive for now. */ +static bool quit = FALSE; + +/* TimerThread ID */ +static pthread_t timer_thread; + + +inline void +ErrorLocation( const char *file, int line ) +{ + fprintf( stderr, " Error in file \"%s\" at line #%d\n", file, line ); +} + + +void * +xmalloc( size_t size, const char *filename, int line_number ) +{ + void *value; + + value = malloc( size ); + + if( value == NULL ) { + perror( PACKAGE ); + ErrorLocation( filename, line_number ); + exit( EXIT_FAILURE ); + } + + return value; +} + + +static void +DisplayOpenedEmptyMailbox( void ) +{ + /* Opened and empty mailbox image */ + copyXPMArea( MAILBOX_OPENED_EMPTY_SRC_X, MAILBOX_OPENED_EMPTY_SRC_Y, + MAILBOX_SIZE_X, MAILBOX_SIZE_Y, MAILBOX_DEST_X, MAILBOX_DEST_Y ); + RedrawWindow(); +} + + +static void +DisplayOpenedFullMailbox( void ) +{ + /* Full mailbox image */ + copyXPMArea( MAILBOX_OPENED_FULL_SRC_X, MAILBOX_OPENED_FULL_SRC_Y, + MAILBOX_SIZE_X, MAILBOX_SIZE_Y, + MAILBOX_DEST_X, MAILBOX_DEST_Y ); + RedrawWindow(); +} + + +static void +DisplayClosedMailbox( void ) +{ + /* Opened mailbox image */ + copyXPMArea( MAILBOX_CLOSED_SRC_X, MAILBOX_CLOSED_SRC_Y, + MAILBOX_SIZE_X, MAILBOX_SIZE_Y, + MAILBOX_DEST_X, MAILBOX_DEST_Y ); + RedrawWindow(); +} + + +static void +ExecuteCommand( char *argv[] ) +{ + pid_t pid; + char *msg; + + /* No command defined, this is not an error. */ + if( argv[0] == NULL ) { + return; + } + + pid = fork(); /* fork a child process. */ + + if( pid < 0) { + perror( PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + else if( pid == 0 ) { /* Child process */ + /* When execvp() is successful, it doesn't return; otherwise, it returns + -1 and sets errno. */ + (void) execvp( argv[0], argv ); + + msg = strerror( errno ); + fprintf( stderr, "%s: The external mail program couldn't be started.\n", + PACKAGE); + fprintf( stderr, "Check your path or your configuration file for errors.\n" + ); + fprintf( stderr, "%s: \"%s\"\n", msg, argv[0] ); + exit( EXIT_FAILURE ); + } +} + + +/* single-click --> Checking mail */ +static void +SingleClick( void ) +{ + int status; + + if( wmnotify_infos.debug ) { + printf( "%s: SingleClick() Entry\n", PACKAGE ); + } + + /* Sending a signal to awake the TimerThread() thread. */ + status = pthread_kill( timer_thread, SIGUSR1 ); + if( status != EXIT_SUCCESS ) { + fprintf( stderr, "%s: pthread_kill() error (%d)\n", PACKAGE, status ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + if( wmnotify_infos.debug ) { + printf( "%s: SingleClick() Exit\n", PACKAGE ); + } +} + + +/* Double-click --> Starting external mail client. */ +static void +DoubleClick( void ) +{ + int status; + + if( wmnotify_infos.mail_client_argv[0] != NULL ) { + /* Starting external mail client. */ + ExecuteCommand( wmnotify_infos.mail_client_argv ); + + /* Sending a signal to awake the TimerThread() thread. This was previously + done with a mutex variable (animation_stop), but this caused a bug when the + following sequence was encountered: + -The user double-click to start the external mail client + -A new E-mail is received shortly after that + -The user exit the external mail client + -The user manually check for new E-mail + -The audio notification sound is played, but no animation image is + displayed. + This was because setting the mutex variable 'animation_stop' didn't + awakened the TimerThread(), but single-clicking awakened it. Since the + 'animation_stop' variable was still set to TRUE, no animation occured. */ + status = pthread_kill( timer_thread, SIGUSR2 ); + if( status != EXIT_SUCCESS ) { + fprintf( stderr, "%s: pthread_kill() error (%d)\n", PACKAGE, status ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + } + else { + fprintf( stderr, "%s: Warning: No email-client defined.\n", PACKAGE ); + } +} + + +static void +CatchChildTerminationSignal( int signal ) +{ + switch( signal ) { + case SIGCHLD: + /* Wait for Mail Client child process termination. Child enters zombie + state: process is dead and most resources are released, but process + descriptor remains until parent reaps exit status via wait. */ + + /* The WNOHANG option prevents the call to waitpid from suspending execution + of the caller. */ + (void) waitpid( 0, NULL, WNOHANG ); + break; + default: + fprintf( stderr, "%s: Unregistered signal received, exiting.\n", PACKAGE ); + exit( EXIT_FAILURE ); + } +} + + +static void +CatchTimerSignal( int signal ) +{ + switch( signal ) { + case SIGUSR1: + /* Catching the signal sent by the SingleClick() function. */ + manual_check = TRUE; + break; + case SIGUSR2: + /* Catching the signal sent by the DoubleClick() function. */ + animation_stop = TRUE; + break; + default: + fprintf( stderr, "%s: CatchTimerSignal(): unknown signal (%d)\n", PACKAGE, + signal ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } +} + + +static void +NewMailAnimation( void ) +{ + if( animation_image == MAILBOX_FULL ) { + DisplayOpenedFullMailbox(); + animation_image = MAILBOX_CLOSED; + if( wmnotify_infos.debug ) { + printf( "%s: NewMailAnimation() MAILBOX_FULL.\n", PACKAGE ); + } + } + else { + DisplayClosedMailbox(); + animation_image = MAILBOX_FULL; + if( wmnotify_infos.debug ) { + printf( "%s: NewMailAnimation() MAILBOX_CLOSED.\n", PACKAGE ); + } + } +} + + +/* We display the opened mailbox image only when doing a manual check. */ +static int +CheckForNewMail( bool manual_check ) +{ + int new_messages; + + if( manual_check == TRUE ) { + DisplayOpenedEmptyMailbox(); + } + + if( wmnotify_infos.protocol == POP3_PROTOCOL ) { + new_messages = POP3_CheckForNewMail(); + } + else if( wmnotify_infos.protocol == IMAP4_PROTOCOL ) { + new_messages = IMAP4_CheckForNewMail(); + } + else { + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + if( ( manual_check == TRUE ) && ( new_messages > 0 ) ) { + animation_image = MAILBOX_FULL; + } + + return new_messages; +} + + +static void * +TimerThread( /*@unused@*/ void *arg ) +{ + int new_messages = 0; + int counter = -1; + bool animation_running = FALSE; + + /* For catching the signal SIGUSR1. This signal is sent by the main program thread when the + * user is issuing a single-click to manually check for new mails. */ + (void) signal( SIGUSR1, CatchTimerSignal ); + + /* For catching the signal SIGUSR2. This signal is sent by the main program thread when the + * user is issuing a double-click to start ther external mail client. */ + (void) signal( SIGUSR2, CatchTimerSignal ); + + while( quit == FALSE ) { + if( wmnotify_infos.debug ) { + printf( "%s: Timer thread iteration.\n", PACKAGE ); + } + if( ( manual_check == TRUE ) || ( counter == 0 ) ) { + new_messages = CheckForNewMail( manual_check ); + manual_check = FALSE; + + if( wmnotify_infos.debug ) { + printf( "%s: new messages = %d.\n", PACKAGE, new_messages ); + } + + if( new_messages > 0 ) { + /* Checking if audio notification was already produced. */ + if( animation_running == FALSE ) { + /* Audible notification, if requested in configuration file. */ + if( wmnotify_infos.audible_notification != FALSE ) { + if( strlen( wmnotify_infos.audiofile ) != 0 ) { +#if defined(HAVE_SNDFILE) + PlayAudioFile( wmnotify_infos.audiofile, wmnotify_infos.volume ); +#endif + } + else { + AudibleBeep(); + } + } + + animation_running = TRUE; + } + /* Number of times to execute timer loop before checking again for new mails when the + * animation is running (when the animation is running, we sleep for + * NEW_MAIL_ANIMATION_DURATION instead of wmnotify_infos.mail_check_interval). We set + * the check interval to 30 seconds because we want the new mail condition to be + * removed as soon as possible when the new messages are checked. */ + counter = 30 * 1000000 / NEW_MAIL_ANIMATION_DURATION; + } + } + + if( ( animation_stop == TRUE ) || ( new_messages <= 0 ) ) { + if( wmnotify_infos.debug ) { + if( animation_stop != FALSE ) { + printf( "%s: animation_stop is TRUE\n", PACKAGE ); + } + } + animation_running = FALSE; + animation_stop = FALSE; + /* Before exiting, be sure to put NO MAIL image back in place... */ + DisplayClosedMailbox(); + } + + /* If sleep() returns because the requested time has elapsed, the value returned will be + * 0. If sleep() returns because of premature arousal due to delivery of a signal, the + * return value will be the "unslept" amount (the requested time minus the time actually + * slept) in seconds. */ + + if( animation_running == FALSE ) { + (void) sleep( wmnotify_infos.mail_check_interval ); + counter = 0; + } + else { + NewMailAnimation(); + (void) usleep( NEW_MAIL_ANIMATION_DURATION ); + counter--; + } + + if( wmnotify_infos.debug ) { + printf( "%s: counter = %d\n", PACKAGE, counter ); + } + } /* end while */ + + if( wmnotify_infos.debug ) { + printf( "%s: Error, TimerThread() exited abnormally\n", PACKAGE ); + } + + /* This code is never reached for now, because quit is always FALSE. */ + pthread_exit( NULL ); +} + + +/******************************************************************************* + * Main function + ******************************************************************************/ +int +main( int argc, char *argv[] ) +{ + int status; + + /* Initialization */ + ParseCommandLineOptions( argc, argv ); + + /* Reading configuration options from configuration file. */ + ConfigurationFileInit(); + + /* For catching the termination signal SIGCHLD when the external mail client + program is terminated, thus permitting removing zombi processes... */ + (void) signal( SIGCHLD, CatchChildTerminationSignal ); + + /* Initialize callback function pointers. */ + ProcessXlibEventsInit( SingleClick, DoubleClick ); + + /* Initializing and creating a DockApp window. */ + InitDockAppWindow( argc, argv, wmnotify_xpm, wmnotify_infos.display_arg, + wmnotify_infos.geometry_arg ); + + /* Starting thread for periodically checking for new mail. */ + status = pthread_create( &timer_thread, NULL, TimerThread, NULL ); + if( status != 0 ) { + fprintf( stderr, "%s: Thread creation failed (%d)\n", PACKAGE, status ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + /* Main loop, processing X Events */ + ProcessXlibEvents(); + + /* This code is never reached for now. */ + fprintf( stderr, "%s: Program exit\n", PACKAGE ); + + exit( EXIT_SUCCESS ); +} diff --git a/src/wmnotify.h b/src/wmnotify.h new file mode 100644 index 0000000..d447617 --- /dev/null +++ b/src/wmnotify.h @@ -0,0 +1,76 @@ +/* wmnotify.h */ + + +#ifndef WMNOTIFY_H +#define WMNOTIFY_H 1 + + +#define POP3_PROTOCOL 0 +#define IMAP4_PROTOCOL 1 + +/* New messages animation duration, in microseconds. */ +#define NEW_MAIL_ANIMATION_DURATION 900000 + +/* Flag used in the new messages animation to identify which image is currently + displayed. */ +#define MAILBOX_CLOSED 0 +#define MAILBOX_FULL 1 + +/* Source coordinates for the closed mailbox image. */ +#define MAILBOX_CLOSED_SRC_X 64 +#define MAILBOX_CLOSED_SRC_Y 4 + +/* Source coordinates for the opened and empty mailbox image. */ +#define MAILBOX_OPENED_EMPTY_SRC_X 64 +#define MAILBOX_OPENED_EMPTY_SRC_Y 64 + +/* Source coordinates for the opened and full mailbox image. */ +#define MAILBOX_OPENED_FULL_SRC_X 4 +#define MAILBOX_OPENED_FULL_SRC_Y 64 + +/* Size of all the 3 mailbox images. */ +#define MAILBOX_SIZE_X 56 +#define MAILBOX_SIZE_Y 56 + +/* Destination coordinates when copying a mailbox image. */ +#define MAILBOX_DEST_X 4 +#define MAILBOX_DEST_Y 4 + +#define ARGV_LIMIT 64 + +#define MAX_STR_LEN 256 + +typedef struct wmnotify_t +{ + bool debug; + char *display_arg; + char *geometry_arg; + char *optional_config_file; + char mail_client_command[512]; + char *mail_client_argv[ARGV_LIMIT]; + unsigned int mail_check_interval; /* In seconds. */ + bool audible_notification; + char audiofile[512]; + int volume; + int protocol; + bool use_ssl; + char server_name[MAX_STR_LEN]; + int port; + char username[MAX_STR_LEN]; + char password[MAX_STR_LEN]; + int sock_fd; +} wmnotify_t; + + +/* Exported variables */ +#undef _SCOPE_ +#ifdef WMNOTIFY_M +# define _SCOPE_ /**/ +#else +# define _SCOPE_ extern +#endif + +_SCOPE_ wmnotify_t wmnotify_infos; + + +#endif /* WMNOTIFY_H */ diff --git a/src/xevents.c b/src/xevents.c new file mode 100644 index 0000000..c9b66f6 --- /dev/null +++ b/src/xevents.c @@ -0,0 +1,127 @@ +/* xevents.c -- handling X events, and detecting single-click and double-click + * mouse events. */ + + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "dockapp.h" +#include "xevents.h" + + +/* Function pointers to handle single and double mouse click events. */ +static void (*SingleClickCallback)( void ) = NULL; + +static void (*DoubleClickCallback)( void ) = NULL; + + +void +AudibleBeep( void ) +{ + /* The specified volume is relative to the base volume for the keyboard. + To change the base volume of the keyboard, use XChangeKeyboardControl(). */ + (void) XBell( dockapp.display, 100 ); /* Volume = 100% */ +} + + +/* This function must be called at the beginning of your program to initialize + the function pointers to handle single and double click mouse events. */ +void +ProcessXlibEventsInit( void (*single_click_callback)( void ), + void (*double_click_callback)( void ) ) +{ + int status; + + /* This must be called before any other XLib functions. */ + status = XInitThreads(); + if( status == 0 ) { + fprintf( stderr, "%s: XInitThreads() initialization failed\n", PACKAGE ); + ErrorLocation( __FILE__, __LINE__ ); + exit( EXIT_FAILURE ); + } + + SingleClickCallback = single_click_callback; + DoubleClickCallback = double_click_callback; +} + + +/* Processing of X events */ +void +ProcessXlibEvents( void ) +{ + bool quit = FALSE; + bool button1_pressed = FALSE; + bool check_for_double_click = FALSE; + XEvent Event; + + while( quit == FALSE ) { + if( ( check_for_double_click != FALSE ) && + ( XPending( dockapp.display ) == 0 ) ) { + /* If no other button 1 events are received after the delay, then it is a + single-click mouse event. */ + if( SingleClickCallback != NULL ) { + (*SingleClickCallback)(); + } + + check_for_double_click = FALSE; + } + /* XNextEvent is a blocking call: it will return only when an event is + ready to be processed, thus freeing the CPU for other tasks when no + events are available. */ + (void) XNextEvent( dockapp.display, &Event ); + switch( Event.type ) { + case Expose: + /* Window was uncovered... */ + RedrawWindow(); + break; + case DestroyNotify: + /* Window was killed... */ + /* Is this necessary ? */ + (void) XCloseDisplay( dockapp.display ); + quit = TRUE; + break; + case ClientMessage: + /* Doesn't seem to work... */ + printf( "Client message received...\n" ); + break; + case ButtonPress: + if( Event.xbutton.button == Button1 ) { + /* Mouse LEFT button pressed. */ + button1_pressed = TRUE; + } + break; + case ButtonRelease: + if( Event.xbutton.button == Button1 ) { + /* Mouse LEFT button released. */ + if( button1_pressed != FALSE ) { + /* We act only when the button is released */ + if( check_for_double_click != FALSE ) { + /* Double-click */ + if( DoubleClickCallback != NULL ) { + (*DoubleClickCallback)(); + } + check_for_double_click = FALSE; + } + else { + (void) usleep( DOUBLE_CLICK_MAX_INTERVAL_MS * 1000 ); + check_for_double_click = TRUE; + } + } + } + break; + } + } /* end while */ +} diff --git a/src/xevents.h b/src/xevents.h new file mode 100644 index 0000000..856a955 --- /dev/null +++ b/src/xevents.h @@ -0,0 +1,23 @@ +/* xevents.h */ + +#ifndef XEVENTS_H +#define XEVENTS_H 1 + + +/* Maximum time between mouse double-clicks, in milliseconds */ +#define DOUBLE_CLICK_MAX_INTERVAL_MS 250 + + +void +AudibleBeep( void ); + +void +ProcessXlibEventsInit( void (*single_click_callback)( void ), + void (*double_click_callback)( void ) ); + +void +ProcessXlibEvents( void ); + + +#endif /* XEVENTS_H */ +